1 17 package org.apache.geronimo.console; 18 19 import org.apache.commons.logging.Log; 20 import org.apache.commons.logging.LogFactory; 21 import org.apache.commons.fileupload.portlet.PortletFileUpload; 22 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 23 import org.apache.commons.fileupload.FileItem; 24 import org.apache.commons.fileupload.FileUploadException; 25 26 import javax.portlet.ActionRequest; 27 import javax.portlet.ActionResponse; 28 import javax.portlet.PortletException; 29 import javax.portlet.RenderRequest; 30 import javax.portlet.RenderResponse; 31 import javax.portlet.WindowState; 32 import javax.portlet.PortletConfig; 33 import javax.portlet.PortletRequest; 34 import java.util.Map ; 35 import java.util.HashMap ; 36 import java.util.Iterator ; 37 import java.util.List ; 38 import java.io.IOException ; 39 40 47 public abstract class MultiPagePortlet extends BasePortlet { 48 private final static Log log = LogFactory.getLog(MultiPagePortlet.class); 49 protected static final String MODE_KEY = "mode"; 50 protected Map helpers = new HashMap (); 51 52 public void destroy() { 53 for (Iterator it = helpers.values().iterator(); it.hasNext();) { 54 MultiPageAbstractHandler handler = (MultiPageAbstractHandler) it.next(); 55 handler.destroy(); 56 } 57 helpers.clear(); 58 super.destroy(); 59 } 60 61 public void processAction(ActionRequest actionRequest, 62 ActionResponse actionResponse) throws PortletException, IOException { 63 String mode = null; 64 Map files = null; 65 Map fields = null; 66 if(actionRequest.getContentType() != null && actionRequest.getContentType().startsWith("multipart/form-data")) { 67 files = new HashMap (); 68 fields = new HashMap (); 69 PortletFileUpload request = new PortletFileUpload(new DiskFileItemFactory()); 70 try { 71 List items = request.parseRequest(actionRequest); 72 for (int i = 0; i < items.size(); i++) { 73 FileItem item = (FileItem) items.get(i); 74 if(item.isFormField()) { 75 if(item.getFieldName().equals(MODE_KEY)) { 76 mode = item.getString(); 77 } 78 fields.put(item.getFieldName(), item.getString()); 79 } else { 80 files.put(item.getFieldName(), item); 81 } 82 } 83 } catch (FileUploadException e) { 84 log.error("Unable to process form including a file upload", e); 85 } 86 } else { 87 mode = actionRequest.getParameter(MODE_KEY); 88 } 89 MultiPageModel model = getModel(actionRequest); 90 while(true) { 91 if(mode == null) { 92 break; 93 } 94 int pos = mode.lastIndexOf('-'); 95 if(pos == -1) { break; 97 } else { 98 String type = mode.substring(pos+1); 99 mode = mode.substring(0, pos); 100 MultiPageAbstractHandler handler = (MultiPageAbstractHandler) helpers.get(mode); 101 if(handler == null) { 102 log.error("No handler for action mode '"+mode+"'"); 103 break; 104 } 105 if(files == null) { 106 handler.getUploadFields().clear(); 107 handler.getUploadFiles().clear(); 108 } else { 109 handler.getUploadFields().putAll(fields); 110 handler.getUploadFiles().putAll(files); 111 } 112 log.debug("Using action handler '"+handler.getClass().getName()+"'"); 113 if(type.equals("before")) { 114 mode = handler.actionBeforeView(actionRequest, actionResponse, model); 115 } else if(type.equals("after")) { 116 mode = handler.actionAfterView(actionRequest, actionResponse, model); 117 } else { 118 log.error("Unrecognized portlet action '"+mode+"'"); 119 mode = null; 120 } 121 } 122 } 123 if(mode != null) { 124 actionResponse.setRenderParameter(MODE_KEY, mode); 125 } 126 if(model != null) { 127 model.save(actionResponse, actionRequest.getPortletSession(true)); 128 } 129 } 130 131 protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException , PortletException { 132 if (WindowState.MINIMIZED.equals(renderRequest.getWindowState())) { 133 return; 134 } 135 String mode = renderRequest.getParameter(MODE_KEY); 136 MultiPageModel model = getModel(renderRequest); 137 if(mode == null || mode.equals("")) { 138 mode = getDefaultMode(); 139 } 140 MultiPageAbstractHandler handler = (MultiPageAbstractHandler) helpers.get(mode); 141 try { 142 if(handler == null) { 143 log.error("No handler for render mode '"+mode+"'"); 144 } else { 145 log.debug("Using render handler '"+handler.getClass().getName()+"'"); 146 handler.renderView(renderRequest, renderResponse, model); 147 } 148 } catch (Throwable e) { 149 log.error("Unable to render portlet", e); 150 } 151 renderRequest.setAttribute(getModelJSPVariableName(), model); 152 if(handler != null) { 153 handler.getView().include(renderRequest, renderResponse); 154 } 155 } 156 157 protected void addHelper(MultiPageAbstractHandler handler, PortletConfig config) throws PortletException { 158 handler.init(config); 159 helpers.put(handler.getMode(), handler); 160 } 161 162 protected String getDefaultMode() { 163 if(helpers.containsKey("index")) return "index"; 164 if(helpers.containsKey("list")) return "list"; 165 return null; 166 } 167 168 protected abstract String getModelJSPVariableName(); 169 170 protected abstract MultiPageModel getModel(PortletRequest request); 171 } 172 | Popular Tags |