/*
* 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.notation.uml;
//import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlAssociation;
import org.teiid.designer.core.metamodel.aspect.uml.UmlClassifier;
import org.teiid.designer.core.metamodel.aspect.uml.UmlPackage;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.diagram.ui.model.DiagramModelNode;
import org.teiid.designer.diagram.ui.notation.NotationModelGenerator;
import org.teiid.designer.diagram.ui.notation.uml.model.UmlAssociationNode;
import org.teiid.designer.diagram.ui.notation.uml.model.UmlAttributeNode;
import org.teiid.designer.diagram.ui.notation.uml.model.UmlClassifierNode;
import org.teiid.designer.diagram.ui.notation.uml.model.UmlOperationNode;
import org.teiid.designer.diagram.ui.notation.uml.model.UmlPackageNode;
import org.teiid.designer.metamodels.diagram.Diagram;
/**
* @author mdrilling Factory for creating UML Model Nodes Responsibility for creating and managing the diagram is at the
* DiagramModelFactory level.
*
* @since 8.0
*/
public class UmlModelGenerator implements NotationModelGenerator {
// private final static int SOURCE = 0;
// private final static int TARGET = 1;
/**
* Create a DiagramModelNode.
*/
@Override
public DiagramModelNode createModel( Object inputEObject,
Diagram diagramContainerObject ) {
// Return null if the baseObject is not a EObject
if (!(inputEObject instanceof EObject)) {
return null;
}
EObject eObj = (EObject)inputEObject;
DiagramModelNode newDiagramModelNode = null;
// DiagramEntity diagramEntity = getDiagramEntity(eObj, diagramContainerObject);
// Get UML Aspect for this EObject
MetamodelAspect someAspect = getUmlAspect(eObj);
if (someAspect != null) {
// Create Model Node for the aspect type
if (someAspect instanceof UmlPackage) {
newDiagramModelNode = new UmlPackageNode(diagramContainerObject, eObj, (UmlPackage)someAspect);
} else if (someAspect instanceof UmlClassifier) {
newDiagramModelNode = new UmlClassifierNode(diagramContainerObject, eObj, (UmlClassifier)someAspect);
}
}
return newDiagramModelNode;
}
/**
* Create a DiagramModelNode.
*/
@Override
public DiagramModelNode createChildModel( DiagramModelNode parentDiagramModelNode,
Object inputEObject ) {
// Return null if the baseObject is not a EObject
if (!(inputEObject instanceof EObject)) {
return null;
}
DiagramModelNode newDiagramModelNode = null;
if (parentDiagramModelNode instanceof UmlPackageNode) {
// Do Nothing
} else if (parentDiagramModelNode instanceof UmlClassifierNode) {
newDiagramModelNode = ((UmlClassifierNode)parentDiagramModelNode).addChild((EObject)inputEObject);
} else if (parentDiagramModelNode.getModelObject() instanceof Diagram) {
newDiagramModelNode = createModel(inputEObject, (Diagram)parentDiagramModelNode.getModelObject());
if (newDiagramModelNode != null) newDiagramModelNode.setParent(parentDiagramModelNode);
} else {
String message = "UmlModelGenerator.createChildModel() Couldn't Add child to parent Node = " + parentDiagramModelNode; //$NON-NLS-1$
DiagramUiConstants.Util.log(IStatus.ERROR, message);
}
return newDiagramModelNode;
}
/**
* Helper method to get the UmlAspect given an EObject
*/
public MetamodelAspect getUmlAspect( EObject eObject ) {
return DiagramUiPlugin.getDiagramAspectManager().getUmlAspect(eObject);
}
@Override
public boolean isAssociation( EObject eObj ) {
MetamodelAspect aspect = getUmlAspect(eObj);
return aspect instanceof UmlAssociation;
}
@Override
public List getAssociations( List candidateAssociationNodes,
List diagramModelNodes ) {
return Collections.EMPTY_LIST;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.notation.NotationModelGenerator#performUpdate(org.teiid.designer.diagram.ui.model.DiagramModelNode, org.eclipse.emf.common.notify.Notification)
*/
@Override
public void performUpdate( DiagramModelNode targetNode,
Notification setNotification ) {
if (targetNode instanceof UmlClassifierNode) {
((UmlClassifierNode)targetNode).refreshForNameChange();
((UmlClassifierNode)targetNode).refreshForPathChange();
} else if (targetNode instanceof UmlPackageNode) {
((UmlPackageNode)targetNode).refreshForNameChange();
((UmlPackageNode)targetNode).refreshForPathChange();
} else if (targetNode instanceof UmlAttributeNode) {
((UmlAttributeNode)targetNode).refreshForNameChange();
} else if (targetNode instanceof UmlAssociationNode) {
((UmlAssociationNode)targetNode).refreshForNameChange();
} else if (targetNode instanceof UmlOperationNode) {
((UmlOperationNode)targetNode).refreshForNameChange();
}
}
}