/**
* 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.java.reasoning;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import edu.toronto.cs.se.mmint.MMINTException;
import edu.toronto.cs.se.mmint.MIDTypeRegistry;
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.operator.Operator;
import edu.toronto.cs.se.mmint.mid.operator.OperatorConstraint;
import edu.toronto.cs.se.mmint.mid.reasoning.IReasoningEngine;
public class JavaReasoningEngine implements IReasoningEngine {
@Override
public boolean checkModelConstraint(@NonNull Model model, ExtendibleElementConstraint constraint, @NonNull MIDLevel constraintLevel) {
String javaClassName = constraint.getImplementation();
String modelTypeUri = (constraintLevel == MIDLevel.INSTANCES) ?
((Model) constraint.eContainer()).getMetatypeUri() :
((Model) constraint.eContainer()).getUri();
try {
IJavaModelConstraint javaConstraint = (IJavaModelConstraint)
MIDTypeRegistry.getTypeBundle(modelTypeUri).
loadClass(javaClassName).
getConstructor().
newInstance();
return javaConstraint.validate(model);
}
catch (Exception e) {
MMINTException.print(IStatus.WARNING, "Java constraint error, evaluating to false: " + javaClassName, e);
return false;
}
}
@Override
public boolean checkOperatorInputConstraint(@NonNull Map<String, Model> inputsByName, @NonNull OperatorConstraint constraint) {
String javaClassName = constraint.getImplementation();
String operatorTypeUri = ((Operator) constraint.eContainer()).getUri();
try {
IJavaOperatorInputConstraint javaConstraint = (IJavaOperatorInputConstraint)
MIDTypeRegistry.getTypeBundle(operatorTypeUri).
loadClass(javaClassName).
getConstructor().
newInstance();
return javaConstraint.isAllowedInput(inputsByName);
}
catch (Exception e) {
MMINTException.print(IStatus.WARNING, "Java constraint error, evaluating to false: " + javaClassName, e);
return false;
}
}
@Override
public boolean checkModelConstraintConsistency(@NonNull Model modelType, String constraint) {
return true;
}
@Override
public @Nullable Model refineModelByConstraint(@NonNull Model model) {
return null;
}
}