Search in sources :

Example 1 with SField

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());
}
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 SField

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());
}
Also used : JsonPrimitive(com.google.gson.JsonPrimitive) InputStream(java.io.InputStream) JsonObject(com.google.gson.JsonObject) SField(org.bimserver.shared.meta.SField) DataHandler(javax.activation.DataHandler) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Date(java.util.Date) JsonArray(com.google.gson.JsonArray) SBase(org.bimserver.shared.meta.SBase) Collection(java.util.Collection) JsonObject(com.google.gson.JsonObject)

Example 3 with SField

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());
    }
}
Also used : CacheStoringEmfSerializerDataSource(org.bimserver.plugins.serializers.CacheStoringEmfSerializerDataSource) InputStream(java.io.InputStream) SField(org.bimserver.shared.meta.SField) DataHandler(javax.activation.DataHandler) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Date(java.util.Date) SBase(org.bimserver.shared.meta.SBase) Collection(java.util.Collection) JsonObject(com.google.gson.JsonObject)

Example 4 with SField

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;
}
Also used : DynamicMessage(com.google.protobuf.DynamicMessage) Message(com.google.protobuf.Message) ArrayList(java.util.ArrayList) Descriptor(com.google.protobuf.Descriptors.Descriptor) FieldDescriptor(com.google.protobuf.Descriptors.FieldDescriptor) EnumValueDescriptor(com.google.protobuf.Descriptors.EnumValueDescriptor) SField(org.bimserver.shared.meta.SField) ArrayList(java.util.ArrayList) List(java.util.List) ByteString(com.google.protobuf.ByteString) DynamicMessage(com.google.protobuf.DynamicMessage) FieldDescriptor(com.google.protobuf.Descriptors.FieldDescriptor)

Example 5 with SField

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;
}
Also used : SField(org.bimserver.shared.meta.SField) SServiceType(org.bimserver.interfaces.objects.SServiceType) SServiceField(org.bimserver.interfaces.objects.SServiceField)

Aggregations

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