/** * 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.StringReader; 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.Column; import org.ralasafe.db.sql.xml.Parameter; import org.ralasafe.db.sql.xml.QueryType; import org.ralasafe.db.sql.xml.types.QueryTypeTypeType; import org.ralasafe.entitle.Query; import org.ralasafe.entitle.QueryManager; import org.ralasafe.util.StringUtil; public class QueryRawAction extends Action { private static final Log log=LogFactory.getLog( QueryRawAction.class ); public QueryRawHandler 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 QueryRawHandler( xmlQuery ); } public String getHandlerAttributeKey( HttpServletRequest req ) { int id=WebUtil.getIntParameter( req, "id", 0 ); return "_$ralasafeQuery_" + id; } private QueryRawHandler getHandler( HttpServletRequest req ) { String oper=req.getParameter( "oper" ); String key=getHandlerAttributeKey( req ); Object obj=req.getSession().getAttribute( key ); QueryRawHandler 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 QueryRawHandler( query ); req.getSession().setAttribute( key, handler ); // set to raw sql type query.setIsRawSQL( true ); query.setType( QueryTypeTypeType.SQL ); } else if( obj instanceof QueryTestHandler ) { QueryTestHandler rawHandler=(QueryTestHandler) obj; QueryType query=rawHandler.getQuery(); handler=new QueryRawHandler( query ); req.getSession().setAttribute( key, handler ); } else { handler=(QueryRawHandler) obj; } return handler; } protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String oper=req.getParameter( "oper" ); QueryRawHandler handler=getHandler( req ); req.setAttribute( "handler", handler ); if( log.isDebugEnabled() ) { log.debug( "oper=" + oper + ", query="+handler.getQuery().getName() ); } if( "rawSql".equals( oper ) ) { WebUtil.forward( req, resp, "/ralasafe/query/rawSql.jsp" ); } else if( "param".equals( oper ) ) { WebUtil.forward( req, resp, "/ralasafe/query/rawParam.jsp" ); } else if( "mapping".equals( oper ) ) { WebUtil.forward( req, resp, "/ralasafe/query/rawMapping.jsp" ); } else if( "editParam".equals( oper ) ) { String strIndex=req.getParameter( "index" ); if( !StringUtil.isEmpty( strIndex ) ) { int index=Integer.parseInt( strIndex ); Parameter param=handler.getParameter( index ); req.setAttribute( "param", param ); } WebUtil.forward( req, resp, "/ralasafe/query/editParam.jsp" ); } else if( "editProperty".equals( oper ) ) { String strIndex=req.getParameter( "index" ); if( !StringUtil.isEmpty( strIndex ) ) { int index=Integer.parseInt( strIndex ); Column column=handler.getColumn( index ); req.setAttribute( "column", column ); } String[][] mappingClassPropertyAndTypes=handler.getMappingClassPropertyAndTypes(); req.setAttribute( "mappingClassPropertyAndTypes", mappingClassPropertyAndTypes ); WebUtil.forward( req, resp, "/ralasafe/query/editProperty.jsp" ); } else 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/raw.jsp" ); } } protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String oper=req.getParameter( "oper" ); QueryRawHandler handler=getHandler( req ); req.setAttribute( "handler", handler ); if( log.isDebugEnabled() ) { log.debug( "oper=" + oper + ", query="+handler.getQuery().getName() ); } if( "addParam".equals( oper ) ) { String type=req.getParameter( "type" ); String key=req.getParameter( "key" ); handler.addParameter( type, key ); return; } else if( "editParam".equals( oper ) ) { int index=WebUtil.getIntParameter( req, "index", -1 ); String type=req.getParameter( "type" ); String key=req.getParameter( "key" ); handler.updateParameter( index, type, key ); return; } else if( "deleteParam".equals( oper ) ) { int index=WebUtil.getIntParameter( req, "index", -1 ); handler.deleteParameter( index ); return; } else if( "moveParam".equals( oper ) ) { int index=WebUtil.getIntParameter( req, "index", -1 ); String direct=req.getParameter( "direct" ); handler.moveParameter( direct, index ); return; } else if( "addProperty".equals( oper ) ) { String property=req.getParameter( "property" ); boolean readOnly=WebUtil.getBooleanParameter( req, "readOnly", false ); String columnName=req.getParameter( "columnName" ); int index=property.indexOf( "<" ); String javaProp=property.substring( 0, index-1 ).trim(); String javaType=property.substring( index+1, property.length()-1 ).trim(); handler.addProperty( columnName, javaProp, javaType, readOnly ); return; } else if( "editProperty".equals( oper ) ) { int index=WebUtil.getIntParameter( req, "index", -1 ); String property=req.getParameter( "property" ); boolean readOnly=WebUtil.getBooleanParameter( req, "readOnly", false ); String columnName=req.getParameter( "columnName" ); int sindex=property.indexOf( "<" ); String javaProp=property.substring( 0, sindex-1 ).trim(); String javaType=property.substring( sindex+1, property.length()-1 ).trim(); handler.updateProperty( index, columnName, javaProp, javaType, readOnly ); return; } else if( "deleteProperty".equals( oper ) ) { int index=WebUtil.getIntParameter( req, "index", -1 ); handler.deleteProperty( index ); return; } else if( "moveProperty".equals( oper ) ) { int index=WebUtil.getIntParameter( req, "index", -1 ); String direct=req.getParameter( "direct" ); handler.moveProperty( direct, index ); return; } else if( "setMappingClass".equals( oper ) ) { String mappingClass=req.getParameter( "mappingClass" ); handler.setMappingClass( mappingClass ); return; } else if( "setRawSql".equals( oper ) ) { String rawSql=req.getParameter( "rawSql" ); handler.setRawSql( rawSql ); return; } 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; } } }