diff options
author | Martin Taal | 2010-11-14 22:40:56 +0000 |
---|---|---|
committer | Martin Taal | 2010-11-14 22:40:56 +0000 |
commit | d838c1011858929372a8f75610681d23ca0d5d1a (patch) | |
tree | 34661c4d7aa6221ce7b03ceeafc46576eee0d358 | |
parent | b06c837fe7a339d1859ca7f27032d1fc83ee87b9 (diff) | |
download | cdo-d838c1011858929372a8f75610681d23ca0d5d1a.tar.gz cdo-d838c1011858929372a8f75610681d23ca0d5d1a.tar.xz cdo-d838c1011858929372a8f75610681d23ca0d5d1a.zip |
Fixes issue [Hibernate] Support queryXRefs
Added support for lob and store property in HibernateStore
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); |