// $Id: UMLUtil.java 13394 2007-08-18 12:48:34Z b00__1 $
// Copyright (c) 2007,2008 Bogdan Pistol and other contributors
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the ArgoUML Project nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE ArgoUML PROJECT ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE ArgoUML PROJECT BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package org.argouml.model.euml;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.StrictCompoundCommand;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.command.CopyToClipboardCommand;
import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
import org.eclipse.uml2.uml.Association;
import org.eclipse.uml2.uml.AssociationClass;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.Type;
/**
* This class exposes protected methods from
* {@link org.eclipse.uml2.uml.UMLUtil} and adds additional util methods
*
* @author Bogdan Pistol
*/
public class UMLUtil extends org.eclipse.uml2.uml.util.UMLUtil {
/**
* The default URI used for eUML
*/
public static final URI DEFAULT_URI = URI.createURI("http://argouml.tigris.org/euml/resource/default_uri.xmi"); //$NON-NLS-1$
/**
* Getter for the attributes of a Type
*
* @param type
* The Type that owns the attributes
* @return the attributes or null
*/
public static EList<Property> getOwnedAttributes(Type type) {
if (type instanceof AssociationClass) {
return ((AssociationClass) type).getOwnedAttributes();
} else if (type instanceof Association) {
return ((Association) type).getOwnedEnds();
} else {
return org.eclipse.uml2.uml.util.UMLUtil.getOwnedAttributes(type);
}
}
/**
* Getter for the operations of a Type
*
* @param type
* The Type that owns the operations
* @return the operations or null
*/
public static EList<Operation> getOwnedOperations(Type type) {
return org.eclipse.uml2.uml.util.UMLUtil.getOwnedOperations(type);
}
/**
* Copy a tree of UML elements into a destination location
*
* @param modelImplementation
* the eUML model implementation
* @param source
* the tree of UML elements to be copied
* @param destination
* the destination container
* @return the root of the newly copied tree of UML elements or null
*/
public static Element copy(EUMLModelImplementation modelImplementation,
Element source, Element destination) {
Command copyToClipboard = CopyToClipboardCommand.create(
modelImplementation.getEditingDomain(), source);
Command pasteFromClipboard = PasteFromClipboardCommand.create(
modelImplementation.getEditingDomain(), destination, null);
StrictCompoundCommand copyCommand = new StrictCompoundCommand() {
{
isPessimistic = true;
}
};
copyCommand.append(copyToClipboard);
copyCommand.append(pasteFromClipboard);
copyCommand.setLabel("Copy a tree of UML elements to a destination");
if (copyCommand.canExecute()) {
modelImplementation.getModelEventPump().getRootContainer().setHoldEvents(
true);
modelImplementation.getEditingDomain().getCommandStack().execute(
copyCommand);
if (modelImplementation.getEditingDomain().getCommandStack().getMostRecentCommand().getAffectedObjects().size() == 1) {
modelImplementation.getModelEventPump().getRootContainer().setHoldEvents(
false);
return (Element) modelImplementation.getEditingDomain().getCommandStack().getMostRecentCommand().getAffectedObjects().iterator().next();
} else {
modelImplementation.getEditingDomain().getCommandStack().undo();
modelImplementation.getModelEventPump().getRootContainer().clearHeldEvents();
modelImplementation.getModelEventPump().getRootContainer().setHoldEvents(
false);
}
}
return null;
}
/**
* Returns information about an Object.
* <p>
* If it's an Element it returns its metaclass name, and if it's a
* NamedElement it appends its name.
*
* @param o
* The object
* @return the String description
*/
public static String toString(Object o) {
if (o == null) {
return "null"; //$NON-NLS-1$
}
if (!(o instanceof Element)) {
return o.toString();
}
StringBuilder sb = new StringBuilder("'"); //$NON-NLS-1$
boolean named = false;
if (o instanceof NamedElement && ((NamedElement) o).getName() != null
&& !((NamedElement) o).getName().equals("")) { //$NON-NLS-1$
named = true;
sb.append(((NamedElement) o).getName() + " ["); //$NON-NLS-1$
}
sb.append(((Element) o).eClass().getName());
if (named) {
sb.append("]"); //$NON-NLS-1$
}
sb.append("'"); //$NON-NLS-1$
return sb.toString();
}
/**
* Returns the Resource associated with an URI or creates the resource if it
* does not exist
*
* @param modelImplementation
* the eUML implementation
* @param uri
* the URI which identifies the resource
* @return the retrieved or created resource
*/
static Resource getResource(
EUMLModelImplementation modelImplementation, URI uri,
boolean readOnly) {
Resource r = modelImplementation.getEditingDomain().getResourceSet()
.getResource(uri, false);
if (r == null) {
r = modelImplementation.getEditingDomain().getResourceSet()
.createResource(uri);
}
modelImplementation.getReadOnlyMap().put(r, Boolean.valueOf(readOnly));
return r;
}
}