/**
* <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.matching.constraints;
import java.util.Iterator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
/**
* This constraint checks the value of an attribute. The attribute
* value should be either a constant or the value of a parameter.
* If the parameter value is not set yet, it will be set to the
* value of the attribute.
*/
public class AttributeConstraint implements UnaryConstraint {
// Target attribute:
final EAttribute attribute;
// Value (either constant or a parameter name):
final Object value;
// Constant attribute value or parameter name?
final boolean isConstantValue;
/**
* Default constructor.
* @param attribute Target attribute.
* @param value Either fixed value or a parameter name.
* @param isConstantValue Whether the value is a constant or a parameter name.
*/
public AttributeConstraint(EAttribute attribute, Object value, boolean isConstantValue) {
this.attribute = attribute;
this.value = value;
this.isConstantValue = isConstantValue;
}
/*
* (non-Javadoc)
* @see org.eclipse.emf.henshin.interpreter.matching.constraints.UnaryConstraint#check(org.eclipse.emf.henshin.interpreter.matching.constraints.DomainSlot)
*/
@Override
public boolean check(DomainSlot slot) {
// Constant attribute value?
if (isConstantValue) {
// Slot locked already?
if (slot.locked) {
Object attValue = slot.value.eGet(attribute);
return (value==null) ? (attValue==null) : (attValue!=null && attValue.equals(value));
}
// Remove illegal objects from the slot:
//int size = slot.domain.size();
Iterator<EObject> itr = slot.domain.iterator();
while(itr.hasNext()){
EObject domainObject = itr.next();
if (value == null){
if (domainObject.eGet(attribute) != null) {
itr.remove();
}
} else {
if (!value.equals(domainObject.eGet(attribute))) {
itr.remove();
}
}
}
// FIXME: This is different to the official Henshin engine, check whether this is required
/*for (int i=size-1; i>=0; i--) {
EObject domainObject = slot.domain.get(i);
if (value==null) {
if (domainObject.eGet(attribute) != null) {
slot.domain.remove(i);
}
} else {
if (!value.equals(domainObject.eGet(attribute))) {
slot.domain.remove(i);
}
}
}*/
// Slot should not be empty:
return !slot.domain.isEmpty();
}
// Otherwise the value is a parameter name:
else {
// If the slot is not locked ignore the parameter constraint.
if (!slot.locked) {
return true;
}
// Get the attribute value and the parameter name:
Object attValue = slot.value.eGet(attribute);
String paramName = (String) value;
// Parameter not set yet?
if (!slot.conditionHandler.isSet(paramName)) {
// Try to initialize the parameter with attributeValue. Might fail due to attribute conditions.
boolean ok = slot.conditionHandler.setParameter(paramName, attValue);
if (!ok) {
slot.conditionHandler.unsetParameter(paramName);
}
return ok;
} else {
// Get the parameter value and treat it like a constant:
Object paramValue = slot.conditionHandler.getParameter(paramName);
return (paramValue==null) ? (attValue==null) : paramValue.equals(attValue);
}
}
}
}