use of org.bimserver.shared.meta.SClass 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.SClass in project BIMserver by opensourceBIM.
the class MetaServiceImpl method getEnumLiterals.
public List<String> getEnumLiterals(String enumName) throws UserException {
List<String> result = new ArrayList<String>();
SClass type = getBimServer().getServicesMap().getType(enumName);
for (Object enumConstant : type.getInstanceClass().getEnumConstants()) {
result.add(enumConstant.toString());
}
return result;
}
use of org.bimserver.shared.meta.SClass in project BIMserver by opensourceBIM.
the class ProtocolBuffersGenerator method genServiceInterfaceToProtocolBuffers.
private void genServiceInterfaceToProtocolBuffers(PrintWriter out, String sourceName, String targetName, SClass parameterType) {
for (SField field : parameterType.getAllFields()) {
SClass fieldType = field.getType();
SClass fieldClass = fieldType;
if (fieldClass.isList()) {
out.println("\t\t\tfor (" + fieldType.getName() + " o : " + sourceName + "." + field.getName() + "()) {");
out.println("\t\t\t\t" + targetName + ".add" + field.getName() + "(o);");
out.println("\t\t\t}");
} else if (fieldClass.isDate()) {
out.println("\t\t\t" + targetName + ".set" + field.getName() + "(" + sourceName + "." + field.getName() + "().getTime());");
} else if (fieldType.getInstanceClass() == byte[].class) {
out.println("\t\t\t" + targetName + ".set" + field.getName() + "(ByteString.copyFrom(" + sourceName + "." + field.getName() + "()));");
} else if (fieldClass.isEnum()) {
out.println("\t\t\t" + targetName + ".set" + field.getName() + "(" + fieldType.getInstanceClass().getSimpleName() + ".values()[" + sourceName + "." + field.getName() + "().ordinal()]);");
} else {
out.println("\t\t\t" + targetName + ".set" + field.getName() + "(" + sourceName + "." + field.getName() + "());");
}
}
}
use of org.bimserver.shared.meta.SClass in project BIMserver by opensourceBIM.
the class ProtocolBuffersConverter method convertSObjectToProtocolBuffersObject.
@SuppressWarnings({ "unchecked", "rawtypes" })
public Message convertSObjectToProtocolBuffersObject(SBase object, SClass definedType) throws ConvertException {
Builder builder = null;
MessageDescriptorContainer messageDescriptor = protocolBuffersMetaData.getMessageDescriptor(definedType.getSimpleName());
if (messageDescriptor == null) {
throw new ConvertException("No message descriptor found with name " + definedType.getSimpleName());
}
Descriptor definedDescriptor = messageDescriptor.getDescriptor();
try {
builder = DynamicMessage.getDefaultInstance(definedDescriptor).newBuilderForType();
} catch (SecurityException e) {
throw new ConvertException(e);
} catch (IllegalArgumentException e) {
throw new ConvertException(e);
}
SClass sClass = object.getSClass();
SClass superClass = sClass;
while (superClass.getSuperClass() != null && superClass.getSuperClass().getInstanceClass() != Object.class) {
superClass = superClass.getSuperClass();
}
if (sClass != superClass && messageDescriptor.getField("__actual_type") != null) {
builder.setField(messageDescriptor.getField("__actual_type"), sClass.getSimpleName());
builder.setField(messageDescriptor.getField("__" + sClass.getSimpleName()), convertSObjectToProtocolBuffersObject(object, sClass));
}
for (SField field : definedType.getAllFields()) {
try {
Object value = object.sGet(field);
FieldDescriptor fieldDescriptor = messageDescriptor.getField(field.getName());
if (value != null) {
if (value.getClass().isPrimitive() || value.getClass() == String.class || value.getClass() == Long.class || value.getClass() == Double.class || value.getClass() == Integer.class || value.getClass() == Boolean.class) {
builder.setField(fieldDescriptor, value);
} else if (value.getClass().isEnum()) {
Enum eNum = (Enum) value;
int ordinal = eNum.ordinal();
EnumValueDescriptor findValueByNumber = fieldDescriptor.getEnumType().findValueByNumber(ordinal);
builder.setField(fieldDescriptor, findValueByNumber);
} else if (value.getClass() == Date.class) {
builder.setField(fieldDescriptor, ((Date) value).getTime());
} else if (value.getClass() == DataHandler.class) {
DataHandler dataHandler = (DataHandler) value;
InputStream inputStream = dataHandler.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
IOUtils.copy(inputStream, byteArrayOutputStream);
ByteString byteString = ByteString.copyFrom(byteArrayOutputStream.toByteArray());
builder.setField(fieldDescriptor, byteString);
} else if (List.class.isAssignableFrom(value.getClass())) {
List list = (List) value;
List newList = new ArrayList();
for (Object o : list) {
if (fieldDescriptor.getJavaType() == JavaType.MESSAGE) {
newList.add(convertSObjectToProtocolBuffersObject((SBase) o, field.getGenericType()));
} else {
newList.add(o);
}
}
builder.setField(fieldDescriptor, newList);
} else {
LOGGER.error("Unimplemented: " + fieldDescriptor.getName() + ": " + value);
}
}
} catch (SecurityException e) {
LOGGER.error("", e);
} catch (IllegalArgumentException e) {
LOGGER.error("", e);
} catch (IOException e) {
LOGGER.error("", e);
}
}
return builder.build();
}
Aggregations