Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/LinearPackageHull.java')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/LinearPackageHull.java174
1 files changed, 174 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/LinearPackageHull.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/LinearPackageHull.java
new file mode 100644
index 0000000000..1477406267
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/LinearPackageHull.java
@@ -0,0 +1,174 @@
+/***************************************************************************
+ * 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.cdo.internal.protocol.bundle.CDOProtocol;
+
+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.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.CDO;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Eike Stepper
+ */
+public final class LinearPackageHull
+{
+ private static final ContextTracer TRACER = new ContextTracer(CDOProtocol.DEBUG_MODEL, LinearPackageHull.class);
+
+ private LinearPackageHull()
+ {
+ }
+
+ public static Set<EPackage> calculate(Collection<EPackage> ePackages)
+ {
+ // Optimize no packages
+ if (ePackages.isEmpty())
+ {
+ return Collections.EMPTY_SET;
+ }
+
+ // Optimize 1 package
+ if (ePackages.size() == 1)
+ {
+ return LinearPackageHull.calculate(ePackages.iterator().next());
+ }
+
+ // Handle >1 packages
+ Set<EPackage> result = new HashSet();
+ for (EPackage ePackage : ePackages)
+ {
+ Set<EPackage> packages = LinearPackageHull.calculate(ePackage);
+ result.addAll(packages);
+ }
+
+ return result;
+ }
+
+ /**
+ * TODO Handle Ecore generics
+ */
+ public static Set<EPackage> calculate(EPackage ePackage)
+ {
+ if (TRACER.isEnabled())
+ {
+ TRACER.trace("Linear package hull for " + ePackage.getNsURI());
+ }
+
+ Set<EClass> visited = new HashSet();
+
+ List<EClassifier> classifiers = ePackage.getEClassifiers();
+ for (EClassifier classifier : classifiers)
+ {
+ handleEClassifier(classifier, visited);
+ }
+
+ Set<EPackage> result = new HashSet();
+ for (EClass eClass : visited)
+ {
+ final EPackage p = eClass.getEPackage();
+ if (p != null)
+ {
+ if (result.add(p))
+ {
+ if (TRACER.isEnabled())
+ {
+ TRACER.trace("Found package " + p.getNsURI());
+ }
+ }
+ }
+ else
+ {
+ String msg = "Package == null for " + eClass.getName();
+ CDO.LOG.warn(msg);
+ if (TRACER.isEnabled())
+ {
+ TRACER.trace(msg);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private static 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 static void handleEStructuralFeatures(List<EStructuralFeature> structuralFeatures, Set<EClass> visited)
+ {
+ for (EStructuralFeature structuralFeature : structuralFeatures)
+ {
+ handleEClassifier(structuralFeature.getEType(), visited);
+ }
+ }
+
+ private static 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 static void handleEParameters(List<EParameter> parameters, Set<EClass> visited)
+ {
+ for (EParameter parameter : parameters)
+ {
+ handleEClassifier(parameter.getEType(), visited);
+ }
+ }
+
+ private static void handleEExceptions(List<EClassifier> exceptions, Set<EClass> visited)
+ {
+ for (EClassifier exception : exceptions)
+ {
+ handleEClassifier(exception, visited);
+ }
+ }
+
+ private static void handleESuperTypes(List<EClass> superTypes, Set<EClass> visited)
+ {
+ for (EClass superType : superTypes)
+ {
+ handleEClassifier(superType, visited);
+ }
+ }
+
+}

Back to the top