use of org.bimserver.shared.meta.SField in project BIMserver by opensourceBIM.
the class JsonConverter method fromJson.
public Object fromJson(SClass definedType, SClass genericType, Object object) throws ConvertException, IOException {
try {
if (object instanceof JsonObject) {
JsonObject jsonObject = (JsonObject) object;
if (jsonObject.has("__type")) {
String type = jsonObject.get("__type").getAsString();
SClass sClass = servicesMap.getType(type);
if (sClass == null) {
throw new ConvertException("Unknown type: " + type);
}
SBase newObject = sClass.newInstance();
for (SField field : newObject.getSClass().getAllFields()) {
if (jsonObject.has(field.getName())) {
newObject.sSet(field, fromJson(field.getType(), field.getGenericType(), jsonObject.get(field.getName())));
}
}
return newObject;
} else {
if (jsonObject.entrySet().size() != 0) {
throw new ConvertException("Missing __type field in " + jsonObject.toString());
} else {
return null;
}
}
} else if (object instanceof JsonArray) {
JsonArray array = (JsonArray) object;
if (definedType.isList()) {
List<Object> list = new ArrayList<Object>();
for (int i = 0; i < array.size(); i++) {
list.add(fromJson(definedType, genericType, array.get(i)));
}
return list;
} else if (definedType.isSet()) {
Set<Object> set = new HashSet<Object>();
for (int i = 0; i < array.size(); i++) {
set.add(fromJson(definedType, genericType, array.get(i)));
}
return set;
}
} else if (object instanceof JsonNull) {
return null;
} else if (definedType.isByteArray()) {
if (object instanceof JsonPrimitive) {
JsonPrimitive jsonPrimitive = (JsonPrimitive) object;
return Base64.decodeBase64(jsonPrimitive.getAsString().getBytes(Charsets.UTF_8));
}
} else if (definedType.isDataHandler()) {
if (object instanceof JsonPrimitive) {
JsonPrimitive jsonPrimitive = (JsonPrimitive) object;
byte[] data = Base64.decodeBase64(jsonPrimitive.getAsString().getBytes(Charsets.UTF_8));
return new DataHandler(new ByteArrayDataSource(null, data));
}
} else if (definedType.isInteger()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsInt();
}
} else if (definedType.isLong()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsLong();
}
} else if (definedType.isEnum()) {
JsonPrimitive primitive = (JsonPrimitive) object;
for (Object enumConstantObject : definedType.getInstanceClass().getEnumConstants()) {
Enum<?> enumConstant = (Enum<?>) enumConstantObject;
if (enumConstant.name().equals(primitive.getAsString())) {
return enumConstant;
}
}
} else if (definedType.isDate()) {
if (object instanceof JsonPrimitive) {
return new Date(((JsonPrimitive) object).getAsLong());
}
} else if (definedType.isString()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsString();
} else if (object instanceof JsonNull) {
return null;
}
} else if (definedType.isBoolean()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsBoolean();
}
} else if (definedType.isList()) {
if (genericType.isLong()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsLong();
}
} else if (genericType.isInteger()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsInt();
}
} else if (genericType.isString()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsString();
}
} else if (genericType.isDouble()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsDouble();
}
}
} else if (definedType.isSet()) {
if (genericType.isLong()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsLong();
}
} else if (genericType.isInteger()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsInt();
}
} else if (genericType.isString()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsString();
}
}
} else if (definedType.isDouble()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsDouble();
}
} else if (definedType.isFloat()) {
if (object instanceof JsonPrimitive) {
return ((JsonPrimitive) object).getAsFloat();
}
} else if (definedType.isVoid()) {
return null;
}
} catch (NumberFormatException e) {
throw new ConvertException(e);
}
throw new UnsupportedOperationException(object.toString());
}
use of org.bimserver.shared.meta.SField in project BIMserver by opensourceBIM.
the class JsonConverter method toJson.
public JsonElement toJson(Object object) throws IOException {
if (object instanceof SBase) {
SBase base = (SBase) object;
JsonObject jsonObject = new JsonObject();
jsonObject.add("__type", new JsonPrimitive(base.getSClass().getSimpleName()));
for (SField field : base.getSClass().getOwnFields()) {
jsonObject.add(field.getName(), toJson(base.sGet(field)));
}
return jsonObject;
} else if (object instanceof Collection) {
Collection<?> collection = (Collection<?>) object;
JsonArray jsonArray = new JsonArray();
for (Object value : collection) {
jsonArray.add(toJson(value));
}
return jsonArray;
} else if (object instanceof Date) {
return new JsonPrimitive(((Date) object).getTime());
} else if (object instanceof DataHandler) {
DataHandler dataHandler = (DataHandler) object;
InputStream inputStream = dataHandler.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(inputStream, out);
return new JsonPrimitive(new String(Base64.encodeBase64(out.toByteArray()), Charsets.UTF_8));
} else if (object instanceof Boolean) {
return new JsonPrimitive((Boolean) object);
} else if (object instanceof String) {
return new JsonPrimitive((String) object);
} else if (object instanceof Long) {
return new JsonPrimitive((Long) object);
} else if (object instanceof Integer) {
return new JsonPrimitive((Integer) object);
} else if (object instanceof Double) {
return new JsonPrimitive((Double) object);
} else if (object instanceof Enum) {
return new JsonPrimitive(object.toString());
} else if (object == null) {
return JsonNull.INSTANCE;
} else if (object instanceof byte[]) {
byte[] data = (byte[]) object;
return new JsonPrimitive(new String(Base64.encodeBase64(data), Charsets.UTF_8));
}
throw new UnsupportedOperationException(object.getClass().getName());
}
use of org.bimserver.shared.meta.SField in project BIMserver by opensourceBIM.
the class JsonConverter method toJson.
public void toJson(Object object, JsonWriter out) throws IOException, SerializerException {
if (object instanceof SBase) {
SBase base = (SBase) object;
out.beginObject();
out.name("__type");
out.value(base.getSClass().getSimpleName());
for (SField field : base.getSClass().getAllFields()) {
out.name(field.getName());
toJson(base.sGet(field), out);
}
out.endObject();
} else if (object instanceof Collection) {
Collection<?> collection = (Collection<?>) object;
out.beginArray();
for (Object value : collection) {
toJson(value, out);
}
out.endArray();
} else if (object instanceof Date) {
out.value(((Date) object).getTime());
} else if (object instanceof DataHandler) {
DataHandler dataHandler = (DataHandler) object;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (dataHandler.getDataSource() instanceof CacheStoringEmfSerializerDataSource) {
CacheStoringEmfSerializerDataSource cacheStoringEmfSerializerDataSource = (CacheStoringEmfSerializerDataSource) dataHandler.getDataSource();
cacheStoringEmfSerializerDataSource.writeToOutputStream(baos, null);
out.value(new String(Base64.encodeBase64(baos.toByteArray()), Charsets.UTF_8));
} else {
InputStream inputStream = dataHandler.getInputStream();
IOUtils.copy(inputStream, baos);
out.value(new String(Base64.encodeBase64(baos.toByteArray()), Charsets.UTF_8));
}
} else if (object instanceof byte[]) {
byte[] data = (byte[]) object;
out.value(new String(Base64.encodeBase64(data), Charsets.UTF_8));
} else if (object instanceof String) {
out.value((String) object);
} else if (object instanceof Number) {
out.value((Number) object);
} else if (object instanceof Enum) {
out.value(object.toString());
} else if (object instanceof Boolean) {
out.value((Boolean) object);
} else if (object == null) {
out.nullValue();
} else {
throw new UnsupportedOperationException(object.toString());
}
}
use of org.bimserver.shared.meta.SField in project BIMserver by opensourceBIM.
the class ProtocolBuffersConverter method convertProtocolBuffersMessageToSObject.
@SuppressWarnings({ "rawtypes", "unchecked" })
public SBase convertProtocolBuffersMessageToSObject(Message message, SBase newInstance, SClass sClass) throws ConvertException {
try {
Descriptor descriptor = message.getDescriptorForType();
if (newInstance == null) {
newInstance = sClass.newInstance();
}
Message subTypeMessage = null;
for (FieldDescriptor fieldDescriptor : descriptor.getFields()) {
if (fieldDescriptor.getName().equals("__actual_type")) {
sClass = sClass.getServicesMap().getSType((String) message.getField(fieldDescriptor));
newInstance = sClass.newInstance();
} else if (fieldDescriptor.getName().startsWith("__")) {
if (fieldDescriptor.getName().substring(2).equals(sClass.getSimpleName())) {
subTypeMessage = (Message) message.getField(fieldDescriptor);
}
} else {
Object val = message.getField(fieldDescriptor);
SField field = newInstance.getSClass().getField(fieldDescriptor.getName());
if (field == null) {
throw new ConvertException("No field on " + sClass.getName() + " with name " + fieldDescriptor.getName());
}
if (fieldDescriptor.isRepeated()) {
List list = new ArrayList();
if (val instanceof List) {
List oldList = (List) val;
for (Object x : oldList) {
list.add(convertFieldValue(field, x));
}
} else if (val instanceof DynamicMessage) {
int size = message.getRepeatedFieldCount(fieldDescriptor);
for (int index = 0; index < size; index++) {
Object repeatedField = message.getRepeatedField(fieldDescriptor, index);
list.add(convertFieldValue(field, repeatedField));
}
} else {
throw new ConvertException("Field " + sClass.getName() + "." + fieldDescriptor.getName() + " should have list value");
}
newInstance.sSet(field, list);
} else {
SField sField = sClass.getField(fieldDescriptor.getName());
newInstance.sSet(sField, convertFieldValue(sField, val));
}
}
}
if (subTypeMessage != null) {
convertProtocolBuffersMessageToSObject(subTypeMessage, newInstance, sClass);
}
return newInstance;
} catch (IllegalArgumentException e) {
LOGGER.error("", e);
}
return null;
}
use of org.bimserver.shared.meta.SField in project BIMserver by opensourceBIM.
the class MetaServiceImpl method createSServiceType.
// TODO Recursion to same type will result in endless loop
public SServiceType createSServiceType(SClass sClass, boolean recurse) throws UserException, ServerException {
if (sClass == null) {
return null;
}
SServiceType sServiceType = new SServiceType();
sServiceType.setName(sClass.getName());
sServiceType.setSimpleName(sClass.getSimpleName());
sServiceType.setSimpleType(SServiceSimpleType.valueOf(sClass.getSimpleType().name()));
for (SField field : sClass.getOwnFields()) {
SServiceField sServiceField = new SServiceField();
sServiceField.setName(field.getName());
if (recurse) {
sServiceField.setType(createSServiceType(field.getType(), recurse));
sServiceField.setGenericType(createSServiceType(field.getGenericType(), recurse));
}
sServiceField.setDoc(field.getDoc());
sServiceType.getFields().add(sServiceField);
}
return sServiceType;
}
Aggregations