blob: 506443d74638a9962d4e5f4e21469f4f750cc908 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}