diff options
author | Eike Stepper | 2008-08-25 08:21:47 +0000 |
---|---|---|
committer | Eike Stepper | 2008-08-25 08:21:47 +0000 |
commit | 6a922afc3d5f14d79a66486d068774f5242dd71f (patch) | |
tree | e0e07075988244e9e31834a2cf695573ccb41b25 | |
parent | 428dc2015e0073f2a57a32aa2e93e664656d9d80 (diff) | |
download | cdo-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
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); + } } } |