use of com.orientechnologies.orient.core.db.object.OObjectLazyMultivalueElement in project orientdb by orientechnologies.
the class OObjectProxyMethodHandler method setValue.
@SuppressWarnings("rawtypes")
protected Object setValue(final Object self, final String fieldName, Object valueToSet) {
if (valueToSet == null) {
Object oldValue = doc.field(fieldName);
if (OObjectEntitySerializer.isCascadeDeleteField(self.getClass(), fieldName) && oldValue instanceof OIdentifiable)
orphans.add(((OIdentifiable) oldValue).getIdentity());
setDocFieldValue(fieldName, valueToSet, OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else if (!valueToSet.getClass().isAnonymousClass()) {
if (valueToSet instanceof Proxy) {
ODocument docToSet = OObjectEntitySerializer.getDocument((Proxy) valueToSet);
if (OObjectEntitySerializer.isEmbeddedField(self.getClass(), fieldName))
ODocumentInternal.addOwner(docToSet, doc);
Object oldValue = doc.field(fieldName);
if (OObjectEntitySerializer.isCascadeDeleteField(self.getClass(), fieldName) && oldValue instanceof OIdentifiable)
orphans.add(((OIdentifiable) oldValue).getIdentity());
setDocFieldValue(fieldName, docToSet, OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else if (valueToSet instanceof OIdentifiable) {
if (valueToSet instanceof ODocument && OObjectEntitySerializer.isEmbeddedField(self.getClass(), fieldName))
ODocumentInternal.addOwner((ODocument) valueToSet, doc);
Object oldValue = doc.field(fieldName);
if (OObjectEntitySerializer.isCascadeDeleteField(self.getClass(), fieldName) && oldValue instanceof OIdentifiable)
orphans.add(((OIdentifiable) oldValue).getIdentity());
setDocFieldValue(fieldName, valueToSet, OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else if (((valueToSet instanceof Collection<?> || valueToSet instanceof Map<?, ?>)) || valueToSet.getClass().isArray()) {
Class<?> genericMultiValueType = OReflectionHelper.getGenericMultivalueType(OObjectEntitySerializer.getField(fieldName, self.getClass()));
if (genericMultiValueType != null && !OReflectionHelper.isJavaType(genericMultiValueType)) {
if (!(valueToSet instanceof OObjectLazyMultivalueElement)) {
if (valueToSet instanceof Collection<?>) {
boolean customSerialization = false;
final Field f = OObjectEntitySerializer.getField(fieldName, self.getClass());
if (OObjectEntitySerializer.isSerializedType(f)) {
customSerialization = true;
}
valueToSet = manageCollectionSave(self, f, (Collection<?>) valueToSet, customSerialization, true);
} else if (valueToSet instanceof Map<?, ?>) {
boolean customSerialization = false;
final Field f = OObjectEntitySerializer.getField(fieldName, self.getClass());
if (OObjectEntitySerializer.isSerializedType(f)) {
customSerialization = true;
}
valueToSet = manageMapSave(self, f, (Map<?, ?>) valueToSet, customSerialization);
} else if (valueToSet.getClass().isArray()) {
valueToSet = manageArraySave(fieldName, (Object[]) valueToSet);
}
}
} else {
if (OObjectEntitySerializer.isToSerialize(valueToSet.getClass())) {
setDocFieldValue(fieldName, OObjectEntitySerializer.serializeFieldValue(OObjectEntitySerializer.getField(fieldName, self.getClass()).getType(), valueToSet), OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else {
if (valueToSet.getClass().isArray()) {
final OClass schemaClass = doc.getSchemaClass();
OProperty schemaProperty = null;
if (schemaClass != null)
schemaProperty = schemaClass.getProperty(fieldName);
setDocFieldValue(fieldName, OObjectEntitySerializer.typeToStream(valueToSet, schemaProperty != null ? schemaProperty.getType() : null, getDatabase(), doc), OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else
setDocFieldValue(fieldName, valueToSet, OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
}
}
} else if (valueToSet.getClass().isEnum()) {
setDocFieldValue(fieldName, ((Enum) valueToSet).name(), OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else {
if (OObjectEntitySerializer.isToSerialize(valueToSet.getClass())) {
setDocFieldValue(fieldName, OObjectEntitySerializer.serializeFieldValue(OObjectEntitySerializer.getField(fieldName, self.getClass()).getType(), valueToSet), OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else if (getDatabase().getEntityManager().getEntityClass(valueToSet.getClass().getSimpleName()) != null && !valueToSet.getClass().isEnum()) {
valueToSet = OObjectEntitySerializer.serializeObject(valueToSet, getDatabase());
final ODocument docToSet = OObjectEntitySerializer.getDocument((Proxy) valueToSet);
if (OObjectEntitySerializer.isEmbeddedField(self.getClass(), fieldName))
ODocumentInternal.addOwner((ODocument) docToSet, doc);
setDocFieldValue(fieldName, docToSet, OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
} else {
setDocFieldValue(fieldName, valueToSet, OObjectEntitySerializer.getTypeByClass(self.getClass(), fieldName));
}
}
loadedFields.put(fieldName, doc.getVersion());
setDirty();
} else {
OLogManager.instance().warn(this, "Setting property '%s' in proxied class '%s' with an anonymous class '%s'. The document won't have this property.", fieldName, self.getClass().getName(), valueToSet.getClass().getName());
}
return valueToSet;
}
use of com.orientechnologies.orient.core.db.object.OObjectLazyMultivalueElement in project orientdb by orientechnologies.
the class OObjectProxyMethodHandler method getValue.
@SuppressWarnings({ "rawtypes", "unchecked" })
protected Object getValue(final Object self, final String fieldName, final boolean idOrVersionField, Object value, final boolean iIgnoreLoadedFields) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
if (!idOrVersionField) {
if (value == null) {
if (!iIgnoreLoadedFields && loadedFields.containsKey(fieldName) && loadedFields.get(fieldName).compareTo(doc.getVersion()) == 0) {
return null;
} else {
final Object docValue = getDocFieldValue(self, fieldName);
if (docValue != null) {
value = lazyLoadField(self, fieldName, docValue, value);
}
}
} else {
if (((value instanceof Collection<?> || value instanceof Map<?, ?>) && !(value instanceof OObjectLazyMultivalueElement)) || value.getClass().isArray()) {
final Class<?> genericMultiValueType = OReflectionHelper.getGenericMultivalueType(OObjectEntitySerializer.getField(fieldName, self.getClass()));
if (genericMultiValueType == null || !OReflectionHelper.isJavaType(genericMultiValueType)) {
final Field f = OObjectEntitySerializer.getField(fieldName, self.getClass());
if (OObjectEntitySerializer.isSerializedType(f) && !(value instanceof OObjectLazyCustomSerializer)) {
value = manageSerializedCollections(self, fieldName, value);
} else if (genericMultiValueType != null && genericMultiValueType.isEnum() && !(value instanceof OObjectLazyEnumSerializer)) {
value = manageEnumCollections(self, f.getName(), genericMultiValueType, value);
} else {
value = manageObjectCollections(self, fieldName, value);
}
} else {
final Object docValue = getDocFieldValue(self, fieldName);
if (docValue == null) {
if (value.getClass().isArray()) {
OClass schemaClass = doc.getSchemaClass();
OProperty schemaProperty = null;
if (schemaClass != null)
schemaProperty = schemaClass.getProperty(fieldName);
doc.field(fieldName, OObjectEntitySerializer.typeToStream(value, schemaProperty != null ? schemaProperty.getType() : null, getDatabase(), doc));
} else
doc.field(fieldName, value);
} else if (!loadedFields.containsKey(fieldName)) {
value = manageArrayFieldObject(OObjectEntitySerializer.getField(fieldName, self.getClass()), self, docValue);
Method setMethod = getSetMethod(self.getClass().getSuperclass(), getSetterFieldName(fieldName), value);
setMethod.invoke(self, value);
} else if ((value instanceof Set || value instanceof Map) && loadedFields.get(fieldName).compareTo(doc.getVersion()) < 0 && !OReflectionHelper.isJavaType(genericMultiValueType)) {
if (value instanceof Set)
value = new OObjectLazySet(self, (Set<OIdentifiable>) docValue, OObjectEntitySerializer.isCascadeDeleteField(self.getClass(), fieldName));
else
value = new OObjectLazyMap(self, (Map<Object, OIdentifiable>) docValue, OObjectEntitySerializer.isCascadeDeleteField(self.getClass(), fieldName));
final Method setMethod = getSetMethod(self.getClass().getSuperclass(), getSetterFieldName(fieldName), value);
setMethod.invoke(self, value);
}
}
} else if (!loadedFields.containsKey(fieldName) || loadedFields.get(fieldName).compareTo(doc.getVersion()) < 0) {
final Object docValue = getDocFieldValue(self, fieldName);
if (docValue != null && !docValue.equals(value)) {
value = lazyLoadField(self, fieldName, docValue, value);
}
}
}
}
return value;
}
Aggregations