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);

Reply via email to