| 1 | package de.uka.ipd.sdq.workflow.pcm.configurations; |
| 2 | |
| 3 | import java.util.ArrayList; |
| 4 | import java.util.List; |
| 5 | |
| 6 | import org.apache.log4j.Logger; |
| 7 | import org.eclipse.emf.common.util.URI; |
| 8 | import org.eclipse.emf.ecore.EPackage; |
| 9 | import org.eclipse.emf.ecore.EcorePackage; |
| 10 | |
| 11 | import de.uka.ipd.sdq.completions.CompletionsPackage; |
| 12 | import de.uka.ipd.sdq.identifier.IdentifierPackage; |
| 13 | import de.uka.ipd.sdq.pcm.PcmPackage; |
| 14 | import de.uka.ipd.sdq.pcm.allocation.AllocationPackage; |
| 15 | import de.uka.ipd.sdq.pcm.core.CorePackage; |
| 16 | import de.uka.ipd.sdq.pcm.parameter.ParameterPackage; |
| 17 | import de.uka.ipd.sdq.pcm.qosannotations.qos_reliability.Qos_reliabilityPackage; |
| 18 | import de.uka.ipd.sdq.pcm.reliability.ReliabilityPackage; |
| 19 | import de.uka.ipd.sdq.pcm.repository.RepositoryPackage; |
| 20 | import de.uka.ipd.sdq.pcm.resourceenvironment.ResourceenvironmentPackage; |
| 21 | import de.uka.ipd.sdq.pcm.resourcetype.ResourcetypePackage; |
| 22 | import de.uka.ipd.sdq.pcm.seff.SeffPackage; |
| 23 | import de.uka.ipd.sdq.pcm.seff.seff_reliability.Seff_reliabilityPackage; |
| 24 | import de.uka.ipd.sdq.pcm.system.SystemPackage; |
| 25 | import de.uka.ipd.sdq.pcm.usagemodel.UsagemodelPackage; |
| 26 | import de.uka.ipd.sdq.probfunction.ProbfunctionPackage; |
| 27 | import de.uka.ipd.sdq.stoex.StoexPackage; |
| 28 | import de.uka.ipd.sdq.units.UnitsPackage; |
| 29 | import de.uka.ipd.sdq.workflow.exceptions.InvalidWorkflowJobConfiguration; |
| 30 | import de.uka.ipd.sdq.workflow.launchconfig.AbstractWorkflowBasedRunConfiguration; |
| 31 | import de.uka.ipd.sdq.workflow.pcm.ConstantsContainer; |
| 32 | import de.uka.ipd.sdq.workflow.pcm.jobs.IIssueReceiver; |
| 33 | import de.uka.ipd.sdq.workflow.pcm.runconfig.AccuracyInfluenceAnalysisState; |
| 34 | |
| 35 | /** |
| 36 | * Base class of workflow configuration objects where the workflow has to deal |
| 37 | * with a PCM model instance. This configuration class holds the locations of |
| 38 | * the PCM model parts, and (for convinience) a static list of EPackages needed |
| 39 | * to read the files. |
| 40 | * |
| 41 | * @author Steffen Becker |
| 42 | */ |
| 43 | public abstract class AbstractPCMWorkflowRunConfiguration extends |
| 44 | AbstractWorkflowBasedRunConfiguration implements Cloneable { |
| 45 | /** Logger for this class. */ |
| 46 | private static final Logger logger = Logger.getLogger(AbstractPCMWorkflowRunConfiguration.class); |
| 47 | |
| 48 | /** |
| 49 | * Contains All EPackages within or referenced by PCM. Used, e.g., for OAW |
| 50 | * template generation. |
| 51 | */ |
| 52 | public static final EPackage[] PCM_EPACKAGES = new EPackage[] { |
| 53 | // Packages needed by QVT Transformations {{ |
| 54 | EcorePackage.eINSTANCE, |
| 55 | IdentifierPackage.eINSTANCE, |
| 56 | UnitsPackage.eINSTANCE, |
| 57 | ProbfunctionPackage.eINSTANCE, |
| 58 | PcmPackage.eINSTANCE, |
| 59 | // }} |
| 60 | SeffPackage.eINSTANCE, |
| 61 | RepositoryPackage.eINSTANCE, |
| 62 | ParameterPackage.eINSTANCE, |
| 63 | UsagemodelPackage.eINSTANCE, |
| 64 | SystemPackage.eINSTANCE, |
| 65 | ResourcetypePackage.eINSTANCE, |
| 66 | ResourceenvironmentPackage.eINSTANCE, |
| 67 | AllocationPackage.eINSTANCE, |
| 68 | StoexPackage.eINSTANCE, |
| 69 | CorePackage.eINSTANCE, |
| 70 | CompletionsPackage.eINSTANCE, |
| 71 | ReliabilityPackage.eINSTANCE, |
| 72 | Qos_reliabilityPackage.eINSTANCE, |
| 73 | Seff_reliabilityPackage.eINSTANCE}; |
| 74 | |
| 75 | protected String middlewareFile; |
| 76 | protected String eventMiddlewareFile; |
| 77 | protected List<String> allocationFiles; |
| 78 | protected String usageModelFile; |
| 79 | |
| 80 | /** Storage for temporary models and code. */ |
| 81 | protected String temporaryDataLocation; |
| 82 | /** State if temporary data (models and/or code) should be deleted after the analysis. */ |
| 83 | protected boolean deleteTemporaryDataAfterAnalysis; |
| 84 | |
| 85 | /** Activation state of the accuracy influence analysis. */ |
| 86 | protected boolean accuracyInfluenceAnalysisEnabled; |
| 87 | /** Path to the file containing the accuracy information model. */ |
| 88 | protected String accuracyInformationModelFile; |
| 89 | /** State of the current accuracy influence analysis. */ |
| 90 | protected AccuracyInfluenceAnalysisState accuracyInfluenceAnalysisState; |
| 91 | /** Job receiving the issues occurred during accuracy influence analysis. */ |
| 92 | protected IIssueReceiver accuracyInfluenceIssueReceivingJob; |
| 93 | |
| 94 | protected boolean overwriteWithoutAsking = false; |
| 95 | |
| 96 | /** |
| 97 | * @return Returns the receiving job for accuracy influence analysis issues |
| 98 | */ |
| 99 | public IIssueReceiver getAccuracyInfluenceIssueReceivingJob() { |
| 100 | return accuracyInfluenceIssueReceivingJob; |
| 101 | } |
| 102 | |
| 103 | /** |
| 104 | * @param accuracyInfluenceIssueReceivingJob Sets the receiving job for accuracy influence analysis issues. |
| 105 | */ |
| 106 | public void setAccuracyInfluenceIssueReceivingJob( |
| 107 | IIssueReceiver accuracyInfluenceIssueReceivingJob) { |
| 108 | this.accuracyInfluenceIssueReceivingJob = accuracyInfluenceIssueReceivingJob; |
| 109 | } |
| 110 | |
| 111 | /** |
| 112 | * @return Returns the current accuracy influence analysis state. |
| 113 | */ |
| 114 | public AccuracyInfluenceAnalysisState getAccuracyInfluenceAnalysisState() { |
| 115 | return accuracyInfluenceAnalysisState; |
| 116 | } |
| 117 | |
| 118 | /**Sets the accuracy influence analysis state. |
| 119 | * @param accuracyInfluenceAnalysisState The new state. |
| 120 | */ |
| 121 | public void setAccuracyInfluenceAnalysisState( |
| 122 | AccuracyInfluenceAnalysisState accuracyInfluenceAnalysisState) { |
| 123 | this.accuracyInfluenceAnalysisState = accuracyInfluenceAnalysisState; |
| 124 | } |
| 125 | |
| 126 | /** |
| 127 | * @return if deletion of temporary data after analysis is enabled. |
| 128 | */ |
| 129 | public boolean isDeleteTemporaryDataAfterAnalysis() { |
| 130 | return deleteTemporaryDataAfterAnalysis; |
| 131 | } |
| 132 | |
| 133 | /**Sets the activation state for the deletion of temporary data after an analysis. |
| 134 | * @param deleteTemporaryDataAfterAnalysis |
| 135 | */ |
| 136 | public void setDeleteTemporaryDataAfterAnalysis( |
| 137 | boolean deleteTemporaryDataAfterAnalysis) { |
| 138 | checkFixed(); |
| 139 | this.deleteTemporaryDataAfterAnalysis = deleteTemporaryDataAfterAnalysis; |
| 140 | } |
| 141 | |
| 142 | /** |
| 143 | * @return Returns the activation state of the accuracy influence analysis. |
| 144 | */ |
| 145 | public boolean isAccuracyInfluenceAnalysisEnabled() { |
| 146 | return accuracyInfluenceAnalysisEnabled; |
| 147 | } |
| 148 | |
| 149 | /**Set the activation state of the accuracy influence analysis. |
| 150 | * @param enabled Activation state. |
| 151 | */ |
| 152 | public void setAccuracyInfluenceAnalysisEnabled(boolean enabled) { |
| 153 | checkFixed(); |
| 154 | this.accuracyInfluenceAnalysisEnabled = enabled; |
| 155 | } |
| 156 | |
| 157 | /** |
| 158 | * @return Returns the string representation of the path to the file containing the accuracy information model. |
| 159 | */ |
| 160 | public String getAccuracyInformationModelFile() { |
| 161 | return accuracyInformationModelFile; |
| 162 | } |
| 163 | |
| 164 | /**Set the path to the file containing the accuracy information model. |
| 165 | * @param accuracyInformationModelFile |
| 166 | */ |
| 167 | public void setAccuracyInformationModelFile(String accuracyInformationModelFile) { |
| 168 | checkFixed(); |
| 169 | this.accuracyInformationModelFile = accuracyInformationModelFile; |
| 170 | } |
| 171 | |
| 172 | /** |
| 173 | * @return Returns the ID of the Eclipse plug-in project to be generated as temporary storage for models and, if applicable, code. |
| 174 | */ |
| 175 | public String getStoragePluginID() { |
| 176 | StringBuilder sb = new StringBuilder(); |
| 177 | sb.append(temporaryDataLocation); |
| 178 | if (isAccuracyInfluenceAnalysisEnabled()) { |
| 179 | sb.append("_" + accuracyInfluenceAnalysisState); |
| 180 | } |
| 181 | return sb.toString(); |
| 182 | } |
| 183 | |
| 184 | /** |
| 185 | * Sets the name of the Eclipse plug-in project which will be generated as temporary storage for models and, if applicable, code. |
| 186 | * |
| 187 | * @param pluginID |
| 188 | * The name of the project containing the generated code |
| 189 | */ |
| 190 | public void setStoragePluginID(String pluginID) { |
| 191 | checkFixed(); |
| 192 | this.temporaryDataLocation = pluginID; |
| 193 | } |
| 194 | |
| 195 | |
| 196 | /** |
| 197 | * @return Returns a list of string URIs containing all model files needed |
| 198 | * for a full PCM instance |
| 199 | */ |
| 200 | public List<String> getPCMModelFiles() { |
| 201 | ArrayList<String> files = new ArrayList<String>(); |
| 202 | files.addAll(allocationFiles); |
| 203 | files.add(usageModelFile); |
| 204 | if (accuracyInfluenceAnalysisEnabled) { |
| 205 | files.add(accuracyInformationModelFile); |
| 206 | } |
| 207 | |
| 208 | return files; |
| 209 | } |
| 210 | |
| 211 | /** |
| 212 | * @return Returns the filename of the PCM's middleware completion |
| 213 | * repository |
| 214 | */ |
| 215 | public String getMiddlewareFile() { |
| 216 | return middlewareFile; |
| 217 | } |
| 218 | |
| 219 | /** |
| 220 | * Sets the filename of the PCM's middleware completion repository |
| 221 | * |
| 222 | * @param middlewareFile |
| 223 | */ |
| 224 | public void setMiddlewareFile(String middlewareFile) { |
| 225 | checkFixed(); |
| 226 | this.middlewareFile = middlewareFile; |
| 227 | } |
| 228 | |
| 229 | /** |
| 230 | * @return Returns the filename of the PCM's middleware completion |
| 231 | * repository. If the repository was not set before, the default file will be returned. |
| 232 | */ |
| 233 | public String getEventMiddlewareFile() { |
| 234 | if(eventMiddlewareFile != null){ |
| 235 | return eventMiddlewareFile; |
| 236 | } else { |
| 237 | return ConstantsContainer.DEFAULT_EVENT_MIDDLEWARE_FILE; |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | /** |
| 242 | * Sets the filename of the PCM's middleware completion repository |
| 243 | * |
| 244 | * @param eventMiddlewareFile |
| 245 | */ |
| 246 | public void setEventMiddlewareFile(String eventMiddlewareFile) { |
| 247 | checkFixed(); |
| 248 | this.eventMiddlewareFile = eventMiddlewareFile; |
| 249 | } |
| 250 | |
| 251 | public List<String> getAllocationFiles() { |
| 252 | return allocationFiles; |
| 253 | } |
| 254 | |
| 255 | public void setAllocationFiles(List<String> allocationFile) { |
| 256 | checkFixed(); |
| 257 | this.allocationFiles = allocationFile; |
| 258 | } |
| 259 | |
| 260 | public String getUsageModelFile() { |
| 261 | return usageModelFile; |
| 262 | } |
| 263 | |
| 264 | public void setUsageModelFile(String usageModelFile) { |
| 265 | checkFixed(); |
| 266 | this.usageModelFile = usageModelFile; |
| 267 | } |
| 268 | |
| 269 | |
| 270 | public boolean isOverwriteWithoutAsking() { |
| 271 | return overwriteWithoutAsking; |
| 272 | } |
| 273 | |
| 274 | public void setOverwriteWithoutAsking(boolean overwriteWithoutAsking) { |
| 275 | this.overwriteWithoutAsking = overwriteWithoutAsking; |
| 276 | } |
| 277 | |
| 278 | /* |
| 279 | * (non-Javadoc) |
| 280 | * |
| 281 | * @see |
| 282 | * de.uka.ipd.sdq.workflow.launchconfig.AbstractWorkflowBasedRunConfiguration |
| 283 | * #validateAndFreeze() |
| 284 | */ |
| 285 | @Override |
| 286 | public void validateAndFreeze() throws InvalidWorkflowJobConfiguration { |
| 287 | super.validateAndFreeze(); |
| 288 | for (String fileURI : getPCMModelFiles()) { |
| 289 | if (fileURI == null) |
| 290 | throw new InvalidWorkflowJobConfiguration( |
| 291 | "Workflow configuration is invalid, not all PCM models are set"); |
| 292 | URI fileLocation = URI.createURI(fileURI); |
| 293 | // TODO: Check whether file exists |
| 294 | } |
| 295 | } |
| 296 | |
| 297 | @Override |
| 298 | protected Object clone() throws CloneNotSupportedException { |
| 299 | AbstractPCMWorkflowRunConfiguration config = (AbstractPCMWorkflowRunConfiguration) super.clone(); |
| 300 | config.accuracyInfluenceAnalysisEnabled = this.accuracyInfluenceAnalysisEnabled; |
| 301 | config.accuracyInfluenceAnalysisState = this.accuracyInfluenceAnalysisState; |
| 302 | config.accuracyInformationModelFile = new String(this.accuracyInformationModelFile); |
| 303 | ArrayList<String> newAllocationFiles = new ArrayList<String>(this.allocationFiles.size()); |
| 304 | for (String allocationFile : this.allocationFiles) { |
| 305 | newAllocationFiles.add(new String(allocationFile)); |
| 306 | } |
| 307 | config.allocationFiles = newAllocationFiles; |
| 308 | config.deleteTemporaryDataAfterAnalysis = this.deleteTemporaryDataAfterAnalysis; |
| 309 | config.eventMiddlewareFile = new String(this.eventMiddlewareFile); |
| 310 | config.middlewareFile = new String(this.middlewareFile); |
| 311 | config.temporaryDataLocation = new String(temporaryDataLocation); |
| 312 | config.usageModelFile = new String(usageModelFile); |
| 313 | config.accuracyInfluenceIssueReceivingJob = this.accuracyInfluenceIssueReceivingJob; |
| 314 | return config; |
| 315 | } |
| 316 | |
| 317 | public AbstractPCMWorkflowRunConfiguration getClone() { |
| 318 | try { |
| 319 | return (AbstractPCMWorkflowRunConfiguration) clone(); |
| 320 | } catch (CloneNotSupportedException e) { |
| 321 | logger.fatal("Could not clone configuration.", e); |
| 322 | return null; |
| 323 | } |
| 324 | } |
| 325 | } |