/** * Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis, * Rick Salay. * 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: * Alessio Di Sandro - Implementation. */ package edu.toronto.cs.se.mmint.mavo.constraint; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import edu.toronto.cs.se.mavo.MAVOCollection; import edu.toronto.cs.se.mavo.MAVODecision; import edu.toronto.cs.se.mavo.MAVOElement; import edu.toronto.cs.se.mmint.MMINTException; import edu.toronto.cs.se.mmint.mavo.reasoning.IMAVOReasoningEngine; import edu.toronto.cs.se.mmint.mavo.reasoning.IMAVOReasoningEngine.MAVOTruthValue; import edu.toronto.cs.se.mmint.mid.ExtendibleElement; import edu.toronto.cs.se.mmint.mid.ExtendibleElementConstraint; import edu.toronto.cs.se.mmint.mid.MIDLevel; import edu.toronto.cs.se.mmint.mid.Model; import edu.toronto.cs.se.mmint.mid.editor.Diagram; import edu.toronto.cs.se.mmint.mid.reasoning.MIDConstraintChecker; public class MAVOMIDConstraintChecker { public static @NonNull IMAVOReasoningEngine getMAVOReasoner(@NonNull String constraintLanguage) throws MMINTException { //TODO MMINT[MAVO] Register reasoners as mavo reasoner return (IMAVOReasoningEngine) MIDConstraintChecker.getReasoner(constraintLanguage); } public static @NonNull MAVOTruthValue checkMAVOModelConstraint(@NonNull Model model, @Nullable ExtendibleElementConstraint constraint) { if (constraint == null || constraint.getImplementation() == null || constraint.getImplementation().equals("")) { return MAVOTruthValue.TRUE; } IMAVOReasoningEngine reasoner; try { reasoner = getMAVOReasoner(constraint.getLanguage()); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping MAVO constraint check", e); return MAVOTruthValue.FALSE; } MIDLevel constraintLevel; if (!model.getUri().equals(((ExtendibleElement) constraint.eContainer()).getUri())) { constraintLevel = MIDLevel.TYPES; } else { constraintLevel = MIDLevel.INSTANCES; } return reasoner.checkMAVOModelConstraint(model, constraint, constraintLevel); } //TODO MMINT[REFINE] Should really throw an exception with errors instead of returning null public static @Nullable Model refineModelByMayAlternative(@NonNull Model model, @NonNull MAVOCollection mayAlternative) { IMAVOReasoningEngine reasoner; try { reasoner = MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB"); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping refinement based on may alternative", e); return null; } return reasoner.refineModelByMayAlternative(model, mayAlternative); } //TODO MMINT[REFINE] Should really throw an exception with errors instead of returning null public static @Nullable Model refineModelByVarDomain(@NonNull Model model, @NonNull MAVOCollection varDomain, @NonNull MAVOElement mergedModelObj, @NonNull List<MAVOElement> varModelObjs) { IMAVOReasoningEngine reasoner; try { reasoner = MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB"); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping refinement based on var domain", e); return null; } return reasoner.refineModelByVarDomain(model, varDomain, mergedModelObj, varModelObjs); } //TODO MMINT[REFINE] Should really throw an exception with errors instead of returning null public static @Nullable Model refineModelByMayModelObjects(@NonNull Model model, @NonNull List<MAVOElement> mayModelObjs) { IMAVOReasoningEngine reasoner; try { reasoner = MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB"); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping refinement based on may model object", e); return null; } return reasoner.refineModelByMayModelObjects(model, mayModelObjs); } public static void highlightMAVODecision(@NonNull Diagram modelDiagram, @NonNull MAVODecision mavoDecision) { IMAVOReasoningEngine reasoner; try { reasoner = MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB"); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping MAVO decision highlighting", e); return; } reasoner.highlightMAVODecision(modelDiagram, mavoDecision); } public static void highlightMAVOCollection(@NonNull Diagram modelDiagram, @NonNull MAVOCollection mavoCollection) { IMAVOReasoningEngine reasoner; try { reasoner = MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB"); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping MAVO collection highlighting", e); return; } reasoner.highlightMAVOCollection(modelDiagram, mavoCollection); } public static void highlightMAVOElement(@NonNull Diagram modelDiagram, @NonNull MAVOElement mavoModelObj) { IMAVOReasoningEngine reasoner; try { reasoner = MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB"); } catch (MMINTException e) { MMINTException.print(IStatus.WARNING, "Skipping MAVO element highlighting", e); return; } reasoner.highlightMAVOElement(modelDiagram, mavoModelObj); } }