/******************************************************************************* * Copyright (c) 2010-2015 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 * * Contributors: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ package de.tub.tfs.henshin.tggeditor.util.rule.copy; import java.util.HashSet; import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil.Copier; import org.eclipse.emf.henshin.model.Attribute; import org.eclipse.emf.henshin.model.Edge; import org.eclipse.emf.henshin.model.Graph; import org.eclipse.emf.henshin.model.GraphElement; import org.eclipse.emf.henshin.model.Mapping; import org.eclipse.emf.henshin.model.Node; import org.eclipse.emf.henshin.model.Rule; import org.eclipse.emf.henshin.model.impl.MappingListImpl; import de.tub.tfs.henshin.tggeditor.util.rule.concurrent.Test; public class Graph2GraphCopyMappingList extends MappingListImpl{ /** * */ private static final long serialVersionUID = 1L; private Graph graphSource; private Graph graphCopy; public Graph getGraphSource() { return graphSource; } public Graph getGraphCopy() { return graphCopy; } public Graph2GraphCopyMappingList(Graph graph) { super(); this.graphSource = graph; //this.graphCopy = GraphUtil.copy(this.graphSource); boolean islhs = graph.isLhs(); Rule rule = this.graphSource.getRule(); Copier copier = new Copier(); EObject result = copier.copy(rule); copier.copyReferences(); Rule ruleCopy = (Rule) result; if (islhs){ this.graphCopy = ruleCopy.getLhs(); }else{ this.graphCopy = ruleCopy.getRhs(); } boolean found = false; //Set<Node> copiedNodes = new HashSet<Node>(); for (Node nodeSource : this.graphSource.getNodes()) { for (Node nodeCopy : this.graphCopy.getNodes()) { if (isCopy(nodeSource, nodeCopy)) { super.add(nodeSource, nodeCopy); found =true; } } if (!found) throw new IllegalArgumentException("no copy node found"); } } public static boolean isCopy(Node n1, Node n2){//, Set<Node>copiedNodes){ //if (copiedNodes!=null && copiedNodes.contains(n2))return false; return !(n1==null || n2==null || n1 == n2 || n1.getType()!=null && !n1.getType().equals(n2.getType()) || n1.getGraph().getNodes().indexOf(n1)!=n2.getGraph().getNodes().indexOf(n2) || n1.getIncoming().size()!=n2.getIncoming().size() || n1.getOutgoing().size()!=n2.getOutgoing().size() ); //boolean re = concurrentMatches(n1, n2, null, null); //if (!re) System.out.println("WEIRD: COPIED NODE IS NO LONGER SAME"); //if (copiedNodes!=null && re) copiedNodes.add(n2); //return re; } public String toString(){ String r="Graph copy of "+graphSource+" Mapping: "; r+="["; for (Mapping m :this){ r+=Test.outNodeRepresentation(m.getOrigin())+"-->"+Test.outNodeRepresentation(m.getImage())+", \n"; } r+="]"; return r; } //NEW public static Graph copy(Graph graph){ Copier copier = new Copier(); EObject g = copier.copy(graph); copier.copyReferences(); return (Graph) g; } /** @Override public void move(int newPosition, Mapping object) { // TODO Auto-generated method stub } @Override public Mapping move(int newPosition, int oldPosition) { // TODO Auto-generated method stub return null; } @Override public boolean add(Mapping e) { // TODO Auto-generated method stub return false; } @Override public void add(int index, Mapping element) { // TODO Auto-generated method stub } @Override public boolean addAll(Collection<? extends Mapping> c) { // TODO Auto-generated method stub return false; } @Override public boolean addAll(int index, Collection<? extends Mapping> c) { // TODO Auto-generated method stub return false; } @Override public void clear() { // TODO Auto-generated method stub } **/ /** @Override public boolean remove(Object o) { // TODO Auto-generated method stub return false; } @Override public Mapping remove(int index) { // TODO Auto-generated method stub return null; } @Override public boolean removeAll(Collection<?> c) { // TODO Auto-generated method stub return false; } @Override public boolean retainAll(Collection<?> c) { // TODO Auto-generated method stub return false; } @Override public Mapping set(int index, Mapping element) { // TODO Auto-generated method stub return null; } /** @Override public Mapping add(Node origin, Node image) { // TODO Auto-generated method stub return null; } @Override public void add(Edge origin, Edge image) { // TODO Auto-generated method stub } @Override public Mapping add(Attribute origin, Attribute image) { // TODO Auto-generated method stub return null; } @Override public <E extends GraphElement> void add(E origin, E image) { // TODO Auto-generated method stub } **/ /** @Override public Mapping remove(Node origin, Node image) { // TODO Auto-generated method stub return null; } @Override public void remove(Edge origin, Edge image) { // TODO Auto-generated method stub } @Override public Mapping remove(Attribute origin, Attribute image) { // TODO Auto-generated method stub return null; } @Override public <E extends GraphElement> void remove(E origin, E image) { // TODO Auto-generated method stub } **/ public Node getImage(Node origin) { return super.getImage(origin, graphCopy); } public Edge getImage(Edge origin) { return super.getImage(origin, graphCopy); } public Attribute getImage(Attribute origin) { return super.getImage(origin, graphCopy); } public <E extends GraphElement> E getImage(E origin) { return super.getImage(origin, graphCopy); } }