blob: 400b564f3a372a97f70bae0b2b42519b1953d0ec [file] [log] [blame]
/*
* Copyright (c) 2005, 2018 IBM Corporation, CEA, and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* IBM - initial API and implementation
* Kenn Hussey (CEA) - 327039, 418466, 451350, 485756
* Kenn Hussey - 535301
*
*/
package org.eclipse.uml2.uml.internal.operations;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.uml2.uml.Duration;
import org.eclipse.uml2.uml.Enumeration;
import org.eclipse.uml2.uml.InstanceSpecification;
import org.eclipse.uml2.uml.InstanceValue;
import org.eclipse.uml2.uml.LiteralBoolean;
import org.eclipse.uml2.uml.LiteralInteger;
import org.eclipse.uml2.uml.LiteralReal;
import org.eclipse.uml2.uml.LiteralString;
import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
import org.eclipse.uml2.uml.OpaqueExpression;
import org.eclipse.uml2.uml.ParameterableElement;
import org.eclipse.uml2.uml.TimeExpression;
import org.eclipse.uml2.uml.Type;
import org.eclipse.uml2.uml.TypedElement;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.ValueSpecification;
import org.eclipse.uml2.uml.util.UMLSwitch;
/**
* <!-- begin-user-doc -->
* A static utility class that provides operations related to '<em><b>Value Specification</b></em>' model objects.
* <!-- end-user-doc -->
*
* <p>
* The following operations are supported:
* </p>
* <ul>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#booleanValue() <em>Boolean Value</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#integerValue() <em>Integer Value</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#isComputable() <em>Is Computable</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#isNull() <em>Is Null</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#realValue() <em>Real Value</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#stringValue() <em>String Value</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#unlimitedValue() <em>Unlimited Value</em>}</li>
* <li>{@link org.eclipse.uml2.uml.ValueSpecification#isCompatibleWith(org.eclipse.uml2.uml.ParameterableElement) <em>Is Compatible With</em>}</li>
* </ul>
*
* @generated
*/
public class ValueSpecificationOperations
extends PackageableElementOperations {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected ValueSpecificationOperations() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query isComputable() determines whether a value specification can be computed in a model. This operation cannot be fully defined in OCL. A conforming implementation is expected to deliver true for this operation for all ValueSpecifications that it can compute, and to compute all of those for which the operation is true. A conforming implementation is expected to be able to compute at least the value of all LiteralSpecifications.
* result = (false)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static boolean isComputable(ValueSpecification valueSpecification) {
return false;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query integerValue() gives a single Integer value when one can be computed.
* result = (null)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static int integerValue(ValueSpecification valueSpecification) {
throw new UnsupportedOperationException();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query booleanValue() gives a single Boolean value when one can be computed.
* result = (null)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static boolean booleanValue(ValueSpecification valueSpecification) {
throw new UnsupportedOperationException();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query stringValue() gives a single String value when one can be computed.
* result = (null)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static String stringValue(ValueSpecification valueSpecification) {
return null;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query unlimitedValue() gives a single UnlimitedNatural value when one can be computed.
* result = (null)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static int unlimitedValue(ValueSpecification valueSpecification) {
throw new UnsupportedOperationException();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query isNull() returns true when it can be computed that the value is null.
* result = (false)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static boolean isNull(ValueSpecification valueSpecification) {
return false;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query realValue() gives a single Real value when one can be computed.
* result = (null)
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static double realValue(ValueSpecification valueSpecification) {
throw new UnsupportedOperationException();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* <!-- begin-model-doc -->
* The query isCompatibleWith() determines if this ValueSpecification is compatible with the specified ParameterableElement. This ValueSpecification is compatible with ParameterableElement p if the kind of this ValueSpecification is the same as or a subtype of the kind of p. Further, if p is a TypedElement, then the type of this ValueSpecification must be conformant with the type of p.
* result = (self.oclIsKindOf(p.oclType()) and (p.oclIsKindOf(TypedElement) implies
* self.type.conformsTo(p.oclAsType(TypedElement).type)))
* <p>From package UML::Values.</p>
* @param valueSpecification The receiving '<em><b>Value Specification</b></em>' model object.
* <!-- end-model-doc -->
* @generated NOT
*/
public static boolean isCompatibleWith(
ValueSpecification valueSpecification, ParameterableElement p) {
if (valueSpecification.eClass().isInstance(p)
&& p instanceof TypedElement) {
Type type = valueSpecification.getType();
return type == null
? p.eGet(UMLPackage.Literals.TYPED_ELEMENT__TYPE, false) == null
: type.conformsTo(((ValueSpecification) p).getType());
}
return false;
}
protected static void setValue(ValueSpecification valueSpecification,
final String newValue) {
new UMLSwitch<Object>() {
@Override
public Object caseDuration(Duration duration) {
ValueSpecification expr = duration.getExpr();
return expr == null || expr instanceof Duration
? null
: doSwitch(expr);
}
@Override
public Object caseInstanceValue(InstanceValue instanceValue) {
Type type = instanceValue.getType();
if (type instanceof Enumeration) {
instanceValue.setInstance(
((Enumeration) type).getOwnedLiteral(newValue));
} else {
InstanceSpecification instance = instanceValue
.getInstance();
if (instance != null) {
ValueSpecification specification = instance
.getSpecification();
if (specification != null) {
return doSwitch(specification);
}
}
return null;
}
return instanceValue;
}
@Override
public Object caseLiteralBoolean(LiteralBoolean literalBoolean) {
literalBoolean
.setValue(Boolean.valueOf(newValue).booleanValue());
return literalBoolean;
}
@Override
public Object caseLiteralInteger(LiteralInteger literalInteger) {
literalInteger.setValue(Integer.parseInt(newValue));
return literalInteger;
}
@Override
public Object caseLiteralReal(LiteralReal literalReal) {
literalReal.setValue(Double.parseDouble(newValue));
return literalReal;
}
@Override
public Object caseLiteralString(LiteralString literalString) {
literalString.setValue(newValue);
return literalString;
}
@Override
public Object caseLiteralUnlimitedNatural(
LiteralUnlimitedNatural literalUnlimitedNatural) {
literalUnlimitedNatural.setValue(Integer.parseInt(newValue));
return literalUnlimitedNatural;
}
@Override
public Object caseOpaqueExpression(
OpaqueExpression opaqueExpression) {
EList<String> bodies = opaqueExpression.getBodies();
if (bodies.isEmpty()) {
bodies.add(newValue);
} else {
bodies.set(0, newValue);
}
return opaqueExpression;
}
@Override
public Object caseTimeExpression(TimeExpression timeExpression) {
ValueSpecification expr = timeExpression.getExpr();
return expr == null || expr instanceof TimeExpression
? null
: doSwitch(expr);
}
@Override
public Object defaultCase(EObject eObject) {
throw new UnsupportedOperationException();
}
}.doSwitch(valueSpecification);
}
} // ValueSpecificationOperations