diff --git a/de.prob.core.tests/.classpath b/de.prob.core.tests/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..396533344bbc5e009e1e5b52e3264c4be92efb17 --- /dev/null +++ b/de.prob.core.tests/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/de.prob.core.tests/.project b/de.prob.core.tests/.project new file mode 100644 index 0000000000000000000000000000000000000000..d35196a0d758c01def2ade464d2ae32be3d75326 --- /dev/null +++ b/de.prob.core.tests/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>de.prob.core.tests</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/de.prob.core.tests/.settings/org.eclipse.jdt.core.prefs b/de.prob.core.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..c537b63063ce6052bdc49c5fd0745b078f162c90 --- /dev/null +++ b/de.prob.core.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/de.prob.core.tests/META-INF/MANIFEST.MF b/de.prob.core.tests/META-INF/MANIFEST.MF new file mode 100644 index 0000000000000000000000000000000000000000..48c8af92e80d72d2f92ee77f4e39571ac9caa7de --- /dev/null +++ b/de.prob.core.tests/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Tests +Bundle-SymbolicName: de.prob.core.tests +Bundle-Version: 1.0.0.qualifier +Fragment-Host: de.prob.core +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Require-Bundle: org.junit;bundle-version="4.8.2" diff --git a/de.prob.core.tests/build.properties b/de.prob.core.tests/build.properties new file mode 100644 index 0000000000000000000000000000000000000000..34d2e4d2dad529ceaeb953bfcdb63c51d69ffed2 --- /dev/null +++ b/de.prob.core.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAllUnitTests.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAllUnitTests.java similarity index 91% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAllUnitTests.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAllUnitTests.java index 4799156dde7779b824f5cd04ae3f02dea53a3978..09ed7bc345fb64743bd228f85b7986c5edb14fcf 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAllUnitTests.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAllUnitTests.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAndUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAndUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAndUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAndUnitTest.java index c6c14c77fd74ea1b60f2f99f400f6233f3bd7810..d389f63aed1a40610e3264fd08a357d073c5d371 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAndUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAndUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import static org.junit.Assert.assertTrue; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleFinallyUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleFinallyUnitTest.java similarity index 96% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleFinallyUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleFinallyUnitTest.java index 6306b0992bc67ca3a0427f9845926790a4eb36df..1ddcd43cb25762df80a63a25af810d54b99c6c20 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleFinallyUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleFinallyUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import static org.junit.Assert.assertTrue; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleGloballyUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleGloballyUnitTest.java similarity index 96% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleGloballyUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleGloballyUnitTest.java index 5688ff428550e28d7fe2f2c0eb1a22c868451b28..f772c06a1f6790453536355706ecadb6850c05e7 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleGloballyUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleGloballyUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import static org.junit.Assert.assertTrue; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleHistoryUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleHistoryUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleHistoryUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleHistoryUnitTest.java index 132509c5281e0c2614d1c5e48c037693a453d438..51e89995d8ca4f09bb0ca2979714eab55263e686 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleHistoryUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleHistoryUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import static org.junit.Assert.assertTrue; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleImplyUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleImplyUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleImplyUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleImplyUnitTest.java index 7c557d58feeffe92ada8e4f782ff499544a263b3..c130d52f3a8689feb434abdc222cef59779c6082 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleImplyUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleImplyUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import static org.junit.Assert.assertTrue; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNextUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNextUnitTest.java similarity index 94% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNextUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNextUnitTest.java index 95bb621017d47dbcd3d9e2e56ca17e1bcadfe9d8..d6dd660ce65667d5637e11a56d7367e7f5129fda 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNextUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNextUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import org.junit.Test; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNotUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNotUnitTest.java similarity index 93% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNotUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNotUnitTest.java index 8eeb19f6093b901aea5a63b98946846d1388245b..3566fac5615f9dcb2de1423a62c4b33289acbae1 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNotUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNotUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import org.junit.Test; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOnceUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOnceUnitTest.java similarity index 95% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOnceUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOnceUnitTest.java index 33229e73fe06c46044480552116c416c70b6fd73..4457b80bfb84040bfc7d30f5353c64ff0b1bdc8f 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOnceUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOnceUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import org.junit.Test; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOrUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOrUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOrUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOrUnitTest.java index ba5f5ad113bfca8d2d8cb427a6d5152e571b429f..ccff698093a9695ddea8b19a642e368ea36f5c7c 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOrUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOrUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import static org.junit.Assert.assertTrue; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleReleaseUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleReleaseUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleReleaseUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleReleaseUnitTest.java index c9160c73629adef9122bcccdcca0fda064a94e53..afedebfc3311bcdc8ba91a139707e630da408017 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleReleaseUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleReleaseUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import org.junit.Test; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleSinceUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleSinceUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleSinceUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleSinceUnitTest.java index 967f926419d1ce9f784d37d9830cc00394ecfa26..3752a020179ea16948f81656545498e2d357b5fb 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleSinceUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleSinceUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; /** diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleTriggerUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleTriggerUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleTriggerUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleTriggerUnitTest.java index 45bc1d3d5c0258adbbfb1d2d38e29e6870a231cc..519401e2b72f949ad35134a629b5f6e925396f25 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleTriggerUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleTriggerUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; /** diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleUntilUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleUntilUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleUntilUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleUntilUnitTest.java index f94c169e5c6fd88020decff033c4368f33660e9f..d70463239614775f0c0374cb2146817afb7ab427 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleUntilUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleUntilUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; /** diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleWeakUntilUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleWeakUntilUnitTest.java similarity index 97% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleWeakUntilUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleWeakUntilUnitTest.java index db33abab5280f1fe13d283aec6c4e1a095dd5086..b7c91884b1a8ced635146f4c1ffaff25b7020aed 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleWeakUntilUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleWeakUntilUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; /** diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleYesterdayUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleYesterdayUnitTest.java similarity index 94% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleYesterdayUnitTest.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleYesterdayUnitTest.java index b7b7e2548bc1d2494bea2ebd6251a825db651e77..798865d4e40d7572e136e825159d395913c56750 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleYesterdayUnitTest.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleYesterdayUnitTest.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import org.junit.Test; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/LtlTestDescription.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/LtlTestDescription.java similarity index 98% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/LtlTestDescription.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/LtlTestDescription.java index 20b7f4000b856cb5646c96f32811ff325979e105..7b3aeaec5ea8aa687a4332b5f4f81c6165779cb8 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/LtlTestDescription.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/LtlTestDescription.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import java.util.ArrayList; import java.util.Collection; diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/TestCounterExample.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/TestCounterExample.java similarity index 92% rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/TestCounterExample.java rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/TestCounterExample.java index 2c075e9da5fee99d9da865c7a3e9a77ed735eb16..f7de3916d871628e21273554b9d53d2a33329c97 100644 --- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/TestCounterExample.java +++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/TestCounterExample.java @@ -1,4 +1,4 @@ -package de.prob.core.domainobjects.ltl.unittests; +package de.prob.core.domainobjects.ltl.tests; import de.prob.core.command.LtlCheckingCommand.PathType; import de.prob.core.domainobjects.ltl.CounterExample; diff --git a/de.prob.core/.classpath b/de.prob.core/.classpath index b5efa8550ac9c4daefb09ca828889085b018d941..21c83eda765b2559c5b944a30062af3fb6955a1f 100644 --- a/de.prob.core/.classpath +++ b/de.prob.core/.classpath @@ -1,23 +1,21 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/xmlpull-1.1.3.1.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/xpp3_min-1.1.4c.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/xstream-1.4.3.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-lang-2.6.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/jgrapht-0.8.3.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/jsr305-1.3.9.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> - <classpathentry kind="src" path="test"/> - <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.12-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-lang-2.6.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/jgrapht-0.8.3.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/jsr305-1.3.9.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.12-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.12-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.12-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.12-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/xmlpull-1.1.3.1.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/xpp3_min-1.1.4c.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/xstream-1.4.3.jar"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/de.prob.core/src/de/prob/core/command/ActivateUnitPluginCommand.java b/de.prob.core/src/de/prob/core/command/ActivateUnitPluginCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..5071e60e1f179908b6a1d438c12b818c408407ac --- /dev/null +++ b/de.prob.core/src/de/prob/core/command/ActivateUnitPluginCommand.java @@ -0,0 +1,57 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.core.command; + +import de.prob.core.Animator; +import de.prob.exceptions.ProBException; +import de.prob.parser.ISimplifiedROMap; +import de.prob.prolog.output.IPrologTermOutput; +import de.prob.prolog.term.PrologTerm; + +public class ActivateUnitPluginCommand implements IComposableCommand { + + private static final ActivateCmd ACTIVATE_CMD = new ActivateCmd(); + private final GetPrologRandomSeed getRandomSeed; + private final ComposedCommand cmd; + + public ActivateUnitPluginCommand() { + this.getRandomSeed = new GetPrologRandomSeed(); + this.cmd = new ComposedCommand(getRandomSeed, ACTIVATE_CMD); + } + + public static void activateUnitPlugin(final Animator animator) + throws ProBException { + animator.execute(new ActivateUnitPluginCommand()); + } + + public void processResult( + final ISimplifiedROMap<String, PrologTerm> bindings) + throws CommandException { + cmd.processResult(bindings); + final Animator animator = Animator.getAnimator(); + animator.setRandomSeed(getRandomSeed.getSeed()); + } + + public void writeCommand(final IPrologTermOutput pto) + throws CommandException { + cmd.writeCommand(pto); + } + + private final static class ActivateCmd implements IComposableCommand { + public void processResult( + final ISimplifiedROMap<String, PrologTerm> bindings) + throws CommandException { + } + + public void writeCommand(final IPrologTermOutput pto) { + pto.openTerm("activate_plugin"); + pto.printAtom("units"); + pto.closeTerm(); + } + } + +} diff --git a/de.prob.core/src/de/prob/core/command/GetPluginResultCommand.java b/de.prob.core/src/de/prob/core/command/GetPluginResultCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..eb99459f5a1e7b6264873bd541f0e8d7f81a06c0 --- /dev/null +++ b/de.prob.core/src/de/prob/core/command/GetPluginResultCommand.java @@ -0,0 +1,47 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.core.command; + +import de.prob.parser.BindingGenerator; +import de.prob.parser.ISimplifiedROMap; +import de.prob.parser.ResultParserException; +import de.prob.prolog.output.IPrologTermOutput; +import de.prob.prolog.term.ListPrologTerm; +import de.prob.prolog.term.PrologTerm; + +public final class GetPluginResultCommand implements IComposableCommand { + + private final String resultID; + private ListPrologTerm result; + + public GetPluginResultCommand(final String resultID) { + this.resultID = resultID; + } + + public ListPrologTerm getResult() { + return result; + } + + public void processResult( + final ISimplifiedROMap<String, PrologTerm> bindings) + throws CommandException { + try { + result = BindingGenerator.getList(bindings, "Bindings"); + } catch (ResultParserException e) { + CommandException commandException = new CommandException( + e.getLocalizedMessage(), e); + commandException.notifyUserOnce(); + throw commandException; + } + } + + public void writeCommand(final IPrologTermOutput pto) { + pto.openTerm("get_plugin_output").printAtomOrNumber(resultID) + .printVariable("Bindings").closeTerm(); + } + +} diff --git a/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java b/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java index 316d436cfb029a75fd3232548ee3415f178854a1..78335f27dbe8219e1129b5286e771ac514283b15 100644 --- a/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java +++ b/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java @@ -19,17 +19,15 @@ import org.rodinp.core.RodinDBException; import de.prob.core.Animator; import de.prob.core.LanguageDependendAnimationPart; +import de.prob.core.command.internal.InternalLoadCommand; import de.prob.core.domainobjects.MachineDescription; import de.prob.core.domainobjects.Operation; import de.prob.core.domainobjects.ProBPreference; import de.prob.core.domainobjects.State; import de.prob.core.langdep.EventBAnimatorPart; -import de.prob.core.translator.TranslationFailedException; -import de.prob.eventb.translator.TranslatorFactory; import de.prob.exceptions.ProBException; import de.prob.logging.Logger; import de.prob.parser.ISimplifiedROMap; -import de.prob.prolog.output.IPrologTermOutput; import de.prob.prolog.output.StructuredPrologOutput; import de.prob.prolog.term.PrologTerm; @@ -162,32 +160,4 @@ public final class LoadEventBModelCommand { animator.announceReset(); } } - - private static class InternalLoadCommand implements IComposableCommand { - private final IEventBRoot model; - - public InternalLoadCommand(final IEventBRoot model) { - this.model = model; - } - - @Override - public void writeCommand(final IPrologTermOutput pto) - throws CommandException { - try { - TranslatorFactory.translate(model, pto); - } catch (TranslationFailedException e) { - throw new CommandException( - "Translation from Event-B to ProB's internal representation failed", - e); - } - } - - @Override - public void processResult( - final ISimplifiedROMap<String, PrologTerm> bindings) - throws CommandException { - // there are no results to process - } - - } } diff --git a/de.prob.core/src/de/prob/core/command/internal/InternalLoadCommand.java b/de.prob.core/src/de/prob/core/command/internal/InternalLoadCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..2a3eaf98d4fd0b82a4a4718c0878d2366bf08e67 --- /dev/null +++ b/de.prob.core/src/de/prob/core/command/internal/InternalLoadCommand.java @@ -0,0 +1,39 @@ +package de.prob.core.command.internal; + +import org.eventb.core.IEventBRoot; + +import de.prob.core.command.CommandException; +import de.prob.core.command.IComposableCommand; +import de.prob.core.translator.TranslationFailedException; +import de.prob.eventb.translator.TranslatorFactory; +import de.prob.parser.ISimplifiedROMap; +import de.prob.prolog.output.IPrologTermOutput; +import de.prob.prolog.term.PrologTerm; + +public final class InternalLoadCommand implements IComposableCommand { + private final IEventBRoot model; + + public InternalLoadCommand(final IEventBRoot model) { + this.model = model; + } + + @Override + public void writeCommand(final IPrologTermOutput pto) + throws CommandException { + try { + TranslatorFactory.translate(model, pto); + } catch (TranslationFailedException e) { + throw new CommandException( + "Translation from Event-B to ProB's internal representation failed", + e); + } + } + + @Override + public void processResult( + final ISimplifiedROMap<String, PrologTerm> bindings) + throws CommandException { + // there are no results to process + } + +} \ No newline at end of file diff --git a/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java b/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java new file mode 100644 index 0000000000000000000000000000000000000000..aa8994a965629cc4da6ca5c395c7a05cfcb83512 --- /dev/null +++ b/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java @@ -0,0 +1,15 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.core.translator.pragmas; + +import de.prob.prolog.output.IPrologTermOutput; + +public interface IPragma { + + void output(IPrologTermOutput pout); + +} diff --git a/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java b/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java new file mode 100644 index 0000000000000000000000000000000000000000..a1b5fd09d13a81b4e05149e7ca95aae0a2c76acd --- /dev/null +++ b/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java @@ -0,0 +1,34 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.core.translator.pragmas; + +import de.prob.prolog.output.IPrologTermOutput; + +public class UnitPragma implements IPragma { + private String definedIn; + private String attachedTo; + private String content; + + public UnitPragma(String definedIn, String attachedTo, String content) { + this.definedIn = definedIn; + this.attachedTo = attachedTo; + this.content = content; + } + + @Override + public void output(IPrologTermOutput pout) { + pout.openTerm("pragma"); + pout.printAtom("unit"); + pout.printAtom(definedIn); + pout.printAtom(attachedTo); + pout.openList(); + pout.printAtom(content); + pout.closeList(); + pout.closeTerm(); + } + +} diff --git a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java index ad5b33afb304accdbaa9f275db0e8a47d91b6707..43de100ee05eb13e7ff3db895e4fa38b11d5ee8b 100644 --- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java @@ -15,6 +15,7 @@ import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eventb.core.IContextRoot; +import org.eventb.core.IEventBRoot; import org.eventb.core.IExtendsContext; import org.eventb.core.ILabeledElement; import org.eventb.core.IPOSequent; @@ -28,13 +29,15 @@ import org.eventb.core.ISCContext; import org.eventb.core.ISCContextRoot; import org.eventb.core.ISCExtendsContext; import org.eventb.core.ISCInternalContext; -import org.eventb.core.ISCMachineRoot; import org.eventb.core.ast.FormulaFactory; import org.eventb.core.ast.ITypeEnvironment; import org.eventb.core.seqprover.IConfidence; +import org.rodinp.core.IAttributeType; +import org.rodinp.core.IInternalElement; import org.rodinp.core.IRodinElement; import org.rodinp.core.IRodinFile; import org.rodinp.core.IRodinProject; +import org.rodinp.core.RodinCore; import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.analysis.pragma.internal.ClassifiedPragma; @@ -53,6 +56,8 @@ import de.be4.classicalb.core.parser.node.PSet; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; import de.hhu.stups.sablecc.patch.SourcePosition; import de.prob.core.translator.TranslationFailedException; +import de.prob.core.translator.pragmas.IPragma; +import de.prob.core.translator.pragmas.UnitPragma; import de.prob.eventb.translator.internal.EProofStatus; import de.prob.eventb.translator.internal.ProofObligation; import de.prob.eventb.translator.internal.SequentSource; @@ -65,18 +70,72 @@ public final class ContextTranslator extends AbstractComponentTranslator { private final Map<String, ISCContext> depContext = new HashMap<String, ISCContext>(); private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); private final List<ClassifiedPragma> proofspragmas = new ArrayList<ClassifiedPragma>(); + private final List<IPragma> pragmas = new ArrayList<IPragma>(); - public static ContextTranslator create(final ISCContext context) + private final IEventBRoot root; + private final FormulaFactory ff; + private final ITypeEnvironment te; + + public static ContextTranslator create(final ISCContextRoot context) throws TranslationFailedException { - ContextTranslator contextTranslator = new ContextTranslator(context); try { - contextTranslator.translate(); + assertConsistentModel(context); + final FormulaFactory ff = context.getFormulaFactory(); + final ITypeEnvironment te = context.getTypeEnvironment(ff); + final ContextTranslator translator = new ContextTranslator(context, + ff, te, context); + translator.translate(); + return translator; } catch (RodinDBException e) { - final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: "; - throw new TranslationFailedException(context.getComponentName(), - message + e.getLocalizedMessage()); + throw createTranslationFailedException(context, e); + } + } + + public static ContextTranslator create(final ISCInternalContext context, + final FormulaFactory ff, final ITypeEnvironment te) + throws TranslationFailedException { + final IEventBRoot root = getRootContext(context); + final ContextTranslator translator = new ContextTranslator(context, ff, + te, root); + try { + assertConsistentModel(context.getRoot()); + translator.translate(); + } catch (RodinDBException e) { + throw createTranslationFailedException(context, e); + } + return translator; + } + + private static IEventBRoot getRootContext(ISCInternalContext context) { + try { + String elementName = context.getElementName(); + IRodinProject rodinProject = context.getRodinProject(); + IRodinFile rodinFile = rodinProject.getRodinFile(elementName + + ".bcc"); + if (rodinFile.exists()) { + final IInternalElement element = rodinFile.getRoot(); + if (element instanceof IEventBRoot) { + return (IEventBRoot) element; + } + } + } catch (Exception e) { + // We do not guarantee to include proof infos. If something goes + // wrong, we ignore the Proof info. } - return contextTranslator; + return null; + } + + private static TranslationFailedException createTranslationFailedException( + final ISCContext context, RodinDBException e) + throws TranslationFailedException { + final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: "; + return new TranslationFailedException(context.getComponentName(), + message + e.getLocalizedMessage()); + } + + private static boolean assertConsistentModel(IInternalElement machine_root) + throws RodinDBException { + return Assert.isTrue(machine_root.getRodinFile().isConsistent()); } /** @@ -86,46 +145,56 @@ public final class ContextTranslator extends AbstractComponentTranslator { * contains errors) * * @param context + * The context to translate + * @param ff + * The FormulaFactory needed to extract the predicates + * @param te + * The TypeEnvironment needed to extract the predicates + * @param root + * the root to access the proofs * @throws TranslationFailedException - * @throws RodinDBException */ - private ContextTranslator(final ISCContext context) - throws TranslationFailedException { + private ContextTranslator(final ISCContext context, + final FormulaFactory ff, final ITypeEnvironment te, + final IEventBRoot root) throws TranslationFailedException { this.context = context; + this.ff = ff; + this.te = te; + this.root = root; } private void translate() throws RodinDBException { - if (context instanceof ISCContextRoot) { - ISCContextRoot context_root = (ISCContextRoot) context; - Assert.isTrue(context_root.getRodinFile().isConsistent()); - } else if (context instanceof ISCInternalContext) { - ISCInternalContext context_internal = (ISCInternalContext) context; - - try { - - String elementName = context_internal.getElementName(); - IRodinProject rodinProject = context_internal.getRodinProject(); - IRodinFile rodinFile = rodinProject.getRodinFile(elementName - + ".bcc"); - if (rodinFile.exists()) { - ISCContextRoot root = (ISCContextRoot) rodinFile.getRoot(); - collectProofInfo(root); + translateContext(); + collectProofInfo(); + collectPragmas(); + } + + private void collectPragmas() throws RodinDBException { + // unit pragma, attached to constants + final IAttributeType.String UNITATTRIBUTE = RodinCore + .getStringAttrType("de.prob.units.unitPragmaAttribute"); + + final ISCConstant[] constants = context.getSCConstants(); + + for (final ISCConstant constant : constants) { + if (constant.hasAttribute(UNITATTRIBUTE)) { + String content = constant.getAttributeValue(UNITATTRIBUTE); + + if (!content.isEmpty()) { + pragmas.add(new UnitPragma(getResource(), constant + .getIdentifierString(), content)); } - } catch (Exception e) { - // We do not guarantee to include proof infos. If something goes - // wrong, we ignore the Proof info. } - - ISCMachineRoot machine_root = (ISCMachineRoot) context_internal - .getRoot(); - Assert.isTrue(machine_root.getRodinFile().isConsistent()); } - translateContext(); + } + private void collectProofInfo() throws RodinDBException { + if (root != null) { + collectProofInfo(root); + } } - private void collectProofInfo(ISCContextRoot origin) - throws RodinDBException { + private void collectProofInfo(IEventBRoot origin) throws RodinDBException { IPSRoot proofStatus = origin.getPSRoot(); IPSStatus[] statuses = proofStatus.getStatuses(); @@ -305,20 +374,17 @@ public final class ContextTranslator extends AbstractComponentTranslator { final List<PPredicate> list = new ArrayList<PPredicate>( predicates.length); for (final ISCAxiom element : predicates) { - if (element.isTheorem() != theorems) { - continue; + if (element.isTheorem() == theorems) { + final PredicateVisitor visitor = new PredicateVisitor( + new LinkedList<String>()); + element.getPredicate(ff, te).accept(visitor); + final PPredicate predicate = visitor.getPredicate(); + list.add(predicate); + labelMapping.put(predicate, element); + proofspragmas.add(new ClassifiedPragma("discharged", predicate, + Arrays.asList(new String[0]), Arrays + .asList(new String[0]), NO_POS, NO_POS)); } - final PredicateVisitor visitor = new PredicateVisitor( - new LinkedList<String>()); - final FormulaFactory ff = FormulaFactory.getDefault(); - final ITypeEnvironment te = ff.makeTypeEnvironment(); - element.getPredicate(ff, te).accept(visitor); - final PPredicate predicate = visitor.getPredicate(); - list.add(predicate); - labelMapping.put(predicate, element); - proofspragmas.add(new ClassifiedPragma("discharged", predicate, - Arrays.asList(new String[0]), Arrays.asList(new String[0]), - NO_POS, NO_POS)); } return list; } @@ -327,6 +393,10 @@ public final class ContextTranslator extends AbstractComponentTranslator { return proofs; } + public List<IPragma> getPragmas() { + return pragmas; + } + public List<ClassifiedPragma> getProofspragmas() { return proofspragmas; } diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java index ae640ff98a9c1d84b2014b850b42db0f3c2058f3..075270d4ae253ae3aef71dafd9d877e1ee61a433 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java @@ -51,13 +51,15 @@ public final class EventBContextTranslator extends EventBTranslator { private void constructTranslation(final IPrologTermOutput pto) throws TranslationFailedException { - List<ContextTranslator> translators = new ArrayList<ContextTranslator>(); -// translators.add(ContextTranslator.create(context)); + List<ContextTranslator> contextTranslators = new ArrayList<ContextTranslator>(); + + // translators.add(ContextTranslator.create(context)); if (context instanceof ISCContextRoot) { ISCContextRoot root = (ISCContextRoot) context; - collectContexts(translators, new ArrayList<String>(), root); + collectContexts(contextTranslators, new ArrayList<String>(), root); } - printProlog(new ArrayList<ModelTranslator>(), translators, pto); + + printProlog(new ArrayList<ModelTranslator>(), contextTranslators, pto); } private void collectContexts(final List<ContextTranslator> translatorMap, diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java index b6ee12f4e13e3fbabecdd6b9ea25020a3f8b907f..845e660ebefc838aed2ec001cf513234c114e16e 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java @@ -11,6 +11,8 @@ import java.util.List; import org.eventb.core.ISCInternalContext; import org.eventb.core.ISCMachineRoot; +import org.eventb.core.ast.FormulaFactory; +import org.eventb.core.ast.ITypeEnvironment; import org.rodinp.core.IRodinFile; import org.rodinp.core.RodinDBException; @@ -102,12 +104,14 @@ public final class EventBMachineTranslator extends EventBTranslator { throws TranslationFailedException { final List<ContextTranslator> translators = new ArrayList<ContextTranslator>(); final List<String> processed = new ArrayList<String>(); - for (ISCMachineRoot m : models) { - ISCInternalContext[] seenContexts; + + for (final ISCMachineRoot m : models) { try { - seenContexts = m.getSCSeenContexts(); - for (ISCInternalContext seenContext : seenContexts) { - collectContexts(translators, processed, seenContext); + final FormulaFactory ff = m.getFormulaFactory(); + final ITypeEnvironment te = m.getTypeEnvironment(ff); + final ISCInternalContext[] seenContexts = m.getSCSeenContexts(); + for (final ISCInternalContext seenContext : seenContexts) { + collectContexts(translators, processed, seenContext, ff, te); } } catch (RodinDBException e) { throw new TranslationFailedException(e); @@ -117,12 +121,13 @@ public final class EventBMachineTranslator extends EventBTranslator { } private void collectContexts(final List<ContextTranslator> translatorMap, - final List<String> processed, final ISCInternalContext context) + final List<String> processed, final ISCInternalContext context, + final FormulaFactory ff, final ITypeEnvironment te) throws TranslationFailedException { String name = context.getElementName(); if (!processed.contains(name)) { processed.add(name); - translatorMap.add(ContextTranslator.create(context)); + translatorMap.add(ContextTranslator.create(context, ff, te)); } } diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java index ed82d8a8e8ee13b70b2e191805fa67b5168c306b..4cf7538db93dfea3df0b9355063386031bca3f3a 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java @@ -23,6 +23,7 @@ import de.be4.classicalb.core.parser.node.AEventBModelParseUnit; import de.be4.classicalb.core.parser.node.Node; import de.prob.core.translator.ITranslator; import de.prob.core.translator.TranslationFailedException; +import de.prob.core.translator.pragmas.IPragma; import de.prob.eventb.translator.AbstractComponentTranslator; import de.prob.eventb.translator.ContextTranslator; import de.prob.prolog.output.IPrologTermOutput; @@ -112,6 +113,24 @@ public abstract class EventBTranslator implements ITranslator { printFlowInformation(pout); } + private void printPragmaContents( + Collection<ModelTranslator> refinementChainTranslators, + Collection<ContextTranslator> contextTranslators, + IPrologTermOutput pout) { + ArrayList<IPragma> pragmas = new ArrayList<IPragma>(); + + for (ContextTranslator contextTranslator : contextTranslators) { + pragmas.addAll(contextTranslator.getPragmas()); + } + for (ModelTranslator modelTranslator : refinementChainTranslators) { + pragmas.addAll(modelTranslator.getPragmas()); + } + + for (IPragma pragma : pragmas) { + pragma.output(pout); + } + } + protected abstract void printFlowInformation(final IPrologTermOutput pout); private ASTProlog createAstVisitor( @@ -147,6 +166,8 @@ public abstract class EventBTranslator implements ITranslator { // } catch (RodinDBException e) { // e.printStackTrace(); // } + printPragmaContents(refinementChainTranslators, contextTranslators, + pout); pout.closeList(); pout.printVariable("_Error"); pout.closeTerm(); diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java index ead67da6ba447b4f830418088f54eb34069a3bf7..b121f405c522a52f7b8f866fd93487234a8900e0 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java @@ -35,13 +35,16 @@ import org.eventb.core.ISCVariable; import org.eventb.core.ISCVariant; import org.eventb.core.ISCWitness; import org.eventb.core.ITraceableElement; +import org.eventb.core.IVariable; import org.eventb.core.ast.FormulaFactory; import org.eventb.core.ast.ITypeEnvironment; import org.eventb.core.ast.Predicate; import org.eventb.core.seqprover.IConfidence; +import org.rodinp.core.IAttributeType; import org.rodinp.core.IElementType; import org.rodinp.core.IRodinElement; import org.rodinp.core.IRodinFile; +import org.rodinp.core.RodinCore; import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.node.AAnticipatedEventstatus; @@ -67,6 +70,8 @@ import de.be4.classicalb.core.parser.node.PSubstitution; import de.be4.classicalb.core.parser.node.PWitness; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; import de.prob.core.translator.TranslationFailedException; +import de.prob.core.translator.pragmas.IPragma; +import de.prob.core.translator.pragmas.UnitPragma; import de.prob.eventb.translator.AbstractComponentTranslator; import de.prob.eventb.translator.AssignmentVisitor; import de.prob.eventb.translator.ExpressionVisitor; @@ -81,6 +86,8 @@ public class ModelTranslator extends AbstractComponentTranslator { private final ITypeEnvironment te; private final IMachineRoot origin; private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); + private final List<IPragma> pragmas = new ArrayList<IPragma>(); + // private final List<String> depContext = new ArrayList<String>(); // Confined in the thread calling the factory method @@ -117,6 +124,10 @@ public class ModelTranslator extends AbstractComponentTranslator { return Collections.unmodifiableList(proofs); } + public List<IPragma> getPragmas() { + return Collections.unmodifiableList(pragmas); + } + public AEventBModelParseUnit getModelAST() { if (broken) { final String message = "The machine contains Rodin Problems. Please fix it before animating"; @@ -164,6 +175,28 @@ public class ModelTranslator extends AbstractComponentTranslator { // Check for fully discharged Invariants and Events collectProofInfo(); + + // Collect Pragmas, Units, etc. + collectPragmas(); + } + + private void collectPragmas() throws RodinDBException { + // unit pragma, attached to constants + final IAttributeType.String UNITATTRIBUTE = RodinCore + .getStringAttrType("de.prob.units.unitPragmaAttribute"); + + final IVariable[] variables = origin.getVariables(); + + for (final IVariable variable : variables) { + if (variable.hasAttribute(UNITATTRIBUTE)) { + String content = variable.getAttributeValue(UNITATTRIBUTE); + + if (!content.isEmpty()) { + pragmas.add(new UnitPragma(getResource(), variable + .getIdentifierString(), content)); + } + } + } } private void collectProofInfo() throws RodinDBException { @@ -179,7 +212,8 @@ public class ModelTranslator extends AbstractComponentTranslator { EProofStatus pstatus = EProofStatus.UNPROVEN; - if (!broken && (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX)) + if (!broken + && (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX)) pstatus = EProofStatus.REVIEWED; if (!broken && confidence == IConfidence.DISCHARGED_MAX) pstatus = EProofStatus.PROVEN; diff --git a/de.prob.ui/.classpath b/de.prob.ui/.classpath index f67843181ee95a7771d0edd1009be1faaed415b0..100092b255b1ad1a077f31d3e5931b134f6f5f45 100644 --- a/de.prob.ui/.classpath +++ b/de.prob.ui/.classpath @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> <classpathentry exported="true" kind="lib" path="lib/apache_xmlrpc.jar"/> <classpathentry exported="true" kind="lib" path="lib/ws_commons.jar"/> <classpathentry kind="output" path="bin"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/> </classpath> diff --git a/de.prob.units/.classpath b/de.prob.units/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..ad32c83a7885b8953a938b41df3b4fd4fe1aae01 --- /dev/null +++ b/de.prob.units/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/de.prob.units/.project b/de.prob.units/.project new file mode 100644 index 0000000000000000000000000000000000000000..22333fa9cb227f96d35310a6635507f782547a31 --- /dev/null +++ b/de.prob.units/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>de.prob.units</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/de.prob.units/.settings/org.eclipse.jdt.core.prefs b/de.prob.units/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..c537b63063ce6052bdc49c5fd0745b078f162c90 --- /dev/null +++ b/de.prob.units/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/de.prob.units/META-INF/MANIFEST.MF b/de.prob.units/META-INF/MANIFEST.MF new file mode 100644 index 0000000000000000000000000000000000000000..2fd89c80dfacabe94b60f1cb276335c25705d1f1 --- /dev/null +++ b/de.prob.units/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: ProB Physical Units Support +Bundle-SymbolicName: de.prob.units;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: de.prob.units.Activator +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + de.prob.core;bundle-version="9.3.0", + org.eventb.ui;bundle-version="[2.1.0,2.6.0)", + de.prob.ui;bundle-version="7.3.0" +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-Vendor: HHU Düsseldorf STUPS Group diff --git a/de.prob.units/build.properties b/de.prob.units/build.properties new file mode 100644 index 0000000000000000000000000000000000000000..79785acaeea2f69bbe4b5e556221958fef4b9f55 --- /dev/null +++ b/de.prob.units/build.properties @@ -0,0 +1,6 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + icons/,\ + plugin.xml diff --git a/de.prob.units/icons/unit_analysis.png b/de.prob.units/icons/unit_analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..36d5d6278be2e2226de7b9d4d0fc9da720e47f1b Binary files /dev/null and b/de.prob.units/icons/unit_analysis.png differ diff --git a/de.prob.units/plugin.xml b/de.prob.units/plugin.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c40c5db7d2f4deb3e68226c679a129edede9373 --- /dev/null +++ b/de.prob.units/plugin.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.4"?> +<plugin> + <extension + point="org.eventb.ui.editorItems"> + <textAttribute + class="de.prob.units.pragmas.UnitPragmaAttribute" + expandsHorizontally="true" + id="de.prob.units.unitPragmaAttribute" + isMath="true" + prefix="Physical Unit:" + style="de.prob.units.unitPragmaAttribute" + typeId="de.prob.units.unitPragmaAttribute"> + </textAttribute> + <attributeRelation + elementTypeId="org.eventb.core.variable"> + <attributeReference + descriptionId="de.prob.units.unitPragmaAttribute"> + </attributeReference> + <attributeReference + descriptionId="de.prob.units.inferredUnitPragmaAttribute"> + </attributeReference> + </attributeRelation> + <attributeRelation + elementTypeId="org.eventb.core.constant"> + <attributeReference + descriptionId="de.prob.units.unitPragmaAttribute"> + </attributeReference> + <attributeReference + descriptionId="de.prob.units.inferredUnitPragmaAttribute"> + </attributeReference> + </attributeRelation> + <textAttribute + class="de.prob.units.pragmas.InferredUnitPragmaAttribute" + expandsHorizontally="true" + id="de.prob.units.inferredUnitPragmaAttribute" + isMath="true" + prefix="Inferred Physical Unit:" + style="de.prob.units.inferredUnitPragmaAttribute" + typeId="de.prob.units.inferredUnitPragmaAttribute"> + </textAttribute> + </extension> + <extension + point="org.eclipse.ui.handlers"> + <handler + class="de.prob.units.ui.StartUnitAnalysisHandler" + commandId="de.prob.units.startunitanalysis"> + </handler> + </extension> + <extension + point="org.eclipse.ui.menus"> + <menuContribution + locationURI="popup:fr.systerel.explorer.navigator.view"> + <separator + name="de.prob.units.separator2" + visible="true"> + </separator> + <command + commandId="de.prob.units.startunitanalysis" + icon="icons/unit_analysis.png" + label="Analyse Physical Units" + style="push"> + <visibleWhen> + <with + variable="selection"> + <iterate + operator="or"> + <instanceof + value="org.eventb.core.IEventBRoot"> + </instanceof> + </iterate> + </with> + </visibleWhen> + </command> + <separator + name="de.prob.units.separator1" + visible="true"> + </separator> + </menuContribution> + </extension> + <extension + point="org.eclipse.ui.commands"> + <command + id="de.prob.units.startunitanalysis" + name="Analyse Physical Units"> + </command> + </extension> + <extension + point="org.rodinp.core.attributeTypes"> + <attributeType + id="unitPragmaAttribute" + kind="string" + name="Content of a unit Pragma to send to ProB"> + </attributeType> + <attributeType + id="inferredUnitPragmaAttribute" + kind="string" + name="Content of a unit Pragma received from ProB"> + </attributeType> + </extension> +</plugin> diff --git a/de.prob.units/src/de/prob/units/Activator.java b/de.prob.units/src/de/prob/units/Activator.java new file mode 100644 index 0000000000000000000000000000000000000000..cb9482f57446625e611905dd23c999190b96cf5c --- /dev/null +++ b/de.prob.units/src/de/prob/units/Activator.java @@ -0,0 +1,50 @@ +package de.prob.units; + +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 = "de.prob.units"; //$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/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java b/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java new file mode 100644 index 0000000000000000000000000000000000000000..a2d7ec278f082fb569e9827a184f7b6785a823c1 --- /dev/null +++ b/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java @@ -0,0 +1,75 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.units.pragmas; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eventb.core.IVariable; +import org.eventb.core.basis.Constant; +import org.eventb.internal.ui.eventbeditor.manipulation.IAttributeManipulation; +import org.rodinp.core.IAttributeType; +import org.rodinp.core.IInternalElement; +import org.rodinp.core.IRodinElement; +import org.rodinp.core.RodinCore; +import org.rodinp.core.RodinDBException; + +import de.prob.units.Activator; + +public class InferredUnitPragmaAttribute implements IAttributeManipulation { + public static IAttributeType.String ATTRIBUTE = RodinCore + .getStringAttrType(Activator.PLUGIN_ID + + ".inferredUnitPragmaAttribute"); + + public InferredUnitPragmaAttribute() { + // empty constructor + } + + private IInternalElement asInternalElement(IRodinElement element) { + if (element instanceof IVariable) { + return (IVariable) element; + } else if (element instanceof Constant) { + return (Constant) element; + } + return null; + } + + @Override + public String[] getPossibleValues(IRodinElement element, + IProgressMonitor monitor) { + return null; + } + + @Override + public String getValue(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + return asInternalElement(element).getAttributeValue(ATTRIBUTE); + } + + @Override + public boolean hasValue(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + return asInternalElement(element).hasAttribute(ATTRIBUTE); + } + + @Override + public void removeAttribute(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + asInternalElement(element).removeAttribute(ATTRIBUTE, monitor); + + } + + @Override + public void setDefaultValue(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + asInternalElement(element).setAttributeValue(ATTRIBUTE, "", monitor); + } + + @Override + public void setValue(IRodinElement element, String value, + IProgressMonitor monitor) throws RodinDBException { + asInternalElement(element).setAttributeValue(ATTRIBUTE, value, monitor); + } +} diff --git a/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java b/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java new file mode 100644 index 0000000000000000000000000000000000000000..8c0075f18b1545de6594c0234b6480b690db660f --- /dev/null +++ b/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java @@ -0,0 +1,74 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.units.pragmas; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eventb.core.IVariable; +import org.eventb.core.basis.Constant; +import org.eventb.internal.ui.eventbeditor.manipulation.IAttributeManipulation; +import org.rodinp.core.IAttributeType; +import org.rodinp.core.IInternalElement; +import org.rodinp.core.IRodinElement; +import org.rodinp.core.RodinCore; +import org.rodinp.core.RodinDBException; + +import de.prob.units.Activator; + +public class UnitPragmaAttribute implements IAttributeManipulation { + public static IAttributeType.String ATTRIBUTE = RodinCore + .getStringAttrType(Activator.PLUGIN_ID + ".unitPragmaAttribute"); + + public UnitPragmaAttribute() { + // empty constructor + } + + private IInternalElement asInternalElement(IRodinElement element) { + if (element instanceof IVariable) { + return (IVariable) element; + } else if (element instanceof Constant) { + return (Constant) element; + } + return null; + } + + @Override + public String[] getPossibleValues(IRodinElement element, + IProgressMonitor monitor) { + return null; + } + + @Override + public String getValue(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + return asInternalElement(element).getAttributeValue(ATTRIBUTE); + } + + @Override + public boolean hasValue(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + return asInternalElement(element).hasAttribute(ATTRIBUTE); + } + + @Override + public void removeAttribute(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + asInternalElement(element).removeAttribute(ATTRIBUTE, monitor); + + } + + @Override + public void setDefaultValue(IRodinElement element, IProgressMonitor monitor) + throws RodinDBException { + asInternalElement(element).setAttributeValue(ATTRIBUTE, "", monitor); + } + + @Override + public void setValue(IRodinElement element, String value, + IProgressMonitor monitor) throws RodinDBException { + asInternalElement(element).setAttributeValue(ATTRIBUTE, value, monitor); + } +} diff --git a/de.prob.units/src/de/prob/units/ui/StartUnitAnalysisHandler.java b/de.prob.units/src/de/prob/units/ui/StartUnitAnalysisHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..13585c407fc04e9c63257ab7e220d1e8159d62e1 --- /dev/null +++ b/de.prob.units/src/de/prob/units/ui/StartUnitAnalysisHandler.java @@ -0,0 +1,283 @@ +/** + * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich + * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 + * (http://www.eclipse.org/org/documents/epl-v10.html) + * */ + +package de.prob.units.ui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IHandler; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.handlers.HandlerUtil; +import org.eventb.core.IConstant; +import org.eventb.core.IContextRoot; +import org.eventb.core.IEventBRoot; +import org.eventb.core.IMachineRoot; +import org.eventb.core.IVariable; +import org.rodinp.core.IRodinFile; +import org.rodinp.core.RodinCore; +import org.rodinp.core.RodinDBException; + +import de.prob.core.Animator; +import de.prob.core.LimitedLogger; +import de.prob.core.command.ActivateUnitPluginCommand; +import de.prob.core.command.ClearMachineCommand; +import de.prob.core.command.CommandException; +import de.prob.core.command.ComposedCommand; +import de.prob.core.command.GetPluginResultCommand; +import de.prob.core.command.SetPreferencesCommand; +import de.prob.core.command.StartAnimationCommand; +import de.prob.core.command.internal.InternalLoadCommand; +import de.prob.exceptions.ProBException; +import de.prob.logging.Logger; +import de.prob.parser.BindingGenerator; +import de.prob.parser.ResultParserException; +import de.prob.prolog.term.CompoundPrologTerm; +import de.prob.prolog.term.ListPrologTerm; +import de.prob.prolog.term.PrologTerm; +import de.prob.units.pragmas.InferredUnitPragmaAttribute; + +public class StartUnitAnalysisHandler extends AbstractHandler implements + IHandler { + + public static class ModificationListener implements IResourceChangeListener { + + private final IPath path; + + public ModificationListener(final IFile resource) { + if (resource == null) { + path = null; + } else { + this.path = resource.getProject().getFullPath(); + } + } + + public void resourceChanged(final IResourceChangeEvent event) { + if (path != null) { + final IResourceDelta delta = event.getDelta(); + IResourceDelta member = delta.findMember(path); + if (member != null) { + Animator.getAnimator().setDirty(); + } + } + } + } + + private ISelection fSelection; + private ModificationListener listener; + + public Object execute(final ExecutionEvent event) throws ExecutionException { + + fSelection = HandlerUtil.getCurrentSelection(event); + + // Get the Selection + final IEventBRoot rootElement = getRootElement(); + final IFile resource = extractResource(rootElement); + + ArrayList<String> errors = new ArrayList<String>(); + boolean realError = checkErrorMarkers(resource, errors); + if (!errors.isEmpty()) { + String message = "Some components in your project contain " + + (realError ? "errors" : "warnings") + + ". This can lead to unexpected behavior (e.g. missing variables) when animating.\n\nDetails:\n"; + StringBuffer stringBuffer = new StringBuffer(message); + for (String string : errors) { + stringBuffer.append(string); + stringBuffer.append('\n'); + } + if (realError) + Logger.notifyUserWithoutBugreport(stringBuffer.toString()); + else + Logger.notifyUserAboutWarningWithoutBugreport(stringBuffer + .toString()); + } + ; + + if (resource != null) { + LimitedLogger.getLogger().log("user started unit analysis", + rootElement.getElementName(), null); + registerModificationListener(resource); + + final Animator animator = Animator.getAnimator(); + try { + // load machine and activate plugin + final ClearMachineCommand clear = new ClearMachineCommand(); + final SetPreferencesCommand setPrefs = SetPreferencesCommand + .createSetPreferencesCommand(animator); + final InternalLoadCommand load = new InternalLoadCommand( + rootElement); + final StartAnimationCommand start = new StartAnimationCommand(); + final ActivateUnitPluginCommand activatePlugin = new ActivateUnitPluginCommand(); + + final ComposedCommand composed = new ComposedCommand(clear, + setPrefs, load, start, activatePlugin); + + animator.execute(composed); + + GetPluginResultCommand pluginResultCommand = new GetPluginResultCommand( + "Grounded Result State"); + + animator.execute(pluginResultCommand); + + processResults(pluginResultCommand.getResult()); + } catch (ProBException e) { + e.notifyUserOnce(); + throw new ExecutionException("Unit Analysis Failed", e); + } catch (RodinDBException e) { + throw new ExecutionException( + "Unit Analysis Failed with a RodinDBException", e); + } + } + return null; + } + + private boolean checkErrorMarkers(final IFile resource, List<String> errors) { + boolean result = false; + IProject project = resource.getProject(); + try { + IMarker[] markers = project.findMarkers( + "org.eclipse.core.resources.problemmarker", true, + IResource.DEPTH_INFINITE); + for (IMarker iMarker : markers) { + errors.add(iMarker.getResource().getName() + + ": " + + iMarker + .getAttribute(IMarker.MESSAGE, "unknown Error")); + result = result + || (Integer) iMarker.getAttribute(IMarker.SEVERITY) == IMarker.SEVERITY_ERROR; + } + + } catch (CoreException e1) { + } + return result; + } + + private void processResults(ListPrologTerm result) throws RodinDBException, + ExecutionException { + // preprocess the list into a map + Map<String, String> variables = new HashMap<String, String>(); + for (PrologTerm term : result) { + CompoundPrologTerm compoundTerm; + try { + compoundTerm = BindingGenerator + .getCompoundTerm(term, "bind", 2); + + variables.put( + PrologTerm.atomicString(compoundTerm.getArgument(1)), + PrologTerm.atomicString(compoundTerm.getArgument(2))); + } catch (ResultParserException e) { + CommandException commandException = new CommandException( + e.getLocalizedMessage(), e); + commandException.notifyUserOnce(); + } + } + + IEventBRoot rootElement = getRootElement(); + // look up the variables / constants of the selected machine in + // the state + // and set the inferredUnitPragma attribute + if (rootElement instanceof IMachineRoot) { + // find and update variables + IVariable[] allVariables = rootElement.getMachineRoot() + .getVariables(); + + for (IVariable var : allVariables) { + String variableName = var.getIdentifierString(); + if (variables.containsKey(variableName)) { + var.setAttributeValue( + InferredUnitPragmaAttribute.ATTRIBUTE, + variables.get(variableName), + new NullProgressMonitor()); + } + } + + } else if (rootElement instanceof IContextRoot) { + // find and update constants + IConstant[] allConstants = rootElement.getContextRoot() + .getConstants(); + + for (IConstant var : allConstants) { + String constantName = var.getIdentifierString(); + if (variables.containsKey(constantName)) { + var.setAttributeValue( + InferredUnitPragmaAttribute.ATTRIBUTE, + variables.get(constantName), + new NullProgressMonitor()); + } + } + } else { + throw new ExecutionException( + "Cannot execute unit analysis on this element type. Type of " + + rootElement.getComponentName() + " was: " + + rootElement.getClass()); + } + } + + private IEventBRoot getRootElement() { + IEventBRoot root = null; + if (fSelection instanceof IStructuredSelection) { + final IStructuredSelection ssel = (IStructuredSelection) fSelection; + if (ssel.size() == 1) { + final Object element = ssel.getFirstElement(); + if (element instanceof IEventBRoot) { + root = (IEventBRoot) element; + } else if (element instanceof IFile) { + IRodinFile rodinFile = RodinCore.valueOf((IFile) element); + if (rodinFile != null) + root = (IEventBRoot) rodinFile.getRoot(); + } + } + } + return root; + } + + private IFile extractResource(final IEventBRoot rootElement) { + IFile resource = null; + if (rootElement == null) { + resource = null; + } else if (rootElement instanceof IMachineRoot) { + resource = ((IMachineRoot) rootElement).getSCMachineRoot() + .getResource(); + } else if (rootElement instanceof IContextRoot) { + resource = ((IContextRoot) rootElement).getSCContextRoot() + .getResource(); + } + return resource; + } + + private void registerModificationListener(final IFile resource) { + if (listener != null) { + ResourcesPlugin.getWorkspace().removeResourceChangeListener( + listener); + } + listener = new ModificationListener(resource); + ResourcesPlugin.getWorkspace().addResourceChangeListener(listener); + } + + public void selectionChanged(final IAction action, + final ISelection selection) { + fSelection = selection; + } + +} diff --git a/de.prob2.units.feature/.project b/de.prob2.units.feature/.project new file mode 100644 index 0000000000000000000000000000000000000000..96b7c78653fba0643a8efc26c06b6a3f61c66bd7 --- /dev/null +++ b/de.prob2.units.feature/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>de.prob2.units.feature</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.pde.FeatureBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.FeatureNature</nature> + </natures> +</projectDescription> diff --git a/de.prob2.units.feature/.settings/org.eclipse.core.resources.prefs b/de.prob2.units.feature/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000000000000000000000000000000000..ae8dfb5865c1107f8366e1e8c2af6ad2d1a7a9f1 --- /dev/null +++ b/de.prob2.units.feature/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Tue Nov 29 16:17:25 CET 2011 +eclipse.preferences.version=1 +encoding/<project>=UTF-8 diff --git a/de.prob2.units.feature/.settings/org.eclipse.core.runtime.prefs b/de.prob2.units.feature/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000000000000000000000000000000000000..57a8ae0b2a629cab658cebb8c79bd02f33f25fb0 --- /dev/null +++ b/de.prob2.units.feature/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,3 @@ +#Tue Nov 29 16:17:25 CET 2011 +eclipse.preferences.version=1 +line.separator=\n diff --git a/de.prob2.units.feature/build.properties b/de.prob2.units.feature/build.properties new file mode 100644 index 0000000000000000000000000000000000000000..64f93a9f0b7328eb563aa5ad6cec7f828020e124 --- /dev/null +++ b/de.prob2.units.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/de.prob2.units.feature/feature.xml b/de.prob2.units.feature/feature.xml new file mode 100644 index 0000000000000000000000000000000000000000..f02638a4f1ecfd6fc2843745fa8b2e45422ac453 --- /dev/null +++ b/de.prob2.units.feature/feature.xml @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="UTF-8"?> +<feature + id="de.prob2.units.feature" + label="ProB for Rodin2 - Physical Units Support" + version="2.3.5.qualifier" + provider-name="HHU Düsseldorf STUPS Group"> + + <description url="http://www.stups.uni-duesseldorf.de/ProB"> + ProB is an animator and model checker for the B-Method. It allows fully automatic animation of many B specifications, and can be used to systematically check a specification for errors. +Part of the research and development was conducted within the EPSRC funded projects ABCD and iMoc, and within the EU funded project Rodin. +Development is continued under the EU funded project Deploy and the DFG project Gepavas. +ProB has been successfully used on various industrial specifications and is now being used within Siemens. + </description> + + <copyright> + (C) 2000-2011 Michael Leuschel (and many others) All rights reserved. + </copyright> + + <license url="http://www.eclipse.org/org/documents/epl-v10.html"> + ProB can be used freely for commercial, non-commercial and academic +use under the Eclipse Public Licence v. 1.0. (below) +For availability of commercial support, please contact the author +(http://www.stups.uni-duesseldorf.de/~leuschel). +Use of ProB's nauty library for symmetry reduction implies further +restrictions (no applications with nontrivial military significance, +see http://cs.anu.edu.au/~bdm/nauty/). +--- +Eclipse Public License - v. 1.0 +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS +ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE +OF THIS AGREEMENT. +1. DEFINITIONS +"Contribution" means: +a) in the case of the initial Contributor, the initial code and +documentation distributed under this Agreement, and +b) in the case of each subsequent Contributor: +i) changes to the Program, and +ii) additions to the Program; +where such changes and/or additions to the Program originate +from and are distributed by that particular Contributor. A Contribution +'originates' from a Contributor if it was added to the Program +by such Contributor itself or anyone acting on such Contributor's +behalf. Contributions do not include additions to the Program +which: (i) are separate modules of software distributed in conjunction +with the Program under their own license agreement, and (ii) +are not derivative works of the Program. +"Contributor" means any person or entity that distributes the +Program. +"Licensed Patents" mean patent claims licensable by a Contributor +which are necessarily infringed by the use or sale of its Contribution +alone or when combined with the Program. +"Program" means the Contributions distributed in accordance with +this Agreement. +"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. +2. GRANT OF RIGHTS +a) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free copyright +license to reproduce, prepare derivative works of, publicly display, +publicly perform, distribute and sublicense the Contribution +of such Contributor, if any, and such derivative works, in source +code and object code form. +b) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free patent +license under Licensed Patents to make, use, sell, offer to sell, +import and otherwise transfer the Contribution of such Contributor, +if any, in source code and object code form. This patent license +shall apply to the combination of the Contribution and the Program +if, at the time the Contribution is added by the Contributor, +such addition of the Contribution causes such combination to +be covered by the Licensed Patents. The patent license shall +not apply to any other combinations which include the Contribution. +No hardware per se is licensed hereunder. +c) Recipient understands that although each Contributor grants +the licenses to its Contributions set forth herein, no assurances +are provided by any Contributor that the Program does not infringe +the patent or other intellectual property rights of any other +entity. Each Contributor disclaims any liability to Recipient +for claims brought by any other entity based on infringement +of intellectual property rights or otherwise. As a condition +to exercising the rights and licenses granted hereunder, each +Recipient hereby assumes sole responsibility to secure any other +intellectual property rights needed, if any. For example, if +a third party patent license is required to allow Recipient to +distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program. +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright +license set forth in this Agreement. +3. REQUIREMENTS +A Contributor may choose to distribute the Program in object +code form under its own license agreement, provided that: +a) it complies with the terms and conditions of this Agreement; +and +b) its license agreement: +i) effectively disclaims on behalf of all Contributors all warranties +and conditions, express and implied, including warranties or +conditions of title and non-infringement, and implied warranties +or conditions of merchantability and fitness for a particular +purpose; +ii) effectively excludes on behalf of all Contributors all liability +for damages, including direct, indirect, special, incidental +and consequential damages, such as lost profits; +iii) states that any provisions which differ from this Agreement +are offered by that Contributor alone and not by any other party; +and +iv) states that source code for the Program is available from +such Contributor, and informs licensees how to obtain it in a +reasonable manner on or through a medium customarily used for +software exchange. +When the Program is made available in source code form: +a) it must be made available under this Agreement; and +b) a copy of this Agreement must be included with each copy of +the Program. +Contributors may not remove or alter any copyright notices contained +within the Program. +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. +4. COMMERCIAL DISTRIBUTION +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While +this license is intended to facilitate the commercial use of +the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create +potential liability for other Contributors. Therefore, if a Contributor +includes the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any +losses, damages and costs (collectively "Losses") arising from +claims, lawsuits and other legal actions brought by a third party +against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection +with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any +claims or Losses relating to any actual or alleged intellectual +property infringement. In order to qualify, an Indemnified Contributor +must: a) promptly notify the Commercial Contributor in writing +of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense +and any related settlement negotiations. The Indemnified Contributor +may participate in any such claim at its own expense. +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have +to defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any +other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. +5. NO WARRANTY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM +IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, +ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with +its exercise of rights under this Agreement , including but not +limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or +equipment, and unavailability or interruption of operations. +6. DISCLAIMER OF LIABILITY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE +OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. +7. GENERAL +If any provision of this Agreement is invalid or unenforceable +under applicable law, it shall not affect the validity or enforceability +of the remainder of the terms of this Agreement, and without +further action by the parties hereto, such provision shall be +reformed to the minimum extent necessary to make such provision +valid and enforceable. +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging +that the Program itself (excluding combinations of the Program +with other software or hardware) infringes such Recipient's patent(s), +then such Recipient's rights granted under Section 2(b) shall +terminate as of the date such litigation is filed. +All Recipient's rights under this Agreement shall terminate if +it fails to comply with any of the material terms or conditions +of this Agreement and does not cure such failure in a reasonable +period of time after becoming aware of such noncompliance. If +all Recipient's rights under this Agreement terminate, Recipient +agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under +this Agreement and any licenses granted by Recipient relating +to the Program shall continue and survive. +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted +and may only be modified in the following manner. The Agreement +Steward reserves the right to publish new versions (including +revisions) of this Agreement from time to time. No one other +than the Agreement Steward has the right to modify this Agreement. +The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as +the Agreement Steward to a suitable separate entity. Each new +version of the Agreement will be given a distinguishing version +number. The Program (including Contributions) may always be distributed +subject to the version of the Agreement under which it was received. +In addition, after a new version of the Agreement is published, +Contributor may elect to distribute the Program (including its +Contributions) under the new version. Except as expressly stated +in Sections 2(a) and 2(b) above, Recipient receives no rights +or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under +this Agreement are reserved. +This Agreement is governed by the laws of the State of New York +and the intellectual property laws of the United States of America. +No party to this Agreement will bring a legal action under this +Agreement more than one year after the cause of action arose. +Each party waives its rights to a jury trial in any resulting +litigation. + </license> + + <requires> + <import feature="de.prob2.feature" version="2.3.5" match="greaterOrEqual"/> + </requires> + + <plugin + id="de.prob.units" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + +</feature> diff --git a/settings.gradle b/settings.gradle index bb2187c38344f1fac923b7dee971552ee4cdd523..2999825e4166d18ddb81985fd572577f4c160833 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -include 'de.prob.core', 'de.bmotionstudio.gef.editor' ,'de.bmotionstudio.rodin', 'de.bmotionstudio.help' , 'de.prob.plugin', 'de.prob.ui', 'de.prob2.feature' +include 'de.prob.core', 'de.prob.core.tests', 'de.bmotionstudio.gef.editor' ,'de.bmotionstudio.rodin', 'de.bmotionstudio.help' , 'de.prob.plugin', 'de.prob.ui', 'de.prob2.feature', 'de.prob.units', 'de.prob2.units.feature'