diff options
Diffstat (limited to 'plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.component/src/org/eclipse/papyrus/uml/diagram/component/expressions/UMLOCLFactory.java')
-rw-r--r-- | plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.component/src/org/eclipse/papyrus/uml/diagram/component/expressions/UMLOCLFactory.java | 390 |
1 files changed, 198 insertions, 192 deletions
diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.component/src/org/eclipse/papyrus/uml/diagram/component/expressions/UMLOCLFactory.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.component/src/org/eclipse/papyrus/uml/diagram/component/expressions/UMLOCLFactory.java index 5af8f4f18ff..5308c2f8ec6 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.component/src/org/eclipse/papyrus/uml/diagram/component/expressions/UMLOCLFactory.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.component/src/org/eclipse/papyrus/uml/diagram/component/expressions/UMLOCLFactory.java @@ -1,192 +1,198 @@ -/**
- * Copyright (c) 2014 CEA LIST.
- *
- * 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:
- * CEA LIST - Initial API and implementation
- */
-package org.eclipse.papyrus.uml.diagram.component.expressions;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EParameter;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.ocl.Environment;
-import org.eclipse.ocl.EvaluationEnvironment;
-import org.eclipse.ocl.ParserException;
-import org.eclipse.ocl.ecore.EcoreFactory;
-import org.eclipse.ocl.ecore.OCL.Helper;
-import org.eclipse.ocl.ecore.OCLExpression;
-import org.eclipse.ocl.ecore.Variable;
-import org.eclipse.ocl.options.ParsingOptions;
-import org.eclipse.papyrus.uml.diagram.component.part.UMLDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class UMLOCLFactory {
-
- /**
- * @generated
- */
- private final UMLAbstractExpression[] expressions;
-
- /**
- * @generated
- */
- private final String[] expressionBodies;
-
- /**
- * @generated
- */
- protected UMLOCLFactory() {
- this.expressions = new UMLAbstractExpression[9];
- this.expressionBodies = new String[] {
- "let base : String = \'Component\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$
- "let base : String = \'Port\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$
- "let base : String = \'Interface\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$
- "let base : String = \'Usage\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$
- "let base : String = \'Realization\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$
- "let base : String = \'Package\' in\r\nlet suffixes : Sequence(String) = Sequence {\'\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$
- "self.oclIsKindOf(uml::Interface)", //$NON-NLS-1$
- "self.oclIsKindOf(uml::Component) or self.oclIsKindOf(uml::Port)", //$NON-NLS-1$
- "self.name.concat(\'.file\') ", //$NON-NLS-1$
- };
- }
-
- /**
- * @generated
- */
- private static UMLOCLFactory getInstance() {
- UMLOCLFactory instance = UMLDiagramEditorPlugin.getInstance().getUMLOCLFactory();
- if (instance == null) {
- UMLDiagramEditorPlugin.getInstance().setUMLOCLFactory(instance = new UMLOCLFactory());
- }
- return instance;
- }
-
- /**
- * @generated
- */
- public static String getExpressionBody(int index) {
- return getInstance().expressionBodies[index];
- }
-
- /**
- * @generated
- */
- public static UMLAbstractExpression getExpression(int index, EClassifier context, Map<String, EClassifier> environment) {
- UMLOCLFactory cached = getInstance();
- if (index < 0 || index >= cached.expressions.length) {
- throw new IllegalArgumentException();
- }
- if (cached.expressions[index] == null) {
- cached.expressions[index] = getExpression(cached.expressionBodies[index], context, environment == null ? Collections.<String, EClassifier> emptyMap() : environment);
- }
- return cached.expressions[index];
- }
-
- /**
- * This is factory method, callers are responsible to keep reference to the return value if they want to reuse parsed expression
- *
- * @generated
- */
- public static UMLAbstractExpression getExpression(String body, EClassifier context, Map<String, EClassifier> environment) {
- return new Expression(body, context, environment);
- }
-
- /**
- * This method will become private in the next release
- *
- * @generated
- */
- public static UMLAbstractExpression getExpression(String body, EClassifier context) {
- return getExpression(body, context, Collections.<String, EClassifier> emptyMap());
- }
-
- /**
- * @generated
- */
- private static class Expression extends UMLAbstractExpression {
-
- /**
- * @generated
- */
- private final org.eclipse.ocl.ecore.OCL oclInstance;
-
- /**
- * @generated
- */
- private OCLExpression oclExpression;
-
- /**
- * @generated
- */
- public Expression(String body, EClassifier context, Map<String, EClassifier> environment) {
- super(body, context);
- oclInstance = org.eclipse.ocl.ecore.OCL.newInstance();
- initCustomEnv(oclInstance.getEnvironment(), environment);
- Helper oclHelper = oclInstance.createOCLHelper();
- oclHelper.setContext(context());
- try {
- oclExpression = oclHelper.createQuery(body());
- setStatus(IStatus.OK, null, null);
- } catch (ParserException e) {
- setStatus(IStatus.ERROR, e.getMessage(), e);
- }
- }
-
- /**
- * @generated
- */
- @Override
- @SuppressWarnings("rawtypes")
- protected Object doEvaluate(Object context, Map env) {
- if (oclExpression == null) {
- return null;
- }
- // on the first call, both evalEnvironment and extentMap are clear, for later we have finally, below.
- EvaluationEnvironment<?, ?, ?, ?, ?> evalEnv = oclInstance.getEvaluationEnvironment();
- // initialize environment
- for (Object nextKey : env.keySet()) {
- evalEnv.replace((String) nextKey, env.get(nextKey));
- }
- try {
- Object result = oclInstance.evaluate(context, oclExpression);
- return oclInstance.isInvalid(result) ? null : result;
- } finally {
- evalEnv.clear();
- oclInstance.setExtentMap(null); // clear allInstances cache, and get the oclInstance ready for the next call
- }
- }
-
- /**
- * @generated
- */
- private static void initCustomEnv(Environment<?, EClassifier, ?, ?, ?, EParameter, ?, ?, ?, ?, ?, ?> ecoreEnv, Map<String, EClassifier> environment) {
- // Use EObject as implicit root class for any object, to allow eContainer() and other EObject operations from OCL expressions
- ParsingOptions.setOption(ecoreEnv, ParsingOptions.implicitRootClass(ecoreEnv), EcorePackage.eINSTANCE.getEObject());
- for (String varName : environment.keySet()) {
- EClassifier varType = environment.get(varName);
- ecoreEnv.addElement(varName, createVar(ecoreEnv, varName, varType), false);
- }
- }
-
- /**
- * @generated
- */
- private static Variable createVar(Environment<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?> ecoreEnv, String name, EClassifier type) {
- Variable var = EcoreFactory.eINSTANCE.createVariable();
- var.setName(name);
- var.setType(ecoreEnv.getUMLReflection().getOCLType(type));
- return var;
- }
- }
-}
+/** + * Copyright (c) 2014 CEA LIST. + * + * 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: + * CEA LIST - Initial API and implementation + */ +package org.eclipse.papyrus.uml.diagram.component.expressions; + +import java.util.Collections; +import java.util.Map; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EParameter; +import org.eclipse.emf.ecore.EcorePackage; +import org.eclipse.ocl.Environment; +import org.eclipse.ocl.EvaluationEnvironment; +import org.eclipse.ocl.ParserException; +import org.eclipse.ocl.ecore.EcoreFactory; +import org.eclipse.ocl.ecore.OCL.Helper; +import org.eclipse.ocl.ecore.OCLExpression; +import org.eclipse.ocl.ecore.Variable; +import org.eclipse.ocl.options.ParsingOptions; +import org.eclipse.papyrus.uml.diagram.component.part.UMLDiagramEditorPlugin; + +/** + * @generated + */ +public class UMLOCLFactory { + + /** + * @generated + */ + private final UMLAbstractExpression[] expressions; + + /** + * @generated + */ + private final String[] expressionBodies; + + /** + * @generated + */ + protected UMLOCLFactory() { + this.expressions = new UMLAbstractExpression[9]; + this.expressionBodies = new String[] { + "let base : String = \'Component\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$ + "let base : String = \'Port\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$ + "let base : String = \'Interface\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$ + "let base : String = \'Usage\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$ + "let base : String = \'Realization\' in\r\nlet suffixes : Sequence(String) = Sequence {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$ + "let base : String = \'Package\' in\r\nlet suffixes : Sequence(String) = Sequence {\'\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'10\'} in \r\nlet space : Namespace = self.namespace in\r\nlet allMissed : Sequence(String) = suffixes->\r\n select(s : String | not space.member->exists(e : NamedElement | e.name = base.concat(s))\r\n ) in\r\nlet firstMissed : String = allMissed->first() in \r\nlet noMisses : Boolean = firstMissed.oclIsUndefined() in\r\nlet allNames : Set(String) = \r\n if noMisses \r\n then \r\n space.member->collect(e : NamedElement | \r\n if e = self or e.name.oclIsUndefined() or e.name.substring(1, e.name.size().min(base.size())) <> base\r\n then \'\' \r\n else e.name \r\n endif)->asSet()->excluding(\'\') else Set{\'not in use\'} \r\n endif in \r\nlet longestName : String = \r\n if noMisses\r\n then allNames->select(n : String | not allNames->exists(nn : String | nn.size() > n.size()))->asSequence()->first() \r\n else \'not in use\' \r\n endif in \r\nif noMisses then \r\n if longestName.oclIsUndefined() \r\n then base \r\n else longestName.concat(\'1\') \r\n endif \r\nelse \r\n base.concat(firstMissed) \r\nendif ", //$NON-NLS-1$ + "self.oclIsKindOf(uml::Interface)", //$NON-NLS-1$ + "self.oclIsKindOf(uml::Component) or self.oclIsKindOf(uml::Port)", //$NON-NLS-1$ + "self.name.concat(\'.file\') ", //$NON-NLS-1$ + }; + } + + /** + * @generated + */ + private static UMLOCLFactory getInstance() { + UMLOCLFactory instance = UMLDiagramEditorPlugin.getInstance().getUMLOCLFactory(); + if (instance == null) { + UMLDiagramEditorPlugin.getInstance().setUMLOCLFactory(instance = new UMLOCLFactory()); + } + return instance; + } + + /** + * @generated + */ + public static String getExpressionBody(int index) { + return getInstance().expressionBodies[index]; + } + + /** + * @generated + */ + public static UMLAbstractExpression getExpression(int index, EClassifier context, + Map<String, EClassifier> environment) { + UMLOCLFactory cached = getInstance(); + if (index < 0 || index >= cached.expressions.length) { + throw new IllegalArgumentException(); + } + if (cached.expressions[index] == null) { + cached.expressions[index] = getExpression(cached.expressionBodies[index], context, + environment == null ? Collections.<String, EClassifier>emptyMap() : environment); + } + return cached.expressions[index]; + } + + /** + * This is factory method, callers are responsible to keep reference to the return value if they want to reuse parsed expression + * + * @generated + */ + public static UMLAbstractExpression getExpression(String body, EClassifier context, + Map<String, EClassifier> environment) { + return new Expression(body, context, environment); + } + + /** + * This method will become private in the next release + * + * @generated + */ + public static UMLAbstractExpression getExpression(String body, EClassifier context) { + return getExpression(body, context, Collections.<String, EClassifier>emptyMap()); + } + + /** + * @generated + */ + private static class Expression extends UMLAbstractExpression { + + /** + * @generated + */ + private final org.eclipse.ocl.ecore.OCL oclInstance; + + /** + * @generated + */ + private OCLExpression oclExpression; + + /** + * @generated + */ + public Expression(String body, EClassifier context, Map<String, EClassifier> environment) { + super(body, context); + oclInstance = org.eclipse.ocl.ecore.OCL.newInstance(); + initCustomEnv(oclInstance.getEnvironment(), environment); + Helper oclHelper = oclInstance.createOCLHelper(); + oclHelper.setContext(context()); + try { + oclExpression = oclHelper.createQuery(body()); + setStatus(IStatus.OK, null, null); + } catch (ParserException e) { + setStatus(IStatus.ERROR, e.getMessage(), e); + } + } + + /** + * @generated + */ + @Override + @SuppressWarnings("rawtypes") + protected Object doEvaluate(Object context, Map env) { + if (oclExpression == null) { + return null; + } + // on the first call, both evalEnvironment and extentMap are clear, for later we have finally, below. + EvaluationEnvironment<?, ?, ?, ?, ?> evalEnv = oclInstance.getEvaluationEnvironment(); + // initialize environment + for (Object nextKey : env.keySet()) { + evalEnv.replace((String) nextKey, env.get(nextKey)); + } + try { + Object result = oclInstance.evaluate(context, oclExpression); + return oclInstance.isInvalid(result) ? null : result; + } finally { + evalEnv.clear(); + oclInstance.setExtentMap(null); // clear allInstances cache, and get the oclInstance ready for the next call + } + } + + /** + * @generated + */ + private static void initCustomEnv(Environment<?, EClassifier, ?, ?, ?, EParameter, ?, ?, ?, ?, ?, ?> ecoreEnv, + Map<String, EClassifier> environment) { + // Use EObject as implicit root class for any object, to allow eContainer() and other EObject operations from OCL expressions + ParsingOptions.setOption(ecoreEnv, ParsingOptions.implicitRootClass(ecoreEnv), + EcorePackage.eINSTANCE.getEObject()); + for (String varName : environment.keySet()) { + EClassifier varType = environment.get(varName); + ecoreEnv.addElement(varName, createVar(ecoreEnv, varName, varType), false); + } + } + + /** + * @generated + */ + private static Variable createVar(Environment<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?> ecoreEnv, + String name, EClassifier type) { + Variable var = EcoreFactory.eINSTANCE.createVariable(); + var.setName(name); + var.setType(ecoreEnv.getUMLReflection().getOCLType(type)); + return var; + } + } +} |