| /******************************************************************************* |
| * 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.eclipse.emf.ecore.util.EObjectResolvingEList; |
| import org.eclipse.jdt.annotation.NonNull; |
| import org.eclipse.ocl.pivot.Model; |
| import org.eclipse.ocl.pivot.Package; |
| import org.eclipse.ocl.pivot.PivotPackage; |
| import org.eclipse.ocl.pivot.internal.CompleteModelImpl; |
| import org.eclipse.ocl.pivot.internal.ModelImpl; |
| import org.eclipse.ocl.pivot.util.PivotPlugin; |
| import org.eclipse.ocl.pivot.utilities.TracingOption; |
| |
| import com.google.common.base.Function; |
| import com.google.common.collect.Iterables; |
| |
| public class PartialModels extends EObjectResolvingEList<Model> implements ModelListeners.IModelListener |
| { |
| public static final @NonNull TracingOption PARTIAL_MODELS = new TracingOption(PivotPlugin.PLUGIN_ID, "partialModels"); |
| // static { PARTIAL_ROOTS.setState(true); } |
| private static final long serialVersionUID = 1L; |
| |
| private static class Model2RootOwnedPackages implements Function<Model, Iterable<org.eclipse.ocl.pivot.Package>> |
| { |
| @Override |
| public Iterable<Package> apply(Model partialModel) { |
| return partialModel.getOwnedPackages(); |
| } |
| } |
| private static final @NonNull Model2RootOwnedPackages model2RootOwnedPackages = new Model2RootOwnedPackages(); |
| |
| |
| public PartialModels(@NonNull CompleteModelImpl owner) { |
| super(Model.class, owner, PivotPackage.COMPLETE_MODEL__PARTIAL_MODELS); |
| } |
| |
| @Override |
| public void addUnique(Model partialModel) { |
| assert partialModel != null; |
| super.addUnique(partialModel); |
| didAdd(partialModel); |
| } |
| |
| @Override |
| public void addUnique(int index, Model partialModel) { |
| assert partialModel != null; |
| super.addUnique(index, partialModel); |
| didAdd(partialModel); |
| } |
| |
| protected void didAdd(@NonNull Model partialModel) { |
| if (PARTIAL_MODELS.isActive()) { |
| PARTIAL_MODELS.println("Do-didAdd Model" + this + " " + partialModel); |
| } |
| CompleteModelInternal completeModel = getCompleteModel(); |
| completeModel.didAddPartialModel(partialModel); |
| for (org.eclipse.ocl.pivot.Package pivotPackage : partialModel.getOwnedPackages()) { |
| if (pivotPackage != null) { |
| completeModel.didAddNestedPackage(pivotPackage); |
| } |
| } |
| ((ModelImpl)partialModel).addRootListener(this); |
| } |
| |
| @Override |
| public void didAddPackage(org.eclipse.ocl.pivot.@NonNull Package partialPackage) { |
| getCompleteModel().didAddNestedPackage(partialPackage); |
| } |
| |
| @Override |
| protected void didRemove(int index, Model partialModel) { |
| assert partialModel != null; |
| if (PARTIAL_MODELS.isActive()) { |
| PARTIAL_MODELS.println("Do-didRemove Model " + this + " " + partialModel); |
| } |
| didRemove(partialModel); |
| } |
| |
| protected void didRemove(@NonNull Model partialModel) { |
| ((ModelImpl)partialModel).removeRootListener(this); |
| CompleteModelInternal completeModel = getCompleteModel(); |
| for (org.eclipse.ocl.pivot.Package pivotPackage : partialModel.getOwnedPackages()) { |
| if (pivotPackage != null) { |
| completeModel.didRemoveNestedPackage(pivotPackage); |
| } |
| } |
| completeModel.didRemovePartialModel(partialModel); |
| } |
| |
| @Override |
| public void didRemovePackage(org.eclipse.ocl.pivot.@NonNull Package partialPackage) { |
| getCompleteModel().didRemoveNestedPackage(partialPackage); |
| } |
| |
| @SuppressWarnings("null") |
| protected @NonNull CompleteModelInternal getCompleteModel() { |
| return (CompleteModelInternal)owner; |
| } |
| |
| protected @NonNull Iterable<org.eclipse.ocl.pivot.Package> getNestedPartialPackages() { |
| PartialModels partialModels = getCompleteModel().getPartialModels(); |
| Iterable<Iterable<org.eclipse.ocl.pivot.Package>> roots_packages = Iterables.transform(partialModels, model2RootOwnedPackages); |
| @SuppressWarnings("null")@NonNull Iterable<Package> allPackages = Iterables.concat(roots_packages); |
| return allPackages; |
| } |
| } |