package org.eclipse.uml2.diagram.codegen;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.gmf.codegen.gmfgen.Attributes;
import org.eclipse.gmf.codegen.gmfgen.FeatureLinkModelFacet;
import org.eclipse.gmf.codegen.gmfgen.GenCustomPreferencePage;
import org.eclipse.gmf.codegen.gmfgen.GenDiagram;
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
import org.eclipse.gmf.codegen.gmfgen.GenLink;
import org.eclipse.gmf.codegen.gmfgen.GenNode;
import org.eclipse.gmf.codegen.gmfgen.GenPreferencePage;
import org.eclipse.gmf.codegen.gmfgen.GenTopLevelNode;
import org.eclipse.gmf.codegen.gmfgen.TypeModelFacet;
import org.eclipse.gmf.codegen.util.Generator;
import org.eclipse.gmf.common.UnexpectedBehaviourException;
import org.eclipse.gmf.internal.common.codegen.TextMerger;
import org.eclipse.uml2.diagram.codegen.u2tgen.LinkToolStackSupportAttribute;
import org.eclipse.uml2.diagram.codegen.u2tgen.SubstitutableByAttributes;
import org.eclipse.uml2.uml.UMLPackage;
public class GeneratorExt extends Generator {
private final GenDiagram myDiagram;
private final CodegenEmittersExt myEmitters;
public GeneratorExt(GenEditorGenerator genModel, CodegenEmittersExt emitters) {
super(genModel, emitters);
myDiagram = genModel.getDiagram();
myEmitters = emitters;
}
@Override
protected TextMerger createMergeService() {
// see #181484, temporary workaround
final TextMerger defaultMerger = super.createMergeService();
return new TextMerger() {
@Override
public String process(String fileNameExt, String oldText, String newText) {
if ("properties".equals(fileNameExt) && newText != null && newText.contains("#seeBugzilla=181484")) {
return newText;
}
return defaultMerger.process(fileNameExt, oldText, newText);
}
@Override
public String mergeJava(String oldText, String newText) {
return defaultMerger.mergeJava(oldText, newText);
}
@Override
public String mergeProperties(String oldText, String newText) {
return defaultMerger.mergeProperties(oldText, newText);
}
@Override
public String mergeXML(String oldText, String newText) {
return defaultMerger.mergeXML(oldText, newText);
}
};
}
@Override
protected void customRun() throws InterruptedException, UnexpectedBehaviourException {
super.customRun();
for (GenNode node : myDiagram.getAllNodes()) {
generateChangeNotationAction(node);
}
generateIconStylePreferencesPage(myDiagram);
generateIconStylePreferencesHelper(myDiagram);
generateViewFiltersPreferencesPage(myDiagram);
generateSwitchBetweenCommentAndNodeActions();
generatePaletteProvider(myDiagram);
generateSynchronizationWizardPage(myDiagram);
generateNewDiagramHadler(myDiagram);
generateCreateDependencyLinkTool(myDiagram);
generateVisualIDRegistyExt(myDiagram);
}
private void generateSwitchBetweenCommentAndNodeActions() throws InterruptedException, UnexpectedBehaviourException {
GenTopLevelNode commentNode = null;
for (GenTopLevelNode nextNode : myDiagram.getTopLevelNodes()) {
TypeModelFacet modelFacet = nextNode.getModelFacet();
if (modelFacet == null || modelFacet.getMetaClass() == null) {
continue;
}
EClass metaclass = modelFacet.getMetaClass().getEcoreClass();
if (isTheSameEClass(metaclass, UMLPackage.eINSTANCE.getComment())) {
commentNode = nextNode;
break;
}
}
if (commentNode == null) {
return;
}
GenLink commentLink = null;
for (GenLink nextLink : commentNode.getGenOutgoingLinks()) {
if (false == nextLink.getModelFacet() instanceof FeatureLinkModelFacet) {
continue;
}
FeatureLinkModelFacet facet = (FeatureLinkModelFacet) nextLink.getModelFacet();
if (facet.getMetaFeature() == null) {
continue;
}
if (isTheSameEFeature(facet.getMetaFeature().getEcoreFeature(), UMLPackage.eINSTANCE.getComment_AnnotatedElement())) {
commentLink = nextLink;
break;
}
}
if (commentLink == null) {
return;
}
doGenerateJavaClass(//
myEmitters.getTurnCommentIntoNoteEmitter(), //
myEmitters.getTurnCommentIntoNoteActionFQN(myDiagram), //
myDiagram, commentNode, commentLink);
doGenerateJavaClass(//
myEmitters.getTurnNoteIntoCommentEmitter(), //
myEmitters.getTurnNoteIntoCommentActionFQN(myDiagram), //
myDiagram, commentNode, commentLink);
}
private void generateChangeNotationAction(GenNode node) throws InterruptedException, UnexpectedBehaviourException {
for (org.eclipse.gmf.codegen.gmfgen.Attributes attr : node.getViewmap().getAttributes()) {
if (false == attr instanceof SubstitutableByAttributes) {
continue;
}
SubstitutableByAttributes sba = (SubstitutableByAttributes) attr;
if (sba.isRequiresAll()) {
return;
}
doGenerateJavaClass(myEmitters.getChangeNotationContributionItemProviderEmitter(), myEmitters.getChangeNotationContributionItemProviderName(new Object[] { node }), node);
for (Object substitutableByNode : sba.getSubstitutableByNodes()) {
doGenerateJavaClass(myEmitters.getChangeNotationActionEmitter(), myEmitters.getChangeNotationActionName(new Object[] { node, substitutableByNode }), node, substitutableByNode);
}
// we process only the first attribute
return;
}
}
private void generateIconStylePreferencesPage(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
doGenerateJavaClass(//
myEmitters.getIconStylePreferencePageEmitter(), //
myEmitters.getIconStylePreferencePageFQN(new Object[] { diagram }), //
diagram);
}
private void generateIconStylePreferencesHelper(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
doGenerateJavaClass(//
myEmitters.getIconStylePreferenceHelperEmitter(), //
myEmitters.getIconStylePreferenceHelperFQN(new Object[] { diagram }), //
diagram);
}
private void generateViewFiltersPreferencesPage(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
for (GenPreferencePage page : diagram.getPreferencePages()) {
generateViewFiltersPreferencesPage(page);
}
}
private void generateViewFiltersPreferencesPage(GenPreferencePage page) throws InterruptedException, UnexpectedBehaviourException {
if (page instanceof GenCustomPreferencePage && myEmitters.isViewFiltersPreferencePage(new Object[] { page })) {
doGenerateJavaClass(//
myEmitters.getViewFiltersPreferencePageEmitter(), //
myEmitters.getViewFiltersPreferencePageFQN(new Object[] { page }), //
page);
}
for (GenPreferencePage child : page.getChildren()) {
generateViewFiltersPreferencesPage(child);
}
}
private void generatePaletteProvider(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
if (myEmitters.isPaletteProviderNeeded(new Object[] { diagram })) {
doGenerateJavaClass(myEmitters.getPaletteProviderEmitter(), myEmitters.getPaletteProviderFQN(new Object[] { diagram }), diagram);
}
}
private void generateSynchronizationWizardPage(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
if (myEmitters.needsSynchronizationWizardPage(new Object[] { diagram })) {
doGenerateJavaClass(myEmitters.getSynchronizationWizardPageEmitter(), myEmitters.getSynchronizationWizardPagedFQN(new Object[] { diagram }), diagram);
}
}
private void generateNewDiagramHadler(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
if (myEmitters.needsFixedElementsWizard(new Object[] { diagram })) {
doGenerateJavaClass(myEmitters.getFixedElementsWizardEmitter(), myEmitters.getFixedElementsWizardFQN(new Object[] { diagram }), diagram);
doGenerateJavaClass(myEmitters.getNewDiagramHandlerEmitter(), myEmitters.getNewDiagramHandlerFQN(new Object[] { diagram }), diagram);
doGenerateJavaClass(myEmitters.getNewDiagramPropertyTesterEmitter(), myEmitters.getNewDiagramPropertyTesterFQN(new Object[] { diagram }), diagram);
}
}
private void generateCreateDependencyLinkTool(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
for (GenLink next : myDiagram.getLinks()) {
List<Attributes> attributes = next.getViewmap().getAttributes();
for (Attributes attribute : attributes) {
if (attribute instanceof LinkToolStackSupportAttribute) {
generateCreateLinkToolStackLink(next);
}
}
}
}
private void generateCreateLinkToolStackLink(GenLink link) throws InterruptedException, UnexpectedBehaviourException {
doGenerateJavaClass(myEmitters.getCreateLinkToolStackLinkEmitter(), myEmitters.getCreateLinkToolStackLinkFQN(new Object[] { link }), link);
}
private static boolean isTheSameEClass(EClass candidate, EClass pattern) {
if (pattern.equals(candidate)) {
return true;
}
if (candidate == null) {
return false;
}
// its possible that they are loaded separately and not equals
return pattern.getEPackage().getNsURI().equals(candidate.getEPackage().getNsURI()) && pattern.getName().equals(candidate.getName());
}
private static boolean isTheSameEFeature(EStructuralFeature candidate, EStructuralFeature pattern) {
if (candidate.equals(pattern)) {
return true;
}
if (candidate == null) {
return false;
}
return isTheSameEClass(candidate.getEContainingClass(), pattern.getEContainingClass()) && pattern.getName().equals(candidate.getName());
}
private void generateVisualIDRegistyExt(GenDiagram diagram) throws InterruptedException, UnexpectedBehaviourException {
doGenerateJavaClass(myEmitters.getVisualIdRegistryExtEmitter(), myEmitters.getVisualIdRegistryExtFQN(new Object[] { diagram }), diagram);
}
}