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: