/** * <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.ArrayList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.henshin.interpreter.util.HashList; /** * Binary interface for containment constraints. * * @author Gregor Bonifer */ public class ContainmentConstraint implements BinaryConstraint { // Target variable: final Variable targetVariable; /** * Default constructor. * @param target Target variable. */ public ContainmentConstraint(Variable target) { this.targetVariable = target; } /* * (non-Javadoc) * @see org.eclipse.emf.henshin.interpreter.matching.constraints.BinaryConstraint#check(org.eclipse.emf.henshin.interpreter.matching.constraints.DomainSlot, org.eclipse.emf.henshin.interpreter.matching.constraints.DomainSlot) */ @Override public boolean check(DomainSlot containedSlot, DomainSlot containerSlot) { // Only locked slots may be valid. if (!containedSlot.locked) { return false; } // The value of the contained slot must be an element of the temporaryDomain // specified by the containment reference. if (containerSlot.locked) { return true; } // The source value must have a container. EObject container = containedSlot.value.eContainer(); if (container == null) { return false; } // Constraint is fulfilled if the containerSlot's temporaryDomain is // unrestricted or contains the required container. boolean result = (containerSlot.temporaryDomain == null) || containerSlot.temporaryDomain.contains(container); // Create a domain change: if (result) { DomainChange change = new DomainChange(containerSlot, containerSlot.temporaryDomain); containedSlot.remoteChangeMap.put(this, change); containerSlot.temporaryDomain = new HashList<EObject>(1); containerSlot.temporaryDomain.add(container); } // Done. return result; } }