/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.pakkage;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlPackage;
import org.teiid.designer.core.workspace.ModelDiagrams;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.diagram.ui.PluginConstants;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.ui.util.DiagramProxy;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* <p>
* PackageDiagramProvider is the specific Package Diagram Provider for basic package diagram model objects inside ModelResources.
* </p>
* <p>
* PackageDiagramProvider implements IPackageDiagramProvider because this interface has the right methods to locate the package
* diagram for an EObject or ModelResource
* </p>
*
* @since 8.0
*/
public class PackageDiagramProvider implements IPackageDiagramProvider {
/**
* Construct an instance of MappingDiagramProvider.
*/
public PackageDiagramProvider() {
super();
}
private Diagram createPackageDiagram( EObject target,
ModelResource modelResource,
boolean forceCreate ) {
if (forceCreate) {
Diagram pDiagram = null;
// Wrap in transaction so it doesn't result in Significant Undoable
boolean started = ModelerCore.startTxn(false, false, "Creating Package Diagram", this); //$NON-NLS-1$
boolean succeeded = false;
try {
pDiagram = PackageDiagramUtil.createPackageDiagram(target, modelResource);
succeeded = true;
} finally {
if (started) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
return pDiagram;
}
if (target == null) {
try {
target = modelResource.getModelAnnotation();
} catch (ModelWorkspaceException err) {
DiagramUiConstants.Util.log(err);
}
}
return new DiagramProxy(target, PluginConstants.PACKAGE_DIAGRAM_TYPE_ID, modelResource);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.pakkage.IPackageDiagramProvider#getPackageDiagram(org.teiid.designer.core.workspace.ModelResource, org.eclipse.emf.ecore.EObject)
*/
@Override
public Diagram getPackageDiagram( ModelResource modelResource,
EObject eObject,
boolean forceCreate ) {
ModelDiagrams modelDiagrams = null;
Diagram packageDiagram = null;
if (modelResource != null && ModelUtilities.supportsDiagrams(modelResource)) {
// if eObject == null, then it's a 'Model' node, then we don't ask for a contributed package diagram.
try {
modelDiagrams = modelResource.getModelDiagrams();
if (modelDiagrams != null && eObject != null) {
List diagramList = new ArrayList(modelDiagrams.getDiagrams(eObject));
Iterator iter = diagramList.iterator();
Diagram nextDiagram = null;
while (iter.hasNext() && packageDiagram == null) {
nextDiagram = (Diagram)iter.next();
if (nextDiagram.getType() != null
&& nextDiagram.getType().equals(PluginConstants.PACKAGE_DIAGRAM_TYPE_ID)) packageDiagram = nextDiagram;
}
} else if (modelDiagrams != null) {
// EObject == null, so it's supposed to be the package diagram under a model resource only!.
List diagramList = new ArrayList(modelDiagrams.getDiagrams(null));
if (!diagramList.isEmpty()) {
Iterator iter = diagramList.iterator();
Diagram nextDiagram = null;
while (iter.hasNext() && packageDiagram == null) {
nextDiagram = (Diagram)iter.next();
if (nextDiagram.getType() != null
&& nextDiagram.getType().equals(PluginConstants.PACKAGE_DIAGRAM_TYPE_ID)) packageDiagram = nextDiagram;
}
//
// packageDiagram = (Diagram)diagramList.get(0);
// if( diagramList.size() > 1 ) {
// String warningMessage =
// " PackageDiagramProvider.getPackageDiagram(): More than one package diagram for resource. Should only be one. Resource = " //$NON-NLS-1$
// + modelResource.toString();
// DiagramUiConstants.Util.log(IStatus.WARNING, warningMessage);
// }
}
}
} catch (ModelWorkspaceException e) {
if (!modelResource.hasErrors()) {
// Unexpected ...
String message = DiagramUiConstants.Util.getString("PackageDiagramContentProvider.getPackageDiagramError", modelResource.toString()); //$NON-NLS-1$
DiagramUiConstants.Util.log(IStatus.ERROR, e, message);
}
}
if (packageDiagram == null) {
// create one here.
packageDiagram = createPackageDiagram(eObject, modelResource, forceCreate);
}
}
return packageDiagram;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.pakkage.IPackageDiagramProvider#getPackageDiagram(org.eclipse.emf.ecore.EObject)
*/
@Override
public Diagram getPackageDiagram( Object targetObject,
boolean forceCreate ) {
Diagram diagram = null;
if (targetObject instanceof EObject) {
EObject eObject = (EObject)targetObject;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
if (eObject.eContainer() != null) {
if (eObject.eContainer() != null) {
EObject packageEObject = getPackage(eObject);
if (packageEObject != null && modelResource != null) {
diagram = getPackageDiagram(modelResource, packageEObject, forceCreate);
}
}
} else if (DiagramUiUtilities.isStandardUmlPackage(targetObject)) {
// We have a package under a model, so it doesn't have a "eContainer"
diagram = getPackageDiagram(modelResource, eObject, forceCreate);
}
}
return diagram;
}
private EObject getPackage( EObject eObject ) {
EObject packageEObject = null;
Object parentObject = eObject.eContainer();
if (parentObject instanceof EObject) {
// Get aspect and see if it's a UmlPackage....
MetamodelAspect aspect = DiagramUiPlugin.getDiagramAspectManager().getUmlAspect((EObject)parentObject);
if (aspect != null && aspect instanceof UmlPackage) {
packageEObject = (EObject)parentObject;
} else {
packageEObject = getPackage((EObject)parentObject);
}
} else {
}
return packageEObject;
}
}