aboutsummaryrefslogtreecommitdiffstats
path: root/rba.tool.core/src/rba/tool/core
diff options
context:
space:
mode:
Diffstat (limited to 'rba.tool.core/src/rba/tool/core')
-rw-r--r--rba.tool.core/src/rba/tool/core/Activator.java49
-rw-r--r--rba.tool.core/src/rba/tool/core/console/ConsoleManager.java96
-rw-r--r--rba.tool.core/src/rba/tool/core/console/IConsoleHook.java8
-rw-r--r--rba.tool.core/src/rba/tool/core/console/IConsoleManager.java14
-rw-r--r--rba.tool.core/src/rba/tool/core/constraint/IConstraintCalculation.java14
-rw-r--r--rba.tool.core/src/rba/tool/core/marker/MarkerManager.java142
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/ComparisonAndEvaluator.java49
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/ComparisonOperatorEvaluator.java49
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/EObjectDecorator.java118
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/EqualToOperatorEvaluator.java52
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/ExpressionEvaluator.java55
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/GreaterThanOperatorEvaluator.java64
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/ISortValueCalculation.java15
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/MuchGreaterThanOperatorEvaluator.java67
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/SortValue.java45
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/SortValueManager.java56
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/ValueGroup.java35
-rw-r--r--rba.tool.core/src/rba/tool/core/sort/ValueSortedList.java168
-rw-r--r--rba.tool.core/src/rba/tool/core/ui/BasicTableViewerColumnFilter.java72
-rw-r--r--rba.tool.core/src/rba/tool/core/ui/CommonValueValidator.java51
-rw-r--r--rba.tool.core/src/rba/tool/core/util/EmptyToolLogger.java20
-rw-r--r--rba.tool.core/src/rba/tool/core/util/IToolLogger.java8
-rw-r--r--rba.tool.core/src/rba/tool/core/util/ModelUtil.java29
-rw-r--r--rba.tool.core/src/rba/tool/core/util/ResourceUtil.java72
-rw-r--r--rba.tool.core/src/rba/tool/core/util/SelectionTester.java53
-rw-r--r--rba.tool.core/src/rba/tool/core/util/SelectionUtil.java167
-rw-r--r--rba.tool.core/src/rba/tool/core/util/SortResult.java38
-rw-r--r--rba.tool.core/src/rba/tool/core/util/SortResultSet.java25
-rw-r--r--rba.tool.core/src/rba/tool/core/util/ToolLogger.java79
-rw-r--r--rba.tool.core/src/rba/tool/core/util/ValueSort.java152
-rw-r--r--rba.tool.core/src/rba/tool/core/util/data/ExCommentInfo.java32
-rw-r--r--rba.tool.core/src/rba/tool/core/util/data/ExCommentLabel.java21
-rw-r--r--rba.tool.core/src/rba/tool/core/z3/Z3CodeManager.java360
-rw-r--r--rba.tool.core/src/rba/tool/core/z3/Z3Constants.java18
34 files changed, 2293 insertions, 0 deletions
diff --git a/rba.tool.core/src/rba/tool/core/Activator.java b/rba.tool.core/src/rba/tool/core/Activator.java
new file mode 100644
index 0000000..e316252
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/Activator.java
@@ -0,0 +1,49 @@
+package rba.tool.core;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "rba.tool.core"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/console/ConsoleManager.java b/rba.tool.core/src/rba/tool/core/console/ConsoleManager.java
new file mode 100644
index 0000000..823d3dd
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/console/ConsoleManager.java
@@ -0,0 +1,96 @@
+package rba.tool.core.console;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+
+public class ConsoleManager implements IConsoleManager {
+
+ public static ConsoleManager INSTANCE = new ConsoleManager();
+
+ org.eclipse.ui.console.IConsoleManager consoleManager;
+
+ MessageConsole console;
+
+ MessageConsoleStream consoleStream;
+
+ MessageConsoleStream consoleWarnStream;
+
+ String title = "RBA Tool Console";
+
+ Map<String, List<IConsoleHook>> hook_notifierIdMap = new HashMap<String, List<IConsoleHook>>();
+
+ private ConsoleManager() {
+ consoleManager = ConsolePlugin.getDefault().getConsoleManager();
+ console = new MessageConsole(title, null);
+ consoleManager.addConsoles(new MessageConsole[] { console });
+
+ consoleStream = console.newMessageStream();
+
+ consoleWarnStream = console.newMessageStream();
+ consoleWarnStream.setColor(new Color(null, 255, 0, 0)); // red
+ consoleWarnStream.setFontStyle(SWT.BOLD);
+ }
+
+ public void clearConsole() {
+ console.clearConsole();
+ }
+
+ @Override
+ public void output(String message, String notifierId) {
+ preNotify(message, notifierId);
+ // original output message
+ consoleManager.showConsoleView(console);
+ consoleStream.println(message);
+ postNotify(message, notifierId);
+ }
+
+ @Override
+ public void warning(String message, String notifierId) {
+ preNotify(message, notifierId);
+ // original warning message
+ consoleManager.showConsoleView(console);
+ consoleWarnStream.println(message);
+ postNotify(message, notifierId);
+ }
+
+ @Override
+ public void addHook(IConsoleHook hook, String targetNotifierId) {
+ List<IConsoleHook> hookList = hook_notifierIdMap.get(targetNotifierId);
+ if (hookList == null) {
+ hookList = new ArrayList<IConsoleHook>();
+ hook_notifierIdMap.put(targetNotifierId, hookList);
+ }
+ hookList.add(hook);
+ }
+
+ @Override
+ public void removeHook(IConsoleHook hook, String targetNotifierId) {
+ List<IConsoleHook> hookList = hook_notifierIdMap.get(targetNotifierId);
+ if (hookList == null) {
+ return;
+ }
+ hookList.remove(hook);
+ }
+
+ public void preNotify(String message, String notifierId) {
+ List<IConsoleHook> hookList = hook_notifierIdMap.get(notifierId);
+ if (hookList != null && !hookList.isEmpty()) {
+ hookList.forEach(hook -> hook.preNotify(message, notifierId));
+ }
+ }
+
+ public void postNotify(String message, String notifierId) {
+ List<IConsoleHook> hookList = hook_notifierIdMap.get(notifierId);
+ if (hookList != null && !hookList.isEmpty()) {
+ hookList.forEach(hook -> hook.postNotify(message, notifierId));
+ }
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/console/IConsoleHook.java b/rba.tool.core/src/rba/tool/core/console/IConsoleHook.java
new file mode 100644
index 0000000..8fbbd12
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/console/IConsoleHook.java
@@ -0,0 +1,8 @@
+package rba.tool.core.console;
+
+public interface IConsoleHook {
+
+ void preNotify(String message, String notifierId);
+
+ void postNotify(String message, String notifierId);
+}
diff --git a/rba.tool.core/src/rba/tool/core/console/IConsoleManager.java b/rba.tool.core/src/rba/tool/core/console/IConsoleManager.java
new file mode 100644
index 0000000..821e6f9
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/console/IConsoleManager.java
@@ -0,0 +1,14 @@
+package rba.tool.core.console;
+
+public interface IConsoleManager {
+
+ void output(String message, String notifierId);
+
+ void clearConsole();
+
+ void warning(String message, String notifierId);
+
+ void addHook(IConsoleHook hook, String targetNotifierId);
+
+ void removeHook(IConsoleHook hook, String targetNotifierId);
+}
diff --git a/rba.tool.core/src/rba/tool/core/constraint/IConstraintCalculation.java b/rba.tool.core/src/rba/tool/core/constraint/IConstraintCalculation.java
new file mode 100644
index 0000000..5066767
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/constraint/IConstraintCalculation.java
@@ -0,0 +1,14 @@
+package rba.tool.core.constraint;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IConstraintCalculation {
+ List<String> calculateAllConstraint();
+
+ Map<String, List<String>> calculateImpliesConstraints();
+
+ void setUp(boolean onlyOnline);
+
+ void close();
+}
diff --git a/rba.tool.core/src/rba/tool/core/marker/MarkerManager.java b/rba.tool.core/src/rba/tool/core/marker/MarkerManager.java
new file mode 100644
index 0000000..b04809f
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/marker/MarkerManager.java
@@ -0,0 +1,142 @@
+package rba.tool.core.marker;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.xtext.resource.ILocationInFileProvider;
+import org.eclipse.xtext.util.TextRegionWithLineInformation;
+
+import com.google.inject.Injector;
+
+import rba.tool.editor.ui.activator.ExtensionEditorActivator;
+import rba.tool.editor.util.RBAModelEditorNameUtil;
+
+public class MarkerManager {
+ public static MarkerManager INSTANCE = new MarkerManager();
+
+ public static String MARKER_ID_MODEL_EX = "rba.tool.core.model.ex"; //$NON-NLS-1$
+
+ public static String MARKER_ID_SORT_VALUE = "rba.tool.core.sort"; //$NON-NLS-1$
+
+ public static String MARKER_ID_CONSTRAINT = "rba.tool.core.constraint"; //$NON-NLS-1$
+
+ public void createMarker(EObject element, String message, int errorLevel, String id) {
+ Resource resource = element.eResource();
+ IFile file = WorkspaceSynchronizer.getFile(resource);
+
+ if (existInBuildFolder(file.getParent())) {
+ IFolder fol = file.getProject().getFolder(RBAModelEditorNameUtil.MODEL_FOLDER_NAME);
+ String path = getPath(file.getParent(), "");
+ if (!path.equals("")) {
+ file = fol.getFile(path + "//" + file.getName());
+ } else {
+ file = fol.getFile(file.getName());
+ }
+ }
+ if (file != null && file.exists()) {
+ String location = file.getFullPath().toString();
+
+ Injector injector = ExtensionEditorActivator.getInstance().getInjector("rba.tool.editor.RBAModel");
+ ILocationInFileProvider locationInFileProvider = injector.getInstance(ILocationInFileProvider.class);
+
+ TextRegionWithLineInformation fullTextRegion = (TextRegionWithLineInformation) locationInFileProvider.getFullTextRegion(element);
+ int lineNumber = fullTextRegion.getLineNumber() + 1;
+
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put(IMarker.LINE_NUMBER, lineNumber);
+
+ attributes.put(IMarker.SEVERITY, errorLevel);
+ attributes.put(IMarker.MESSAGE, message);
+ attributes.put(IMarker.LOCATION, location);
+
+ try {
+ IMarker marker = file.createMarker(id);
+ marker.setAttributes(attributes);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void clearMarkers(Resource resource, String id) {
+ IFile ifile = WorkspaceSynchronizer.getFile(resource);
+ if (ifile == null) {
+ return;
+ }
+ if (existInBuildFolder(ifile.getParent())) {
+ IFolder fol = ifile.getProject().getFolder(RBAModelEditorNameUtil.MODEL_FOLDER_NAME);
+ String path = getPath(ifile.getParent(), "");
+ if (!path.equals("")) {
+ ifile = fol.getFile(path + "//" + ifile.getName());
+ } else {
+ ifile = fol.getFile(ifile.getName());
+ }
+ }
+ if (ifile != null && ifile.exists()) {
+ try {
+ for (IMarker marker : ResourcesPlugin.getWorkspace().getRoot().findMarkers(id, true, IResource.DEPTH_INFINITE)) {
+ if (ifile.equals(marker.getResource())) {
+ marker.delete();
+ }
+ }
+ } catch (CoreException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public void clearMarkers(IProject project, String id) {
+
+ try {
+ for (IMarker marker : ResourcesPlugin.getWorkspace().getRoot().findMarkers(id, true, IResource.DEPTH_INFINITE)) {
+
+ IResource resource = marker.getResource();
+ if (project == resource.getProject()) {
+ marker.delete();
+ }
+ }
+ } catch (CoreException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private boolean existInBuildFolder(IResource res) {
+ if (res instanceof IFolder) {
+ if (res.getName().equals(RBAModelEditorNameUtil.BUILD_FOLDER_NAME)) {
+ return true;
+ } else {
+ return existInBuildFolder(res.getParent());
+ }
+ }
+ return false;
+ }
+
+ private String getPath(IResource res, String path) {
+ if (res instanceof IFolder) {
+ if (res.getName().equals(RBAModelEditorNameUtil.BUILD_FOLDER_NAME)) {
+ return path;
+ } else {
+ String p;
+ if (!path.equals("")) {
+ p = res.getName() + "//" + path;
+ } else {
+ p = res.getName();
+ }
+ return getPath(res.getParent(), p);
+ }
+ }
+ return "";
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/ComparisonAndEvaluator.java b/rba.tool.core/src/rba/tool/core/sort/ComparisonAndEvaluator.java
new file mode 100644
index 0000000..5a4b1b2
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/ComparisonAndEvaluator.java
@@ -0,0 +1,49 @@
+package rba.tool.core.sort;
+
+import org.eclipse.emf.common.util.EList;
+
+import rba.core.ComparisonAnd;
+import rba.core.ComparisonOperator;
+import rba.core.Expression;
+import rba.core.GreaterThanOperator;
+import rba.core.LetStatement;
+import rba.core.MuchGreaterThanOperator;
+import rba.core.RuleObject;
+
+public class ComparisonAndEvaluator<T extends RuleObject> extends ComparisonOperatorEvaluator<T> implements ComparisonAnd {
+
+ public ComparisonAndEvaluator(ComparisonAnd o) {
+ super(o);
+ }
+
+ @Override
+ public boolean evaluate(ValueSortedList<T> list) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public int suggestIndex(ValueSortedList<T> list) {
+ int max = 9999;
+ int min = -1;
+
+ for (Expression operand : operator.getOperand()) {
+ if (operand instanceof GreaterThanOperator || operand instanceof MuchGreaterThanOperator) {
+ int i = list.createEvaluator((ComparisonOperator) operand).suggestIndex(list);
+ if (i > min && i >= 0) {
+ min = i;
+ }
+ } else {
+ throw new RuntimeException("Unsupported expression [" + operator.getExpression() + "]");
+ }
+ }
+ return Math.min(min, max);
+ }
+
+ @Override
+ public EList<LetStatement> getLetStatements() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/ComparisonOperatorEvaluator.java b/rba.tool.core/src/rba/tool/core/sort/ComparisonOperatorEvaluator.java
new file mode 100644
index 0000000..d0bc3dd
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/ComparisonOperatorEvaluator.java
@@ -0,0 +1,49 @@
+package rba.tool.core.sort;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+import rba.core.ComparisonOperator;
+import rba.core.Expression;
+import rba.core.RuleObject;
+
+public abstract class ComparisonOperatorEvaluator<T extends RuleObject> extends ExpressionEvaluator<T> implements ComparisonOperator {
+
+ protected ComparisonOperator operator;
+
+ protected T subject;
+
+ @SuppressWarnings("unchecked")
+ protected ComparisonOperatorEvaluator(ComparisonOperator o) {
+ super(o);
+ operator = o;
+ EObject container = o.eContainer();
+ while (!(container instanceof RuleObject)) {
+ container = container.eContainer();
+ if (container == null)
+ break;
+ }
+ if (container != null) {
+ subject = (T) container;
+ }
+ }
+
+ abstract public boolean evaluate(ValueSortedList<T> list);
+
+ /**
+ * @param list
+ * @return -1 if it has no suggestion 9999 implies MAX group (last index)
+ */
+ abstract public int suggestIndex(ValueSortedList<T> list);
+
+ @Override
+ public EList<Expression> getOperand() {
+ return operator.getOperand();
+ }
+
+ @Override
+ public String getSymbol() {
+ return operator.getSymbol();
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/EObjectDecorator.java b/rba.tool.core/src/rba/tool/core/sort/EObjectDecorator.java
new file mode 100644
index 0000000..58aae87
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/EObjectDecorator.java
@@ -0,0 +1,118 @@
+package rba.tool.core.sort;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+
+abstract public class EObjectDecorator implements EObject {
+ private EObject object;
+
+ protected EObjectDecorator(EObject o) {
+ object = o;
+ }
+
+ @Override
+ public EList<Adapter> eAdapters() {
+ return object.eAdapters();
+ }
+
+ @Override
+ public boolean eDeliver() {
+ return object.eDeliver();
+ }
+
+ @Override
+ public void eSetDeliver(boolean deliver) {
+ object.eSetDeliver(deliver);
+ }
+
+ @Override
+ public void eNotify(Notification notification) {
+ object.eNotify(notification);
+ }
+
+ @Override
+ public EClass eClass() {
+ return object.eClass();
+ }
+
+ @Override
+ public Resource eResource() {
+ return object.eResource();
+ }
+
+ @Override
+ public EObject eContainer() {
+ return object.eContainer();
+ }
+
+ @Override
+ public EStructuralFeature eContainingFeature() {
+ return object.eContainingFeature();
+ }
+
+ @Override
+ public EReference eContainmentFeature() {
+ return object.eContainmentFeature();
+ }
+
+ @Override
+ public EList<EObject> eContents() {
+ return object.eContents();
+ }
+
+ @Override
+ public TreeIterator<EObject> eAllContents() {
+ return object.eAllContents();
+ }
+
+ @Override
+ public boolean eIsProxy() {
+ return object.eIsProxy();
+ }
+
+ @Override
+ public EList<EObject> eCrossReferences() {
+ return object.eCrossReferences();
+ }
+
+ @Override
+ public Object eGet(EStructuralFeature feature) {
+ return object.eGet(feature);
+ }
+
+ @Override
+ public Object eGet(EStructuralFeature feature, boolean resolve) {
+ return object.eGet(feature, resolve);
+ }
+
+ @Override
+ public void eSet(EStructuralFeature feature, Object newValue) {
+ object.eSet(feature, newValue);
+ }
+
+ @Override
+ public boolean eIsSet(EStructuralFeature feature) {
+ return object.eIsSet(feature);
+ }
+
+ @Override
+ public void eUnset(EStructuralFeature feature) {
+ object.eUnset(feature);
+ }
+
+ @Override
+ public Object eInvoke(EOperation operation, EList<?> arguments) throws InvocationTargetException {
+ return object.eInvoke(operation, arguments);
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/EqualToOperatorEvaluator.java b/rba.tool.core/src/rba/tool/core/sort/EqualToOperatorEvaluator.java
new file mode 100644
index 0000000..81b668a
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/EqualToOperatorEvaluator.java
@@ -0,0 +1,52 @@
+package rba.tool.core.sort;
+
+import org.eclipse.emf.common.util.EList;
+
+import rba.core.ComparisonOperator;
+import rba.core.EqualToOperator;
+import rba.core.Expression;
+import rba.core.LetStatement;
+import rba.core.ObjectReference;
+import rba.core.RuleObject;
+import rba.core.ThatOfOperator;
+import rba.core.ValueExpression;
+
+public class EqualToOperatorEvaluator<T extends RuleObject> extends ComparisonOperatorEvaluator<T> implements EqualToOperator {
+
+ protected EqualToOperatorEvaluator(ComparisonOperator o) {
+ super(o);
+ }
+
+ @Override
+ public boolean evaluate(ValueSortedList<T> list) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public int suggestIndex(ValueSortedList<T> list) {
+ Expression operand = operator.getOperand().get(0);
+ if (operand instanceof ThatOfOperator) {
+ Expression target = ((ThatOfOperator) operand).getOperand().get(0);
+
+ if (target instanceof ObjectReference) {
+ @SuppressWarnings("unchecked")
+ T object = (T) ((ObjectReference) target).getRefObject();
+ return list.getGroupIndexOf(object);
+ }
+
+ } else if (operand instanceof ValueExpression) {
+ int i = list.getGroupIndexOf(((ValueExpression) operand).getExpression());
+ return i;
+ }
+
+ throw new RuntimeException("Unsupported expression [" + operator.getExpression() + "]");
+ }
+
+ @Override
+ public EList<LetStatement> getLetStatements() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/ExpressionEvaluator.java b/rba.tool.core/src/rba/tool/core/sort/ExpressionEvaluator.java
new file mode 100644
index 0000000..e0ac109
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/ExpressionEvaluator.java
@@ -0,0 +1,55 @@
+package rba.tool.core.sort;
+
+import rba.core.Expression;
+import rba.core.ExpressionType;
+
+abstract public class ExpressionEvaluator<T> extends EObjectDecorator implements Expression {
+
+ private Expression expression;
+
+ protected ExpressionEvaluator(Expression o) {
+ super(o);
+ expression = o;
+ }
+
+ @Override
+ public ExpressionType getType() {
+ return expression.getType();
+ }
+
+ @Override
+ public boolean isSetType() {
+ return expression.isSetType();
+ }
+
+ @Override
+ public String getExpression() {
+ return expression.getExpression();
+ }
+
+ @Override
+ public void setExpression(String value) {
+ expression.setExpression(value);
+ }
+
+ @Override
+ public void unsetExpression() {
+ expression.unsetExpression();
+ }
+
+ @Override
+ public boolean isSetExpression() {
+ return expression.isSetExpression();
+ }
+
+ @Override
+ public String getExpressionText() {
+ return expression.getExpressionText();
+ }
+
+ @Override
+ public ExpressionType getUnderlyingType() {
+ return expression.getUnderlyingType();
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/GreaterThanOperatorEvaluator.java b/rba.tool.core/src/rba/tool/core/sort/GreaterThanOperatorEvaluator.java
new file mode 100644
index 0000000..686fa54
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/GreaterThanOperatorEvaluator.java
@@ -0,0 +1,64 @@
+package rba.tool.core.sort;
+
+import org.eclipse.emf.common.util.EList;
+
+import rba.core.Expression;
+import rba.core.GreaterThanOperator;
+import rba.core.LetStatement;
+import rba.core.ObjectReference;
+import rba.core.RuleObject;
+import rba.core.ThatOfOperator;
+import rba.core.ValueExpression;
+
+public class GreaterThanOperatorEvaluator<T extends RuleObject> extends ComparisonOperatorEvaluator<T> implements GreaterThanOperator {
+
+ protected GreaterThanOperatorEvaluator(GreaterThanOperator o) {
+ super(o);
+ }
+
+ @Override
+ public boolean evaluate(ValueSortedList<T> list) {
+ Expression operand = operator.getOperand().get(0);
+ if (operand instanceof ObjectReference) {
+ @SuppressWarnings("unchecked")
+ T object = (T) ((ObjectReference) operand).getRefObject();
+ return (list.getGroupIndexOf(subject) > list.getGroupIndexOf(object));
+ }
+
+ return false;
+ }
+
+ @Override
+ public int suggestIndex(ValueSortedList<T> list) {
+ Expression operand = operator.getOperand().get(0);
+ if (operand instanceof ThatOfOperator) {
+ Expression target = ((ThatOfOperator) operand).getOperand().get(0);
+
+ if (target instanceof ObjectReference) {
+ @SuppressWarnings("unchecked")
+ T object = (T) ((ObjectReference) target).getRefObject();
+ if (list.getGroupIndexOf(subject) > list.getGroupIndexOf(object)) {
+ return -1;
+ } else {
+ return list.getGroupIndexOf(object) + 1;
+ }
+ }
+
+ } else if (operand instanceof ValueExpression) {
+ int i = ((ValueExpression) operand).getExpressionValue();
+ if (list.getGroupIndexOf(subject) > i) {
+ return -1;
+ } else {
+ return i + 1;
+ }
+ }
+
+ throw new RuntimeException("Unsupported expression [" + operator.getExpression() + "]");
+ }
+
+ @Override
+ public EList<LetStatement> getLetStatements() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/ISortValueCalculation.java b/rba.tool.core/src/rba/tool/core/sort/ISortValueCalculation.java
new file mode 100644
index 0000000..5d4a544
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/ISortValueCalculation.java
@@ -0,0 +1,15 @@
+package rba.tool.core.sort;
+
+import java.util.Map;
+
+public interface ISortValueCalculation {
+ Map<String, Integer> calculateArea_zorder();
+
+ Map<String, Integer> calculateAllocatable_visibility();
+
+ Map<String, Integer> calculateContentState_priority();
+
+ void setUp();
+
+ void close();
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/MuchGreaterThanOperatorEvaluator.java b/rba.tool.core/src/rba/tool/core/sort/MuchGreaterThanOperatorEvaluator.java
new file mode 100644
index 0000000..5eb6ade
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/MuchGreaterThanOperatorEvaluator.java
@@ -0,0 +1,67 @@
+package rba.tool.core.sort;
+
+import org.eclipse.emf.common.util.EList;
+
+import rba.core.Expression;
+import rba.core.LetStatement;
+import rba.core.MuchGreaterThanOperator;
+import rba.core.ObjectReference;
+import rba.core.RuleObject;
+import rba.core.ThatOfOperator;
+import rba.core.ValueExpression;
+
+public class MuchGreaterThanOperatorEvaluator<T extends RuleObject> extends ComparisonOperatorEvaluator<T> implements MuchGreaterThanOperator {
+
+ static int MUCH_GAP = 10;
+
+ public MuchGreaterThanOperatorEvaluator(MuchGreaterThanOperator o) {
+ super(o);
+ }
+
+ @Override
+ public boolean evaluate(ValueSortedList<T> list) {
+ Expression operand = operator.getOperand().get(0);
+ if (operand instanceof ObjectReference) {
+ @SuppressWarnings("unchecked")
+ T object = (T) ((ObjectReference) operand).getRefObject();
+ return (list.getGroupIndexOf(subject) >= list.getGroupIndexOf(object) + MUCH_GAP);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int suggestIndex(ValueSortedList<T> list) {
+ Expression operand = operator.getOperand().get(0);
+ if (operand instanceof ThatOfOperator) {
+ Expression target = ((ThatOfOperator) operand).getOperand().get(0);
+
+ if (target instanceof ObjectReference) {
+ @SuppressWarnings("unchecked")
+ T object = (T) ((ObjectReference) target).getRefObject();
+ if (list.getGroupIndexOf(subject) >= list.getGroupIndexOf(object) + MUCH_GAP) {
+ return -1;
+ } else {
+ return list.getGroupIndexOf(object) + MUCH_GAP;
+ }
+ }
+
+ } else if (operand instanceof ValueExpression) {
+ int i = ((ValueExpression) operand).getExpressionValue();
+ if (list.getGroupIndexOf(subject) > i) {
+ return -1;
+ } else {
+ return i + 1;
+ }
+ }
+
+ throw new RuntimeException("Unsupported expression [" + operator.getExpression() + "]");
+ }
+
+ @Override
+ public EList<LetStatement> getLetStatements() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/SortValue.java b/rba.tool.core/src/rba/tool/core/sort/SortValue.java
new file mode 100644
index 0000000..61ceaa9
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/SortValue.java
@@ -0,0 +1,45 @@
+package rba.tool.core.sort;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import rba.tool.core.z3.Z3Constants;
+
+public class SortValue {
+ private Map<String, Integer> sortMap = new HashMap<String, Integer>();
+
+ private boolean unsat = false;
+
+ public void setSortValue(Map<String, Integer> map) {
+ if (map == null) {
+ clear();
+ return;
+ }
+
+ sortMap = map;
+ Integer result = map.get(Z3Constants.TOTAL_RESULT);
+ if (result == Z3Constants.UNSAT_VAL) {
+ unsat = true;
+ }
+ }
+
+ public boolean isUnsat() {
+ return unsat;
+ }
+
+ public Integer getValue(String name) {
+ if (!sortMap.isEmpty()) {
+ Integer integer = sortMap.get(name);
+ if (integer != null) {
+ return integer;
+ }
+ }
+
+ return Z3Constants.UNKNOWN_VAL;
+ }
+
+ public void clear() {
+ sortMap.clear();
+ unsat = false;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/SortValueManager.java b/rba.tool.core/src/rba/tool/core/sort/SortValueManager.java
new file mode 100644
index 0000000..17fbb37
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/SortValueManager.java
@@ -0,0 +1,56 @@
+package rba.tool.core.sort;
+
+import org.eclipse.core.resources.IProject;
+
+import rba.tool.core.console.ConsoleManager;
+import rba.tool.core.z3.Z3CodeManager;
+
+public class SortValueManager {
+
+ public static SortValueManager INSTANCE = new SortValueManager();
+
+ private static final String CONSOLE_TITLE = "#### Execution of Constraint ####";
+
+ private SortValue areaZorderSortValue = new SortValue();
+
+ private SortValue visibilitySortValue = new SortValue();;
+
+ private SortValue csPrioritySortValue = new SortValue();;
+
+ private static final String NOTIFIER_ID = "rba.tool.core.CalculateSortValue";
+
+ public boolean updateSortValue(IProject project) {
+
+ try {
+ ISortValueCalculation calc = Z3CodeManager.INSTNACE.getSortCaluculator(project);
+ calc.setUp();
+ areaZorderSortValue.setSortValue(calc.calculateArea_zorder());
+ visibilitySortValue.setSortValue(calc.calculateAllocatable_visibility());
+ csPrioritySortValue.setSortValue(calc.calculateContentState_priority());
+ calc.close();
+
+ } catch (RuntimeException e) {
+ ConsoleManager.INSTANCE.output(CONSOLE_TITLE, NOTIFIER_ID);
+ ConsoleManager.INSTANCE.output(e.getMessage(), NOTIFIER_ID);
+ ConsoleManager.INSTANCE.output("##################", NOTIFIER_ID);
+
+ areaZorderSortValue.clear();
+ visibilitySortValue.clear();
+ csPrioritySortValue.clear();
+ return false;
+ }
+ return true;
+ }
+
+ public SortValue getAreaZorderSortValue() {
+ return areaZorderSortValue;
+ }
+
+ public SortValue getAllocatableVisibilitySortValue() {
+ return visibilitySortValue;
+ }
+
+ public SortValue getCsPrioritySortValue() {
+ return csPrioritySortValue;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/ValueGroup.java b/rba.tool.core/src/rba/tool/core/sort/ValueGroup.java
new file mode 100644
index 0000000..86c8e63
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/ValueGroup.java
@@ -0,0 +1,35 @@
+package rba.tool.core.sort;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class ValueGroup<T> {
+ private String name;
+
+ private Collection<T> member;
+
+ public ValueGroup(String name) {
+ this.name = name;
+ member = new ArrayList<T>();
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void add(T e) {
+ member.add(e);
+ }
+
+ public void remove(T e) {
+ member.remove(e);
+ }
+
+ public Collection<T> getMember() {
+ return member;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/sort/ValueSortedList.java b/rba.tool.core/src/rba/tool/core/sort/ValueSortedList.java
new file mode 100644
index 0000000..25ab560
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/sort/ValueSortedList.java
@@ -0,0 +1,168 @@
+package rba.tool.core.sort;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import rba.core.ComparisonAnd;
+import rba.core.ComparisonOperator;
+import rba.core.EqualToOperator;
+import rba.core.Expression;
+import rba.core.GreaterThanOperator;
+import rba.core.MuchGreaterThanOperator;
+import rba.core.RuleObject;
+import rba.core.ValueExpression;
+
+abstract public class ValueSortedList<T extends RuleObject> {
+ private List<ValueGroup<T>> list;
+
+ private Collection<T> unsorted;
+
+ public ValueSortedList(Collection<T> originalList) {
+ list = new ArrayList<ValueGroup<T>>();
+ list.add(new ValueGroup<T>("MIN"));
+ list.add(new ValueGroup<T>("1"));
+ list.add(new ValueGroup<T>("MAX"));
+ unsorted = new ArrayList<T>(originalList);
+ sort();
+ }
+
+ public void add(T o) {
+ unsorted.add(o);
+ sort();
+ }
+
+ public void addAll(Collection<T> list) {
+ unsorted.addAll(list);
+ sort();
+ }
+
+ public void sort() {
+ list.get(0).getMember().addAll(unsorted);
+ unsorted.clear();
+ boolean trysort = true;
+ int retry = 0;
+ while (trysort) {
+ trysort = false;
+ retry = retry + 1;
+ if (retry > 100) {
+ throw new RuntimeException("Could not sort value [" + list + "]");
+ }
+ for (T i : sortedList()) {
+ int currentIndex = this.getGroupIndexOf(i);
+ Expression e = this.getValueExpression(i);
+ if (e == null)
+ continue;
+ if (e instanceof ValueExpression) {
+ int index = this.getGroupIndexOf(e.getExpression());
+ if (index == -1) {
+ index = ((ValueExpression) e).getExpressionValue();
+
+ if (index == -1) {
+ index = 0;
+ }
+ if (index >= list.size() - 1) {
+ list.get(currentIndex).remove(i);
+ addGroupAt(index, i);
+ trysort = true;
+ continue;
+ }
+ }
+ if (index != currentIndex) {
+ list.get(currentIndex).remove(i);
+ list.get(index).add(i);
+ trysort = true;
+ } else {
+ }
+ } else if (e instanceof ComparisonOperator) {
+ ComparisonOperatorEvaluator<T> evaluator = createEvaluator((ComparisonOperator) e);
+ int index = evaluator.suggestIndex(this);
+ if (index < 0)
+ continue;
+ if (index >= list.size() - 1) {
+ list.get(currentIndex).remove(i);
+ addGroupAt(index, i);
+ trysort = true;
+ } else if (index != currentIndex) {
+ list.get(currentIndex).remove(i);
+ list.get(index).add(i);
+ trysort = true;
+ } else {
+ }
+ } else {
+ throw new RuntimeException("Unsupported expression [" + e.getExpression() + "]");
+ }
+ }
+ }
+ }
+
+ private void addGroupAt(int index, T e) {
+
+ if (index >= list.size() - 1) {
+ for (int i = list.size() - 1; i <= index; ++i) {
+ ValueGroup<T> newGroup = new ValueGroup<T>(Integer.toString(i));
+ list.add(i, newGroup);
+ }
+ }
+
+ list.get(index).add(e);
+
+ }
+
+ public List<T> sortedList() {
+ List<T> result = new ArrayList<T>();
+ for (ValueGroup<T> i : list) {
+ result.addAll(i.getMember());
+ }
+ return result;
+ }
+
+ public List<ValueGroup<T>> getGroupList() {
+ return list;
+ }
+
+ public List<T> sortedListByBig() {
+ List<T> result = new ArrayList<T>();
+ for (int index = list.size() - 1; index >= 0; index--) {
+ ValueGroup<T> i = list.get(index);
+ result.addAll(i.getMember());
+ }
+ return result;
+ }
+
+ abstract protected Expression getValueExpression(T e);
+
+ public int getGroupIndexOf(T e) {
+ for (ValueGroup<T> i : list) {
+ if (i.getMember().contains(e)) {
+ return list.indexOf(i);
+ }
+ }
+ return -1;
+ }
+
+ public int getGroupIndexOf(String groupName) {
+ for (ValueGroup<T> i : list) {
+ if (i.getName().contentEquals(groupName)) {
+ return list.indexOf(i);
+ }
+ }
+ return -1;
+ }
+
+ public ComparisonOperatorEvaluator<T> createEvaluator(ComparisonOperator e) {
+ ComparisonOperatorEvaluator<T> evaluator;
+ if (e instanceof GreaterThanOperator) {
+ evaluator = new GreaterThanOperatorEvaluator<T>((GreaterThanOperator) e);
+ } else if (e instanceof MuchGreaterThanOperator) {
+ evaluator = new MuchGreaterThanOperatorEvaluator<T>((MuchGreaterThanOperator) e);
+ } else if (e instanceof ComparisonAnd) {
+ evaluator = new ComparisonAndEvaluator<T>((ComparisonAnd) e);
+ } else if (e instanceof EqualToOperator) {
+ evaluator = new EqualToOperatorEvaluator<T>((EqualToOperator) e);
+ } else {
+ throw new RuntimeException("Unsupported expression [" + e.getExpression() + "]");
+ }
+ return evaluator;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/ui/BasicTableViewerColumnFilter.java b/rba.tool.core/src/rba/tool/core/ui/BasicTableViewerColumnFilter.java
new file mode 100644
index 0000000..4eb07a5
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/ui/BasicTableViewerColumnFilter.java
@@ -0,0 +1,72 @@
+package rba.tool.core.ui;
+
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class BasicTableViewerColumnFilter extends ViewerFilter {
+
+ private String filterString;
+
+ private final int[] filterColumns;
+
+ public BasicTableViewerColumnFilter(String filterString, int[] filterColumns) {
+ this.filterString = filterString;
+ this.filterColumns = filterColumns;
+ }
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if ((null == filterString) || (StringUtils.isEmpty(filterString))) {
+ return true;
+ }
+
+ Pattern pattern = Pattern.compile(createRegexFromGlob(filterString), Pattern.CASE_INSENSITIVE);
+
+ for (int i : this.filterColumns) {
+
+ ITableLabelProvider labelProvider = (ITableLabelProvider) ((TableViewer) viewer).getLabelProvider();
+
+ String cellLabel = labelProvider.getColumnText(element, i);
+
+ if (pattern.matcher(cellLabel).find()) {
+ return true;
+ } else if (cellLabel.toLowerCase().contains(filterString.toLowerCase())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Create Regular Expression for filter string
+ * @param glob
+ * @return
+ */
+ private String createRegexFromGlob(String glob) {
+ String out = "^";
+ for (int i = 0; i < glob.length(); ++i) {
+ final char c = glob.charAt(i);
+ switch (c) {
+ case '*':
+ out += ".*";
+ break;
+ case '?':
+ out += '.';
+ break;
+ default:
+ out += c;
+ }
+ }
+ out += '$';
+ return out;
+ }
+
+ public void setFilterString(String filterString) {
+ this.filterString = filterString;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/ui/CommonValueValidator.java b/rba.tool.core/src/rba/tool/core/ui/CommonValueValidator.java
new file mode 100644
index 0000000..c724760
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/ui/CommonValueValidator.java
@@ -0,0 +1,51 @@
+package rba.tool.core.ui;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class CommonValueValidator {
+
+ public static boolean isExistFilePath(String folderPath, String fileName) {
+ if (StringUtils.isEmpty(folderPath) || StringUtils.isEmpty(fileName))
+ return false;
+ return Files.exists(Paths.get(folderPath, fileName));
+ }
+
+ public static boolean isExistFilePath(String filePath) {
+ if (StringUtils.isEmpty(filePath))
+ return false;
+ return Files.exists(Paths.get(filePath));
+ }
+
+ public static boolean isValidFileName(String target) {
+ if (StringUtils.isEmpty(target)) {
+ return false;
+ }
+ if (target.length() > 250) {
+ return false;
+ }
+ if (target.contains("Â¥") || target.contains("/") || target.contains(":") || target.contains("*") || target.contains("?") || target.contains("\"") || target.contains("|")
+ || target.contains("<") || target.contains(">")) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public static boolean isValidFolderName(String target) {
+ if (StringUtils.isEmpty(target)) {
+ return false;
+ }
+ if (target.length() > 250) {
+ return false;
+ }
+ if (target.contains("Â¥") || target.contains("/") || target.contains(":") || target.contains("*") || target.contains("?") || target.contains("\"") || target.contains("|")
+ || target.contains("<") || target.contains(">") || target.contains(".") || target.contains(",")) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/EmptyToolLogger.java b/rba.tool.core/src/rba/tool/core/util/EmptyToolLogger.java
new file mode 100644
index 0000000..cf2280d
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/EmptyToolLogger.java
@@ -0,0 +1,20 @@
+package rba.tool.core.util;
+
+/**
+ * @author kousuke_morishima
+ */
+public class EmptyToolLogger implements IToolLogger {
+
+ public EmptyToolLogger() {
+ }
+
+ @Override
+ public void logging(Throwable e) {
+ // nothing to do
+ }
+
+ @Override
+ public void logging(String message) {
+ // nothing to do
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/IToolLogger.java b/rba.tool.core/src/rba/tool/core/util/IToolLogger.java
new file mode 100644
index 0000000..b53cf8c
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/IToolLogger.java
@@ -0,0 +1,8 @@
+package rba.tool.core.util;
+
+public interface IToolLogger {
+
+ void logging(Throwable e);
+
+ void logging(String message);
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/ModelUtil.java b/rba.tool.core/src/rba/tool/core/util/ModelUtil.java
new file mode 100644
index 0000000..b6b34a7
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/ModelUtil.java
@@ -0,0 +1,29 @@
+package rba.tool.core.util;
+
+import org.eclipse.emf.ecore.EObject;
+
+import rba.core.NamedElement;
+import rba.core.Package;
+
+public class ModelUtil {
+
+ public static final String SEPARATOR = "/";
+
+ public static String getRBAModelHierarchicalName(NamedElement target) {
+ return getRBAModelHierarchicalName(target, SEPARATOR);
+ }
+
+ public static String getRBAModelHierarchicalName(NamedElement target, String separator) {
+ EObject parent = target.eContainer();
+ if (parent == null || !(parent instanceof NamedElement) || parent instanceof Package) {
+ return target.getName();
+ } else {
+ return getRBAModelHierarchicalName((NamedElement) parent, separator) + separator + target.getName();
+ }
+ }
+
+ public static String convertModelName2ArbitrateName(String modelName) {
+ if (modelName == null) return modelName;
+ return modelName.replace(".", "/");
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/ResourceUtil.java b/rba.tool.core/src/rba/tool/core/util/ResourceUtil.java
new file mode 100644
index 0000000..751f308
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/ResourceUtil.java
@@ -0,0 +1,72 @@
+package rba.tool.core.util;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+public class ResourceUtil {
+ public static BufferedReader getReader(File file) {
+ FileInputStream fis = null;
+ InputStreamReader isr = null;
+ BufferedReader reader = null;
+
+ try {
+ fis = new FileInputStream(file);
+ isr = new InputStreamReader(fis, "UTF-8");
+ reader = new BufferedReader(isr);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ if (isr != null) {
+ isr.close();
+ }
+ if (fis != null) {
+ fis.close();
+ }
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+
+ throw new RuntimeException(e);
+ }
+ return reader;
+ }
+
+ public static BufferedWriter getWriter(File file) {
+ FileOutputStream fos = null;
+ OutputStreamWriter osw = null;
+ BufferedWriter writer = null;
+
+ try {
+ fos = new FileOutputStream(file);
+ osw = new OutputStreamWriter(fos, "UTF-8");
+ writer = new BufferedWriter(osw);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ try {
+ if (writer != null) {
+ writer.close();
+ }
+ if (osw != null) {
+ osw.close();
+ }
+ if (fos != null) {
+ fos.close();
+ }
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+
+ throw new RuntimeException(e);
+ }
+ return writer;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/SelectionTester.java b/rba.tool.core/src/rba/tool/core/util/SelectionTester.java
new file mode 100644
index 0000000..b1bec63
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/SelectionTester.java
@@ -0,0 +1,53 @@
+package rba.tool.core.util;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+
+public class SelectionTester extends PropertyTester {
+
+ @Override
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (property.equals("IsTestRev")) {
+ IFolder folder = SelectionUtil.getRevFolder(receiver);
+ return folder != null;
+ }
+ if (property.equals("IsResource")) {
+ return receiver instanceof IResource;
+ }
+ if (property.equals("IsMultiSelect")) {
+ IFolder folder = SelectionUtil.getRevFolder(receiver);
+ return folder != null;
+ }
+ if (property.equals("IsTestCompare")) {
+ IFolder folder = SelectionUtil.getRevCompareFolder(receiver);
+ return folder != null;
+ }
+ return false;
+ }
+ //
+ // protected boolean isEnableProject(Object receiver) {
+ // IResource resource = null;
+ //
+ // if (receiver instanceof EObject) {
+ // EObject eObject = (EObject) receiver;
+ // if (eObject.eResource() != null) {
+ // resource = WorkspaceSynchronizer.getFile(eObject.eResource());
+ // }
+ // } else if (receiver instanceof IResource) {
+ // resource = (IResource) receiver;
+ // }
+ //
+ // if (resource != null) {
+ // IProject project = resource.getProject();
+ // if (project != null) {
+ // // if (ZIPCProjectNature.hasNature(project)) {
+ // if (ZIPCProjectNature.hasNature(project) && DesignProjectNature.hasNature(project)) {
+ // return true;
+ // }
+ // }
+ // }
+ // return false;
+ // }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/SelectionUtil.java b/rba.tool.core/src/rba/tool/core/util/SelectionUtil.java
new file mode 100644
index 0000000..e6093b7
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/SelectionUtil.java
@@ -0,0 +1,167 @@
+package rba.tool.core.util;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+public class SelectionUtil {
+
+ public static final String TEST_FILE_NAME = "testinformation";
+
+ public static final String TEST_CASE_FOLDER_NAME = "testcase";
+
+ public static final String TEST_COVERAGE_FOLDER_NAME = "coverage";
+
+ public static final String TEST_LOG_FOLDER_NAME = "testlog";
+
+ public static final String TEST_RESULT_FOLDER_NAME = "testresult";
+
+ /**
+ * get testresult folder in revision folder from selected item
+ * @param file
+ * @return testcase folder
+ */
+ public static IFolder getRevResultFolder(Object object) {
+ return getAndCreateFolderInTestRevFolder(object, TEST_RESULT_FOLDER_NAME);
+ }
+
+ /**
+ * get testlog folder in revision folder from selected item
+ * @param file
+ * @return testcase folder
+ */
+ public static IFolder getRevLogFolder(Object object) {
+ return getAndCreateFolderInTestRevFolder(object, TEST_LOG_FOLDER_NAME);
+ }
+
+ /**
+ * get coverage folder in revision folder from selected item
+ * @param file
+ * @return testcase folder
+ */
+ public static IFolder getRevCoverageFolder(Object object) {
+ return getAndCreateFolderInTestRevFolder(object, TEST_COVERAGE_FOLDER_NAME);
+ }
+
+ /**
+ * get testcase folder in revision folder from selected item
+ * @param file
+ * @return testcase folder
+ */
+ public static IFolder getRevTestcaseFolder(Object object) {
+ return getAndCreateFolderInTestRevFolder(object, TEST_CASE_FOLDER_NAME);
+ }
+
+ public static IFolder getAndCreateFolderInTestRevFolder(Object object, String foldername) {
+ IFolder folder = getRevFolder(object);
+ if (folder != null) {
+ IFolder testcase = folder.getFolder(foldername);
+ if (!testcase.exists()) {
+ try {
+ testcase.create(true, true, null);
+ } catch (CoreException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return testcase;
+ }
+ return null;
+ }
+
+ /**
+ * get revision folder of selected file
+ * @param file
+ * @return
+ */
+ public static IFolder getRevFolder(Object object) {
+ try {
+ if (object instanceof ISelection) {
+ ISelection selection = (ISelection) object;
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof IResource) {
+ return getRevFolder((IResource) element);
+ }
+ }
+ } else if (object instanceof IResource) {
+ if (object instanceof IFolder) {
+ IFolder f = (IFolder) object;
+ IResource[] resources = f.members();
+ for (IResource res : resources) {
+ if (res instanceof IFile) {
+ IFile file = (IFile) res;
+ if (file.getName().equals(TEST_FILE_NAME)) {
+ return f;
+ }
+ }
+ }
+ } else if (object instanceof IFile) {
+ IFolder parent = (IFolder) ((IFile) object).getParent();
+ return getRevFolder(parent);
+ }
+ IResource r = (IResource) object;
+ return getRevFolder(r.getParent());
+
+ //
+ // IFolder f = null;
+ // if (object instanceof IFile) {
+ // IContainer parent = ((IFile) object).getParent();
+ // if (parent instanceof IFolder) {
+ // f = (IFolder) parent;
+ // }
+ // } else
+ //
+ // if (f.getParent() instanceof IFolder) {
+ // return getRevFolder((IFolder) f.getParent());
+ // }
+ }
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * to get only 2 selected revision file
+ * @param object
+ * @return
+ */
+ public static IFolder getRevCompareFolder(Object object) {
+ try {
+ if (object instanceof ISelection) {
+ ISelection selection = (ISelection) object;
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ if (structuredSelection.size() == 2) {
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof IResource) {
+ return getRevCompareFolder((IResource) element);
+ }
+ }
+ }
+ } else if (object instanceof IResource) {
+ if (object instanceof IFolder) {
+ IFolder f = (IFolder) object;
+ IResource[] resources = f.members();
+ for (IResource res : resources) {
+ if (res instanceof IFile) {
+ IFile file = (IFile) res;
+ if (file.getName().equals(TEST_FILE_NAME)) {
+ return f;
+ }
+ }
+ }
+ }
+
+ }
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/SortResult.java b/rba.tool.core/src/rba/tool/core/util/SortResult.java
new file mode 100644
index 0000000..838a325
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/SortResult.java
@@ -0,0 +1,38 @@
+package rba.tool.core.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import rba.core.RuleObject;
+
+public class SortResult<T extends RuleObject> {
+ private List<SortResultSet<T>> sortResults = new ArrayList<SortResultSet<T>>();
+
+ private boolean isUnsat;
+
+ public List<SortResultSet<T>> getSortResults() {
+ return sortResults;
+ }
+
+ public boolean addSortResult(SortResultSet<T> sortResult) {
+ return sortResults.add(sortResult);
+ }
+
+ public SortResultSet<T> getSortResultSet(RuleObject obj) {
+ for (SortResultSet<T> sortResult : sortResults) {
+ T element = sortResult.getElement();
+ if (element.equals(obj)) {
+ return sortResult;
+ }
+ }
+ return null;
+ }
+
+ public boolean isUnsat() {
+ return isUnsat;
+ }
+
+ public void setUnsat(boolean isUnsat) {
+ this.isUnsat = isUnsat;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/SortResultSet.java b/rba.tool.core/src/rba/tool/core/util/SortResultSet.java
new file mode 100644
index 0000000..93e18f0
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/SortResultSet.java
@@ -0,0 +1,25 @@
+package rba.tool.core.util;
+
+import rba.core.RuleObject;
+
+public class SortResultSet<T extends RuleObject> {
+ private T element;
+
+ private int value;
+
+ public T getElement() {
+ return element;
+ }
+
+ public void setElement(T element) {
+ this.element = element;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/ToolLogger.java b/rba.tool.core/src/rba/tool/core/util/ToolLogger.java
new file mode 100644
index 0000000..0907eb6
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/ToolLogger.java
@@ -0,0 +1,79 @@
+package rba.tool.core.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
+import java.util.stream.Stream;
+
+public class ToolLogger implements IToolLogger {
+
+ private Logger logger;
+
+ /**
+ * @param name logger name
+ * @param logFile File name
+ * @param append
+ * @throws SecurityException
+ * @throws IOException
+ */
+ public ToolLogger(String name, String logFile, boolean append) throws SecurityException, IOException {
+ this(Logger.getLogger(name), logFile, append);
+ }
+
+ /**
+ * @param logger logger name
+ * @param logFile
+ * @param append
+ * @throws SecurityException
+ * @throws IOException
+ * @throws NullPointerException
+ */
+ public ToolLogger(Logger logger, String logFile, boolean append) throws SecurityException, IOException {
+ if (logger == null) {
+ throw new NullPointerException("logger must be not null."); //$NON-NLS-1$
+ }
+ this.logger = logger;
+ String path = "log/" + logFile; //$NON-NLS-1$
+ createParent(path);
+ FileHandler h = new FileHandler(path, append);
+ h.setFormatter(new SimpleFormatter());
+ this.logger.addHandler(h);
+ this.logger.setLevel(Level.ALL);
+ }
+
+ public ToolLogger(Logger logger, Handler handler) {
+ if (logger == null) {
+ throw new NullPointerException("logger must be not null."); //$NON-NLS-1$
+ }
+ this.logger = logger;
+ this.logger.addHandler(handler);
+ this.logger.setLevel(Level.ALL);
+ }
+
+ static void createParent(String path) {
+ File logPath = new File(path);
+ if (!logPath.getParentFile().exists()) {
+ logPath.getParentFile().mkdirs();
+ }
+ }
+
+ /**
+ * Logging when handle to occurred error
+ * @param e
+ */
+ public void logging(Throwable e) {
+ StringBuilder message = new StringBuilder(e.toString() + "\n"); //$NON-NLS-1$
+ Stream.of(e.getStackTrace()).forEach(t -> message.append("\t").append(t.toString()).append("\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ logger.warning(message.toString());
+ }
+
+ @Override
+ public void logging(String message) {
+ logger.warning(message);
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/ValueSort.java b/rba.tool.core/src/rba/tool/core/util/ValueSort.java
new file mode 100644
index 0000000..7182667
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/ValueSort.java
@@ -0,0 +1,152 @@
+package rba.tool.core.util;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import rba.core.ContentState;
+import rba.core.Expression;
+import rba.core.RBACoreFactory;
+import rba.tool.core.sort.ValueGroup;
+import rba.tool.core.sort.ValueSortedList;
+import rba.view.Area;
+
+public class ValueSort {
+ public static ValueSort INSTANCE = new ValueSort();
+
+ public SortResult<Area> sortVisibility(List<Area> areas) {
+ SortResult<Area> sortResult = new SortResult<Area>();
+
+ try {
+ sortResult = doSortVisibility(areas);
+ sortResult.setUnsat(false);
+ } catch (RuntimeException e) {
+ sortResult.setUnsat(true);
+ }
+
+ return sortResult;
+ }
+
+ private SortResult<Area> doSortVisibility(List<Area> areas) {
+ SortResult<Area> sortResult = new SortResult<Area>();
+
+ Map<Area, SortResultSet<Area>> map = new HashMap<Area, SortResultSet<Area>>();
+ for (Area area : areas) {
+ SortResultSet<Area> set = new SortResultSet<Area>();
+ set.setElement(area);
+ sortResult.addSortResult(set);
+ map.put(area, set);
+ }
+
+ ValueSortedList<Area> sortedElement = new ValueSortedList<Area>(areas) {
+ protected Expression getValueExpression(Area e) {
+ return e.getVisibility();
+ }
+ };
+
+ for (ValueGroup<Area> valueGroup : sortedElement.getGroupList()) {
+ int value = convertValue(valueGroup.getName());
+ for (Area member : valueGroup.getMember()) {
+ SortResultSet<Area> set = map.get(member);
+ set.setValue(value);
+ }
+ }
+
+ return sortResult;
+ }
+
+ public SortResult<Area> sortZorder(List<Area> areas) {
+ SortResult<Area> sortResult = new SortResult<Area>();
+
+ try {
+ sortResult = doSortZorder(areas);
+ sortResult.setUnsat(false);
+ } catch (RuntimeException e) {
+ sortResult.setUnsat(true);
+ }
+
+ return sortResult;
+ }
+
+ private SortResult<Area> doSortZorder(List<Area> areas) {
+
+ SortResult<Area> sortResult = new SortResult<Area>();
+
+ Map<Area, SortResultSet<Area>> map = new HashMap<Area, SortResultSet<Area>>();
+ for (Area area : areas) {
+ SortResultSet<Area> set = new SortResultSet<Area>();
+ set.setElement(area);
+ sortResult.addSortResult(set);
+ map.put(area, set);
+ }
+
+ ValueSortedList<Area> sortedElement = new ValueSortedList<Area>(areas) {
+ protected Expression getValueExpression(Area e) {
+ return e.getZorder();
+ }
+ };
+
+ for (ValueGroup<Area> valueGroup : sortedElement.getGroupList()) {
+ int value = convertValue(valueGroup.getName());
+ for (Area member : valueGroup.getMember()) {
+ SortResultSet<Area> set = map.get(member);
+ set.setValue(value);
+ }
+ }
+ return sortResult;
+ }
+
+ public SortResult<ContentState> sortPriority(List<ContentState> contentStates) {
+ SortResult<ContentState> sortResult = new SortResult<ContentState>();
+
+ try {
+ sortResult = doSortPriority(contentStates);
+ sortResult.setUnsat(false);
+ } catch (RuntimeException e) {
+ sortResult.setUnsat(true);
+ }
+
+ return sortResult;
+ }
+
+ public SortResult<ContentState> doSortPriority(List<ContentState> contentStates) {
+ SortResult<ContentState> sortResult = new SortResult<ContentState>();
+
+ Map<ContentState, SortResultSet<ContentState>> map = new HashMap<ContentState, SortResultSet<ContentState>>();
+ for (ContentState contentState : contentStates) {
+ SortResultSet<ContentState> set = new SortResultSet<ContentState>();
+ set.setElement(contentState);
+ sortResult.addSortResult(set);
+ map.put(contentState, set);
+ }
+
+ ValueSortedList<ContentState> sortedElement = new ValueSortedList<ContentState>(contentStates) {
+ protected Expression getValueExpression(ContentState e) {
+ return e.getValue();
+ }
+ };
+
+ for (ValueGroup<ContentState> valueGroup : sortedElement.getGroupList()) {
+ int value = convertValue(valueGroup.getName());
+ for (ContentState member : valueGroup.getMember()) {
+ SortResultSet<ContentState> set = map.get(member);
+ set.setValue(value);
+ }
+ }
+
+ return sortResult;
+ }
+
+ private int convertValue(String valueString) {
+ int value;
+ if (valueString.equals("MIN")) {
+ value = RBACoreFactory.eINSTANCE.createMinValue().getExpressionValue();
+ } else if (valueString.equals("MAX")) {
+ value = RBACoreFactory.eINSTANCE.createMaxValue().getExpressionValue();
+ } else {
+ value = Integer.parseInt(valueString);
+ }
+ return value;
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/data/ExCommentInfo.java b/rba.tool.core/src/rba/tool/core/util/data/ExCommentInfo.java
new file mode 100644
index 0000000..936d8ae
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/data/ExCommentInfo.java
@@ -0,0 +1,32 @@
+package rba.tool.core.util.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExCommentInfo {
+
+ private String fileName;
+
+ private List<String> info = new ArrayList<String>();
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public List<String> getInfo() {
+ return info;
+ }
+
+ public void setInfo(List<String> info) {
+ this.info = info;
+ }
+
+ public void addInfo(String info) {
+ this.info.add(info);
+ }
+
+}
diff --git a/rba.tool.core/src/rba/tool/core/util/data/ExCommentLabel.java b/rba.tool.core/src/rba/tool/core/util/data/ExCommentLabel.java
new file mode 100644
index 0000000..c83f03a
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/util/data/ExCommentLabel.java
@@ -0,0 +1,21 @@
+package rba.tool.core.util.data;
+
+public class ExCommentLabel {
+
+ private final String label;
+
+ private final int columnWidth;
+
+ public ExCommentLabel(String label, int columnWidth) {
+ this.label = label;
+ this.columnWidth = columnWidth;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public int getColumnWidth() {
+ return columnWidth;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/z3/Z3CodeManager.java b/rba.tool.core/src/rba/tool/core/z3/Z3CodeManager.java
new file mode 100644
index 0000000..7f9da9c
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/z3/Z3CodeManager.java
@@ -0,0 +1,360 @@
+package rba.tool.core.z3;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+
+import com.microsoft.z3.ApplyResult;
+import com.microsoft.z3.BoolExpr;
+import com.microsoft.z3.Context;
+import com.microsoft.z3.Expr;
+import com.microsoft.z3.Goal;
+import com.microsoft.z3.Solver;
+import com.microsoft.z3.Status;
+import com.microsoft.z3.Tactic;
+
+import groovy.util.GroovyScriptEngine;
+import rba.tool.core.Activator;
+import rba.tool.core.constraint.IConstraintCalculation;
+import rba.tool.core.sort.ISortValueCalculation;
+
+public class Z3CodeManager {
+
+ public static Z3CodeManager INSTNACE = new Z3CodeManager();
+
+ private static final String ERROR_ENV_PATH = "The Z3 storage path cannot be found. Area and content parameters are not derived correctly. \r\nSet the environment variable of the storage path of Z3.";
+
+ private static final String ERROR_SCRIPT = "Z3 execution failed. There is an error in the script.";
+
+ private static final String SORT_SCRIPT_NAME = "SortValueCalculation.java";
+
+ private static final String CONST_SCRIPT_NAME = "ConstraintCalculation.java";
+
+ private static final String ERROR_NOT_FOUND_SCRIPT = "Z3 execution failed. Failed to generate %s in the %s project.";
+
+ private Z3CodeManager() {
+ }
+
+ public boolean loadZ3Lib() {
+ String z3Path = "";
+ try {
+ z3Path = getPath();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ return false;
+ }
+ if (null == z3Path || z3Path.isEmpty()) {
+ return false;
+ }
+ try {
+ // load necessary z3 DLLs
+ loadDLLs(z3Path);
+ // add z3 path to java.library.path
+ addLibraryPath(z3Path);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ private String getPath() throws IOException {
+ String path = "";
+ String jvmBitMode = System.getProperty("sun.arch.data.model");
+ // Check JVM 32 Bit.
+ if (jvmBitMode != null && jvmBitMode.contains("32")) {
+ URL bundleEntryUrl = Platform.getBundle(Activator.PLUGIN_ID).getEntry("lib32/z3");
+ URL fileUrl = FileLocator.toFileURL(bundleEntryUrl);
+ path = fileUrl.getPath();
+ }
+ // Check JVM 64 Bit.
+ if (jvmBitMode != null && jvmBitMode.contains("64")) {
+ URL bundleEntryUrl = Platform.getBundle(Activator.PLUGIN_ID).getEntry("lib/z3");
+ URL fileUrl = FileLocator.toFileURL(bundleEntryUrl);
+ path = fileUrl.getPath();
+ }
+ return path;
+ }
+
+ public ISortValueCalculation getSortCaluculator(IProject project) throws RuntimeException {
+
+ if (!loadZ3Lib()) {
+ String errMsg = ERROR_ENV_PATH;
+ throw new RuntimeException(errMsg);
+ }
+
+ ISortValueCalculation calc = null;
+ IFile file = findFile(SORT_SCRIPT_NAME, project);
+ if (file != null) {
+ try {
+ String fileName = file.getName();
+ String className = fileName.substring(0, fileName.lastIndexOf("."));
+
+ String string = file.getLocation().toString();
+ String genPath = string.substring(0, string.length() - fileName.length());
+
+ GroovyScriptEngine e = new GroovyScriptEngine(new String[] { genPath }, getClass().getClassLoader());
+ e.loadScriptByName(fileName);
+ Class<?> s = e.getGroovyClassLoader().loadClass(className);
+
+ calc = (ISortValueCalculation) s.newInstance();
+ } catch (Exception e) {
+ String errMsg = ERROR_SCRIPT;
+ throw new RuntimeException(errMsg);
+ }
+
+ } else {
+ String errMsg = String.format(ERROR_NOT_FOUND_SCRIPT, project.getName(), SORT_SCRIPT_NAME);
+ throw new RuntimeException(errMsg);
+ }
+
+ return calc;
+ }
+
+ public IFile findFile(String name, IContainer container) {
+ try {
+ IResource[] resources;
+ resources = container.members();
+ if (resources == null || resources.length == 0) {
+ return null;
+ }
+ for (IResource resource : resources) {
+ if (resource instanceof IFile && resource.getName().equals(name)) {
+ return (IFile) resource;
+ }
+ if (resource instanceof IContainer) {
+ IFile recursive = findFile(name, (IContainer) resource);
+ if (recursive != null) {
+ return recursive;
+ }
+ }
+ }
+ } catch (CoreException e) {
+ }
+
+ return null;
+ }
+
+ /**
+ * load z3 DLLs from the path
+ * @param z3Path
+ */
+ private void loadDLLs(String z3Path) throws Exception {
+ System.load(z3Path + "\\Microsoft.Z3.dll");
+ System.load(z3Path + "\\msvcr110.dll");
+ System.load(z3Path + "\\msvcp110.dll");
+ System.load(z3Path + "\\vcomp110.dll");
+ System.load(z3Path + "\\libz3.dll");
+ System.load(z3Path + "\\libz3java.dll");
+ }
+
+ /**
+ * add z3 path to java.library.path
+ * @param pathToAdd
+ */
+ private void addLibraryPath(String pathToAdd) throws Exception {
+ final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
+ usrPathsField.setAccessible(true);
+ // get array of paths
+ final String[] paths = (String[]) usrPathsField.get(null);
+ // check if the path to add is already present
+ for (String path : paths) {
+ if (path.equals(pathToAdd)) {
+ return;
+ }
+ }
+ // add the new path
+ final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
+ newPaths[newPaths.length - 1] = pathToAdd;
+ usrPathsField.set(null, newPaths);
+ }
+
+ public Map<String, Integer> setModel(Solver s, List<Expr> contentsList, Status st) {
+ switch (st) {
+ case UNKNOWN:
+ System.out.println("Unknown");
+ break;
+
+ case SATISFIABLE:
+ return setSat(s, contentsList);
+ case UNSATISFIABLE:
+ return setUnsat(s);
+ }
+
+ return null;
+ }
+
+ public Map<String, Integer> setSat(Solver s, List<Expr> evaluatedExpr) {
+
+ Map<String, Integer> map = new HashMap<String, Integer>();
+
+ map.put(Z3Constants.TOTAL_RESULT, Z3Constants.SAT_VAL);
+
+ for (Expr i : evaluatedExpr) {
+ String areaName = getName(i.getSExpr());
+ String expVal = s.getModel().evaluate(i, false).toString();
+
+ map.put(areaName, Integer.valueOf(expVal));
+ }
+
+ return map;
+ }
+
+ public Map<String, Integer> setUnsat(Solver s) {
+
+ Map<String, Integer> map = new HashMap<String, Integer>();
+
+ map.put(Z3Constants.TOTAL_RESULT, Z3Constants.UNSAT_VAL);
+
+ for (Expr i : s.getUnsatCore()) {
+ String areaName = getName(i.toString());
+ map.put(areaName, Z3Constants.UNSAT_VAL);
+ }
+ return map;
+ }
+
+ private String getName(String baseName) {
+ String name = baseName;
+ if (name.length() > 2 && name.startsWith("|") && name.endsWith("|")) {
+ name = name.substring(1, name.length() - 1);
+ }
+
+ return name;
+ }
+
+ public List<String> getErrors(Solver s, Status st) {
+ List<String> list = new ArrayList<String>();
+
+ switch (st) {
+ case UNKNOWN:
+
+ list.add(Z3Constants.UNKNOWN);
+ list.add(s.getReasonUnknown());
+ break;
+ case SATISFIABLE:
+ list.add(Z3Constants.SAT);
+ break;
+ case UNSATISFIABLE:
+ list.add(Z3Constants.UNSAT);
+
+ for (Expr i : s.getUnsatCore()) {
+ list.add(getName(i.toString()));
+ }
+ }
+
+ return list;
+ }
+
+ public List<String> getErrors(Context ctx, Solver s, Status st, String constrName, List<BoolExpr> constrList, List<BoolExpr> constrLabelList) {
+ List<String> list = new ArrayList<String>();
+
+ switch (st) {
+ case UNKNOWN:
+ String reason = s.getReasonUnknown();
+ System.out.println("*Unknown:" + constrName + " - " + reason);
+
+ Goal g = ctx.mkGoal(false, false, false);
+ for (int i = 0; i < constrList.size(); i++) {
+ g.add(constrList.get(i), constrLabelList.get(i));
+ }
+
+ Tactic t = ctx.mkTactic("qfbv");
+ try {
+ ApplyResult ar = t.apply(g);
+ if (ar.getNumSubgoals() == 1) {
+ if (ar.getSubgoals()[0].isDecidedSat()) {
+ System.out.println("=> SAT");
+ list.add(Z3Constants.SAT);
+ break;
+ }
+ }
+ } catch (Exception e) {
+ System.out.println("2ND Check");
+
+ t = ctx.mkTactic("smt");
+ try {
+ ApplyResult ar = t.apply(g);
+ if (ar.getNumSubgoals() == 1) {
+ if (ar.getSubgoals()[0].isDecidedSat()) {
+ System.out.println("==> SAT");
+ list.add(Z3Constants.SAT);
+ break;
+ }
+ }
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+ }
+
+ list.add(Z3Constants.UNKNOWN);
+ list.add(reason);
+ break;
+ case SATISFIABLE:
+ list.add(Z3Constants.SAT);
+ break;
+ case UNSATISFIABLE:
+ list.add(Z3Constants.UNSAT);
+
+ for (Expr i : s.getUnsatCore()) {
+ list.add(getName(i.toString()));
+ }
+ }
+
+ return list;
+ }
+
+ public IConstraintCalculation getConstraintCaluculator(IProject project) throws RuntimeException {
+
+ if (!loadZ3Lib()) {
+ String errMsg = ERROR_ENV_PATH;
+ throw new RuntimeException(errMsg);
+ }
+
+ IConstraintCalculation calc = null;
+ IFile file = findFile(CONST_SCRIPT_NAME, project);
+ if (file != null) {
+ String fileName = file.getName();
+ String className = fileName.substring(0, fileName.lastIndexOf("."));
+
+ String string = file.getLocation().toString();
+ String genPath = string.substring(0, string.length() - fileName.length());
+
+ calc = getConstraintCaluculator(fileName, className, genPath);
+
+ } else {
+ String errMsg = String.format(ERROR_NOT_FOUND_SCRIPT, project.getName(), CONST_SCRIPT_NAME);
+ throw new RuntimeException(errMsg);
+ }
+
+ return calc;
+ }
+
+ public IConstraintCalculation getConstraintCaluculator(String fileName, String className, String genPath) throws RuntimeException {
+ IConstraintCalculation calc = null;
+ try {
+ GroovyScriptEngine e = new GroovyScriptEngine(new String[] { genPath }, getClass().getClassLoader());
+ e.loadScriptByName(fileName);
+ Class<?> s = e.getGroovyClassLoader().loadClass(className);
+
+ calc = (IConstraintCalculation) s.newInstance();
+ } catch (Exception e) {
+ String errMsg = ERROR_SCRIPT;
+ System.out.println(e.getMessage());
+ throw new RuntimeException(errMsg);
+ }
+ return calc;
+ }
+}
diff --git a/rba.tool.core/src/rba/tool/core/z3/Z3Constants.java b/rba.tool.core/src/rba/tool/core/z3/Z3Constants.java
new file mode 100644
index 0000000..51e726f
--- /dev/null
+++ b/rba.tool.core/src/rba/tool/core/z3/Z3Constants.java
@@ -0,0 +1,18 @@
+package rba.tool.core.z3;
+
+public class Z3Constants {
+
+ public static String TOTAL_RESULT = "Z3_CODE_TOTAL_RESULT";
+
+ public static String SAT = "SAT";
+
+ public static String UNSAT = "UNSAT";
+
+ public static String UNKNOWN = "UNKNOWN";
+
+ public static Integer SAT_VAL = 0;
+
+ public static Integer UNSAT_VAL = -99;
+
+ public static Integer UNKNOWN_VAL = -98;
+}