| /* |
| * Copyright (c) 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others. |
| * 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: |
| * Martin Fluegge - initial API and implementation |
| */ |
| package org.eclipse.emf.cdo.dawn.gmf.util; |
| |
| /** |
| * |
| * @author Martin Fluegge |
| */ |
| |
| //import org.eclipse.emf.cdo.internal.dawn.bundle.OM; |
| |
| import org.eclipse.emf.cdo.dawn.internal.util.bundle.OM; |
| import org.eclipse.emf.cdo.dawn.util.exceptions.EClassIncompatibleException; |
| |
| import org.eclipse.net4j.util.om.trace.ContextTracer; |
| |
| import org.eclipse.emf.common.notify.Adapter; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EAnnotation; |
| import org.eclipse.emf.ecore.EAttribute; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EGenericType; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EOperation; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.emf.ecore.xmi.XMIResource; |
| import org.eclipse.emf.ecore.xmi.XMLHelper; |
| import org.eclipse.emf.ecore.xmi.XMLResource; |
| import org.eclipse.emf.ecore.xmi.impl.XMIHelperImpl; |
| import org.eclipse.emf.ecore.xmi.impl.XMILoadImpl; |
| import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; |
| import org.eclipse.emf.ecore.xmi.impl.XMISaveImpl; |
| import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl; |
| |
| import org.eclipse.core.runtime.FileLocator; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor; |
| import org.eclipse.gmf.runtime.notation.Bounds; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.gmf.runtime.notation.Edge; |
| import org.eclipse.gmf.runtime.notation.Node; |
| import org.eclipse.gmf.runtime.notation.RelativeBendpoints; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint; |
| |
| import java.io.BufferedReader; |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.FileReader; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.StringWriter; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * @since 1.0 |
| */ |
| public class DawnResourceHelper |
| { |
| private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, DawnResourceHelper.class); |
| |
| public static String getXmiId(EObject eObject) |
| { |
| Resource xmiResource = eObject.eResource(); |
| if (xmiResource == null) |
| { |
| return null; |
| } |
| |
| return ((XMLResource)xmiResource).getID(eObject); |
| } |
| |
| public static String getXmiId(EObject eObject, Resource xmiResource) |
| { |
| if (xmiResource == null) |
| { |
| return null; |
| } |
| |
| return ((XMLResource)xmiResource).getID(eObject); |
| } |
| |
| public static void setXmiId(EObject eObject, String id) |
| { |
| Resource xmiResource = eObject.eResource(); |
| if (xmiResource != null) |
| { |
| ((XMLResource)xmiResource).setID(eObject, id); |
| } |
| else |
| { |
| if (TRACER.isEnabled()) |
| { |
| TRACER.trace("Could set xmi id, because object is not attached to a resource!"); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| // public static String resourceToString(Resource res) |
| // { |
| // |
| // StringBuffer s = new StringBuffer(); |
| // Diagram dia = null; |
| // for (Object o : res.getContents()) |
| // { |
| // LOG.info(o); |
| // if (o instanceof Diagram) |
| // { |
| // dia = (Diagram)o; |
| // break; |
| // } |
| // } |
| // |
| // LOG.info("-----------------------------------------------------"); |
| // |
| // LOG.info("Diagram" + dia + ""); |
| // if (dia != null) |
| // { |
| // try |
| // { |
| // for (Object o : dia.getChildren()) |
| // { |
| // Node n = (Node)o; |
| // EObject element = n.getElement(); |
| // |
| // LOG.info(o + " (" + ResourceHelper.getXmiId((EObject)o) + ")"); |
| // |
| // for (EAttribute attribute : element.eClass().getEAllAttributes()) |
| // { |
| // LOG.info("\t" + attribute.getName() + ": " + element.eGet(attribute)); |
| // } |
| // |
| // LOG.info("- LayoutContraint: " + n.getLayoutConstraint() + ""); |
| // } |
| // |
| // EObject semanticConainer = dia.getElement(); |
| // LOG.info("SemanticConatiner" + semanticConainer + ""); |
| // |
| // for (EObject k : semanticConainer.eContents()) |
| // { |
| // LOG.info("Semantic Container Element: " + k + " (" + ResourceHelper.getXmiId(k) + ")" + ""); |
| // } |
| // } |
| // catch (Exception e) |
| // { |
| // e.printStackTrace(); |
| // } |
| // |
| // } |
| // LOG.info("-----------------------------------------------------"); |
| // return s.toString(); |
| // } |
| |
| public static Resource loadFromFile(String file, ResourceSet rsSet) |
| { |
| URI uri = URI.createURI("file:/" + file); |
| |
| Resource res = rsSet.getResource(uri, true); |
| return res; |
| } |
| |
| public static void writeToFile(String path, String xml) throws IOException |
| { |
| File file = new File(path); |
| FileWriter writer = new FileWriter(file); |
| writer.write(xml); |
| writer.close(); |
| } |
| |
| public static String saveToXML(XMLResource resource) throws IOException |
| { |
| |
| resource.setXMLVersion("1.0"); |
| |
| Map<Object, Object> saveOptions = new HashMap<Object, Object>(); |
| // options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE); |
| // options.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); |
| // options.put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE); |
| saveOptions.putAll(resource.getDefaultSaveOptions()); |
| saveOptions.put(XMIResource.OPTION_DECLARE_XML, Boolean.TRUE); |
| saveOptions.put(XMIResource.OPTION_PROCESS_DANGLING_HREF, XMIResource.OPTION_PROCESS_DANGLING_HREF_DISCARD); |
| saveOptions.put(XMIResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); |
| saveOptions.put(XMIResource.OPTION_USE_XMI_TYPE, Boolean.TRUE); |
| saveOptions.put(XMIResource.OPTION_SAVE_TYPE_INFORMATION, Boolean.TRUE); |
| saveOptions.put(XMIResource.OPTION_SKIP_ESCAPE_URI, Boolean.FALSE); |
| saveOptions.put(XMIResource.OPTION_ENCODING, "UTF-8"); |
| |
| final XMLHelper xmlHelper = new XMIHelperImpl(resource); |
| |
| XMISaveImpl x = new XMISaveImpl(xmlHelper); |
| |
| StringWriter sw = new StringWriter(); |
| x.save(resource, sw, saveOptions); |
| return sw.toString(); |
| } |
| |
| public static Resource loadFromXML(String xml, ResourceSet rsSet) throws IOException |
| { |
| final Resource res; |
| |
| res = new XMIResourceImpl(); |
| final XMLHelper xmlHelper = new XMLHelperImpl(); |
| ByteArrayInputStream stringreader = new ByteArrayInputStream(xml.getBytes()); |
| XMILoadImpl xmiload = new XMILoadImpl(xmlHelper); |
| xmiload.load((XMLResource)res, stringreader, Collections.EMPTY_MAP); |
| |
| /* setdummy URI */ |
| if (res.getURI() == null) |
| { |
| res.setURI(URI.createURI("")); |
| } |
| return res; |
| } |
| |
| /** |
| * returns the diagram from the resource if no diagram can be found it returns null. |
| * |
| * @param res |
| * @return if it exists the diagram otherwise null |
| */ |
| public static Diagram getDiagramFromResource(Resource res) |
| { |
| for (Object o : res.getContents()) |
| { |
| if (o instanceof Diagram) |
| { |
| return (Diagram)o; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * compares two eObjects by there xmi-id whether the are equal or not |
| * |
| * @param oldNode |
| * @param newNode |
| * @return true if xmi-id equal, else otherwise |
| */ |
| public static boolean areSameObjects(EObject oldNode, EObject newNode) |
| { |
| String newXMI = getXmiId(newNode); |
| String oldXMI = getXmiId(oldNode); |
| |
| if (newXMI.equals(oldXMI)) |
| { |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * returns the same Object in the other resource. The Object is identified by the xmi ID |
| * |
| * @param e |
| * @param resource |
| * @return an object in the given resource with the same xmi Id |
| */ |
| public static EObject getSameEObjectFromOtherResource(EObject e, XMLResource resource) |
| { |
| String xmiId = DawnResourceHelper.getXmiId(e); |
| // EObject ret = resource.getIDToEObjectMap().get(xmiId); |
| EObject ret = resource.getEObject(xmiId); |
| return ret; |
| } |
| |
| /** |
| * finds changed objects |
| * |
| * @param serverO |
| * @param clientO |
| * @return true if the obejcts are different |
| */ |
| public static boolean objectsHaveChanged(Object serverO, Object clientO) |
| { |
| if (serverO instanceof Node && clientO instanceof Node) |
| { |
| Node s = (Node)serverO; |
| Node c = (Node)clientO; |
| |
| if (objectsHaveChanged(s.getLayoutConstraint(), c.getLayoutConstraint())) |
| { |
| return true; |
| } |
| if (objectsHaveChanged(s.getElement(), c.getElement())) |
| { |
| return true; |
| } |
| |
| } |
| else if (serverO instanceof Edge && clientO instanceof Edge) // compare edges |
| { |
| Edge s = (Edge)serverO; |
| Edge c = (Edge)clientO; |
| RelativeBendpoints sr = (RelativeBendpoints)s.getBendpoints(); |
| RelativeBendpoints cr = (RelativeBendpoints)c.getBendpoints(); |
| if (sr.getPoints().size() != cr.getPoints().size()) |
| { |
| return true; |
| } |
| int i = 0; |
| for (Object o : sr.getPoints()) |
| { |
| RelativeBendpoint sb = (RelativeBendpoint)o; |
| RelativeBendpoint cb = (RelativeBendpoint)cr.getPoints().get(i); |
| if (objectsHaveChanged(sb, cb)) |
| { |
| return true; |
| } |
| i++; |
| } |
| } |
| else if (serverO instanceof RelativeBendpoint && clientO instanceof RelativeBendpoint) |
| { |
| RelativeBendpoint sb = (RelativeBendpoint)serverO; |
| RelativeBendpoint cb = (RelativeBendpoint)clientO; |
| if (sb.getSourceX() != cb.getSourceX()) |
| { |
| return true; |
| } |
| if (sb.getSourceY() != cb.getSourceY()) |
| { |
| return true; |
| } |
| if (sb.getTargetX() != cb.getTargetX()) |
| { |
| return true; |
| } |
| if (sb.getTargetY() != cb.getTargetY()) |
| { |
| return true; |
| } |
| } |
| else if (serverO instanceof Bounds && clientO instanceof Bounds) |
| { |
| if (((Bounds)serverO).getX() != ((Bounds)clientO).getX()) |
| { |
| return true; |
| } |
| if (((Bounds)serverO).getY() != ((Bounds)clientO).getY()) |
| { |
| return true; |
| } |
| if (((Bounds)serverO).getWidth() != ((Bounds)clientO).getWidth()) |
| { |
| return true; |
| } |
| if (((Bounds)serverO).getHeight() != ((Bounds)clientO).getHeight()) |
| { |
| return true; |
| } |
| } |
| else if (serverO instanceof EObject && clientO instanceof EObject) |
| { |
| EObject s = (EObject)serverO; |
| EObject c = (EObject)clientO; |
| |
| for (EAttribute attribute : s.eClass().getEAllAttributes()) |
| { |
| Object co = c.eGet(attribute); |
| Object so = s.eGet(attribute); |
| if (co == null || so == null) |
| { |
| return false; |
| } |
| if (!co.equals(so)) |
| { |
| return true; |
| } |
| } |
| |
| // checking size of chidlren |
| if (s.eContents().size() != c.eContents().size()) |
| { |
| return true; |
| } |
| int i = 0; |
| // chekcing every child |
| for (EObject sChild : s.eContents()) |
| { |
| EObject cChild = c.eContents().get(i); |
| if (objectsHaveChanged(sChild, cChild)) |
| { |
| return true; |
| } |
| i++; |
| } |
| } |
| else |
| { |
| if (TRACER.isEnabled()) |
| { |
| TRACER.format("classes are not identical...no match {0} / {1}", serverO, clientO); //$NON-NLS-1$ |
| } |
| } |
| return false; |
| } |
| |
| public static Resource loadResourceFromFileString(String filePath, ResourceSet rsSet) throws IOException |
| { |
| try |
| { |
| File file = new File(filePath); |
| FileReader reader = new FileReader(file); |
| BufferedReader Ein = new BufferedReader(reader); |
| String s; |
| StringBuffer buff = new StringBuffer(); |
| while ((s = Ein.readLine()) != null) // Null-Referenz |
| { |
| buff.append(s + System.getProperty("line.separator")); |
| } |
| Ein.close(); |
| Resource resource = DawnResourceHelper.loadFromXML(buff.toString(), rsSet); |
| return resource; |
| } |
| catch (FileNotFoundException e) |
| { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public static String readFromFile(String filePath) throws IOException |
| { |
| try |
| { |
| File file = new File(filePath); |
| FileReader reader = new FileReader(file); |
| BufferedReader Ein = new BufferedReader(reader); |
| String s; |
| StringBuffer buff = new StringBuffer(); |
| while ((s = Ein.readLine()) != null) // Null-Referenz |
| { |
| buff.append(s + System.getProperty("line.separator")); |
| } |
| Ein.close(); |
| return buff.toString(); |
| |
| } |
| catch (FileNotFoundException e) |
| { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| /** |
| * copies the XMI-id from oldElement to new Element |
| * |
| * @param newElement |
| * @param oldElement |
| */ |
| public static void copyXmiId(EObject oldElement, EObject newElement) |
| { |
| DawnResourceHelper.setXmiId(newElement, DawnResourceHelper.getXmiId(oldElement)); |
| } |
| |
| /** |
| * sets the objects id in the old resource to the new resource |
| * |
| * @param v |
| * @param oldResource |
| */ |
| public static void setXmiId(EObject v, XMLResource oldResource) |
| { |
| DawnResourceHelper.setXmiId(v, getXmiId(v, oldResource)); |
| } |
| |
| /** |
| * creates a deep Copy and also copies xmi ids This method can be used if the copy should be insertet into newParent |
| * |
| * @param oldObject |
| * @param newParent |
| * @return the copy of the oldObject |
| */ |
| @SuppressWarnings("unchecked") |
| public static EObject createCopyAndInsert(EObject oldObject, EObject newParent) |
| { |
| EObject ret = EcoreUtil.copy(oldObject); |
| |
| EStructuralFeature containingFeature = oldObject.eContainingFeature(); |
| |
| Object get = newParent.eGet(containingFeature); |
| if (get instanceof Collection<?>) |
| { |
| Collection<EObject> list = (Collection<EObject>)get; |
| list.add(ret); |
| } |
| else |
| { |
| newParent.eSet(containingFeature, ret); |
| } |
| |
| setXmiIdForChildren(oldObject, ret); |
| |
| return ret; |
| } |
| |
| public static EObject createCopy(EObject v) |
| { |
| EObject ret = EcoreUtil.copy(v); |
| return ret; |
| } |
| |
| private static int setXmiIdForChildren(EObject oldChild, EObject newChild) |
| { |
| DawnResourceHelper.setXmiId(newChild, DawnResourceHelper.getXmiId(oldChild)); |
| int i = 0; |
| for (EObject oldC : oldChild.eContents()) |
| { |
| EObject newC = newChild.eContents().get(i); |
| setXmiIdForChildren(oldC, newC); |
| i++; |
| } |
| return i; |
| } |
| |
| /** |
| * This method provides deep copying of all childrens xmi ids from oldObject to newObject |
| * |
| * @param oldObject |
| * @param newObject |
| */ |
| public static void copyXmiIds(EObject oldObject, EObject newObject) |
| { |
| setXmiIdForChildren(oldObject, newObject); |
| } |
| |
| /** |
| * this Method copies the values from one Element to the other curretnly only for attributes and not for references |
| */ |
| @Deprecated |
| public static void updateElement(EObject oldElement, EObject newElement) |
| { |
| if (oldElement == null) |
| { |
| newElement = oldElement; |
| return; |
| } |
| |
| for (EAttribute attribute : oldElement.eClass().getEAllAttributes()) |
| { |
| newElement.eSet(attribute, oldElement.eGet(attribute)); |
| } |
| } |
| |
| /** |
| * @param leftObject |
| * @param rightObject |
| * @throws EClassIncompatibleException |
| */ |
| // TODO delte removed references |
| public static void updateEObject(EObject leftObject, EObject rightObject) throws EClassIncompatibleException |
| { |
| if (rightObject == null) // remove left Object |
| { |
| removeEObjectFromParent(leftObject); |
| return; |
| } |
| |
| if (!leftObject.eClass().equals(rightObject.eClass())) |
| { |
| throw new EClassIncompatibleException( |
| leftObject.eClass().getName() + "(" + DawnResourceHelper.getXmiId(leftObject) + ")" + "/" |
| + rightObject.eClass().getName() + "(" + DawnResourceHelper.getXmiId(leftObject) + ")"); |
| } |
| |
| updateEAttributes(leftObject, rightObject); |
| updateEReferences(leftObject, rightObject); |
| |
| for (Object o : rightObject.eContents()) |
| { |
| EObject rightChild = (EObject)o; |
| EObject leftChild = getSameEObjectFromOtherResource(rightChild, (XMLResource)leftObject.eResource()); |
| if (leftChild != null) // child exists |
| { |
| updateEObject(leftChild, rightChild); // removes it |
| } |
| else |
| // child must be created |
| { |
| if (o instanceof View) |
| { |
| View childView = (View)o; |
| EObject childViewElement = childView.getElement(); |
| View childViewCopy = (View)createCopyAndInsert(rightChild, leftObject); |
| if (childViewElement != null) |
| { |
| EObject childElementCopy = getSameEObjectFromOtherResource(childViewElement, |
| (XMLResource)leftObject.eResource()); |
| |
| updateEObject(childElementCopy, childViewElement);// not shure whether this is needed here |
| childViewCopy.setElement(childElementCopy); |
| } |
| |
| updateEObject(childViewCopy, childView);// not shure whether this is needed here |
| } |
| else |
| { |
| EObject childCopy = createCopyAndInsert(rightChild, leftObject); |
| updateEObject(childCopy, rightChild); // not shure whether this is needed here |
| } |
| } |
| } |
| |
| ArrayList<EObject> tempDeletionList = new ArrayList<EObject>(); |
| |
| for (Object leftChild : leftObject.eContents()) |
| { |
| tempDeletionList.add((EObject)leftChild); |
| } |
| |
| // here delete all which are not in the right object |
| for (EObject leftChild : tempDeletionList) |
| { |
| EObject rightChild = getSameEObjectFromOtherResource(leftChild, (XMLResource)rightObject.eResource()); |
| updateEObject(leftChild, rightChild); |
| } |
| } |
| |
| private static void removeEObjectFromParent(EObject leftObject) |
| { |
| if (leftObject instanceof View) |
| { |
| View view = (View)leftObject; |
| if (view.getElement() != null) |
| { |
| removeEObjectFromParent(view.getElement()); |
| } |
| } |
| |
| EObject parent = leftObject.eContainer(); |
| EStructuralFeature containingFeature = leftObject.eContainingFeature(); |
| if (parent != null) |
| { |
| Object container = parent.eGet(containingFeature); |
| |
| if (container instanceof Collection<?>) |
| { |
| Collection<?> collection = (Collection<?>)container; |
| collection.remove(leftObject); |
| } |
| else |
| { |
| parent.eSet(containingFeature, null); |
| } |
| } |
| else |
| { |
| if (TRACER.isEnabled()) |
| { |
| TRACER.format("arent is null, object ist still removed from parent : {0} ", leftObject); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| private static void updateEReferences(EObject leftObject, EObject rightObject) throws EClassIncompatibleException |
| { |
| for (EReference reference : rightObject.eClass().getEReferences()) |
| { |
| updateReference(leftObject, rightObject, reference); |
| } |
| } |
| |
| @SuppressWarnings("unchecked") |
| public static void updateReference(EObject leftParent, EObject rightParent, EReference reference) |
| throws EClassIncompatibleException |
| { |
| |
| if (reference.getName().equals("element")) |
| { |
| return; |
| } |
| Object leftReferenceObject = leftParent.eGet(reference); |
| Object rightReferenceObject = rightParent.eGet(reference); |
| |
| if (leftReferenceObject != null) |
| { |
| |
| if (leftReferenceObject instanceof Collection<?>) |
| { |
| Collection<EObject> leftCollection = (Collection<EObject>)leftReferenceObject; |
| Collection<?> rightCollection = (Collection<?>)rightReferenceObject; |
| for (Object o : rightCollection) |
| { |
| EObject rightCollectionChild = (EObject)o; |
| EObject leftCollectionChild = getSameEObjectFromOtherResource(rightCollectionChild, |
| (XMLResource)leftParent.eResource()); |
| |
| if (leftCollectionChild == null) // create |
| { |
| leftCollectionChild = DawnResourceHelper.createCopy(rightCollectionChild); |
| leftCollection.add(leftCollectionChild); |
| } |
| else |
| { |
| if (!rightCollectionChild.eResource().equals(leftParent.eResource())) // reference to another resource |
| { |
| leftCollection.remove(rightCollectionChild); |
| leftCollection.add(leftCollectionChild); |
| } |
| |
| updateEObject(leftCollectionChild, rightCollectionChild); |
| } |
| } |
| } |
| else |
| { |
| updateEObject((EObject)leftParent.eGet(reference), (EObject)rightParent.eGet(reference)); |
| } |
| } |
| else |
| // create |
| { |
| if (rightReferenceObject != null) |
| { |
| leftParent.eSet(reference, EcoreUtil.copy((EObject)rightReferenceObject)); |
| } |
| } |
| } |
| |
| private static void updateEAttributes(EObject leftObject, EObject rightObject) |
| { |
| for (EAttribute attribute : rightObject.eClass().getEAllAttributes()) |
| { |
| leftObject.eSet(attribute, rightObject.eGet(attribute)); |
| } |
| } |
| |
| /** |
| * @since 1.0 |
| */ |
| public static void deleteViewInResource(Resource resource, EObject e) |
| { |
| Diagram diagram = DawnResourceHelper.getDiagramFromResource(resource); |
| EObject element = ((View)e).getElement(); |
| |
| if (element != null) |
| { |
| removeElementFromContainer(element); |
| } |
| |
| if (e instanceof Node) |
| { |
| View node = (View)e; |
| diagram.removeChild(node);// ..getChildren().add(v); |
| @SuppressWarnings("unchecked") |
| List<Edge> toBeDeleted = new ArrayList<Edge>(node.getSourceEdges()); |
| for (Object obj : toBeDeleted) |
| { |
| Edge edge = (Edge)obj; |
| deleteViewInResource(resource, edge); |
| } |
| } |
| else if (e instanceof Edge) |
| { |
| Edge edge = (Edge)e; |
| diagram.removeEdge(edge);// ..getChildren().add(v); |
| edge.setSource(null); |
| edge.setTarget(null); |
| } |
| } |
| |
| private static void removeElementFromContainer(EObject element) |
| { |
| EStructuralFeature containingFeature = element.eContainingFeature(); |
| EObject container = element.eContainer(); |
| if (container != null) |
| { |
| Object get = container.eGet(containingFeature); |
| if (get instanceof Collection<?>) |
| { |
| Collection<?> list = (Collection<?>)get; |
| list.remove(element); |
| } |
| else |
| { |
| container.eSet(containingFeature, null); |
| } |
| } |
| } |
| |
| @SuppressWarnings("unchecked") |
| public static void addElementToContainer(EObject element, EObject container, EStructuralFeature containingFeature) |
| { |
| // EStructuralFeature containingFeature = element.eContainingFeature(); |
| Object get = container.eGet(containingFeature); |
| if (get instanceof Collection<?>) |
| { |
| Collection<EObject> list = (Collection<EObject>)get; |
| list.add(element); |
| } |
| else |
| { |
| container.eSet(containingFeature, element); |
| } |
| } |
| |
| /** |
| * checks if an element with element's id exists in the give resource |
| * |
| * @param res |
| * @param element |
| * @return true is the object with the same xmi id as element is contained in the given resource |
| */ |
| public static boolean isObjectInResource(Resource res, EObject element) |
| { |
| EObject object = res.getEObject(DawnResourceHelper.getXmiId(element)); |
| if (object == null) |
| { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| public static void printResource(Resource r) |
| { |
| for (EObject o : r.getContents()) |
| { |
| printEObjectFull(o, 0); |
| } |
| } |
| |
| public static void printEObject(EObject o, int level) |
| { |
| for (Object child : o.eContents()) |
| { |
| printEObject((EObject)child, level + 1); |
| } |
| } |
| |
| public static void printEObjectFull(EObject o, int level) |
| { |
| print(tabs(level) + "--------------------------------------------"); |
| print(tabs(level) + "Object: " + o); |
| print(tabs(level) + "o.eContainer: " + o.eContainer()); |
| print(tabs(level) + "o.eContainingFeature: " + o.eContainingFeature()); |
| print(tabs(level) + "o.eContainmentFeature: " + o.eContainmentFeature()); |
| print(tabs(level) + "o.eIsProxy: " + o.eIsProxy()); |
| print(tabs(level) + "o.eResource: " + o.eResource()); |
| print(tabs(level) + "o.getClass: " + o.getClass()); |
| print(tabs(level) + "o.eClass: " + o.eClass()); |
| print(tabs(level) + "o.eCrossReferences: " + o.eCrossReferences()); |
| |
| print(tabs(level) + "o.eClass.getClassifierID: " + o.eClass().getClassifierID()); |
| print(tabs(level) + "o.eClass.getFeatureCount: " + o.eClass().getFeatureCount()); |
| print(tabs(level) + "o.eClass.getInstanceClassName: " + o.eClass().getInstanceClassName()); |
| print(tabs(level) + "o.eClass.getInstanceTypeName: " + o.eClass().getInstanceTypeName()); |
| print(tabs(level) + "o.eClass.getName: " + o.eClass().getName()); |
| print(tabs(level) + "o.eClass.getDefaultValue: " + o.eClass().getDefaultValue()); |
| print(tabs(level) + "o.eClass.getEPackage: " + o.eClass().getEPackage()); |
| print(tabs(level) + "o.eClass.getEIDAttribute: " + o.eClass().getEIDAttribute()); |
| print(tabs(level) + "o.eClass.getInstanceClass: " + o.eClass().getInstanceClass()); |
| |
| for (EAttribute attribute : o.eClass().getEAllAttributes()) |
| { |
| print(tabs(level + 1) + "o.eClass.getEAllAttributes.attribute: '" + attribute.getName() + "': " |
| + o.eGet(attribute)); |
| } |
| for (EAnnotation annotation : o.eClass().getEAnnotations()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAnnotations().annotation: '" + annotation); |
| } |
| for (EReference containment : o.eClass().getEAllContainments()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAllContainments().containment: '" + containment); |
| } |
| for (EGenericType genericSupertype : o.eClass().getEAllGenericSuperTypes()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAllGenericSuperTypes().genericSupertype: '" + genericSupertype); |
| } |
| for (EOperation operation : o.eClass().getEAllOperations()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAllOperations().operation: '" + operation); |
| } |
| |
| for (EReference reference : o.eClass().getEAllReferences()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAllReferences().reference: '" + reference); |
| } |
| for (EClass supertype : o.eClass().getEAllSuperTypes()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAllSuperTypes().supertype: '" + supertype); |
| } |
| for (EStructuralFeature structuralFeature : o.eClass().getEAllStructuralFeatures()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAllStructuralFeatures().structuralFeature: '" + structuralFeature); |
| } |
| for (EAnnotation annotation : o.eClass().getEAnnotations()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAnnotations().annotation: '" + annotation); |
| } |
| for (EAttribute attribute : o.eClass().getEAttributes()) |
| { |
| print(tabs(level + 1) + "o.eClass().getEAttributes().annotation: '" + attribute); |
| } |
| for (Adapter adapter : o.eClass().eAdapters()) |
| { |
| print(tabs(level + 1) + "o.eClass().eAdapters().adapter: '" + adapter); |
| } |
| |
| for (Object child : o.eContents()) |
| { |
| printEObjectFull((EObject)child, level + 2); |
| } |
| } |
| |
| private static String tabs(int level) |
| { |
| String s = ""; |
| for (int i = 0; i < level; i++) |
| { |
| s += "\t"; |
| } |
| return s; |
| } |
| |
| public static String getLocationFromResource(Resource r) throws MalformedURLException, IOException |
| { |
| return FileLocator.resolve(new URL(r.getURI().toString())).toString().replace("file:", ""); |
| } |
| |
| /********************** |
| * finds EditPart from a View |
| * |
| * @param view |
| * @param dawnDiagramEditor |
| * @return find an Editpart for a view with the same xmi id |
| ***************************************************************************************************/ |
| @Deprecated |
| public static EditPart findEditPartByXMIId(View view, DiagramDocumentEditor dawnDiagramEditor) |
| { |
| DiagramEditPart diagramEditPart = dawnDiagramEditor.getDiagramEditPart(); |
| |
| for (Object e : diagramEditPart.getChildren()) |
| { |
| EditPart ep = (EditPart)e; |
| if (DawnResourceHelper.getXmiId((EObject)ep.getModel()).equals(DawnResourceHelper.getXmiId(view))) |
| { |
| return ep; |
| } |
| } |
| |
| for (Object e : diagramEditPart.getConnections()) |
| { |
| EditPart ep = (EditPart)e; |
| if (DawnResourceHelper.getXmiId((EObject)ep.getModel()).equals(DawnResourceHelper.getXmiId(view))) |
| { |
| return ep; |
| } |
| } |
| return null; |
| } |
| |
| protected static void print(String s) |
| { |
| if (TRACER.isEnabled()) |
| { |
| TRACER.trace(s); |
| } |
| } |
| } |