Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Taal2010-11-14 22:40:56 +0000
committerMartin Taal2010-11-14 22:40:56 +0000
commitd838c1011858929372a8f75610681d23ca0d5d1a (patch)
tree34661c4d7aa6221ce7b03ceeafc46576eee0d358
parentb06c837fe7a339d1859ca7f27032d1fc83ee87b9 (diff)
downloadcdo-d838c1011858929372a8f75610681d23ca0d5d1a.tar.gz
cdo-d838c1011858929372a8f75610681d23ca0d5d1a.tar.xz
cdo-d838c1011858929372a8f75610681d23ca0d5d1a.zip
Fixes issue [Hibernate] Support queryXRefs
Added support for lob and store property in HibernateStore
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/internal/teneo/TeneoHibernateMappingProvider.java40
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOEDataTypeAnnotator.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOMappingContext.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml5
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/mappings/resource.hbm.xml8
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java140
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStore.java46
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java178
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreLob.java79
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/SystemProperty.java44
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOBlobUserType.java32
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOClobUserType.java32
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOCustomTypeUserType.java125
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOLobUserType.java150
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java19
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java13
-rw-r--r--plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF3
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.hibernate/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.hibernate/src/org/eclipse/emf/cdo/tests/hibernate/AllTestsHibernate.java121
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316273_Test.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_324585_Test.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_326743_Test.java8
24 files changed, 1029 insertions, 31 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/internal/teneo/TeneoHibernateMappingProvider.java b/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/internal/teneo/TeneoHibernateMappingProvider.java
index afc53746cd..e7d7d1a916 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/internal/teneo/TeneoHibernateMappingProvider.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/internal/teneo/TeneoHibernateMappingProvider.java
@@ -11,25 +11,31 @@
*/
package org.eclipse.emf.cdo.server.hibernate.internal.teneo;
+import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.eresource.EresourcePackage;
+import org.eclipse.emf.cdo.etypes.EtypesPackage;
import org.eclipse.emf.cdo.server.hibernate.internal.teneo.bundle.OM;
import org.eclipse.emf.cdo.server.hibernate.teneo.CDOMappingGenerator;
import org.eclipse.emf.cdo.server.internal.hibernate.CDOHibernateConstants;
import org.eclipse.emf.cdo.server.internal.hibernate.HibernateMappingProvider;
import org.eclipse.emf.cdo.server.internal.hibernate.HibernateStore;
+import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOBlobUserType;
+import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOClobUserType;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.teneo.Constants;
import org.eclipse.emf.teneo.PackageRegistryProvider;
import org.eclipse.emf.teneo.PersistenceOptions;
import java.util.HashMap;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import java.util.Properties;
@@ -98,9 +104,15 @@ public class TeneoHibernateMappingProvider extends HibernateMappingProvider
// translate the list of EPackages to an array
final List<EPackage> epacks = getHibernateStore().getPackageHandler().getEPackages();
- // remove the ecore and resource package
- epacks.remove(EcorePackage.eINSTANCE);
- epacks.remove(EresourcePackage.eINSTANCE);
+ final ListIterator<EPackage> iterator = epacks.listIterator();
+ while (iterator.hasNext())
+ {
+ final EPackage epack = iterator.next();
+ if (CDOModelUtil.isSystemPackage(epack))
+ {
+ iterator.remove();
+ }
+ }
addUniqueConstraintAnnotation();
@@ -112,15 +124,35 @@ public class TeneoHibernateMappingProvider extends HibernateMappingProvider
properties.remove(PersistenceOptions.PERSISTENCE_XML);
}
+ // add some annotations to the CDO model so that the mapping gets generated correctly
+ addTypeAnnotationToEDataType(EtypesPackage.eINSTANCE.getBlob(), CDOBlobUserType.class.getName());
+ addTypeAnnotationToEDataType(EtypesPackage.eINSTANCE.getClob(), CDOClobUserType.class.getName());
+
final CDOMappingGenerator mappingGenerator = new CDOMappingGenerator();
mappingGenerator.getExtensions().putAll(extensions);
String hbm = mappingGenerator.generateMapping(ePackageArray, properties);
// to solve an issue with older versions of teneo
hbm = hbm.replaceAll("_cont", "cont"); //$NON-NLS-1$ //$NON-NLS-2$
+ // System.err.println(hbm);
+
return hbm;
}
+ private void addTypeAnnotationToEDataType(EDataType eDataType, String type)
+ {
+ if (eDataType.getEAnnotation(Constants.ANNOTATION_SOURCE_TENEO_JPA) != null)
+ {
+ return;
+ }
+
+ final EAnnotation eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
+ eAnnotation.setSource(Constants.ANNOTATION_SOURCE_TENEO_JPA);
+ final String typeAnnotation = "@Type(type=\"" + type + "\")";
+ eAnnotation.getDetails().put("value", typeAnnotation);
+ eDataType.getEAnnotations().add(eAnnotation);
+ }
+
// see the CDOEntityMapper, there an explicit unique-key is added to
// a column also
private void addUniqueConstraintAnnotation()
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOEDataTypeAnnotator.java b/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOEDataTypeAnnotator.java
index 6e3894b7c0..21f33d9aa8 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOEDataTypeAnnotator.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOEDataTypeAnnotator.java
@@ -11,6 +11,8 @@
*/
package org.eclipse.emf.cdo.server.hibernate.teneo;
+import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOCustomTypeUserType;
+
import org.eclipse.emf.teneo.hibernate.annotations.HbEDataTypeAnnotator;
/**
@@ -28,6 +30,6 @@ public class CDOEDataTypeAnnotator extends HbEDataTypeAnnotator
@Override
public String getDefaultUserType()
{
- return "string"; //$NON-NLS-1$
+ return CDOCustomTypeUserType.class.getName();
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOMappingContext.java b/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOMappingContext.java
index b9d687f10a..e19abbbd52 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOMappingContext.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate.teneo/src/org/eclipse/emf/cdo/server/hibernate/teneo/CDOMappingContext.java
@@ -11,6 +11,7 @@
*/
package org.eclipse.emf.cdo.server.hibernate.teneo;
+import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOCustomTypeUserType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOENumIntegerType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOENumStringType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOIDExternalUserType;
@@ -138,7 +139,7 @@ public class CDOMappingContext extends MappingContext
@Override
public String getDefaultUserType()
{
- return "string"; //$NON-NLS-1$
+ return CDOCustomTypeUserType.class.getName();
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml
index 1ec5478885..602ac165cf 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml
@@ -41,4 +41,9 @@
</id>
<property name="creationTime"/>
</class>
+
+ <class name="org.eclipse.emf.cdo.server.internal.hibernate.SystemProperty" table="cdo_system_property" lazy="false">
+ <id name="name" type="string" length="255"/>
+ <property name="value" type="text" length="2000"/>
+ </class>
</hibernate-mapping> \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/resource.hbm.xml b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/resource.hbm.xml
index d95369318c..52c641b113 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/resource.hbm.xml
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/resource.hbm.xml
@@ -69,4 +69,12 @@
</many-to-any>
</list>
</subclass>
+
+ <class name="org.eclipse.emf.cdo.server.internal.hibernate.HibernateStoreLob" table="cdo_lob" lazy="false">
+ <id name="id"/>
+ <property name="clob"/>
+ <property name="blob"/>
+ <property name="size"/>
+ </class>
+
</hibernate-mapping> \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java
index f03ec07184..2c05244a5d 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java
@@ -12,7 +12,9 @@
package org.eclipse.emf.cdo.server.internal.hibernate;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
+import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
import org.eclipse.emf.cdo.common.model.EMFUtil;
+import org.eclipse.emf.cdo.internal.server.XRefsQueryHandler;
import org.eclipse.emf.cdo.server.IStoreAccessor.CommitContext;
import org.eclipse.emf.cdo.server.internal.hibernate.bundle.OM;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
@@ -24,7 +26,10 @@ import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.lifecycle.Lifecycle;
import org.eclipse.net4j.util.om.trace.ContextTracer;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.hibernate.Criteria;
@@ -36,10 +41,10 @@ import org.hibernate.cfg.Environment;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
-import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -145,6 +150,8 @@ public class HibernatePackageHandler extends Lifecycle
private boolean doDropSchema;
+ private Map<EClass, Map<EClass, List<EReference>>> sourceCandidates = new HashMap<EClass, Map<EClass, List<EReference>>>();
+
/**
* TODO Necessary to pass/store/dump the properties from the store?
*/
@@ -202,6 +209,7 @@ public class HibernatePackageHandler extends Lifecycle
{
reset();
hibernateStore.reInitialize();
+ sourceCandidates = null;
}
}
@@ -211,6 +219,55 @@ public class HibernatePackageHandler extends Lifecycle
return packageUnits;
}
+ public Map<EClass, List<EReference>> getSourceCandidates(EClass targetEClass)
+ {
+ if (sourceCandidates == null)
+ {
+ computeSourceCandidates();
+ }
+
+ final Map<EClass, List<EReference>> sourceCandidateList = sourceCandidates.get(targetEClass);
+ if (sourceCandidateList == null)
+ {
+ return new HashMap<EClass, List<EReference>>();
+ }
+
+ return sourceCandidateList;
+ }
+
+ private synchronized void computeSourceCandidates()
+ {
+ if (sourceCandidates != null)
+ {
+ return;
+ }
+
+ sourceCandidates = new HashMap<EClass, Map<EClass, List<EReference>>>();
+
+ for (EPackage ePackage : getEPackages())
+ {
+ for (EClassifier eClassifier : ePackage.getEClassifiers())
+ {
+ if (eClassifier instanceof EClass)
+ {
+ sourceCandidates.put((EClass)eClassifier, computeSourceCandidatesByEClass((EClass)eClassifier));
+ }
+ }
+ }
+ }
+
+ private Map<EClass, List<EReference>> computeSourceCandidatesByEClass(EClass targetType)
+ {
+ final Map<EClass, List<EReference>> localSourceCandidates = new HashMap<EClass, List<EReference>>();
+ final Collection<EClass> targetTypes = Collections.singletonList(targetType);
+ for (CDOPackageInfo packageInfo : hibernateStore.getRepository().getPackageRegistry(false).getPackageInfos())
+ {
+ XRefsQueryHandler.collectSourceCandidates(packageInfo, targetTypes, localSourceCandidates);
+ }
+
+ return localSourceCandidates;
+ }
+
public EPackage[] loadPackageUnit(InternalCDOPackageUnit packageUnit)
{
final String nsUri = packageUnit.getTopLevelPackageInfo().getPackageURI();
@@ -388,7 +445,6 @@ public class HibernatePackageHandler extends Lifecycle
session.beginTransaction();
try
{
- System.out.println(new File(".").getAbsolutePath());
final Criteria c = session.createCriteria(SystemInformation.class);
List<?> l = c.list();
int records = l.size();
@@ -399,7 +455,7 @@ public class HibernatePackageHandler extends Lifecycle
systemInformation = new SystemInformation();
systemInformation.setFirstTime(true);
systemInformation.setCreationTime(System.currentTimeMillis());
- session.saveOrUpdate(systemInformation);
+ session.save(systemInformation);
}
else if (records == 1)
{
@@ -420,6 +476,84 @@ public class HibernatePackageHandler extends Lifecycle
}
}
+ Map<String, String> getSystemProperties()
+ {
+ Session session = getSessionFactory().openSession();
+ session.beginTransaction();
+
+ try
+ {
+ final Map<String, String> result = new HashMap<String, String>();
+ final Criteria c = session.createCriteria(SystemProperty.class);
+ for (Object o : c.list())
+ {
+ final SystemProperty systemProperty = (SystemProperty)o;
+ result.put(systemProperty.getName(), systemProperty.getValue());
+ }
+
+ return result;
+ }
+ finally
+ {
+ session.getTransaction().commit();
+ session.close();
+ }
+ }
+
+ void setSystemProperties(Map<String, String> properties)
+ {
+ Session session = getSessionFactory().openSession();
+ session.beginTransaction();
+
+ try
+ {
+ final Map<String, SystemProperty> currentValues = new HashMap<String, SystemProperty>();
+ final Criteria c = session.createCriteria(SystemProperty.class);
+ for (Object o : c.list())
+ {
+ final SystemProperty systemProperty = (SystemProperty)o;
+ currentValues.put(systemProperty.getName(), systemProperty);
+ }
+
+ // update remove currentones
+ final Map<String, String> newValues = new HashMap<String, String>();
+ for (String key : properties.keySet())
+ {
+ if (currentValues.containsKey(key))
+ {
+ final SystemProperty systemProperty = currentValues.get(key);
+ if (properties.get(key) == null)
+ {
+ session.delete(systemProperty);
+ }
+ else
+ {
+ systemProperty.setValue(properties.get(key));
+ session.update(systemProperty);
+ }
+ }
+ else
+ {
+ newValues.put(key, properties.get(key));
+ }
+ }
+
+ // store the new ones
+ for (String key : newValues.keySet())
+ {
+ final SystemProperty systemProperty = new SystemProperty();
+ systemProperty.setName(key);
+ systemProperty.setValue(newValues.get(key));
+ session.save(systemProperty);
+ }
+ }
+ finally
+ {
+ session.getTransaction().commit();
+ session.close();
+ }
+ }
+
protected void initSchema()
{
if (TRACER.isEnabled())
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStore.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStore.java
index cb28be93ce..965bc6a1d2 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStore.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStore.java
@@ -32,8 +32,10 @@ import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.net4j.util.om.log.OMLogger;
import org.eclipse.net4j.util.om.trace.ContextTracer;
+import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
+import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
@@ -60,6 +62,10 @@ public class HibernateStore extends Store implements IHibernateStore
{
public static final String TYPE = "hibernate"; //$NON-NLS-1$
+ public static final String ID_TYPE_EANNOTATION_SOURCE = "teneo.cdo";
+
+ public static final String ID_TYPE_EANNOTATION_KEY = "id_type";
+
public static final Set<ObjectType> OBJECT_ID_TYPES = new HashSet<ObjectType>(Arrays.asList(
CDOID.ObjectType.STRING_WITH_CLASSIFIER, CDOID.ObjectType.LONG_WITH_CLASSIFIER));
@@ -300,12 +306,36 @@ public class HibernateStore extends Store implements IHibernateStore
public CDOID createObjectID(String val)
{
- // TODO: implement HibernateStore.createObjectID(val)
- throw new UnsupportedOperationException();
+ final int index = val.lastIndexOf(CDOClassifierRef.URI_SEPARATOR);
+ if (index == -1)
+ {
+ throw new IllegalArgumentException("Id string " + val + " is not a valid id");
+ }
+
+ final String uriPart = val.substring(0, index);
+ final String idPart = val.substring(index + 1);
+ final CDOClassifierRef classifierRef = new CDOClassifierRef(uriPart);
+ final String entityName = getEntityName(classifierRef);
+ final EClass eClass = getEClass(entityName);
+ final EAnnotation typeEAnnotation = eClass.getEAnnotation(ID_TYPE_EANNOTATION_SOURCE);
+ if (typeEAnnotation == null)
+ {
+ throw new IllegalStateException("EClass " + eClass + " does not have a type annotation");
+ }
- // CDOClassifierRef classifierRef = null;
- // Object id = null;
- // return HibernateUtil.getInstance().createCDOID(classifierRef, id);
+ final String idTypeStr = typeEAnnotation.getDetails().get(ID_TYPE_EANNOTATION_KEY);
+ if (Hibernate.STRING.getName().equals(idTypeStr))
+ {
+ return HibernateUtil.getInstance().createCDOID(classifierRef, idPart);
+ }
+ else if (Hibernate.LONG.getName().equals(idTypeStr))
+ {
+ return HibernateUtil.getInstance().createCDOID(classifierRef, new Long(idPart));
+ }
+ else
+ {
+ throw new IllegalArgumentException("ID type " + idTypeStr + " not supported ");
+ }
}
@Override
@@ -322,14 +352,12 @@ public class HibernateStore extends Store implements IHibernateStore
public Map<String, String> getPropertyValues(Set<String> names)
{
- // TODO: implement HibernateStore.getPropertyValues(names)
- throw new UnsupportedOperationException();
+ return packageHandler.getSystemProperties();
}
public void setPropertyValues(Map<String, String> properties)
{
- // TODO: implement HibernateStore.setPropertyValues(properties)
- throw new UnsupportedOperationException();
+ packageHandler.setSystemProperties(properties);
}
public void removePropertyValues(Set<String> names)
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java
index a90b4d144b..e5326a83ec 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java
@@ -35,6 +35,7 @@ import org.eclipse.emf.cdo.server.hibernate.IHibernateStore;
import org.eclipse.emf.cdo.server.hibernate.IHibernateStoreAccessor;
import org.eclipse.emf.cdo.server.internal.hibernate.bundle.OM;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.PersistableListHolder;
+import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.WrappedHibernateList;
import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetSegment;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
import org.eclipse.emf.cdo.spi.common.revision.DetachedCDORevision;
@@ -45,30 +46,42 @@ import org.eclipse.emf.cdo.spi.server.Store;
import org.eclipse.emf.cdo.spi.server.StoreAccessor;
import org.eclipse.emf.cdo.spi.server.StoreChunkReader;
+import org.eclipse.net4j.util.HexUtil;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.StringUtil;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.collection.Pair;
+import org.eclipse.net4j.util.io.ExtendedDataInputStream;
+import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.hibernate.Criteria;
import org.hibernate.FlushMode;
+import org.hibernate.Hibernate;
import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import java.io.Reader;
+import java.sql.Clob;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -467,8 +480,54 @@ public class HibernateStoreAccessor extends StoreAccessor implements IHibernateS
public void queryXRefs(QueryXRefsContext context)
{
- // TODO: implement HibernateStoreAccessor.queryXRefs(context)
- throw new UnsupportedOperationException();
+ final Session session = getHibernateSession();
+ for (CDOID targetCdoId : context.getTargetObjects().keySet())
+ {
+ final CDORevision revision = HibernateUtil.getInstance().getCDORevision(targetCdoId);
+ final EClass targetEClass = context.getTargetObjects().get(targetCdoId);
+ final String targetEntityName = getStore().getEntityName(targetEClass);
+ final Map<EClass, List<EReference>> sourceReferences = getStore().getPackageHandler().getSourceCandidates(
+ targetEClass);
+ for (EClass sourceEClass : sourceReferences.keySet())
+ {
+ final String sourceEntityName = getStore().getEntityName(sourceEClass);
+ for (EReference eref : sourceReferences.get(sourceEClass))
+ {
+ final String hql;
+ if (eref.isMany())
+ {
+ hql = "select ref from " + sourceEntityName + " as ref, " + targetEntityName
+ + " as refTo where refTo = :to and refTo in elements(ref." + eref.getName() + ")";
+ }
+ else
+ {
+ hql = "select ref from " + sourceEntityName + " as ref where :to = ref." + eref.getName();
+ }
+
+ final Query qry = session.createQuery(hql);
+ qry.setEntity("to", revision);
+ ScrollableResults result = qry.scroll(ScrollMode.FORWARD_ONLY);
+ while (result.next())
+ {
+ final InternalCDORevision sourceRevision = (InternalCDORevision)result.get()[0];
+ int sourceIndex = 0;
+ if (eref.isMany())
+ {
+ // note this takes performance for sure as the list is read,
+ // consider not supporting sourceIndex, or doing it differently
+ final WrappedHibernateList cdoList = (WrappedHibernateList)sourceRevision.getList(eref);
+ sourceIndex = cdoList.getDelegate().indexOf(revision);
+ }
+
+ boolean more = context.addXRef(targetCdoId, sourceRevision.getID(), eref, sourceIndex);
+ if (!more)
+ {
+ return;
+ }
+ }
+ }
+ }
+ }
}
private CDOID getHibernateID(CDOID id)
@@ -533,6 +592,8 @@ public class HibernateStoreAccessor extends StoreAccessor implements IHibernateS
@Override
public void write(InternalCommitContext context, OMMonitor monitor)
{
+ // NOTE: the same flow is also present in the super class (StoreAccessor)
+
HibernateThreadContext.setCommitContext(context);
if (context.getNewPackageUnits().length > 0)
{
@@ -608,6 +669,36 @@ public class HibernateStoreAccessor extends StoreAccessor implements IHibernateS
repairResourceIDs(repairResourceIDs, session);
session.flush();
+
+ // write the blobs
+ ExtendedDataInputStream in = context.getLobs();
+ if (in != null)
+ {
+ try
+ {
+ int count = in.readInt();
+ for (int i = 0; i < count; i++)
+ {
+ byte[] id = in.readByteArray();
+ long size = in.readLong();
+ if (size > 0)
+ {
+ writeBlob(id, size, in);
+ }
+ else
+ {
+ writeClob(id, -size, new InputStreamReader(in));
+ }
+ }
+ }
+ catch (IOException ex)
+ {
+ throw WrappedException.wrap(ex);
+ }
+ }
+
+ session.flush();
+
}
catch (Exception e)
{
@@ -750,28 +841,95 @@ public class HibernateStoreAccessor extends StoreAccessor implements IHibernateS
public void queryLobs(List<byte[]> ids)
{
- // TODO: implement HibernateStoreAccessor.queryLobs(ids)
- throw new UnsupportedOperationException();
+ for (Iterator<byte[]> it = ids.iterator(); it.hasNext();)
+ {
+ byte[] id = it.next();
+ final HibernateStoreLob lob = getCreateHibernateStoreLob(id);
+ if (lob.isNew())
+ {
+ it.remove();
+ }
+ }
}
public void loadLob(byte[] id, OutputStream out) throws IOException
{
- // TODO: implement HibernateStoreAccessor.loadLob(id, out)
- throw new UnsupportedOperationException();
+ final HibernateStoreLob lob = getCreateHibernateStoreLob(id);
+ // can this ever occur?
+ // TODO: how should non-existence be handled? Currently results in a timeout
+ // on the client.
+ if (lob.isNew())
+ {
+ throw new IllegalStateException("Lob with id " + HexUtil.bytesToHex(id) + " does not exist");
+ }
+
+ final long size = lob.getSize();
+ try
+ {
+ if (lob.getBlob() != null)
+ {
+ InputStream in = lob.getBlob().getBinaryStream();
+ IOUtil.copyBinary(in, out, size);
+ }
+ else
+ {
+ Clob clob = lob.getClob();
+ Reader in = clob.getCharacterStream();
+ IOUtil.copyCharacter(in, new OutputStreamWriter(out), size);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
}
@Override
protected void writeBlob(byte[] id, long size, InputStream inputStream) throws IOException
{
- // TODO: implement HibernateStoreAccessor.writeBlob(id, size, inputStream)
- throw new UnsupportedOperationException();
+ final HibernateStoreLob lob = getCreateHibernateStoreLob(id);
+ if ((inputStream == null || size == 0) && !lob.isNew())
+ {
+ getHibernateSession().delete(lob);
+ }
+ else
+ {
+ lob.setBlob(Hibernate.createBlob(inputStream, (int)size));
+ lob.setSize((int)size);
+ lob.setClob(null);
+ getHibernateSession().saveOrUpdate(lob);
+ }
}
@Override
protected void writeClob(byte[] id, long size, Reader reader) throws IOException
{
- // TODO: implement HibernateStoreAccessor.writeClob(id, size, reader)
- throw new UnsupportedOperationException();
+ final HibernateStoreLob lob = getCreateHibernateStoreLob(id);
+ if ((reader == null || size == 0) && !lob.isNew())
+ {
+ getHibernateSession().delete(lob);
+ }
+ else
+ {
+ lob.setClob(Hibernate.createClob(reader, (int)size));
+ lob.setSize((int)size);
+ lob.setBlob(null);
+ getHibernateSession().saveOrUpdate(lob);
+ }
+ }
+
+ private HibernateStoreLob getCreateHibernateStoreLob(byte[] idBytes)
+ {
+ final String id = HexUtil.bytesToHex(idBytes);
+ final Session session = getHibernateSession();
+ HibernateStoreLob lob = (HibernateStoreLob)session.get(HibernateStoreLob.class, id);
+ if (lob == null)
+ {
+ lob = new HibernateStoreLob();
+ lob.setId(id);
+ }
+
+ return lob;
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreLob.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreLob.java
new file mode 100644
index 0000000000..038abd56bd
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreLob.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, 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:
+ * Martin Taal - initial API and implementation
+ * Eike Stepper - maintenance
+ */
+package org.eclipse.emf.cdo.server.internal.hibernate;
+
+import java.sql.Blob;
+import java.sql.Clob;
+
+/**
+ * Object used to store clob and lob.
+ *
+ * @author Martin Taal
+ */
+public class HibernateStoreLob
+{
+ // note size -1 is used to flag a new state
+ private static int NEW_FLAG_SIZE = -1;
+
+ private String id;
+
+ private Clob clob;
+
+ private Blob blob;
+
+ private int size = NEW_FLAG_SIZE;
+
+ public boolean isNew()
+ {
+ return size == NEW_FLAG_SIZE;
+ }
+
+ public int getSize()
+ {
+ return size;
+ }
+
+ public void setSize(int size)
+ {
+ this.size = size;
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+
+ public void setId(String id)
+ {
+ this.id = id;
+ }
+
+ public Clob getClob()
+ {
+ return clob;
+ }
+
+ public void setClob(Clob clob)
+ {
+ this.clob = clob;
+ }
+
+ public Blob getBlob()
+ {
+ return blob;
+ }
+
+ public void setBlob(Blob blob)
+ {
+ this.blob = blob;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/SystemProperty.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/SystemProperty.java
new file mode 100644
index 0000000000..df12165334
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/SystemProperty.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, 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:
+ * Martin Taal - initial API and implementation
+ * Eike Stepper - maintenance
+ */
+package org.eclipse.emf.cdo.server.internal.hibernate;
+
+/**
+ * Is used to store and retrieve properties in the database.
+ *
+ * @author Martin Taal
+ */
+public class SystemProperty
+{
+ private String name;
+
+ private String value;
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public String getValue()
+ {
+ return value;
+ }
+
+ public void setValue(String value)
+ {
+ this.value = value;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOBlobUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOBlobUserType.java
new file mode 100644
index 0000000000..e021e3527e
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOBlobUserType.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, 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:
+ * Martin Taal - initial api
+ * Eike Stepper - maintenance
+ */
+package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;
+
+import org.eclipse.emf.cdo.common.model.lob.CDOBlob;
+import org.eclipse.emf.cdo.common.model.lob.CDOLobUtil;
+
+/**
+ * Persists a {@link CDOBlob} in the DB.
+ */
+public class CDOBlobUserType extends CDOLobUserType
+{
+ public Class<?> returnedClass()
+ {
+ return CDOBlob.class;
+ }
+
+ @Override
+ protected Object createLob(byte[] id, long size)
+ {
+ return CDOLobUtil.createBlob(id, size);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOClobUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOClobUserType.java
new file mode 100644
index 0000000000..3370160123
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOClobUserType.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, 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:
+ * Martin Taal - initial api
+ * Eike Stepper - maintenance
+ */
+package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;
+
+import org.eclipse.emf.cdo.common.model.lob.CDOClob;
+import org.eclipse.emf.cdo.common.model.lob.CDOLobUtil;
+
+/**
+ * Persists a {@link CDOClob} in the DB.
+ */
+public class CDOClobUserType extends CDOLobUserType
+{
+ public Class<?> returnedClass()
+ {
+ return CDOClob.class;
+ }
+
+ @Override
+ protected Object createLob(byte[] id, long size)
+ {
+ return CDOLobUtil.createClob(id, size);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOCustomTypeUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOCustomTypeUserType.java
new file mode 100644
index 0000000000..36f99606f6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOCustomTypeUserType.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, 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:
+ * Martin Taal - initial api
+ * Eike Stepper - maintenance
+ */
+package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;
+
+import org.hibernate.Hibernate;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.usertype.UserType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Properties;
+
+/**
+ * Standard user type used for all custom types.
+ */
+public class CDOCustomTypeUserType implements UserType, ParameterizedType
+{
+ private static final int[] SQL_TYPES = { Types.VARCHAR };
+
+ public void setParameterValues(Properties arg0)
+ {
+ }
+
+ public Class<?> returnedClass()
+ {
+ return Object.class;
+ }
+
+ public int[] sqlTypes()
+ {
+ return SQL_TYPES;
+ }
+
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ public Object deepCopy(Object value)
+ {
+ return value;
+ }
+
+ public boolean equals(Object x, Object y)
+ {
+ if (x == y)
+ {
+ return true;
+ }
+
+ if (x == null || y == null)
+ {
+ return false;
+ }
+
+ return x.equals(y);
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException
+ {
+ try
+ {
+ final String value = (String)Hibernate.STRING.nullSafeGet(rs, names[0]);
+ if (rs.wasNull())
+ {
+ return null;
+ }
+
+ return value;
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public void nullSafeSet(PreparedStatement statement, Object value, int index) throws SQLException
+ {
+ try
+ {
+ if (value == null)
+ {
+ statement.setNull(index, Types.VARCHAR);
+ return;
+ }
+ statement.setString(index, value.toString());
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public Serializable disassemble(Object value)
+ {
+ return (Serializable)value;
+ }
+
+ public Object assemble(Serializable cachedValue, Object owner)
+ {
+ return cachedValue;
+ }
+
+ public Object replace(Object original, Object target, Object owner)
+ {
+ return original;
+ }
+
+ public int hashCode(Object x)
+ {
+ return x.hashCode();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOLobUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOLobUserType.java
new file mode 100644
index 0000000000..c9e287db47
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOLobUserType.java
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, 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:
+ * Martin Taal - initial api
+ * Eike Stepper - maintenance
+ */
+package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;
+
+import org.eclipse.emf.cdo.common.model.lob.CDOBlob;
+import org.eclipse.emf.cdo.common.model.lob.CDOClob;
+import org.eclipse.emf.cdo.common.model.lob.CDOLob;
+
+import org.eclipse.net4j.util.HexUtil;
+
+import org.hibernate.Hibernate;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.usertype.UserType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Properties;
+
+/**
+ * Base class for persisting {@link CDOBlob} and {@link CDOClob}.
+ */
+public abstract class CDOLobUserType implements UserType, ParameterizedType
+{
+ private static final String SEPARATOR = " - ";
+
+ private static final int[] SQL_TYPES = { Types.CLOB };
+
+ public CDOLobUserType()
+ {
+ }
+
+ public void setParameterValues(Properties arg0)
+ {
+ }
+
+ public int[] sqlTypes()
+ {
+ return SQL_TYPES;
+ }
+
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ public Object deepCopy(Object value)
+ {
+ return value;
+ }
+
+ public boolean equals(Object x, Object y)
+ {
+ if (x == y)
+ {
+ return true;
+ }
+
+ if (x == null || y == null)
+ {
+ return false;
+ }
+
+ return x.equals(y);
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException
+ {
+ try
+ {
+ final String value = (String)Hibernate.STRING.nullSafeGet(rs, names[0]);
+ if (rs.wasNull())
+ {
+ return null;
+ }
+
+ return convertStringToLob(value);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public void nullSafeSet(PreparedStatement statement, Object value, int index) throws SQLException
+ {
+ try
+ {
+ final CDOLob<?> cdoLob = (CDOLob<?>)value;
+
+ if (value == null || cdoLob.getSize() == 0)
+ {
+ statement.setNull(index, Types.VARCHAR);
+ return;
+ }
+ statement.setString(index, convertLobToString(cdoLob));
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public Serializable disassemble(Object value)
+ {
+ return (Serializable)value;
+ }
+
+ public Object assemble(Serializable cachedValue, Object owner)
+ {
+ return cachedValue;
+ }
+
+ private String convertLobToString(CDOLob<?> lob)
+ {
+ return HexUtil.bytesToHex(lob.getID()) + SEPARATOR + lob.getSize();
+ }
+
+ private Object convertStringToLob(String lobId)
+ {
+ int pos = lobId.indexOf(SEPARATOR);
+
+ byte[] id = HexUtil.hexToBytes(lobId.substring(0, pos));
+ long size = Long.parseLong(lobId.substring(pos + 1));
+ return createLob(id, size);
+ }
+
+ protected abstract Object createLob(byte[] id, long size);
+
+ public Object replace(Object original, Object target, Object owner)
+ {
+ return original;
+ }
+
+ public int hashCode(Object x)
+ {
+ return x.hashCode();
+ }
+}
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
index 1764d53096..eb4913e7c5 100644
--- 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
@@ -20,11 +20,13 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.net4j.util.om.trace.ContextTracer;
+import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcoreFactory;
import org.hibernate.EntityMode;
import org.hibernate.EntityNameResolver;
@@ -242,6 +244,7 @@ public class CDORevisionTuplizer extends AbstractEntityTuplizer
if (mappedProperty == mappedEntity.getIdentifierProperty())
{
+ setIdentifierTypeAsAnnotation(mappedProperty);
return new CDOIDPropertySetter(this, mappedProperty.getName());
}
@@ -322,4 +325,20 @@ public class CDORevisionTuplizer extends AbstractEntityTuplizer
{
return false;
}
+
+ private void setIdentifierTypeAsAnnotation(Property prop)
+ {
+ EAnnotation eAnnotation = getEClass().getEAnnotation(HibernateStore.ID_TYPE_EANNOTATION_SOURCE);
+ if (eAnnotation == null)
+ {
+ eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
+ eAnnotation.setSource(HibernateStore.ID_TYPE_EANNOTATION_SOURCE);
+ eAnnotation.getDetails().put(HibernateStore.ID_TYPE_EANNOTATION_KEY, prop.getType().getName());
+ getEClass().getEAnnotations().add(eAnnotation);
+ }
+ else if (!eAnnotation.getDetails().containsKey(HibernateStore.ID_TYPE_EANNOTATION_KEY))
+ {
+ eAnnotation.getDetails().put(HibernateStore.ID_TYPE_EANNOTATION_KEY, prop.getType().getName());
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java
index 0d80e10c1c..0dff31d7e5 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/WrappedHibernateList.java
@@ -177,6 +177,11 @@ public class WrappedHibernateList implements InternalCDOList
protected CDOID getCDOID(Object o)
{
+ if (o instanceof CDOID)
+ {
+ return (CDOID)o;
+ }
+
return HibernateUtil.getInstance().getCDOID(o);
}
@@ -228,7 +233,13 @@ public class WrappedHibernateList implements InternalCDOList
public Object get(int index)
{
- final Object value = getObject(getDelegate().get(index));
+ final Object delegateValue = getDelegate().get(index);
+ if (delegateValue instanceof CDOID)
+ {
+ return delegateValue;
+ }
+
+ final Object value = getObject(delegateValue);
if (value instanceof CDORevision || value instanceof HibernateProxy)
{
return HibernateUtil.getInstance().getCDOID(value);
diff --git a/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF
index 6f5d6d98c9..f7458824d5 100644
--- a/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server/META-INF/MANIFEST.MF
@@ -16,7 +16,8 @@ Export-Package: org.eclipse.emf.cdo.internal.server;version="4.0.0";
x-friends:="org.eclipse.emf.cdo.server.db,
org.eclipse.emf.cdo.server.net4j,
org.eclipse.emf.cdo.tests,
- org.eclipse.emf.cdo.workspace",
+ org.eclipse.emf.cdo.workspace,
+ org.eclipse.emf.cdo.server.hibernate",
org.eclipse.emf.cdo.internal.server.bundle;version="4.0.0";x-internal:=true,
org.eclipse.emf.cdo.internal.server.embedded;version="4.0.0";x-friends:="org.eclipse.emf.cdo.tests",
org.eclipse.emf.cdo.internal.server.mem;version="4.0.0";x-friends:="org.eclipse.emf.cdo.tests",
diff --git a/plugins/org.eclipse.emf.cdo.tests.hibernate/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.tests.hibernate/META-INF/MANIFEST.MF
index d75621587d..835a56e9b9 100644
--- a/plugins/org.eclipse.emf.cdo.tests.hibernate/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.tests.hibernate/META-INF/MANIFEST.MF
@@ -8,6 +8,7 @@ Bundle-Localization: plugin
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.eclipse.emf.cdo.tests.hibernate.Activator
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Eclipse-RegisterBuddy: org.eclipse.emf.cdo.server.hibernate
Bundle-ClassPath: .
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
org.eclipse.net4j.tcp;bundle-version="[4.0.0,5.0.0)",
diff --git a/plugins/org.eclipse.emf.cdo.tests.hibernate/src/org/eclipse/emf/cdo/tests/hibernate/AllTestsHibernate.java b/plugins/org.eclipse.emf.cdo.tests.hibernate/src/org/eclipse/emf/cdo/tests/hibernate/AllTestsHibernate.java
index bed3974251..51cdc7e194 100644
--- a/plugins/org.eclipse.emf.cdo.tests.hibernate/src/org/eclipse/emf/cdo/tests/hibernate/AllTestsHibernate.java
+++ b/plugins/org.eclipse.emf.cdo.tests.hibernate/src/org/eclipse/emf/cdo/tests/hibernate/AllTestsHibernate.java
@@ -16,20 +16,33 @@ import org.eclipse.emf.cdo.tests.AuditTestSameSession;
import org.eclipse.emf.cdo.tests.BranchingTest;
import org.eclipse.emf.cdo.tests.BranchingTestSameSession;
import org.eclipse.emf.cdo.tests.CommitInfoTest;
+import org.eclipse.emf.cdo.tests.ComplexTest;
import org.eclipse.emf.cdo.tests.ExternalReferenceTest;
+import org.eclipse.emf.cdo.tests.LobTest;
import org.eclipse.emf.cdo.tests.LockingManagerTest;
import org.eclipse.emf.cdo.tests.MEMStoreQueryTest;
import org.eclipse.emf.cdo.tests.MergingTest;
import org.eclipse.emf.cdo.tests.MultiValuedOfAttributeTest;
+import org.eclipse.emf.cdo.tests.OCLQueryTest;
+import org.eclipse.emf.cdo.tests.PartialCommitTest;
+import org.eclipse.emf.cdo.tests.RepositoryTest;
+import org.eclipse.emf.cdo.tests.ResourceTest;
+import org.eclipse.emf.cdo.tests.SetFeatureTest;
import org.eclipse.emf.cdo.tests.UnsetTest;
import org.eclipse.emf.cdo.tests.XATransactionTest;
+import org.eclipse.emf.cdo.tests.XRefTest;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_252214_Test;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_258933_Test;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_272861_Test;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_273565_Test;
+import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_283985_CDOTest;
+import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_283985_CDOTest2;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_308895_Test;
+import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_316444_Test;
+import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_319836_Test;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest;
import org.eclipse.emf.cdo.tests.config.impl.RepositoryConfig;
+import org.eclipse.emf.cdo.util.CommitException;
import java.util.List;
@@ -57,6 +70,24 @@ public class AllTestsHibernate extends AllConfigs
@Override
protected void initTestClasses(List<Class<? extends ConfigTest>> testClasses)
{
+ // if (true)
+ // {
+ // testClasses.clear();
+ // testClasses.add(XRefTest.class);
+ // return;
+ // }
+ // // current failing testcases
+ // testClasses.add(ContainmentTest.class);
+ // testClasses.add(Bugzilla_279982_Test.class);
+ // testClasses.add(Bugzilla_316273_Test.class);
+ // testClasses.add(Bugzilla_320690_Test.class);
+ // testClasses.add(Bugzilla_322804_Test.class);
+ // testClasses.add(Bugzilla_323930_Test.class);
+
+ testClasses.add(XRefTest.class);
+ testClasses.add(LobTest.class);
+ testClasses.add(RepositoryTest.class);
+
testClasses.add(Hibernate_Bugzilla_308895_Test.class);
testClasses.add(HibernateExternalAnnotationTest.class);
testClasses.add(HibernateMultiValuedOfAttributeTest.class);
@@ -67,11 +98,31 @@ public class AllTestsHibernate extends AllConfigs
testClasses.add(HibernateBugzilla_258933_Test.class);
testClasses.add(HibernateUnsetTest.class);
testClasses.add(HibernateBugzilla_301104_Test.class);
+ testClasses.add(Hibernate_SetFeatureTest.class);
+ testClasses.add(Hibernate_ResourceTest.class);
+ testClasses.add(Hibernate_ComplexTest.class);
+ testClasses.add(Hibernate_PartialCommitTest.class);
+ testClasses.add(Hibernate_Bugzilla_316444_Test.class);
super.initTestClasses(testClasses);
+ // are replaced by Hibernate specific ones, mostly
+ // to prevent tests doing move from one container to another
+ testClasses.remove(ComplexTest.class);
+ testClasses.remove(ResourceTest.class);
+ testClasses.remove(SetFeatureTest.class);
+ testClasses.remove(PartialCommitTest.class);
+ testClasses.remove(Bugzilla_316444_Test.class);
testClasses.remove(Bugzilla_308895_Test.class);
+ // contains a lot of containment move, which is not supported by Hibernate
+ testClasses.remove(Bugzilla_283985_CDOTest.class);
+ testClasses.remove(Bugzilla_283985_CDOTest2.class);
+ testClasses.remove(Bugzilla_319836_Test.class);
+
+ // OCL querying not supported
+ testClasses.remove(OCLQueryTest.class);
+
// Branching not supported
testClasses.remove(BranchingTest.class);
testClasses.remove(MergingTest.class);
@@ -157,4 +208,74 @@ public class AllTestsHibernate extends AllConfigs
// att.getEAnnotations().add(eAnnotation);
}
}
+
+ // unsettable is hardly supported by the Hibernate Store
+ public static class Hibernate_SetFeatureTest extends SetFeatureTest
+ {
+ @Override
+ public void testUnsettableDateNoDefault_SetDefault() throws Exception
+ {
+ }
+
+ @Override
+ public void testUnsettableStringNoDefault_SetDefault() throws Exception
+ {
+ }
+ }
+
+ // disable some container move tests, containment move is not supported
+ // by hibernate
+ public static class Hibernate_ResourceTest extends ResourceTest
+ {
+ @Override
+ public void testChangePathFromDepth3ToDepth0() throws Exception
+ {
+ }
+
+ @Override
+ public void testChangeResourceURI() throws Exception
+ {
+ }
+
+ @Override
+ public void testChangeResourceFolderURI() throws Exception
+ {
+ }
+ }
+
+ public static class Hibernate_ComplexTest extends ComplexTest
+ {
+ @Override
+ public void testMigrateContainmentMulti()
+ {
+ }
+
+ }
+
+ public static class Hibernate_PartialCommitTest extends PartialCommitTest
+ {
+ @Override
+ public void testMove() throws CommitException
+ {
+ }
+
+ @Override
+ public void testDoubleMove() throws CommitException
+ {
+ }
+ }
+
+ public static class Hibernate_Bugzilla_316444_Test extends Bugzilla_316444_Test
+ {
+ @Override
+ public void testLockParentWithEAttributeChange() throws Exception
+ {
+ }
+
+ @Override
+ public void testMovingSubtree() throws Exception
+ {
+ }
+
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java
index 902e006257..e5ac4663bd 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PartialCommitTest.java
@@ -188,6 +188,7 @@ public class PartialCommitTest extends AbstractCDOTest
PurchaseOrder po = Model1Factory.eINSTANCE.createPurchaseOrder();
company2.getPurchaseOrders().add(po);
Product1 product = Model1Factory.eINSTANCE.createProduct1();
+ product.setName("product1");
cat.getProducts().add(product);
tx.setCommittables(createSet(company4, resource1));
@@ -231,6 +232,7 @@ public class PartialCommitTest extends AbstractCDOTest
PurchaseOrder po = Model1Factory.eINSTANCE.createPurchaseOrder();
company2.getPurchaseOrders().add(po);
Product1 product = Model1Factory.eINSTANCE.createProduct1();
+ product.setName("product1");
cat.getProducts().add(product);
tx.commit();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316273_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316273_Test.java
index 858ea0d7a0..59bca9f62a 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316273_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_316273_Test.java
@@ -58,6 +58,7 @@ public class Bugzilla_316273_Test extends AbstractCDOTest
CDOResource resource = transaction.createResource("/test1");
Product1 product1 = getModel1Factory().createProduct1();
+ product1.setName("product1");
resource.getContents().add(product1);
OrderDetail orderDetail1 = getModel1Factory().createOrderDetail();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java
index 60be164621..fee10bf793 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java
@@ -58,6 +58,7 @@ public class Bugzilla_322754_Test extends AbstractCDOTest
{
Product1 product = getModel1Factory().createProduct1();
OrderDetail orderDetail = getModel1Factory().createOrderDetail();
+ product.setName("product1");
orderDetail.setProduct(product);
CDOSession session = openSession();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_324585_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_324585_Test.java
index c9613b5357..34151af5f4 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_324585_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_324585_Test.java
@@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Category;
+import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
@@ -52,7 +53,9 @@ public class Bugzilla_324585_Test extends AbstractCDOTest
// user1
for (int i = 0; i < 1000; i++)
{
- category1.getProducts().add(getModel1Factory().createProduct1());
+ final Product1 product = getModel1Factory().createProduct1();
+ product.setName("product" + i);
+ category1.getProducts().add(product);
}
transaction1.commit();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_326743_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_326743_Test.java
index e845931dd2..c39070aa68 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_326743_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_326743_Test.java
@@ -19,6 +19,7 @@ import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.view.CDOView;
+import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
@@ -49,6 +50,13 @@ public class Bugzilla_326743_Test extends AbstractCDOTest
customPrimitive.setInstanceTypeName("boolean");
customPrimitive.setName("CustomPrimitiveType");
+ // added type annotation for teneo test case
+ final EAnnotation eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
+ eAnnotation.setSource("teneo.jpa");
+ final String typeAnnotation = "@Type(type=\"org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOCustomTypeUserType\")";
+ eAnnotation.getDetails().put("value", typeAnnotation);
+ customPrimitive.getEAnnotations().add(eAnnotation);
+
pkg.getEClassifiers().add(customPrimitive);
cls = EMFUtil.createEClass(pkg, "Foobar", false, false);

Back to the top