Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2008-08-25 08:21:47 +0000
committerEike Stepper2008-08-25 08:21:47 +0000
commit6a922afc3d5f14d79a66486d068774f5242dd71f (patch)
treee0e07075988244e9e31834a2cf695573ccb41b25
parent428dc2015e0073f2a57a32aa2e93e664656d9d80 (diff)
downloadcdo-6a922afc3d5f14d79a66486d068774f5242dd71f.tar.gz
cdo-6a922afc3d5f14d79a66486d068774f5242dd71f.tar.xz
cdo-6a922afc3d5f14d79a66486d068774f5242dd71f.zip
[245016] Prevent subpackage read in CDOTransaction and add antlr plugin to runtime
https://bugs.eclipse.org/bugs/show_bug.cgi?id=245016
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java14
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java151
2 files changed, 106 insertions, 59 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java
index 46d1e9144a..b149df9b14 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java
@@ -35,6 +35,8 @@ import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.internal.cdo.bundle.OM;
import org.eclipse.emf.internal.cdo.protocol.CommitTransactionRequest;
import org.eclipse.emf.internal.cdo.protocol.CommitTransactionResult;
+import org.eclipse.emf.internal.cdo.util.CompletePackageClosure;
+import org.eclipse.emf.internal.cdo.util.IPackageClosure;
import org.eclipse.emf.internal.cdo.util.ModelUtil;
import org.eclipse.net4j.channel.IChannel;
@@ -433,7 +435,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction
private static List<CDOPackage> analyzeNewPackages(Collection<EClass> eClasses,
CDOSessionPackageManagerImpl packageManager)
{
- // Calculate the top level packages of the used classes
+ // Calculate the top level EPackages of the used classes
Set<EPackage> usedPackages = new HashSet<EPackage>();
for (EClass eClass : eClasses)
{
@@ -441,7 +443,10 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction
usedPackages.add(topLevelPackage);
}
- // Determine which of the used packages are new
+ IPackageClosure closure = new CompletePackageClosure();
+ usedPackages = closure.calculate(usedPackages);
+
+ // Determine which of the corresdonding CDOPackages are new
List<CDOPackage> newPackages = new ArrayList<CDOPackage>();
for (EPackage usedPackage : usedPackages)
{
@@ -454,11 +459,6 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction
if (!cdoPackage.isPersistent() && !cdoPackage.isSystem())
{
newPackages.add(cdoPackage);
- CDOPackage[] subPackages = cdoPackage.getSubPackages(true);
- for (CDOPackage subPackage : subPackages)
- {
- newPackages.add(subPackage);
- }
}
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java
index 865f0be639..d93fec4edc 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java
@@ -23,6 +23,7 @@ import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypeParameter;
+import org.eclipse.emf.ecore.EcorePackage;
import java.util.HashSet;
import java.util.List;
@@ -35,45 +36,63 @@ public class CompletePackageClosure extends PackageClosure
{
private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_MODEL, CompletePackageClosure.class);
+ private boolean excludeEcore;
+
public CompletePackageClosure()
{
}
+ public CompletePackageClosure(boolean excludeEcore)
+ {
+ this.excludeEcore = excludeEcore;
+ }
+
@Override
protected void collectContents(EPackage ePackage, Set<EPackage> visited)
{
- Set<EClass> classes = new HashSet<EClass>();
- List<EClassifier> classifiers = ePackage.getEClassifiers();
- for (EClassifier classifier : classifiers)
+ if (ePackage != null)
{
- handleEClassifier(classifier, classes);
- }
+ if (excludeEcore && ePackage == EcorePackage.eINSTANCE)
+ {
+ return;
+ }
- for (EClass eClass : classes)
- {
- final EPackage p = eClass.getEPackage();
- if (p != null)
+ Set<EClass> classes = new HashSet<EClass>();
+ List<EClassifier> classifiers = ePackage.getEClassifiers();
+ for (EClassifier classifier : classifiers)
+ {
+ handleEClassifier(classifier, classes);
+ }
+
+ for (EClass eClass : classes)
{
- if (visited.add(p))
+ final EPackage p = eClass.getEPackage();
+ if (p != null)
{
- if (TRACER.isEnabled())
+ if (visited.add(p))
{
- TRACER.trace("Found package " + p.getNsURI());
+ if (TRACER.isEnabled())
+ {
+ TRACER.trace("Found package " + p.getNsURI());
+ }
}
}
- }
- else
- {
- OM.LOG.warn("Package == null for " + eClass.getName());
+ else
+ {
+ OM.LOG.warn("Package == null for " + eClass.getName());
+ }
}
}
}
protected void handleEClassifiers(List<EClassifier> classifiers, Set<EClass> visited)
{
- for (EClassifier classifier : classifiers)
+ if (classifiers != null)
{
- handleEClassifier(classifier, visited);
+ for (EClassifier classifier : classifiers)
+ {
+ handleEClassifier(classifier, visited);
+ }
}
}
@@ -87,87 +106,115 @@ public class CompletePackageClosure extends PackageClosure
protected void handleEClasses(List<EClass> classes, Set<EClass> visited)
{
- for (EClass eClass : classes)
+ if (classes != null)
{
- handleEClass(eClass, visited);
+ for (EClass eClass : classes)
+ {
+ handleEClass(eClass, visited);
+ }
}
}
protected void handleEClass(EClass eClass, Set<EClass> visited)
{
- if (visited.add(eClass))
+ if (eClass != null)
{
- if (TRACER.isEnabled())
+ if (visited.add(eClass))
{
- TRACER.trace("Found class " + eClass.getName());
+ if (TRACER.isEnabled())
+ {
+ TRACER.trace("Found class " + eClass.getName());
+ }
+
+ handleEStructuralFeatures(eClass.getEStructuralFeatures(), visited);
+ handleEOperations(eClass.getEOperations(), visited);
+ handleEClasses(eClass.getESuperTypes(), visited);
+ handleEGenericTypes(eClass.getEGenericSuperTypes(), visited);
+ handleETypeParameters(eClass.getETypeParameters(), visited);
}
- handleEStructuralFeatures(eClass.getEStructuralFeatures(), visited);
- handleEOperations(eClass.getEOperations(), visited);
- handleEClasses(eClass.getESuperTypes(), visited);
- handleEGenericTypes(eClass.getEGenericSuperTypes(), visited);
- handleETypeParameters(eClass.getETypeParameters(), visited);
}
}
protected void handleEStructuralFeatures(List<EStructuralFeature> structuralFeatures, Set<EClass> visited)
{
- for (EStructuralFeature structuralFeature : structuralFeatures)
+ if (structuralFeatures != null)
{
- handleEClassifier(structuralFeature.getEType(), visited);
- handleEGenericType(structuralFeature.getEGenericType(), visited);
+ for (EStructuralFeature structuralFeature : structuralFeatures)
+ {
+ handleEClassifier(structuralFeature.getEType(), visited);
+ handleEGenericType(structuralFeature.getEGenericType(), visited);
+ }
}
}
protected void handleEOperations(List<EOperation> operations, Set<EClass> visited)
{
- for (EOperation operation : operations)
+ if (operations != null)
{
- handleEClassifier(operation.getEType(), visited);
- handleEGenericType(operation.getEGenericType(), visited);
- handleETypeParameters(operation.getETypeParameters(), visited);
- handleEParameters(operation.getEParameters(), visited);
- handleEClassifiers(operation.getEExceptions(), visited);
- handleEGenericTypes(operation.getEGenericExceptions(), visited);
+ for (EOperation operation : operations)
+ {
+ handleEClassifier(operation.getEType(), visited);
+ handleEGenericType(operation.getEGenericType(), visited);
+ handleETypeParameters(operation.getETypeParameters(), visited);
+ handleEParameters(operation.getEParameters(), visited);
+ handleEClassifiers(operation.getEExceptions(), visited);
+ handleEGenericTypes(operation.getEGenericExceptions(), visited);
+ }
}
}
protected void handleEParameters(List<EParameter> parameters, Set<EClass> visited)
{
- for (EParameter parameter : parameters)
+ if (parameters != null)
{
- handleEClassifier(parameter.getEType(), visited);
- handleEGenericType(parameter.getEGenericType(), visited);
+ for (EParameter parameter : parameters)
+ {
+ handleEClassifier(parameter.getEType(), visited);
+ handleEGenericType(parameter.getEGenericType(), visited);
+ }
}
}
protected void handleEGenericTypes(EList<EGenericType> genericTypes, Set<EClass> visited)
{
- for (EGenericType genericType : genericTypes)
+ if (genericTypes != null)
{
- handleEGenericType(genericType, visited);
+ for (EGenericType genericType : genericTypes)
+ {
+ handleEGenericType(genericType, visited);
+ }
}
}
protected void handleEGenericType(EGenericType genericType, Set<EClass> visited)
{
- handleEClassifier(genericType.getEClassifier(), visited);
- handleEClassifier(genericType.getERawType(), visited);
- handleEGenericType(genericType.getELowerBound(), visited);
- handleEGenericType(genericType.getEUpperBound(), visited);
- handleEGenericTypes(genericType.getETypeArguments(), visited);
- handleETypeParameter(genericType.getETypeParameter(), visited);
+ if (genericType != null)
+ {
+ handleEClassifier(genericType.getEClassifier(), visited);
+ handleEClassifier(genericType.getERawType(), visited);
+ handleEGenericType(genericType.getELowerBound(), visited);
+ handleEGenericType(genericType.getEUpperBound(), visited);
+ handleEGenericTypes(genericType.getETypeArguments(), visited);
+ handleETypeParameter(genericType.getETypeParameter(), visited);
+ }
}
protected void handleETypeParameters(EList<ETypeParameter> typeParameters, Set<EClass> visited)
{
- for (ETypeParameter typeParameter : typeParameters)
+ if (typeParameters != null)
{
- handleETypeParameter(typeParameter, visited);
+ for (ETypeParameter typeParameter : typeParameters)
+ {
+ handleETypeParameter(typeParameter, visited);
+ }
}
}
protected void handleETypeParameter(ETypeParameter typeParameter, Set<EClass> visited)
{
- handleEGenericTypes(typeParameter.getEBounds(), visited);
+ if (typeParameter != null)
+ {
+ handleEGenericTypes(typeParameter.getEBounds(), visited);
+ }
}
}

Back to the top