blob: 6e1aa87abb0e20c1897fe699a9fe5dec6e5ea6ff [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2009 E.D.Willink 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 - Bug 254919, 296409
*
* </copyright>
*
* $Id: UMLTestReflection.java,v 1.3 2010/04/25 06:50:11 ewillink Exp $
*/
package org.eclipse.ocl.uml.tests;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.ocl.Environment;
import org.eclipse.ocl.expressions.OCLExpression;
import org.eclipse.ocl.tests.TestReflection;
import org.eclipse.ocl.uml.ExpressionInOCL;
import org.eclipse.ocl.uml.OCL;
import org.eclipse.ocl.uml.UMLEnvironment;
import org.eclipse.ocl.uml.UMLEnvironmentFactory;
import org.eclipse.ocl.uml.internal.OCLStandardLibraryImpl;
import org.eclipse.ocl.uml.internal.UMLReflectionImpl;
import org.eclipse.uml2.uml.CallOperationAction;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.Constraint;
import org.eclipse.uml2.uml.DataType;
import org.eclipse.uml2.uml.Enumeration;
import org.eclipse.uml2.uml.EnumerationLiteral;
import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Parameter;
import org.eclipse.uml2.uml.PrimitiveType;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.SendSignalAction;
import org.eclipse.uml2.uml.State;
import org.eclipse.uml2.uml.Type;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLUtil;
@SuppressWarnings("nls")
public class UMLTestReflection
extends UMLReflectionImpl
implements TestReflection<EObject, Package,
Type, Classifier, Class, DataType, PrimitiveType, Enumeration,
Operation, Parameter, Property, Property, Property,
EnumerationLiteral, State, CallOperationAction, SendSignalAction, Constraint>
{
public static class Static implements TestReflection.Static<EObject, Package,
Type, Classifier, Class, DataType, PrimitiveType, Enumeration,
Operation, Parameter, Property, Property, Property,
EnumerationLiteral, State, CallOperationAction, SendSignalAction, Constraint>
{
public static final Static INSTANCE = new Static();
public Static() {
org.eclipse.uml2.uml.UMLPackage.eINSTANCE.getClass();
org.eclipse.ocl.uml.UMLPackage.eINSTANCE.getClass();
}
public OCL createOCL(ResourceSet resourceSet) {
return OCL.newInstance(resourceSet);
}
public TestReflection<EObject, Package, Type, Classifier, Class, DataType, PrimitiveType, Enumeration, Operation, Parameter, Property, Property, Property, EnumerationLiteral, State, CallOperationAction, SendSignalAction, Constraint> createReflection(
Environment<Package, Classifier, Operation, Property, EnumerationLiteral, Parameter, State, CallOperationAction, SendSignalAction, Constraint, Class, EObject> environment) {
return new UMLTestReflection((UMLEnvironment) environment);
}
public ResourceSet createResourceSet() {
Environment.Registry.INSTANCE.registerEnvironment(
new UMLEnvironmentFactory().createEnvironment());
ResourceSet resourceSet = new ResourceSetImpl();
OCL.initialize(resourceSet);
// FIXME BUG 389765 workaround BUG 389542
(resourceSet == null
? Resource.Factory.Registry.INSTANCE
: resourceSet.getResourceFactoryRegistry())
.getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION,
UMLResource.Factory.INSTANCE);
// Make sure that the UML metamodel and primitive types
// libraries are loaded
umlMetamodel = (Package) resourceSet.getResource(
URI.createURI(UMLResource.UML_METAMODEL_URI),
true).getContents().get(0);
umlPrimitiveTypes = (Package) resourceSet.getResource(
URI.createURI(UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI),
true).getContents().get(0);
ecorePrimitiveTypes = (Package) resourceSet.getResource(
URI.createURI(UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI),
true).getContents().get(0);
return resourceSet;
}
public String getTestPlugInId() {
return PLUGIN_ID;
}
}
public static final String PLUGIN_ID = "org.eclipse.ocl.uml.tests";
public static OCL createOCL(ResourceSet resourceSet) {
OCL newInstance = OCL.newInstance(resourceSet);
String repairs = System.getProperty(PLUGIN_ID + ".repairs");
if (repairs != null)
newInstance.setParserRepairCount(Integer.parseInt(repairs));
return newInstance;
}
/**
* Map of %Key to value for denormalizing OCL test code.
*/
private Map<String, String> normalizers = null;
public UMLTestReflection(UMLEnvironment env) {
super(env);
}
protected static Package umlMetamodel;
protected static Package umlPrimitiveTypes;
protected static Package ecorePrimitiveTypes;
protected static Package oclMetamodel;
public void addSupertype(Class aClass, Class superType) {
aClass.getSuperClasses().add(superType);
}
public Class createClass() {
return UMLFactory.eINSTANCE.createClass();
}
public Comment createComment() {
return UMLFactory.eINSTANCE.createComment();
}
public void createGeneralization(Classifier special, Classifier general) {
special.createGeneralization(general);
}
public Package createNestedPackage(Package aPackage, String name) {
return aPackage.createNestedPackage(name);
}
public Property createOwnedAttribute(Class aClass, String name, Classifier type) {
return aClass.createOwnedAttribute(name, type);
}
public Class createOwnedClass(Package aPackage, String name, boolean isAbstract) {
return aPackage.createOwnedClass(name, isAbstract);
}
public Enumeration createOwnedEnumeration(Package aPackage, String name) {
return aPackage.createOwnedEnumeration(name);
}
public EnumerationLiteral createOwnedLiteral(Enumeration anEnumeration, String name) {
return anEnumeration.createOwnedLiteral(name);
}
public Operation createOwnedOperation(Class aClass, String name, EList<String> paramNames, EList<Type> paramTypes, Type type, boolean isQuery) {
Operation operation = aClass.createOwnedOperation(name, paramNames, paramTypes, type);
if (isQuery) {
operation.setIsQuery(true);
}
return operation;
}
public Operation createOwnedPrimitiveOperation(PrimitiveType aPrimitiveType, String name, EList<String> paramNames, EList<Type> paramTypes, Type type, boolean isQuery) {
Operation operation = aPrimitiveType.createOwnedOperation(name, paramNames, paramTypes, type);
if (isQuery) {
operation.setIsQuery(true);
}
return operation;
}
public PrimitiveType createOwnedPrimitiveType(Package aPackage, String name) {
return aPackage.createOwnedPrimitiveType(name);
}
public Property createOwnedReference(Class aClass, String name, Class type) {
return aClass.createOwnedAttribute(name, type);
}
public Package createPackage(String name) {
Package uPackage = UMLFactory.eINSTANCE.createPackage();
uPackage.setName(name);
return uPackage;
}
/* public void disposeResourceSet(ResourceSet resourceSet) {
if (resourceSet != null) {
if (DISPOSE_UML_METAMODEL) {
for (Resource res : resourceSet.getResources()) {
res.unload();
res.eAdapters().clear();
}
resourceSet.getResources().clear();
resourceSet.eAdapters().clear();
resourceSet = null;
umlMetamodel = null;
umlPrimitiveTypes = null;
ecorePrimitiveTypes = null;
oclMetamodel = null;
} else {
// unload and remove all resources but the UML Metamodel.
// Don't clear the resource set's adapter-list
Set<Resource> toPreserve = new java.util.HashSet<Resource>();
toPreserve.add(umlMetamodel.eResource());
toPreserve.add(umlPrimitiveTypes.eResource());
toPreserve.add(ecorePrimitiveTypes.eResource());
// toPreserve.add(oclExpressionTypes.eResource());
for (Resource res : resourceSet.getResources()) {
if (!toPreserve.contains(res)) {
res.unload();
res.eAdapters().clear();
}
}
resourceSet.getResources().retainAll(toPreserve);
}
}
// fruitPackage = null;
} */
public String denormalize(String key) {
if (normalizers == null) {
normalizers = new HashMap<String, String>();
normalizers.put("Reference", "Property");
normalizers.put("String", "\"String\"");
normalizers.put("uml", "UML");
}
return normalizers.get(key);
}
public Property getAttribute(Classifier classifier, String name, Type type) {
return classifier.getAttribute(name, type);
}
public Classifier getBigDecimal() {
return (PrimitiveType) ecorePrimitiveTypes.getOwnedType("EBigDecimal");
}
public Classifier getBigInteger() {
return (PrimitiveType) ecorePrimitiveTypes.getOwnedType("EBigInteger");
}
public OCLExpression<Classifier> getBodyExpression(Constraint constraint) {
return ((ExpressionInOCL) constraint.getSpecification()).getBodyExpression();
}
public Classifier getClassTypeContext() {
return (Classifier) umlMetamodel.getOwnedType("Class");
}
public Classifier getClassifierTypeContext() {
return (Classifier) umlMetamodel.getOwnedType("Classifier");
}
public Classifier getCollectionKindTypeContext() {
Package expressionsPackage = oclMetamodel.getNestedPackage("expressions");
return (Classifier) expressionsPackage.getOwnedType("CollectionKind");
}
public Classifier getCommentTypeContext() {
return (Classifier) umlMetamodel.getOwnedType("Comment");
}
public java.lang.Class<Constraint> getConstraintClass() {
return Constraint.class;
}
// public Classifier getDefaultSetType(Environment<Package, Classifier, Operation, Property, EnumerationLiteral, Parameter, State, CallOperationAction, SendSignalAction, Constraint, Class, EObject> environment) {
// return environment.getOCLStandardLibrary().getInvalid();
// }
public EPackage getEPackage(Package pkg) {
return UMLUtil.convertToEcore(pkg, null).iterator().next();
}
public PrimitiveType getEcoreBigDecimal() {
return (PrimitiveType) ecorePrimitiveTypes.getOwnedType("EBigDecimal");
}
public PrimitiveType getEcoreBigInteger() {
return (PrimitiveType) ecorePrimitiveTypes.getOwnedType("EBigInteger");
}
public PrimitiveType getEcoreLong() {
return (PrimitiveType) ecorePrimitiveTypes.getOwnedType("ELong");
}
public Package getEcorePrimitiveTypes() {
return ecorePrimitiveTypes;
}
public String getFruitModelPath() {
return "/model/OCLTest.uml";
}
public Classifier getMetaclass(String name) {
return (Classifier) umlMetamodel.getOwnedType(name);
}
public Classifier getMetametaclass(String name) {
return (Classifier) umlMetamodel.getOwnedType(name);
}
public Package getOCLMetaModel() {
return oclMetamodel;
}
public String getNsURI(Package aPackage) { // FIXME UOE
throw new UnsupportedOperationException(getClass().getName() + ".getNsURI");
}
public Type getOwnedType(Package aPackage, String name) {
return aPackage.getOwnedType(name);
}
public Classifier getOwner(Operation context) {
return (Classifier) context.getOwner();
}
public Package getResourcePackage(ResourceSet resourceSet, URI uri) {
Resource res = resourceSet.getResource(uri, true);
return (Package) res.getContents().get(0);
}
public Classifier getStringTypeContext() {
return OCLStandardLibraryImpl.INSTANCE.getString();
}
public PrimitiveType getUMLBoolean() {
return (PrimitiveType) umlPrimitiveTypes.getOwnedType("Boolean");
}
public PrimitiveType getUMLInteger() {
return (PrimitiveType) umlPrimitiveTypes.getOwnedType("Integer");
}
public PrimitiveType getUMLLong() {
return (PrimitiveType) ecorePrimitiveTypes.getOwnedType("ELong");
}
public Package getUMLMetamodel() {
return umlMetamodel;
}
public Package getUMLPrimitiveTypes() {
return umlPrimitiveTypes;
}
public PrimitiveType getUMLString() {
return (PrimitiveType) umlPrimitiveTypes.getOwnedType("String");
}
public PrimitiveType getUMLUnlimitedNatural() {
return (PrimitiveType) umlPrimitiveTypes.getOwnedType("UnlimitedNatural");
}
public int getUnlimitedValue() {
return LiteralUnlimitedNatural.UNLIMITED;
}
/* public Map<URI, URI> initRegistries() {
if (uriMap != null)
return uriMap;
uriMap = URIMappingRegistryImpl.INSTANCE.map();
URI oclStandardLibraryURI = URI.createURI(UMLEnvironment.OCL_STANDARD_LIBRARY_NS_URI);
if (uriMap.get(oclStandardLibraryURI) == null) { // If no mapping registered then must set up standalone context
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
Environment.Registry.INSTANCE.registerEnvironment(
new UMLEnvironmentFactory().createEnvironment());
String oclLocation = System.getProperty("org.eclipse.ocl.uml");
if (oclLocation == null)
AbstractTestSuite.fail("'org.eclipse.ocl.uml' property not defined; use the launch configuration to define it");
oclLocation = "file:/" + oclLocation;
uriMap.put(URI.createURI(UMLEnvironment.OCL_STANDARD_LIBRARY_NS_URI), URI.createURI(oclLocation + "/model/oclstdlib.uml"));
String resourcesLocation = System.getProperty("org.eclipse.uml2.uml.resources");
if (resourcesLocation == null)
AbstractTestSuite.fail("'org.eclipse.uml2.uml.resources' property not defined; use the launch configuration to define it");
resourcesLocation = "file:/" + resourcesLocation;
uriMap.put(URI.createURI(UMLResource.STANDARD_PROFILE_URI), URI.createURI(resourcesLocation + "/profiles/Standard.profile.uml"));
uriMap.put(URI.createURI(UMLResource.ECORE_PROFILE_URI), URI.createURI(resourcesLocation + "/profiles/Ecore.profile.uml"));
uriMap.put(URI.createURI(UMLResource.UML_METAMODEL_URI), URI.createURI(resourcesLocation + "/metamodels/UML.metamodel.uml"));
uriMap.put(URI.createURI(UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI), URI.createURI(resourcesLocation + "/libraries/UMLPrimitiveTypes.library.uml"));
uriMap.put(URI.createURI(UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI), URI.createURI(resourcesLocation + "/libraries/EcorePrimitiveTypes.library.uml"));
resourcesLocation = System.getProperty("org.eclipse.ocl");
if (resourcesLocation == null)
AbstractTestSuite.fail("'org.eclipse.ocl' property not defined; use the launch configuration to define it");
resourcesLocation = "file:/" + resourcesLocation;
uriMap.put(URI.createURI(OCL.OCL_METAMODEL_URI), URI.createURI(resourcesLocation + "/model/OCL.uml"));
}
OCLStandardLibraryImpl.INSTANCE.getClass(); // Ensure OCLStandardLibrary loaded before use
return uriMap;
} */
/* public void initResourceSet(ResourceSet resourceSet) {
// also make sure that the UML metamodel and primitive types
// libraries are loaded
if (umlMetamodel == null) {
umlMetamodel = (Package) resourceSet.getResource(
URI.createURI(UMLResource.UML_METAMODEL_URI),
true).getContents().get(0);
}
if (umlPrimitiveTypes == null) {
umlPrimitiveTypes = (Package) resourceSet.getResource(
URI.createURI(UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI),
true).getContents().get(0);
}
if (ecorePrimitiveTypes == null) {
ecorePrimitiveTypes = (Package) resourceSet.getResource(
URI.createURI(UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI),
true).getContents().get(0);
}
if (oclMetamodel == null) {
oclMetamodel = (Package) resourceSet.getResource(
URI.createURI(OCL.OCL_METAMODEL_URI),
true).getContents().get(0);
}
} */
public boolean isOrdered(String key) {
return false;
}
public boolean isUnique(String key) {
if ("nestedPackage".equals(key)) {
return true;
}
return false;
}
public void setAbstract(Class aClass, boolean isAbstract) {
aClass.setIsAbstract(isAbstract);
}
public void setIsOrdered(Property aProperty, boolean isOrdered) {
aProperty.setIsOrdered(isOrdered);
}
public void setIsQuery(Operation anOperation, boolean isQuery) {
anOperation.setIsQuery(isQuery);
}
public void setIsUnique(Property aProperty, boolean isUnique) {
aProperty.setIsUnique(isUnique);
}
public void setName(Class aClass, String name) {
aClass.setName(name);
}
public void setNsPrefix(Package aPackage, String name) {
// aPackage.setNsPrefix(name);
}
public void setNsURI(Package aPackage, String name) {
// aPackage.setNsPrefix(name);
}
public void setOperationUpper(Operation anOperation, int value) {
anOperation.setUpper(value);
}
public void setUpper(Property aProperty, int value) {
aProperty.setUpper(value);
}
public boolean usesCompareTo() {
return false;
}
}