/******************************************************************************* * Copyright (c) 2014 Willink Transformations and others. * 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: * E.D.Willink - initial API and implementation *******************************************************************************/ package org.eclipse.ocl.pivot.internal.complete; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.CompletePackage; import org.eclipse.ocl.pivot.Package; import org.eclipse.ocl.pivot.internal.NamedElementImpl; import org.eclipse.ocl.pivot.util.PivotPlugin; import org.eclipse.ocl.pivot.utilities.TracingOption; public abstract class AbstractCompletePackages extends EObjectContainmentWithInverseEList<CompletePackage> { public static final @NonNull TracingOption COMPLETE_PACKAGES = new TracingOption(PivotPlugin.PLUGIN_ID, "completePackages"); // static { COMPLETE_PACKAGES.setState(true); } private static final long serialVersionUID = 1L; /** * Map of (nested) package-name to package server. */ private final @NonNull Map<@NonNull String, @Nullable CompletePackageInternal> name2completePackage = new HashMap<@NonNull String, @Nullable CompletePackageInternal>(); public AbstractCompletePackages(Class<?> dataClass, @NonNull NamedElementImpl owner, int featureID, int inverseFeatureID) { super(dataClass, owner, featureID, inverseFeatureID); if (COMPLETE_PACKAGES.isActive()) { COMPLETE_PACKAGES.println("Create " + this); } } @Override public void addUnique(CompletePackage completePackage) { assert completePackage != null; super.addUnique(completePackage); didAdd(completePackage); } @Override public void addUnique(int index, CompletePackage completePackage) { assert completePackage != null; super.addUnique(index, completePackage); didAdd(completePackage); } public abstract @NonNull CompletePackageInternal createCompletePackage(org.eclipse.ocl.pivot.@NonNull Package partialPackage); protected void didAdd(@NonNull CompletePackage completePackage) { CompletePackageInternal completePackageInternal = (CompletePackageInternal)completePackage; String name = completePackageInternal.getName(); if (name != null) { if (!name2completePackage.containsKey(name)) { CompletePackage oldCompletePackage = name2completePackage.put(name, completePackageInternal); // New name assert oldCompletePackage == null; } else { name2completePackage.put(name, null); // Ambiguous name } } getCompleteModel().didAddCompletePackage(completePackageInternal); } public void didAddPackage(org.eclipse.ocl.pivot.@NonNull Package pivotPackage) { CompletePackage completePackage = null; String name = pivotPackage.getName(); String packageURI = pivotPackage.getURI(); if (packageURI != null) { // Explicit packageURI for explicit package (merge) completePackage = getCompleteModel().getCompleteURIs().getCompletePackage(packageURI); } else if (name != null) { // Null packageURI can merge into same named package completePackage = getOwnedCompletePackage(name); } if (completePackage == null) { completePackage = getOwnedCompletePackage(pivotPackage); completePackage.assertSamePackage(pivotPackage); } completePackage.getPartialPackages().add(pivotPackage); // completePackage.addTrackedPackage(pivotPackage); // for (org.eclipse.ocl.pivot.Package nestedPackage : pivotPackage.getOwnedPackages()) { // if (nestedPackage != null) { // addPackage(completePackage, nestedPackage); // } // } } @Override protected void didRemove(int index, CompletePackage completePackage) { assert completePackage != null; CompletePackageInternal completePackageInternal = (CompletePackageInternal)completePackage; super.didRemove(index, completePackageInternal); name2completePackage.remove(completePackageInternal.getName()); getCompleteModel().didRemoveCompletePackage(completePackageInternal); } public void didRemovePackage(org.eclipse.ocl.pivot.@NonNull Package partialPackage) { CompletePackage completePackage = getCompletePackage(partialPackage); List<Package> partialPackages = completePackage.getPartialPackages(); partialPackages.remove(partialPackage); if (partialPackages.size() <= 0) { getCompleteModel().getCompleteURIs().removeCompletePackage(completePackage.getURI()); // name2completePackage.remove(completePackage.getName()); remove(completePackage); } } public synchronized void dispose() { Collection<CompletePackageInternal> savedCompletePackages = name2completePackage.values(); name2completePackage.clear(); for (CompletePackageInternal completePackage : savedCompletePackages) { completePackage.dispose(); } } protected abstract CompleteModelInternal getCompleteModel(); public @NonNull CompletePackageInternal getCompletePackage(org.eclipse.ocl.pivot.@NonNull Package pivotPackage) { CompletePackageInternal completePackage = null; if (pivotPackage instanceof CompletePackageInternal) { ((CompletePackageInternal)pivotPackage).assertSamePackage(pivotPackage); completePackage = (CompletePackageInternal)pivotPackage; } else { CompleteURIs completeURIs = getCompleteModel().getCompleteURIs(); completePackage = completeURIs.getCompletePackage(pivotPackage); if (completePackage == null) { org.eclipse.ocl.pivot.Package pivotPackageParent = pivotPackage.getOwningPackage(); if (pivotPackageParent == null) { completePackage = getOwnedCompletePackage(pivotPackage); completePackage.getPartialPackages().add(pivotPackage); // completePackage.addTrackedPackage(pivotPackage); completePackage.assertSamePackage(pivotPackage); } else { CompletePackageInternal completeParentPackage = getCompletePackage(pivotPackageParent); CompletePackageInternal completeChildPackage = completeParentPackage.getOwnedCompletePackage(pivotPackage.getName()); assert completeChildPackage != null; return completeChildPackage; // CompletePackageParent completePackageParent; /* PackageTracker parentTracker = getPackageTracker(pivotPackageParent); completePackageParent = parentTracker.getPackageServer(); ((PackageServer)completePackageParent).assertSamePackage(pivotPackageParent); */ // completePackage = completePackageParent.getMemberPackageServer(pivotPackage); // completePackage.addTrackedPackage(pivotPackage); // completePackage.assertSamePackage(pivotPackage); } } } completePackage.assertSamePackage(pivotPackage); return completePackage; } public @Nullable CompletePackageInternal getOwnedCompletePackage(@Nullable String name) { return name2completePackage.get(name); } protected abstract @NonNull CompletePackageInternal getOwnedCompletePackage(org.eclipse.ocl.pivot.@NonNull Package pivotPackage); protected abstract @NonNull Iterable<org.eclipse.ocl.pivot.Package> getPartialPackages(); @Override public String toString() { return getClass().getSimpleName() + ": " + owner.toString(); } }