package no.hal.scxml.generator; import no.hal.scxml.scxmlxt.ScxmlxtPackage; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EFactory; import org.eclipse.xtext.common.services.Ecore2XtextTerminalConverters; import org.eclipse.xtext.conversion.IValueConverter; import org.eclipse.xtext.conversion.ValueConverter; import org.eclipse.xtext.conversion.ValueConverterException; import org.eclipse.xtext.parsetree.AbstractNode; public class ScxmlxtTerminalConverters extends Ecore2XtextTerminalConverters { private static class IxesConverter implements IValueConverter<String> { String prefix, suffix; public IxesConverter(String prefix, String suffix) { this.prefix = prefix; this.suffix = suffix; } public String toValue(String s, AbstractNode node) { if (s != null) { if (prefix != null && s.startsWith(prefix)) { s = s.substring(prefix.length()); } if (suffix != null && s.endsWith(suffix)) { s = s.substring(0, s.length() - suffix.length()); } } return s; } public String toString(String value) { if (value != null) { if (prefix != null && (! value.startsWith(prefix))) { value = prefix + value.substring(prefix.length()); } if (suffix != null && (! value.endsWith(suffix))) { value = value + suffix; } } return value; } } private static class EDataTypeConverter<T> implements IValueConverter<T> { private EDataType eDataType; private IValueConverter<String> valueConverter; public EDataTypeConverter(EDataType eDataType, IValueConverter<String> valueConverter) { this.eDataType = eDataType; this.valueConverter = valueConverter; } private EFactory getEFactory() { return eDataType.getEPackage().getEFactoryInstance(); } public T toValue(String s, AbstractNode node) throws ValueConverterException { try { return (T)getEFactory().createFromString(eDataType, valueConverter != null ? valueConverter.toValue(s, node) : s); } catch (Exception e) { throw new ValueConverterException(e.getMessage(), node, e); } } public String toString(T value) { try { String s = getEFactory().convertToString(eDataType, value); return valueConverter != null ? valueConverter.toString(s) : s; } catch (Exception e) { return String.valueOf(value); } } }; @ValueConverter(rule = "URI_LITERAL") public IValueConverter<URI> URI_LITERAL() { return new EDataTypeConverter<URI>(ScxmlxtPackage.eINSTANCE.getEURI(), new IxesConverter("@", null)); } @ValueConverter(rule = "EOBJECT_URI_LITERAL") public IValueConverter<URI> EOBJECT_URI_LITERAL() { return new EDataTypeConverter<URI>(ScxmlxtPackage.eINSTANCE.getEURI(), new IxesConverter("�", null)); } @ValueConverter(rule = "SCRIPT_EXPRESSION") public IValueConverter<String> SCRIPT_EXPRESSION() { return new IxesConverter("[[", "]]"); } @ValueConverter(rule = "SCRIPT_STATEMENTS") public IValueConverter<String> SCRIPT_STATEMENTS() { return new IxesConverter("{{", "}}"); } }