package ddth.dasp.springmvc.osgi; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Vector; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.osgi.framework.BundleContext; import org.springframework.web.context.support.XmlWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import ddth.dasp.common.DaspGlobal; import ddth.dasp.common.IRequestHandler; import ddth.dasp.framework.osgi.BaseSpringBundleActivator; import ddth.dasp.framework.osgi.ServiceInfo; import ddth.dasp.springmvc.DaspBundleConstants; public class DaspBundleActivator extends BaseSpringBundleActivator { private final static String[] springConfigFiles = new String[] { "META-INF/osgispring/*.xml" }; private DispatcherServlet dispatcherServlet; private List<ServiceInfo> serviceInfoList; /** * {@inheritDoc} */ @Override protected List<ServiceInfo> getServiceInfoList() { if (serviceInfoList == null) { serviceInfoList = new ArrayList<ServiceInfo>(); ServiceInfo serviceInfo = new ServiceInfo(IRequestHandler.class.getName(), new DaspRequestHandler()); serviceInfoList.add(serviceInfo); } return serviceInfoList; } /** * {@inheritDoc} */ @Override protected String[] getSpringConfigFiles() { return springConfigFiles; } private class DaspRequestHandler implements IRequestHandler { @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { dispatcherServlet.service(request, response); } } private static class EmptyServletConfig implements ServletConfig { @SuppressWarnings("rawtypes") private Vector params = new Vector(); @Override public String getServletName() { return "daspSpringMvc"; } @Override public ServletContext getServletContext() { return DaspGlobal.getServletContext(); } @SuppressWarnings("rawtypes") @Override public Enumeration getInitParameterNames() { return params.elements(); } @Override public String getInitParameter(String name) { return null; } } protected void destroyDispatcherServlet() { try { dispatcherServlet.destroy(); } catch (Exception e) { // empty } } protected void initDispatcherServlet() throws ServletException { ServletConfig servletConfig = new EmptyServletConfig(); XmlWebApplicationContext wac = new XmlWebApplicationContext(); wac.setParent(getApplicationContext()); wac.setServletContext(DaspGlobal.getServletContext()); wac.setServletConfig(servletConfig); wac.setConfigLocations(new String[0]); dispatcherServlet = new DispatcherServlet(wac); dispatcherServlet.init(servletConfig); } /** * {@inheritDoc} */ @Override protected void internalBundleStart(BundleContext bundleContext) throws Exception { super.internalBundleStart(bundleContext); initDispatcherServlet(); } /** * {@inheritDoc} */ @Override protected void internalBundleStop(BundleContext bundleContext) throws Exception { try { destroyDispatcherServlet(); } finally { super.internalBundleStop(bundleContext); } } /** * {@inheritDoc} */ @Override protected String getModuleName() { return DaspBundleConstants.MODULE_NAME; } }