/** * <copyright> * </copyright> * * */ package org.emftext.term.propositional.expression.resource.expression.analysis; /** * A default implementation for token resolvers. Generated token resolvers * delegate calls to this class to convert text (i.e., tokens) to Java objects. * This default implementation tries to perform this conversion using the * EMF-based data type serialization mechanism using * org.eclipse.emf.ecore.util.EcoreUtil.createFromString(). * * In addition, enumeration literals are converted to the respective literal * object, if the text (i.e., the token) matches the literal. * * For boolean attributes the token is considered to represent <code>true</code> * if it matches the name of the attribute. Attributes that have names like * <code>isFoo</code> are also interpret as <code>true</code> if the text is * <code>foo</code>. * * The behavior of this resolving can be customized by either changing the * generated token resolver classes or by using custom EMF data type converters. */ public class ExpressionDefaultTokenResolver implements org.emftext.term.propositional.expression.resource.expression.IExpressionTokenResolver { private java.util.Map<?, ?> options; private boolean escapeKeywords; /** * This constructor is used by token resolvers that were generated before EMFText * 1.4.0. It does not enable automatic escaping and unescaping of keywords. */ public ExpressionDefaultTokenResolver() { this(false); } /** * This constructor is used by token resolvers that were generated with EMFText * 1.4.0 and later releases. It can optionally enable automatic escaping and * unescaping of keywords. */ public ExpressionDefaultTokenResolver(boolean escapeKeywords) { super(); this.escapeKeywords = escapeKeywords; } public void resolve(String lexem, org.eclipse.emf.ecore.EStructuralFeature feature, org.emftext.term.propositional.expression.resource.expression.IExpressionTokenResolveResult result) { resolve(lexem, feature, result, null, null, null); } public void resolve(String lexem, org.eclipse.emf.ecore.EStructuralFeature feature, org.emftext.term.propositional.expression.resource.expression.IExpressionTokenResolveResult result, String suffix, String prefix, String escapeCharacter) { // Step 1: unescape keywords if required if (escapeKeywords && lexem.startsWith("_")) { for (String keyword : org.emftext.term.propositional.expression.resource.expression.grammar.ExpressionGrammarInformationProvider.INSTANCE.getKeywords()) { if (lexem.endsWith(keyword)) { String keywordPrefix = lexem.substring(0, lexem.length() - keyword.length()); if (keywordPrefix.matches("_+")) { lexem = lexem.substring(1); break; } } } } // Step 2: remove prefix, suffix and unescape escaped suffixes // Step 2a: remove prefix if (prefix != null) { int count = prefix.length(); lexem = lexem.substring(count); } // Step 2b: remove suffix if (suffix != null) { int count = suffix.length(); lexem = lexem.substring(0, lexem.length() - count ); // take care of the escape character (may be null) // Step 2c: replaced escaped suffixes and escaped escape sequences if (escapeCharacter != null) { lexem = lexem.replace(escapeCharacter + suffix, suffix); lexem = lexem.replace(escapeCharacter + escapeCharacter, escapeCharacter); } } // Step 3: convert text to Java object if (feature instanceof org.eclipse.emf.ecore.EAttribute) { org.eclipse.emf.ecore.EClassifier featureType = feature.getEType(); if (featureType instanceof org.eclipse.emf.ecore.EEnum) { org.eclipse.emf.ecore.EEnumLiteral literal = ((org.eclipse.emf.ecore.EEnum) featureType).getEEnumLiteralByLiteral(lexem); if (literal != null) { result.setResolvedToken(literal.getInstance()); return; } else { result.setErrorMessage("Could not map lexem '" + lexem + "' to enum '" + featureType.getName() + "'."); return; } } else if (featureType instanceof org.eclipse.emf.ecore.EDataType) { try { result.setResolvedToken(org.eclipse.emf.ecore.util.EcoreUtil.createFromString((org.eclipse.emf.ecore.EDataType) featureType, lexem)); } catch (Exception e) { result.setErrorMessage("Could not convert '" + lexem + "' to '" + featureType.getName() + "'."); } String typeName = featureType.getInstanceClassName(); if (typeName.equals("boolean") || java.lang.Boolean.class.getName().equals(typeName)) { String featureName = feature.getName(); boolean featureNameMatchesLexem = featureName.equals(lexem); if (featureNameMatchesLexem) { result.setResolvedToken(true); return; } if (featureName.length() > 2 && featureName.startsWith("is")) { if ((featureName.substring(2, 3).toLowerCase() + featureName.substring(3)).equals(lexem)) { result.setResolvedToken(true); return; } } if (Boolean.parseBoolean(lexem)) { result.setResolvedToken(true); return; } } } else { assert false; } } else { result.setResolvedToken(lexem); return; } } public String deResolve(Object value, org.eclipse.emf.ecore.EStructuralFeature feature, org.eclipse.emf.ecore.EObject container) { return deResolve(value, feature, container, null, null, null); } public String deResolve(Object value, org.eclipse.emf.ecore.EStructuralFeature feature, org.eclipse.emf.ecore.EObject container, String prefix, String suffix, String escapeCharacter) { // Step 1: convert Java object to text String result = ""; if (value != null) { result = value.toString(); } // Step 2: escape suffixes, add prefix and suffix // Step 2a: escaped suffix if (suffix != null) { // take care of the escape character (may be null) if (escapeCharacter != null) { result = result.replace(escapeCharacter, escapeCharacter + escapeCharacter); result = result.replace(suffix, escapeCharacter + suffix); } // Step 2b: append suffix result += suffix; } // Step 2c: prepend prefix if (prefix != null) { result = prefix + result; } // Step 3: escape keywords if required if (escapeKeywords && result != null) { // Escape keywords if required for (String keyword : org.emftext.term.propositional.expression.resource.expression.grammar.ExpressionGrammarInformationProvider.INSTANCE.getKeywords()) { if (result.endsWith(keyword)) { String keywordPrefix = result.substring(0, result.length() - keyword.length()); if (keywordPrefix.matches("_*")) { result = "_" + result; break; } } } } return result; } /** * This method can be used to disable automatic escaping and unescaping of tokens * that match keywords of the syntax. */ public void setEscapeKeywords(boolean escapeKeywords) { this.escapeKeywords = escapeKeywords; } public void setOptions(java.util.Map<?, ?> options) { this.options = options; } public java.util.Map<?, ?> getOptions() { return options; } }