Search in sources :

Example 16 with Proxy

use of javassist.util.proxy.Proxy in project orientdb by orientechnologies.

the class ODatabasePojoAbstract method getRecordByUserObject.

public ODocument getRecordByUserObject(final Object iPojo, final boolean iCreateIfNotAvailable) {
    if (iPojo instanceof ODocument)
        return (ODocument) iPojo;
    else if (iPojo instanceof Proxy)
        return ((OObjectProxyMethodHandler) ((ProxyObject) iPojo).getHandler()).getDoc();
    ODocument record = objects2Records.get(iPojo);
    if (record == null) {
        // SEARCH BY RID
        final ORID rid = OObjectSerializerHelper.getObjectID(this, iPojo);
        if (rid != null && rid.isValid()) {
            record = rid2Records.get(rid);
            if (record == null)
                // LOAD IT
                record = underlying.load(rid);
        } else if (iCreateIfNotAvailable) {
            record = underlying.newInstance(iPojo.getClass().getSimpleName());
        } else {
            return null;
        }
        registerUserObject(iPojo, record);
    }
    return record;
}
Also used : Proxy(javassist.util.proxy.Proxy) ORID(com.orientechnologies.orient.core.id.ORID) ODocument(com.orientechnologies.orient.core.record.impl.ODocument) OObjectProxyMethodHandler(com.orientechnologies.orient.object.enhancement.OObjectProxyMethodHandler)

Example 17 with Proxy

use of javassist.util.proxy.Proxy in project orientdb by orientechnologies.

the class OObjectEntityEnhancer method getProxiedInstance.

@SuppressWarnings("unchecked")
public <T> T getProxiedInstance(final Class<T> iClass, Object iEnclosingInstance, final ODocument doc, final ProxyObject parent, Object... iArgs) {
    if (iClass == null) {
        throw new OSerializationException("Type '" + doc.getClassName() + "' cannot be serialized because is not part of registered entities. To fix this error register this class");
    }
    final Class<T> c;
    boolean isInnerClass = OObjectEntitySerializer.getEnclosingClass(iClass) != null;
    if (Proxy.class.isAssignableFrom(iClass)) {
        c = iClass;
    } else {
        ProxyFactory f = new ProxyFactory();
        f.setSuperclass(iClass);
        if (customMethodFilters.get(iClass) != null) {
            f.setFilter(customMethodFilters.get(iClass));
        } else {
            f.setFilter(defaultMethodFilter);
        }
        c = f.createClass();
    }
    MethodHandler mi = new OObjectProxyMethodHandler(doc);
    ((OObjectProxyMethodHandler) mi).setParentObject(parent);
    try {
        T newEntity;
        if (iArgs != null && iArgs.length > 0) {
            if (isInnerClass) {
                if (iEnclosingInstance == null) {
                    iEnclosingInstance = iClass.getEnclosingClass().newInstance();
                }
                Object[] newArgs = new Object[iArgs.length + 1];
                newArgs[0] = iEnclosingInstance;
                for (int i = 0; i < iArgs.length; i++) {
                    newArgs[i + 1] = iArgs[i];
                }
                iArgs = newArgs;
            }
            Constructor<T> constructor = null;
            for (Constructor<?> constr : c.getConstructors()) {
                boolean found = true;
                if (constr.getParameterTypes().length == iArgs.length) {
                    for (int i = 0; i < constr.getParameterTypes().length; i++) {
                        Class<?> parameterType = constr.getParameterTypes()[i];
                        if (parameterType.isPrimitive()) {
                            if (!isPrimitiveParameterCorrect(parameterType, iArgs[i])) {
                                found = false;
                                break;
                            }
                        } else if (iArgs[i] != null && !parameterType.isAssignableFrom(iArgs[i].getClass())) {
                            found = false;
                            break;
                        }
                    }
                } else {
                    continue;
                }
                if (found) {
                    constructor = (Constructor<T>) constr;
                    break;
                }
            }
            if (constructor != null) {
                newEntity = (T) constructor.newInstance(iArgs);
                initDocument(iClass, newEntity, doc, (ODatabaseObject) ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner());
            } else {
                if (iEnclosingInstance != null)
                    newEntity = createInstanceNoParameters(c, iEnclosingInstance);
                else
                    newEntity = createInstanceNoParameters(c, iClass);
            }
        } else {
            if (iEnclosingInstance != null)
                newEntity = createInstanceNoParameters(c, iEnclosingInstance);
            else
                newEntity = createInstanceNoParameters(c, iClass);
        }
        ((Proxy) newEntity).setHandler(mi);
        if (OObjectEntitySerializer.hasBoundedDocumentField(iClass))
            OObjectEntitySerializer.setFieldValue(OObjectEntitySerializer.getBoundedDocumentField(iClass), newEntity, doc);
        OObjectEntitySerializer.setVersionField(iClass, newEntity, doc.getVersion());
        return newEntity;
    } catch (InstantiationException ie) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), ie);
    } catch (IllegalAccessException iae) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), iae);
    } catch (IllegalArgumentException iae) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), iae);
    } catch (SecurityException se) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), se);
    } catch (InvocationTargetException ite) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), ite);
    } catch (NoSuchMethodException nsme) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), nsme);
    }
    return null;
}
Also used : OSerializationException(com.orientechnologies.orient.core.exception.OSerializationException) ProxyFactory(javassist.util.proxy.ProxyFactory) InvocationTargetException(java.lang.reflect.InvocationTargetException) MethodHandler(javassist.util.proxy.MethodHandler) Proxy(javassist.util.proxy.Proxy) ProxyObject(javassist.util.proxy.ProxyObject) ODatabaseObject(com.orientechnologies.orient.core.db.object.ODatabaseObject)

Example 18 with Proxy

use of javassist.util.proxy.Proxy in project orientdb by orientechnologies.

the class OObjectProxyMethodHandler method manageArraySave.

protected Object manageArraySave(final String iFieldName, final Object[] value) {
    if (value.length > 0) {
        final Object o = ((Object[]) value)[0];
        if (o instanceof Proxy || o.getClass().isEnum()) {
            Object[] newValue = new Object[value.length];
            convertArray(value, newValue, o.getClass().isEnum());
            doc.field(iFieldName, newValue);
        }
    }
    return value;
}
Also used : Proxy(javassist.util.proxy.Proxy) ODatabaseObject(com.orientechnologies.orient.core.db.object.ODatabaseObject) ProxyObject(javassist.util.proxy.ProxyObject)

Example 19 with Proxy

use of javassist.util.proxy.Proxy 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;
}
Also used : OProperty(com.orientechnologies.orient.core.metadata.schema.OProperty) OObjectLazyMultivalueElement(com.orientechnologies.orient.core.db.object.OObjectLazyMultivalueElement) OIdentifiable(com.orientechnologies.orient.core.db.record.OIdentifiable) Field(java.lang.reflect.Field) Proxy(javassist.util.proxy.Proxy) OClass(com.orientechnologies.orient.core.metadata.schema.OClass) ODatabaseObject(com.orientechnologies.orient.core.db.object.ODatabaseObject) ProxyObject(javassist.util.proxy.ProxyObject) OClass(com.orientechnologies.orient.core.metadata.schema.OClass) OTrackedMap(com.orientechnologies.orient.core.db.record.OTrackedMap) OObjectCustomSerializerMap(com.orientechnologies.orient.object.serialization.OObjectCustomSerializerMap) HashMap(java.util.HashMap) OObjectEnumLazyMap(com.orientechnologies.orient.object.enumerations.OObjectEnumLazyMap) ORecordLazyMap(com.orientechnologies.orient.core.db.record.ORecordLazyMap) Map(java.util.Map) OObjectLazyMap(com.orientechnologies.orient.object.db.OObjectLazyMap) ODocument(com.orientechnologies.orient.core.record.impl.ODocument)

Example 20 with Proxy

use of javassist.util.proxy.Proxy in project orientdb by orientechnologies.

the class OObjectLazyList method set.

public TYPE set(int index, TYPE element) {
    OIdentifiable record;
    if (element instanceof OIdentifiable) {
        record = (OIdentifiable) element;
        if (converted)
            converted = false;
        if (orphanRemoval && record != null && sourceRecord != null)
            ((OObjectProxyMethodHandler) sourceRecord.getHandler()).getOrphans().remove(record.getIdentity());
        recordList.set(index, record);
    } else if (element instanceof Proxy) {
        record = (OIdentifiable) OObjectEntitySerializer.getDocument((Proxy) element);
        if (orphanRemoval && record != null && sourceRecord != null)
            ((OObjectProxyMethodHandler) sourceRecord.getHandler()).getOrphans().remove(record.getIdentity());
        recordList.set(index, record);
    } else {
        element = (TYPE) OObjectEntitySerializer.serializeObject(element, getDatabase());
        record = getDatabase().getRecordByUserObject(element, false);
        if (orphanRemoval && record != null && sourceRecord != null)
            ((OObjectProxyMethodHandler) sourceRecord.getHandler()).getOrphans().remove(record.getIdentity());
        recordList.add(index, record);
    }
    setDirty();
    return (TYPE) super.set(index, element);
}
Also used : Proxy(javassist.util.proxy.Proxy) OIdentifiable(com.orientechnologies.orient.core.db.record.OIdentifiable) OObjectProxyMethodHandler(com.orientechnologies.orient.object.enhancement.OObjectProxyMethodHandler)

Aggregations

Proxy (javassist.util.proxy.Proxy)26 ODocument (com.orientechnologies.orient.core.record.impl.ODocument)8 ODatabaseObject (com.orientechnologies.orient.core.db.object.ODatabaseObject)5 OIdentifiable (com.orientechnologies.orient.core.db.record.OIdentifiable)5 HashMap (java.util.HashMap)5 Map (java.util.Map)5 ProxyObject (javassist.util.proxy.ProxyObject)5 Test (org.junit.Test)5 ORecordId (com.orientechnologies.orient.core.id.ORecordId)4 OObjectDatabaseTx (com.orientechnologies.orient.object.db.OObjectDatabaseTx)4 OObjectProxyMethodHandler (com.orientechnologies.orient.object.enhancement.OObjectProxyMethodHandler)4 EnumTest (com.orientechnologies.orient.test.domain.base.EnumTest)4 JavaAttachDetachTestClass (com.orientechnologies.orient.test.domain.base.JavaAttachDetachTestClass)4 Child (com.orientechnologies.orient.test.domain.business.Child)4 HashSet (java.util.HashSet)4 Set (java.util.Set)4 ProxyFactory (javassist.util.proxy.ProxyFactory)3 BaseDataTest (org.apache.ibatis.BaseDataTest)3 Test (org.testng.annotations.Test)3 OObjectLazyMultivalueElement (com.orientechnologies.orient.core.db.object.OObjectLazyMultivalueElement)2