/******************************************************************************* * 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.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.CompletePackage; import org.eclipse.ocl.pivot.Model; import org.eclipse.ocl.pivot.ids.IdManager; import org.eclipse.ocl.pivot.ids.PackageId; import org.eclipse.ocl.pivot.internal.utilities.IllegalMetamodelException; import org.eclipse.ocl.pivot.utilities.PivotConstants; public class CompleteURIs { protected final @NonNull CompleteModelInternal completeModel; /** * Map of Complete URI to Package URIs */ private final @NonNull Map<String, Set<String>> completeURI2packageURIs = new HashMap<String, Set<String>>(); /** * Map of Package URI to Complete URI. */ private final @NonNull Map<String, String> packageURI2completeURI = new HashMap<String, String>(); /** * Map from Complete URI to Complete Package. */ private final @NonNull Map<String, @NonNull CompletePackageInternal> completeURI2completePackage = new HashMap<String, @NonNull CompletePackageInternal>(); public CompleteURIs(@NonNull CompleteModelInternal completeModel) { this.completeModel = completeModel; } public void didAddCompletePackage(@NonNull CompletePackageInternal completePackage) { // if ((completePackage != completeModel.getOrphanCompletePackage()) && (completePackage != completeModel.getPrimitiveCompletePackage())) { String completeURI = completePackage.getURI(); if (completeURI != null) { CompletePackage oldCompletePackage = completeURI2completePackage.put(completeURI, completePackage); assert oldCompletePackage == null; } // } } public void didAddPartialModel(@NonNull Model partialModel) { for (org.eclipse.ocl.pivot.Package asPackage : partialModel.getOwnedPackages()) { String packageURI = asPackage.getURI(); String completeURI = getCompleteURI(packageURI); if (completeURI == packageURI) { PackageId packageId = asPackage.getPackageId(); if (packageId == IdManager.METAMODEL) { if (packageURI != null) { addPackageURI2completeURI(packageURI, PivotConstants.METAMODEL_NAME); } } } } } public void didRemoveCompletePackage(@NonNull CompletePackageInternal completePackage) { // if ((completePackage != completeModel.getOrphanCompletePackage()) && (completePackage != completeModel.getPrimitiveCompletePackage())) { String completeURI = completePackage.getURI(); if (completeURI != null) { completeURI2completePackage.remove(completeURI); Set<String> packageURIs = completeURI2packageURIs.remove(completeURI); if (packageURIs != null) { for (String packageURI : packageURIs) { packageURI2completeURI.remove(packageURI); } } } // } } public void didRemovePartialModel(@NonNull Model partialModel) { for (org.eclipse.ocl.pivot.Package asPackage : partialModel.getOwnedPackages()) { String packageURI = asPackage.getURI(); String completeURI = getCompleteURI(packageURI); if (completeURI == packageURI) { PackageId packageId = asPackage.getPackageId(); if (packageId == IdManager.METAMODEL) { if (packageURI != null) { //FIXME removePackageURI2completeURI(packageURI, DomainConstants.METAMODEL_NAME); } } } } } public synchronized void dispose() { completeURI2completePackage.clear(); } public @NonNull Iterable<@NonNull CompletePackageInternal> getAllCompletePackages() { return completeURI2completePackage.values(); } public @NonNull Iterable<? extends CompletePackageInternal> getAllCompletePackagesWithUris() { return completeURI2completePackage.values(); } /** * Partial models such as the OCL Standard Library have their own distinct package URI. These partial * models are merged by mapping the package URI to a complete URI. DomainConstants.METAMODEL_NAME is the * complete URI for all contributions merged as the overall OCL metamodel. */ public void addPackageURI2completeURI(@NonNull String packageURI, @NonNull String newCompleteURI) { String oldCompleteURI = packageURI2completeURI.get(packageURI); if (newCompleteURI.equals(oldCompleteURI)) { return; } if (oldCompleteURI != null) { throw new IllegalMetamodelException(newCompleteURI, oldCompleteURI); // FIXME Better name } if (completeURI2packageURIs.containsKey(packageURI)) { throw new IllegalMetamodelException(packageURI, oldCompleteURI); // FIXME Better name } packageURI2completeURI.put(packageURI, newCompleteURI); Set<String> packageURIs = completeURI2packageURIs.get(newCompleteURI); if (packageURIs == null) { packageURIs = new HashSet<String>(); completeURI2packageURIs.put(newCompleteURI, packageURIs); } packageURIs.add(packageURI); } public @Nullable CompletePackageInternal getCompletePackage(org.eclipse.ocl.pivot.@NonNull Package pivotPackage) { String packageURI = pivotPackage.getURI(); if (packageURI == null) { return null; } String completeURI = getCompleteURI(packageURI); return completeURI != null ? completeURI2completePackage.get(completeURI) : null; } public @Nullable CompletePackageInternal getCompletePackage(@Nullable String completeURI) { return completeURI != null ? completeURI2completePackage.get(completeURI) : null; } public @Nullable CompletePackageInternal getCompletePackageByURI(@NonNull String packageURI) { int lastIndex = packageURI.lastIndexOf("#/"); if (lastIndex > 0) { @NonNull String substring = packageURI.substring(0, lastIndex); packageURI = substring; } String completeURI = getCompleteURI(packageURI); return completeURI2completePackage.get(completeURI); } public @Nullable String getCompleteURI(@Nullable String packageURI) { String completeURI = packageURI2completeURI.get(packageURI); if (completeURI != null) { return completeURI; } else { return packageURI; } } public void removeCompletePackage(String completeURI) { completeURI2completePackage.remove(completeURI); } }