You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2016/06/04 17:15:07 UTC

incubator-zeppelin git commit: [ZEPPELIN-809] Add annotation to public API

Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master 09bc8a36a -> 411b61210


[ZEPPELIN-809] Add annotation to public API

### What is this PR for?
Implement ZeppelinApi Experimental annotations and apply them in the public api.
Also mark deprecated global scope angular object methods

### What type of PR is it?
Feature

### Todos
* [x] - Implement ZeppelinApi, Experimental annotations
* [x] - Apply annotation to public Api
* [x] - Mark deprecated global scope angular object related methods

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

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

Author: Lee moon soo <mo...@apache.org>

Closes #940 from Leemoonsoo/ZEPPELIN-809 and squashes the following commits:

0927f55 [Lee moon soo] Add @ZeppelinApi to restapi endpoint
96734a6 [Lee moon soo] Correction
6a1e4d8 [Lee moon soo] Remove unnecessary annotation
989dd86 [Lee moon soo] Add annotation impl
50cfed8 [Lee moon soo] Add @ZeppelinApi @Experimental annotation and apply. Mark @deprecated for global scope angular displaysystem method


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

Branch: refs/heads/master
Commit: 411b61210d9f2999a0ed56bad8c3c03617f35a5e
Parents: 09bc8a3
Author: Lee moon soo <mo...@apache.org>
Authored: Thu Jun 2 10:01:27 2016 -0700
Committer: Lee moon soo <mo...@apache.org>
Committed: Sat Jun 4 10:16:25 2016 -0700

----------------------------------------------------------------------
 .../apache/zeppelin/spark/ZeppelinContext.java  | 42 +++++++++++++++++++-
 .../display/angular/AbstractAngularElem.scala   | 16 ++++++++
 .../display/angular/AbstractAngularModel.scala  | 12 +++++-
 .../zeppelin/annotation/Experimental.java       | 32 +++++++++++++++
 .../apache/zeppelin/annotation/ZeppelinApi.java | 31 +++++++++++++++
 .../zeppelin/interpreter/Interpreter.java       | 15 +++++++
 .../interpreter/InterpreterContext.java         |  2 +
 .../zeppelin/rest/ConfigurationsRestApi.java    |  3 ++
 .../zeppelin/rest/InterpreterRestApi.java       | 10 +++++
 .../org/apache/zeppelin/rest/LoginRestApi.java  |  3 ++
 .../apache/zeppelin/rest/NotebookRestApi.java   | 25 ++++++++++++
 .../apache/zeppelin/rest/SecurityRestApi.java   |  2 +
 .../apache/zeppelin/rest/ZeppelinRestApi.java   |  2 +
 .../zeppelin/notebook/repo/NotebookRepo.java    | 13 +++---
 14 files changed, 200 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
index b525e93..bd8f0a1 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
@@ -32,6 +32,7 @@ import org.apache.spark.SparkContext;
 import org.apache.spark.sql.SQLContext;
 import org.apache.spark.sql.catalyst.expressions.Attribute;
 import org.apache.spark.sql.hive.HiveContext;
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.display.AngularObject;
 import org.apache.zeppelin.display.AngularObjectRegistry;
 import org.apache.zeppelin.display.AngularObjectWatcher;
@@ -72,23 +73,28 @@ public class ZeppelinContext {
   public HiveContext hiveContext;
   private GUI gui;
 
+  @ZeppelinApi
   public Object input(String name) {
     return input(name, "");
   }
 
+  @ZeppelinApi
   public Object input(String name, Object defaultValue) {
     return gui.input(name, defaultValue);
   }
 
+  @ZeppelinApi
   public Object select(String name, scala.collection.Iterable<Tuple2<Object, String>> options) {
     return select(name, "", options);
   }
 
+  @ZeppelinApi
   public Object select(String name, Object defaultValue,
       scala.collection.Iterable<Tuple2<Object, String>> options) {
     return gui.select(name, defaultValue, tuplesToParamOptions(options));
   }
 
+  @ZeppelinApi
   public scala.collection.Iterable<Object> checkbox(String name,
       scala.collection.Iterable<Tuple2<Object, String>> options) {
     List<Object> allChecked = new LinkedList<Object>();
@@ -98,6 +104,7 @@ public class ZeppelinContext {
     return checkbox(name, collectionAsScalaIterable(allChecked), options);
   }
 
+  @ZeppelinApi
   public scala.collection.Iterable<Object> checkbox(String name,
       scala.collection.Iterable<Object> defaultChecked,
       scala.collection.Iterable<Tuple2<Object, String>> options) {
@@ -143,6 +150,7 @@ public class ZeppelinContext {
    * show DataFrame or SchemaRDD
    * @param o DataFrame or SchemaRDD object
    */
+  @ZeppelinApi
   public void show(Object o) {
     show(o, maxResult);
   }
@@ -152,6 +160,8 @@ public class ZeppelinContext {
    * @param o DataFrame or SchemaRDD object
    * @param maxResult maximum number of rows to display
    */
+
+  @ZeppelinApi
   public void show(Object o, int maxResult) {
     Class cls = null;
     try {
@@ -267,6 +277,7 @@ public class ZeppelinContext {
    * Run paragraph by id
    * @param id
    */
+  @ZeppelinApi
   public void run(String id) {
     run(id, interpreterContext);
   }
@@ -276,6 +287,7 @@ public class ZeppelinContext {
    * @param id
    * @param context
    */
+  @ZeppelinApi
   public void run(String id, InterpreterContext context) {
     if (id.equals(context.getParagraphId())) {
       throw new InterpreterException("Can not run current Paragraph");
@@ -295,6 +307,7 @@ public class ZeppelinContext {
    * Run paragraph at idx
    * @param idx
    */
+  @ZeppelinApi
   public void run(int idx) {
     run(idx, interpreterContext);
   }
@@ -317,6 +330,7 @@ public class ZeppelinContext {
     runner.run();
   }
 
+  @ZeppelinApi
   public void run(List<Object> paragraphIdOrIdx) {
     run(paragraphIdOrIdx, interpreterContext);
   }
@@ -325,6 +339,7 @@ public class ZeppelinContext {
    * Run paragraphs
    * @param paragraphIdOrIdx list of paragraph id or idx
    */
+  @ZeppelinApi
   public void run(List<Object> paragraphIdOrIdx, InterpreterContext context) {
     for (Object idOrIdx : paragraphIdOrIdx) {
       if (idOrIdx instanceof String) {
@@ -339,6 +354,7 @@ public class ZeppelinContext {
     }
   }
 
+  @ZeppelinApi
   public void runAll() {
     runAll(interpreterContext);
   }
@@ -346,6 +362,7 @@ public class ZeppelinContext {
   /**
    * Run all paragraphs. except this.
    */
+  @ZeppelinApi
   public void runAll(InterpreterContext context) {
     for (InterpreterContextRunner r : context.getRunners()) {
       if (r.getParagraphId().equals(context.getParagraphId())) {
@@ -356,6 +373,7 @@ public class ZeppelinContext {
     }
   }
 
+  @ZeppelinApi
   public List<String> listParagraphs() {
     List<String> paragraphs = new LinkedList<String>();
 
@@ -389,6 +407,7 @@ public class ZeppelinContext {
    * @param name variable name
    * @return value
    */
+  @ZeppelinApi
   public Object angular(String name) {
     AngularObject ao = getAngularObject(name, interpreterContext);
     if (ao == null) {
@@ -403,6 +422,7 @@ public class ZeppelinContext {
    * @param name variable name
    * @return value
    */
+  @Deprecated
   public Object angularGlobal(String name) {
     AngularObjectRegistry registry = interpreterContext.getAngularObjectRegistry();
     AngularObject ao = registry.get(name, null, null);
@@ -419,6 +439,7 @@ public class ZeppelinContext {
    * @param name name of the variable
    * @param o value
    */
+  @ZeppelinApi
   public void angularBind(String name, Object o) {
     angularBind(name, o, interpreterContext.getNoteId());
   }
@@ -429,6 +450,7 @@ public class ZeppelinContext {
    * @param name name of the variable
    * @param o value
    */
+  @Deprecated
   public void angularBindGlobal(String name, Object o) {
     angularBind(name, o, (String) null);
   }
@@ -440,6 +462,7 @@ public class ZeppelinContext {
    * @param o value
    * @param watcher watcher of the variable
    */
+  @ZeppelinApi
   public void angularBind(String name, Object o, AngularObjectWatcher watcher) {
     angularBind(name, o, interpreterContext.getNoteId(), watcher);
   }
@@ -451,6 +474,7 @@ public class ZeppelinContext {
    * @param o value
    * @param watcher watcher of the variable
    */
+  @Deprecated
   public void angularBindGlobal(String name, Object o, AngularObjectWatcher watcher) {
     angularBind(name, o, null, watcher);
   }
@@ -460,6 +484,7 @@ public class ZeppelinContext {
    * @param name name of the variable
    * @param watcher watcher
    */
+  @ZeppelinApi
   public void angularWatch(String name, AngularObjectWatcher watcher) {
     angularWatch(name, interpreterContext.getNoteId(), watcher);
   }
@@ -469,27 +494,31 @@ public class ZeppelinContext {
    * @param name name of the variable
    * @param watcher watcher
    */
+  @Deprecated
   public void angularWatchGlobal(String name, AngularObjectWatcher watcher) {
     angularWatch(name, null, watcher);
   }
 
-
+  @ZeppelinApi
   public void angularWatch(String name,
       final scala.Function2<Object, Object, Unit> func) {
     angularWatch(name, interpreterContext.getNoteId(), func);
   }
 
+  @Deprecated
   public void angularWatchGlobal(String name,
       final scala.Function2<Object, Object, Unit> func) {
     angularWatch(name, null, func);
   }
 
+  @ZeppelinApi
   public void angularWatch(
       String name,
       final scala.Function3<Object, Object, InterpreterContext, Unit> func) {
     angularWatch(name, interpreterContext.getNoteId(), func);
   }
 
+  @Deprecated
   public void angularWatchGlobal(
       String name,
       final scala.Function3<Object, Object, InterpreterContext, Unit> func) {
@@ -501,6 +530,7 @@ public class ZeppelinContext {
    * @param name
    * @param watcher
    */
+  @ZeppelinApi
   public void angularUnwatch(String name, AngularObjectWatcher watcher) {
     angularUnwatch(name, interpreterContext.getNoteId(), watcher);
   }
@@ -510,6 +540,7 @@ public class ZeppelinContext {
    * @param name
    * @param watcher
    */
+  @Deprecated
   public void angularUnwatchGlobal(String name, AngularObjectWatcher watcher) {
     angularUnwatch(name, null, watcher);
   }
@@ -519,6 +550,7 @@ public class ZeppelinContext {
    * Remove all watchers for the angular variable (local)
    * @param name
    */
+  @ZeppelinApi
   public void angularUnwatch(String name) {
     angularUnwatch(name, interpreterContext.getNoteId());
   }
@@ -527,6 +559,7 @@ public class ZeppelinContext {
    * Remove all watchers for the angular variable (global)
    * @param name
    */
+  @Deprecated
   public void angularUnwatchGlobal(String name) {
     angularUnwatch(name, (String) null);
   }
@@ -535,6 +568,7 @@ public class ZeppelinContext {
    * Remove angular variable and all the watchers.
    * @param name
    */
+  @ZeppelinApi
   public void angularUnbind(String name) {
     String noteId = interpreterContext.getNoteId();
     angularUnbind(name, noteId);
@@ -544,6 +578,7 @@ public class ZeppelinContext {
    * Remove angular variable and all the watchers.
    * @param name
    */
+  @Deprecated
   public void angularUnbindGlobal(String name) {
     angularUnbind(name, null);
   }
@@ -661,6 +696,7 @@ public class ZeppelinContext {
    * @param name
    * @param value
    */
+  @ZeppelinApi
   public void put(String name, Object value) {
     ResourcePool resourcePool = interpreterContext.getResourcePool();
     resourcePool.put(name, value);
@@ -672,6 +708,7 @@ public class ZeppelinContext {
    * @param name
    * @return null if resource not found
    */
+  @ZeppelinApi
   public Object get(String name) {
     ResourcePool resourcePool = interpreterContext.getResourcePool();
     Resource resource = resourcePool.get(name);
@@ -686,6 +723,7 @@ public class ZeppelinContext {
    * Remove object from resourcePool
    * @param name
    */
+  @ZeppelinApi
   public void remove(String name) {
     ResourcePool resourcePool = interpreterContext.getResourcePool();
     resourcePool.remove(name);
@@ -696,6 +734,7 @@ public class ZeppelinContext {
    * @param name
    * @return
    */
+  @ZeppelinApi
   public boolean containsKey(String name) {
     ResourcePool resourcePool = interpreterContext.getResourcePool();
     Resource resource = resourcePool.get(name);
@@ -705,6 +744,7 @@ public class ZeppelinContext {
   /**
    * Get all resources
    */
+  @ZeppelinApi
   public ResourceSet getAll() {
     ResourcePool resourcePool = interpreterContext.getResourcePool();
     return resourcePool.getAll();

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularElem.scala
----------------------------------------------------------------------
diff --git a/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularElem.scala b/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularElem.scala
index 80e3699..cb6a567 100644
--- a/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularElem.scala
+++ b/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularElem.scala
@@ -18,6 +18,7 @@ package org.apache.zeppelin.display.angular
 
 import java.io.PrintStream
 
+import org.apache.zeppelin.annotation.ZeppelinApi
 import org.apache.zeppelin.display.{AngularObjectWatcher, AngularObject}
 import org.apache.zeppelin.interpreter.{InterpreterResult, InterpreterContext}
 
@@ -41,28 +42,34 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
 
   /**
     * On click element
+ *
     * @param callback
     * @return
     */
+  @ZeppelinApi
   def onClick(callback: () => Unit): AbstractAngularElem = {
     onEvent("ng-click", callback)
   }
 
   /**
     * On
+ *
     * @param callback
     * @return
     */
+  @ZeppelinApi
   def onChange(callback: () => Unit): AbstractAngularElem = {
     onEvent("ng-change", callback)
   }
 
   /**
     * Bind angularObject to ng-model directive
+ *
     * @param name name of angularObject
     * @param value initialValue
     * @return
     */
+  @ZeppelinApi
   def model(name: String, value: Any): AbstractAngularElem = {
     val registry = interpreterContext.getAngularObjectRegistry
 
@@ -82,6 +89,7 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
   }
 
 
+  @ZeppelinApi
   def model(name: String): AbstractAngularElem = {
     val registry = interpreterContext.getAngularObjectRegistry
 
@@ -99,8 +107,10 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
 
   /**
     * Retrieve value of model
+    *
     * @return
     */
+  @ZeppelinApi
   def model(): Any = {
     if (angularObjects.contains(modelName)) {
       angularObjects(modelName).get()
@@ -114,6 +124,7 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
     * @param eventName angular directive like ng-click, ng-change, etc.
     * @return
     */
+  @ZeppelinApi
   def onEvent(eventName: String, callback: () => Unit): AbstractAngularElem = {
     val registry = interpreterContext.getAngularObjectRegistry
 
@@ -151,12 +162,14 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
     * disassociate this element and it's child from front-end
     * by removing angularobject
     */
+  @ZeppelinApi
   def disassociate() = {
     remove(this)
   }
 
   /**
     * Remove all angularObject recursively
+    *
     * @param node
     */
   private def remove(node: Node): Unit = {
@@ -172,8 +185,10 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
 
   /**
     * Print into provided print stream
+    *
     * @return
     */
+  @ZeppelinApi
   def display(out: java.io.PrintStream): Unit = {
     out.print(this.toString)
     out.flush()
@@ -182,6 +197,7 @@ abstract class AbstractAngularElem(val interpreterContext: InterpreterContext,
   /**
     * Print into InterpreterOutput
     */
+  @ZeppelinApi
   def display(): Unit = {
     val out = interpreterContext.out
     out.setType(InterpreterResult.Type.ANGULAR)

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularModel.scala
----------------------------------------------------------------------
diff --git a/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularModel.scala b/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularModel.scala
index ff50438..de9b2b3 100644
--- a/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularModel.scala
+++ b/zeppelin-display/src/main/scala/org/apache/zeppelin/display/angular/AbstractAngularModel.scala
@@ -16,6 +16,7 @@
  */
 package org.apache.zeppelin.display.angular
 
+import org.apache.zeppelin.annotation.ZeppelinApi
 import org.apache.zeppelin.display.AngularObject
 import org.apache.zeppelin.interpreter.InterpreterContext
 
@@ -29,9 +30,11 @@ abstract class AbstractAngularModel(name: String) {
 
   /**
     * Create AngularModel with initial Value
+    *
     * @param name name of model
     * @param newValue value
     */
+  @ZeppelinApi
   def this(name: String, newValue: Any) = {
     this(name)
     value(newValue)
@@ -42,16 +45,20 @@ abstract class AbstractAngularModel(name: String) {
 
   /**
     * Get value of the model
+    *
     * @return
     */
+  @ZeppelinApi
   def apply(): Any = {
     value()
   }
 
   /**
     * Get value of the model
+    *
     * @return
     */
+  @ZeppelinApi
   def value(): Any = {
     val angularObject = getAngularObject()
     if (angularObject == null) {
@@ -61,7 +68,7 @@ abstract class AbstractAngularModel(name: String) {
     }
   }
 
-
+  @ZeppelinApi
   def apply(newValue: Any): Unit = {
     value(newValue)
   }
@@ -69,8 +76,10 @@ abstract class AbstractAngularModel(name: String) {
 
   /**
     * Set value of the model
+    *
     * @param newValue
     */
+  @ZeppelinApi
   def value(newValue: Any): Unit = {
     var angularObject = getAngularObject()
     if (angularObject == null) {
@@ -82,6 +91,7 @@ abstract class AbstractAngularModel(name: String) {
     angularObject.get()
   }
 
+  @ZeppelinApi
   def remove(): Any = {
     val angularObject = getAngularObject()
 

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/Experimental.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/Experimental.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/Experimental.java
new file mode 100644
index 0000000..c21ea43
--- /dev/null
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/Experimental.java
@@ -0,0 +1,32 @@
+/*
+ * 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.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Experimental API
+ * Might change or be removed at anytime, or be adopted as ZeppelinApi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
+    ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE, ElementType.PACKAGE})
+public @interface Experimental {
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/ZeppelinApi.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/ZeppelinApi.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/ZeppelinApi.java
new file mode 100644
index 0000000..e4a45ee
--- /dev/null
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/annotation/ZeppelinApi.java
@@ -0,0 +1,31 @@
+/*
+ * 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.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * APIs exposed to extends pluggable components or exposed to enduser
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
+    ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE, ElementType.PACKAGE})
+public @interface ZeppelinApi {
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
index 62155ee..1f91938 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Properties;
 
 import com.google.gson.annotations.SerializedName;
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.scheduler.Scheduler;
 import org.apache.zeppelin.scheduler.SchedulerFactory;
 import org.slf4j.Logger;
@@ -49,12 +50,14 @@ public abstract class Interpreter {
    * Opens interpreter. You may want to place your initialize routine here.
    * open() is called only once
    */
+  @ZeppelinApi
   public abstract void open();
 
   /**
    * Closes interpreter. You may want to free your resources up here.
    * close() is called only once
    */
+  @ZeppelinApi
   public abstract void close();
 
   /**
@@ -64,6 +67,7 @@ public abstract class Interpreter {
    * @param context
    * @return
    */
+  @ZeppelinApi
   public abstract InterpreterResult interpret(String st, InterpreterContext context);
 
   /**
@@ -71,6 +75,7 @@ public abstract class Interpreter {
    *
    * @param context
    */
+  @ZeppelinApi
   public abstract void cancel(InterpreterContext context);
 
   /**
@@ -80,6 +85,7 @@ public abstract class Interpreter {
    * @return FormType.SIMPLE enables simple pattern replacement (eg. Hello ${name=world}),
    *         FormType.NATIVE handles form in API
    */
+  @ZeppelinApi
   public abstract FormType getFormType();
 
   /**
@@ -88,6 +94,7 @@ public abstract class Interpreter {
    * @param context
    * @return number between 0-100
    */
+  @ZeppelinApi
   public abstract int getProgress(InterpreterContext context);
 
   /**
@@ -98,6 +105,7 @@ public abstract class Interpreter {
    * @param cursor cursor position in statements
    * @return list of possible completion. Return empty list if there're nothing to return.
    */
+  @ZeppelinApi
   public abstract List<String> completion(String buf, int cursor);
 
   /**
@@ -114,6 +122,7 @@ public abstract class Interpreter {
    *         This method can be called multiple times and have to return the same instance.
    *         Can not return null.
    */
+  @ZeppelinApi
   public Scheduler getScheduler() {
     return SchedulerFactory.singleton().createOrGetFIFOScheduler("interpreter_" + this.hashCode());
   }
@@ -121,6 +130,7 @@ public abstract class Interpreter {
   /**
    * Called when interpreter is no longer used.
    */
+  @ZeppelinApi
   public void destroy() {
   }
 
@@ -129,6 +139,7 @@ public abstract class Interpreter {
   private URL [] classloaderUrls;
   protected Properties property;
 
+  @ZeppelinApi
   public Interpreter(Properties property) {
     logger.debug("Properties: {}", property);
     this.property = property;
@@ -138,6 +149,7 @@ public abstract class Interpreter {
     this.property = property;
   }
 
+  @ZeppelinApi
   public Properties getProperty() {
     Properties p = new Properties();
     p.putAll(property);
@@ -159,6 +171,7 @@ public abstract class Interpreter {
     return p;
   }
 
+  @ZeppelinApi
   public String getProperty(String key) {
     logger.debug("key: {}, value: {}", key, getProperty().getProperty(key));
 
@@ -174,6 +187,7 @@ public abstract class Interpreter {
     this.interpreterGroup = interpreterGroup;
   }
 
+  @ZeppelinApi
   public InterpreterGroup getInterpreterGroup() {
     return this.interpreterGroup;
   }
@@ -186,6 +200,7 @@ public abstract class Interpreter {
     this.classloaderUrls = classloaderUrls;
   }
 
+  @ZeppelinApi
   public Interpreter getInterpreterInTheSameSessionByClassName(String className) {
     synchronized (interpreterGroup) {
       for (List<Interpreter> interpreters : interpreterGroup.values()) {

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
index 72c7dea..21ca2e6 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java
@@ -20,6 +20,7 @@ package org.apache.zeppelin.interpreter;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.display.AngularObjectRegistry;
 import org.apache.zeppelin.user.AuthenticationInfo;
 import org.apache.zeppelin.display.GUI;
@@ -31,6 +32,7 @@ import org.apache.zeppelin.resource.ResourcePool;
 public class InterpreterContext {
   private static final ThreadLocal<InterpreterContext> threadIC =
       new ThreadLocal<InterpreterContext>();
+
   public final InterpreterOutput out;
 
   public static InterpreterContext get() {

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/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 43ecd70..68cffed 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
@@ -17,6 +17,7 @@
 
 package org.apache.zeppelin.rest;
 
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.notebook.Notebook;
 import org.apache.zeppelin.server.JsonResponse;
@@ -46,6 +47,7 @@ public class ConfigurationsRestApi {
 
   @GET
   @Path("all")
+  @ZeppelinApi
   public Response getAll() {
     ZeppelinConfiguration conf = notebook.getConf();
 
@@ -67,6 +69,7 @@ public class ConfigurationsRestApi {
 
   @GET
   @Path("prefix/{prefix}")
+  @ZeppelinApi
   public Response getByPrefix(@PathParam("prefix") final String prefix) {
     ZeppelinConfiguration conf = notebook.getConf();
 

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/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 6430973..9af0a60 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
@@ -33,6 +33,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.dep.Repository;
 import org.apache.zeppelin.interpreter.*;
 import org.apache.zeppelin.interpreter.Interpreter.RegisteredInterpreter;
@@ -73,6 +74,7 @@ public class InterpreterRestApi {
    */
   @GET
   @Path("setting")
+  @ZeppelinApi
   public Response listSettings() {
     List<InterpreterSetting> interpreterSettings = null;
     interpreterSettings = interpreterFactory.get();
@@ -88,6 +90,7 @@ public class InterpreterRestApi {
    */
   @POST
   @Path("setting")
+  @ZeppelinApi
   public Response newSettings(String message) {
     try {
       NewInterpreterSettingRequest request = gson.fromJson(message,
@@ -118,6 +121,7 @@ public class InterpreterRestApi {
 
   @PUT
   @Path("setting/{settingId}")
+  @ZeppelinApi
   public Response updateSetting(String message, @PathParam("settingId") String settingId) {
     logger.info("Update interpreterSetting {}", settingId);
 
@@ -149,6 +153,7 @@ public class InterpreterRestApi {
    */
   @DELETE
   @Path("setting/{settingId}")
+  @ZeppelinApi
   public Response removeSetting(@PathParam("settingId") String settingId) throws IOException {
     logger.info("Remove interpreterSetting {}", settingId);
     interpreterFactory.remove(settingId);
@@ -160,6 +165,7 @@ public class InterpreterRestApi {
    */
   @PUT
   @Path("setting/restart/{settingId}")
+  @ZeppelinApi
   public Response restartSetting(@PathParam("settingId") String settingId) {
     logger.info("Restart interpreterSetting {}", settingId);
     try {
@@ -180,6 +186,7 @@ public class InterpreterRestApi {
    * List all available interpreters by group
    */
   @GET
+  @ZeppelinApi
   public Response listInterpreter(String message) {
     Map<String, RegisteredInterpreter> m = Interpreter.registeredInterpreters;
     return new JsonResponse(Status.OK, "", m).build();
@@ -191,6 +198,7 @@ public class InterpreterRestApi {
    */
   @GET
   @Path("repository")
+  @ZeppelinApi
   public Response listRepositories() {
     List<RemoteRepository> interpreterRepositories = null;
     interpreterRepositories = interpreterFactory.getRepositories();
@@ -204,6 +212,7 @@ public class InterpreterRestApi {
    */
   @POST
   @Path("repository")
+  @ZeppelinApi
   public Response addRepository(String message) {
     try {
       Repository request = gson.fromJson(message, Repository.class);
@@ -228,6 +237,7 @@ public class InterpreterRestApi {
    */
   @DELETE
   @Path("repository/{repoId}")
+  @ZeppelinApi
   public Response removeRepository(@PathParam("repoId") String repoId) {
     logger.info("Remove repository {}", repoId);
     try {

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/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 0069d47..0b9c9a6 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
@@ -19,6 +19,7 @@ package org.apache.zeppelin.rest;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.session.Session;
 import org.apache.shiro.subject.Subject;
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.server.JsonResponse;
 import org.apache.zeppelin.ticket.TicketContainer;
 import org.apache.zeppelin.utils.SecurityUtils;
@@ -60,6 +61,7 @@ public class LoginRestApi {
    * @return 200 response
    */
   @POST
+  @ZeppelinApi
   public Response postLogin(@FormParam("userName") String userName,
                             @FormParam("password") String password) {
     JsonResponse response = null;
@@ -113,6 +115,7 @@ public class LoginRestApi {
   
   @POST
   @Path("logout")
+  @ZeppelinApi
   public Response logout() {
     JsonResponse response;
     

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/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 89e84ee..6c50ee4 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
@@ -32,6 +32,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.interpreter.InterpreterSetting;
 import org.apache.zeppelin.notebook.Note;
 import org.apache.zeppelin.notebook.Notebook;
@@ -83,6 +84,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("{noteId}/permissions")
+  @ZeppelinApi
   public Response getNotePermissions(@PathParam("noteId") String noteId) {
     Note note = notebook.getNote(noteId);
     HashMap<String, Set<String>> permissionsMap = new HashMap();
@@ -106,6 +108,7 @@ public class NotebookRestApi {
    */
   @PUT
   @Path("{noteId}/permissions")
+  @ZeppelinApi
   public Response putNotePermissions(@PathParam("noteId") String noteId, String req)
       throws IOException {
     HashMap<String, HashSet> permMap = gson.fromJson(req,
@@ -166,6 +169,7 @@ public class NotebookRestApi {
    */
   @PUT
   @Path("interpreter/bind/{noteId}")
+  @ZeppelinApi
   public Response bind(@PathParam("noteId") String noteId, String req) throws IOException {
     List<String> settingIdList = gson.fromJson(req, new TypeToken<List<String>>(){}.getType());
     notebook.bindInterpretersToNote(noteId, settingIdList);
@@ -177,6 +181,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("interpreter/bind/{noteId}")
+  @ZeppelinApi
   public Response bind(@PathParam("noteId") String noteId) {
     List<InterpreterSettingListForNoteBind> settingList
       = new LinkedList<InterpreterSettingListForNoteBind>();
@@ -217,6 +222,7 @@ public class NotebookRestApi {
 
   @GET
   @Path("/")
+  @ZeppelinApi
   public Response getNotebookList() throws IOException {
     List<Map<String, String>> notesInfo = notebookServer.generateNotebooksInfo(false);
     return new JsonResponse<>(Status.OK, "", notesInfo ).build();
@@ -224,6 +230,7 @@ public class NotebookRestApi {
 
   @GET
   @Path("{notebookId}")
+  @ZeppelinApi
   public Response getNotebook(@PathParam("notebookId") String notebookId) throws IOException {
     Note note = notebook.getNote(notebookId);
     if (note == null) {
@@ -242,6 +249,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("export/{id}")
+  @ZeppelinApi
   public Response exportNoteBook(@PathParam("id") String noteId) throws IOException {
     String exportJson = notebook.exportNote(noteId);
     return new JsonResponse(Status.OK, "", exportJson).build();
@@ -256,6 +264,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("import")
+  @ZeppelinApi
   public Response importNotebook(String req) throws IOException {
     Note newNote = notebook.importNote(req, null);
     return new JsonResponse<>(Status.CREATED, "", newNote.getId()).build();
@@ -269,6 +278,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("/")
+  @ZeppelinApi
   public Response createNote(String message) throws IOException {
     LOG.info("Create new notebook by JSON {}" , message);
     NewNotebookRequest request = gson.fromJson(message,
@@ -302,6 +312,7 @@ public class NotebookRestApi {
    */
   @DELETE
   @Path("{notebookId}")
+  @ZeppelinApi
   public Response deleteNote(@PathParam("notebookId") String notebookId) throws IOException {
     LOG.info("Delete notebook {} ", notebookId);
     if (!(notebookId.isEmpty())) {
@@ -322,6 +333,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("{notebookId}")
+  @ZeppelinApi
   public Response cloneNote(@PathParam("notebookId") String notebookId, String message) throws
       IOException, CloneNotSupportedException, IllegalArgumentException {
     LOG.info("clone notebook by JSON {}" , message);
@@ -342,6 +354,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("{notebookId}/paragraph")
+  @ZeppelinApi
   public Response insertParagraph(@PathParam("notebookId") String notebookId, String message)
       throws IOException {
     LOG.info("insert paragraph {} {}", notebookId, message);
@@ -376,6 +389,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("{notebookId}/paragraph/{paragraphId}")
+  @ZeppelinApi
   public Response getParagraph(@PathParam("notebookId") String notebookId,
                                @PathParam("paragraphId") String paragraphId) throws IOException {
     LOG.info("get paragraph {} {}", notebookId, paragraphId);
@@ -401,6 +415,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("{notebookId}/paragraph/{paragraphId}/move/{newIndex}")
+  @ZeppelinApi
   public Response moveParagraph(@PathParam("notebookId") String notebookId,
                                 @PathParam("paragraphId") String paragraphId,
                                 @PathParam("newIndex") String newIndex) throws IOException {
@@ -436,6 +451,7 @@ public class NotebookRestApi {
    */
   @DELETE
   @Path("{notebookId}/paragraph/{paragraphId}")
+  @ZeppelinApi
   public Response deleteParagraph(@PathParam("notebookId") String notebookId,
                                   @PathParam("paragraphId") String paragraphId) throws IOException {
     LOG.info("delete paragraph {} {}", notebookId, paragraphId);
@@ -465,6 +481,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("job/{notebookId}")
+  @ZeppelinApi
   public Response runNoteJobs(@PathParam("notebookId") String notebookId) throws
       IOException, IllegalArgumentException {
     LOG.info("run notebook jobs {} ", notebookId);
@@ -485,6 +502,7 @@ public class NotebookRestApi {
    */
   @DELETE
   @Path("job/{notebookId}")
+  @ZeppelinApi
   public Response stopNoteJobs(@PathParam("notebookId") String notebookId) throws
       IOException, IllegalArgumentException {
     LOG.info("stop notebook jobs {} ", notebookId);
@@ -509,6 +527,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("job/{notebookId}")
+  @ZeppelinApi
   public Response getNoteJobStatus(@PathParam("notebookId") String notebookId) throws
       IOException, IllegalArgumentException {
     LOG.info("get notebook job status.");
@@ -531,6 +550,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("job/{notebookId}/{paragraphId}")
+  @ZeppelinApi
   public Response runParagraph(@PathParam("notebookId") String notebookId, 
                                @PathParam("paragraphId") String paragraphId,
                                String message) throws
@@ -570,6 +590,7 @@ public class NotebookRestApi {
    */
   @DELETE
   @Path("job/{notebookId}/{paragraphId}")
+  @ZeppelinApi
   public Response stopParagraph(@PathParam("notebookId") String notebookId, 
                                 @PathParam("paragraphId") String paragraphId) throws
                                 IOException, IllegalArgumentException {
@@ -595,6 +616,7 @@ public class NotebookRestApi {
    */
   @POST
   @Path("cron/{notebookId}")
+  @ZeppelinApi
   public Response registerCronJob(@PathParam("notebookId") String notebookId, String message) throws
       IOException, IllegalArgumentException {
     LOG.info("Register cron job note={} request cron msg={}", notebookId, message);
@@ -627,6 +649,7 @@ public class NotebookRestApi {
    */
   @DELETE
   @Path("cron/{notebookId}")
+  @ZeppelinApi
   public Response removeCronJob(@PathParam("notebookId") String notebookId) throws
       IOException, IllegalArgumentException {
     LOG.info("Remove cron job note {}", notebookId);
@@ -652,6 +675,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("cron/{notebookId}")
+  @ZeppelinApi
   public Response getCronJob(@PathParam("notebookId") String notebookId) throws
       IOException, IllegalArgumentException {
     LOG.info("Get cron job note {}", notebookId);
@@ -669,6 +693,7 @@ public class NotebookRestApi {
    */
   @GET
   @Path("search")
+  @ZeppelinApi
   public Response search(@QueryParam("q") String queryTerm) {
     LOG.info("Searching notebooks for: {}", queryTerm);
     String principal = SecurityUtils.getPrincipal();

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/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 905eb2b..342cb00 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
@@ -17,6 +17,7 @@
 
 package org.apache.zeppelin.rest;
 
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.server.JsonResponse;
 import org.apache.zeppelin.ticket.TicketContainer;
@@ -58,6 +59,7 @@ public class SecurityRestApi {
    */
   @GET
   @Path("ticket")
+  @ZeppelinApi
   public Response ticket() {
     ZeppelinConfiguration conf = ZeppelinConfiguration.create();
     String principal = SecurityUtils.getPrincipal();

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/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 ca42e34..9d9f551 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
@@ -17,6 +17,7 @@
 
 package org.apache.zeppelin.rest;
 
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.server.JsonResponse;
 import org.apache.zeppelin.util.Util;
 
@@ -47,6 +48,7 @@ public class ZeppelinRestApi {
 
   @GET
   @Path("version")
+  @ZeppelinApi
   public Response getVersion() {
     return new JsonResponse<>(Response.Status.OK, "Zeppelin version", Util.getVersion()).build();
   }

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/411b6121/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java
index d135032..7608892 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java
@@ -20,6 +20,7 @@ package org.apache.zeppelin.notebook.repo;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.notebook.Note;
 import org.apache.zeppelin.notebook.NoteInfo;
 
@@ -27,18 +28,18 @@ import org.apache.zeppelin.notebook.NoteInfo;
  * Notebook repository (persistence layer) abstraction
  */
 public interface NotebookRepo {
-  public List<NoteInfo> list() throws IOException;
-  public Note get(String noteId) throws IOException;
-  public void save(Note note) throws IOException;
-  public void remove(String noteId) throws IOException;
+  @ZeppelinApi public List<NoteInfo> list() throws IOException;
+  @ZeppelinApi public Note get(String noteId) throws IOException;
+  @ZeppelinApi public void save(Note note) throws IOException;
+  @ZeppelinApi public void remove(String noteId) throws IOException;
 
   /**
    * Release any underlying resources
    */
-  public void close();
+  @ZeppelinApi public void close();
 
   /**
    * chekpoint (versioning) for notebooks (optional)
    */
-  public void checkpoint(String noteId, String checkPointName) throws IOException;
+  @ZeppelinApi public void checkpoint(String noteId, String checkPointName) throws IOException;
 }