/** * <copyright> * Copyright (c) 2010-2014 Henshin developers. 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 * </copyright> */ package org.eclipse.emf.henshin.interpreter.info; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.StringTokenizer; import org.eclipse.emf.henshin.model.AttributeCondition; import org.eclipse.emf.henshin.model.Parameter; import org.eclipse.emf.henshin.model.Rule; public class ConditionInfo { private Map<String, Collection<String>> conditionParameters; public ConditionInfo(Rule rule) { this.conditionParameters = new HashMap<String, Collection<String>>(); Collection<String> parameterNames = new ArrayList<String>(); for (Parameter parameter : rule.getParameters()) { parameterNames.add(parameter.getName()); } for (AttributeCondition condition : rule.getAttributeConditions()) { String conditionText = condition.getConditionText(); Collection<String> usedParameters = extractParameter(conditionText, parameterNames); conditionParameters.put(conditionText, usedParameters); } } private Collection<String> extractParameter(String testString, Collection<String> parameterNames) { Collection<String> usedParameters = new HashSet<String>(); StringTokenizer quoteParser = new StringTokenizer(testString, "\"\'"); while (quoteParser.hasMoreElements()) { String nonQuotedString = quoteParser.nextToken(); StringTokenizer variableParser = new StringTokenizer(nonQuotedString, ".,()\t\r\n<>=!+[] "); while (variableParser.hasMoreElements()) { String subString = variableParser.nextToken(); for (String parameterName : parameterNames) { if (parameterName.equals(subString)) { usedParameters.add(parameterName); } } } // discard the quoted part if (quoteParser.hasMoreElements()) quoteParser.nextElement(); } return usedParameters; } /** * Get the condition parameters. This is a map from condition tests to * collections of used parameters in the condition texts. * @return the conditionParameters The condition parameters. */ public Map<String, Collection<String>> getConditionParameters() { return conditionParameters; } }