Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Pontesegger2017-11-02 13:36:54 +0000
committerChristian Pontesegger2017-11-02 13:37:19 +0000
commitc5b79604d08fdf4ae3084a6ee126e4727c196839 (patch)
tree9ca67c3afcaa80705d0d63f5d3583e67cdee3882
parent82872c407e20ce528efa16a487f7f0b94333c5b8 (diff)
downloadorg.eclipse.ease.scripts-c5b79604d08fdf4ae3084a6ee126e4727c196839.tar.gz
org.eclipse.ease.scripts-c5b79604d08fdf4ae3084a6ee126e4727c196839.tar.xz
org.eclipse.ease.scripts-c5b79604d08fdf4ae3084a6ee126e4727c196839.zip
Added EclipseCon Europe 2017 demo
-rw-r--r--Demos/EclipseCon Europe 2017/.classpath6
-rw-r--r--Demos/EclipseCon Europe 2017/.gitignore1
-rw-r--r--Demos/EclipseCon Europe 2017/.project23
-rw-r--r--Demos/EclipseCon Europe 2017/.pydevproject5
-rw-r--r--Demos/EclipseCon Europe 2017/.settings/org.eclipse.jdt.core.prefs11
-rw-r--r--Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/01 Hello World.js1
-rw-r--r--Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/02 Java Access.js5
-rw-r--r--Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/03 Eclipse Access.js3
-rw-r--r--Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/index.html29
-rw-r--r--Demos/EclipseCon Europe 2017/demo/02 Modules/01 Create Project via Resources module.js6
-rw-r--r--Demos/EclipseCon Europe 2017/demo/02 Modules/02 Module prototyping.js5
-rw-r--r--Demos/EclipseCon Europe 2017/demo/02 Modules/03 Charting.js41
-rw-r--r--Demos/EclipseCon Europe 2017/demo/02 Modules/index.html26
-rw-r--r--Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/01 Create Project.js11
-rw-r--r--Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/create_project.pngbin0 -> 812 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Builder.js21
-rw-r--r--Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Explore from here.js28
-rw-r--r--Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Pastebin.js98
-rw-r--r--Demos/EclipseCon Europe 2017/demo/03 Scripts/index.html40
-rw-r--r--Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ClassicTest.js18
-rw-r--r--Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ModernTest.js54
-rw-r--r--Demos/EclipseCon Europe 2017/demo/04 Unit Testing/Testsuite.suite18
-rw-r--r--Demos/EclipseCon Europe 2017/demo/04 Unit Testing/index.html16
-rw-r--r--Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/I2C device.js32
-rw-r--r--Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/Web Service.js26
-rw-r--r--Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/library.js3
-rw-r--r--Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/main.js2
-rw-r--r--Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive.sarbin0 -> 854 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/05 Script Archives/index.html23
-rw-r--r--Demos/EclipseCon Europe 2017/demo/05 Script Archives/tests archive.sarbin0 -> 1160 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/04 Jupyter-checkpoint.ipynb77
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/05 Jupyter matplotlib-checkpoint.ipynb127
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/01 python.py4
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/02 hello.groovy1
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/03 hello ruby.rb2
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/04 Jupyter.ipynb77
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/05 Jupyter matplotlib.ipynb127
-rw-r--r--Demos/EclipseCon Europe 2017/demo/06 Other Languages/index.html117
-rw-r--r--Demos/EclipseCon Europe 2017/demo/big_picture.html13
-rw-r--r--Demos/EclipseCon Europe 2017/demo/evaluate.html8
-rw-r--r--Demos/EclipseCon Europe 2017/demo/index.html26
-rw-r--r--Demos/EclipseCon Europe 2017/demo/webroot/background.pngbin0 -> 4909 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/webroot/ease_schematic.pngbin0 -> 35716 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/webroot/evaluate.pngbin0 -> 55924 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/webroot/not_supported.pngbin0 -> 35137 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/demo/webroot/stylesheet.css51
-rw-r--r--Demos/EclipseCon Europe 2017/demo/webroot/supported.pngbin0 -> 32677 bytes
-rw-r--r--Demos/EclipseCon Europe 2017/plugin.xml14
-rw-r--r--Demos/EclipseCon Europe 2017/src/org/eclipse/eclipsecon2017/SimpleModule.java8
49 files changed, 1204 insertions, 0 deletions
diff --git a/Demos/EclipseCon Europe 2017/.classpath b/Demos/EclipseCon Europe 2017/.classpath
new file mode 100644
index 0000000..51a8bba
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/.classpath
@@ -0,0 +1,6 @@
+<?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.8"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Demos/EclipseCon Europe 2017/.gitignore b/Demos/EclipseCon Europe 2017/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/Demos/EclipseCon Europe 2017/.project b/Demos/EclipseCon Europe 2017/.project
new file mode 100644
index 0000000..abde5a4
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>EclipseCon Europe 2017</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.python.pydev.PyDevBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.python.pydev.pythonNature</nature>
+ </natures>
+</projectDescription>
diff --git a/Demos/EclipseCon Europe 2017/.pydevproject b/Demos/EclipseCon Europe 2017/.pydevproject
new file mode 100644
index 0000000..987a614
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/.pydevproject
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?><pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+</pydev_project>
diff --git a/Demos/EclipseCon Europe 2017/.settings/org.eclipse.jdt.core.prefs b/Demos/EclipseCon Europe 2017/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a21537
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/01 Hello World.js b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/01 Hello World.js
new file mode 100644
index 0000000..442659b
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/01 Hello World.js
@@ -0,0 +1 @@
+print("Hello world!") \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/02 Java Access.js b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/02 Java Access.js
new file mode 100644
index 0000000..bcbc433
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/02 Java Access.js
@@ -0,0 +1,5 @@
+var file = new java.io.File("C:/")
+if (file.exists())
+ print("File <" + file + "> exists")
+else
+ print("File <" + file + "> does not exist") \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/03 Eclipse Access.js b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/03 Eclipse Access.js
new file mode 100644
index 0000000..8c02b60
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/03 Eclipse Access.js
@@ -0,0 +1,3 @@
+var workspaceRoot = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot();
+var project = workspaceRoot.getProject("EclipseCon Europe 2017");
+print(project.getClass()) \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/index.html b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/index.html
new file mode 100644
index 0000000..3b109f4
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/01 Simple Scripts/index.html
@@ -0,0 +1,29 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="../webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ </head>
+ <body>
+ <h1>First steps with EASE</h1>
+
+ <h2>Hello World</h2>
+ Open the <i>Script Shell</i> view and enter following code:
+ <pre>print("Hello World");</pre>
+
+ The result will be printed to the <i>Console</i> view.<br />
+ The return value of the operation will be visible in the Script Shell directly.
+
+ <h2>Java Access</h2>
+ Java classes can be accessed directly by providing their full qualified name:
+ <pre>new java.io.File("C:/");</pre>
+
+ For simpler access classes or and packages can be imported into the global namespace:
+ <pre>importClass(java.io.File);
+new File("C:/")</pre>
+
+ <h2>Eclipse Access</h2>
+ Due to a special classloader policy we may access Eclipse classes too:
+ <pre>org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot();</pre>
+
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/02 Modules/01 Create Project via Resources module.js b/Demos/EclipseCon Europe 2017/demo/02 Modules/01 Create Project via Resources module.js
new file mode 100644
index 0000000..f603da9
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/02 Modules/01 Create Project via Resources module.js
@@ -0,0 +1,6 @@
+loadModule('/System/Resources');
+loadModule("/System/UI");
+
+var projectName = showInputDialog("Please provide a new name for your project");
+if (projectName != null)
+ createProject(projectName)
diff --git a/Demos/EclipseCon Europe 2017/demo/02 Modules/02 Module prototyping.js b/Demos/EclipseCon Europe 2017/demo/02 Modules/02 Module prototyping.js
new file mode 100644
index 0000000..cbd965b
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/02 Modules/02 Module prototyping.js
@@ -0,0 +1,5 @@
+loadModule("/System/JVM", false);
+module = createInstance("workspace://EclipseCon Europe 2017/src/org/eclipse/eclipsecon2017/SimpleModule.java");
+wrap(module);
+
+greet();
diff --git a/Demos/EclipseCon Europe 2017/demo/02 Modules/03 Charting.js b/Demos/EclipseCon Europe 2017/demo/02 Modules/03 Charting.js
new file mode 100644
index 0000000..574d12c
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/02 Modules/03 Charting.js
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Christian Pontesegger and others. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Christian Pontesegger - initial API and implementation
+ ******************************************************************************/
+
+loadModule('/Charting');
+loadModule('/System/Platform');
+
+var servers = ["localhost", "www.eclipse.org", "www.google.com", "www.adelaidecitycouncil.com"];
+
+figure("Ping Statistics");
+clear();
+setXLabel("Ping attempt")
+setYLabel("Time [ms]")
+
+for (var count = 1; count < 20; count++) {
+ for each (address in servers) {
+ series(address);
+
+ // run 'ping' command
+ // process = runProcess("ping", [ "-c 1", address ]); // linux command style
+ process = runProcess("ping", [ "-n", "1", address ]); // windows command style
+ while (!process.isFinished())
+ ;
+
+ // parse output
+ output = process.getOutput();
+ start = output.indexOf("time=");
+ if (start != -1) {
+ end = output.indexOf("ms", start);
+ if (end != -1) {
+ time = parseFloat(output.substring(start + 5, end).trim());
+ plotPoint(count, time);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/02 Modules/index.html b/Demos/EclipseCon Europe 2017/demo/02 Modules/index.html
new file mode 100644
index 0000000..9168246
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/02 Modules/index.html
@@ -0,0 +1,26 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="../webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ </head>
+ <body>
+ <h1>EASE Modules</h1>
+
+ <h2>Using Modules</h2>
+
+ Modules provide a simple way to access commonly used API. By default it enforces a functional style of programming also for inexperienced programmers.
+ The <i>Modules Explorer</i> view provides browsing support and help documentation for available modules.
+ <p>
+ Before a module function can be used, the corresponding module needs to be loaded:
+ </p>
+ <pre>loadModule("/System/Resources");
+getWorkspace();</pre>
+
+ <h2>Writing Modules</h2>
+
+ Modules are Java classes that get registered via an extension point.
+ The simplest modules are POJOs without any dependency to EASE or Eclipse. By using Annotations module developers get more control on which functionality is available to script developers.
+ <p>A full tutorial on writing modules is available on the <a href="https://wiki.eclipse.org/EASE/Module_Contribution">EASE Wiki</a>.
+
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/01 Create Project.js b/Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/01 Create Project.js
new file mode 100644
index 0000000..93809ba
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/01 Create Project.js
@@ -0,0 +1,11 @@
+/**
+ * toolbar: Project Explorer
+ * name: Create P
+ * image: create_project.png
+ */
+loadModule('/System/Resources');
+loadModule("/System/UI");
+
+var projectName = showInputDialog("Please provide a new name for your project");
+if (projectName != null)
+ createProject(projectName)
diff --git a/Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/create_project.png b/Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/create_project.png
new file mode 100644
index 0000000..608552f
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/03 Scripts/01 basisc/create_project.png
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Builder.js b/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Builder.js
new file mode 100644
index 0000000..c5a1b64
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Builder.js
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2016 Christian Pontesegger and others. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * name: Custom JS Builder
+ * XonSave: *.js
+ */
+loadModule('/System/Resources');
+
+markerMessage = "File should start with a file comment";
+
+// remove old markers
+file = getFile(argv[0]);
+file.deleteMarkers("org.eclipse.core.resources.problemmarker", false, 0);
+
+firstLine = readLine(file).trim();
+if (!firstLine.startsWith("//") && !firstLine.startsWith("/*"))
+ // file should start with a comment
+ createProblemMarker("warning", argv[0], 1, "File should start with a file comment");
diff --git a/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Explore from here.js b/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Explore from here.js
new file mode 100644
index 0000000..da3a1b7
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Explore from here.js
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Christian Pontesegger and others. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * name: Explore from here
+ * image: platform:/plugin/org.eclipse.ease.ui/icons/eobj16/folder.png
+ * popup: enableFor(org.eclipse.core.resources.IResource)
+ ******************************************************************************/
+
+loadModule('/System/Platform');
+loadModule('/System/UI');
+
+var selection = getSelection();
+if (selection instanceof org.eclipse.jface.viewers.IStructuredSelection)
+ selection = selection.getFirstElement();
+
+if (!(selection instanceof org.eclipse.core.resources.IResource))
+ selection = adapt(selection, org.eclipse.core.resources.IResource)
+
+if (selection instanceof org.eclipse.core.resources.IFile)
+ selection = selection.getParent();
+
+if (selection instanceof org.eclipse.core.resources.IContainer)
+ // runProcess("/usr/bin/krusader", [ "--left",
+ // getSystemProperty("user.home"), "--right", selection.getRawLocation() ]);
+ runProcess("explorer.exe", [ selection.getLocation().toFile().toString() ]); \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Pastebin.js b/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Pastebin.js
new file mode 100644
index 0000000..b16461f
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/03 Scripts/02 more examples/Pastebin.js
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2016 Christian Pontesegger and others. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * name: Copy to PasteBin
+ * popup: enableFor(org.eclipse.jface.text.ITextSelection)
+ * image: http://pastebin.com/favicon.ico
+ */
+
+loadModule("/System/UI");
+
+// get selected text
+code = getSelection().getText();
+language = "unknown";
+title = "Code Snippet";
+
+// try to detect editor type to set right coding
+if (getActiveView() instanceof org.eclipse.wst.jsdt.internal.ui.javaeditor.CompilationUnitEditor)
+ language = "javascript";
+else if (getActiveView() instanceof org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor)
+ language = "java";
+
+// try to get filename from active editor
+editorInput = getActiveView().getEditorInput();
+if (editorInput instanceof org.eclipse.ui.part.FileEditorInput)
+ title = editorInput.getFile().getName();
+
+// paste content
+paste(title, code, language);
+
+// visualize paste result
+if ((response.startsWith("Bad")) || (response.startsWith("Post")))
+ showErrorDialog("Could not publish to pastebin:\n\n" + response,
+ "Pastebin error");
+else
+ showInputDialog("Successfully pasted to: ", response, "Pastebin URL");
+
+/**
+ * Paste a text on PasteBin.
+ *
+ * @param title
+ * paste title
+ * @param message
+ * paste content
+ * @returns PasteBin response
+ */
+function paste(title, message, language) {
+ params = encode("api_dev_key", "0d8fe3b5d541fda00bf87d8d66d7ac2d");
+ params += "&" + encode("api_option", "paste");
+ params += "&" + encode("api_paste_code", code);
+ params += "&" + encode("api_paste_private", "0");
+ params += "&" + encode("api_paste_name", title);
+ params += "&" + encode("api_paste_format", language);
+ params += "&" + encode("api_paste_expire_date", "1H");
+ // params += "&" + encode("api_user_key", "");
+
+ postData = new java.lang.String(params)
+ .getBytes(java.nio.charset.StandardCharsets.UTF_8);
+
+ url = new java.net.URL("http://pastebin.com/api/api_post.php");
+
+ // @type java.net.HttpURLConnection
+ connection = url.openConnection();
+ connection.setDoOutput(true)
+ connection.setInstanceFollowRedirects(false);
+ connection.setRequestMethod("POST");
+ connection.setRequestProperty("Content-Type",
+ "application/x-www-form-urlencoded");
+ connection.setRequestProperty("charset", "utf-8");
+ connection.setRequestProperty("Content-Length", postData.length);
+ connection.setUseCaches(false);
+
+ connection.getOutputStream().write(postData);
+ connection.getOutputStream().close();
+
+ reader = new java.io.BufferedReader(new java.io.InputStreamReader(
+ connection.getInputStream()));
+ response = reader.readLine();
+ connection.disconnect();
+
+ return response;
+}
+
+/**
+ * Utility function to encode text data for POST request
+ *
+ * @param key
+ * parameter key
+ * @param value
+ * parameter content
+ * @returns encoded POST parameter
+ */
+function encode(key, value) {
+ return java.net.URLEncoder.encode(key) + "="
+ + java.net.URLEncoder.encode(value);
+} \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/03 Scripts/index.html b/Demos/EclipseCon Europe 2017/demo/03 Scripts/index.html
new file mode 100644
index 0000000..aa22e31
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/03 Scripts/index.html
@@ -0,0 +1,40 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="../webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ </head>
+ <body>
+ <h1>Scripts</h1>
+
+ Scripts are helpers that you want to integrate closer with your running application.
+ <p>
+ By adding locations to <i>Preferences / Scripting / Script Locations</i> contained script files get visible in the <i>Script Explorer</i> view.
+ </p>
+
+ <h2>Executing Scripts</h2>
+
+ You may launch scripts directly from the <i>Script Explorer</i> view by double clicking them. Further scripts can be included using the scripts: URI scheme:
+
+ <pre>include("scripts://your script");</pre>
+
+ <h2>UI Integration</h2>
+
+ Magic headers in script files allow to hook your scripts right into the UI of your running application.
+ You may extend view toolbars and menus as well as popup menus.
+ <p>
+ A full list of featured keywords is available on <a href="https://wiki.eclipse.org/EASE/Scripts">our Wiki</a>.
+ </p>
+ <p>
+ Entries in the <i>Script Explorer</i> view do provide properties which allow simpler editing of keywords.
+ </p>
+
+ <h2>Other Keywords</h2>
+
+ UI integration is not the only use case for keywords. They may also be used to automatically trigger scripts on certain events like resource changes, keyboard shortcuts or messages on the event bus.
+
+ <h2>Your own Keywords</h2>
+
+ Keyword support is extensible allowing to add your own keywords and event types.
+
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ClassicTest.js b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ClassicTest.js
new file mode 100644
index 0000000..67f0953
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ClassicTest.js
@@ -0,0 +1,18 @@
+loadModule("/Unittest");
+
+startTest("valid", "simple valid test")
+assertTrue(true)
+endTest()
+
+startTest("invalid", "simple fail test")
+assertTrue(false)
+endTest()
+
+startTest("ignored test", "this test does not count")
+ignoreTest();
+assertTrue(false);
+endTest()
+
+startTest("error", "test raising an error")
+throw "does not work"
+endTest()
diff --git a/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ModernTest.js b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ModernTest.js
new file mode 100644
index 0000000..c31969b
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/ModernTest.js
@@ -0,0 +1,54 @@
+loadModule("/Unittest");
+
+var ModernTest = {
+
+ __unittest : '',
+ __description : 'Test class demonstrating modern testing',
+
+ testValid : function() {
+ '@description(Working testcase)';
+
+ assertTrue(true);
+ },
+
+ testInvalid : function() {
+ '@description(testcase that fails)';
+
+ assertTrue(false);
+ },
+
+ testError : function() {
+ '@description(testcase throwing an exception)';
+
+ throw "this does not work";
+ },
+
+ testExpectError : function() {
+ '@description(testcase expecting an exception)';
+ '@expect(java.lang.Throwable)';
+
+ throw new java.lang.Throwable("this does not work");
+ },
+
+ testExpectErrorButNotThrown : function() {
+ '@description(testcase expecting an exception but not thrown from test)';
+ '@expect(java.lang.Throwable)';
+
+ },
+
+ testIgnored : function() {
+ '@description(testcase expecting an exception)';
+ '@ignore(something)';
+
+ print("This test should not be executed")
+ assertTrue(false);
+ },
+
+ testTimeout : function() {
+ '@description(running into timeout)';
+ '@timeout(500)';
+
+ var start = java.lang.System.currentTimeMillis();
+ while (java.lang.System.currentTimeMillis() - start < 1000);
+ }
+}
diff --git a/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/Testsuite.suite b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/Testsuite.suite
new file mode 100644
index 0000000..de641e7
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/Testsuite.suite
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ASCII"?>
+<TestSuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://eclipse.org/ease/unittest/testsuite/1.0" version="1.0">
+ <description>&lt;h2>Hello testsuite&lt;/h2>
+this is a simple suite to show the features of &lt;b>EASE&lt;/b>
+</description>
+ <includeFilter>project://demo/04**.js
+</includeFilter>
+ <excludeFilter>
+</excludeFilter>
+ <disabledResource>/workspace/JavaScript Unittest/Javascript Testrunner.js</disabledResource>
+ <disabledResource>/workspace/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/I2C device.js</disabledResource>
+ <disabledResource>/workspace/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/Web Service.js</disabledResource>
+ <variable fullName="/myVariable">
+ <content>hi there</content>
+ </variable>
+ <flag key="PROMOTE_FAILURE_TO_ERROR" value="false"/>
+ <flag key="PREFERRED_ENGINE_ID" value="org.eclipse.ease.javascript.rhinoDebugger"/>
+</TestSuite>
diff --git a/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/index.html b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/index.html
new file mode 100644
index 0000000..eb3477d
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/index.html
@@ -0,0 +1,16 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="../webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ </head>
+ <body>
+ <h1>Scripted Unit Testing</h1>
+
+ EASE provides a full featured unit test framework for JavaScript and Python scripts.
+
+ <p>
+ A detailed descriptino is available on <a href="http://codeandme.blogspot.co.at/2015/05/unit-testing-with-scripts-in-ease.html">codeandme.blogspot.com</a>.
+ </p>
+
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/I2C device.js b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/I2C device.js
new file mode 100644
index 0000000..7c41f46
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/I2C device.js
@@ -0,0 +1,32 @@
+loadModule("/Unittest");
+loadModule("/I2C Communication")
+
+slaveAddress = 0xC0;
+register = 0x01;
+dataToWrite = 0xFA;
+
+startTest("raw communication")
+sendI2CStart();
+sendI2C(slaveAddress)
+sendI2C(register)
+sendI2C(dataToWrite)
+sendI2CStop()
+
+sendI2CStart();
+sendI2C(slaveAddress & 0x01)
+data = readI2C()
+
+assertEquals(data, dataToWrite);
+endTest()
+
+
+
+startTest("raw communication")
+writeRegister(register, dataToWrite);
+data = readRegister(register);
+
+assertEquals(data, dataToWrite);
+endTest()
+
+
+
diff --git a/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/Web Service.js b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/Web Service.js
new file mode 100644
index 0000000..61c9094
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/04 Unit Testing/real examples/Web Service.js
@@ -0,0 +1,26 @@
+function fetchData(address) {
+ url = new java.net.URL(address)
+ connection = url.openConnection()
+ inputStream = connection.getInputStream()
+
+ // read stream into a string using a helper class
+ data = org.eclipse.ease.tools.StringTools.toString(inputStream);
+
+ // sample data in case the service is offline
+ // data = '{ "dstOffset" : 0, "rawOffset" : -28800, "status" : "OK", "timeZoneId" : "America/Los_Angeles", "timeZoneName" : "Pacific Standard Time" }';
+
+ inputStream.close();
+
+ return data;
+}
+
+loadModule("/Unittest");
+
+startTest("Fetch JSON data");
+data = fetchData("https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200");
+jsonData = JSON.parse(data);
+assertEquals("OK", jsonData["status"])
+endTest();
+
+
+
diff --git a/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/library.js b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/library.js
new file mode 100644
index 0000000..9ef4f84
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/library.js
@@ -0,0 +1,3 @@
+function add(a, b) {
+ return a+b;
+} \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/main.js b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/main.js
new file mode 100644
index 0000000..8367303
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive content/main.js
@@ -0,0 +1,2 @@
+include("library.js")
+print(add(40, 2)) \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive.sar b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive.sar
new file mode 100644
index 0000000..49669a1
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/archive.sar
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/05 Script Archives/index.html b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/index.html
new file mode 100644
index 0000000..45dbefc
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/index.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="../webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ </head>
+ <body>
+ <h1>Script Archives</h1>
+
+ Sometimes a script cannot be deployed as a single file. This could be the case when an additional library is needed, data files, image resources or similar data.
+
+ <p>
+ In such cases a script project can be exported to a <i>Script Archive</i> using a pre-built wizard. Similar to jar files such an archive provides a manifest that denotes the start script within the archive.
+ During execution a temporary project is created in the workspace and thus all additional resources can be accessed as workspace files.
+ </p>
+ <p>
+ To stay independent of the temporary project name or the absolute file location such projects should use the 'project://' uri scheme to access resources.
+ </p>
+ <p>
+ Archives itself are executable scripts that can be used like any other script type.
+ </p>
+
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/05 Script Archives/tests archive.sar b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/tests archive.sar
new file mode 100644
index 0000000..b72aeb5
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/05 Script Archives/tests archive.sar
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/04 Jupyter-checkpoint.ipynb b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/04 Jupyter-checkpoint.ipynb
new file mode 100644
index 0000000..4a9beda
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/04 Jupyter-checkpoint.ipynb
@@ -0,0 +1,77 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# EASE tutorial\n",
+ "welcome to EASE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "org.eclipse.ease.modules.platform.ResourcesModule@33a7321e"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "loadModule(\"Resources\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "R/"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "getWorkspace()"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "ease_info": {
+ "scriptengine": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "kernelspec": {
+ "display_name": "EASE (Python (Py4J))",
+ "language": "Python",
+ "name": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "language_info": {
+ "file_extension": ".py",
+ "mimetype": "text/x-python3",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "py3",
+ "version": "0.0.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/05 Jupyter matplotlib-checkpoint.ipynb b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/05 Jupyter matplotlib-checkpoint.ipynb
new file mode 100644
index 0000000..f5e7088
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/.ipynb_checkpoints/05 Jupyter matplotlib-checkpoint.ipynb
@@ -0,0 +1,127 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Jupyter matplotlib integration\n",
+ "In this file we will try to add **matplotlib** integration to EASE Jupyter."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " # Python 2\n",
+ " from BytesIO import BytesIO\n",
+ "except ImportError:\n",
+ " # Python 3\n",
+ " from io import BytesIO\n",
+ "\n",
+ "\n",
+ "class PlotConverter:\n",
+ " '''\n",
+ " IJupyterPublishable converting byte-data for image to its\n",
+ " MIME-type representation.\n",
+ " '''\n",
+ " def __init__(self, data):\n",
+ " '''\n",
+ " Constructor only stores parameters to members.\n",
+ " \n",
+ " :param data: Byte data of the image we want to convert.\n",
+ " :type data: bytearray\n",
+ " '''\n",
+ " self._data = data\n",
+ " \n",
+ " def toMimeTypeDict(self):\n",
+ " java_map = java.util.HashMap()\n",
+ " java_map.put('text/plain', \"<matplotlib Figure>\")\n",
+ " java_map.put('image/png', self._data)\n",
+ " return java_map\n",
+ " \n",
+ " def toString(self):\n",
+ " return str(self)\n",
+ " \n",
+ " class Java:\n",
+ " implements = ['org.eclipse.ease.jupyter.kernel.handlers.IJupyterPublishable']\n",
+ "\n",
+ "def plot(plotter):\n",
+ " '''\n",
+ " Converts data from the given pyplot object to an object that can be\n",
+ " plotted in Jupyter.\n",
+ " \n",
+ " :param plotter: pyplot object to be plotted.\n",
+ " :type plotter: matplotlib.pyplot\n",
+ " :returns: Plottable data for Jupyter.\n",
+ " :rtype: org.eclipse.ease.jupyter.kernel.handlers.IJupyterPublishable\n",
+ " '''\n",
+ " # Plot data to in-memory file\n",
+ " buffer = BytesIO()\n",
+ " plotter.savefig(buffer, format='png')\n",
+ " data = bytearray(buffer.getvalue())\n",
+ " return PlotConverter(data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "<matplotlib Figure>"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from matplotlib import pyplot\n",
+ "\n",
+ "pyplot.plot(range(10), range(10))\n",
+ "plot(pyplot)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "ease_info": {
+ "scriptengine": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "kernelspec": {
+ "display_name": "EASE (Python (Py4J))",
+ "language": "Python",
+ "name": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "language_info": {
+ "file_extension": ".py",
+ "mimetype": "text/x-python3",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "py3",
+ "version": "0.0.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/01 python.py b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/01 python.py
new file mode 100644
index 0000000..d28fc36
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/01 python.py
@@ -0,0 +1,4 @@
+import numpy as np
+
+dataArray = np.arange(15).reshape(3, 5)
+print(dataArray)
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/02 hello.groovy b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/02 hello.groovy
new file mode 100644
index 0000000..38ec89a
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/02 hello.groovy
@@ -0,0 +1 @@
+println "This is a groovy world!" \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/03 hello ruby.rb b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/03 hello ruby.rb
new file mode 100644
index 0000000..10657ed
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/03 hello ruby.rb
@@ -0,0 +1,2 @@
+name = "EclipseCon"
+puts "Hello #{name}!"
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/04 Jupyter.ipynb b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/04 Jupyter.ipynb
new file mode 100644
index 0000000..4a9beda
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/04 Jupyter.ipynb
@@ -0,0 +1,77 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# EASE tutorial\n",
+ "welcome to EASE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "org.eclipse.ease.modules.platform.ResourcesModule@33a7321e"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "loadModule(\"Resources\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "R/"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "getWorkspace()"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "ease_info": {
+ "scriptengine": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "kernelspec": {
+ "display_name": "EASE (Python (Py4J))",
+ "language": "Python",
+ "name": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "language_info": {
+ "file_extension": ".py",
+ "mimetype": "text/x-python3",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "py3",
+ "version": "0.0.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/05 Jupyter matplotlib.ipynb b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/05 Jupyter matplotlib.ipynb
new file mode 100644
index 0000000..f5e7088
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/05 Jupyter matplotlib.ipynb
@@ -0,0 +1,127 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Jupyter matplotlib integration\n",
+ "In this file we will try to add **matplotlib** integration to EASE Jupyter."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " # Python 2\n",
+ " from BytesIO import BytesIO\n",
+ "except ImportError:\n",
+ " # Python 3\n",
+ " from io import BytesIO\n",
+ "\n",
+ "\n",
+ "class PlotConverter:\n",
+ " '''\n",
+ " IJupyterPublishable converting byte-data for image to its\n",
+ " MIME-type representation.\n",
+ " '''\n",
+ " def __init__(self, data):\n",
+ " '''\n",
+ " Constructor only stores parameters to members.\n",
+ " \n",
+ " :param data: Byte data of the image we want to convert.\n",
+ " :type data: bytearray\n",
+ " '''\n",
+ " self._data = data\n",
+ " \n",
+ " def toMimeTypeDict(self):\n",
+ " java_map = java.util.HashMap()\n",
+ " java_map.put('text/plain', \"<matplotlib Figure>\")\n",
+ " java_map.put('image/png', self._data)\n",
+ " return java_map\n",
+ " \n",
+ " def toString(self):\n",
+ " return str(self)\n",
+ " \n",
+ " class Java:\n",
+ " implements = ['org.eclipse.ease.jupyter.kernel.handlers.IJupyterPublishable']\n",
+ "\n",
+ "def plot(plotter):\n",
+ " '''\n",
+ " Converts data from the given pyplot object to an object that can be\n",
+ " plotted in Jupyter.\n",
+ " \n",
+ " :param plotter: pyplot object to be plotted.\n",
+ " :type plotter: matplotlib.pyplot\n",
+ " :returns: Plottable data for Jupyter.\n",
+ " :rtype: org.eclipse.ease.jupyter.kernel.handlers.IJupyterPublishable\n",
+ " '''\n",
+ " # Plot data to in-memory file\n",
+ " buffer = BytesIO()\n",
+ " plotter.savefig(buffer, format='png')\n",
+ " data = bytearray(buffer.getvalue())\n",
+ " return PlotConverter(data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "<matplotlib Figure>"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from matplotlib import pyplot\n",
+ "\n",
+ "pyplot.plot(range(10), range(10))\n",
+ "plot(pyplot)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "ease_info": {
+ "scriptengine": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "kernelspec": {
+ "display_name": "EASE (Python (Py4J))",
+ "language": "Python",
+ "name": "org.eclipse.ease.lang.python.py4j.engine"
+ },
+ "language_info": {
+ "file_extension": ".py",
+ "mimetype": "text/x-python3",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "py3",
+ "version": "0.0.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/Demos/EclipseCon Europe 2017/demo/06 Other Languages/index.html b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/index.html
new file mode 100644
index 0000000..039510b
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/06 Other Languages/index.html
@@ -0,0 +1,117 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="../webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ </head>
+ <body>
+ <h1>Script Languages</h1>
+
+ EASE does support multiple script languages. Supported features differ depending on their language capabilities.
+
+ <table class="center">
+ <tr>
+ <th ></th>
+ <th >Launch</th>
+ <th >Shell</th>
+ <th >Modules</th>
+ <th >Scripts</th>
+ <th >Unit Test</th>
+ <th >Debug</th>
+ </tr>
+ <tr>
+ <td>Rhino</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>Nashorn</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>Python&nbsp;(Py4J)</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>Jython</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>Groovy</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>JRuby</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>Beanshell<sup>1</sup></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>JVM</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>UnitTest</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ <tr>
+ <td>Script Archive</td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ <td><img src="../webroot/not_supported.png" width="20" alt="ok"/></td>
+ </tr>
+ </table>
+
+ <p>
+ <sup>1</sup> The beanshell implementation is a proof of concept availabe <a href="http://codeandme.blogspot.co.at/2015/12/a-new-interpreter-for-ease-1-playing.html">as tutorial</a>.
+ </p>
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/big_picture.html b/Demos/EclipseCon Europe 2017/demo/big_picture.html
new file mode 100644
index 0000000..7c02a93
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/big_picture.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ <link href="https://fonts.googleapis.com/css?family=Dancing+Script" rel="stylesheet">
+ </head>
+ <body>
+
+ <h1>The Big Picture</h1>
+ <img src="webroot/ease_schematic.png" />
+
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/evaluate.html b/Demos/EclipseCon Europe 2017/demo/evaluate.html
new file mode 100644
index 0000000..06d2451
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/evaluate.html
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="webroot/stylesheet.css">
+ </head>
+ <body>
+ <img src="webroot/evaluate.png" />
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/index.html b/Demos/EclipseCon Europe 2017/demo/index.html
new file mode 100644
index 0000000..23e9f21
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/index.html
@@ -0,0 +1,26 @@
+<html>
+ <head>
+ <link rel="stylesheet" href="webroot/stylesheet.css">
+ <link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
+ <link href="https://fonts.googleapis.com/css?family=Dancing+Script" rel="stylesheet">
+ </head>
+ <body>
+
+ <em>And the people said:<br />'Let there be scripts'</em>
+
+ <p style="text-align: center; font-size: 2em">
+ <a href="http://eclipse.org/ease">eclipse.org/ease</a>
+ </p>
+
+ <ul>
+ <li><a href="big_picture.html">The Big Picture</a></li>
+ <li><a href="01 Simple Scripts/index.html">First steps</a></li>
+ <li><a href="02 Modules/index.html">EASE Modules</a></li>
+ <li><a href="03 Scripts/index.html">Workbench Scripts</a></li>
+ <li><a href="04 Unit Testing/index.html">Unit Testing</a></li>
+ <li><a href="05 Script Archives/index.html">Script Archives</a></li>
+ <li><a href="06 Other Languages/index.html">Supported Script Engines</a></li>
+ <li><a href="evaluate.html">Evaluation</a></li>
+ </ul>
+ </body>
+</html>
diff --git a/Demos/EclipseCon Europe 2017/demo/webroot/background.png b/Demos/EclipseCon Europe 2017/demo/webroot/background.png
new file mode 100644
index 0000000..4748e89
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/webroot/background.png
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/webroot/ease_schematic.png b/Demos/EclipseCon Europe 2017/demo/webroot/ease_schematic.png
new file mode 100644
index 0000000..762f753
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/webroot/ease_schematic.png
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/webroot/evaluate.png b/Demos/EclipseCon Europe 2017/demo/webroot/evaluate.png
new file mode 100644
index 0000000..1e3d570
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/webroot/evaluate.png
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/webroot/not_supported.png b/Demos/EclipseCon Europe 2017/demo/webroot/not_supported.png
new file mode 100644
index 0000000..9ed9246
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/webroot/not_supported.png
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/demo/webroot/stylesheet.css b/Demos/EclipseCon Europe 2017/demo/webroot/stylesheet.css
new file mode 100644
index 0000000..059beeb
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/webroot/stylesheet.css
@@ -0,0 +1,51 @@
+body { background-image: url("../webroot/background.png");
+ background-repeat: no-repeat;
+ padding-left: 120px;
+ }
+
+pre { display:block;
+ border: 1px solid #444444;
+ border-radius: 5px;
+ margin: 10 10 10 30;
+ padding: 5px;
+ background: #F0F0E0;
+ }
+
+table {
+ margin: 20px;
+ border: 1px solid grey;
+ border-collapse: collapse;
+ }
+
+th {
+ border: 1px solid grey;
+ padding: 10px;
+ }
+
+td {
+ border: 1px solid grey;
+ text-align: center;
+ padding: 5px;
+ }
+
+em {
+ font-family: 'Dancing Script', cursive;
+ font-size: 4em;
+ text-align: center;
+ display: block;
+ line-height: 150px;
+ margin-top: 100px;
+ margin-bottom: 50px;
+ }
+
+h1 {
+ font-family: 'PT Sans', sans-serif;
+ text-decoration: underline;
+ margin-bottom: 40px;
+ margin-left: -30px;
+ }
+
+h2 {
+ margin-left: -30px;
+ }
+ \ No newline at end of file
diff --git a/Demos/EclipseCon Europe 2017/demo/webroot/supported.png b/Demos/EclipseCon Europe 2017/demo/webroot/supported.png
new file mode 100644
index 0000000..4e491ac
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/demo/webroot/supported.png
Binary files differ
diff --git a/Demos/EclipseCon Europe 2017/plugin.xml b/Demos/EclipseCon Europe 2017/plugin.xml
new file mode 100644
index 0000000..f608597
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/plugin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ease.modules">
+ <module
+ class="org.eclipse.eclipsecon2017.SimpleModule"
+ id="org.eclipsecon.testmodule"
+ name="Test module"
+ visible="true">
+ </module>
+ </extension>
+
+</plugin>
diff --git a/Demos/EclipseCon Europe 2017/src/org/eclipse/eclipsecon2017/SimpleModule.java b/Demos/EclipseCon Europe 2017/src/org/eclipse/eclipsecon2017/SimpleModule.java
new file mode 100644
index 0000000..13d4d58
--- /dev/null
+++ b/Demos/EclipseCon Europe 2017/src/org/eclipse/eclipsecon2017/SimpleModule.java
@@ -0,0 +1,8 @@
+package org.eclipse.eclipsecon2017;
+
+public class SimpleModule {
+
+ public String greet() {
+ return "Welcome script developers!";
+ }
+}

Back to the top