1:import javax.portlet.*;
   2:import java.io.*;
   3:import java.util.*;
   4:import org.apache.commons.logging.Log;
   5:import org.apache.commons.logging.LogFactory;
   6:
   7:/**QueryPortlet provides the methods neccessary to render a portlet that displays
   8: * a database query for the user.
   9: *
  10: * @author Michael Klaene
  11: * @see javax.portlet.GenericPortlet
  12: **/
  13:
  14:public class QueryPortlet extends GenericPortlet {
  15:    
  16:    /** Designated Logger for this class. */
  17:    private final Log log = LogFactory.getLog(getClass().getName());
  18:    
  19:    private String viewUrl;
  20:    private String editUrl;
  21:    private String helpUrl;
  22:    private String errorUrl;
  23:    
  24:    /**Executed one time, upon portlet initialization.*/
  25:    public void init(PortletConfig config)
  26:    throws PortletException {
  27:        log.info("Executing QueryPortlet's init method.");
  28:        
  29:        super.init(config);
  30:        
  31:        //init method of a portlet is a good place to perform
  32:        //any necessary, 1x configurations.
  33:        viewUrl = config.getInitParameter("view_url");
  34:        editUrl = config.getInitParameter("edit_url");
  35:        helpUrl = config.getInitParameter("help_url");
  36:    }
  37:    
  38:    /**Executed in response to action on portlet, like submitting a form.*/
  39:    public void processAction(ActionRequest request, ActionResponse response)
  40:    throws PortletException, IOException {
  41:        log.info("Executing QueryPortlet's processAction method.");
  42:        
  43:        if(request.getPortletMode().equals(PortletMode.EDIT)) {
  44:            String errorMessage = null;
  45:            boolean isValid = false;
  46:            
  47:            //Reset old session attributes.
  48:            PortletSession session = request.getPortletSession();
  49:            session.setAttribute("title",null);
  50:            session.setAttribute("queryColumns",null);
  51:            session.setAttribute("queryData",null);
  52:            
  53:            //Get our edit form's data...
  54:            PortletPreferences preferences = request.getPreferences();
  55:            String sql = request.getParameter("sql");
  56:            String title = request.getParameter("title");
  57:            
  58:            preferences.setValue("sql",sql);
  59:            preferences.setValue("title",title);
  60:            try{
  61:                //This will fire our PreferencesValidation validate method..
  62:                preferences.store();
  63:                isValid = true;
  64:            }
  65:            catch(ValidatorException ve) {
  66:                //Assign values from ActionResponse to RenderRequest for redisplay in form.
  67:                response.setRenderParameter("sql",request.getParameter("sql"));
  68:                response.setRenderParameter("title",request.getParameter("title"));
  69:                errorMessage = "An error occurred processing your SQL.  " +
  70:                "Please check your input and try again.";
  71:                response.setRenderParameter("errorMessage",errorMessage);
  72:            }
  73:            
  74:            if (isValid) {
  75:                response.setPortletMode(PortletMode.VIEW);
  76:            }
  77:        }
  78:    }
  79:    
  80:    /**Executed one time, prior to portlet being garbage collected.*/
  81:    public void destroy() {
  82:        log.info("Executing QueryPortlet's destroy method.");
  83:    }
  84:    
  85:    /**Called by render method to prepare markup for user display.*/
  86:    public void doView(RenderRequest request, RenderResponse response)
  87:    throws PortletException, IOException {
  88:        log.info("Executing QueryPortlet's doView method.");
  89:        
  90:        response.setContentType("text/html");
  91:        PortletPreferences preferences = request.getPreferences();
  92:        
  93:        String sql = preferences.getValue("sql","BAD SQL");
  94:        String title = preferences.getValue("title","***");
  95:        
  96:        if(log.isDebugEnabled()) {
  97:            log.debug("QueryPortlet's doView method. sql : " + sql);
  98:        }
  99:        
 100:        //If current query's results have not been cached, do so now.
 101:        PortletSession session = request.getPortletSession();
 102:        if((session.getAttribute("queryColumns") == null) ||
 103:        (session.getAttribute("queryData") == null) ) {
 104:            QueryBean qb = new QueryBean();
 105:            qb.executeQuery(sql);
 106:            
 107:            //Get column headings/query results and assign them to request attributes.
 108:            String[] queryColumns = (String [])qb.getQueryColumns();
 109:            List queryData = (List)qb.getQueryData();
 110:            session.setAttribute("title",title,PortletSession.PORTLET_SCOPE);
 111:            session.setAttribute("queryColumns",queryColumns,PortletSession.PORTLET_SCOPE);
 112:            session.setAttribute("queryData",queryData,PortletSession.PORTLET_SCOPE);
 113:        }
 114:        PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(viewUrl);
 115:        dispatcher.include(request,response);
 116:    }
 117:    
 118:    /**Executed when user requests to edit the portlet's settings.  Also redisplayed upon
 119:     * failure to set portlet's settings correctly (to displays errors, etc.). */
 120:    public void doEdit(RenderRequest request, RenderResponse response)
 121:    throws PortletException, IOException {
 122:        log.info("Executing QueryPortlet's doEdit method.");
 123:        
 124:        response.setContentType("text/html");
 125:        PortletPreferences preferences = request.getPreferences();
 126:        
 127:        String sql   = preferences.getValue("sql","BAD SQL");
 128:        String title = preferences.getValue("title","***");
 129:        
 130:        //If any errors are encountered from previous edit attempt, provide them to request.
 131:        String errorMessage = request.getParameter("errorMessage");
 132:        if(errorMessage != null) {
 133:            request.setAttribute("sql",request.getParameter("sql"));
 134:            request.setAttribute("title",request.getParameter("title"));
 135:            request.setAttribute("errorMessage",errorMessage);
 136:        }
 137:        else {
 138:            //no errors. Set initial param values.
 139:            request.setAttribute("sql",sql);
 140:            request.setAttribute("title",title);
 141:        }
 142:        
 143:        PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(editUrl);
 144:        dispatcher.include(request,response);
 145:    }
 146:    
 147:    /**Executed when user follows the 'help' link.  Typically, describes what portlet is/does.*/
 148:    public void doHelp(RenderRequest request, RenderResponse response)
 149:    throws PortletException, IOException {
 150:        log.info("Executing QueryPortlet's doHelp method.");
 151:        
 152:        response.setContentType("text/html");
 153:        PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(helpUrl);
 154:        dispatcher.include(request,response);
 155:    }
 156:}
 157: