/** * Does the conversion of model entries before they are added to the list of model entries if needed. */ private List<OpenEngSBModelEntry> convertEntry(OpenEngSBModelEntry entry) { List<OpenEngSBModelEntry> entries = new ArrayList<OpenEngSBModelEntry>(); if (List.class.isAssignableFrom(entry.getType())) { @SuppressWarnings("unchecked") List<Object> list = (List<Object>) entry.getValue(); if (list.size() == 0) { entries.add(entry); } else { List<Object> temp = doListConversion(list, false); entries.add(new OpenEngSBModelEntry(entry.getKey(), temp, entry.getType())); } } else if (Map.class.isAssignableFrom(entry.getType())) { @SuppressWarnings("unchecked") Map<Object, Object> map = (Map<Object, Object>) entry.getValue(); if (map.size() == 0) { entries.add(entry); } else { Map<Object, Object> temp = doMapConversion(map, false); entries.add(new OpenEngSBModelEntry(entry.getKey(), temp, entry.getType())); } } else { Object obj = doObjectConversion(entry.getValue(), false); entries.add(new OpenEngSBModelEntry(entry.getKey(), obj, obj.getClass())); } return entries; }
/** * Converts the string located in the value property of the entry in the correct data format and returns it. */ private Object createValueOfEntry(OpenEngSBModelEntry entry) { if (entry.getType().equals(String.class)) { return entry.getValue(); } Object element = null; if (entry.getType() == null) { LOGGER.error("Unknown type for model entry with key {}", entry.getKey()); return element; } try { Class<?> clazz = entry.getType(); Constructor<?> constr = ClassUtils.getConstructorIfAvailable(clazz, String.class); if (constr != null) { element = constr.newInstance(entry.getValue()); } else { element = MethodUtils.invokeStaticMethod(clazz, "valueOf", entry.getValue()); } } catch (Exception e) { LOGGER.error("Unable to convert value with the key {} to correct type", entry.getKey()); } return element; } }
/** * Tries to set the value of an OpenEngSBModelEntry to its corresponding field of the model. Returns true if the * field can be set, returns false if not. */ private static boolean tryToSetValueThroughField(OpenEngSBModelEntry entry, Object instance) throws IllegalAccessException { try { Field field = instance.getClass().getDeclaredField(entry.getKey()); field.setAccessible(true); field.set(instance, entry.getValue()); field.setAccessible(false); return true; } catch (NoSuchFieldException e) { // if no field with this name exist, try to use the corresponding setter } catch (SecurityException e) { // if a security manager is installed which don't allow this change of a field value, try // to use the corresponding setter } return false; }
/** * Does the conversion of model entries before they are returned by the getter if needed. */ private void checkForGetterResultConversion(String propertyName) { OpenEngSBModelEntry entry = objects.get(propertyName); if (List.class.isAssignableFrom(entry.getType())) { @SuppressWarnings("unchecked") List<Object> list = (List<Object>) entry.getValue(); if (list != null && list.size() != 0) { List<Object> temp = doListConversion(list, true); objects.put(propertyName, new OpenEngSBModelEntry(propertyName, temp, entry.getType())); } } else if (Map.class.isAssignableFrom(entry.getType())) { @SuppressWarnings("unchecked") Map<Object, Object> map = (Map<Object, Object>) entry.getValue(); if (map != null && map.size() != 0) { Map<Object, Object> temp = doMapConversion(map, true); objects.put(propertyName, new OpenEngSBModelEntry(propertyName, temp, entry.getType())); } } else { Object obj = doObjectConversion(entry.getValue(), true); Class<?> clazz = obj != null ? obj.getClass() : entry.getType(); objects.put(propertyName, new OpenEngSBModelEntry(propertyName, obj, clazz)); } }
@Override public OpenEngSBModelEntry deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { JsonToken token = jp.getCurrentToken(); OpenEngSBModelEntry entry = new OpenEngSBModelEntry(); if (token != JsonToken.START_OBJECT) { return null; Object value = createValueOfEntry(entry); if (value != null) { entry.setValue(value); entry.setKey(jp.getValueAsString()); } else if (jp.getCurrentName().equals("value")) { entry.setValue(jp.getValueAsString()); } else if (jp.getCurrentName().equals("type")) { try { entry.setType(findType(jp.getValueAsString())); } catch (ClassNotFoundException e) { LOGGER.error("Did not find class of type " + jp.getValueAsString(), e);
/** * Handle call of a setter method */ private void handleSetMethod(Method method, Object[] args) throws Throwable { String propertyName = ModelUtils.getPropertyName(method); if (method.isAnnotationPresent(OpenEngSBModelId.class) && args[0] != null) { OpenEngSBModelEntry entry = new OpenEngSBModelEntry(EDBConstants.MODEL_OID, args[0].toString(), String.class); objects.put(EDBConstants.MODEL_OID, entry); } Class<?> clasz = method.getParameterTypes()[0]; objects.put(propertyName, new OpenEngSBModelEntry(propertyName, args[0], clasz)); }
/** * Handle call of "addOpenEngSBModelEntry" */ private void handleAddEntry(OpenEngSBModelEntry entry) { objects.put(entry.getKey(), entry); }
/** * Handle call of "getOpenEngSBModelEntries" */ private List<OpenEngSBModelEntry> handleGetOpenEngSBModelEntries() throws Throwable { List<OpenEngSBModelEntry> entries = new ArrayList<OpenEngSBModelEntry>(); for (OpenEngSBModelEntry entry : objects.values()) { if (entry.getValue() == null) { entries.add(entry); continue; } entries.addAll(convertEntry(entry)); } return entries; }
/** * Tries to set the value of an OpenEngSBModelEntry to its corresponding setter of the model. Returns true if the * setter can be called, returns false if not. */ private static boolean tryToSetValueThroughSetter(OpenEngSBModelEntry entry, Object instance) throws IllegalAccessException { try { String setterName = getSetterName(entry.getKey()); Method method = instance.getClass().getMethod(setterName, entry.getType()); method.invoke(instance, entry.getValue()); return true; } catch (NoSuchMethodException e) { // if there exist no such method, then it is an entry meant for the model tail } catch (IllegalArgumentException e) { LOGGER.error("IllegalArgumentException while trying to set values for the new model.", e); } catch (InvocationTargetException e) { LOGGER.error("InvocationTargetException while trying to set values for the new model.", e); } return false; }
/** * Handle call of "toString" */ private String handleToString() { StringBuilder builder = new StringBuilder(); boolean first = true; builder.append("{ "); for (OpenEngSBModelEntry entry : objects.values()) { if (!first) { builder.append(", "); } builder.append(entry.getKey()).append(" == ").append(entry.getValue()); first = false; } builder.append(" }"); return builder.toString(); }
private void fillModelWithNullValues(Class<?> model) { for (PropertyDescriptor propertyDescriptor : ModelUtils.getPropertyDescriptorsForClass(model)) { String propertyName = propertyDescriptor.getName(); Class<?> clasz = propertyDescriptor.getPropertyType(); objects.put(propertyName, new OpenEngSBModelEntry(propertyName, null, clasz)); } }
public ModelProxyHandler(Class<?> model, OpenEngSBModelEntry... entries) { objects = new HashMap<String, OpenEngSBModelEntry>(); fillModelWithNullValues(model); for (OpenEngSBModelEntry entry : entries) { if (objects.containsKey(entry.getKey()) || entry.getKey().equals(EDBConstants.MODEL_OID) || entry.getKey().equals(EDBConstants.MODEL_VERSION)) { objects.put(entry.getKey(), entry); } else { LOGGER.error("entry \"{}\" can not be set because the interface doesn't contain this field!", entry.getKey()); } } initializeModelConverterSteps(); }
/** * Handle call of a getter method */ private Object handleGetMethod(Method method) throws Throwable { String propertyName = ModelUtils.getPropertyName(method); checkForGetterResultConversion(propertyName); Object returnValue = objects.get(propertyName).getValue(); if (returnValue == null && method.isAnnotationPresent(DefaultStringValue.class)) { DefaultStringValue value = method.getAnnotation(DefaultStringValue.class); returnValue = value.value(); } return returnValue; }
if (entry.getValue() == null) { continue; } else if (entry.getType().equals(FileWrapper.class)) { try { FileWrapper wrapper = (FileWrapper) entry.getValue(); String content = Base64.encodeBase64String(wrapper.getContent()); object.putEDBObjectEntry(entry.getKey(), content, String.class); object.putEDBObjectEntry(entry.getKey() + FILEWRAPPER_FILENAME_SUFFIX, wrapper.getFilename(), String.class); } catch (IOException e) { LOGGER.error(e.getMessage()); } else if (OpenEngSBModel.class.isAssignableFrom(entry.getType())) { OpenEngSBModel temp = (OpenEngSBModel) entry.getValue(); String subOid = convertSubModel(temp, objects, info); object.putEDBObjectEntry(entry.getKey(), subOid, String.class); } else if (List.class.isAssignableFrom(entry.getType())) { List<?> list = (List<?>) entry.getValue(); if (list == null || list.size() == 0) { continue; String entryName = getEntryNameForList(entry.getKey(), i); object.putEDBObjectEntry(entryName, item, item.getClass()); } else if (entry.getType().isArray()) { Object[] array = (Object[]) entry.getValue(); if (array == null || array.length == 0) { continue;
Class<?> propertyClass = propertyDescriptor.getPropertyType(); if (propertyClass.isPrimitive()) { entries.add(new OpenEngSBModelEntry(propertyDescriptor.getName(), value, ClassUtils .primitiveToWrapper(propertyClass))); } else { entries.add(new OpenEngSBModelEntry(propertyDescriptor.getName(), value, propertyClass)); try { entryType = model.getClassLoader().loadClass(entry.getType()); entries.add(new OpenEngSBModelEntry(entry.getKey(), entry.getValue(), entryType)); } catch (ClassNotFoundException e) { LOGGER.error("Unable to load class {} of the model tail", entry.getType());