1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/*****************************************************************************
* Copyright (c) 2013 CEA LIST.
*
*
* 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:
* Ansgar Radermacher ansgar.radermacher@cea.fr
*
*****************************************************************************/
package org.eclipse.papyrus.qompass.designer.ui.handlers;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.papyrus.FCM.DeploymentPlan;
import org.eclipse.papyrus.qompass.designer.core.CommandSupport;
import org.eclipse.papyrus.qompass.designer.core.RunnableWithResult;
import org.eclipse.papyrus.qompass.designer.core.Utils;
import org.eclipse.papyrus.qompass.designer.core.sync.CompImplSync;
import org.eclipse.papyrus.qompass.designer.core.sync.DepPlanSync;
import org.eclipse.papyrus.qompass.designer.core.sync.InterfaceSync;
import org.eclipse.papyrus.qompass.designer.core.transformations.TransformationRTException;
import org.eclipse.papyrus.uml.diagram.common.handlers.CmdHandler;
import org.eclipse.papyrus.uml.tools.utils.StereotypeUtil;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Interface;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Property;
/**
* Handler for synchronizing derived elements. Will do different
* things, depending on the currently selected object.
*/
public class SyncHandler extends CmdHandler {
/**
* {@inheritDoc}
*/
@Override
public boolean isEnabled() {
updateSelectedEObject();
// if a property is selected, use the associated type
if (selectedEObject instanceof Property) {
selectedEObject = ((Property) selectedEObject).getType();
}
if (selectedEObject instanceof Interface) {
return true;
}
if (selectedEObject instanceof Class) {
if (Utils.isComponent((Class) selectedEObject)) {
return true;
}
}
else if (selectedEObject instanceof Package) {
if (StereotypeUtil.isApplied((Package) selectedEObject, DeploymentPlan.class)) {
return true;
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
// if a property is selected, use the associated type
if (selectedEObject instanceof Property) {
selectedEObject = ((Property) selectedEObject).getType();
}
if (selectedEObject instanceof Interface) {
final Interface selectedIntf = (Interface) selectedEObject;
CommandSupport.exec("Synchronize interface", event, new Runnable() {
@Override
public void run() {
InterfaceSync.syncSignalReceptionSupport(selectedIntf);
}
});
}
else if (selectedEObject instanceof Class) {
final Class selectedClass = (Class) selectedEObject;
if (Utils.isCompImpl(selectedClass)) {
CommandSupport.exec("Synchronize component via implementation", event, new RunnableWithResult() {
@Override
public CommandResult run() {
CompImplSync.updatePorts(selectedClass);
try {
CompImplSync.syncRealizations(selectedClass);
}
catch (TransformationRTException e) {
MessageDialog.openWarning(new Shell(), "Problems during synchronization", e.getMessage());
return CommandResult.newErrorCommandResult(e.getMessage());
}
// CompImplSync.syncContextOps (selectedClass, true);
CompImplSync.interfaceModifications(selectedClass, null);
return CommandResult.newOKCommandResult();
}
});
} else if (Utils.isCompType(selectedClass)) {
CommandSupport.exec("Synchronize component via type", event, new Runnable() {
@Override
public void run() {
if (!CompImplSync.syncViaType(selectedClass, false)) {
MessageDialog.openWarning(new Shell(), "Warning: ineffective command",
"Synchronization applied on a component type (abstract class) will synchronize all implementations, i.e. non-abstract classes inheriting from it. However, the selected type has no implementations");
}
// CompImplSync.syncContextOps (selectedClass, true);
}
});
}
}
else if (selectedEObject instanceof Package) {
final Package selectedPkg = (Package) selectedEObject;
CommandSupport.exec("Synchronize deployment plan", event, new RunnableWithResult() {
@Override
public CommandResult run() {
try {
DepPlanSync.syncDepPlan(selectedPkg);
return CommandResult.newOKCommandResult();
}
catch (TransformationRTException e) {
Shell shell = new Shell();
MessageDialog.openError(shell, "Can not synchronize deployment plan", e.getMessage());
return CommandResult.newErrorCommandResult(e.getMessage());
}
}
});
}
return null;
}
}
|