/*******************************************************************************
* Copyright (c) 2011, 2015 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.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.CompleteInheritance;
import org.eclipse.ocl.pivot.Operation;
import org.eclipse.ocl.pivot.PivotFactory;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.TemplateParameter;
import org.eclipse.ocl.pivot.TemplateParameterSubstitution;
import org.eclipse.ocl.pivot.TemplateParameters;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.ids.OperationId;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.internal.executor.PivotReflectiveFragment;
import org.eclipse.ocl.pivot.internal.library.executor.ReflectiveInheritance;
import org.eclipse.ocl.pivot.types.AbstractFragment;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import com.google.common.base.Function;
/**
* An AbstractTypeServer provides the co-ordinated operation, property and superclass lookup caches for one or more merged types.
*/
public class CompleteInheritanceImpl extends ReflectiveInheritance implements CompleteInheritance
{
public static final @NonNull List<@NonNull CompleteInheritanceImpl> EMPTY_LIST = Collections.<@NonNull CompleteInheritanceImpl>emptyList();
public static final class BestOperation implements Function<List<Operation>, Operation> {
@Override
public Operation apply(List<Operation> operations) {
return operations.get(0);
}
}
public static final @NonNull BestOperation bestOperation = new BestOperation();
public static @NonNull TemplateParameterSubstitution createTemplateParameterSubstitution(@NonNull TemplateParameter formalParameter, @NonNull Type type) {
TemplateParameterSubstitution templateParameterSubstitution = PivotFactory.eINSTANCE.createTemplateParameterSubstitution();
templateParameterSubstitution.setFormal(formalParameter);
templateParameterSubstitution.setActual(type);
return templateParameterSubstitution;
}
protected final @NonNull CompleteClassInternal completeClass;
public CompleteInheritanceImpl(@NonNull CompleteClassInternal completeClass) {
super(ClassUtil.nonNullModel(completeClass.getName()), computeFlags(completeClass.getPrimaryClass()));
this.completeClass = completeClass;
// org.eclipse.ocl.pivot.Class pivotClass = completeClass.getPrimaryClass();
// assert !(pivotClass instanceof DataType) || (((DataType)pivotClass).getBehavioralClass() == null); // DataTypes must use the inheritance of their behavioral class
}
@Override
protected @NonNull AbstractFragment createFragment(@NonNull CompleteInheritance baseInheritance) {
return new PivotReflectiveFragment(this, baseInheritance);
}
public @NonNull CompleteClassInternal getCompleteClass() {
return completeClass;
}
@Override
public @NonNull Iterable<@NonNull ? extends CompleteInheritance> getInitialSuperInheritances() {
return isOclAny() ? EMPTY_LIST : completeClass.getPartialClasses().getInitialSuperInheritances();
}
public @NonNull List<? extends Operation> getLocalOperations() {
return ClassUtil.nonNullEMF(completeClass.getPrimaryClass().getOwnedOperations()); // FIXME Use local cache
}
public @NonNull List<? extends Property> getLocalProperties() {
return ClassUtil.nonNullEMF(completeClass.getPrimaryClass().getOwnedProperties()); // FIXME Use local cache
}
@Override
public @Nullable Operation getMemberOperation(@NonNull OperationId operationId) {
return completeClass.getOperation(operationId);
}
@Override
public @Nullable Property getMemberProperty(@NonNull String propertyName) {
return completeClass.getProperty(propertyName);
}
@Override
public @NonNull String getMetaTypeName() {
return completeClass.getPrimaryClass().getMetaTypeName();
}
@Override
public @NonNull List<Property> getOwnedProperties() {
return ClassUtil.nonNullEMF(completeClass.getPrimaryClass().getOwnedProperties()); // FIXME Use local cache
}
@Override
public @NonNull List<Operation> getOwnedOperations() {
return ClassUtil.nonNullEMF(completeClass.getPrimaryClass().getOwnedOperations()); // FIXME Use local cache
}
@Override
public org.eclipse.ocl.pivot.@NonNull Class getPivotClass() {
return getCompleteClass().getPrimaryClass();
}
@Override
public @NonNull List<org.eclipse.ocl.pivot.Class> getSuperClasses() {
List<org.eclipse.ocl.pivot.Class> superClasses = new ArrayList<org.eclipse.ocl.pivot.Class>();
for (org.eclipse.ocl.pivot.Class superClass : completeClass.getProperSuperClasses()) {
superClasses.add(superClass);
}
return superClasses;
}
@Override
public final @NonNull TypeId getTypeId() {
return completeClass.getPrimaryClass().getTypeId();
}
@Override
public @NonNull TemplateParameters getTypeParameters() {
return TemplateParameters.EMPTY_LIST;
}
@Override
public String toString() {
return completeClass.getPrimaryClass().toString();
}
@Override
public void uninstall() {
// System.out.println("uninstall " + toString());
completeClass.uninstall();
super.uninstall();
}
}