diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java index b33e927542..6a6e6daf17 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java @@ -17,12 +17,11 @@ package org.apache.zeppelin.rest; +import com.github.eirslett.maven.plugins.frontend.lib.TaskRunnerException; import com.google.gson.Gson; import org.apache.commons.io.FileUtils; import org.apache.zeppelin.helium.Helium; -import org.apache.zeppelin.helium.HeliumApplicationFactory; import org.apache.zeppelin.helium.HeliumPackage; -import org.apache.zeppelin.helium.HeliumVisualizationFactory; import org.apache.zeppelin.notebook.Note; import org.apache.zeppelin.notebook.Notebook; import org.apache.zeppelin.notebook.Paragraph; @@ -34,6 +33,7 @@ import javax.ws.rs.*; import javax.ws.rs.core.Response; import java.io.File; import java.io.IOException; +import java.util.List; /** * Helium Rest Api @@ -44,21 +44,14 @@ public class HeliumRestApi { Logger logger = LoggerFactory.getLogger(HeliumRestApi.class); private Helium helium; - private HeliumApplicationFactory applicationFactory; - private HeliumVisualizationFactory visualizationFactory; private Notebook notebook; private Gson gson = new Gson(); public HeliumRestApi() { } - public HeliumRestApi(Helium helium, - HeliumApplicationFactory heliumApplicationFactory, - HeliumVisualizationFactory heliumVisualizationFactory, - Notebook notebook) { + public HeliumRestApi(Helium helium, Notebook notebook) { this.helium = helium; - this.applicationFactory = heliumApplicationFactory; - this.visualizationFactory = heliumVisualizationFactory; this.notebook = notebook; } @@ -108,7 +101,7 @@ public class HeliumRestApi { } HeliumPackage pkg = gson.fromJson(heliumPackage, HeliumPackage.class); - String appId = applicationFactory.loadAndRun(pkg, paragraph); + String appId = helium.getApplicationFactory().loadAndRun(pkg, paragraph); return new JsonResponse(Response.Status.OK, "", appId).build(); } @@ -116,12 +109,54 @@ public class HeliumRestApi { @Path("visualizations/load") @Produces("text/javascript") public Response visualizationLoad() { + List packages = helium.getVisualizationPackagesToBundle(); + try { - String visBundle = FileUtils.readFileToString(new File("/tmp/npm/vis.bundle.js")); - return Response.ok(visBundle).build(); + File bundle = helium.getVisualizationFactory().getCurrentBundle(); + if (bundle == null) { + return Response.ok().build(); + } else { + String visBundle = FileUtils.readFileToString(bundle); + return Response.ok(visBundle).build(); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + + // returning error will prevent zeppelin front-end render any notebook. + // visualization load fail doesn't need to block notebook rendering work. + // so it's better return ok instead of any error. + return Response.ok().build(); + } + } + + @POST + @Path("enable/{packageName}") + public Response enablePackage(@PathParam("packageName") String packageName, + String artifact) { + try { + helium.enable(packageName, artifact); + return new JsonResponse(Response.Status.OK).build(); } catch (IOException e) { logger.error(e.getMessage(), e); - return Response.serverError().build(); + return new JsonResponse(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (TaskRunnerException e) { + logger.error(e.getMessage(), e); + return new JsonResponse(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + + @POST + @Path("disable/{packageName}") + public Response enablePackage(@PathParam("packageName") String packageName) { + try { + helium.disable(packageName); + return new JsonResponse(Response.Status.OK).build(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + return new JsonResponse(Response.Status.INTERNAL_SERVER_ERROR).build(); + } catch (TaskRunnerException e) { + logger.error(e.getMessage(), e); + return new JsonResponse(Response.Status.INTERNAL_SERVER_ERROR).build(); } } } diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java index d725498173..940d07d7e7 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java @@ -83,8 +83,6 @@ public class ZeppelinServer extends Application { public static Server jettyWebServer; public static NotebookServer notebookWsServer; public static Helium helium; - public static HeliumApplicationFactory heliumApplicationFactory; - public static HeliumVisualizationFactory heliumVisualizationFactory; private SchedulerFactory schedulerFactory; private InterpreterFactory replFactory; @@ -100,11 +98,16 @@ public class ZeppelinServer extends Application { this.depResolver = new DependencyResolver( conf.getString(ConfVars.ZEPPELIN_INTERPRETER_LOCALREPO)); - this.helium = new Helium(conf.getHeliumConfPath(), conf.getHeliumDefaultLocalRegistryPath()); - this.heliumApplicationFactory = new HeliumApplicationFactory(); - this.heliumVisualizationFactory = new HeliumVisualizationFactory( + HeliumApplicationFactory heliumApplicationFactory = new HeliumApplicationFactory(); + HeliumVisualizationFactory heliumVisualizationFactory = new HeliumVisualizationFactory( new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO))); + this.helium = new Helium( + conf.getHeliumConfPath(), + conf.getHeliumDefaultLocalRegistryPath(), + heliumVisualizationFactory, + heliumApplicationFactory); + this.schedulerFactory = new SchedulerFactory(); this.replFactory = new InterpreterFactory(conf, notebookWsServer, @@ -338,8 +341,7 @@ public class ZeppelinServer extends Application { NotebookRepoRestApi notebookRepoApi = new NotebookRepoRestApi(notebookRepo, notebookWsServer); singletons.add(notebookRepoApi); - HeliumRestApi heliumApi = new HeliumRestApi(helium, heliumApplicationFactory, - heliumVisualizationFactory, notebook); + HeliumRestApi heliumApi = new HeliumRestApi(helium, notebook); singletons.add(heliumApi); InterpreterRestApi interpreterApi = new InterpreterRestApi(replFactory); diff --git a/zeppelin-web/src/app/helium/helium.controller.js b/zeppelin-web/src/app/helium/helium.controller.js index 81ae53ed20..91908e1cc5 100644 --- a/zeppelin-web/src/app/helium/helium.controller.js +++ b/zeppelin-web/src/app/helium/helium.controller.js @@ -19,13 +19,33 @@ HeliumCtrl.$inject = ['$scope', '$rootScope', '$http', 'baseUrlSrv', 'ngToast']; function HeliumCtrl($scope, $rootScope, $http, baseUrlSrv, ngToast) { - $scope.packageInfos = []; + $scope.packageInfos = {}; + $scope.defaultVersions = {}; + + var buildDefaultVersionListToDisplay = function(packageInfos) { + var defaultVersions = {}; + // show enabled version if any version of package is enabled + for (var name in packageInfos) { + var pkgs = packageInfos[name]; + for (var pkg in pkgs) { + if (pkg.enabled) { + defaultVersions[name] = pkg; + } + } + + // show first available version if package is not enabled + if (!defaultVersions[name]) { + defaultVersions[name] = pkgs[0]; + } + } + $scope.defaultVersions = defaultVersions; + }; var getAllPackageInfo = function() { $http.get(baseUrlSrv.getRestApiBase() + '/helium/all'). success(function(data, status) { - console.log('Packages %o', data); $scope.packageInfos = data.body; + buildDefaultVersionListToDisplay($scope.packageInfos); }). error(function(data, status) { console.log('Can not load package info %o %o', status, data); @@ -37,5 +57,25 @@ }; init(); + + $scope.enable = function(name, artifact) { + $http.post(baseUrlSrv.getRestApiBase() + '/helium/enable/' + name, artifact). + success(function(data, status) { + getAllPackageInfo(); + }). + error(function(data, status) { + console.log('Failed to enable package %o %o', name, artifact); + }); + }; + + $scope.disable = function(name) { + $http.post(baseUrlSrv.getRestApiBase() + '/helium/disable/' + name). + success(function(data, status) { + getAllPackageInfo(); + }). + error(function(data, status) { + console.log('Failed to disable package %o', name); + }); + }; } })(); diff --git a/zeppelin-web/src/app/helium/helium.html b/zeppelin-web/src/app/helium/helium.html index dc990bc503..3cd8db9c46 100644 --- a/zeppelin-web/src/app/helium/helium.html +++ b/zeppelin-web/src/app/helium/helium.html @@ -25,21 +25,23 @@ limitations under the License.
- {{packageInfo.pkg.name}} -
+ {{pkgName}} +
Enable
-
Disable
- {{packageInfo.pkg.description}} + {{pkgInfo.pkg.description}}
diff --git a/zeppelin-web/src/index.js b/zeppelin-web/src/index.js index 3e318f0bbf..191d2e3669 100644 --- a/zeppelin-web/src/index.js +++ b/zeppelin-web/src/index.js @@ -45,6 +45,7 @@ import './app/notebook/paragraph/paragraph.controller.js'; import './app/notebook/paragraph/result/result.controller.js'; import './app/search/result-list.controller.js'; import './app/notebookRepos/notebookRepos.controller.js'; +import './app/helium/helium.controller.js'; import './components/arrayOrderingSrv/arrayOrdering.service.js'; import './components/clipboard/clipboard.controller.js'; import './components/navbar/navbar.controller.js'; diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java index b6b68b01d8..8a42a76426 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/Helium.java @@ -16,6 +16,7 @@ */ package org.apache.zeppelin.helium; +import com.github.eirslett.maven.plugins.frontend.lib.TaskRunnerException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.commons.io.FileUtils; @@ -32,10 +33,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Manages helium packages @@ -48,10 +46,19 @@ public class Helium { private final String heliumConfPath; private final String defaultLocalRegistryPath; private final Gson gson; + private final HeliumVisualizationFactory visualizationFactory; + private final HeliumApplicationFactory applicationFactory; - public Helium(String heliumConfPath, String defaultLocalRegistryPath) throws IOException { + public Helium( + String heliumConfPath, + String defaultLocalRegistryPath, + HeliumVisualizationFactory visualizationFactory, + HeliumApplicationFactory applicationFactory) + throws IOException, TaskRunnerException { this.heliumConfPath = heliumConfPath; this.defaultLocalRegistryPath = defaultLocalRegistryPath; + this.visualizationFactory = visualizationFactory; + this.applicationFactory = applicationFactory; GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); @@ -60,6 +67,7 @@ public class Helium { gson = builder.create(); heliumConf = loadConf(heliumConfPath); + visualizationFactory.bundle(getVisualizationPackagesToBundle()); } /** @@ -83,6 +91,14 @@ public class Helium { } } + public HeliumApplicationFactory getApplicationFactory() { + return applicationFactory; + } + + public HeliumVisualizationFactory getVisualizationFactory() { + return visualizationFactory; + } + private synchronized HeliumConf loadConf(String path) throws IOException { File heliumConfFile = new File(path); if (!heliumConfFile.isFile()) { @@ -116,30 +132,92 @@ public class Helium { FileUtils.writeStringToFile(heliumConfFile, jsonString); } - public List getAllPackageInfo() { - List list = new LinkedList<>(); + public Map> getAllPackageInfo() { + Map enabledPackageInfo = heliumConf.getEnabledPackages(); + + Map> map = new HashMap<>(); synchronized (registry) { for (HeliumRegistry r : registry) { try { for (HeliumPackage pkg : r.getAll()) { - list.add(new HeliumPackageSearchResult(r.name(), pkg)); + String name = pkg.getName(); + String artifact = enabledPackageInfo.get(name); + boolean enabled = (artifact != null && artifact.equals(pkg.getArtifact())); + + if (!map.containsKey(name)) { + map.put(name, new LinkedList()); + } + map.get(name).add(new HeliumPackageSearchResult(r.name(), pkg, enabled)); } } catch (IOException e) { logger.error(e.getMessage(), e); } } } - return list; + + // sort version (artifact) + for (String name : map.keySet()) { + List packages = map.get(name); + Collections.sort(packages, new Comparator() { + @Override + public int compare(HeliumPackageSearchResult o1, HeliumPackageSearchResult o2) { + return o1.getPkg().getArtifact().compareTo(o2.getPkg().getArtifact()); + } + }); + } + return map; } - public void enable(HeliumPackage pkg) { + public HeliumPackageSearchResult getPackageInfo(String name, String artifact) { + Map> infos = getAllPackageInfo(); + List packages = infos.get(name); + if (artifact == null) { + return packages.get(0); + } else { + for (HeliumPackageSearchResult pkg : packages) { + if (pkg.getPkg().getArtifact().equals(artifact)) { + return pkg; + } + } + } + return null; } - public void disable(HeliumPackage pkg) { + public void enable(String name, String artifact) throws IOException, TaskRunnerException { + HeliumPackageSearchResult pkgInfo = getPackageInfo(name, artifact); + // no package found. + if (pkgInfo == null) { + return; + } + + // enable package + heliumConf.enablePackage(name, artifact); + + // if package is visualization, rebuild bundle + if (pkgInfo.getPkg().getType() == HeliumPackage.Type.VISUALIZATION) { + visualizationFactory.bundle(getVisualizationPackagesToBundle()); + } + + save(); } + public void disable(String name) throws IOException, TaskRunnerException { + String artifact = heliumConf.getEnabledPackages().get(name); + + if (artifact == null) { + return; + } + + heliumConf.disablePackage(name); + HeliumPackageSearchResult pkg = getPackageInfo(name, artifact); + if (pkg == null || pkg.getPkg().getType() == HeliumPackage.Type.VISUALIZATION) { + visualizationFactory.bundle(getVisualizationPackagesToBundle()); + } + + save(); + } public HeliumPackageSuggestion suggestApp(Paragraph paragraph) { HeliumPackageSuggestion suggestion = new HeliumPackageSuggestion(); @@ -162,20 +240,61 @@ public class Helium { allResources = ResourcePoolUtils.getAllResources(); } - for (HeliumPackageSearchResult pkg : getAllPackageInfo()) { - ResourceSet resources = ApplicationLoader.findRequiredResourceSet( - pkg.getPkg().getResources(), - paragraph.getNote().getId(), - paragraph.getId(), - allResources); - if (resources == null) { - continue; - } else { - suggestion.addAvailablePackage(pkg); + for (List pkgs : getAllPackageInfo().values()) { + for (HeliumPackageSearchResult pkg : pkgs) { + if (pkg.getPkg().getType() == HeliumPackage.Type.APPLICATION && pkg.isEnabled()) { + ResourceSet resources = ApplicationLoader.findRequiredResourceSet( + pkg.getPkg().getResources(), + paragraph.getNote().getId(), + paragraph.getId(), + allResources); + if (resources == null) { + continue; + } else { + suggestion.addAvailablePackage(pkg); + } + break; + } } } suggestion.sort(); return suggestion; } + + /** + * Get enabled visualization packages + * + * @return ordered list of enabled visualization package + */ + public List getVisualizationPackagesToBundle() { + Map> allPackages = getAllPackageInfo(); + List visOrder = heliumConf.getVisualizationDisplayOrder(); + + List orderedVisualizationPackages = new LinkedList<>(); + + // add enabled packages in visOrder + for (String name : visOrder) { + List versions = allPackages.get(name); + for (HeliumPackageSearchResult pkgInfo : versions) { + if (pkgInfo.getPkg().getType() == HeliumPackage.Type.VISUALIZATION && pkgInfo.isEnabled()) { + orderedVisualizationPackages.add(pkgInfo.getPkg()); + allPackages.remove(name); + break; + } + } + } + + // add enabled packages not in visOrder + for (List pkgs : allPackages.values()) { + for (HeliumPackageSearchResult pkg : pkgs) { + if (pkg.getPkg().getType() == HeliumPackage.Type.VISUALIZATION && pkg.isEnabled()) { + orderedVisualizationPackages.add(pkg.getPkg()); + break; + } + } + } + + return orderedVisualizationPackages; + } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumConf.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumConf.java index 35e6a4f4ec..b2304e78ec 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumConf.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumConf.java @@ -16,8 +16,7 @@ */ package org.apache.zeppelin.helium; -import java.util.LinkedList; -import java.util.List; +import java.util.*; /** * Helium config. This object will be persisted to conf/heliumc.conf @@ -25,6 +24,13 @@ import java.util.List; public class HeliumConf { List registry = new LinkedList<>(); + // enabled packages {name, version} + Map enabled = Collections.synchronizedMap(new HashMap()); + + // enabled visualization package display order + List visualizationDisplayOrder = new LinkedList<>(); + + public List getRegistry() { return registry; } @@ -33,5 +39,35 @@ public class HeliumConf { this.registry = registry; } - // enabled visualization + public Map getEnabledPackages() { + return new HashMap<>(enabled); + } + + public void enablePackage(HeliumPackage pkg) { + enablePackage(pkg.getName(), pkg.getArtifact()); + } + + public void enablePackage(String name, String artifact) { + enabled.put(name, artifact); + } + + public void disablePackage(HeliumPackage pkg) { + disablePackage(pkg.getName()); + } + + public void disablePackage(String name) { + enabled.remove(name); + } + + public List getVisualizationDisplayOrder() { + return visualizationDisplayOrder; + } + + public void setVisualizationDisplayOrder(List orderedPackageList) { + List order = new LinkedList<>(); + for (HeliumPackage pkg : orderedPackageList) { + order.add(pkg.getName()); + } + visualizationDisplayOrder = order; + } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumPackageSearchResult.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumPackageSearchResult.java index 57a9d4512f..36b61154f6 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumPackageSearchResult.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumPackageSearchResult.java @@ -22,15 +22,17 @@ package org.apache.zeppelin.helium; public class HeliumPackageSearchResult { private final String registry; private final HeliumPackage pkg; + private final boolean enabled; /** * Create search result item * @param registry registry name * @param pkg package information */ - public HeliumPackageSearchResult(String registry, HeliumPackage pkg) { + public HeliumPackageSearchResult(String registry, HeliumPackage pkg, boolean enabled) { this.registry = registry; this.pkg = pkg; + this.enabled = enabled; } public String getRegistry() { @@ -40,4 +42,8 @@ public class HeliumPackageSearchResult { public HeliumPackage getPkg() { return pkg; } + + public boolean isEnabled() { + return enabled; + } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumVisualizationFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumVisualizationFactory.java index ebe438aa0b..815d015907 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumVisualizationFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumVisualizationFactory.java @@ -46,6 +46,9 @@ public class HeliumVisualizationFactory { private File tabledataModulePath; private File visualizationModulePath; + String bundleCacheKey = ""; + File currentBundle; + public HeliumVisualizationFactory( File moduleDownloadPath, File tabledataModulePath, @@ -63,6 +66,7 @@ public class HeliumVisualizationFactory { frontEndPluginFactory = new FrontendPluginFactory( workingDirectory, installDirectory); + currentBundle = new File(workingDirectory, "vis.bundle.cache.js"); installNodeAndNpm(); } @@ -81,11 +85,12 @@ public class HeliumVisualizationFactory { return new ProxyConfig(proxy); } - public void bundle(List pkgs) throws IOException, TaskRunnerException { + public File bundle(List pkgs) throws IOException, TaskRunnerException { // package.json URL pkgUrl = Resources.getResource("helium/package.json"); String pkgJson = Resources.toString(pkgUrl, Charsets.UTF_8); - StringBuffer dependencies = new StringBuffer(); + StringBuilder dependencies = new StringBuilder(); + for (HeliumPackage pkg : pkgs) { String[] moduleNameVersion = getNpmModuleNameAndVersion(pkg); if (moduleNameVersion == null) { @@ -104,6 +109,11 @@ public class HeliumVisualizationFactory { } pkgJson = pkgJson.replaceFirst("DEPENDENCIES", dependencies.toString()); + // check if we can use previous bundle or not + if (dependencies.toString().equals(bundleCacheKey) && currentBundle.isFile()) { + return currentBundle; + } + // webpack.config.js URL webpackConfigUrl = Resources.getResource("helium/webpack.config.js"); String webpackConfig = Resources.toString(webpackConfigUrl, Charsets.UTF_8); @@ -111,6 +121,7 @@ public class HeliumVisualizationFactory { // generate load.js StringBuilder loadJsImport = new StringBuilder(); StringBuilder loadJsRegister = new StringBuilder(); + for (HeliumPackage pkg : pkgs) { String [] moduleNameVersion = getNpmModuleNameAndVersion(pkg); if (moduleNameVersion == null) { @@ -146,6 +157,28 @@ public class HeliumVisualizationFactory { npmCommand("install"); npmCommand("run bundle"); + + File visBundleJs = new File(workingDirectory, "vis.bundle.js"); + if (!visBundleJs.isFile()) { + throw new IOException("Failed to create visualization bundle"); + } + + synchronized (this) { + currentBundle.delete(); + FileUtils.moveFile(visBundleJs, currentBundle); + bundleCacheKey = dependencies.toString(); + } + return currentBundle; + } + + public File getCurrentBundle() { + synchronized (this) { + if (currentBundle.isFile()) { + return currentBundle; + } else { + return null; + } + } } private boolean isLocalPackage(HeliumPackage pkg) { diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java index 5cf6afefed..3135474b1f 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumTest.java @@ -16,6 +16,7 @@ */ package org.apache.zeppelin.helium; +import com.github.eirslett.maven.plugins.frontend.lib.TaskRunnerException; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; @@ -48,10 +49,11 @@ public class HeliumTest { } @Test - public void testSaveLoadConf() throws IOException, URISyntaxException { + public void testSaveLoadConf() throws IOException, URISyntaxException, TaskRunnerException { // given File heliumConf = new File(tmpDir, "helium.conf"); - Helium helium = new Helium(heliumConf.getAbsolutePath(), localRegistryPath.getAbsolutePath()); + Helium helium = new Helium(heliumConf.getAbsolutePath(), localRegistryPath.getAbsolutePath(), + null, null); assertFalse(heliumConf.exists()); HeliumTestRegistry registry1 = new HeliumTestRegistry("r1", "r1"); helium.addRegistry(registry1); @@ -65,14 +67,16 @@ public class HeliumTest { assertTrue(heliumConf.exists()); // then - Helium heliumRestored = new Helium(heliumConf.getAbsolutePath(), localRegistryPath.getAbsolutePath()); + Helium heliumRestored = new Helium( + heliumConf.getAbsolutePath(), localRegistryPath.getAbsolutePath(), null, null); assertEquals(2, heliumRestored.getAllRegistry().size()); } @Test - public void testRestoreRegistryInstances() throws IOException, URISyntaxException { + public void testRestoreRegistryInstances() throws IOException, URISyntaxException, TaskRunnerException { File heliumConf = new File(tmpDir, "helium.conf"); - Helium helium = new Helium(heliumConf.getAbsolutePath(), localRegistryPath.getAbsolutePath()); + Helium helium = new Helium( + heliumConf.getAbsolutePath(), localRegistryPath.getAbsolutePath(), null, null); HeliumTestRegistry registry1 = new HeliumTestRegistry("r1", "r1"); HeliumTestRegistry registry2 = new HeliumTestRegistry("r2", "r2"); helium.addRegistry(registry1); diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumVisualizationFactoryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumVisualizationFactoryTest.java index 4b12a35cf2..6b8181c24a 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumVisualizationFactoryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/helium/HeliumVisualizationFactoryTest.java @@ -30,6 +30,7 @@ import java.net.URL; import java.util.LinkedList; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class HeliumVisualizationFactoryTest { @@ -38,8 +39,7 @@ public class HeliumVisualizationFactoryTest { @Before public void setUp() throws InstallationException, TaskRunnerException { - //tmpDir = new File(System.getProperty("java.io.tmpdir") + "/ZeppelinLTest_" + System.currentTimeMillis()); - tmpDir = new File("/tmp/npm"); + tmpDir = new File(System.getProperty("java.io.tmpdir") + "/ZeppelinLTest_" + System.currentTimeMillis()); tmpDir.mkdirs(); // get module dir @@ -91,8 +91,13 @@ public class HeliumVisualizationFactoryTest { ); List pkgs = new LinkedList<>(); pkgs.add(pkg); - hvf.bundle(pkgs); - assertTrue(new File(tmpDir, "vis.bundle.js").isFile()); + File bundle = hvf.bundle(pkgs); + assertTrue(bundle.isFile()); + long lastModified = bundle.lastModified(); + + // bundle again and check if it served from cache + bundle = hvf.bundle(pkgs); + assertEquals(lastModified, bundle.lastModified()); } @@ -101,7 +106,6 @@ public class HeliumVisualizationFactoryTest { URL res = Resources.getResource("helium/webpack.config.js"); String resDir = new File(res.getFile()).getParent(); String localPkg = resDir + "/../../../src/test/resources/helium/vis1"; - System.err.println("local package " + localPkg); HeliumPackage pkg = new HeliumPackage( HeliumPackage.Type.VISUALIZATION, @@ -114,7 +118,7 @@ public class HeliumVisualizationFactoryTest { ); List pkgs = new LinkedList<>(); pkgs.add(pkg); - hvf.bundle(pkgs); - assertTrue(new File(tmpDir, "vis.bundle.js").isFile()); + File bundle = hvf.bundle(pkgs); + assertTrue(bundle.isFile()); } }