/** * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ package org.ralasafe.servlet; import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.ralasafe.EntityExistException; import org.ralasafe.RalasafeException; import org.ralasafe.db.sql.xml.QueryType; import org.ralasafe.entitle.Query; import org.ralasafe.entitle.QueryManager; import org.ralasafe.entitle.QueryResult; import org.ralasafe.user.User; public class QueryTestAction extends AbstractTestAction { private static final Log log=LogFactory.getLog( QueryTestAction.class ); private static final int DEFAULT_QUERY_RESULT_PAGE_SIZE=15; public QueryTestHandler createHandler( HttpServletRequest req ) { int id=WebUtil.getIntParameter( req, "id", 0 ); QueryManager queryManager=WebUtil.getQueryManager( req ); Query query=queryManager.getQuery( id ); org.ralasafe.db.sql.xml.QueryType xmlQuery; try { xmlQuery = org.ralasafe.db.sql.xml.Query .unmarshal(new StringReader(query.getXmlContent())); } catch (Exception e) { throw new RalasafeException(e); } return new QueryTestHandler( xmlQuery ); } public String getHandlerAttributeKey( HttpServletRequest req ) { int id=WebUtil.getIntParameter( req, "id", 0 ); return "_$ralasafeQuery_" + id; } private QueryTestHandler getHandler( HttpServletRequest req ) { String oper=req.getParameter( "oper" ); String key=getHandlerAttributeKey( req ); Object obj=req.getSession().getAttribute( key ); QueryTestHandler handler=null; if( obj==null||"loadFresh".equals(oper) ) { handler=createHandler( req ); // save into session, will be removed when policy is saved req.getSession().setAttribute( key, handler ); } else if( obj instanceof QueryDesignHandler ) { QueryDesignHandler designHandler=(QueryDesignHandler) obj; QueryType query=designHandler.getQuery(); handler=new QueryTestHandler( query ); req.getSession().setAttribute( key, handler ); } else if( obj instanceof QueryRawHandler ) { QueryRawHandler rawHandler=(QueryRawHandler) obj; QueryType query=rawHandler.getQuery(); handler=new QueryTestHandler( query ); req.getSession().setAttribute( key, handler ); } else { handler=(QueryTestHandler) obj; } return handler; } protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String oper=req.getParameter( "oper" ); QueryTestHandler handler=getHandler( req ); req.setAttribute( "handler", handler ); if( log.isDebugEnabled() ) { log.debug( "oper=" + oper + ", query="+handler.getQuery().getName() ); } if( "return".equals( oper ) ) { String gotoPage=handler.getManagePage(); // remove handler from session req.getSession().removeAttribute( getHandlerAttributeKey( req ) ); // goto manage page resp.sendRedirect( gotoPage ); return; } else { WebUtil.forward( req, resp, "/ralasafe/query/test.jsp" ); } } protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String oper=req.getParameter( "oper" ); QueryTestHandler handler=getHandler( req ); req.setAttribute( "handler", handler ); if( log.isDebugEnabled() ) { log.debug( "oper=" + oper + ", query="+handler.getQuery().getName() ); } boolean testUserNeeded=handler.isTestUserNeeded(); String[] testContextFields=handler.getTestContextFields(); if( "runTest".equals( oper ) ) { User testUser=buildTestUser( req, testUserNeeded ); Map testCtx=null; try { testCtx=buildTestContext( req, testContextFields ); } catch( Exception e ) { log.error( e ); throw new ServletException( e ); } int first=WebUtil.getIntParameter( req, "first", 0 ); QueryResult testResult; try { testResult=handler.run( testUser, testCtx, first, DEFAULT_QUERY_RESULT_PAGE_SIZE ); req.setAttribute( "testResult", testResult ); WebUtil.forward( req, resp, "/ralasafe/query/testResult.jsp" ); } catch( Exception e ) { PrintWriter writer=resp.getWriter(); writer.write( "<font color='red'><pre>" ); e.printStackTrace( writer ); writer.write( "</pre></font>" ); } } else if( "save".equals( oper ) ) { // remove handler from session req.getSession().removeAttribute( getHandlerAttributeKey( req ) ); int id=WebUtil.getIntParameter( req, "id", -23 ); QueryManager queryManager=WebUtil.getQueryManager( req ); try { handler.save( id, queryManager ); } catch( EntityExistException e ) { log.error( "", e ); throw new ServletException( e ); } return; } } }