From 7658b38c22842ba2e006a4b65cee6bc019858652 Mon Sep 17 00:00:00 2001
From: Eike Stepper
Date: Wed, 10 Apr 2013 17:53:43 +0200
Subject: [405343] [DB] Automatically determine whether Ecore must be mapped
https://bugs.eclipse.org/bugs/show_bug.cgi?id=405343
---
.../admin/CDOAdminClientRepositoryImpl.java | 6 +-
.../emf/cdo/common/CDOCommonRepository.java | 2 +
.../config/cdo-server.xml | 1 -
.../config/cdo-server.xml | 1 -
.../net4j/CDONet4jSessionConfigurationImpl.java | 6 +-
.../net4j/protocol/OpenSessionRequest.java | 10 +-
.../internal/admin/CDOAdminServerRepository.java | 2 +-
.../db/mapping/AbstractMappingStrategy.java | 112 +++++++++++++++++++--
.../hibernate/HibernateRawCommitContext.java | 24 +++++
.../protocol/CommitTransactionIndication.java | 18 ++++
.../net4j/protocol/OpenSessionIndication.java | 1 -
.../config-ssl/cdo-server.xml | 1 -
.../config/cdo-server.xml | 1 -
.../cdo/internal/server/DelegatingRepository.java | 1 +
.../emf/cdo/internal/server/Repository.java | 11 +-
.../emf/cdo/internal/server/ServerCDOView.java | 1 +
.../internal/server/TransactionCommitContext.java | 24 +++++
.../EmbeddedClientSessionConfiguration.java | 1 +
.../org/eclipse/emf/cdo/server/IRepository.java | 2 +
.../org/eclipse/emf/cdo/server/IStoreAccessor.java | 10 ++
.../emf/cdo/spi/server/InternalCommitContext.java | 10 ++
.../eclipse/emf/cdo/spi/server/StoreAccessor.java | 7 +-
.../cdo/tests/bugzilla/Bugzilla_316444_Test.java | 2 +
.../cdo/tests/bugzilla/Bugzilla_404318_Test.java | 10 --
.../cdo/tests/config/impl/RepositoryConfig.java | 1 -
plugins/org.eclipse.emf.cdo/plugin.xml | 2 +-
.../emf/internal/cdo/messages/messages.properties | 2 -
.../internal/cdo/session/SessionProperties.java | 12 +--
.../eclipse/emf/spi/cdo/CDOSessionProtocol.java | 13 +--
29 files changed, 218 insertions(+), 76 deletions(-)
(limited to 'plugins')
diff --git a/plugins/org.eclipse.emf.cdo.admin/src/org/eclipse/emf/cdo/internal/admin/CDOAdminClientRepositoryImpl.java b/plugins/org.eclipse.emf.cdo.admin/src/org/eclipse/emf/cdo/internal/admin/CDOAdminClientRepositoryImpl.java
index 25d0265b6e..8611fcd9d4 100644
--- a/plugins/org.eclipse.emf.cdo.admin/src/org/eclipse/emf/cdo/internal/admin/CDOAdminClientRepositoryImpl.java
+++ b/plugins/org.eclipse.emf.cdo.admin/src/org/eclipse/emf/cdo/internal/admin/CDOAdminClientRepositoryImpl.java
@@ -61,8 +61,6 @@ public class CDOAdminClientRepositoryImpl extends Notifier implements CDOAdminCl
private boolean supportingBranches;
- private boolean supportingEcore;
-
private boolean serializingCommits;
private boolean ensuringReferentialIntegrity;
@@ -90,7 +88,6 @@ public class CDOAdminClientRepositoryImpl extends Notifier implements CDOAdminCl
rootResourceID = new CDODataInputImpl.Default(in).readCDOID();
supportingAudits = in.readBoolean();
supportingBranches = in.readBoolean();
- supportingEcore = in.readBoolean();
serializingCommits = in.readBoolean();
ensuringReferentialIntegrity = in.readBoolean();
idGenerationLocation = in.readEnum(IDGenerationLocation.class);
@@ -151,9 +148,10 @@ public class CDOAdminClientRepositoryImpl extends Notifier implements CDOAdminCl
return supportingBranches;
}
+ @Deprecated
public boolean isSupportingEcore()
{
- return supportingEcore;
+ return true;
}
public boolean isSerializingCommits()
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonRepository.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonRepository.java
index e921c7028a..e13a5b7249 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonRepository.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonRepository.java
@@ -101,7 +101,9 @@ public interface CDOCommonRepository extends CDOTimeProvider, IAdaptable
* Returns true
if this repository supports instances of Ecore, false
otherwise.
*
* @since 4.0
+ * @deprecated As of 4.2 instances of Ecore are always supported (on demand).
*/
+ @Deprecated
public boolean isSupportingEcore();
/**
diff --git a/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml b/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml
index 56f22a983e..5b7b7fd307 100644
--- a/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml
+++ b/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml
@@ -17,7 +17,6 @@
-
diff --git a/plugins/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml b/plugins/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml
index 56f22a983e..5b7b7fd307 100644
--- a/plugins/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml
+++ b/plugins/org.eclipse.emf.cdo.examples.master/config/cdo-server.xml
@@ -17,7 +17,6 @@
-
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java
index b83e85f135..9b6872574e 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java
@@ -160,8 +160,6 @@ public class CDONet4jSessionConfigurationImpl extends CDOSessionConfigurationImp
private boolean supportingBranches;
- private boolean supportingEcore;
-
private boolean serializingCommits;
private boolean ensuringReferentialIntegrity;
@@ -184,7 +182,6 @@ public class CDONet4jSessionConfigurationImpl extends CDOSessionConfigurationImp
rootResourceID = result.getRootResourceID();
supportingAudits = result.isRepositorySupportingAudits();
supportingBranches = result.isRepositorySupportingBranches();
- supportingEcore = result.isRepositorySupportingEcore();
serializingCommits = result.isRepositoryEnsuringReferentialIntegrity();
ensuringReferentialIntegrity = result.isRepositoryEnsuringReferentialIntegrity();
idGenerationLocation = result.getRepositoryIDGenerationLocation();
@@ -290,9 +287,10 @@ public class CDONet4jSessionConfigurationImpl extends CDOSessionConfigurationImp
return supportingBranches;
}
+ @Deprecated
public boolean isSupportingEcore()
{
- return supportingEcore;
+ return true;
}
public boolean isSerializingCommits()
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java
index 4e486a5974..2ea2657ff5 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java
@@ -191,12 +191,6 @@ public class OpenSessionRequest extends CDOClientRequestWithMonitoring();
@@ -417,6 +432,69 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp
public void createMapping(Connection connection, InternalCDOPackageUnit[] packageUnits, OMMonitor monitor)
{
+ boolean isInitialCommit = contains(packageUnits, EresourcePackage.eINSTANCE.getNsURI());
+ if (isInitialCommit)
+ {
+ // Don't create tables for Ecore and Etypes upon repository initialization
+ List reducedPackageUnits = new ArrayList();
+ for (InternalCDOPackageUnit packageUnit : packageUnits)
+ {
+ String id = packageUnit.getID();
+ if (id.equals(EcorePackage.eINSTANCE.getNsURI()) || id.equals(EtypesPackage.eINSTANCE.getNsURI()))
+ {
+ continue;
+ }
+
+ reducedPackageUnits.add(packageUnit);
+ }
+
+ packageUnits = reducedPackageUnits.toArray(new InternalCDOPackageUnit[reducedPackageUnits.size()]);
+ mappedInfoInitialized = true;
+ }
+ else
+ {
+ if (!mappedInfoInitialized)
+ {
+ mappedInfoInitialized = true;
+ mappedEcore = hasTableFor(EcorePackage.eINSTANCE.getEPackage());
+ mappedEtypes = hasTableFor(EtypesPackage.eINSTANCE.getAnnotation());
+ }
+
+ if (!mappedEcore || !mappedEtypes)
+ {
+ CommitContext commitContext = StoreThreadLocal.getCommitContext();
+ if (commitContext != null)
+ {
+ CDOPackageRegistry packageRegistry = store.getRepository().getPackageRegistry();
+ List extendedPackageUnits = new ArrayList();
+ if (packageUnits != null)
+ {
+ extendedPackageUnits.addAll(Arrays.asList(packageUnits));
+ }
+
+ boolean changed = false;
+ if (!mappedEcore && commitContext.isUsingEcore())
+ {
+ CDOPackageUnit packageUnit = packageRegistry.getPackageUnit(EcorePackage.eINSTANCE);
+ extendedPackageUnits.add((InternalCDOPackageUnit)packageUnit);
+ changed = true;
+ }
+
+ if (!mappedEtypes && commitContext.isUsingEtypes())
+ {
+ CDOPackageUnit packageUnit = packageRegistry.getPackageUnit(EtypesPackage.eINSTANCE);
+ extendedPackageUnits.add((InternalCDOPackageUnit)packageUnit);
+ changed = true;
+ }
+
+ if (changed)
+ {
+ packageUnits = extendedPackageUnits.toArray(new InternalCDOPackageUnit[extendedPackageUnits.size()]);
+ }
+ }
+ }
+ }
+
Async async = null;
monitor.begin();
@@ -460,27 +538,47 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp
}
}
+ private boolean hasTableFor(EClass eClass)
+ {
+ String tableName = getTableName(eClass);
+ return store.getDBSchema().getTable(tableName) != null;
+ }
+
+ private boolean contains(InternalCDOPackageUnit[] packageUnits, String packageUnitID)
+ {
+ if (packageUnits != null && packageUnits.length != 0)
+ {
+ for (InternalCDOPackageUnit packageUnit : packageUnits)
+ {
+ if (packageUnit.getID().equals(packageUnitID))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
private void mapPackageUnits(InternalCDOPackageUnit[] packageUnits, Connection connection, boolean unmap)
{
if (packageUnits != null && packageUnits.length != 0)
{
for (InternalCDOPackageUnit packageUnit : packageUnits)
{
- mapPackageInfos(packageUnit.getPackageInfos(), connection, unmap);
+ InternalCDOPackageInfo[] packageInfos = packageUnit.getPackageInfos();
+ mapPackageInfos(packageInfos, connection, unmap);
}
}
}
private void mapPackageInfos(InternalCDOPackageInfo[] packageInfos, Connection connection, boolean unmap)
{
- boolean supportingEcore = getStore().getRepository().isSupportingEcore();
for (InternalCDOPackageInfo packageInfo : packageInfos)
{
EPackage ePackage = packageInfo.getEPackage();
- if (!CDOModelUtil.isCorePackage(ePackage) || supportingEcore)
- {
- mapClasses(connection, unmap, EMFUtil.getPersistentClasses(ePackage));
- }
+ EClass[] persistentClasses = EMFUtil.getPersistentClasses(ePackage);
+ mapClasses(connection, unmap, persistentClasses);
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java
index fb7be679f1..d556cfe570 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateRawCommitContext.java
@@ -55,6 +55,10 @@ public class HibernateRawCommitContext implements InternalCommitContext
private CDOBranchPoint branchPoint;
+ private boolean usingEcore;
+
+ private boolean usingEtypes;
+
public CDORevision getRevision(CDOID id)
{
for (CDORevision cdoRevision : newObjects)
@@ -113,6 +117,16 @@ public class HibernateRawCommitContext implements InternalCommitContext
return false;
}
+ public boolean isUsingEcore()
+ {
+ return usingEcore;
+ }
+
+ public boolean isUsingEtypes()
+ {
+ return usingEtypes;
+ }
+
public InternalCDOPackageUnit[] getNewPackageUnits()
{
return new InternalCDOPackageUnit[0];
@@ -238,6 +252,16 @@ public class HibernateRawCommitContext implements InternalCommitContext
{
}
+ public void setUsingEcore(boolean usingEcore)
+ {
+ this.usingEcore = usingEcore;
+ }
+
+ public void setUsingEtypes(boolean usingEtypes)
+ {
+ this.usingEtypes = usingEtypes;
+ }
+
public void setNewPackageUnits(InternalCDOPackageUnit[] newPackageUnits)
{
}
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
index 6b8c34b9bc..e02c361587 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
@@ -24,6 +24,7 @@ import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+import org.eclipse.emf.cdo.etypes.EtypesPackage;
import org.eclipse.emf.cdo.server.IView;
import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
@@ -40,6 +41,8 @@ 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.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
@@ -170,9 +173,22 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
TRACER.format("Reading {0} new objects", newObjects.length); //$NON-NLS-1$
}
+ boolean usingEcore = false;
+ boolean usingEtypes = false;
for (int i = 0; i < newObjects.length; i++)
{
newObjects[i] = (InternalCDORevision)in.readCDORevision();
+
+ EPackage ePackage = newObjects[i].getEClass().getEPackage();
+ if (ePackage == EcorePackage.eINSTANCE)
+ {
+ usingEcore = true;
+ }
+ else if (ePackage == EtypesPackage.eINSTANCE)
+ {
+ usingEtypes = true;
+ }
+
monitor.worked();
}
@@ -251,6 +267,8 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
}
commitContext.setClearResourcePathCache(clearResourcePathCache);
+ commitContext.setUsingEcore(usingEcore);
+ commitContext.setUsingEtypes(usingEtypes);
commitContext.setNewPackageUnits(newPackageUnits);
commitContext.setLocksOnNewObjects(locksOnNewObjects);
commitContext.setNewObjects(newObjects);
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java
index 9a62a2c571..99a7227401 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java
@@ -176,7 +176,6 @@ public class OpenSessionIndication extends CDOServerIndicationWithMonitoring
out.writeCDOID(repository.getRootResourceID());
out.writeBoolean(repository.isSupportingAudits());
out.writeBoolean(repository.isSupportingBranches());
- out.writeBoolean(repository.isSupportingEcore());
out.writeBoolean(repository.isSerializingCommits());
out.writeBoolean(repository.isEnsuringReferentialIntegrity());
out.writeEnum(repository.getIDGenerationLocation());
diff --git a/plugins/org.eclipse.emf.cdo.server.product/config-ssl/cdo-server.xml b/plugins/org.eclipse.emf.cdo.server.product/config-ssl/cdo-server.xml
index 529388b345..ce8adf6a97 100644
--- a/plugins/org.eclipse.emf.cdo.server.product/config-ssl/cdo-server.xml
+++ b/plugins/org.eclipse.emf.cdo.server.product/config-ssl/cdo-server.xml
@@ -12,7 +12,6 @@
-
diff --git a/plugins/org.eclipse.emf.cdo.server.product/config/cdo-server.xml b/plugins/org.eclipse.emf.cdo.server.product/config/cdo-server.xml
index af96b28ec4..fb03664ee6 100644
--- a/plugins/org.eclipse.emf.cdo.server.product/config/cdo-server.xml
+++ b/plugins/org.eclipse.emf.cdo.server.product/config/cdo-server.xml
@@ -17,7 +17,6 @@
-
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java
index 6fa2412769..0eece545a8 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java
@@ -356,6 +356,7 @@ public abstract class DelegatingRepository implements InternalRepository
return getDelegate().processPackage(value);
}
+ @Deprecated
public boolean isSupportingEcore()
{
return getDelegate().isSupportingEcore();
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
index aae31efc84..190661ceb5 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
@@ -153,8 +153,6 @@ public class Repository extends Container