/******************************************************************************* * 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 org.apache.log4j.Logger; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.ocl.pivot.CompletePackage; import org.eclipse.ocl.pivot.Model; import org.eclipse.ocl.pivot.PivotFactory; import org.eclipse.ocl.pivot.PivotPackage; import org.eclipse.ocl.pivot.internal.CompleteModelImpl; import org.eclipse.ocl.pivot.internal.manager.Orphanage; public class RootCompletePackages extends AbstractCompletePackages { private static final Logger logger = Logger.getLogger(RootCompletePackages.class); private static final long serialVersionUID = 1L; public RootCompletePackages(@NonNull CompleteModelImpl owner) { super(CompletePackage.class, owner, PivotPackage.COMPLETE_MODEL__OWNED_COMPLETE_PACKAGES, PivotPackage.COMPLETE_PACKAGE__OWNING_COMPLETE_MODEL); } @Override public @NonNull CompletePackageInternal createCompletePackage(org.eclipse.ocl.pivot.@NonNull Package partialPackage) { CompletePackageInternal completePackage = (CompletePackageInternal) PivotFactory.eINSTANCE.createCompletePackage(); completePackage.init(partialPackage.getName(), partialPackage.getNsPrefix(), partialPackage.getURI()); return completePackage; } protected @NonNull CompletePackageInternal createRootCompletePackage(org.eclipse.ocl.pivot.@NonNull Package pivotPackage) { if (Orphanage.isTypeOrphanage(pivotPackage)) { return getCompleteModel().getOrphanCompletePackage(); } else { String name = pivotPackage.getName(); String nonNullName = name; if (nonNullName == null) { nonNullName = "$anon_" + Integer.toHexString(System.identityHashCode(pivotPackage)); } String nsPrefix = pivotPackage.getNsPrefix(); String completeURI = getCompleteModel().getCompleteURIs().getCompleteURI(pivotPackage.getURI()); CompletePackageInternal rootCompletePackage = (CompletePackageInternal) PivotFactory.eINSTANCE.createCompletePackage(); rootCompletePackage.init(nonNullName, nsPrefix, completeURI); add(rootCompletePackage); return rootCompletePackage; } } @Override protected void didAdd(@NonNull CompletePackage rootCompletePackage) { super.didAdd(rootCompletePackage); // String nsURI = rootCompletePackage.getURI(); // FIXME complete/package/URI/name // String sharedNsURI = getCompleteURI(nsURI); // if ((sharedNsURI != null) && (sharedNsURI == nsURI)) { // name2completePackage.put(nsURI, rootCompletePackage); // } } @Override protected void didRemove(int index, CompletePackage rootCompletePackage) { assert rootCompletePackage != null; super.didRemove(index, rootCompletePackage); // getCompleteModel().didRemoveCompletePackage(rootCompletePackage); } @Override @SuppressWarnings("null") public @NonNull CompleteModelInternal getCompleteModel() { return (CompleteModelInternal)owner; } @Override public @NonNull CompletePackageInternal getOwnedCompletePackage(org.eclipse.ocl.pivot.@NonNull Package pivotPackage) { // // Try to find package by packageURI // CompletePackageInternal completePackage = getCompleteModel().getCompleteURIs().getCompletePackage(pivotPackage); if (completePackage != null) { return completePackage; } // // Else generate an error for a name-less Package, fatally if also packageURI-less. // String packageURI = pivotPackage.getURI(); String name = pivotPackage.getName(); if (name == null) { String message = null; for (EObject eObject = pivotPackage; eObject != null; eObject = eObject.eContainer()) { if (eObject instanceof Model) { message = "Unnamed package for '" + packageURI + "' in '" + ((Model)eObject).getExternalURI() + "'"; break; } } if (message == null) { message = "Unnamed package for '" + packageURI + "'"; } logger.error(message); name = packageURI; if (name == null) { throw new IllegalStateException(message); } } // // Try to find package by name, provided there is no packageURI conflict // CompletePackageInternal rootCompletePackage = getOwnedCompletePackage(name); if (rootCompletePackage != null) { String completeURI2 = rootCompletePackage.getURI(); if ((packageURI == null) || (completeURI2 == null) || packageURI.equals(completeURI2)) { return rootCompletePackage; } } rootCompletePackage = createRootCompletePackage(pivotPackage); return rootCompletePackage; } @Override protected @NonNull Iterable<org.eclipse.ocl.pivot.Package> getPartialPackages() { return getCompleteModel().getPartialModels().getNestedPartialPackages(); } }