/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.zeppelin.helium; import org.apache.zeppelin.annotation.Experimental; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.resource.ResourceSet; import java.io.IOException; /** * Base class for pluggable application (e.g. visualization) * Application can access resources from ResourcePool and interact with front-end using * AngularDisplay system */ @Experimental public abstract class Application { private final ApplicationContext context; public Application(ApplicationContext context) { this.context = context; } public ApplicationContext context() { return context; } /** * This method can be invoked multiple times before unload(), * Either just after application selected or when paragraph re-run after application load */ @Experimental public abstract void run(ResourceSet args) throws ApplicationException, IOException; /** * this method is invoked just before application is removed */ @Experimental public abstract void unload() throws ApplicationException; /** * Print string on the notebook * @param string * @throws IOException */ @Experimental public void print(String string) throws IOException { context.out.write(string); } /** * Print string on the notebook with newline * @param string * @throws IOException */ @Experimental public void println(String string) throws IOException { print(string + "\n"); } /** * Print resource on the notebook * @param resourceName * @throws IOException */ @Experimental public void printResource(String resourceName) throws IOException { context.out.writeResource(resourceName); } /** * Print resource as a javascript * * Using this method does not require print javascript inside of <script></script> tag. * Javascript printed using this method will be run in the un-named function. * i.e. each method call will creates different variable scope for the javascript code. * * This method inject '$z' into the variable scope for convenience. * * $z.scope : angularjs scope object for this application * $z.id : unique id for this application instance * * @param resourceName * @throws IOException */ @Experimental public void printResourceAsJavascript(String resourceName) throws IOException { beginJavascript(); context.out.writeResource(resourceName); endJavascript(); } /** * Print string as a javascript * * Using this method does not require print javascript inside of <script></script> tag. * Javascript printed using this method will be run in the un-named function. * i.e. each method call will creates different variable scope for the javascript code. * * This method inject '$z' into the variable scope for convenience. * * $z.scope : angularjs scope object for this application * $z.id : unique id for this application instance * * @param js * @throws IOException */ @Experimental public void printStringAsJavascript(String js) throws IOException { beginJavascript(); context.out.write(js); endJavascript(); } private void beginJavascript() throws IOException { StringBuffer js = new StringBuffer(); js.append("\n<script id=\"app_js_" + js.hashCode() + "\">\n"); js.append("(function() {\n"); js.append("let $z = {\n"); js.append("id : \"" + context.getApplicationInstanceId() + "\",\n"); js.append("scope : angular.element(\"#app_js_" + js.hashCode() + "\").scope()\n"); js.append("};\n"); js.append("$z.result = ($z.scope._devmodeResult) ? " + "$z.scope._devmodeResult : $z.scope.$parent.paragraph.result;\n"); context.out.write(js.toString()); } private void endJavascript() throws IOException { StringBuffer js = new StringBuffer(); js.append("\n})();\n"); js.append("</script>\n"); context.out.write(js.toString()); } }