1 17 package org.apache.geronimo.console.servlet; 18 19 import org.apache.commons.logging.Log; 20 import org.apache.commons.logging.LogFactory; 21 import org.apache.geronimo.console.gbean.ContextForward; 22 import org.apache.geronimo.gbean.AbstractName; 23 import org.apache.geronimo.gbean.AbstractNameQuery; 24 import org.apache.geronimo.kernel.Kernel; 25 import org.apache.geronimo.kernel.KernelRegistry; 26 import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter; 27 import org.apache.geronimo.kernel.lifecycle.LifecycleListener; 28 29 import javax.servlet.RequestDispatcher ; 30 import javax.servlet.ServletConfig ; 31 import javax.servlet.ServletContext ; 32 import javax.servlet.ServletException ; 33 import javax.servlet.http.HttpServlet ; 34 import javax.servlet.http.HttpServletRequest ; 35 import javax.servlet.http.HttpServletResponse ; 36 import java.io.IOException ; 37 import java.util.HashMap ; 38 import java.util.Iterator ; 39 import java.util.Map ; 40 import java.util.Set ; 41 42 53 public class GenericForwardServlet extends HttpServlet { 54 private final static Log log = LogFactory.getLog(GenericForwardServlet.class); 55 private Map forwards = new HashMap (); private Kernel kernel; 57 private LifecycleListener listener; 58 59 public void init(ServletConfig config) throws ServletException { 60 super.init(config); 61 62 kernel = KernelRegistry.getSingleKernel(); 63 AbstractNameQuery query = new AbstractNameQuery(ContextForward.class.getName()); 64 Set set = kernel.listGBeans(query); 65 for (Iterator it = set.iterator(); it.hasNext();) { 66 AbstractName name = (AbstractName) it.next(); 67 addGBean(name); 68 } 69 kernel.getLifecycleMonitor().addLifecycleListener(listener = new LifecycleAdapter() { 70 public void running(AbstractName abstractName) { 71 addGBean(abstractName); 72 } 73 74 public void stopping(AbstractName abstractName) { 75 removeGBean(abstractName); 76 } 77 78 public void stopped(AbstractName abstractName) { 79 removeGBean(abstractName); 80 } 81 82 public void failed(AbstractName abstractName) { 83 removeGBean(abstractName); 84 } 85 86 public void unloaded(AbstractName abstractName) { 87 removeGBean(abstractName); 88 } 89 }, query); 90 } 91 92 public void destroy() { 93 if(listener != null) { 94 kernel.getLifecycleMonitor().removeLifecycleListener(listener); 95 listener = null; 96 } 97 } 98 99 private void addGBean(AbstractName name) { 100 ContextForward forward = (ContextForward) kernel.getProxyManager().createProxy(name, ContextForward.class); 101 forwards.put(forward.getPortalPathPrefix(), new ForwardData(getServletContext().getContext(forward.getPortletContextPath()), 102 forward.getPortletServletPath(), name)); 103 } 104 105 private void removeGBean(AbstractName name) { 106 for (Iterator it = forwards.entrySet().iterator(); it.hasNext();) { 107 Map.Entry entry = (Map.Entry ) it.next(); 108 ForwardData data = (ForwardData) entry.getValue(); 109 if(data.getGbean().equals(name)) { 110 it.remove(); 111 break; 112 } 113 } 114 } 115 116 public void doGet(HttpServletRequest req, HttpServletResponse resp) 117 throws ServletException , IOException { 118 doPost(req, resp); 119 } 120 121 public void doPost(HttpServletRequest req, HttpServletResponse resp) 122 throws ServletException , IOException { 123 String path = req.getPathInfo(); 124 if(path == null) { 125 log.error("Unable to forward request; no path information provided. Path is used to identify where to forward to."); 126 return; 127 } 128 ForwardData forward = null; 129 for (Iterator it = forwards.keySet().iterator(); it.hasNext();) { 130 String prefix = (String ) it.next(); 131 if(path.startsWith(prefix)) { 132 forward = (ForwardData) forwards.get(prefix); 133 path = path.substring(prefix.length()); 134 } 135 } 136 if(forward == null) { 137 log.error("Unable to forward URL "+path+"; does not match any known ContextForward definitions."); 138 return; 139 } 140 if(!path.equals("") && !path.startsWith("/")) path = "/"+path; 141 String queryString = req.getQueryString(); 142 if (queryString != null) { 143 path += "?" + queryString; 144 } 145 path = forward.getServletPath()+path; 146 RequestDispatcher dispatcher = forward.getForwardContext().getRequestDispatcher(path); 147 dispatcher.forward(req, resp); 148 } 149 150 private static class ForwardData { 151 private ServletContext forwardContext; 152 private String servletPath; 153 private AbstractName gbean; 154 155 public ForwardData(ServletContext forwardContext, String servletPath, AbstractName gbean) { 156 this.forwardContext = forwardContext; 157 this.servletPath = servletPath; 158 this.gbean = gbean; 159 } 160 161 public ServletContext getForwardContext() { 162 return forwardContext; 163 } 164 165 public String getServletPath() { 166 return servletPath; 167 } 168 169 public AbstractName getGbean() { 170 return gbean; 171 } 172 } 173 } 174 | Popular Tags |