/******************************************************************************* * 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.library.executor; import java.util.Iterator; 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.Constraint; import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.StandardLibrary; import org.eclipse.ocl.pivot.TemplateParameters; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.ids.IdResolver; import org.eclipse.ocl.pivot.ids.OperationId; import org.eclipse.ocl.pivot.ids.TypeId; import org.eclipse.ocl.pivot.types.AbstractFragment; import org.eclipse.ocl.pivot.utilities.ClassUtil; public class DomainReflectiveType extends AbstractReflectiveInheritanceType { protected final @NonNull DomainReflectivePackage evaluationPackage; protected final org.eclipse.ocl.pivot.@NonNull Class domainClass; private /*@LazyNonNull*/ DomainProperties allProperties; public DomainReflectiveType(@NonNull DomainReflectivePackage evaluationPackage, org.eclipse.ocl.pivot.@NonNull Class domainClass) { super(ClassUtil.nonNullModel(domainClass.getName()), computeFlags(domainClass)); this.evaluationPackage = evaluationPackage; this.domainClass = domainClass; } @Override protected @NonNull AbstractFragment createFragment(@NonNull CompleteInheritance baseInheritance) { return new DomainReflectiveFragment(this, baseInheritance); } @Override public @NonNull Type getCommonType(@NonNull IdResolver idResolver, @NonNull Type type) { if (this == type) { return this.getPivotClass(); } CompleteInheritance firstInheritance = this; CompleteInheritance secondInheritance = type.getInheritance(idResolver.getStandardLibrary()); CompleteInheritance commonInheritance = firstInheritance.getCommonInheritance(secondInheritance); return commonInheritance.getPivotClass(); } @Override public @NonNull Iterable<@NonNull ? extends CompleteInheritance> getInitialSuperInheritances() { Iterable<? extends org.eclipse.ocl.pivot.@NonNull Class> superClasses = ClassUtil.nullFree(domainClass.getSuperClasses()); final Iterator<? extends org.eclipse.ocl.pivot.@NonNull Class> iterator = superClasses.iterator(); return new Iterable<@NonNull CompleteInheritance>() { @Override public Iterator<@NonNull CompleteInheritance> iterator() { return new Iterator<@NonNull CompleteInheritance>() { private @NonNull StandardLibrary standardLibrary = evaluationPackage.getStandardLibrary(); private boolean gotOne = false; @Override public boolean hasNext() { return !gotOne || iterator.hasNext(); } @Override public @NonNull CompleteInheritance next() { org.eclipse.ocl.pivot.Class next = null; if (!gotOne) { gotOne = true; if (!iterator.hasNext()) { next = standardLibrary.getOclAnyType(); } } if (next == null) { next = ClassUtil.nonNull(iterator.next()); } return next.getInheritance(standardLibrary); } @Override public void remove() { throw new UnsupportedOperationException(); } }; } }; } @Override public @NonNull List<org.eclipse.ocl.pivot.Class> getSuperClasses() { return domainClass.getSuperClasses(); } @Override public @Nullable Operation getMemberOperation(@NonNull OperationId operationId) { throw new UnsupportedOperationException(); // FIXME } @Override public @Nullable Property getMemberProperty(@NonNull String name) { DomainProperties allProperties2 = allProperties; if (allProperties2 == null) { allProperties = allProperties2 = new DomainProperties(this); } return allProperties2.getMemberProperty(name); } @Override public @NonNull String getMetaTypeName() { return domainClass.getMetaTypeName(); } @Override public @NonNull List<Constraint> getOwnedInvariants() { return domainClass.getOwnedInvariants(); } @Override public @NonNull List<Operation> getOwnedOperations() { return domainClass.getOwnedOperations(); } @Override public @NonNull List<Property> getOwnedProperties() { return domainClass.getOwnedProperties(); } @Override public @NonNull List<Constraint> getOwnedConstraints() { throw new UnsupportedOperationException(); // FIXME } @Override public org.eclipse.ocl.pivot.@NonNull Package getOwningPackage() { return evaluationPackage; } @Override public org.eclipse.ocl.pivot.@NonNull Class getPivotClass() { return domainClass; } @Override public @NonNull TypeId getTypeId() { return domainClass.getTypeId(); } @Override public @NonNull TemplateParameters getTypeParameters() { return domainClass.getTypeParameters(); } @Override public boolean isOrdered() { return domainClass.isOrdered(); } @Override public boolean isUnique() { return domainClass.isUnique(); } @Override public String toString() { return String.valueOf(evaluationPackage) + "::" + String.valueOf(name); //$NON-NLS-1$ } }