1 | package de.uka.ipd.sdq.workflow.pcm.jobs; |
2 | |
3 | import java.util.ArrayList; |
4 | import java.util.HashMap; |
5 | |
6 | import org.eclipse.core.resources.IProject; |
7 | import org.eclipse.core.resources.ResourcesPlugin; |
8 | import org.eclipse.core.runtime.IProgressMonitor; |
9 | import org.eclipse.emf.common.util.URI; |
10 | import org.eclipse.emf.ecore.resource.Resource; |
11 | |
12 | import de.uka.ipd.sdq.workflow.IBlackboardInteractingJob; |
13 | import de.uka.ipd.sdq.workflow.exceptions.JobFailedException; |
14 | import de.uka.ipd.sdq.workflow.exceptions.RollbackFailedException; |
15 | import de.uka.ipd.sdq.workflow.exceptions.UserCanceledException; |
16 | import de.uka.ipd.sdq.workflow.mdsd.blackboard.MDSDBlackboard; |
17 | import de.uka.ipd.sdq.workflow.mdsd.blackboard.ModelLocation; |
18 | import de.uka.ipd.sdq.workflow.mdsd.blackboard.ResourceSetPartition; |
19 | import de.uka.ipd.sdq.workflow.mdsd.blackboard.SavePartitionToDiskJob; |
20 | import de.uka.ipd.sdq.workflow.mdsd.emf.qvto.QVTOTransformationJob; |
21 | import de.uka.ipd.sdq.workflow.mdsd.emf.qvto.QVTOTransformationJobConfiguration; |
22 | import de.uka.ipd.sdq.workflow.pcm.configurations.AbstractPCMWorkflowRunConfiguration; |
23 | |
24 | /** |
25 | * Workflow job to transform the event related model elements to classic |
26 | * pcm model elements |
27 | * |
28 | * @author Benjamin Klatt <klatt@fzi.de> |
29 | */ |
30 | public class EventsTransformationJob |
31 | implements IBlackboardInteractingJob<MDSDBlackboard> { |
32 | |
33 | /** Path to the qvto transformation script */ |
34 | protected static final String TRANSFORMATION_SCRIPT = "platform:/plugin/de.uka.ipd.sdq.pcm.resources/transformations/events/transformation-psm.qvto"; |
35 | |
36 | private static final String TRACESFOLDER = "traces"; |
37 | |
38 | /** Reference to the blackboard to access it in the complete job */ |
39 | private MDSDBlackboard blackboard; |
40 | |
41 | /** SimuCom configuration to be used in this job */ |
42 | private AbstractPCMWorkflowRunConfiguration configuration; |
43 | |
44 | /** |
45 | * Constructor providing access to the SimuCom workflow specific configuration.. |
46 | * |
47 | * @param configuration The configuration object to work with. |
48 | */ |
49 | public EventsTransformationJob(AbstractPCMWorkflowRunConfiguration configuration) { |
50 | super(); |
51 | this.configuration = configuration; |
52 | } |
53 | |
54 | public void execute(IProgressMonitor monitor) throws JobFailedException, |
55 | UserCanceledException { |
56 | |
57 | // get the models to work with |
58 | ModelLocation[] modelLocations = getRequiredModels(blackboard); |
59 | |
60 | configuration.getEventMiddlewareFile(); |
61 | |
62 | // build file paths |
63 | URI traceFileURI = URI.createURI(getProject(configuration.getStoragePluginID()) |
64 | .getFolder(TRACESFOLDER) |
65 | .getFullPath().toOSString()); |
66 | URI scriptFileURI = URI.createURI(TRANSFORMATION_SCRIPT); |
67 | |
68 | // configure the QVTO Job |
69 | QVTOTransformationJobConfiguration qvtoConfig = new QVTOTransformationJobConfiguration(); |
70 | qvtoConfig.setInoutModels(modelLocations); |
71 | qvtoConfig.setTraceFileURI(traceFileURI); |
72 | qvtoConfig.setScriptFileURI(scriptFileURI); |
73 | qvtoConfig.setOptions(new HashMap<String,Object>()); |
74 | |
75 | // create and add the qvto job |
76 | QVTOTransformationJob job = new QVTOTransformationJob(qvtoConfig); |
77 | job.setBlackboard(blackboard); |
78 | job.execute(monitor); |
79 | |
80 | // add the event middleware model to the blackboard |
81 | ResourceSetPartition partition = blackboard.getPartition(LoadPCMModelsIntoBlackboardJob.PCM_MODELS_PARTITION_ID); |
82 | partition.loadModel(configuration.getEventMiddlewareFile()); |
83 | |
84 | // save the modified model |
85 | SavePartitionToDiskJob savePartitionJob = new SavePartitionToDiskJob(LoadPCMModelsIntoBlackboardJob.PCM_MODELS_PARTITION_ID); |
86 | savePartitionJob.setBlackboard(blackboard); |
87 | savePartitionJob.execute(monitor); |
88 | |
89 | } |
90 | |
91 | /** |
92 | * Build the location objects out of the blackboards PCM model partition. |
93 | * |
94 | * @param blackboard The blackboard to work with. |
95 | * @return The prepared model locations for the PCM models. |
96 | */ |
97 | private ModelLocation[] getRequiredModels(MDSDBlackboard blackboard) { |
98 | |
99 | // prepare the models required for the transformation |
100 | ModelLocation allocationModelLocation = null; |
101 | ModelLocation systemModelLocation = null; |
102 | ModelLocation repositoryModelLocation = null; |
103 | |
104 | // find the models in the blackboard |
105 | String pcmModelPartitionId = LoadPCMModelsIntoBlackboardJob.PCM_MODELS_PARTITION_ID; |
106 | ResourceSetPartition partition = blackboard.getPartition(pcmModelPartitionId); |
107 | partition.resolveAllProxies(); |
108 | for (Resource r : partition.getResourceSet().getResources()) { |
109 | URI modelURI = r.getURI(); |
110 | String fileExtension = modelURI.fileExtension(); |
111 | |
112 | if(fileExtension.equals("allocation")){ |
113 | allocationModelLocation = new ModelLocation(pcmModelPartitionId, modelURI); |
114 | } |
115 | |
116 | if(fileExtension.equals("system")){ |
117 | systemModelLocation = new ModelLocation(pcmModelPartitionId, modelURI); |
118 | } |
119 | |
120 | if(fileExtension.equals("repository") |
121 | && repositoryModelLocation == null |
122 | && !modelURI.toString().startsWith("pathmap://")){ |
123 | repositoryModelLocation = new ModelLocation(pcmModelPartitionId, modelURI); |
124 | } |
125 | } |
126 | |
127 | // Build the model location list |
128 | ArrayList<ModelLocation> modelLocations = new ArrayList<ModelLocation>(); |
129 | modelLocations.add(allocationModelLocation); |
130 | modelLocations.add(systemModelLocation); |
131 | modelLocations.add(repositoryModelLocation); |
132 | |
133 | // add the additional event middleware model |
134 | modelLocations.add(getEventMiddlewareModel(blackboard)); |
135 | |
136 | |
137 | return modelLocations.toArray(new ModelLocation[]{}); |
138 | } |
139 | |
140 | /** |
141 | * Get the middleware repository from the appropriate blackboard partition |
142 | * |
143 | * @param blackboard The blackboard to get the model from |
144 | * @return The event middleware model |
145 | */ |
146 | private ModelLocation getEventMiddlewareModel(MDSDBlackboard blackboard) { |
147 | |
148 | ResourceSetPartition eventMiddlewarePartition = blackboard.getPartition(LoadPCMModelsIntoBlackboardJob.EVENT_MIDDLEWARE_PARTITION_ID); |
149 | eventMiddlewarePartition.resolveAllProxies(); |
150 | |
151 | // Only the first resource is necessary. |
152 | // All the others are eventually referenced models like the PrimitiveTypes repository we do not need here |
153 | Resource r = eventMiddlewarePartition.getResourceSet().getResources().get(0); |
154 | return new ModelLocation(LoadPCMModelsIntoBlackboardJob.EVENT_MIDDLEWARE_PARTITION_ID, r.getURI()); |
155 | } |
156 | |
157 | public void setBlackboard(MDSDBlackboard blackboard) { |
158 | this.blackboard = blackboard; |
159 | } |
160 | |
161 | public String getName() { |
162 | return "Add event transformation job"; |
163 | } |
164 | |
165 | public void rollback(IProgressMonitor monitor) |
166 | throws RollbackFailedException { |
167 | // Nothing to do for the roll back |
168 | } |
169 | |
170 | /** |
171 | * returns a new project to be used for the simulation |
172 | * |
173 | * @return a handle to the project to be used for the simulation |
174 | */ |
175 | public static IProject getProject(String projectId) { |
176 | return ResourcesPlugin.getWorkspace().getRoot().getProject( |
177 | projectId); |
178 | } |
179 | |
180 | } |