You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by jo...@apache.org on 2018/08/18 16:04:36 UTC

zeppelin git commit: [ZEPPELIN-3609][PART-1] Refactor ZeppelinServer class

Repository: zeppelin
Updated Branches:
  refs/heads/master cdbdfd573 -> 82b875cf9


[ZEPPELIN-3609][PART-1] Refactor ZeppelinServer class

### What is this PR for?
Refactoring ZeppelinServer to add new feature easily and understand more clearly. And I'd like to refactor with several commits not to keep apart from the current master.

### What type of PR is it?
[Refactoring]

### Todos
* [x] - Intorduce Inject annotation for server component

### What is the Jira issue?
* https://issues.apache.org/jira/browse/ZEPPELIN-3609

### Questions:
* Does the licenses files need update? No
* Is there breaking changes for older versions? No
* Does this needs documentation? No

Author: Jongyoul Lee <jo...@gmail.com>

Closes #3067 from jongyoul/ZEPPELIN-3609 and squashes the following commits:

312760aa7 [Jongyoul Lee] Fix style
22e0390e9 [Jongyoul Lee] Adopt DI in ConfigurationRestApi and related classes
b645223ab [Jongyoul Lee] Revert back to normal (+9 squashed commits) Squashed commits: [cc8d5c2] Revert back to normal [3ae4480] WIP Simplify test [c607385] WIP Test org.apache.zeppelin.integration.SparkParagraphIT only [294c7a4] Add `@Inject` annotation to `org.apache.zeppelin.service.*` [ff0780f] Add `@Inject` annotation to `org.apache.zeppelin.rest.*` [5c5cd16] Remove jersey warning messages [8430c64] Fix styles [8aa15ed] [WIP] Add formatter [1dd065c] Adopt formatter for `ZeppelinServer.java`


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/82b875cf
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/82b875cf
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/82b875cf

Branch: refs/heads/master
Commit: 82b875cf9b1521cc32cd5c375caee367bd62a9fa
Parents: cdbdfd5
Author: Jongyoul Lee <jo...@gmail.com>
Authored: Sat Aug 18 23:30:17 2018 +0900
Committer: Jongyoul Lee <jo...@apache.org>
Committed: Sun Aug 19 01:04:29 2018 +0900

----------------------------------------------------------------------
 .../org/apache/zeppelin/rest/AdminRestApi.java  |   2 +
 .../zeppelin/rest/ConfigurationsRestApi.java    |  26 +-
 .../apache/zeppelin/rest/CredentialRestApi.java |   2 +
 .../org/apache/zeppelin/rest/HeliumRestApi.java |   2 +
 .../zeppelin/rest/InterpreterRestApi.java       |   4 +-
 .../org/apache/zeppelin/rest/LoginRestApi.java  |   7 -
 .../zeppelin/rest/NotebookRepoRestApi.java      |   4 +-
 .../apache/zeppelin/rest/NotebookRestApi.java   |   7 +-
 .../apache/zeppelin/rest/SecurityRestApi.java   |   8 -
 .../apache/zeppelin/rest/ZeppelinRestApi.java   |   2 -
 .../apache/zeppelin/server/ZeppelinServer.java  | 305 +++++++++----------
 .../zeppelin/service/ConfigurationService.java  |   2 +
 .../zeppelin/service/InterpreterService.java    |   2 +
 13 files changed, 167 insertions(+), 206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
index 093b710..c6eda22 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
@@ -19,6 +19,7 @@ package org.apache.zeppelin.rest;
 
 import com.google.common.collect.Lists;
 import java.util.List;
+import javax.inject.Inject;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -38,6 +39,7 @@ public class AdminRestApi {
 
   private AdminService adminService;
 
+  @Inject
   public AdminRestApi(AdminService adminService) {
     this.adminService = adminService;
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ConfigurationsRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ConfigurationsRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ConfigurationsRestApi.java
index 34b5c1c..24b9ce9 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ConfigurationsRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ConfigurationsRestApi.java
@@ -16,28 +16,27 @@
  */
 package org.apache.zeppelin.rest;
 
-import org.apache.zeppelin.annotation.ZeppelinApi;
-import org.apache.zeppelin.server.JsonResponse;
-import org.apache.zeppelin.service.ConfigurationService;
-
+import java.io.IOException;
+import java.util.Map;
+import javax.inject.Inject;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
-import java.io.IOException;
-import java.util.Map;
+import org.apache.zeppelin.annotation.ZeppelinApi;
+import org.apache.zeppelin.server.JsonResponse;
+import org.apache.zeppelin.service.ConfigurationService;
 
-/**
- * Configurations Rest API Endpoint.
- */
+/** Configurations Rest API Endpoint. */
 @Path("/configurations")
 @Produces("application/json")
 public class ConfigurationsRestApi extends AbstractRestApi {
 
   private ConfigurationService configurationService;
 
+  @Inject
   public ConfigurationsRestApi(ConfigurationService configurationService) {
     this.configurationService = configurationService;
   }
@@ -47,8 +46,8 @@ public class ConfigurationsRestApi extends AbstractRestApi {
   @ZeppelinApi
   public Response getAll() {
     try {
-      Map<String, String> properties = configurationService.getAllProperties(getServiceContext(),
-          new RestServiceCallback<>());
+      Map<String, String> properties =
+          configurationService.getAllProperties(getServiceContext(), new RestServiceCallback<>());
       return new JsonResponse(Status.OK, "", properties).build();
     } catch (IOException e) {
       return new JsonResponse(Status.INTERNAL_SERVER_ERROR, "Fail to get configuration", e).build();
@@ -60,8 +59,9 @@ public class ConfigurationsRestApi extends AbstractRestApi {
   @ZeppelinApi
   public Response getByPrefix(@PathParam("prefix") final String prefix) {
     try {
-      Map<String, String> properties = configurationService.getPropertiesWithPrefix(prefix,
-          getServiceContext(), new RestServiceCallback<>());
+      Map<String, String> properties =
+          configurationService.getPropertiesWithPrefix(
+              prefix, getServiceContext(), new RestServiceCallback<>());
       return new JsonResponse(Status.OK, "", properties).build();
     } catch (IOException e) {
       return new JsonResponse(Status.INTERNAL_SERVER_ERROR, "Fail to get configuration", e).build();

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java
index 9765b8f..372666e 100755
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/CredentialRestApi.java
@@ -22,6 +22,7 @@ import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import java.io.IOException;
 import java.util.Map;
+import javax.inject.Inject;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.PUT;
@@ -46,6 +47,7 @@ public class CredentialRestApi {
   private Credentials credentials;
   private Gson gson = new Gson();
 
+  @Inject
   public CredentialRestApi(Credentials credentials) {
     this.credentials = credentials;
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
index fd70de3..1c04500 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
@@ -20,6 +20,7 @@ import com.google.gson.Gson;
 import com.google.gson.JsonParseException;
 import com.google.gson.reflect.TypeToken;
 
+import javax.inject.Inject;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -58,6 +59,7 @@ public class HeliumRestApi {
   private Notebook notebook;
   private Gson gson = new Gson();
 
+  @Inject
   public HeliumRestApi(Helium helium, Notebook notebook) {
     this.helium  = helium;
     this.notebook = notebook;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
index 16d39d8..74efa27 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
@@ -18,6 +18,7 @@
 package org.apache.zeppelin.rest;
 
 import com.google.common.collect.Maps;
+import javax.inject.Inject;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.dep.Repository;
@@ -68,6 +69,7 @@ public class InterpreterRestApi {
   private final InterpreterSettingManager interpreterSettingManager;
   private final NotebookServer notebookServer;
 
+  @Inject
   public InterpreterRestApi(
       InterpreterService interpreterService,
       InterpreterSettingManager interpreterSettingManager,
@@ -213,7 +215,7 @@ public class InterpreterRestApi {
    */
   @GET
   @ZeppelinApi
-  public Response listInterpreter(String message) {
+  public Response listInterpreter() {
     Map<String, InterpreterSetting> m = interpreterSettingManager.getInterpreterSettingTemplates();
     return new JsonResponse<>(Status.OK, "", m).build();
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/LoginRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/LoginRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/LoginRestApi.java
index 3a1fe80..2937d02 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/LoginRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/LoginRestApi.java
@@ -63,13 +63,6 @@ public class LoginRestApi {
   private static final Logger LOG = LoggerFactory.getLogger(LoginRestApi.class);
   private static final Gson gson = new Gson();
 
-  /**
-   * Required by Swagger.
-   */
-  public LoginRestApi() {
-    super();
-  }
-
   @GET
   @ZeppelinApi
   public Response getLogin(@Context HttpHeaders headers) {

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
index d9ac664..2615c2f 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
@@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import com.google.gson.JsonSyntaxException;
 
+import javax.inject.Inject;
 import org.apache.commons.lang.StringUtils;
 import org.apache.zeppelin.service.ServiceContext;
 import org.slf4j.Logger;
@@ -58,8 +59,7 @@ public class NotebookRepoRestApi {
   private NotebookRepoSync noteRepos;
   private NotebookServer notebookWsServer;
 
-  public NotebookRepoRestApi() {}
-
+  @Inject
   public NotebookRepoRestApi(NotebookRepoSync noteRepos, NotebookServer notebookWsServer) {
     this.noteRepos = noteRepos;
     this.notebookWsServer = notebookWsServer;

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
index 85ba2d6..d187c4d 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java
@@ -20,6 +20,7 @@ package org.apache.zeppelin.rest;
 import com.google.common.collect.Sets;
 import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
+import javax.inject.Inject;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
@@ -83,9 +84,7 @@ public class NotebookRestApi extends AbstractRestApi {
   private NotebookAuthorization notebookAuthorization;
   private NotebookService notebookService;
 
-  public NotebookRestApi() {
-  }
-
+  @Inject
   public NotebookRestApi(Notebook notebook, NotebookServer notebookServer, SearchService search) {
     this.notebook = notebook;
     this.notebookServer = notebookServer;
@@ -282,7 +281,6 @@ public class NotebookRestApi extends AbstractRestApi {
   }
 
   @GET
-  @Path("/")
   @ZeppelinApi
   public Response getNoteList() throws IOException {
     List<Map<String, String>> notesInfo = notebookService.listNotes(false, getServiceContext(),
@@ -339,7 +337,6 @@ public class NotebookRestApi extends AbstractRestApi {
    * @throws IOException
    */
   @POST
-  @Path("/")
   @ZeppelinApi
   public Response createNote(String message) throws IOException {
     String user = SecurityUtils.getPrincipal();

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
index 8a2fed4..45b76fa 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
@@ -48,14 +48,6 @@ public class SecurityRestApi {
   private static final Logger LOG = LoggerFactory.getLogger(SecurityRestApi.class);
   private static final Gson gson = new Gson();
 
-
-  /**
-   * Required by Swagger.
-   */
-  public SecurityRestApi() {
-    super();
-  }
-
   /**
    * Get ticket
    * Returns username & ticket

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java
index 2c43c2c..20d6973 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java
@@ -41,8 +41,6 @@ import org.apache.zeppelin.util.Util;
  */
 @Path("/")
 public class ZeppelinRestApi {
-  public ZeppelinRestApi() {
-  }
 
   /**
    * Get the root endpoint Return always 200.

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/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 8d604d6..660a4e2 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
@@ -16,14 +16,19 @@
  */
 package org.apache.zeppelin.server;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.util.Collection;
+import java.util.EnumSet;
+import javax.inject.Singleton;
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.MBeanRegistrationException;
 import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
 import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectName;
+import javax.servlet.DispatcherType;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.UnavailableSecurityManagerException;
 import org.apache.shiro.realm.Realm;
@@ -31,10 +36,28 @@ import org.apache.shiro.realm.text.IniRealm;
 import org.apache.shiro.web.env.EnvironmentLoaderListener;
 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
 import org.apache.shiro.web.servlet.ShiroFilter;
-import org.apache.zeppelin.rest.AdminRestApi;
+import org.apache.zeppelin.conf.ZeppelinConfiguration;
+import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars;
+import org.apache.zeppelin.helium.Helium;
+import org.apache.zeppelin.helium.HeliumApplicationFactory;
+import org.apache.zeppelin.helium.HeliumBundleFactory;
+import org.apache.zeppelin.interpreter.InterpreterFactory;
+import org.apache.zeppelin.interpreter.InterpreterOutput;
+import org.apache.zeppelin.interpreter.InterpreterSettingManager;
+import org.apache.zeppelin.notebook.Notebook;
+import org.apache.zeppelin.notebook.NotebookAuthorization;
+import org.apache.zeppelin.notebook.repo.NotebookRepoSync;
 import org.apache.zeppelin.rest.exception.WebApplicationExceptionMapper;
+import org.apache.zeppelin.scheduler.SchedulerFactory;
+import org.apache.zeppelin.search.LuceneSearch;
+import org.apache.zeppelin.search.SearchService;
 import org.apache.zeppelin.service.AdminService;
 import org.apache.zeppelin.service.ConfigurationService;
+import org.apache.zeppelin.service.InterpreterService;
+import org.apache.zeppelin.socket.NotebookServer;
+import org.apache.zeppelin.storage.ConfigStorage;
+import org.apache.zeppelin.user.Credentials;
+import org.apache.zeppelin.utils.SecurityUtils;
 import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -50,51 +73,13 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.webapp.WebAppContext;
+import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.server.ResourceConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.servlet.DispatcherType;
-import javax.ws.rs.core.Application;
-
-import org.apache.zeppelin.conf.ZeppelinConfiguration;
-import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars;
-import org.apache.zeppelin.helium.Helium;
-import org.apache.zeppelin.helium.HeliumApplicationFactory;
-import org.apache.zeppelin.helium.HeliumBundleFactory;
-import org.apache.zeppelin.interpreter.InterpreterFactory;
-import org.apache.zeppelin.interpreter.InterpreterOutput;
-import org.apache.zeppelin.interpreter.InterpreterSettingManager;
-import org.apache.zeppelin.notebook.Notebook;
-import org.apache.zeppelin.notebook.NotebookAuthorization;
-import org.apache.zeppelin.notebook.repo.NotebookRepoSync;
-import org.apache.zeppelin.rest.ConfigurationsRestApi;
-import org.apache.zeppelin.rest.CredentialRestApi;
-import org.apache.zeppelin.rest.HeliumRestApi;
-import org.apache.zeppelin.rest.InterpreterRestApi;
-import org.apache.zeppelin.rest.LoginRestApi;
-import org.apache.zeppelin.rest.NotebookRepoRestApi;
-import org.apache.zeppelin.rest.NotebookRestApi;
-import org.apache.zeppelin.rest.SecurityRestApi;
-import org.apache.zeppelin.rest.ZeppelinRestApi;
-import org.apache.zeppelin.scheduler.SchedulerFactory;
-import org.apache.zeppelin.search.LuceneSearch;
-import org.apache.zeppelin.search.SearchService;
-import org.apache.zeppelin.service.InterpreterService;
-import org.apache.zeppelin.socket.NotebookServer;
-import org.apache.zeppelin.storage.ConfigStorage;
-import org.apache.zeppelin.user.Credentials;
-import org.apache.zeppelin.utils.SecurityUtils;
-
-/**
- * Main class of Zeppelin.
- */
-public class ZeppelinServer extends Application {
+/** Main class of Zeppelin. */
+public class ZeppelinServer extends ResourceConfig {
   private static final Logger LOG = LoggerFactory.getLogger(ZeppelinServer.class);
 
   public static Notebook notebook;
@@ -116,8 +101,9 @@ public class ZeppelinServer extends Application {
     ZeppelinConfiguration conf = ZeppelinConfiguration.create();
     if (conf.getShiroPath().length() > 0) {
       try {
-        Collection<Realm> realms = ((DefaultWebSecurityManager) org.apache.shiro.SecurityUtils
-            .getSecurityManager()).getRealms();
+        Collection<Realm> realms =
+            ((DefaultWebSecurityManager) org.apache.shiro.SecurityUtils.getSecurityManager())
+                .getRealms();
         if (realms.size() > 1) {
           Boolean isIniRealmEnabled = false;
           for (Object realm : realms) {
@@ -127,8 +113,9 @@ public class ZeppelinServer extends Application {
             }
           }
           if (isIniRealmEnabled) {
-            throw new Exception("IniRealm/password based auth mechanisms should be exclusive. "
-                + "Consider removing [users] block from shiro.ini");
+            throw new Exception(
+                "IniRealm/password based auth mechanisms should be exclusive. "
+                    + "Consider removing [users] block from shiro.ini");
           }
         }
       } catch (UnavailableSecurityManagerException e) {
@@ -147,47 +134,56 @@ public class ZeppelinServer extends Application {
        * Check zeppelin/zeppelin-distribution/src/assemble/distribution.xml to see how they're
        * packaged into binary package.
        */
-      heliumBundleFactory = new HeliumBundleFactory(
-          conf,
-          null,
-          new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)),
-          new File(conf.getRelativeDir("lib/node_modules/zeppelin-tabledata")),
-          new File(conf.getRelativeDir("lib/node_modules/zeppelin-vis")),
-          new File(conf.getRelativeDir("lib/node_modules/zeppelin-spell")));
+      heliumBundleFactory =
+          new HeliumBundleFactory(
+              conf,
+              null,
+              new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)),
+              new File(conf.getRelativeDir("lib/node_modules/zeppelin-tabledata")),
+              new File(conf.getRelativeDir("lib/node_modules/zeppelin-vis")),
+              new File(conf.getRelativeDir("lib/node_modules/zeppelin-spell")));
     } else {
-      heliumBundleFactory = new HeliumBundleFactory(
-          conf,
-          null,
-          new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)),
-          new File(conf.getRelativeDir("zeppelin-web/src/app/tabledata")),
-          new File(conf.getRelativeDir("zeppelin-web/src/app/visualization")),
-          new File(conf.getRelativeDir("zeppelin-web/src/app/spell")));
+      heliumBundleFactory =
+          new HeliumBundleFactory(
+              conf,
+              null,
+              new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)),
+              new File(conf.getRelativeDir("zeppelin-web/src/app/tabledata")),
+              new File(conf.getRelativeDir("zeppelin-web/src/app/visualization")),
+              new File(conf.getRelativeDir("zeppelin-web/src/app/spell")));
     }
 
     this.schedulerFactory = SchedulerFactory.singleton();
-    this.interpreterSettingManager = new InterpreterSettingManager(conf, notebookWsServer,
-        notebookWsServer, notebookWsServer);
+    this.interpreterSettingManager =
+        new InterpreterSettingManager(conf, notebookWsServer, notebookWsServer, notebookWsServer);
     this.replFactory = new InterpreterFactory(interpreterSettingManager);
     this.notebookRepo = new NotebookRepoSync(conf);
     this.noteSearchService = new LuceneSearch(conf);
     this.notebookAuthorization = NotebookAuthorization.getInstance();
-    this.credentials = new Credentials(
-        conf.credentialsPersist(),
-        conf.getCredentialsPath(),
-        conf.getCredentialsEncryptKey());
-    notebook = new Notebook(conf,
-        notebookRepo, schedulerFactory, replFactory, interpreterSettingManager, notebookWsServer,
-            noteSearchService, notebookAuthorization, credentials);
+    this.credentials =
+        new Credentials(
+            conf.credentialsPersist(), conf.getCredentialsPath(), conf.getCredentialsEncryptKey());
+    notebook =
+        new Notebook(
+            conf,
+            notebookRepo,
+            schedulerFactory,
+            replFactory,
+            interpreterSettingManager,
+            notebookWsServer,
+            noteSearchService,
+            notebookAuthorization,
+            credentials);
     this.configStorage = ConfigStorage.getInstance(conf);
 
-    ZeppelinServer.helium = new Helium(
-        conf.getHeliumConfPath(),
-        conf.getHeliumRegistry(),
-        new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO),
-            "helium-registry-cache"),
-        heliumBundleFactory,
-        heliumApplicationFactory,
-        interpreterSettingManager);
+    ZeppelinServer.helium =
+        new Helium(
+            conf.getHeliumConfPath(),
+            conf.getHeliumRegistry(),
+            new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO), "helium-registry-cache"),
+            heliumBundleFactory,
+            heliumApplicationFactory,
+            interpreterSettingManager);
 
     // create bundle
     try {
@@ -223,6 +219,29 @@ public class ZeppelinServer extends Application {
         LOG.error("Failed to register MBeans", e);
       }
     }
+
+    register(
+        new AbstractBinder() {
+          @Override
+          protected void configure() {
+            bind(notebookRepo).to(NotebookRepoSync.class).in(Singleton.class);
+            bind(notebookWsServer).to(NotebookServer.class).in(Singleton.class);
+            bind(notebook).to(Notebook.class).in(Singleton.class);
+            bind(noteSearchService).to(SearchService.class).in(Singleton.class);
+            bind(helium).to(Helium.class).in(Singleton.class);
+            bind(conf).to(ZeppelinConfiguration.class).in(Singleton.class);
+            bind(interpreterSettingManager).to(InterpreterSettingManager.class).in(Singleton.class);
+            bind(InterpreterService.class).to(InterpreterService.class).in(Singleton.class);
+            bind(credentials).to(Credentials.class).in(Singleton.class);
+            bind(GsonProvider.class).to(GsonProvider.class).in(Singleton.class);
+            bind(WebApplicationExceptionMapper.class)
+                .to(WebApplicationExceptionMapper.class)
+                .in(Singleton.class);
+            bind(AdminService.class).to(AdminService.class).in(Singleton.class);
+            bind(ConfigurationService.class).to(ConfigurationService.class).in(Singleton.class);
+          }
+        });
+    packages("org.apache.zeppelin.rest");
   }
 
   public static void main(String[] args) throws InterruptedException {
@@ -243,12 +262,12 @@ public class ZeppelinServer extends Application {
     // Notebook server
     setupNotebookServer(webApp, conf);
 
-    //Below is commented since zeppelin-docs module is removed.
-    //final WebAppContext webAppSwagg = setupWebAppSwagger(conf);
+    // Below is commented since zeppelin-docs module is removed.
+    // final WebAppContext webAppSwagg = setupWebAppSwagger(conf);
 
     LOG.info("Starting zeppelin server");
     try {
-      jettyWebServer.start(); //Instantiates ZeppelinServer
+      jettyWebServer.start(); // Instantiates ZeppelinServer
       if (conf.getJettyName() != null) {
         org.eclipse.jetty.http.HttpGenerator.setJettyVersion(conf.getJettyName());
       }
@@ -258,22 +277,25 @@ public class ZeppelinServer extends Application {
     }
     LOG.info("Done, zeppelin server started");
 
-    Runtime.getRuntime().addShutdownHook(new Thread(){
-      @Override public void run() {
-        LOG.info("Shutting down Zeppelin Server ... ");
-        try {
-          jettyWebServer.stop();
-          if (!conf.isRecoveryEnabled()) {
-            ZeppelinServer.notebook.getInterpreterSettingManager().close();
-          }
-          notebook.close();
-          Thread.sleep(3000);
-        } catch (Exception e) {
-          LOG.error("Error while stopping servlet container", e);
-        }
-        LOG.info("Bye");
-      }
-    });
+    Runtime.getRuntime()
+        .addShutdownHook(
+            new Thread() {
+              @Override
+              public void run() {
+                LOG.info("Shutting down Zeppelin Server ... ");
+                try {
+                  jettyWebServer.stop();
+                  if (!conf.isRecoveryEnabled()) {
+                    ZeppelinServer.notebook.getInterpreterSettingManager().close();
+                  }
+                  notebook.close();
+                  Thread.sleep(3000);
+                } catch (Exception e) {
+                  LOG.error("Error while stopping servlet container", e);
+                }
+                LOG.info("Bye");
+              }
+            });
 
     // when zeppelin is started inside of ide (especially for eclipse)
     // for graceful shutdown, input any key in console window
@@ -312,7 +334,8 @@ public class ZeppelinServer extends Application {
       // src.setStsIncludeSubDomains(true);
       httpsConfig.addCustomizer(src);
 
-      connector = new ServerConnector(
+      connector =
+          new ServerConnector(
               server,
               new SslConnectionFactory(getSslContextFactory(conf), HttpVersion.HTTP_1_1.asString()),
               new HttpConnectionFactory(httpsConfig));
@@ -337,10 +360,10 @@ public class ZeppelinServer extends Application {
     return server;
   }
 
-  private static void configureRequestHeaderSize(ZeppelinConfiguration conf,
-          ServerConnector connector) {
-    HttpConnectionFactory cf = (HttpConnectionFactory)
-            connector.getConnectionFactory(HttpVersion.HTTP_1_1.toString());
+  private static void configureRequestHeaderSize(
+      ZeppelinConfiguration conf, ServerConnector connector) {
+    HttpConnectionFactory cf =
+        (HttpConnectionFactory) connector.getConnectionFactory(HttpVersion.HTTP_1_1.toString());
     int requestHeaderSize = conf.getJettyRequestHeaderSize();
     cf.getHttpConfiguration().setRequestHeaderSize(requestHeaderSize);
   }
@@ -351,8 +374,7 @@ public class ZeppelinServer extends Application {
     final ServletHolder servletHolder = new ServletHolder(notebookWsServer);
     servletHolder.setInitParameter("maxTextMessageSize", maxTextMessageSize);
 
-    final ServletContextHandler context = new ServletContextHandler(
-        ServletContextHandler.SESSIONS);
+    final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
 
     webapp.addServlet(servletHolder, "/ws/*");
   }
@@ -379,8 +401,8 @@ public class ZeppelinServer extends Application {
   }
 
   private static void setupRestApiContextHandler(WebAppContext webapp, ZeppelinConfiguration conf) {
-    final ServletHolder servletHolder = new ServletHolder(
-            new org.glassfish.jersey.servlet.ServletContainer());
+    final ServletHolder servletHolder =
+        new ServletHolder(new org.glassfish.jersey.servlet.ServletContainer());
 
     servletHolder.setInitParameter("javax.ws.rs.Application", ZeppelinServer.class.getName());
     servletHolder.setName("rest");
@@ -393,14 +415,15 @@ public class ZeppelinServer extends Application {
     if (!StringUtils.isBlank(shiroIniPath)) {
       webapp.setInitParameter("shiroConfigLocations", new File(shiroIniPath).toURI().toString());
       SecurityUtils.setIsEnabled(true);
-      webapp.addFilter(ShiroFilter.class, "/api/*", EnumSet.allOf(DispatcherType.class))
-              .setInitParameter("staticSecurityManagerEnabled", "true");
+      webapp
+          .addFilter(ShiroFilter.class, "/api/*", EnumSet.allOf(DispatcherType.class))
+          .setInitParameter("staticSecurityManagerEnabled", "true");
       webapp.addEventListener(new EnvironmentLoaderListener());
     }
   }
 
-  private static WebAppContext setupWebAppContext(ContextHandlerCollection contexts,
-          ZeppelinConfiguration conf) {
+  private static WebAppContext setupWebAppContext(
+      ContextHandlerCollection contexts, ZeppelinConfiguration conf) {
     WebAppContext webApp = new WebAppContext();
     webApp.setContextPath(conf.getServerContextPath());
     File warPath = new File(conf.getString(ConfVars.ZEPPELIN_WAR));
@@ -421,69 +444,15 @@ public class ZeppelinServer extends Application {
     webApp.addServlet(new ServletHolder(new DefaultServlet()), "/*");
     contexts.addHandler(webApp);
 
-    webApp.addFilter(new FilterHolder(CorsFilter.class), "/*",
-        EnumSet.allOf(DispatcherType.class));
+    webApp.addFilter(new FilterHolder(CorsFilter.class), "/*", EnumSet.allOf(DispatcherType.class));
 
-    webApp.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed",
-            Boolean.toString(conf.getBoolean(ConfVars.ZEPPELIN_SERVER_DEFAULT_DIR_ALLOWED)));
+    webApp.setInitParameter(
+        "org.eclipse.jetty.servlet.Default.dirAllowed",
+        Boolean.toString(conf.getBoolean(ConfVars.ZEPPELIN_SERVER_DEFAULT_DIR_ALLOWED)));
 
     return webApp;
   }
 
-  @Override
-  public Set<Class<?>> getClasses() {
-    Set<Class<?>> classes = new HashSet<>();
-
-    classes.add(GsonProvider.class);
-
-    classes.add(WebApplicationExceptionMapper.class);
-
-    return classes;
-  }
-
-  @Override
-  public Set<Object> getSingletons() {
-    Set<Object> singletons = new HashSet<>();
-
-    /* Rest-api root endpoint */
-    ZeppelinRestApi root = new ZeppelinRestApi();
-    singletons.add(root);
-
-    NotebookRestApi notebookApi = new NotebookRestApi(notebook, notebookWsServer,
-            noteSearchService);
-    singletons.add(notebookApi);
-
-    NotebookRepoRestApi notebookRepoApi = new NotebookRepoRestApi(notebookRepo, notebookWsServer);
-    singletons.add(notebookRepoApi);
-
-    HeliumRestApi heliumApi = new HeliumRestApi(helium, notebook);
-    singletons.add(heliumApi);
-
-    InterpreterRestApi interpreterApi = new InterpreterRestApi(interpreterService,
-        interpreterSettingManager, notebookWsServer);
-    singletons.add(interpreterApi);
-
-    CredentialRestApi credentialApi = new CredentialRestApi(credentials);
-    singletons.add(credentialApi);
-
-    SecurityRestApi securityApi = new SecurityRestApi();
-    singletons.add(securityApi);
-
-    LoginRestApi loginRestApi = new LoginRestApi();
-    singletons.add(loginRestApi);
-
-    ConfigurationsRestApi settingsApi = new ConfigurationsRestApi(
-        new ConfigurationService(notebook.getConf()));
-    singletons.add(settingsApi);
-
-    AdminService adminService = new AdminService();
-
-    AdminRestApi adminRestApi = new AdminRestApi(adminService);
-    singletons.add(adminRestApi);
-
-    return singletons;
-  }
-
   /**
    * Check if it is source build or binary package.
    *

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/service/ConfigurationService.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/service/ConfigurationService.java b/zeppelin-server/src/main/java/org/apache/zeppelin/service/ConfigurationService.java
index ef80080..280449b 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/service/ConfigurationService.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/service/ConfigurationService.java
@@ -18,6 +18,7 @@
 
 package org.apache.zeppelin.service;
 
+import javax.inject.Inject;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,6 +32,7 @@ public class ConfigurationService {
 
   private ZeppelinConfiguration zConf;
 
+  @Inject
   public ConfigurationService(ZeppelinConfiguration zConf) {
     this.zConf = zConf;
   }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/82b875cf/zeppelin-server/src/main/java/org/apache/zeppelin/service/InterpreterService.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/service/InterpreterService.java b/zeppelin-server/src/main/java/org/apache/zeppelin/service/InterpreterService.java
index 930189f..331f838 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/service/InterpreterService.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/service/InterpreterService.java
@@ -28,6 +28,7 @@ import java.nio.file.Paths;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import javax.inject.Inject;
 import jline.internal.Preconditions;
 import org.apache.commons.io.FileUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
@@ -54,6 +55,7 @@ public class InterpreterService {
   private final ZeppelinConfiguration conf;
   private final InterpreterSettingManager interpreterSettingManager;
 
+  @Inject
   public InterpreterService(
       ZeppelinConfiguration conf, InterpreterSettingManager interpreterSettingManager) {
     this.conf = conf;