diff --git a/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/AnalysisResultUtil.java b/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/AnalysisResultUtil.java index 791a7b192a64cfce24efc689a1246bac364607a8..3e5dd00aadd1fe41e96adecc5209245e2336a586 100644 --- a/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/AnalysisResultUtil.java +++ b/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/AnalysisResultUtil.java @@ -66,6 +66,7 @@ public class AnalysisResultUtil { public static final String CONTRACT_BASED_FTA_ANALYSIS = "CONTRACT_FTA"; public static final String CONTRACT_REFINEMENT_ANALYSIS = "CONTRACT_REF"; public static final String CONTRACT_IMPLEMENTATION_ANALYSIS = "CONTRACT_IMPL"; + public static final String PROPERTY_VALIDATION_ANALYSIS = "PROP_VALIDATION"; private static AnalysisResultUtil packageUtilInstance; private final EntityUtil entityUtil = EntityUtil.getInstance(); diff --git a/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/FileNamesUtil.java b/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/FileNamesUtil.java index c3da391466a8af588c47b66e2c6ae17c9de82789..9b77e175f8ab6ca8c09913ebf53374d903c89ad1 100644 --- a/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/FileNamesUtil.java +++ b/plugins/contracts/org.polarsys.chess.contracts.transformations/src/org/polarsys/chess/contracts/transformations/utils/FileNamesUtil.java @@ -230,4 +230,15 @@ public class FileNamesUtil { return resPath + File.separator + computeQualifiedName(systemComponent) + "_" + AnalysisResultUtil.CONTRACT_IMPLEMENTATION_ANALYSIS + "_" + getDate() + XML_EXT; } + + /** + * Computes the file name for the Property Validation analysis. + * @param systemComponent the root component of the analysis + * @return + */ + public String computePropertyValidationFileName(Class systemComponent) { + final String resPath = AnalysisResultUtil.getInstance().getResultDir(); + return resPath + File.separator + computeQualifiedName(systemComponent) + "_" + + AnalysisResultUtil.PROPERTY_VALIDATION_ANALYSIS + "_" + getDate() + XML_EXT; + } } diff --git a/plugins/contracts/org.polarsys.chess.contracts.verificationService/plugin.xml b/plugins/contracts/org.polarsys.chess.contracts.verificationService/plugin.xml index 2f8ce73b3edd92d2e514dfc46db7f4f1de83759b..02d0ac7d41fe8eaef5aa884b655733609aa2493e 100644 --- a/plugins/contracts/org.polarsys.chess.contracts.verificationService/plugin.xml +++ b/plugins/contracts/org.polarsys.chess.contracts.verificationService/plugin.xml @@ -137,6 +137,16 @@ name="store_result" value="true"> </parameter> + </command> + <command + commandId="org.polarsys.chess.verificationService.ui.commands.CheckValidationAssertionPropertyCommand" + icon="icons/contract_verification.png" + label="Check Validation on Properties" + style="push"> + <parameter + name="store_result" + value="true"> + </parameter> </command> </menu> </menuContribution> @@ -371,6 +381,11 @@ defaultHandler="org.polarsys.chess.verificationService.ui.commands.CheckValidationAssertionPropertyCommand" id="org.polarsys.chess.verificationService.ui.commands.CheckValidationAssertionPropertyCommand" name="Check Validation on Properties on selected component"> + <commandParameter + id="store_result" + name="storeResult" + optional="true"> + </commandParameter> </command> </extension> </plugin> diff --git a/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CheckValidationAssertionPropertyCommand.java b/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CheckValidationAssertionPropertyCommand.java index 3f2abc6f666559a74325244a4bc497460d544217..dfe9ffadfc4db8c8b857a8463e45783651cf4a3c 100644 --- a/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CheckValidationAssertionPropertyCommand.java +++ b/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CheckValidationAssertionPropertyCommand.java @@ -14,6 +14,9 @@ import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.uml2.uml.Class; +import org.polarsys.chess.contracts.transformations.utils.AnalysisResultUtil; +import org.polarsys.chess.contracts.transformations.utils.FileNamesUtil; +import org.polarsys.chess.service.core.exceptions.NoComponentException; import org.polarsys.chess.service.core.model.ChessSystemModel; import org.polarsys.chess.service.gui.utils.SelectionUtil; @@ -21,6 +24,7 @@ import eu.fbk.eclipse.standardtools.ExecOcraCommands.ui.services.OCRAExecService import eu.fbk.eclipse.standardtools.utils.ui.commands.AbstractJobCommand; import eu.fbk.eclipse.standardtools.utils.ui.dialogs.MessageTimeModelDialog; import eu.fbk.eclipse.standardtools.utils.ui.utils.OCRADirectoryUtil; +import eu.fbk.tools.adapter.ocra.CheckValidationProperty; /** * @@ -32,7 +36,8 @@ public class CheckValidationAssertionPropertyCommand extends AbstractJobCommand private OCRAExecService ocraExecService = OCRAExecService.getInstance(chessToOCRAModelTranslator); private SelectionUtil selectionUtil = SelectionUtil.getInstance(); private OCRADirectoryUtil ocraDirectoryUtil = OCRADirectoryUtil.getInstance(); - + private AnalysisResultUtil analysisResultUtil = AnalysisResultUtil.getInstance(); + public CheckValidationAssertionPropertyCommand() { super("Check Validation Property"); } @@ -44,25 +49,57 @@ public class CheckValidationAssertionPropertyCommand extends AbstractJobCommand private boolean usexTextValidation; private String ossFilepath; private String resultFilePath; - + private boolean storeResult; + @Override public void execPreJobOperations(ExecutionEvent event, IProgressMonitor monitor) throws Exception { - umlSelectedComponent = selectionUtil.getUmlComponentFromSelectedObject(event); + final String storeResultParam = "store_result"; + + // The user could select a component or a package containing an architecture + // In the latter case, extract the system component from that package + try { + umlSelectedComponent = selectionUtil.getUmlComponentFromSelectedObject(event); + } catch (NoComponentException e) { + umlSelectedComponent = analysisResultUtil.getSystemComponentFromEvent(event); + } +// umlSelectedComponent = selectionUtil.getUmlComponentFromSelectedObject(event); umlSelectedResource = umlSelectedComponent.eResource(); isDiscreteTime = MessageTimeModelDialog.openQuestion(false); showPopups = false; usexTextValidation=true; ossFilepath = ocraDirectoryUtil.getOSSFilePath(); - resultFilePath = ocraDirectoryUtil.getCommandCheckPropertyResultPath(umlSelectedComponent.getName()); + + storeResult = (event.getParameter(storeResultParam) != null && + event.getParameter(storeResultParam).equals("true")) ? true : false; + if (storeResult) { + resultFilePath = FileNamesUtil.getInstance().computePropertyValidationFileName(umlSelectedComponent); + } else { + resultFilePath = ocraDirectoryUtil.getCommandCheckPropertyResultPath(umlSelectedComponent.getName()); + } + + // If requested to store the data, execute the command here, cannot be called later + if (storeResult) { + String[] conditions = new String[1]; // It will be filled by the method + if(ocraExecService.executeValidationAssertionProperty(umlSelectedComponent, umlSelectedResource, isDiscreteTime, usexTextValidation,showPopups, + ossFilepath, resultFilePath, monitor, true, conditions)) { + + // Store the result + analysisResultUtil.storeResult(AnalysisResultUtil.PROPERTY_VALIDATION_ANALYSIS, conditions[0], + resultFilePath, umlSelectedComponent, null); + + // Visualize the result + analysisResultUtil.showResult(CheckValidationProperty.FUNCTION_NAME, resultFilePath); + } + } } @Override public void execJobCommand(ExecutionEvent event, IProgressMonitor monitor) throws Exception { - ocraExecService.executeValidationAssertionProperty(umlSelectedComponent, umlSelectedResource, isDiscreteTime, usexTextValidation,showPopups, - ossFilepath, resultFilePath, monitor); - + if (!storeResult) { + ocraExecService.executeValidationAssertionProperty(umlSelectedComponent, umlSelectedResource, isDiscreteTime, usexTextValidation,showPopups, + ossFilepath, resultFilePath, monitor, false, null); + } } - } diff --git a/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CompositeContractImplementationCommand.java b/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CompositeContractImplementationCommand.java index b3c097457c183c0ebb75e639f3270ec651adb475..9075e9225a85ad667b353968f8759702bb07b986 100644 --- a/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CompositeContractImplementationCommand.java +++ b/plugins/contracts/org.polarsys.chess.contracts.verificationService/src/org/polarsys/chess/verificationService/ui/commands/CompositeContractImplementationCommand.java @@ -29,7 +29,6 @@ import eu.fbk.eclipse.standardtools.utils.ui.commands.AbstractJobCommand; import eu.fbk.eclipse.standardtools.utils.ui.dialogs.MessageTimeModelDialog; import eu.fbk.eclipse.standardtools.utils.ui.utils.OCRADirectoryUtil; import eu.fbk.tools.adapter.ocra.CheckContractCompositeImplementation; -import eu.fbk.tools.adapter.ocra.ComputeContractFaultTree; public class CompositeContractImplementationCommand extends AbstractJobCommand { diff --git a/plugins/org.polarsys.chess.diagram.ui/src/org/polarsys/chess/diagram/ui/services/ResultsGeneratorService.java b/plugins/org.polarsys.chess.diagram.ui/src/org/polarsys/chess/diagram/ui/services/ResultsGeneratorService.java index 838243103b383533fe107aa49b2ca9325c84176a..4b809c11d6d964b6d5e7e7612ed321ff5772ec11 100644 --- a/plugins/org.polarsys.chess.diagram.ui/src/org/polarsys/chess/diagram/ui/services/ResultsGeneratorService.java +++ b/plugins/org.polarsys.chess.diagram.ui/src/org/polarsys/chess/diagram/ui/services/ResultsGeneratorService.java @@ -55,10 +55,12 @@ import eu.fbk.eclipse.standardtools.diagram.ContractRefinementResultDescriptor; import eu.fbk.eclipse.standardtools.diagram.DocumentGenerator; import eu.fbk.eclipse.standardtools.diagram.FmeaResultDescriptor; import eu.fbk.eclipse.standardtools.diagram.FtaResultDescriptor; +import eu.fbk.eclipse.standardtools.diagram.PropertyValidationResultDescriptor; import eu.fbk.tools.adapter.ocra.CheckContractResultBuilder; import eu.fbk.tools.adapter.results.CheckResult; import eu.fbk.tools.adapter.ocra.OcraOutput; import eu.fbk.tools.adapter.results.ContractCheckResult; +import eu.fbk.tools.adapter.results.ContractPropertyValidationResult; import eu.fbk.tools.adapter.results.ModelCheckResult; import eu.fbk.tools.adapter.xsap.ComputeFmeaTableResultBuilder; import eu.fbk.tools.adapter.xsap.table.FmeaTable; @@ -161,7 +163,6 @@ public class ResultsGeneratorService { // System.out.println("\tcheckResult.getProofType() = " + checkResult.getProofType()); // System.out.println("\tcheckResult.getValue() = " + checkResult.getValue()); // } - } return contractRefinementResultDescriptor; @@ -222,6 +223,60 @@ public class ResultsGeneratorService { return contractImplementationResultDescriptor; } + /** + * Creates a PropertyValidationResultDescriptor from the given ResultElement. + * @param resultElement the element containing the data + * @return the newly created descriptor + */ + private PropertyValidationResultDescriptor createPropertyValidationResultDescriptor(ResultElement resultElement) { + final PropertyValidationResultDescriptor propertyValidationResultDescriptor = + new PropertyValidationResultDescriptor(); + + propertyValidationResultDescriptor.rootClass = EntityUtil.getInstance().getName(resultElement.getRoot()); + + final File resultFile = new File(resultElement.getFile()); + final CheckContractResultBuilder resultBuilder = new CheckContractResultBuilder(); + final OcraOutput ocraOutput = resultBuilder.unmarshalResult(resultFile); + if(ocraOutput == null || ocraOutput.getOcraResult() == null || ocraOutput.getOcraResult().isEmpty()) { + logger.debug("Error while unmarshalling the result. For more info see the console"); + return null; + } + + final ModelCheckResult contractCheckResult = resultBuilder.buildResult(ocraOutput); + if(contractCheckResult == null) { + logger.debug("Internal error while building the result. For more info see the console"); + return null; + } + + final List<ContractPropertyValidationResult> propertyValidationResults = + contractCheckResult.getPropertyValidationResults(); + for (ContractPropertyValidationResult result : propertyValidationResults) { + if (result.getCheckType().equals("ocra_check_validation_prop")) { +// final String[] line = new String[2]; +// line[0] = "[" + result.getComponentType() + "] " + result.getContractName(); +// line[1] = result.getFailed()? "NOT OK": "Success"; +// propertyValidationResultDescriptor.lines.add(line); + } + + System.out.println("\nresult.getCheckType() = " + result.getCheckType()); + System.out.println("result.getModelName() = " + result.getModelName()); + System.out.println("result.getName() = " + result.getName()); + + System.out.println("result.getFailed() = " + result.getFailed()); + + EList<CheckResult> checkResults = result.getCheckResults(); + for (CheckResult checkResult : checkResults) { + checkResult.getContractName(); + System.out.println("\tcheckResult.getContractName() = " + checkResult.getContractName()); + System.out.println("\tcheckResult.getProofType() = " + checkResult.getProofType()); + System.out.println("\tcheckResult.getValue() = " + checkResult.getValue()); + } + + } + + return propertyValidationResultDescriptor; + } + /** * Computes the EMFTA name from the given XML file. * @param fullPath the full name of the XML file @@ -402,6 +457,10 @@ public class ResultsGeneratorService { rootContainer.contractRefinementResultDescriptors.clear(); // There can be only one of this kind rootContainer.contractRefinementResultDescriptors.add(contractRefinementResultDescriptor); } + } else if (resultType.equals(AnalysisResultUtil.PROPERTY_VALIDATION_ANALYSIS)) { + final PropertyValidationResultDescriptor propertyValidationResultDescriptor = + createPropertyValidationResultDescriptor(resultElement); + rootContainer.propertyValidationResultDescriptors.add(propertyValidationResultDescriptor); } //TODO: implementare anche gli altri casi... }