Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java283
1 files changed, 283 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java
new file mode 100644
index 0000000000..423b357370
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java
@@ -0,0 +1,283 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 Eike Stepper, Germany, and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ * Martin Taal - changed handling of propertygetters/setters
+ **************************************************************************/
+package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;
+
+import org.eclipse.emf.cdo.internal.protocol.revision.InternalCDORevision;
+import org.eclipse.emf.cdo.protocol.model.CDOClass;
+import org.eclipse.emf.cdo.protocol.model.CDOFeature;
+import org.eclipse.emf.cdo.protocol.model.CDOPackage;
+import org.eclipse.emf.cdo.protocol.model.resource.CDOResourcePackage;
+import org.eclipse.emf.cdo.server.internal.hibernate.HibernateStore;
+import org.eclipse.emf.cdo.server.internal.hibernate.bundle.OM;
+
+import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
+
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+import org.hibernate.proxy.ProxyFactory;
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.tuple.entity.AbstractEntityTuplizer;
+import org.hibernate.tuple.entity.EntityMetamodel;
+
+/**
+ * @author Eike Stepper
+ */
+public class CDORevisionTuplizer extends AbstractEntityTuplizer
+{
+ private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDORevisionTuplizer.class);
+
+ private CDOClass cdoClass;
+
+ public CDORevisionTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappingInfo)
+ {
+ super(entityMetamodel, mappingInfo);
+ TRACER.trace("Created CDORevisionTuplizer for entity " + mappingInfo.getEntityName());
+ initCDOClass(mappingInfo);
+ }
+
+ private void initCDOClass(PersistentClass mappingInfo)
+ {
+ if (cdoClass != null)
+ {
+ return;
+ }
+ final HibernateStore hbStore = HibernateStore.getCurrentHibernateStore();
+
+ // find the CDOClass/Package
+ // TODO: error handling if meta attribute not present
+ // TODO: error handling if entityname not set
+ final String entityName = mappingInfo.getEntityName();
+ final String ePackageURI = mappingInfo.getMetaAttribute("epackage").getValue();
+
+ TRACER.trace("EntityName/packageURI " + entityName + " " + ePackageURI);
+
+ for (CDOPackage cdoPackage : hbStore.getPackageHandler().getCDOPackages())
+ {
+ if (cdoPackage.getPackageURI().compareTo(ePackageURI) != 0)
+ {
+ continue;
+ }
+ for (CDOClass localCdoClass : cdoPackage.getClasses())
+ {
+ if (localCdoClass.getName().compareTo(entityName) == 0)
+ {
+ cdoClass = localCdoClass;
+ break;
+ }
+ }
+ }
+ if (cdoClass == null && ePackageURI.compareTo(CDOResourcePackage.PACKAGE_URI) == 0)
+ {
+ for (CDOClass localCdoClass : hbStore.getRepository().getPackageManager().getCDOResourcePackage().getClasses())
+ {
+ if (localCdoClass.getName().compareTo(entityName) == 0)
+ {
+ cdoClass = localCdoClass;
+ TRACER.trace("Class is CDOResource class");
+ break;
+ }
+ }
+ }
+
+ if (cdoClass == null)
+ {
+ throw new IllegalArgumentException("The mapped class " + mappingInfo.getEntityName());
+ }
+ }
+
+ // MT: probably not required as the property getter/setter do all the work
+ // /*
+ // * (non-Javadoc)
+ // *
+ // * @see org.hibernate.tuple.entity.AbstractEntityTuplizer#getVersion(java.lang.Object)
+ // */
+ // @Override
+ // public Object getVersion(Object entity) throws HibernateException
+ // {
+ // if (entity instanceof CDORevision)
+ // {
+ // final CDORevision cdoRevision = (CDORevision)entity;
+ // return cdoRevision.getVersion();
+ // }
+ // throw new IllegalArgumentException("Entity of type: " + entity.getClass().getName()
+ // + " not supported by this tuplizer");
+ // }
+ //
+ // @Override
+ // public Serializable getIdentifier(Object entity) throws HibernateException
+ // {
+ // if (entity instanceof CDORevision)
+ // {
+ // final CDOID cdoID = ((CDORevision)entity).getID();
+ // if (cdoID instanceof CDOIDHibernate)
+ // {
+ // return ((CDOIDHibernate)cdoID).getId();
+ // }
+ // }
+ // throw new IllegalArgumentException("Entity of type: " + entity.getClass().getName()
+ // + " not supported by this tuplizer");
+ // }
+ //
+ // @Override
+ // public void setIdentifier(Object entity, Serializable id) throws HibernateException
+ // {
+ // if (entity instanceof InternalCDORevision)
+ // {
+ // final InternalCDORevision cdoRevision = (InternalCDORevision)entity;
+ // final CDOID cdoID = cdoRevision.getID();
+ // if (cdoID == null)
+ // {
+ // CDOIDHibernate hid = (CDOIDHibernate)HibernateStore.CDOID_OBJECT_FACTORY.createCDOIDObject(null);
+ // hid.setId(id);
+ // cdoRevision.setID(hid);
+ // return;
+ // }
+ // else if (cdoID instanceof CDOIDHibernate)
+ // {
+ // ((CDOIDHibernate)cdoID).setId(id);
+ // return;
+ // }
+ // }
+ // throw new IllegalArgumentException("Entity of type: " + entity.getClass().getName()
+ // + " not supported by this tuplizer");
+ // }
+
+ @Override
+ public EntityMode getEntityMode()
+ {
+ return EntityMode.MAP;
+ }
+
+ public CDOClass getCDOClass()
+ {
+ return cdoClass;
+ }
+
+ @Override
+ protected Getter buildPropertyGetter(Property mappedProperty, PersistentClass mappedEntity)
+ {
+ initCDOClass(mappedEntity);
+
+ TRACER.trace("Building property getter for " + cdoClass.getName() + "." + mappedProperty.getName());
+
+ if (mappedProperty.isBackRef())
+ {
+ return mappedProperty.getGetter(mappedEntity.getMappedClass());
+ }
+ else if (mappedProperty == mappedEntity.getIdentifierProperty())
+ {
+ return new CDOIDPropertyGetter(this, mappedProperty.getName());
+ }
+ else if (mappedProperty == mappedEntity.getVersion())
+ {
+ return new CDOVersionPropertyGetter(this, mappedProperty.getName());
+ }
+ else
+ {
+ final CDOFeature cdoFeature = getCDOClass().lookupFeature(mappedProperty.getName());
+ if (cdoFeature.isReference() && cdoFeature.isMany())
+ {
+ return new CDOManyReferenceGetter(this, mappedProperty.getName());
+ }
+ else if (cdoFeature.isReference())
+ {
+ return new CDOReferenceGetter(this, mappedProperty.getName());
+ }
+ else
+ {
+ return new CDOPropertyGetter(this, mappedProperty.getName());
+ }
+ }
+ }
+
+ @Override
+ protected Setter buildPropertySetter(Property mappedProperty, PersistentClass mappedEntity)
+ {
+ initCDOClass(mappedEntity);
+
+ TRACER.trace("Building property setter for " + cdoClass.getName() + "." + mappedProperty.getName());
+
+ if (mappedProperty.isBackRef())
+ {
+ return mappedProperty.getSetter(mappedEntity.getMappedClass());
+ }
+ else if (mappedProperty == mappedEntity.getIdentifierProperty())
+ {
+ return new CDOIDPropertySetter(this, mappedProperty.getName());
+ }
+ else if (mappedProperty == mappedEntity.getVersion())
+ {
+ return new CDOVersionPropertySetter(this, mappedProperty.getName());
+ }
+ else
+ {
+ final CDOFeature cdoFeature = getCDOClass().lookupFeature(mappedProperty.getName());
+ if (cdoFeature.isReference() && cdoFeature.isMany())
+ {
+ return new CDOManyReferenceSetter(this, mappedProperty.getName());
+ }
+ else if (cdoFeature.isReference())
+ {
+ return new CDOReferenceSetter(this, mappedProperty.getName());
+ }
+ else
+ {
+ return new CDOPropertySetter(this, mappedProperty.getName());
+ }
+ }
+ }
+
+ @Override
+ protected Instantiator buildInstantiator(PersistentClass mappingInfo)
+ {
+ return new CDORevisionInstantiator(this, mappingInfo);
+ }
+
+ @Override
+ protected ProxyFactory buildProxyFactory(PersistentClass mappingInfo, Getter idGetter, Setter idSetter)
+ {
+ ProxyFactory pf = new CDORevisionProxyFactory();
+
+ try
+ {
+ pf.postInstantiate(getEntityName(), null, null, null, null, null);
+ }
+ catch (HibernateException ex)
+ {
+ OM.LOG.error("Could not create proxy factory for " + getEntityName(), ex);
+ pf = null;
+ }
+
+ return pf;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class getMappedClass()
+ {
+ return InternalCDORevision.class;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class getConcreteProxyClass()
+ {
+ return InternalCDORevision.class;
+ }
+
+ public boolean isInstrumented()
+ {
+ return false;
+ }
+}

Back to the top