/** * <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.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.henshin.interpreter.Assignment; import org.eclipse.emf.henshin.interpreter.util.InterpreterUtil; import org.eclipse.emf.henshin.model.Parameter; import org.eclipse.emf.henshin.model.Unit; /** * Default {@link Assignment} implementation. * * @author Christian Krause */ public class AssignmentImpl implements Assignment { // The target unit (actually final): protected Unit unit; // Map for storing the assigned values: protected final Map<Object,Object> values = new HashMap<Object,Object>(); // Whether this is a result assignment: protected final boolean isResult; /** * Default constructor. * @param rule Rule to be matched. */ public AssignmentImpl(Unit unit) { this (unit, false); } /** * Constructor. */ public AssignmentImpl(Unit unit, boolean isResult) { this.isResult = isResult; setUnit(unit); } /** * Constructor which copies an assignment. * @param assignment Assignment to be copied. */ public AssignmentImpl(Assignment assignment, boolean isResultAssignment) { this.isResult = isResultAssignment; setUnit(assignment.getUnit()); copyParameterValues(assignment); } /* * Set the internal unit for this unit application. */ protected void setUnit(Unit unit) { if (unit==null) { throw new NullPointerException("Unit cannot be null"); } this.unit = unit; } /* * Copy the parameter values from an assignment into this assignment. */ protected void copyParameterValues(Assignment assignment) { for (Parameter param : unit.getParameters()) { setParameterValue(param, assignment.getParameterValue(param)); } } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#getUnit() */ @Override public Unit getUnit() { return unit; } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#getParameterValue(org.eclipse.emf.henshin.model.Parameter) */ @Override public Object getParameterValue(Parameter param) { return values.get(param); } /* * Set a value or remove a key. */ protected void setValue(Object key, Object value) { if (value==null) { values.remove(key); } else { values.put(key, value); } } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#setParameterValue(org.eclipse.emf.henshin.model.Parameter, java.lang.Object) */ @Override public void setParameterValue(Parameter param, Object value) { setValue(param, value); } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#getParameterValues() */ @Override public List<Object> getParameterValues() { List<Object> paramValues = new ArrayList<Object>(); for (Parameter param : unit.getParameters()) { if (values.containsKey(param)) { paramValues.add(values.get(param)); } } return paramValues; } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#clear() */ @Override public void clear() { values.clear(); } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#isEmpty() */ @Override public boolean isEmpty() { return values.isEmpty(); } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return values.hashCode(); } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj instanceof Assignment) { Assignment a = (Assignment) obj; if (unit!=a.getUnit()) { return false; } if (isResult!=a.isResult()) { return false; } for (Parameter param : unit.getParameters()) { Object v1 = values.get(param); Object v2 = a.getParameterValue(param); if ((v1==null && v2!=null) || (v1!=null && !v1.equals(v2))) { return false; } } return true; } return false; } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { if (isResult) { return "Result assignment for unit '" + unit.getName() + "':\n" + toStringWithIndent(""); } else { return "Assignment for unit '" + unit.getName() + "':\n" + toStringWithIndent(""); } } /* * toString helper. */ protected String toStringWithIndent(String indent) { if (unit.getParameters().isEmpty()) { return indent + "- no parameters\n"; } String result = ""; for (Parameter param : unit.getParameters()) { Object value = getParameterValue(param); if (value!=null) { result = result + indent + "- parameter '" + param.getName() + "' => " + InterpreterUtil.objectToString(value) + "\n"; } } return result; } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.Assignment#isResultAssignment() */ @Override public boolean isResult() { return isResult; } }