/*
* Copyright (c) 2009 Borland Software Corporation
*
* 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:
* Sergey Gribovsky (Borland) - initial API and implementation
*/
package org.eclipse.uml2.diagram.common.parser.valuespec;
import java.util.Iterator;
import org.eclipse.emf.common.util.EList;
import org.eclipse.gmf.runtime.common.core.util.StringStatics;
import org.eclipse.uml2.diagram.common.Messages;
import org.eclipse.uml2.uml.Duration;
import org.eclipse.uml2.uml.Expression;
import org.eclipse.uml2.uml.InstanceSpecification;
import org.eclipse.uml2.uml.InstanceValue;
import org.eclipse.uml2.uml.Interval;
import org.eclipse.uml2.uml.LiteralBoolean;
import org.eclipse.uml2.uml.LiteralInteger;
import org.eclipse.uml2.uml.LiteralNull;
import org.eclipse.uml2.uml.LiteralString;
import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
import org.eclipse.uml2.uml.OpaqueExpression;
import org.eclipse.uml2.uml.TimeExpression;
import org.eclipse.uml2.uml.ValueSpecification;
import org.eclipse.uml2.uml.util.UMLSwitch;
public class ValueSpecificationParserUtil {
public static String getEditString(ValueSpecification valueSpecification) {
UMLSwitch<String> valueSpecificationSwitch = new UMLSwitch<String>() {
@Override
public String caseDuration(Duration duration) {
return ValueSpecificationParserUtil.getEditString(duration.getExpr());
}
@Override
public String caseExpression(Expression expression) {
StringBuffer expressionDenotation = new StringBuffer();
String symbol = expression.getSymbol();
if (symbol != null) {
expressionDenotation.append(symbol);
}
EList<ValueSpecification> operands = expression.getOperands();
if (!operands.isEmpty()) {
expressionDenotation.append('(');
for (Iterator<ValueSpecification> operandsIterator = operands.iterator(); operandsIterator.hasNext();) {
ValueSpecification operand = operandsIterator.next();
expressionDenotation.append(ValueSpecificationParserUtil.getEditString(operand));
if (operandsIterator.hasNext()) {
expressionDenotation.append(',');
}
}
expressionDenotation.append('(');
}
return expressionDenotation.toString();
}
@Override
public String caseInstanceValue(InstanceValue instanceValue) {
InstanceSpecification instanceSpecification = instanceValue.getInstance();
if (instanceSpecification == null) {
return StringStatics.BLANK;
}
return instanceSpecification.getName();
}
@Override
public String caseInterval(Interval interval) {
ValueSpecification min = interval.getMin();
ValueSpecification max = interval.getMax();
if (min == null && max == null) {
return StringStatics.BLANK;
}
StringBuffer intervalDenotation = new StringBuffer();
if (min != null) {
intervalDenotation.append(ValueSpecificationParserUtil.getEditString(min));
}
intervalDenotation.append(".."); //$NON-NLS-1$
if (max != null) {
intervalDenotation.append(ValueSpecificationParserUtil.getEditString(max));
}
return super.caseInterval(interval);
}
@Override
public String caseLiteralBoolean(LiteralBoolean literalBoolean) {
return literalBoolean.isValue() ? Boolean.TRUE.toString() : Boolean.FALSE.toString();
}
@Override
public String caseLiteralInteger(LiteralInteger literalInteger) {
return Integer.toString(literalInteger.getValue());
}
@Override
public String caseLiteralNull(LiteralNull literalNull) {
return Messages.ValueSpecificationParserUtil_literal_null;
}
@Override
public String caseLiteralString(LiteralString literalString) {
String value = literalString.getValue();
return value != null ? value : StringStatics.BLANK;
}
@Override
public String caseLiteralUnlimitedNatural(LiteralUnlimitedNatural literalUnlimitedNatural) {
return "*"; //$NON-NLS-1$
}
@Override
public String caseOpaqueExpression(OpaqueExpression opaqueExpression) {
StringBuffer opaqueExpressionDenotation = new StringBuffer();
EList<String> languages = opaqueExpression.getLanguages();
if (!languages.isEmpty()) {
opaqueExpressionDenotation.append('{');
for (Iterator<String> languagesIterator = languages.iterator(); languagesIterator.hasNext();) {
opaqueExpressionDenotation.append(languagesIterator.next());
}
opaqueExpressionDenotation.append('}');
}
EList<String> bodies = opaqueExpression.getBodies();
for (Iterator<String> bodiesIterator = bodies.iterator(); bodiesIterator.hasNext();) {
opaqueExpressionDenotation.append(bodiesIterator.next());
if (bodiesIterator.hasNext()) {
opaqueExpressionDenotation.append(' ');
}
}
return opaqueExpressionDenotation.toString();
}
@Override
public String caseTimeExpression(TimeExpression timeExpression) {
return ValueSpecificationParserUtil.getEditString(timeExpression.getExpr());
}
};
return valueSpecificationSwitch.doSwitch(valueSpecification);
}
}