Search in sources :

Example 1 with SClass

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());
}
Also used : SClass(org.bimserver.shared.meta.SClass) JsonPrimitive(com.google.gson.JsonPrimitive) JsonObject(com.google.gson.JsonObject) SField(org.bimserver.shared.meta.SField) DataHandler(javax.activation.DataHandler) Date(java.util.Date) JsonNull(com.google.gson.JsonNull) JsonArray(com.google.gson.JsonArray) SBase(org.bimserver.shared.meta.SBase) ArrayList(java.util.ArrayList) List(java.util.List) JsonObject(com.google.gson.JsonObject) ByteArrayDataSource(org.bimserver.utils.ByteArrayDataSource) HashSet(java.util.HashSet)

Example 2 with SClass

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;
}
Also used : SClass(org.bimserver.shared.meta.SClass) ArrayList(java.util.ArrayList)

Example 3 with SClass

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() + "());");
        }
    }
}
Also used : SClass(org.bimserver.shared.meta.SClass) SField(org.bimserver.shared.meta.SField)

Example 4 with SClass

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();
}
Also used : SClass(org.bimserver.shared.meta.SClass) MessageDescriptorContainer(org.bimserver.shared.pb.ProtocolBuffersMetaData.MessageDescriptorContainer) InputStream(java.io.InputStream) ByteString(com.google.protobuf.ByteString) Builder(com.google.protobuf.Message.Builder) ArrayList(java.util.ArrayList) SField(org.bimserver.shared.meta.SField) ByteString(com.google.protobuf.ByteString) DataHandler(javax.activation.DataHandler) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) FieldDescriptor(com.google.protobuf.Descriptors.FieldDescriptor) SBase(org.bimserver.shared.meta.SBase) Descriptor(com.google.protobuf.Descriptors.Descriptor) FieldDescriptor(com.google.protobuf.Descriptors.FieldDescriptor) EnumValueDescriptor(com.google.protobuf.Descriptors.EnumValueDescriptor) ArrayList(java.util.ArrayList) List(java.util.List) EnumValueDescriptor(com.google.protobuf.Descriptors.EnumValueDescriptor)

Aggregations

SClass (org.bimserver.shared.meta.SClass)4 ArrayList (java.util.ArrayList)3 SField (org.bimserver.shared.meta.SField)3 List (java.util.List)2 DataHandler (javax.activation.DataHandler)2 SBase (org.bimserver.shared.meta.SBase)2 JsonArray (com.google.gson.JsonArray)1 JsonNull (com.google.gson.JsonNull)1 JsonObject (com.google.gson.JsonObject)1 JsonPrimitive (com.google.gson.JsonPrimitive)1 ByteString (com.google.protobuf.ByteString)1 Descriptor (com.google.protobuf.Descriptors.Descriptor)1 EnumValueDescriptor (com.google.protobuf.Descriptors.EnumValueDescriptor)1 FieldDescriptor (com.google.protobuf.Descriptors.FieldDescriptor)1 Builder (com.google.protobuf.Message.Builder)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Date (java.util.Date)1 HashSet (java.util.HashSet)1