/******************************************************************************* * <copyright> * * Copyright (c) 2005, 2010 SAP AG. * 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: * SAP AG - initial API, implementation and documentation * mwenz - Bug 323359 Avoid usage of java.lang.text, ICU4J etc. * * </copyright> * *******************************************************************************/ package org.eclipse.graphiti.internal.services.impl; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.graphiti.internal.ExternalPictogramLink; import org.eclipse.graphiti.internal.services.GraphitiInternal; import org.eclipse.graphiti.internal.util.T; import org.eclipse.graphiti.mm.Property; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.mm.pictograms.PictogramLink; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.services.ILinkService; /** * @noinstantiate This class is not intended to be instantiated by clients. * @noextend This class is not intended to be subclassed by clients. */ public final class LinkServiceImpl implements ILinkService { private long cumulativeTime = 0; // just for performance tracing private int cumulativeCalls = 0; // just for performance tracing // property-key for the property of a pictgram-element which is part of a // link-object and the business-object(s) of the link-object is not unique private static final String KEY_LINK_PROPERTY = "keyLinkProperty"; //$NON-NLS-1$ /** * Returns all business objects which are linked to the given pictogram * element. * * @param pictogramElement * The pictogram element for which to return the business * objects. * @return The business objects which are linked to the given pictogram * element. Can be empty but not null. */ public EObject[] getAllBusinessObjectsForLinkedPictogramElement(PictogramElement pictogramElement) { EObject[] ret = new EObject[0]; if (pictogramElement != null && GraphitiInternal.getEmfService().isObjectAlive(pictogramElement)) { PictogramLink pl = getLinkForPictogramElement(pictogramElement); if (pl != null && (!(pl instanceof ExternalPictogramLink)) && GraphitiInternal.getEmfService().isObjectAlive(pl)) { List<EObject> boList = pl.getBusinessObjects(); if (boList != null && boList.size() > 0) { ret = boList.toArray(new EObject[boList.size()]); } } } return ret; } /** * Returns the first of possibly several business objects which are linked * to the given pictogram element. This is a convenience method for * {@link #getAllBusinessObjectsForPictogramElement(PictogramElement)}, * because in many use cases only a single business object is linked. * * @param pictogramElement * The pictogram element for which to return the business * objects. * @return The first of possibly several business objects which are linked * to the given pictogram element. Can be null. */ public EObject getBusinessObjectForLinkedPictogramElement(PictogramElement pictogramElement) { EObject ret = null; EObject eObject[] = getAllBusinessObjectsForLinkedPictogramElement(pictogramElement); if (eObject != null && eObject.length > 0) { ret = eObject[0]; } return ret; } /** * Returns the pictogram link referencing the given pictogram element. * * @param pictogramElement * the pictogram element * @return the pictogram link referencing the given pictogram element */ public PictogramLink getLinkForPictogramElement(PictogramElement pictogramElement) { long start = System.currentTimeMillis(); PictogramLink ret = null; if (pictogramElement != null && GraphitiInternal.getEmfService().isObjectAlive(pictogramElement)) { ret = pictogramElement.getLink(); } if (T.racer().info()) { long end = System.currentTimeMillis(); long time = (end - start); cumulativeTime += time; cumulativeCalls++; double averageTime = (double) cumulativeTime / (double) cumulativeCalls; String averageTimeString = Double.toString(averageTime); //$NON-NLS-1$ T.racer().info("LinkUtil.getLinkForPictogramElement() took " + time + " ms (cumulative: " + cumulativeTime + " ms for " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + cumulativeCalls + " calls; average: " + averageTimeString + " ms/call)"); //$NON-NLS-1$ //$NON-NLS-2$ T.racer().info("LinkUtil.getLinkForPictogramElement() average time: " + averageTimeString + " ms/call)"); //$NON-NLS-1$ //$NON-NLS-2$ } if (ret == null) { Property independentProperty = Graphiti.getPeService().getProperty(pictogramElement, ExternalPictogramLink.KEY_INDEPENDENT_PROPERTY); if (independentProperty != null) { ret = new ExternalPictogramLink(); ret.setPictogramElement(pictogramElement); } } return ret; } /** * get all pictogram elements which references the given eObject. * * @param eObject * the ref object * @param diagram * the diagram * @return the pictogram elements */ public List<PictogramElement> getPictogramElements(Diagram diagram, EObject eObject) { List<PictogramElement> ret = new ArrayList<PictogramElement>(); if (eObject != null && GraphitiInternal.getEmfService().isObjectAlive(eObject)) { Collection<PictogramLink> links = diagram.getPictogramLinks(); for (PictogramLink link : links) { EObject bos[] = getAllBusinessObjectsForLinkedPictogramElement(link.getPictogramElement()); for (EObject bo : bos) { if (GraphitiInternal.getEmfService().getDTPForDiagram(diagram).getCurrentToolBehaviorProvider() .equalsBusinessObjects(eObject, bo)) { ret.add(link.getPictogramElement()); break; } } } } return ret; } /** * Gets the pictogram elements. * * @param diagram * the diagram * @param eObjects * business objects * @param onlyActive * if true, then only active pictogram elements of the diagram * will be considered; if false all pictogram elements will be * considered * @return all (active) pictogram elements in the diagram, which have at * least one reference to one of the business objects */ public List<PictogramElement> getPictogramElements(Diagram diagram, List<EObject> eObjects, boolean onlyActive) { List<PictogramElement> ret = new ArrayList<PictogramElement>(); if (diagram != null && eObjects != null && eObjects.size() > 0) { Collection<PictogramLink> links = diagram.getPictogramLinks(); for (PictogramLink link : links) { PictogramElement pe = link.getPictogramElement(); if (!onlyActive || pe.isActive()) { EObject[] bos = getAllBusinessObjectsForLinkedPictogramElement(pe); for (EObject bo : bos) { if (eObjects.contains(bo)) { ret.add(pe); break; } } } } } return ret; } /** * Checks existence and value of the link property to a given pictogram * element. It is intended to use this property to be able to distinguish * multiple pictogram elements linked to same domain model object. * * @param pictogramElement * the pictogram element * @param propertyValue * the value to check against the property * @return true if link property exists and has the given value; false if * not */ public boolean hasLinkProperty(PictogramElement pictogramElement, String propertyValue) { boolean ret = false; if (pictogramElement != null && propertyValue != null) { Property property = getLinkProperty(pictogramElement); if (property != null) { if (propertyValue.equals(property.getValue())) { ret = true; } } } return ret; } /** * Adds or modifies the link property to a given pictogram element. It is * intended to use this property to be able to distinguish multiple * pictogram elements linked to same domain model object. * * @param pictogramElement * the pictogram element * @param propertyValue * the new value for the link property */ public void setLinkProperty(PictogramElement pictogramElement, String propertyValue) { Graphiti.getPeService().setPropertyValue(pictogramElement, KEY_LINK_PROPERTY, propertyValue); } /** * Gets the link property to a given pictogram element. * * @param pictogramElement * the pictogram element * @return the link property */ public Property getLinkProperty(PictogramElement pictogramElement) { return Graphiti.getPeService().getProperty(pictogramElement, KEY_LINK_PROPERTY); } }