Add servlet to openfire plugin got problem

I try to develop a plugin with a servlet which could let my oa system to send msg by accessing the servlet.

But I have got some problem.

web-custom.xml:

<?xml version='1.0' encoding='ISO-8859-1'<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <!-- Servlets -->
    <servlet>
        <servlet-name>OAToOpenfire</servlet-name>
        <servlet-class>OAToOpenfire</servlet-class>
    </servlet>     <!-- Servlet mappings -->
    <servlet-mapping>
        <servlet-name>OAToOpenfire</servlet-name>
        <url-pattern>/OAToOpenfire</url-pattern>
    </servlet-mapping>
</web-app>

OAToOpenfire:

//import statements...
public class OAToOpenfire extends HttpServlet {
    private static final Logger logger = Logger.getLogger(OAToOpenfire.class);     @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
        AuthCheckFilter.addExclude("oa/OAToOpenfire");
    }     @Override
    public void destroy() {
        super.destroy();
        AuthCheckFilter.removeExclude("oa/OAToOpenfire");
    }     @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //dosth
    }     @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

When I try to access the url [oa/OAToOpenfire] without login to the openfire admin console first.

NullpointException thrown:

??? java.lang.NullPointerException
     at org.jivesoftware.openfire.admin.decorators.main_jsp._jspService(main_jsp.java:195)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:530)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:427)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:494)
     at org.eclipse.jetty.server.session.SessionHandler.handle(SessionHandler.java:182)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:933)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:362)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:867)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
     at org.eclipse.jetty.server.Dispatcher.include(Dispatcher.java:189)
     at com.opensymphony.module.sitemesh.filter.PageFilter.applyDecorator(PageFilter.java:156)
     at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:59)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:425)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:494)
     at org.eclipse.jetty.server.session.SessionHandler.handle(SessionHandler.java:182)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:933)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:362)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:867)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113)
     at org.eclipse.jetty.server.Server.handle(Server.java:334)
     at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:559)
     at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:992)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:541)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:203)
     at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:406)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:462)
     at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436)
     at java.lang.Thread.run(Thread.java:619)

If login first,it works but decorated by the sitemesh which is not I want.

I wish it works like presence plugin.

Anybody know what is the problem?

I had big problems with this too - what I found was that the plugin name is generated by the name of the jar as installed in your plugin directory. I think in your case above the plugin jar will need to be called oa.jar for it to work.

That is not the problem.I have named the plugin jar as oa.jar.

For now I fix this by exclude the url from sitemesh.

Add this line in the exclude tag in decorators.xml :

/plugins/oa/OAToOpenfire*.