diff options
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java | 35 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java | 166 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java (renamed from plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/EMFPackageClosure.java) | 8 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/InstancePackageClosure.java | 166 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PackageClosure.java | 3 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/TraversingPackageClosure.java | 136 |
6 files changed, 363 insertions, 151 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 03fb795b15..4728355da5 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 @@ -23,11 +23,11 @@ import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.model.CDOPackage; import org.eclipse.emf.cdo.protocol.util.TransportException; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; 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.EMFPackageClosure; import org.eclipse.emf.internal.cdo.util.ModelUtil; import org.eclipse.net4j.IChannel; @@ -283,32 +283,45 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction private List<CDOPackage> analyzeNewPackages(CDOSessionImpl session) { - Set<EPackage> ePackages = new HashSet<EPackage>(); + // Find all used classes and their super classes + Set<EClass> usedClasses = new HashSet<EClass>(); for (CDOObject object : newObjects.values()) { - ePackages.add(object.eClass().getEPackage()); + EClass usedClass = object.eClass(); + if (usedClasses.add(usedClass)) + { + for (EClass superType : usedClass.getEAllSuperTypes()) + { + usedClasses.add(superType); + } + } } - // Find all indirectly referenced EPackages as well - ePackages = new EMFPackageClosure().calculate(ePackages); + // Calculate the packages of the used classes + Set<EPackage> usedPackages = new HashSet<EPackage>(); + for (EClass usedClass : usedClasses) + { + usedPackages.add(usedClass.getEPackage()); + } + // Determine which of the used packages are new CDOSessionPackageManager packageManager = session.getPackageManager(); - List<CDOPackage> cdoPackages = new ArrayList<CDOPackage>(); - for (EPackage ePackage : ePackages) + List<CDOPackage> newPackages = new ArrayList<CDOPackage>(); + for (EPackage usedPackage : usedPackages) { - CDOPackageImpl cdoPackage = ModelUtil.getCDOPackage(ePackage, packageManager); + CDOPackageImpl cdoPackage = ModelUtil.getCDOPackage(usedPackage, packageManager); if (cdoPackage == null) { - throw new IllegalStateException("Missing CDO package: " + ePackage.getNsURI()); + throw new IllegalStateException("Missing CDO package: " + usedPackage.getNsURI()); } if (!cdoPackage.isPersistent() && !cdoPackage.isSystem()) { - cdoPackages.add(cdoPackage); + newPackages.add(cdoPackage); } } - return cdoPackages; + return newPackages; } @SuppressWarnings("unchecked") 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 new file mode 100644 index 0000000000..419863e718 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CompletePackageClosure.java @@ -0,0 +1,166 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.emf.internal.cdo.util; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EGenericType; +import org.eclipse.emf.ecore.EOperation; +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.internal.cdo.bundle.OM; + +import org.eclipse.net4j.internal.util.om.trace.ContextTracer; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Eike Stepper + */ +public class CompletePackageClosure extends PackageClosure +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_MODEL, CompletePackageClosure.class); + + public CompletePackageClosure() + { + } + + @Override + protected void collectContents(EPackage ePackage, Set<EPackage> visited) + { + Set<EClass> classes = new HashSet<EClass>(); + List<EClassifier> classifiers = ePackage.getEClassifiers(); + for (EClassifier classifier : classifiers) + { + handleEClassifier(classifier, classes); + } + + for (EClass eClass : classes) + { + final EPackage p = eClass.getEPackage(); + if (p != null) + { + if (visited.add(p)) + { + if (TRACER.isEnabled()) TRACER.trace("Found package " + p.getNsURI()); + } + } + else + { + OM.LOG.warn("Package == null for " + eClass.getName()); + } + } + } + + protected void handleEClassifiers(List<EClassifier> classifiers, Set<EClass> visited) + { + for (EClassifier classifier : classifiers) + { + handleEClassifier(classifier, visited); + } + } + + protected void handleEClassifier(EClassifier classifier, Set<EClass> visited) + { + if (classifier instanceof EClass) + { + handleEClass((EClass)classifier, visited); + } + } + + protected void handleEClasses(List<EClass> classes, Set<EClass> visited) + { + for (EClass eClass : classes) + { + handleEClass(eClass, visited); + } + } + + protected void handleEClass(EClass eClass, Set<EClass> visited) + { + if (visited.add(eClass)) + { + 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); + } + } + + protected void handleEStructuralFeatures(List<EStructuralFeature> structuralFeatures, Set<EClass> 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) + { + 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) + { + handleEClassifier(parameter.getEType(), visited); + handleEGenericType(parameter.getEGenericType(), visited); + } + } + + protected void handleEGenericTypes(EList<EGenericType> genericTypes, Set<EClass> 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); + } + + protected void handleETypeParameters(EList<ETypeParameter> typeParameters, Set<EClass> visited) + { + for (ETypeParameter typeParameter : typeParameters) + { + handleETypeParameter(typeParameter, visited); + } + } + + protected void handleETypeParameter(ETypeParameter typeParameter, Set<EClass> visited) + { + handleEGenericTypes(typeParameter.getEBounds(), visited); + } +} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/EMFPackageClosure.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java index b823c2adcb..b56dbeaab8 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/EMFPackageClosure.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java @@ -10,6 +10,7 @@ **************************************************************************/ package org.eclipse.emf.internal.cdo.util; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; @@ -20,9 +21,9 @@ import java.util.Set; /** * @author Eike Stepper */ -public class EMFPackageClosure extends PackageClosure +public class CrossReferencesPackageClosure extends PackageClosure { - public EMFPackageClosure() + public CrossReferencesPackageClosure() { } @@ -45,7 +46,8 @@ public class EMFPackageClosure extends PackageClosure protected void collectCrossReferences(EObject content, Set<EPackage> visited) { - for (EObject crossReference : content.eCrossReferences()) + EList<EObject> crossReferences = content.eCrossReferences(); + for (EObject crossReference : crossReferences) { EPackage crossReferencePackage = crossReference.eClass().getEPackage(); if (!visited.contains(crossReferencePackage)) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/InstancePackageClosure.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/InstancePackageClosure.java new file mode 100644 index 0000000000..b4297edf6f --- /dev/null +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/InstancePackageClosure.java @@ -0,0 +1,166 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.emf.internal.cdo.util; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EGenericType; +import org.eclipse.emf.ecore.EOperation; +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.internal.cdo.bundle.OM; + +import org.eclipse.net4j.internal.util.om.trace.ContextTracer; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Eike Stepper + */ +public class InstancePackageClosure extends PackageClosure +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_MODEL, InstancePackageClosure.class); + + public InstancePackageClosure() + { + } + + @Override + protected void collectContents(EPackage ePackage, Set<EPackage> visited) + { + Set<EClass> classes = new HashSet<EClass>(); + List<EClassifier> classifiers = ePackage.getEClassifiers(); + for (EClassifier classifier : classifiers) + { + handleEClassifier(classifier, classes); + } + + for (EClass eClass : classes) + { + final EPackage p = eClass.getEPackage(); + if (p != null) + { + if (visited.add(p)) + { + if (TRACER.isEnabled()) TRACER.trace("Found package " + p.getNsURI()); + } + } + else + { + OM.LOG.warn("Package == null for " + eClass.getName()); + } + } + } + + protected void handleEClassifiers(List<EClassifier> classifiers, Set<EClass> visited) + { + for (EClassifier classifier : classifiers) + { + handleEClassifier(classifier, visited); + } + } + + protected void handleEClassifier(EClassifier classifier, Set<EClass> visited) + { + if (classifier instanceof EClass) + { + handleEClass((EClass)classifier, visited); + } + } + + protected void handleEClasses(List<EClass> classes, Set<EClass> visited) + { + for (EClass eClass : classes) + { + handleEClass(eClass, visited); + } + } + + protected void handleEClass(EClass eClass, Set<EClass> visited) + { + if (visited.add(eClass)) + { + 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); + } + } + + protected void handleEStructuralFeatures(List<EStructuralFeature> structuralFeatures, Set<EClass> 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) + { + 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) + { + handleEClassifier(parameter.getEType(), visited); + handleEGenericType(parameter.getEGenericType(), visited); + } + } + + protected void handleEGenericTypes(EList<EGenericType> genericTypes, Set<EClass> 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); + } + + protected void handleETypeParameters(EList<ETypeParameter> typeParameters, Set<EClass> visited) + { + for (ETypeParameter typeParameter : typeParameters) + { + handleETypeParameter(typeParameter, visited); + } + } + + protected void handleETypeParameter(ETypeParameter typeParameter, Set<EClass> visited) + { + handleEGenericTypes(typeParameter.getEBounds(), visited); + } +} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PackageClosure.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PackageClosure.java index 6d62b1ba0f..cc23ddfe0d 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PackageClosure.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PackageClosure.java @@ -41,7 +41,8 @@ public abstract class PackageClosure implements IPackageClosure // Optimize 1 package if (ePackages.size() == 1) { - return calculate(ePackages.iterator().next()); + EPackage ePackage = ePackages.iterator().next(); + return calculate(ePackage); } // Handle >1 packages diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/TraversingPackageClosure.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/TraversingPackageClosure.java deleted file mode 100644 index 5550ca8fee..0000000000 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/TraversingPackageClosure.java +++ /dev/null @@ -1,136 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004 - 2007 Eike Stepper, Germany. - * 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: - * Eike Stepper - initial API and implementation - **************************************************************************/ -package org.eclipse.emf.internal.cdo.util; - -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EClassifier; -import org.eclipse.emf.ecore.EOperation; -import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.EParameter; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.internal.cdo.bundle.OM; - -import org.eclipse.net4j.internal.util.om.trace.ContextTracer; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * TODO Handle generic types and type parameters - * - * @author Eike Stepper - */ -@Deprecated -public class TraversingPackageClosure extends PackageClosure -{ - private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_MODEL, TraversingPackageClosure.class); - - public TraversingPackageClosure() - { - } - - @Override - protected void collectContents(EPackage ePackage, Set<EPackage> visited) - { - Set<EClass> classes = new HashSet<EClass>(); - List<EClassifier> classifiers = ePackage.getEClassifiers(); - for (EClassifier classifier : classifiers) - { - handleEClassifier(classifier, classes); - } - - for (EClass eClass : classes) - { - final EPackage p = eClass.getEPackage(); - if (p != null) - { - if (visited.add(p)) - { - if (TRACER.isEnabled()) - { - TRACER.trace("Found package " + p.getNsURI()); - } - } - } - else - { - String msg = "Package == null for " + eClass.getName(); - OM.LOG.warn(msg); - if (TRACER.isEnabled()) - { - TRACER.trace(msg); - } - } - } - } - - private void handleEClassifier(EClassifier classifier, Set<EClass> visited) - { - if (classifier instanceof EClass) - { - EClass eClass = (EClass)classifier; - if (visited.add(eClass)) - { - if (TRACER.isEnabled()) - { - TRACER.trace("Found class " + eClass.getName()); - } - - handleEStructuralFeatures(eClass.getEStructuralFeatures(), visited); - handleEOperations(eClass.getEOperations(), visited); - handleESuperTypes(eClass.getESuperTypes(), visited); - } - } - } - - private void handleEStructuralFeatures(List<EStructuralFeature> structuralFeatures, Set<EClass> visited) - { - for (EStructuralFeature structuralFeature : structuralFeatures) - { - handleEClassifier(structuralFeature.getEType(), visited); - } - } - - private void handleEOperations(List<EOperation> operations, Set<EClass> visited) - { - for (EOperation operation : operations) - { - handleEClassifier(operation.getEType(), visited); - handleEParameters(operation.getEParameters(), visited); - handleEExceptions(operation.getEExceptions(), visited); - } - } - - private void handleEParameters(List<EParameter> parameters, Set<EClass> visited) - { - for (EParameter parameter : parameters) - { - handleEClassifier(parameter.getEType(), visited); - } - } - - private void handleEExceptions(List<EClassifier> exceptions, Set<EClass> visited) - { - for (EClassifier exception : exceptions) - { - handleEClassifier(exception, visited); - } - } - - private void handleESuperTypes(List<EClass> superTypes, Set<EClass> visited) - { - for (EClass superType : superTypes) - { - handleEClassifier(superType, visited); - } - } -} |