/**
  * Sets the value of an opaque expression, using a string value.
  *
  * @param specification the opaque expression to update
  * @param language the specified language
  * @param value the new value
  */
 public static void restoreOpaqueExpression(
     org.eclipse.uml2.uml.OpaqueExpression specification, String language, String value) {
   OpaqueExpressionUtil.setBodyForLanguage(specification, language, value);
 }
 /**
  * Get a string representing of a ValueSpecification
  *
  * @param specification
  */
 public static String getSpecificationValue(ValueSpecification specification) {
   String value = ""; // $NON-NLS-1$
   if (specification != null && specification.eClass() != null) {
     switch (specification.eClass().getClassifierID()) {
       case UMLPackage.LITERAL_STRING:
         value = ((LiteralString) specification).getValue();
         break;
       case UMLPackage.LITERAL_BOOLEAN:
         value = Boolean.toString(((LiteralBoolean) specification).booleanValue());
         break;
       case UMLPackage.LITERAL_INTEGER:
         value = Integer.toString(((LiteralInteger) specification).getValue());
         break;
       case UMLPackage.LITERAL_UNLIMITED_NATURAL:
         value = Integer.toString(((LiteralUnlimitedNatural) specification).getValue());
         if ("-1".equals(value)) { // $NON-NLS-1$
           value = UNLIMITED_KEYWORD; // $NON-NLS-1$
         }
         break;
       case UMLPackage.LITERAL_NULL:
         break;
       case UMLPackage.OPAQUE_EXPRESSION:
         OpaqueExpression exp = (OpaqueExpression) specification;
         if (!exp.getLanguages().isEmpty()) {
           value =
               OpaqueExpressionUtil.getBodyForLanguage(
                   exp, exp.getLanguages().get(0)); // $NON-NLS-1$				
         }
         break;
       case UMLPackage.INSTANCE_VALUE:
         value = ((InstanceValue) specification).getInstance().getName();
         break;
       case UMLPackage.EXPRESSION:
         Expression expr = (Expression) specification;
         if (!expr.getOperands().isEmpty()) {
           StringBuffer operandsBuff = new StringBuffer(expr.getSymbol());
           operandsBuff.append("(");
           int initialLength = operandsBuff.length();
           for (ValueSpecification operand : expr.getOperands()) {
             if (operandsBuff.length() > initialLength) {
               operandsBuff.append(",");
             }
             operandsBuff.append(getSpecificationValue(operand));
           }
           operandsBuff.append(")");
           value = operandsBuff.toString();
         } else {
           value = expr.getSymbol();
         }
         break;
       case UMLPackage.STRING_EXPRESSION:
         // TODO
         break;
       case UMLPackage.DURATION:
         Duration durationExpr = (Duration) specification;
         if (durationExpr.getExpr() != null) {
           value = getSpecificationValue(durationExpr.getExpr());
         } else if (durationExpr.getObservations().size() > 0) {
           value = durationExpr.getObservations().get(0).getName();
         }
         break;
       case UMLPackage.TIME_EXPRESSION:
         TimeExpression timeExpr = (TimeExpression) specification;
         if (timeExpr.getExpr() != null) {
           value = getSpecificationValue(timeExpr.getExpr());
         } else if (timeExpr.getObservations().size() > 0) {
           value = timeExpr.getObservations().get(0).getName();
         }
         break;
       case UMLPackage.INTERVAL:
       case UMLPackage.TIME_INTERVAL:
       case UMLPackage.DURATION_INTERVAL:
         Interval interval = (Interval) specification;
         String min = getSpecificationValue(interval.getMin());
         String max = getSpecificationValue(interval.getMax());
         value = String.format(INTERVAL_FORMAT, min, max);
         break;
       default:
         {
           break;
         }
     }
   }
   return value;
 }
 /**
  * Sets the value of an opaque expression, using a string value
  *
  * @param specification the opaque expression to update
  * @param value the new value
  */
 public static void restoreOpaqueExpression(
     org.eclipse.uml2.uml.OpaqueExpression specification, String value) {
   // save in "UML" language, but should be desactivable
   OpaqueExpressionUtil.setBodyForLanguage(specification, "UML", value);
 }