mainservlet.java

来自「Rapla是一个灵活的多用户资源管理系统。它提供的一些功能有:日历GUI」· Java 代码 · 共 409 行 · 第 1/2 页

JAVA
409
字号

            getServletConfig().getServletContext().setAttribute("context", sm);
        }
        catch( Exception e )
        {
        	if ( logger != null) {
        		logger.fatalError("Could not start server", e);
        	}
        	ContainerUtil.dispose( raplaMainContainer);
        	log( "Problem starting Rapla ", e );
            throw new ServletException( "Error during initialization", e );
        }
        log("Rapla Servlet started");

    }

    /**
     * Pass all servlet requests through to container to be handled.
  ^s   */
    public void service( HttpServletRequest request, HttpServletResponse response )
        throws IOException, ServletException
    {
        String page =  request.getParameter("page");
        String contextPath =request.getRequestURI();
        
        int rpcIndex=contextPath.indexOf("/rapla/rpc/") ;
        if ( rpcIndex>= 0)  {
            handleRPCCall( request, response, contextPath );
            return;
        }  
        if ( page == null || page.trim().length() == 0) {
            page = "index";
        }
    
        if ( page == null){
            //          for compatibility with versions prior to 1.0RC1
            String completeURL = request.getRequestURL().toString();
            int oldExportCompatibility = completeURL.indexOf("/export/calendar.jsp");
            if ( oldExportCompatibility>=0) {
                String redirectURL = completeURL.substring(0, oldExportCompatibility) + completeURL.substring( oldExportCompatibility + "/export".length()) + "?" + request.getQueryString();
                response.sendRedirect( redirectURL);
                return;
            }

            // for compatibility with versions prior to 1.0RC1
            String servletPath = request.getPathInfo().trim();
            page = servletPath.substring(1);
            int jspIndex = page.indexOf(".jsp") ;
            if ( jspIndex >= 0){
                page = page.substring(0,jspIndex);
            }
            int jnlp = page.indexOf("raplaclient.jnlp") ;
            if ( jnlp >= 0){
                page = "raplaclient";
            }
        }
        if ( page == null )
        {
            throw new ServletException( "Cant process your servlet request " + contextPath);
        }
        if (pageList.contains( page) ) {
            RaplaPageGenerator  servletPage;
            try {
                servletPage = (RaplaPageGenerator) serverService.getContext().lookup( RaplaExtensionPoints.SERVLET_PAGE_EXTENSION + "/" +  page );
            } catch (RaplaContextException e) {
                java.io.PrintWriter out = response.getWriter();
                out.println(IOUtil.getStackTraceAsString( e));
                throw new ServletException( e);
            }
            servletPage.generatePage( getServletContext(), request, response);
        } else {
            throw new ServletException( "Page " + page + " not found in Rapla context");
        }
    }

    private void handleRPCCall( HttpServletRequest request, HttpServletResponse response, String contextPath ) throws IOException
    {
        int rpcIndex=contextPath.indexOf("/rapla/rpc/") ;
        String methodName = contextPath.substring(rpcIndex + "/rapla/rpc/".length());
        HttpSession session = request.getSession( true);
        
        if ( methodName.equals("getException"))
        {
            Exception ex = (Exception)session.getAttribute("lastException");
            if ( ex == null)
            {
                response.sendError( 500 , "No exception found");
            } else {
                ObjectOutputStream out = new ObjectOutputStream( response.getOutputStream());
                out.writeObject( ex);
                out.flush();
            }
            return;
        } 
        
        String username = (String)session.getAttribute("username");
        try
        {
            Map paramterMap = makeSingles(request.getParameterMap());
            ServerServiceImpl server = (ServerServiceImpl)raplaMainContainer.getContext().lookup( ServerService.ROLE);
            if ( methodName.equals("login"))
            {
                username = server.login( paramterMap);
                session.setAttribute("username", username);
                response.getWriter().println("Login successfull" );
            }
            else if ( methodName.equals("logout"))
            {
                session.removeAttribute("username");
                response.getWriter().println("User logout" );
            }
            else
            {
                RemoteSession  remoteSession = (RemoteSession)session.getAttribute(RemoteSession.class.getName()); 
                if ( remoteSession != null)
                {
                    // If session was created by another server, than invalidate
                    if (((RemoteSessionImpl)remoteSession).getServerStartTime() != serverStartTime)
                    {
                        remoteSession = null;
                    }
                }
                if ( remoteSession == null)
                {
                    remoteSession = new RemoteSessionImpl(server.getContext(), session.getId(), serverStartTime);
                    session.setAttribute( RemoteSession.class.getName(), remoteSession);
                }
                ((RemoteSessionImpl)remoteSession).setUsername( username);
                byte[] out = server.dispatch(remoteSession, methodName, paramterMap);
                response.setContentType( "text/html; charset=utf-8");
                //response.setCharacterEncoding( "utf-8" );
                response.getOutputStream().write( out );
            }
                //  response.getWriter().println("There are currently " + reservations + " reservations");
        }
        catch (Exception e)
        {
            String message = e.getMessage();
            if ( message == null )
            {
                message = e.getClass().getName();
            }
            session.setAttribute( "lastException", e);
            response.addHeader("X-Error-Stacktrace", message);
            response.getWriter().println("Error: " + IOUtil.getStackTraceAsString( e));
            
            //response.sendError( 500, e.getMessage());
            
            response.setStatus( 500);
            //throw new ServletException( e);
        }
    }

    private Map makeSingles( Map parameterMap )
    {
        Map singlesMap = new HashMap();
        for (Iterator it = parameterMap.keySet().iterator();it.hasNext();)
        {
            String key = (String)it.next();
            String[] values = (String[]) parameterMap.get( key);
            if ( values != null && values.length > 0 )
            {
                singlesMap.put( key,values[0]);
            }
            else
            {
                singlesMap.put( key,null);
            }
        }
        
        return singlesMap;
        
    }

    private void stopServer() {
        try {
            ShutdownService shutdownService = (ShutdownService) raplaMainContainer.getContext().lookup(ShutdownService.ROLE);
            shutdownService.removeShutdownListener( shutdownListener );
            ContainerUtil.dispose( raplaMainContainer );
        } catch (Exception ex) {
            log("Error while stopping server");
        }
    }

    /**
     * Disposes of container manager and container instance.
     */
    public void destroy()
    {
        log("Destroying rapla");
        stopServer();
    }

    public RaplaContext getContext()
    {   
        return raplaMainContainer.getContext();
    }




}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?