Repository: incubator-zeppelin Updated Branches: refs/heads/master 0c42f4332 -> bc7155114
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/AbstractDependencyResolver.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/AbstractDependencyResolver.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/AbstractDependencyResolver.java new file mode 100644 index 0000000..ba8ee16 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/AbstractDependencyResolver.java @@ -0,0 +1,70 @@ +/* + * 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.dep; + +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.sonatype.aether.RepositorySystem; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.repository.RemoteRepository; +import org.sonatype.aether.resolution.ArtifactResult; + +/** + * Abstract dependency resolver. + * Add new dependencies from mvn repo (at runtime) Zeppelin. + */ +public abstract class AbstractDependencyResolver { + protected RepositorySystem system = Booter.newRepositorySystem(); + protected List<RemoteRepository> repos = new LinkedList<RemoteRepository>(); + protected RepositorySystemSession session; + + public AbstractDependencyResolver(String localRepoPath) { + session = Booter.newRepositorySystemSession(system, localRepoPath); + repos.add(Booter.newCentralRepository()); // add maven central + repos.add(Booter.newLocalRepository()); + } + + public void addRepo(String id, String url, boolean snapshot) { + synchronized (repos) { + delRepo(id); + RemoteRepository rr = new RemoteRepository(id, "default", url); + rr.setPolicy(snapshot, null); + repos.add(rr); + } + } + + public RemoteRepository delRepo(String id) { + synchronized (repos) { + Iterator<RemoteRepository> it = repos.iterator(); + if (it.hasNext()) { + RemoteRepository repo = it.next(); + if (repo.getId().equals(id)) { + it.remove(); + return repo; + } + } + } + return null; + } + + public abstract List<ArtifactResult> getArtifactsWithDep(String dependency, + Collection<String> excludes) throws Exception; +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java new file mode 100644 index 0000000..7a487fa --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java @@ -0,0 +1,72 @@ +/* + * 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.dep; + +import java.io.File; + +import org.apache.maven.repository.internal.MavenRepositorySystemSession; +import org.sonatype.aether.RepositorySystem; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.repository.LocalRepository; +import org.sonatype.aether.repository.RemoteRepository; + +/** + * Manage mvn repository. + */ +public class Booter { + public static RepositorySystem newRepositorySystem() { + return RepositorySystemFactory.newRepositorySystem(); + } + + public static RepositorySystemSession newRepositorySystemSession( + RepositorySystem system, String localRepoPath) { + MavenRepositorySystemSession session = new MavenRepositorySystemSession(); + + // find homedir + String home = System.getenv("ZEPPELIN_HOME"); + if (home == null) { + home = System.getProperty("zeppelin.home"); + } + if (home == null) { + home = ".."; + } + + String path = home + "/" + localRepoPath; + + LocalRepository localRepo = + new LocalRepository(new File(path).getAbsolutePath()); + session.setLocalRepositoryManager(system.newLocalRepositoryManager(localRepo)); + + // session.setTransferListener(new ConsoleTransferListener()); + // session.setRepositoryListener(new ConsoleRepositoryListener()); + + // uncomment to generate dirty trees + // session.setDependencyGraphTransformer( null ); + + return session; + } + + public static RemoteRepository newCentralRepository() { + return new RemoteRepository("central", "default", "http://repo1.maven.org/maven2/"); + } + + public static RemoteRepository newLocalRepository() { + return new RemoteRepository("local", + "default", "file://" + System.getProperty("user.home") + "/.m2/repository"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Dependency.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Dependency.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Dependency.java new file mode 100644 index 0000000..8f77de4 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Dependency.java @@ -0,0 +1,90 @@ +/* + * 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.dep; + +import java.util.LinkedList; +import java.util.List; + +/** + * + */ +public class Dependency { + private String groupArtifactVersion; + private boolean local = false; + private List<String> exclusions; + + + public Dependency(String groupArtifactVersion) { + this.groupArtifactVersion = groupArtifactVersion; + exclusions = new LinkedList<String>(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Dependency)) { + return false; + } else { + return ((Dependency) o).groupArtifactVersion.equals(groupArtifactVersion); + } + } + + /** + * Don't add artifact into SparkContext (sc.addJar()) + * @return + */ + public Dependency local() { + local = true; + return this; + } + + public Dependency excludeAll() { + exclude("*"); + return this; + } + + /** + * + * @param exclusions comma or newline separated list of "groupId:ArtifactId" + * @return + */ + public Dependency exclude(String exclusions) { + for (String item : exclusions.split(",|\n")) { + this.exclusions.add(item); + } + + return this; + } + + + public String getGroupArtifactVersion() { + return groupArtifactVersion; + } + + public boolean isDist() { + return !local; + } + + public List<String> getExclusions() { + return exclusions; + } + + public boolean isLocalFsArtifact() { + int numSplits = groupArtifactVersion.split(":").length; + return !(numSplits >= 3 && numSplits <= 6); + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyContext.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyContext.java new file mode 100644 index 0000000..ab4da28 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyContext.java @@ -0,0 +1,148 @@ +/* + * 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.dep; + +import java.io.File; +import java.net.MalformedURLException; +import java.util.LinkedList; +import java.util.List; + +import org.sonatype.aether.RepositorySystem; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.collection.CollectRequest; +import org.sonatype.aether.graph.DependencyFilter; +import org.sonatype.aether.repository.RemoteRepository; +import org.sonatype.aether.resolution.ArtifactResolutionException; +import org.sonatype.aether.resolution.ArtifactResult; +import org.sonatype.aether.resolution.DependencyRequest; +import org.sonatype.aether.resolution.DependencyResolutionException; +import org.sonatype.aether.util.artifact.DefaultArtifact; +import org.sonatype.aether.util.artifact.JavaScopes; +import org.sonatype.aether.util.filter.DependencyFilterUtils; +import org.sonatype.aether.util.filter.PatternExclusionsDependencyFilter; + + +/** + * + */ +public class DependencyContext { + List<Dependency> dependencies = new LinkedList<Dependency>(); + List<Repository> repositories = new LinkedList<Repository>(); + + List<File> files = new LinkedList<File>(); + List<File> filesDist = new LinkedList<File>(); + private RepositorySystem system = Booter.newRepositorySystem(); + private RepositorySystemSession session; + private RemoteRepository mavenCentral = Booter.newCentralRepository(); + private RemoteRepository mavenLocal = Booter.newLocalRepository(); + + public DependencyContext(String localRepoPath) { + session = Booter.newRepositorySystemSession(system, localRepoPath); + } + + public Dependency load(String lib) { + Dependency dep = new Dependency(lib); + + if (dependencies.contains(dep)) { + dependencies.remove(dep); + } + dependencies.add(dep); + return dep; + } + + public Repository addRepo(String name) { + Repository rep = new Repository(name); + repositories.add(rep); + return rep; + } + + public void reset() { + dependencies = new LinkedList<Dependency>(); + repositories = new LinkedList<Repository>(); + + files = new LinkedList<File>(); + filesDist = new LinkedList<File>(); + } + + + /** + * fetch all artifacts + * @return + * @throws MalformedURLException + * @throws ArtifactResolutionException + * @throws DependencyResolutionException + */ + public List<File> fetch() throws MalformedURLException, + DependencyResolutionException, ArtifactResolutionException { + + for (Dependency dep : dependencies) { + if (!dep.isLocalFsArtifact()) { + List<ArtifactResult> artifacts = fetchArtifactWithDep(dep); + for (ArtifactResult artifact : artifacts) { + if (dep.isDist()) { + filesDist.add(artifact.getArtifact().getFile()); + } + files.add(artifact.getArtifact().getFile()); + } + } else { + if (dep.isDist()) { + filesDist.add(new File(dep.getGroupArtifactVersion())); + } + files.add(new File(dep.getGroupArtifactVersion())); + } + } + + return files; + } + + private List<ArtifactResult> fetchArtifactWithDep(Dependency dep) + throws DependencyResolutionException, ArtifactResolutionException { + Artifact artifact = new DefaultArtifact(dep.getGroupArtifactVersion()); + + DependencyFilter classpathFlter = DependencyFilterUtils + .classpathFilter(JavaScopes.COMPILE); + PatternExclusionsDependencyFilter exclusionFilter = new PatternExclusionsDependencyFilter( + dep.getExclusions()); + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRoot(new org.sonatype.aether.graph.Dependency(artifact, + JavaScopes.COMPILE)); + + collectRequest.addRepository(mavenCentral); + collectRequest.addRepository(mavenLocal); + for (Repository repo : repositories) { + RemoteRepository rr = new RemoteRepository(repo.getName(), "default", repo.getUrl()); + rr.setPolicy(repo.isSnapshot(), null); + collectRequest.addRepository(rr); + } + + DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, + DependencyFilterUtils.andFilter(exclusionFilter, classpathFlter)); + + return system.resolveDependencies(session, dependencyRequest).getArtifactResults(); + } + + public List<File> getFiles() { + return files; + } + + public List<File> getFilesDist() { + return filesDist; + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java new file mode 100644 index 0000000..cbe88bc --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java @@ -0,0 +1,163 @@ +/* + * 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.dep; + +import java.io.File; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.collection.CollectRequest; +import org.sonatype.aether.graph.Dependency; +import org.sonatype.aether.graph.DependencyFilter; +import org.sonatype.aether.repository.RemoteRepository; +import org.sonatype.aether.resolution.ArtifactResult; +import org.sonatype.aether.resolution.DependencyRequest; +import org.sonatype.aether.util.artifact.DefaultArtifact; +import org.sonatype.aether.util.artifact.JavaScopes; +import org.sonatype.aether.util.filter.DependencyFilterUtils; +import org.sonatype.aether.util.filter.PatternExclusionsDependencyFilter; + + +/** + * Deps resolver. + * Add new dependencies from mvn repo (at runtime) to Zeppelin. + */ +public class DependencyResolver extends AbstractDependencyResolver { + Logger logger = LoggerFactory.getLogger(DependencyResolver.class); + + private final String[] exclusions = new String[] {"org.apache.zeppelin:zeppelin-zengine", + "org.apache.zeppelin:zeppelin-interpreter", + "org.apache.zeppelin:zeppelin-server"}; + + public DependencyResolver(String localRepoPath) { + super(localRepoPath); + } + + public List<File> load(String artifact) throws Exception { + return load(artifact, new LinkedList<String>()); + } + + public List<File> load(String artifact, String destPath) throws Exception { + return load(artifact, new LinkedList<String>(), destPath); + } + + public synchronized List<File> load(String artifact, Collection<String> excludes) + throws Exception { + if (StringUtils.isBlank(artifact)) { + // Should throw here + throw new RuntimeException("Invalid artifact to load"); + } + + // <groupId>:<artifactId>[:<extension>[:<classifier>]]:<version> + int numSplits = artifact.split(":").length; + if (numSplits >= 3 && numSplits <= 6) { + return loadFromMvn(artifact, excludes); + } else { + LinkedList<File> libs = new LinkedList<File>(); + libs.add(new File(artifact)); + return libs; + } + } + + public List<File> load(String artifact, Collection<String> excludes, String destPath) + throws Exception { + List<File> libs = load(artifact, excludes); + + // find home dir + String home = System.getenv("ZEPPELIN_HOME"); + if (home == null) { + home = System.getProperty("zeppelin.home"); + } + if (home == null) { + home = ".."; + } + + for (File srcFile: libs) { + File destFile = new File(home + "/" + destPath, srcFile.getName()); + if (!destFile.exists() || !FileUtils.contentEquals(srcFile, destFile)) { + FileUtils.copyFile(srcFile, destFile); + logger.info("copy {} to {}", srcFile.getAbsolutePath(), destPath); + } + } + return libs; + } + + private List<File> loadFromMvn(String artifact, Collection<String> excludes) throws Exception { + Collection<String> allExclusions = new LinkedList<String>(); + allExclusions.addAll(excludes); + allExclusions.addAll(Arrays.asList(exclusions)); + + List<ArtifactResult> listOfArtifact; + listOfArtifact = getArtifactsWithDep(artifact, allExclusions); + + Iterator<ArtifactResult> it = listOfArtifact.iterator(); + while (it.hasNext()) { + Artifact a = it.next().getArtifact(); + String gav = a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getVersion(); + for (String exclude : allExclusions) { + if (gav.startsWith(exclude)) { + it.remove(); + break; + } + } + } + + List<File> files = new LinkedList<File>(); + for (ArtifactResult artifactResult : listOfArtifact) { + files.add(artifactResult.getArtifact().getFile()); + logger.info("load {}", artifactResult.getArtifact().getFile().getAbsolutePath()); + } + + return files; + } + + /** + * @param dependency + * @param excludes list of pattern can either be of the form groupId:artifactId + * @return + * @throws Exception + */ + @Override + public List<ArtifactResult> getArtifactsWithDep(String dependency, + Collection<String> excludes) throws Exception { + Artifact artifact = new DefaultArtifact(dependency); + DependencyFilter classpathFilter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE); + PatternExclusionsDependencyFilter exclusionFilter = + new PatternExclusionsDependencyFilter(excludes); + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRoot(new Dependency(artifact, JavaScopes.COMPILE)); + + synchronized (repos) { + for (RemoteRepository repo : repos) { + collectRequest.addRepository(repo); + } + } + DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, + DependencyFilterUtils.andFilter(exclusionFilter, classpathFilter)); + return system.resolveDependencies(session, dependencyRequest).getArtifactResults(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java new file mode 100644 index 0000000..4c2d867 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java @@ -0,0 +1,80 @@ +/* + * 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.dep; +import org.sonatype.aether.repository.Authentication; +/** + * + * + */ +public class Repository { + private boolean snapshot = false; + private String name; + private String url; + private String username = null; + private String password = null; + + public Repository(String name){ + this.name = name; + } + + public Repository url(String url) { + this.url = url; + return this; + } + + public Repository snapshot() { + snapshot = true; + return this; + } + + public boolean isSnapshot() { + return snapshot; + } + + public String getName() { + return name; + } + + public String getUrl() { + return url; + } + + public Repository username(String username) { + this.username = username; + return this; + } + + public Repository password(String password) { + this.password = password; + return this; + } + + public Repository credentials(String username, String password) { + this.username = username; + this.password = password; + return this; + } + + public Authentication getAuthentication() { + Authentication auth = null; + if (this.username != null && this.password != null) { + auth = new Authentication(this.username, this.password); + } + return auth; + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositoryListener.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositoryListener.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositoryListener.java new file mode 100644 index 0000000..9f62d5f --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositoryListener.java @@ -0,0 +1,118 @@ +/* + * 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.dep; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonatype.aether.AbstractRepositoryListener; +import org.sonatype.aether.RepositoryEvent; + +/** + * Simple listener that print log. + */ +public class RepositoryListener extends AbstractRepositoryListener { + Logger logger = LoggerFactory.getLogger(RepositoryListener.class); + + public RepositoryListener() {} + + @Override + public void artifactDeployed(RepositoryEvent event) { + logger.info("Deployed " + event.getArtifact() + " to " + event.getRepository()); + } + + @Override + public void artifactDeploying(RepositoryEvent event) { + logger.info("Deploying " + event.getArtifact() + " to " + event.getRepository()); + } + + @Override + public void artifactDescriptorInvalid(RepositoryEvent event) { + logger.info("Invalid artifact descriptor for " + event.getArtifact() + ": " + + event.getException().getMessage()); + } + + @Override + public void artifactDescriptorMissing(RepositoryEvent event) { + logger.info("Missing artifact descriptor for " + event.getArtifact()); + } + + @Override + public void artifactInstalled(RepositoryEvent event) { + logger.info("Installed " + event.getArtifact() + " to " + event.getFile()); + } + + @Override + public void artifactInstalling(RepositoryEvent event) { + logger.info("Installing " + event.getArtifact() + " to " + event.getFile()); + } + + @Override + public void artifactResolved(RepositoryEvent event) { + logger.info("Resolved artifact " + event.getArtifact() + " from " + event.getRepository()); + } + + @Override + public void artifactDownloading(RepositoryEvent event) { + logger.info("Downloading artifact " + event.getArtifact() + " from " + event.getRepository()); + } + + @Override + public void artifactDownloaded(RepositoryEvent event) { + logger.info("Downloaded artifact " + event.getArtifact() + " from " + event.getRepository()); + } + + @Override + public void artifactResolving(RepositoryEvent event) { + logger.info("Resolving artifact " + event.getArtifact()); + } + + @Override + public void metadataDeployed(RepositoryEvent event) { + logger.info("Deployed " + event.getMetadata() + " to " + event.getRepository()); + } + + @Override + public void metadataDeploying(RepositoryEvent event) { + logger.info("Deploying " + event.getMetadata() + " to " + event.getRepository()); + } + + @Override + public void metadataInstalled(RepositoryEvent event) { + logger.info("Installed " + event.getMetadata() + " to " + event.getFile()); + } + + @Override + public void metadataInstalling(RepositoryEvent event) { + logger.info("Installing " + event.getMetadata() + " to " + event.getFile()); + } + + @Override + public void metadataInvalid(RepositoryEvent event) { + logger.info("Invalid metadata " + event.getMetadata()); + } + + @Override + public void metadataResolved(RepositoryEvent event) { + logger.info("Resolved metadata " + event.getMetadata() + " from " + event.getRepository()); + } + + @Override + public void metadataResolving(RepositoryEvent event) { + logger.info("Resolving metadata " + event.getMetadata() + " from " + event.getRepository()); + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositorySystemFactory.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositorySystemFactory.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositorySystemFactory.java new file mode 100644 index 0000000..a224603 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/RepositorySystemFactory.java @@ -0,0 +1,66 @@ +/* + * 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.dep; + +import org.apache.maven.repository.internal.DefaultServiceLocator; +import org.apache.maven.wagon.Wagon; +import org.apache.maven.wagon.providers.http.HttpWagon; +import org.apache.maven.wagon.providers.http.LightweightHttpWagon; +import org.sonatype.aether.RepositorySystem; +import org.sonatype.aether.connector.file.FileRepositoryConnectorFactory; +import org.sonatype.aether.connector.wagon.WagonProvider; +import org.sonatype.aether.connector.wagon.WagonRepositoryConnectorFactory; +import org.sonatype.aether.spi.connector.RepositoryConnectorFactory; + +/** + * Get maven repository instance. + */ +public class RepositorySystemFactory { + public static RepositorySystem newRepositorySystem() { + DefaultServiceLocator locator = new DefaultServiceLocator(); + locator.addService(RepositoryConnectorFactory.class, FileRepositoryConnectorFactory.class); + locator.addService(RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class); + locator.setServices(WagonProvider.class, new ManualWagonProvider()); + + return locator.getService(RepositorySystem.class); + } + + /** + * ManualWagonProvider + */ + public static class ManualWagonProvider implements WagonProvider { + + @Override + public Wagon lookup(String roleHint) throws Exception { + if ("http".equals(roleHint)) { + return new LightweightHttpWagon(); + } + + if ("https".equals(roleHint)) { + return new HttpWagon(); + } + + return null; + } + + @Override + public void release(Wagon arg0) { + + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/TransferListener.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/TransferListener.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/TransferListener.java new file mode 100644 index 0000000..277a303 --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/TransferListener.java @@ -0,0 +1,145 @@ +/* + * 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.dep; + +import java.io.PrintStream; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonatype.aether.transfer.AbstractTransferListener; +import org.sonatype.aether.transfer.TransferEvent; +import org.sonatype.aether.transfer.TransferResource; + +/** + * Simple listener that show deps downloading progress. + */ +public class TransferListener extends AbstractTransferListener { + Logger logger = LoggerFactory.getLogger(TransferListener.class); + private PrintStream out; + + private Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>(); + + private int lastLength; + + public TransferListener() {} + + @Override + public void transferInitiated(TransferEvent event) { + String message = + event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading"; + + logger.info(message + ": " + event.getResource().getRepositoryUrl() + + event.getResource().getResourceName()); + } + + @Override + public void transferProgressed(TransferEvent event) { + TransferResource resource = event.getResource(); + downloads.put(resource, Long.valueOf(event.getTransferredBytes())); + + StringBuilder buffer = new StringBuilder(64); + + for (Map.Entry<TransferResource, Long> entry : downloads.entrySet()) { + long total = entry.getKey().getContentLength(); + long complete = entry.getValue().longValue(); + + buffer.append(getStatus(complete, total)).append(" "); + } + + int pad = lastLength - buffer.length(); + lastLength = buffer.length(); + pad(buffer, pad); + buffer.append('\r'); + + logger.info(buffer.toString()); + } + + private String getStatus(long complete, long total) { + if (total >= 1024) { + return toKB(complete) + "/" + toKB(total) + " KB "; + } else if (total >= 0) { + return complete + "/" + total + " B "; + } else if (complete >= 1024) { + return toKB(complete) + " KB "; + } else { + return complete + " B "; + } + } + + private void pad(StringBuilder buffer, int spaces) { + String block = " "; + while (spaces > 0) { + int n = Math.min(spaces, block.length()); + buffer.append(block, 0, n); + spaces -= n; + } + } + + @Override + public void transferSucceeded(TransferEvent event) { + transferCompleted(event); + + TransferResource resource = event.getResource(); + long contentLength = event.getTransferredBytes(); + if (contentLength >= 0) { + String type = + (event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded"); + String len = contentLength >= 1024 ? toKB(contentLength) + " KB" : contentLength + " B"; + + String throughput = ""; + long duration = System.currentTimeMillis() - resource.getTransferStartTime(); + if (duration > 0) { + DecimalFormat format = new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.ENGLISH)); + double kbPerSec = (contentLength / 1024.0) / (duration / 1000.0); + throughput = " at " + format.format(kbPerSec) + " KB/sec"; + } + + logger.info(type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + + len + throughput + ")"); + } + } + + @Override + public void transferFailed(TransferEvent event) { + transferCompleted(event); + event.getException().printStackTrace(out); + } + + private void transferCompleted(TransferEvent event) { + downloads.remove(event.getResource()); + StringBuilder buffer = new StringBuilder(64); + pad(buffer, lastLength); + buffer.append('\r'); + logger.info(buffer.toString()); + } + + @Override + public void transferCorrupted(TransferEvent event) { + event.getException().printStackTrace(out); + } + + protected long toKB(long bytes) { + return (bytes + 1023) / 1024; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-interpreter/src/test/java/org/apache/zeppelin/dep/DependencyResolverTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/dep/DependencyResolverTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/dep/DependencyResolverTest.java new file mode 100644 index 0000000..33b7e54 --- /dev/null +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/dep/DependencyResolverTest.java @@ -0,0 +1,62 @@ +/* + * 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.dep; + +import static org.junit.Assert.assertTrue; + +import java.io.File; + +import org.apache.commons.io.FileUtils; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class DependencyResolverTest { + private static DependencyResolver resolver; + private static String testPath; + private static String testCopyPath; + private static String home; + + @BeforeClass + public static void setUp() throws Exception { + testPath = "test-repo"; + testCopyPath = "test-copy-repo"; + resolver = new DependencyResolver(testPath); + home = System.getenv("ZEPPELIN_HOME"); + if (home == null) { + home = System.getProperty("zeppelin.home"); + } + if (home == null) { + home = ".."; + } + } + + @AfterClass + public static void tearDown() throws Exception { + FileUtils.deleteDirectory(new File(home + "/" + testPath)); + FileUtils.deleteDirectory(new File(home + "/" + testCopyPath)); + } + + @Test + public void testLoad() throws Exception { + resolver.load("org.apache.commons:commons-lang3:3.4", testCopyPath); + + assertTrue(new File(home + "/" + testPath + "/org/apache/commons/commons-lang3/3.4/").exists()); + assertTrue(new File(home + "/" + testCopyPath + "/commons-lang3-3.4.jar").exists()); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java ---------------------------------------------------------------------- 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 7ad2b71..9e7a97c 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 @@ -30,6 +30,7 @@ import javax.ws.rs.core.Application; import org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet; import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; +import org.apache.zeppelin.dep.DependencyResolver; import org.apache.zeppelin.interpreter.InterpreterFactory; import org.apache.zeppelin.notebook.Notebook; import org.apache.zeppelin.notebook.repo.NotebookRepo; @@ -73,12 +74,14 @@ public class ZeppelinServer extends Application { private InterpreterFactory replFactory; private NotebookRepo notebookRepo; private SearchService notebookIndex; + private DependencyResolver depResolver; public ZeppelinServer() throws Exception { ZeppelinConfiguration conf = ZeppelinConfiguration.create(); + this.depResolver = new DependencyResolver(conf.getString(ConfVars.ZEPPELIN_DEP_LOCALREPO)); this.schedulerFactory = new SchedulerFactory(); - this.replFactory = new InterpreterFactory(conf, notebookWsServer); + this.replFactory = new InterpreterFactory(conf, notebookWsServer, depResolver); this.notebookRepo = new NotebookRepoSync(conf); this.notebookIndex = new LuceneSearch(); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java index ca63eef..edcf513 100755 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java @@ -428,6 +428,7 @@ public class ZeppelinConfiguration extends XMLConfiguration { // Decide when new note is created, interpreter settings will be binded automatically or not. ZEPPELIN_NOTEBOOK_AUTO_INTERPRETER_BINDING("zeppelin.notebook.autoInterpreterBinding", true), ZEPPELIN_CONF_DIR("zeppelin.conf.dir", "conf"), + ZEPPELIN_DEP_LOCALREPO("zeppelin.dep.localrepo", "local-repo"), // Allows a way to specify a ',' separated list of allowed origins for rest and websockets // i.e. http://localhost:8080 ZEPPELIN_ALLOWED_ORIGINS("zeppelin.server.allowed.origins", "*"), http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java index fc8cc04..4ff0cc3 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java @@ -23,6 +23,7 @@ import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.NullArgumentException; import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; +import org.apache.zeppelin.dep.DependencyResolver; import org.apache.zeppelin.display.AngularObjectRegistry; import org.apache.zeppelin.display.AngularObjectRegistryListener; import org.apache.zeppelin.interpreter.Interpreter.RegisteredInterpreter; @@ -65,19 +66,24 @@ public class InterpreterFactory { AngularObjectRegistryListener angularObjectRegistryListener; + DependencyResolver depResolver; + public InterpreterFactory(ZeppelinConfiguration conf, - AngularObjectRegistryListener angularObjectRegistryListener) + AngularObjectRegistryListener angularObjectRegistryListener, + DependencyResolver depResolver) throws InterpreterException, IOException { - this(conf, new InterpreterOption(true), angularObjectRegistryListener); + this(conf, new InterpreterOption(true), angularObjectRegistryListener, depResolver); } public InterpreterFactory(ZeppelinConfiguration conf, InterpreterOption defaultOption, - AngularObjectRegistryListener angularObjectRegistryListener) + AngularObjectRegistryListener angularObjectRegistryListener, + DependencyResolver depResolver) throws InterpreterException, IOException { this.conf = conf; this.defaultOption = defaultOption; this.angularObjectRegistryListener = angularObjectRegistryListener; + this.depResolver = depResolver; String replsConf = conf.getString(ConfVars.ZEPPELIN_INTERPRETERS); interpreterClassList = replsConf.split(","); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java index 6a69b83..abd0e3b 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/InterpreterFactoryTest.java @@ -38,32 +38,32 @@ import org.junit.Test; public class InterpreterFactoryTest { - private InterpreterFactory factory; + private InterpreterFactory factory; private File tmpDir; private ZeppelinConfiguration conf; private InterpreterContext context; @Before - public void setUp() throws Exception { + public void setUp() throws Exception { tmpDir = new File(System.getProperty("java.io.tmpdir")+"/ZeppelinLTest_"+System.currentTimeMillis()); tmpDir.mkdirs(); new File(tmpDir, "conf").mkdirs(); MockInterpreter1.register("mock1", "org.apache.zeppelin.interpreter.mock.MockInterpreter1"); - MockInterpreter2.register("mock2", "org.apache.zeppelin.interpreter.mock.MockInterpreter2"); + MockInterpreter2.register("mock2", "org.apache.zeppelin.interpreter.mock.MockInterpreter2"); - System.setProperty(ConfVars.ZEPPELIN_HOME.getVarName(), tmpDir.getAbsolutePath()); - System.setProperty(ConfVars.ZEPPELIN_INTERPRETERS.getVarName(), "org.apache.zeppelin.interpreter.mock.MockInterpreter1,org.apache.zeppelin.interpreter.mock.MockInterpreter2"); - conf = new ZeppelinConfiguration(); - factory = new InterpreterFactory(conf, new InterpreterOption(false), null); - context = new InterpreterContext("note", "id", "title", "text", null, null, null, null); + System.setProperty(ConfVars.ZEPPELIN_HOME.getVarName(), tmpDir.getAbsolutePath()); + System.setProperty(ConfVars.ZEPPELIN_INTERPRETERS.getVarName(), "org.apache.zeppelin.interpreter.mock.MockInterpreter1,org.apache.zeppelin.interpreter.mock.MockInterpreter2"); + conf = new ZeppelinConfiguration(); + factory = new InterpreterFactory(conf, new InterpreterOption(false), null, null); + context = new InterpreterContext("note", "id", "title", "text", null, null, null, null); - } + } - @After - public void tearDown() throws Exception { - delete(tmpDir); - } + @After + public void tearDown() throws Exception { + delete(tmpDir); + } private void delete(File file){ if(file.isFile()) file.delete(); @@ -78,24 +78,24 @@ public class InterpreterFactoryTest { } } - @Test - public void testBasic() { - List<String> all = factory.getDefaultInterpreterSettingList(); + @Test + public void testBasic() { + List<String> all = factory.getDefaultInterpreterSettingList(); - // get interpreter - Interpreter repl1 = factory.get(all.get(0)).getInterpreterGroup().getFirst(); - assertFalse(((LazyOpenInterpreter) repl1).isOpen()); - repl1.interpret("repl1", context); - assertTrue(((LazyOpenInterpreter) repl1).isOpen()); + // get interpreter + Interpreter repl1 = factory.get(all.get(0)).getInterpreterGroup().getFirst(); + assertFalse(((LazyOpenInterpreter) repl1).isOpen()); + repl1.interpret("repl1", context); + assertTrue(((LazyOpenInterpreter) repl1).isOpen()); - // try to get unavailable interpreter - assertNull(factory.get("unknown")); + // try to get unavailable interpreter + assertNull(factory.get("unknown")); - // restart interpreter - factory.restart(all.get(0)); - repl1 = factory.get(all.get(0)).getInterpreterGroup().getFirst(); - assertFalse(((LazyOpenInterpreter) repl1).isOpen()); - } + // restart interpreter + factory.restart(all.get(0)); + repl1 = factory.get(all.get(0)).getInterpreterGroup().getFirst(); + assertFalse(((LazyOpenInterpreter) repl1).isOpen()); + } @Test public void testFactoryDefaultList() throws IOException { @@ -119,8 +119,8 @@ public class InterpreterFactoryTest { try { factory.add("a mock", "mock2", null, new Properties()); } catch(NullArgumentException e) { - assertEquals("Test null option" , e.getMessage(),new NullArgumentException("option").getMessage()); - } + assertEquals("Test null option" , e.getMessage(),new NullArgumentException("option").getMessage()); + } try { factory.add("a mock" , "mock2" , new InterpreterOption(false),null); } catch (NullArgumentException e){ @@ -140,7 +140,7 @@ public class InterpreterFactoryTest { factory.add("newsetting", "mock1", new InterpreterOption(false), new Properties()); assertEquals(3, factory.get().size()); - InterpreterFactory factory2 = new InterpreterFactory(conf, null); + InterpreterFactory factory2 = new InterpreterFactory(conf, null, null); assertEquals(3, factory2.get().size()); } } http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java index 2e1f5e3..a0455eb 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java @@ -58,7 +58,7 @@ public class NoteInterpreterLoaderTest { MockInterpreter11.register("mock11", "group1", "org.apache.zeppelin.interpreter.mock.MockInterpreter11"); MockInterpreter2.register("mock2", "group2", "org.apache.zeppelin.interpreter.mock.MockInterpreter2"); - factory = new InterpreterFactory(conf, new InterpreterOption(false), null); + factory = new InterpreterFactory(conf, new InterpreterOption(false), null, null); } @After http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index 917ea6b..34f7a1b 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -85,7 +85,7 @@ public class NotebookTest implements JobListenerFactory{ MockInterpreter1.register("mock1", "org.apache.zeppelin.interpreter.mock.MockInterpreter1"); MockInterpreter2.register("mock2", "org.apache.zeppelin.interpreter.mock.MockInterpreter2"); - factory = new InterpreterFactory(conf, new InterpreterOption(false), null); + factory = new InterpreterFactory(conf, new InterpreterOption(false), null, null); SearchService search = mock(SearchService.class); notebookRepo = new VFSNotebookRepo(conf); @@ -172,7 +172,7 @@ public class NotebookTest implements JobListenerFactory{ note.persist(); Notebook notebook2 = new Notebook( - conf, notebookRepo, schedulerFactory, new InterpreterFactory(conf, null), this, null); + conf, notebookRepo, schedulerFactory, new InterpreterFactory(conf, null, null), this, null); assertEquals(1, notebook2.getAllNotes().size()); } http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java index 4e9e180..60b3ba3 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java @@ -87,7 +87,7 @@ public class NotebookRepoSyncTest implements JobListenerFactory { MockInterpreter1.register("mock1", "org.apache.zeppelin.interpreter.mock.MockInterpreter1"); MockInterpreter2.register("mock2", "org.apache.zeppelin.interpreter.mock.MockInterpreter2"); - factory = new InterpreterFactory(conf, new InterpreterOption(false), null); + factory = new InterpreterFactory(conf, new InterpreterOption(false), null, null); SearchService search = mock(SearchService.class); notebookRepoSync = new NotebookRepoSync(conf); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/bc715511/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java index 65be61b..cff086d 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java @@ -76,7 +76,7 @@ public class VFSNotebookRepoTest implements JobListenerFactory { MockInterpreter1.register("mock1", "org.apache.zeppelin.interpreter.mock.MockInterpreter1"); this.schedulerFactory = new SchedulerFactory(); - factory = new InterpreterFactory(conf, new InterpreterOption(false), null); + factory = new InterpreterFactory(conf, new InterpreterOption(false), null, null); SearchService search = mock(SearchService.class); notebookRepo = new VFSNotebookRepo(conf);
