blob: ce78b4e3667be29c0fd4102749246cd9b5d10b4d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2017 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
* E.D.Willink (CEA LIST) - Bug 388493, 399252, 399378
*******************************************************************************/
package org.eclipse.ocl.pivot.uml.internal.es2as;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.FeatureMap.Entry;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.AssociationClass;
import org.eclipse.ocl.pivot.Comment;
import org.eclipse.ocl.pivot.ConnectionPointReference;
import org.eclipse.ocl.pivot.Constraint;
import org.eclipse.ocl.pivot.DataType;
import org.eclipse.ocl.pivot.DynamicBehavior;
import org.eclipse.ocl.pivot.DynamicElement;
import org.eclipse.ocl.pivot.DynamicType;
import org.eclipse.ocl.pivot.DynamicValueSpecification;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.Enumeration;
import org.eclipse.ocl.pivot.EnumerationLiteral;
import org.eclipse.ocl.pivot.ExpressionInOCL;
import org.eclipse.ocl.pivot.FinalState;
import org.eclipse.ocl.pivot.InstanceSpecification;
import org.eclipse.ocl.pivot.NamedElement;
import org.eclipse.ocl.pivot.Namespace;
import org.eclipse.ocl.pivot.Operation;
import org.eclipse.ocl.pivot.Parameter;
import org.eclipse.ocl.pivot.PivotFactory;
import org.eclipse.ocl.pivot.PivotPackage;
import org.eclipse.ocl.pivot.PrimitiveType;
import org.eclipse.ocl.pivot.Profile;
import org.eclipse.ocl.pivot.ProfileApplication;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.Pseudostate;
import org.eclipse.ocl.pivot.Region;
import org.eclipse.ocl.pivot.Signal;
import org.eclipse.ocl.pivot.Slot;
import org.eclipse.ocl.pivot.State;
import org.eclipse.ocl.pivot.StateMachine;
import org.eclipse.ocl.pivot.Stereotype;
import org.eclipse.ocl.pivot.StereotypeExtender;
import org.eclipse.ocl.pivot.TemplateParameter;
import org.eclipse.ocl.pivot.TemplateSignature;
import org.eclipse.ocl.pivot.TemplateableElement;
import org.eclipse.ocl.pivot.Transition;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.TypedElement;
import org.eclipse.ocl.pivot.ids.IdManager;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.internal.PackageImpl;
import org.eclipse.ocl.pivot.internal.complete.StandardLibraryInternal;
import org.eclipse.ocl.pivot.internal.ecore.es2as.Ecore2ASDeclarationSwitch;
import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
import org.eclipse.ocl.pivot.utilities.PivotConstants;
import org.eclipse.ocl.pivot.values.IntegerValue;
import org.eclipse.ocl.pivot.values.RealValue;
import org.eclipse.uml2.common.util.UML2Util;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLSwitch;
import org.eclipse.uml2.uml.util.UMLUtil;
public class UML2ASDeclarationSwitch extends UMLSwitch<Object>
{
@SuppressWarnings("null")
private static final @NonNull Logger logger = Logger.getLogger(UML2ASDeclarationSwitch.class);
protected final @NonNull Ecore2ASDeclarationSwitch ecoreSwitch;
protected final @NonNull UML2AS converter;
protected final @NonNull PivotMetamodelManager metamodelManager;
protected final @NonNull StandardLibraryInternal standardLibrary;
public UML2ASDeclarationSwitch(@NonNull UML2AS converter) {
this.converter = converter;
this.ecoreSwitch = new Ecore2ASDeclarationSwitch(converter);
this.metamodelManager = converter.getMetamodelManager();
this.standardLibrary = converter.getStandardLibrary();
}
@Override
public Object caseAssociation(org.eclipse.uml2.uml.Association umlAssociation) {
assert umlAssociation != null;
//
// It would be nice to create Pivot AssociationClass instances lazily, but UML defines these objects and it is hard
// to be lazy; the proxies could be nearly as costly as their truths.
//
AssociationClass asAssociationClass = converter.refreshNamedElement(org.eclipse.ocl.pivot.AssociationClass.class, PivotPackage.Literals.ASSOCIATION_CLASS, umlAssociation);
// System.out.println("Association " + umlAssociation.getName() + ", " + NameUtil.debugSimpleName(umlAssociation) + " => " + NameUtil.debugSimpleName(asAssociationClass));
copyNamedElement(asAssociationClass, umlAssociation);
converter.queueReference(umlAssociation); // properties, superClasses
converter.queueUse(umlAssociation); // redefinitions, constraints
return asAssociationClass;
}
@Override
public Object caseAssociationClass(org.eclipse.uml2.uml.AssociationClass umlAssociationClass) {
assert umlAssociationClass != null;
AssociationClass asAssociationClass = converter.refreshNamedElement(AssociationClass.class, PivotPackage.Literals.ASSOCIATION_CLASS, umlAssociationClass);
// System.out.println("AssociationClass " + umlAssociationClass.getName() + " => " + NameUtil.debugSimpleName(asAssociationClass));
copyClass(asAssociationClass, umlAssociationClass);
converter.queueReference(umlAssociationClass); // properties, superClasses
converter.queueUse(umlAssociationClass); // redefinitions, constraints
return asAssociationClass;
}
@Override
public Object caseBehavior(org.eclipse.uml2.uml.Behavior umlBehavior) {
assert umlBehavior != null;
DynamicBehavior pivotElement = converter.refreshElement(DynamicBehavior.class, PivotPackage.Literals.DYNAMIC_BEHAVIOR, umlBehavior);
pivotElement.setName(((org.eclipse.uml2.uml.Type)umlBehavior).getName());
doSwitchAll(pivotElement.getOwnedAnnotations(), ((org.eclipse.uml2.uml.Element)umlBehavior).getOwnedElements(), null);
EClass umlMetaClass = umlBehavior.eClass();
Type metaType = metamodelManager.getASOfEcore(Type.class, umlMetaClass);
pivotElement.setMetaType(metaType);
return pivotElement;
}
@Override
public org.eclipse.ocl.pivot.Class caseClass(org.eclipse.uml2.uml.Class umlClass) {
assert umlClass != null;
org.eclipse.ocl.pivot.Class pivotElement = converter.refreshNamedElement(org.eclipse.ocl.pivot.Class.class, PivotPackage.Literals.CLASS, umlClass);
// System.out.println("Class " + umlClass.getName() + " => " + ClassUtil.debugSimpleName(pivotElement));
copyClass(pivotElement, umlClass);
converter.queueReference(umlClass); // superClasses
return pivotElement;
}
@Override
public Object caseClassifierTemplateParameter(org.eclipse.uml2.uml.ClassifierTemplateParameter umlTemplateParameter) {
assert umlTemplateParameter != null;
@SuppressWarnings("null") org.eclipse.uml2.uml.@NonNull Class umlParameterClass = (org.eclipse.uml2.uml.Class) umlTemplateParameter.getParameteredElement();
TemplateParameter pivotElement = converter.refreshElement(TemplateParameter.class, PivotPackage.Literals.TEMPLATE_PARAMETER, umlTemplateParameter);
// TemplateParameter pivotTemplateParameter = converter.refreshNamedElement(org.eclipse.ocl.pivot.Class.class, PivotPackage.Literals.CLASS, umlTemplateParameter);
// setOriginalMapping(pivotElement, umlTemplateParameter);
// String name = umlTemplateParameter.getName();
pivotElement.setName(umlParameterClass.getName());
// TemplateParameter templateParameter = pivotElement.isTemplateParameter();
// if (templateParameter == null) {
// templateParameter = PivotFactory.eINSTANCE.createTemplateParameter();
// templateParameter.setOwnedParameteredElement(pivotElement);
// converter.setOriginalMapping(templateParameter, umlTemplateParameter);
// }
converter.setOriginalMapping(pivotElement, umlTemplateParameter);
// List<EGenericType> eBounds = umlTemplateParameter.getEBounds();
// if (!eBounds.isEmpty()) {
// doSwitchAll(eBounds);
// converter.queueReference(umlTemplateParameter);
// }
return pivotElement;
}
@Override
public Comment caseComment(org.eclipse.uml2.uml.Comment umlComment) {
assert umlComment != null;
Comment pivotElement = converter.refreshElement(Comment.class, PivotPackage.Literals.COMMENT, umlComment);
pivotElement.setBody(umlComment.getBody());
copyComments(pivotElement, umlComment);
return pivotElement;
}
@Override
public ConnectionPointReference caseConnectionPointReference(org.eclipse.uml2.uml.ConnectionPointReference umlConnectionPointReference) {
assert umlConnectionPointReference != null;
ConnectionPointReference pivotElement = converter.refreshNamedElement(ConnectionPointReference.class, PivotPackage.Literals.CONNECTION_POINT_REFERENCE, umlConnectionPointReference);
copyNamedElement(pivotElement, umlConnectionPointReference);
return pivotElement;
}
@Override
public Constraint caseConstraint(org.eclipse.uml2.uml.Constraint umlConstraint) {
assert umlConstraint != null;
Constraint pivotElement = converter.refreshNamedElement(Constraint.class, PivotPackage.Literals.CONSTRAINT, umlConstraint);
copyNamedElement(pivotElement, umlConstraint);
converter.queueUse(umlConstraint);
return pivotElement;
}
@Override
public DataType caseDataType(org.eclipse.uml2.uml.DataType umlDataType) {
assert umlDataType != null;
DataType pivotElement = converter.refreshNamedElement(DataType.class, PivotPackage.Literals.DATA_TYPE, umlDataType);
copyDataTypeOrEnum(pivotElement, umlDataType);
@SuppressWarnings("null") @NonNull List<org.eclipse.uml2.uml.Property> umlAttributes = umlDataType.getAttributes();
doSwitchAll(umlAttributes);
// converter.addProperties(umlAttributes, null);
pivotElement.getSuperClasses().add(standardLibrary.getOclAnyType());
return pivotElement;
}
@Override
public Enumeration caseEnumeration(org.eclipse.uml2.uml.Enumeration umlEnumeration) {
assert umlEnumeration != null;
Enumeration pivotElement = converter.refreshNamedElement(Enumeration.class, PivotPackage.Literals.ENUMERATION, umlEnumeration);
copyDataTypeOrEnum(pivotElement, umlEnumeration);
doSwitchAll(pivotElement.getOwnedLiterals(), umlEnumeration.getOwnedLiterals(), null);
pivotElement.getSuperClasses().add(((StandardLibraryInternal.StandardLibraryExtension)standardLibrary).getOclEnumerationType());
return pivotElement;
}
@Override
public EnumerationLiteral caseEnumerationLiteral(org.eclipse.uml2.uml.EnumerationLiteral umlEnumLiteral) {
assert umlEnumLiteral != null;
EnumerationLiteral pivotElement = converter.refreshNamedElement(EnumerationLiteral.class,
PivotPackage.Literals.ENUMERATION_LITERAL, umlEnumLiteral);
copyNamedElement(pivotElement, umlEnumLiteral);
// if (eEnumLiteral.eIsSet(EcorePackage.Literals.EENUM_LITERAL__VALUE)) {
// pivotElement.setValue(BigInteger.valueOf(eEnumLiteral.getValue()));
// }
// else {
// pivotElement.eUnset(PivotPackage.Literals.ENUMERATION_LITERAL__VALUE);
// }
// String literal = basicGet(eObject, EcorePackage.Literals.EENUM_LITERAL__LITERAL, String.class);
// Enumerator instance = eEnumLiteral.getInstance();
// if (literal != null) {
/* AnnotationCS csAnnotation = PivotFactory.eINSTANCE.createAnnotationCS();
csAnnotation.setIdSource(EcorePackage.eNS_URI);
DetailCS csDetail = PivotFactory.eINSTANCE.createDetailCS();
csDetail.setIdName("literal");
copyDetailLines(csDetail.getValue(), literal);
csAnnotation.getDetails().add(csDetail);
pivotElement.getAnnotations().add(csAnnotation); */
// }
return pivotElement;
}
@Override
public Object caseExtension(org.eclipse.uml2.uml.Extension umlExtension) {
assert umlExtension != null;
/* Redundant while NsURI set at start of convert
org.eclipse.uml2.uml.Class metaclass = umlExtension.getMetaclass();
if (metaclass != null) {
org.eclipse.uml2.uml.Package metapackage = metaclass.getPackage();
if (metapackage != null) {
String metaNsURI = metapackage.getURI();
if (metaNsURI != null) {
metamodelManager.setMetamodelNsURI(metaNsURI);
}
}
} */
StereotypeExtender asTypeExtension = converter.refreshElement(StereotypeExtender.class, PivotPackage.Literals.STEREOTYPE_EXTENDER, umlExtension);
converter.copyModelElement(asTypeExtension, umlExtension);
// converter.queueReference(umlProfileApplication);
// converter.addProfileApplication(umlProfileApplication);
boolean isRequired = false;
for (org.eclipse.uml2.uml.Property umlProperty : umlExtension.getOwnedEnds()) {
@SuppressWarnings("unused")Object eObject = doSwitch(umlProperty);
int lower = umlProperty.getLower();
if (lower == 1) {
isRequired = false;
}
}
asTypeExtension.setIsRequired(isRequired);
org.eclipse.uml2.uml.Class umlMetaclass = umlExtension.getMetaclass();
if (umlMetaclass != null) {
org.eclipse.uml2.uml.Package umlMetapackage = umlMetaclass.getPackage();
if (umlMetapackage != null) {
String nsURI = umlMetapackage.getURI();
if (nsURI != null) {
metamodelManager.getCompleteModel().addPackageURI2completeURI(nsURI, PivotConstants.UML_METAMODEL_NAME);
}
converter.addImportedPackage(umlMetapackage);
}
}
converter.queueReference(umlExtension); // stereotype, type, opposites
return asTypeExtension;
}
/* @Override
public Object caseExtensionEnd(ExtensionEnd umlExtensionEnd) {
int lower = umlExtensionEnd.getLower();
if (lower == 1) {
// converter.addRequiredExtensionEnd(umlExtensionEnd);
}
return this;
} */
@Override
public FinalState caseFinalState(org.eclipse.uml2.uml.FinalState umlState) {
assert umlState != null;
FinalState pivotElement = converter.refreshNamedElement(FinalState.class, PivotPackage.Literals.FINAL_STATE, umlState);
copyState(pivotElement, umlState);
return pivotElement;
}
@Override
public InstanceSpecification caseInstanceSpecification(org.eclipse.uml2.uml.InstanceSpecification umlInstanceSpecification) {
assert umlInstanceSpecification != null;
InstanceSpecification pivotElement = converter.refreshNamedElement(InstanceSpecification.class, PivotPackage.Literals.INSTANCE_SPECIFICATION, umlInstanceSpecification);
doSwitchAll(pivotElement.getOwnedSlots(), umlInstanceSpecification.getSlots(), null);
// converter.queueReference(umlInstanceSpecification); // classifiers
return pivotElement;
}
@Override
public org.eclipse.ocl.pivot.Class caseInterface(org.eclipse.uml2.uml.Interface umlInterface) {
assert umlInterface != null;
org.eclipse.ocl.pivot.Class pivotElement = converter.refreshNamedElement(org.eclipse.ocl.pivot.Class.class, PivotPackage.Literals.CLASS, umlInterface);
pivotElement.setIsInterface(true);
copyClassOrInterface(pivotElement, umlInterface);
return pivotElement;
}
@Override
public Object caseOpaqueExpression(org.eclipse.uml2.uml.OpaqueExpression umlExpression) {
assert umlExpression != null;
if (umlExpression.eContainer() instanceof org.eclipse.uml2.uml.Constraint) {
converter.queueUse(umlExpression);
return this;
}
else {
ExpressionInOCL pivotElement = converter.refreshOpaqueExpression(umlExpression);
return pivotElement;
}
}
@Override
public Operation caseOperation(org.eclipse.uml2.uml.Operation umlOperation) {
assert umlOperation != null;
Operation pivotElement = converter.refreshNamedElement(Operation.class, PivotPackage.Literals.OPERATION, umlOperation);
copyNamedElement(pivotElement, umlOperation);
pivotElement.setIsStatic(umlOperation.isStatic());
for (org.eclipse.uml2.uml.Parameter umlParameter : umlOperation.getOwnedParameters()) {
org.eclipse.uml2.uml.ParameterDirectionKind direction = umlParameter.getDirection();
if (direction == org.eclipse.uml2.uml.ParameterDirectionKind.IN_LITERAL) {
Parameter pivotObject = (Parameter) doSwitch(umlParameter);
if (pivotObject != null) {
pivotElement.getOwnedParameters().add(pivotObject);
}
}
}
copyTemplateSignature(pivotElement, umlOperation.getOwnedTemplateSignature());
// doSwitchAll(umlOperation.getEGenericExceptions());
converter.queueUse(umlOperation); // For exceptions
return pivotElement;
}
@Override
public org.eclipse.ocl.pivot.Package casePackage(org.eclipse.uml2.uml.Package umlPackage) {
assert umlPackage != null;
org.eclipse.ocl.pivot.Package pivotElement = converter.refreshNamedElement(org.eclipse.ocl.pivot.Package.class, PivotPackage.Literals.PACKAGE, umlPackage);
copyPackage(pivotElement, umlPackage);
// if (pivotElement.getName() == null) {
// pivotElement.setName("anon_" + Integer.toHexString(System.identityHashCode(umlPackage)));
// logger.error("Anonymous package named as '" + pivotElement.getName() + "'");
// }
return pivotElement;
}
@Override
public Parameter caseParameter(org.eclipse.uml2.uml.Parameter eObject) {
assert eObject != null;
Parameter pivotElement = converter.refreshNamedElement(Parameter.class, PivotPackage.Literals.PARAMETER, eObject);
copyTypedElement(pivotElement, eObject, null);
return pivotElement;
}
@Override
public DataType casePrimitiveType(org.eclipse.uml2.uml.PrimitiveType umlPrimitiveType) {
assert umlPrimitiveType != null;
PrimitiveType asPrimitiveType = getPrimitiveTypeByName(umlPrimitiveType);
if (asPrimitiveType == null) {
asPrimitiveType = getPrimitiveTypeByOCLStereotype(umlPrimitiveType);
}
// if (pivotElement != null) {
// converter.addCreated(umlPrimitiveType, pivotElement);
// }
org.eclipse.uml2.uml.Stereotype ecoreStereotype = null;
DataType pivotElement;
if (asPrimitiveType == standardLibrary.getBooleanType()) {
pivotElement = converter.refreshNamedElement(PrimitiveType.class, PivotPackage.Literals.PRIMITIVE_TYPE, umlPrimitiveType);
}
else if (asPrimitiveType == standardLibrary.getIntegerType()) {
pivotElement = converter.refreshNamedElement(PrimitiveType.class, PivotPackage.Literals.PRIMITIVE_TYPE, umlPrimitiveType);
}
else if (asPrimitiveType == standardLibrary.getRealType()) {
pivotElement = converter.refreshNamedElement(PrimitiveType.class, PivotPackage.Literals.PRIMITIVE_TYPE, umlPrimitiveType);
}
else if (asPrimitiveType == standardLibrary.getStringType()) {
pivotElement = converter.refreshNamedElement(PrimitiveType.class, PivotPackage.Literals.PRIMITIVE_TYPE, umlPrimitiveType);
}
else if (asPrimitiveType == standardLibrary.getUnlimitedNaturalType()) {
pivotElement = converter.refreshNamedElement(PrimitiveType.class, PivotPackage.Literals.PRIMITIVE_TYPE, umlPrimitiveType);
}
else {
ecoreStereotype = umlPrimitiveType.getAppliedStereotype("Ecore::EDataType");
if (ecoreStereotype == null) {
ecoreStereotype = umlPrimitiveType.getAppliedStereotype("Ecore::EClassifier");
}
if (ecoreStereotype != null) {
pivotElement = converter.refreshNamedElement(DataType.class, PivotPackage.Literals.DATA_TYPE, umlPrimitiveType);
}
else {
pivotElement = converter.refreshNamedElement(PrimitiveType.class, PivotPackage.Literals.PRIMITIVE_TYPE, umlPrimitiveType);
}
}
if (asPrimitiveType != null) {
// @SuppressWarnings("unused")TypeServer typeServer1 = metamodelManager.getTypeServer(asPrimitiveType);
// @SuppressWarnings("unused")TypeServer typeServer2 = metamodelManager.getTypeServer(pivotElement);
// pivotElement.setBehavioralClass(asPrimitiveType);
org.eclipse.uml2.uml.Package umlPackage = umlPrimitiveType.getPackage();
if (umlPackage != null) {
String nsURI = umlPackage.getURI();
if (nsURI != null) {
// metamodelManager.getPackageManager().addPackageNsURISynonym(nsURI, PackageId.METAMODEL_NAME);
}
}
}
else {
// System.out.println("unknown PrimitiveType " + umlPrimitiveType);
}
copyClassifier(pivotElement, umlPrimitiveType);
String instanceClassName = null;
PrimitiveType behavioralClass = asPrimitiveType;
if (ecoreStereotype != null) {
Object object = umlPrimitiveType.getValue(ecoreStereotype, "instanceClassName");
if (object instanceof String) {
instanceClassName = (String) object;
behavioralClass = getPrimitiveTypeByEcoreStereotype(ecoreStereotype, instanceClassName);
}
}
pivotElement.setInstanceClassName(instanceClassName);
pivotElement.setBehavioralClass(behavioralClass);
return pivotElement;
}
@Override
public Object caseProfile(org.eclipse.uml2.uml.Profile umlProfile) {
assert umlProfile != null;
Profile pivotElement = converter.refreshNamedElement(Profile.class, PivotPackage.Literals.PROFILE, umlProfile);
copyPackage(pivotElement, umlProfile);
return pivotElement;
}
@Override
public Object caseProfileApplication(org.eclipse.uml2.uml.ProfileApplication umlProfileApplication) {
assert umlProfileApplication != null;
ProfileApplication pivotElement = converter.refreshElement(ProfileApplication.class, PivotPackage.Literals.PROFILE_APPLICATION, umlProfileApplication);
converter.copyModelElement(pivotElement, umlProfileApplication);
converter.queueReference(umlProfileApplication); // Resolve Profile reference
return pivotElement;
}
@Override
public Object caseProperty(org.eclipse.uml2.uml.Property umlProperty) {
assert umlProperty != null;
org.eclipse.uml2.uml.Association umlAssociation = umlProperty.getAssociation();
if (umlAssociation != null) {
if (umlAssociation instanceof org.eclipse.uml2.uml.Extension) {
// FIXME regularize by handling Extension properties as part of the Extension
}
else {
return this; // Association Properties are handled by the Association
}
}
// if ((umlProperty.getName() != null) && umlProperty.getName().startsWith(UML2AS.STEREOTYPE_BASE_PREFIX)) {
// System.out.println("Got it");
// }
Property pivotElement = converter.refreshNamedElement(Property.class, PivotPackage.Literals.PROPERTY, umlProperty);
// System.out.println("Property " + ((org.eclipse.uml2.uml.NamedElement)umlProperty.eContainer()).getName() + "::" + umlProperty.getName() + " => " + ClassUtil.debugSimpleName(pivotElement));
copyProperty(pivotElement, umlProperty, null);
// NB MDT/UML2's base_XXX/extension_YYY are spurious composites
@SuppressWarnings("unused")org.eclipse.uml2.uml.Element owner = umlProperty.getOwner();
boolean isComposer = true; //(owner instanceof org.eclipse.uml2.uml.Classifier) && !(owner instanceof org.eclipse.uml2.uml.Association);
pivotElement.setIsComposite(isComposer && umlProperty.isComposite());
pivotElement.setIsImplicit(!isComposer);
// pivotElement.setIsID(umlProperty.isID());
// pivotElement.setIsResolveProxies(umlProperty.isResolveProxies());
pivotElement.setIsStatic(umlProperty.isStatic());
// converter.addProperty(umlProperty);
converter.queueReference(umlProperty); // type
converter.queueUse(umlProperty); // Defer
return pivotElement;
}
@Override
public Pseudostate casePseudostate(org.eclipse.uml2.uml.Pseudostate umlPseudostate) {
assert umlPseudostate != null;
Pseudostate pivotElement = converter.refreshNamedElement(Pseudostate.class, PivotPackage.Literals.PSEUDOSTATE, umlPseudostate);
copyNamedElement(pivotElement, umlPseudostate);
return pivotElement;
}
@Override
public Region caseRegion(org.eclipse.uml2.uml.Region umlRegion) {
assert umlRegion != null;
Region pivotElement = converter.refreshNamedElement(Region.class, PivotPackage.Literals.REGION, umlRegion);
copyNamespace(pivotElement, umlRegion);
doSwitchAll(pivotElement.getOwnedSubvertexes(), umlRegion.getSubvertices(), null);
doSwitchAll(pivotElement.getOwnedTransitions(), umlRegion.getTransitions(), null);
return pivotElement;
}
/**
* @since 1.1
*/
@Override
public Signal caseSignal(org.eclipse.uml2.uml.Signal umlSignal) {
assert umlSignal != null;
Signal pivotElement = converter.refreshNamedElement(Signal.class, PivotPackage.Literals.SIGNAL, umlSignal);
copyClassOrInterface(pivotElement, umlSignal);
converter.queueReference(umlSignal); // superClasses
return pivotElement;
}
@Override
public Slot caseSlot(org.eclipse.uml2.uml.Slot umlSlot) {
assert umlSlot != null;
Slot pivotElement = converter.refreshElement(Slot.class, PivotPackage.Literals.SLOT, umlSlot);
doSwitchAll(pivotElement.getOwnedValues(), umlSlot.getValues(), null);
converter.setOriginalMapping(pivotElement, umlSlot);
converter.queueReference(umlSlot); // definingFeature
return pivotElement;
}
@Override
public State caseState(org.eclipse.uml2.uml.State umlState) {
assert umlState != null;
State pivotElement = converter.refreshNamedElement(State.class, PivotPackage.Literals.STATE, umlState);
copyState(pivotElement, umlState);
return pivotElement;
}
@Override
public StateMachine caseStateMachine(org.eclipse.uml2.uml.StateMachine umlStateMachine) {
assert umlStateMachine != null;
StateMachine pivotElement = converter.refreshNamedElement(StateMachine.class, PivotPackage.Literals.STATE_MACHINE, umlStateMachine);
copyClass(pivotElement, umlStateMachine);
doSwitchAll(pivotElement.getOwnedRegions(), umlStateMachine.getRegions(), null);
return pivotElement;
}
@Override
public Stereotype caseStereotype(org.eclipse.uml2.uml.Stereotype umlStereotype) {
assert umlStereotype != null;
Stereotype pivotElement = converter.refreshNamedElement(Stereotype.class, PivotPackage.Literals.STEREOTYPE, umlStereotype);
copyClass(pivotElement, umlStereotype);
converter.queueReference(umlStereotype); // superClasses
return pivotElement;
}
@Override
public Transition caseTransition(org.eclipse.uml2.uml.Transition umlTransition) {
assert umlTransition != null;
Transition pivotElement = converter.refreshNamedElement(Transition.class, PivotPackage.Literals.TRANSITION, umlTransition);
copyNamespace(pivotElement, umlTransition);
return pivotElement;
}
@Override
public DynamicValueSpecification caseValueSpecification(org.eclipse.uml2.uml.ValueSpecification umlValueSpecification) {
assert umlValueSpecification != null;
DynamicValueSpecification pivotElement = converter.refreshElement(DynamicValueSpecification.class, PivotPackage.Literals.DYNAMIC_VALUE_SPECIFICATION, umlValueSpecification);
converter.setOriginalMapping(pivotElement, umlValueSpecification);
return pivotElement;
}
protected void copyAnnotatedElement(@NonNull NamedElement pivotElement,
@NonNull EModelElement umlElement, @Nullable List<EAnnotation> excludedAnnotations) {
List<Element> pivotAnnotations = pivotElement.getOwnedAnnotations();
for (EAnnotation eAnnotation : umlElement.getEAnnotations()) {
if ((excludedAnnotations == null) || !excludedAnnotations.contains(eAnnotation)) {
Element pivotAnnotation = (Element) doSwitch(eAnnotation);
if (pivotAnnotation != null) {
pivotAnnotations.add(pivotAnnotation);
}
}
}
}
protected void copyClassOrInterface(org.eclipse.ocl.pivot.@NonNull Class pivotElement, org.eclipse.uml2.uml.@NonNull Classifier umlClassifier) {
copyClassifier(pivotElement, umlClassifier);
pivotElement.setIsAbstract(umlClassifier.isAbstract());
String instanceClassName = null;
org.eclipse.uml2.uml.Stereotype ecoreStereotype = umlClassifier.getAppliedStereotype("Ecore::EClass");
if (ecoreStereotype != null) {
Object object = umlClassifier.getValue(ecoreStereotype, "instanceClassName");
if (object instanceof String) {
instanceClassName = (String) object;
}
}
pivotElement.setInstanceClassName(instanceClassName);
// doSwitchAll(umlClass.getSuperClasses());
@SuppressWarnings("null") @NonNull List<org.eclipse.uml2.uml.Property> umlAttributes = umlClassifier.getAttributes();
/* converter.addProperties(umlAttributes, new UML2AS.Predicate<org.eclipse.uml2.uml.Property>()
{
public boolean filter(org.eclipse.uml2.uml.@NonNull Property element) {
if (element.getAssociation() == null) {
doSwitch(element);
}
return element.getAssociation() == null;
}
}); */
// doSwitchAll(pivotElement.getOwnedAttribute(), umlClassifier.getAttributes());
doSwitchAll(umlAttributes);
converter.queueUse(umlClassifier); // For superclasses
}
protected void copyClass(org.eclipse.ocl.pivot.@NonNull Class pivotElement, org.eclipse.uml2.uml.@NonNull Class umlClass) {
pivotElement.setIsInterface(false);
copyClassOrInterface(pivotElement, umlClass);
/* for (org.eclipse.uml2.uml.Classifier umlType : umlClass.getNestedClassifiers()) {
// doSwitch(umlType);
Type pivotObject = (Type) doSwitch(umlType);
if (pivotObject != null) {
metamodelManager.addOrphanClass(pivotObject);
}
} */
// doSwitchAll(pivotElement.getNestedClassifier(), umlClass.getNestedClassifiers(), null);
doSwitchAll(pivotElement.getOwnedBehaviors(), umlClass.getOwnedBehaviors(), null);
for (org.eclipse.uml2.uml.Classifier umlNestedClassifier : umlClass.getNestedClassifiers()) {
if (umlNestedClassifier instanceof org.eclipse.uml2.uml.Association) {
doSwitch(umlNestedClassifier);
}
/* else if (umlNestedClassifier instanceof org.eclipse.uml2.uml.Behavior) {} // Handled above
else { // FIXME Bug 514353 Class::nestedClassifiers
converter.error("Unsupported Class::nestedClassifiers for \"" + umlClass.getPackage().getName() + "::" + umlClass.getName() + "::" + umlNestedClassifier.getName() + "\"");
} */
}
}
protected void copyClassifier(org.eclipse.ocl.pivot.@NonNull Class pivotElement, org.eclipse.uml2.uml.@NonNull Classifier umlClassifier) {
copyNamespace(pivotElement, umlClassifier);
copyTemplateSignature(pivotElement, umlClassifier.getOwnedTemplateSignature());
doSwitchAll(pivotElement.getOwnedOperations(), umlClassifier.getOperations(), null);
}
protected void copyComments(@NonNull Element pivotElement, org.eclipse.uml2.uml.@NonNull Element umlElement) {
doSwitchAll(pivotElement.getOwnedComments(), umlElement.getOwnedComments(), null);
}
/* protected void copyConstraints(@NonNull Namespace pivotElement, org.eclipse.uml2.uml.@NonNull Namespace umlNamespace,
@Nullable List<org.eclipse.uml2.uml.Constraint> exclusions) {
List<org.eclipse.uml2.uml.Constraint> ownedRules = umlNamespace.getOwnedRules();
if ((exclusions != null) && (exclusions.size() > 0)) {
ownedRules = new ArrayList<org.eclipse.uml2.uml.Constraint>(ownedRules);
ownedRules.removeAll(exclusions);
}
doSwitchAll(pivotElement.getOwnedRule(), ownedRules, null);
} */
protected void copyDataTypeOrEnum(@NonNull DataType pivotElement, org.eclipse.uml2.uml.@NonNull DataType umlDataType) {
copyClassifier(pivotElement, umlDataType);
String instanceClassName = null;
org.eclipse.uml2.uml.Stereotype ecoreStereotype = umlDataType.getAppliedStereotype("Ecore::EClass"); // Bug 453090 : UML2 does not support generalization
if (ecoreStereotype == null) {
ecoreStereotype = umlDataType.getAppliedStereotype("Ecore::EDataType");
}
if (ecoreStereotype == null) {
ecoreStereotype = umlDataType.getAppliedStereotype("Ecore::EClassifier");
}
if (ecoreStereotype != null) {
Object object = umlDataType.getValue(ecoreStereotype, "instanceClassName");
if (object instanceof String) {
instanceClassName = (String) object;
pivotElement.setBehavioralClass(getPrimitiveTypeByEcoreStereotype(ecoreStereotype, instanceClassName));
}
}
PrimitiveType asPrimitiveType = getPrimitiveTypeByOCLStereotype(umlDataType);
if (asPrimitiveType != null) {
pivotElement.setBehavioralClass(asPrimitiveType);
if (instanceClassName == null) {
if (asPrimitiveType == standardLibrary.getIntegerType()) {
instanceClassName = IntegerValue.class.getName();
}
else {
instanceClassName = RealValue.class.getName();
}
}
}
pivotElement.setInstanceClassName(instanceClassName);
// pivotElement.setIsSerializable(umlDataType.isSerializable());
converter.queueReference(umlDataType); // For generals
}
/* public void copyDetailLines(List<String> lines, String value) {
String[] splitLines = value.split("\n");
for (int i = 0; i < splitLines.length-1; i++) {
lines.add(splitLines[i] + '\n');
}
if (splitLines.length > 0) {
lines.add(splitLines[splitLines.length-1]);
}
} */
protected void copyNamedElement(@NonNull NamedElement pivotElement, org.eclipse.uml2.uml.@NonNull NamedElement umlNamedElement) {
converter.copyNamedElement(pivotElement, umlNamedElement);
copyAnnotatedElement(pivotElement, umlNamedElement, null);
copyComments(pivotElement, umlNamedElement);
}
protected void copyNamespace(@NonNull Namespace pivotElement, org.eclipse.uml2.uml.@NonNull Namespace umlNamespace) {
copyNamedElement(pivotElement, umlNamespace);
converter.queueUse(umlNamespace); // Defer for constraints
}
protected void copyPackage(org.eclipse.ocl.pivot.@NonNull Package pivotElement, org.eclipse.uml2.uml.@NonNull Package umlPackage) {
// EAnnotation eAnnotation = umlPackage.getEAnnotation(EcorePackage.eNS_URI);
// List<EAnnotation> exclusions = eAnnotation == null ? Collections.<EAnnotation>emptyList() : Collections.singletonList(eAnnotation);
copyNamespace(pivotElement, umlPackage);
Object nsPrefix = null;
Object nsURI = umlPackage.getURI();
org.eclipse.uml2.uml.Stereotype ecoreStereotype = getEcoreStereotype(umlPackage, UMLUtil.STEREOTYPE__E_PACKAGE);
if ((ecoreStereotype != null) && umlPackage.isStereotypeApplied(ecoreStereotype)) {
nsPrefix = umlPackage.getValue(ecoreStereotype, UMLUtil.TAG_DEFINITION__NS_PREFIX);
if (nsURI == null) {
nsURI = umlPackage.getValue(ecoreStereotype, UMLUtil.TAG_DEFINITION__NS_URI);
}
}
pivotElement.setNsPrefix(nsPrefix != null ? nsPrefix.toString() : null);
if (nsURI instanceof String) {
String nsURI2 = (String)nsURI;
if (!(umlPackage instanceof org.eclipse.uml2.uml.Profile) && nsURI2.startsWith("http://www.omg.org/spec/")) {
String packageName = umlPackage.getName();
if ("UML".equals(packageName)) { // OMG's
for (org.eclipse.uml2.uml.Type umlType : umlPackage.getOwnedTypes()) {
if ((umlType instanceof org.eclipse.uml2.uml.Class) && "Class".equals(umlType.getName())) {
metamodelManager.getCompleteModel().addPackageURI2completeURI(nsURI2, PivotConstants.UML_METAMODEL_NAME);;
((PackageImpl)pivotElement).setIgnoreInvariants(true);
break;
}
}
}
else if ("PrimitiveTypes".equals(packageName)) {
for (org.eclipse.uml2.uml.Type umlType : umlPackage.getOwnedTypes()) {
if ((umlType instanceof org.eclipse.uml2.uml.PrimitiveType) && "Boolean".equals(umlType.getName())) {
metamodelManager.getCompleteModel().addPackageURI2completeURI(nsURI2, PivotConstants.TYPES_METAMODEL_NAME);;
break;
}
}
}
}
String sharedURI = metamodelManager.getCompleteModel().getCompleteURI(nsURI2);
if (sharedURI != null) {
if (!sharedURI.equals(nsURI)) {
((PackageImpl)pivotElement).setPackageId(IdManager.getRootPackageId(sharedURI));
}
// else {
// ((PackageImpl)pivotElement).setPackageId(IdManager.getNsURIPackageId(sharedURI, pivotElement.getNsPrefix(), null));
// }
}
}
pivotElement.setURI(nsURI != null ? nsURI.toString() : null);
@Nullable List<org.eclipse.uml2.uml.Constraint> umlConstraints = null;
@Nullable List<org.eclipse.uml2.uml.Element> umlOtherElements = null;
@Nullable List<org.eclipse.uml2.uml.InstanceSpecification> umlInstanceSpecifications = null;
@Nullable List<org.eclipse.uml2.uml.Package> umlNestedPackages = null;
@Nullable List<org.eclipse.uml2.uml.Package> umlImportedPackages = null;
@Nullable List<org.eclipse.uml2.uml.ProfileApplication> umlProfileApplications = null;
@Nullable List<org.eclipse.uml2.uml.Type> umlTypes = null;
@Nullable List<org.eclipse.uml2.uml.Association> umlAssociations = null;
for (org.eclipse.uml2.uml.Element ownedElement : umlPackage.getOwnedElements()) {
if (ownedElement instanceof org.eclipse.uml2.uml.Package) {
if (umlNestedPackages == null) {
umlNestedPackages = new ArrayList<org.eclipse.uml2.uml.Package>();
}
umlNestedPackages.add((org.eclipse.uml2.uml.Package)ownedElement);
}
else if (ownedElement instanceof org.eclipse.uml2.uml.PackageImport) {
if (umlImportedPackages == null) {
umlImportedPackages = new ArrayList<org.eclipse.uml2.uml.Package>();
}
umlImportedPackages.add(((org.eclipse.uml2.uml.PackageImport)ownedElement).getImportedPackage());
}
else if (ownedElement instanceof org.eclipse.uml2.uml.Association) {
if (umlAssociations == null) {
umlAssociations = new ArrayList<org.eclipse.uml2.uml.Association>();
}
umlAssociations.add((org.eclipse.uml2.uml.Association)ownedElement);
}
else if (ownedElement instanceof org.eclipse.uml2.uml.Constraint) {
if (umlConstraints == null) {
umlConstraints = new ArrayList<org.eclipse.uml2.uml.Constraint>();
}
umlConstraints.add((org.eclipse.uml2.uml.Constraint)ownedElement);
}
else if (ownedElement instanceof org.eclipse.uml2.uml.InstanceSpecification) {
if (umlInstanceSpecifications == null) {
umlInstanceSpecifications = new ArrayList<org.eclipse.uml2.uml.InstanceSpecification>();
}
umlInstanceSpecifications.add((org.eclipse.uml2.uml.InstanceSpecification)ownedElement);
}
else if (ownedElement instanceof org.eclipse.uml2.uml.Type) {
if (umlTypes == null) {
umlTypes = new ArrayList<org.eclipse.uml2.uml.Type>();
}
umlTypes.add((org.eclipse.uml2.uml.Type)ownedElement);
}
else if (ownedElement instanceof org.eclipse.uml2.uml.ProfileApplication) {
if (umlProfileApplications == null) {
umlProfileApplications = new ArrayList<org.eclipse.uml2.uml.ProfileApplication>();
}
umlProfileApplications.add((org.eclipse.uml2.uml.ProfileApplication)ownedElement);
}
else if (ownedElement instanceof org.eclipse.uml2.uml.Comment) {
// umlComments.add((org.eclipse.uml2.uml.Comment)ownedElement);
}
else {
if (umlOtherElements == null) {
umlOtherElements = new ArrayList<org.eclipse.uml2.uml.Element>();
}
umlOtherElements.add(ownedElement);
}
}
if (umlInstanceSpecifications != null) {
doSwitchAll(pivotElement.getOwnedInstances(), umlInstanceSpecifications, null);
}
else {
pivotElement.getOwnedInstances().clear();
}
if (umlNestedPackages != null) {
doSwitchAll(pivotElement.getOwnedPackages(), umlNestedPackages, null);
}
else {
pivotElement.getOwnedPackages().clear();
}
if (umlProfileApplications != null) {
doSwitchAll(pivotElement.getOwnedProfileApplications(), umlProfileApplications, null);
for (org.eclipse.uml2.uml.ProfileApplication umlProfileApplication : umlProfileApplications) {
if (umlProfileApplication != null) {
org.eclipse.uml2.uml.Profile appliedProfile = umlProfileApplication.getAppliedProfile();
if (appliedProfile != null) {
if (umlImportedPackages == null) {
umlImportedPackages = new ArrayList<org.eclipse.uml2.uml.Package>();
}
umlImportedPackages.add(appliedProfile);
}
}
}
}
else {
pivotElement.getOwnedProfileApplications().clear();
}
List<org.eclipse.ocl.pivot.@NonNull Class> asClasses = new ArrayList<org.eclipse.ocl.pivot.@NonNull Class>();
if (umlTypes != null) {
doSwitchAll(asClasses, umlTypes, null);
}
else {
asClasses.clear();
}
if (umlAssociations != null) {
for (org.eclipse.uml2.uml.Association umlAssociation : umlAssociations) {
Object asAssociation = doSwitch(umlAssociation);
if (asAssociation instanceof AssociationClass) {
asClasses.add((AssociationClass)asAssociation);
}
}
}
converter.refreshList(pivotElement.getOwnedClasses(), asClasses);
if (umlConstraints != null) {
doSwitchAll(pivotElement.getOwnedConstraints(), umlConstraints, null);
}
if (umlOtherElements != null) {
doSwitchAll(pivotElement.getOwnedAnnotations(), umlOtherElements, null);
}
else {
pivotElement.getOwnedAnnotations().clear();
}
if (umlImportedPackages != null) {
converter.addImportedPackages(umlImportedPackages);
converter.queueUse(umlPackage); // Defer
}
else {
pivotElement.getImportedPackages().clear();
}
}
protected void copyProperty(@NonNull Property pivotElement, org.eclipse.uml2.uml.@NonNull Property umlProperty, List<EAnnotation> excludedAnnotations) {
copyTypedElement(pivotElement, umlProperty, excludedAnnotations); pivotElement.setIsReadOnly(umlProperty.isReadOnly());
pivotElement.setIsDerived(umlProperty.isDerived());
// pivotElement.setIsTransient(umlProperty.isTransient());
// pivotElement.setIsUnsettable(umlProperty.isUnsettable());
// pivotElement.setIsVolatile(umlProperty.isVolatile());
// if (umlProperty.eIsSet(EcorePackage.Literals.ESTRUCTURAL_FEATURE__DEFAULT_VALUE_LITERAL)) {
// pivotElement.setDefault(eObject.getDefaultValueLiteral());
// }
// else {
// pivotElement.eUnset(PivotPackage.Literals.PROPERTY__DEFAULT);
// }
}
protected void copyState(@NonNull State pivotElement, org.eclipse.uml2.uml.@NonNull State umlState) {
copyNamespace(pivotElement, umlState);
doSwitchAll(pivotElement.getOwnedRegions(), umlState.getRegions(), null);
}
protected void copyTemplateSignature(TemplateableElement pivotElement, org.eclipse.uml2.uml.TemplateSignature umlTemplateSignature) {
if (umlTemplateSignature != null) {
List<org.eclipse.uml2.uml.TemplateParameter> umlTemplateParameters = umlTemplateSignature.getOwnedParameters();
if (!umlTemplateParameters.isEmpty()) {
TemplateSignature pivotTemplateSignature = PivotFactory.eINSTANCE.createTemplateSignature();
pivotElement.setOwnedSignature(pivotTemplateSignature);
doSwitchAll(pivotTemplateSignature.getOwnedParameters(), umlTemplateParameters, null);
}
}
}
protected void copyTypedElement(@NonNull TypedElement pivotElement, org.eclipse.uml2.uml.@NonNull TypedElement umlTypedElement, List<EAnnotation> excludedAnnotations) {
copyNamedElement(pivotElement, umlTypedElement);
int lower = ((org.eclipse.uml2.uml.MultiplicityElement)umlTypedElement).getLower();
int upper = ((org.eclipse.uml2.uml.MultiplicityElement)umlTypedElement).getUpper();
pivotElement.setIsRequired((upper == 1) && (lower == 1));
org.eclipse.uml2.uml.Type umlType = umlTypedElement.getType();
if (umlType != null) {
converter.queueReference(umlTypedElement);
Resource umlResource = umlType.eResource();
if (umlResource != null) {
converter.addImportedResource(umlResource);
}
}
}
@Override
public Element defaultCase(EObject umlObject) {
DynamicElement pivotElement;
if (umlObject instanceof org.eclipse.uml2.uml.Type) {
pivotElement = converter.refreshElement(DynamicType.class, PivotPackage.Literals.DYNAMIC_TYPE, umlObject);
((DynamicType)pivotElement).setName(((org.eclipse.uml2.uml.Type)umlObject).getName());
}
else if (umlObject instanceof org.eclipse.uml2.uml.Element) {
pivotElement = converter.refreshElement(DynamicElement.class, PivotPackage.Literals.DYNAMIC_ELEMENT, umlObject);
}
else {
converter.error("Unsupported " + umlObject.eClass().getName() + " for UML2ASDeclarationSwitch");
return null;
}
converter.setOriginalMapping(pivotElement, umlObject);
doSwitchAll(pivotElement.getOwnedAnnotations(), ((org.eclipse.uml2.uml.Element)umlObject).getOwnedElements(), null);
EClass umlMetaClass = umlObject.eClass();
Type metaType = metamodelManager.getASOfEcore(Type.class, umlMetaClass);
pivotElement.setMetaType(metaType);
if (umlObject instanceof org.eclipse.uml2.uml.Slot) {
converter.queueUse(umlObject);
}
return pivotElement;
}
public Object doInPackageSwitch(@NonNull EObject eObject) {
int classifierID = eObject.eClass().getClassifierID();
return doSwitch(classifierID, eObject);
}
@Override
public Object doSwitch(EObject eObject) {
EClass eClass = eObject.eClass();
EPackage ePackage = eClass.getEPackage();
if (ePackage == UMLPackage.eINSTANCE) {
return doInPackageSwitch(eObject);
}
else if (ePackage == EcorePackage.eINSTANCE) {
if (eObject.eContainer() instanceof org.eclipse.uml2.uml.Profile) {
return null;
}
return ecoreSwitch.doInPackageSwitch(eObject);
}
else if (ePackage.getNsURI().startsWith("http://www.omg.org/spec/MOF")) { // Should never happen (removed by CMOF2UMLResourceHandler
if ((eObject instanceof org.eclipse.emf.ecore.xml.type.AnyType) && "Tag".equals(eClass.getName())) {
FeatureMap anyAttribute = ((org.eclipse.emf.ecore.xml.type.AnyType)eObject).getAnyAttribute();
Object name = null;
Object value = null;
Object element = null;
for (Entry entry : anyAttribute) {
EStructuralFeature eFeature = entry.getEStructuralFeature();
if ("name".equals(eFeature.getName())) {
name = anyAttribute.get(eFeature, false);
}
else if ("value".equals(eFeature.getName())) {
value = anyAttribute.get(eFeature, false);
}
else if ("element".equals(eFeature.getName())) {
element = anyAttribute.get(eFeature, false);
}
}
boolean gotIt = false;
EObject taggedObject = eObject.eResource().getEObject(String.valueOf(element));
if ("org.omg.xmi.nsPrefix".equals(name) && (taggedObject instanceof org.eclipse.uml2.uml.Package)) {
org.eclipse.ocl.pivot.Package asPackage = converter.getCreated(org.eclipse.ocl.pivot.Package.class, taggedObject);
if (asPackage != null) {
asPackage.setNsPrefix(String.valueOf(value));
gotIt = true;
}
}
else if ("org.omg.xmi.nsURI".equals(name) && (taggedObject instanceof org.eclipse.uml2.uml.Package)) {
org.eclipse.ocl.pivot.Package asPackage = converter.getCreated(org.eclipse.ocl.pivot.Package.class, taggedObject);
if (asPackage != null) {
asPackage.setURI(String.valueOf(value));
gotIt = true;
}
}
else if ("org.omg.xmi.schemaType".equals(name) && (taggedObject instanceof org.eclipse.uml2.uml.DataType)) {
DataType asPackage = converter.getCreated(DataType.class, taggedObject);
if (asPackage != null) {
// FIXME asPackage.setNsURI(String.valueOf(value));
System.out.println("Unknown " + ePackage.getNsURI() + "::" + eObject.eClass().getName() + "::" + name + " ignored");
gotIt = true;
}
}
if (!gotIt) {
logger.warn("Unknown " + ePackage.getNsURI() + "::" + eObject.eClass().getName() + "::" + name + " ignored");
}
}
return null;
}
else if (ePackage.getNsURI().startsWith("http://www.eclipse.org/uml2/schemas/Ecore")) {
// FIXME
return null;
}
else {
converter.addStereotypeApplication(eObject);
return null;
}
}
public <T extends Element, V extends EObject> void doSwitchAll(/*@NonNull*/ Collection<T> pivotObjects, /*@NonNull*/ List<V> eObjects, UML2AS.@Nullable Predicate<V> predicate) {
assert pivotObjects != null;
assert eObjects != null;
eObjects.size();
for (V eObject : eObjects) {
if ((eObject != null) && ((predicate == null) || predicate.filter(eObject))) {
Object switchObject = doSwitch(eObject);
if ((switchObject != null) && (switchObject != this)) {
@SuppressWarnings("unchecked")
T pivotObject = (T)switchObject;
pivotObjects.add(pivotObject);
}
}
}
}
public <T extends Element> void doSwitchAll(@NonNull List<? extends EObject> eObjects) {
for (EObject eObject : eObjects) {
doSwitch(eObject);
}
}
protected org.eclipse.uml2.uml.Profile getEcoreProfile(EObject eObject) {
Resource eResource = eObject.eResource();
if (eResource != null) {
ResourceSet resourceSet = eResource.getResourceSet();
if (resourceSet != null) {
return UML2Util.load(resourceSet, URI
.createURI(UMLResource.ECORE_PROFILE_URI),
UMLPackage.Literals.PROFILE);
}
}
return null;
}
protected org.eclipse.uml2.uml.Stereotype getEcoreStereotype(EObject eObject, String name) {
org.eclipse.uml2.uml.Profile ecoreProfile = getEcoreProfile(eObject);
return ecoreProfile != null
? ecoreProfile.getOwnedStereotype(name)
: null;
}
protected @Nullable PrimitiveType getPrimitiveTypeByEcoreStereotype(org.eclipse.uml2.uml.@NonNull Stereotype ecoreStereotype, @NonNull String instanceClassName) {
if ("boolean".equals(instanceClassName)) {
return standardLibrary.getBooleanType();
}
if ("byte".equals(instanceClassName) || "char".equals(instanceClassName) || "int".equals(instanceClassName) || "long".equals(instanceClassName) || "short".equals(instanceClassName)) {
return standardLibrary.getIntegerType();
}
if ("double".equals(instanceClassName) || "float".equals(instanceClassName)) {
return standardLibrary.getRealType();
}
try {
@SuppressWarnings("null")@NonNull ClassLoader classLoader = ecoreStereotype.getClass().getClassLoader();
Class<?> instanceClass = classLoader.loadClass(instanceClassName);
if (instanceClass != null) {
PrimitiveType behavioralClass = standardLibrary.getBehavioralClass(instanceClass);
if (behavioralClass != null) {
return behavioralClass;
}
instanceClass.getDeclaredMethod("compareTo", instanceClass);
// converter.queueReference(eObject2); // Defer synthesis till supertypes resolved
}
}
catch (Exception e) {
// converter.error("Unknown '" + instanceClassName + "'"); // Ignores e.g. byte[]
}
return null;
}
protected @Nullable PrimitiveType getPrimitiveTypeByName(org.eclipse.uml2.uml.@NonNull PrimitiveType umlPrimitiveType) {
String name = umlPrimitiveType.getName();
if (UMLUtil.isBoolean(umlPrimitiveType) || TypeId.BOOLEAN_NAME.equals(name)) {
return standardLibrary.getBooleanType();
}
if (UMLUtil.isInteger(umlPrimitiveType) || TypeId.INTEGER_NAME.equals(name)) {
return standardLibrary.getIntegerType();
}
if (UMLUtil.isReal(umlPrimitiveType) || TypeId.REAL_NAME.equals(name)) {
return standardLibrary.getRealType();
}
if (UMLUtil.isString(umlPrimitiveType) || TypeId.STRING_NAME.equals(name)) {
return standardLibrary.getStringType();
}
if (UMLUtil.isUnlimitedNatural(umlPrimitiveType) || TypeId.UNLIMITED_NATURAL_NAME.equals(name)) {
return standardLibrary.getUnlimitedNaturalType();
}
org.eclipse.uml2.uml.Package umlPackage = umlPrimitiveType.getPackage();
if ((umlPackage != null) && "EcorePrimitiveTypes".equals(umlPackage.getName())) { // FIXME Bug 412918 for extra cases
if ("EBigDecimal".equals(name)
|| "EFloat".equals(name) || "EFloatObject".equals(name)) {
return standardLibrary.getRealType();
}
else if ("EBigInteger".equals(name)
|| "EByte".equals(name) || "EByteObject".equals(name)
|| "EChar".equals(name) || "ECharacterObject".equals(name)
|| "ELong".equals(name) || "ELongObject".equals(name)
|| "EShortObject".equals(name) || "EShortObject".equals(name)) {
return standardLibrary.getIntegerType();
}
}
return null;
}
protected @Nullable PrimitiveType getPrimitiveTypeByOCLStereotype(org.eclipse.uml2.uml.@NonNull DataType umlDataType) {
if (umlDataType.getAppliedStereotype("OCLforUML::Integer") != null) {
return standardLibrary.getIntegerType();
}
if (umlDataType.getAppliedStereotype("OCLforUML::Real") != null) {
return standardLibrary.getRealType();
}
return null;
}
}