Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master 7ba743eec -> 7ddf810ef


Add argument check for option and properties to protect from NPE

Here is the repro steps:
    1) run zeppelin
    2) using some REST client call the update settings with the following JSON
    
{"id":"2AVJY1M6F","name":"md","group":"md","properties":{"propname":"propvalue"},"interpreterGroup":[{"class":"org.apache.zeppelin.markdown.Markdown","name":"md"}]}
    - NOTE that I intentionally omitted the option part
    3) Now look at the log file:
    INFO [2015-08-19 09:14:13,106] ({qtp2095490653-44}
    InterpreterRestApi.java[updateSetting]:111) - Update interpreterSetting
    2AVGGNEKP
     WARN [2015-08-19 09:14:13,121] ({qtp2095490653-44}
    LogUtils.java[doLog]:452) - Application {
    http://rest.zeppelin.apache.org/}NotebookRestApi has thrown exception,
    unwinding now
    org.apache.cxf.interceptor.Fault
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:192)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)
    at
    
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at
    
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at
    
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at
    
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
    at
    
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPut(AbstractHTTPServlet.java:223)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:598)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at org.apache.zeppelin.server.CorsFilter.doFilter(CorsFilter.java:53)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
    at
    org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at
    
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at
    
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at
    
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at
    
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.NullPointerException
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.createInterpreterGroup(InterpreterFactory.java:361)
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.setPropertyAndRestart(InterpreterFactory.java:515)
    at
    
org.apache.zeppelin.rest.InterpreterRestApi.updateSetting(InterpreterRestApi.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
    
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at
    
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 40 more
     WARN [2015-08-19 09:14:13,239] ({qtp2095490653-44}
    PhaseInterceptorChain.java[unwind]:444) - Exception in handleFault on
    interceptor
    org.apache.cxf.binding.xml.interceptor.XMLFaultOutInterceptor51637100
    org.apache.cxf.interceptor.Fault
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:192)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)
    at
    
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at
    
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at
    
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at
    
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
    at
    
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPut(AbstractHTTPServlet.java:223)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:598)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at org.apache.zeppelin.server.CorsFilter.doFilter(CorsFilter.java:53)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
    at
    org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at
    
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at
    
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at
    
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at
    
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.NullPointerException
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.createInterpreterGroup(InterpreterFactory.java:361)
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.setPropertyAndRestart(InterpreterFactory.java:515)
    at
    
org.apache.zeppelin.rest.InterpreterRestApi.updateSetting(InterpreterRestApi.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
    
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at
    
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 40 more
    ERROR [2015-08-19 09:14:13,242] ({qtp2095490653-44}
    AbstractFaultChainInitiatorObserver.java[onMessage]:115) - Error occurred
    during error handling, give up!
    org.apache.cxf.interceptor.Fault
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:192)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)
    at
    
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at
    
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at
    
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at
    
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
    at
    
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPut(AbstractHTTPServlet.java:223)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:598)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at org.apache.zeppelin.server.CorsFilter.doFilter(CorsFilter.java:53)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
    at
    org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at
    
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at
    
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at
    
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at
    
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.NullPointerException
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.createInterpreterGroup(InterpreterFactory.java:361)
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.setPropertyAndRestart(InterpreterFactory.java:515)
    at
    
org.apache.zeppelin.rest.InterpreterRestApi.updateSetting(InterpreterRestApi.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
    
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at
    
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 40 more
     WARN [2015-08-19 09:14:13,245] ({qtp2095490653-44}
    ServletHandler.java[doHandle]:561) - /api/interpreter/setting/2AVGGNEKP
    java.lang.RuntimeException: org.apache.cxf.interceptor.Fault
    at
    
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116)
    at
    
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:333)
    at
    
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at
    
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
    at
    
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
    at
    
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
    at
    
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPut(AbstractHTTPServlet.java:223)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:598)
    at
    
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at org.apache.zeppelin.server.CorsFilter.doFilter(CorsFilter.java:53)
    at
    
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)
    at
    org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
    at
    
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at
    
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at
    
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at
    
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at
    
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at
    
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at
    
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
    at
    
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at
    
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.cxf.interceptor.Fault
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:192)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
    at
    
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)
    at
    
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    ... 35 more
    Caused by:* java.lang.NullPointerException*
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.createInterpreterGroup(InterpreterFactory.java:361)
    at
    
org.apache.zeppelin.interpreter.InterpreterFactory.setPropertyAndRestart(InterpreterFactory.java:515)
    at
    
org.apache.zeppelin.rest.InterpreterRestApi.updateSetting(InterpreterRestApi.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
    
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at
    
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
    at
    
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 40 more

    This is because we are trying to access the option variable when it is NULL
This PR fixes that and add test to check it.
This replace PR 223.
Ready for review

Author: eranwitkon <[email protected]>

Closes #241 from eranwitkon/255 and squashes the following commits:

b463100 [eranwitkon] Remove unit test
6075a66 [eranwitkon] fix CI problem
1aa806f [eranwitkon] Fix CI problem
da0717f [eranwitkon] Fix getRegisteredInterpreterList, avoid adding null to the 
list when class name from config is not registered (only interpreters available 
on the disk (has interpreter folder) are registered. 
findRegisteredInterpreterByClassName return null when class name not found. 
(cherry picked from commit 6724e54)
f863871 [eranwitkon] Add argument check for option and properties to protect 
from NPE (cherry picked from commit 39ac2c1)


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

Branch: refs/heads/master
Commit: 7ddf810ef802cc449c1f5cd6e9664883f1a5477e
Parents: 7ba743e
Author: eranwitkon <[email protected]>
Authored: Sat Aug 22 10:18:25 2015 +0300
Committer: Lee moon soo <[email protected]>
Committed: Sun Aug 23 19:46:58 2015 -0700

----------------------------------------------------------------------
 zeppelin-web/test/karma.conf.js                 |  3 ++-
 .../interpreter/InterpreterFactory.java         | 18 ++++++++++++++----
 .../interpreter/InterpreterFactoryTest.java     | 20 +++++++++++++++++++-
 3 files changed, 35 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7ddf810e/zeppelin-web/test/karma.conf.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/test/karma.conf.js b/zeppelin-web/test/karma.conf.js
index e85abdb..ffbc996 100644
--- a/zeppelin-web/test/karma.conf.js
+++ b/zeppelin-web/test/karma.conf.js
@@ -35,9 +35,10 @@ module.exports = function(config) {
       'bower_components/ace-builds/src-noconflict/mode-scala.js',
       'bower_components/ace-builds/src-noconflict/mode-sql.js',
       'bower_components/ace-builds/src-noconflict/mode-markdown.js',
+      'bower_components/ace-builds/src-noconflict/mode-sh.js',
       'bower_components/ace-builds/src-noconflict/keybinding-emacs.js',
       'bower_components/ace-builds/src-noconflict/ext-language_tools.js',
-      'bower_components/ace-builds/src-noconflict/theme-github.js',
+      'bower_components/ace-builds/src-noconflict/theme-chrome.js',
       'bower_components/angular-ui-ace/ui-ace.js',
       'bower_components/jquery.scrollTo/jquery.scrollTo.js',
       'bower_components/d3/d3.js',

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7ddf810e/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 f753d5e..8a1d6ff 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
@@ -41,6 +41,7 @@ import java.util.Properties;
 import java.util.Set;
 
 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.display.AngularObjectRegistry;
@@ -314,9 +315,11 @@ public class InterpreterFactory {
     List<RegisteredInterpreter> registeredInterpreters = new 
LinkedList<RegisteredInterpreter>();
 
     for (String className : interpreterClassList) {
-      
registeredInterpreters.add(Interpreter.findRegisteredInterpreterByClassName(className));
+      RegisteredInterpreter ri = 
Interpreter.findRegisteredInterpreterByClassName(className);
+      if (ri != null) {
+        registeredInterpreters.add(ri);
+      }
     }
-
     return registeredInterpreters;
   }
 
@@ -353,7 +356,14 @@ public class InterpreterFactory {
       String groupName,
       InterpreterOption option,
       Properties properties)
-      throws InterpreterException {
+      throws InterpreterException , NullArgumentException {
+
+    //When called from REST API without option we receive NPE
+    if (option == null )
+      throw new NullArgumentException("option");
+    //When called from REST API without option we receive NPE
+    if (properties == null )
+      throw new NullArgumentException("properties");
 
     AngularObjectRegistry angularObjectRegistry;
 
@@ -589,7 +599,7 @@ public class InterpreterFactory {
           separateCL = false;
         }
       } catch (Exception e) {
-        // nothing to do.
+        logger.error("exception checking server classloader driver" , e);
       }
 
       URLClassLoader cl;

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/7ddf810e/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 585880b..6a69b83 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
@@ -27,6 +27,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.commons.lang.NullArgumentException;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars;
 import org.apache.zeppelin.interpreter.mock.MockInterpreter1;
@@ -97,7 +98,7 @@ public class InterpreterFactoryTest {
        }
 
   @Test
-  public void testFactoryDefaultList() throws InterpreterException, 
IOException {
+  public void testFactoryDefaultList() throws IOException {
     // get default list from default setting
     List<String> all = factory.getDefaultInterpreterSettingList();
     assertEquals(2, all.size());
@@ -112,6 +113,23 @@ public class InterpreterFactoryTest {
   }
 
   @Test
+  public void testExceptions() throws IOException {
+    List<String> all = factory.getDefaultInterpreterSettingList();
+    // add setting with null option & properties expected 
nullArgumentException.class
+    try {
+      factory.add("a mock", "mock2", null, new Properties());
+    } catch(NullArgumentException e) {
+        assertEquals("Test null option" , e.getMessage(),new 
NullArgumentException("option").getMessage());
+      }
+    try {
+      factory.add("a mock" , "mock2" , new InterpreterOption(false),null);
+    } catch (NullArgumentException e){
+      assertEquals("Test null properties" , e.getMessage(),new 
NullArgumentException("properties").getMessage());
+    }
+  }
+
+
+  @Test
   public void testSaveLoad() throws InterpreterException, IOException {
     // interpreter settings
     assertEquals(2, factory.get().size());

Reply via email to