/* * Copyright 2009 NCHOVY * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.http.internal; import java.util.HashMap; import java.util.Random; import org.apache.felix.ipojo.ComponentInstance; import org.apache.felix.ipojo.InstanceStateListener; import org.apache.felix.ipojo.annotations.Provides; import org.krakenapps.http.KrakenHttpService; import org.krakenapps.http.ServletLifecycleManager; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Provides public class HttpServletController implements ServletLifecycleManager, InstanceStateListener { private final Logger logger = LoggerFactory.getLogger(HttpServletController.class); class ServletInfo { public KrakenHttpService httpServlet; public String alias; public String instanceName; public ServletInfo(KrakenHttpService httpServletImpl, String alias, String instanceName) { this.httpServlet = httpServletImpl; this.alias = alias; this.instanceName = instanceName; } } private HttpServletTracker servletTracker; private HashMap<String, ServletInfo> servlets; public HttpServletController(BundleContext bundleContext) { try { servletTracker = new HttpServletTracker(bundleContext, this); servlets = new HashMap<String, ServletInfo>(); } catch (InvalidSyntaxException e) { logger.debug(e.getClass().getName(), e); } } @Override public void stateChanged(ComponentInstance instance, int arg1) { if (instance.getState() == ComponentInstance.DISPOSED) { System.out.println(instance.getInstanceName() + " - http-servlet component instance disposed."); unregisterServlet(instance.getInstanceName()); } } public void start() { System.out.println("HttpServletController.start() called"); servletTracker.open(); } public void stop() { System.out.println("HttpServletController.stop() called"); servletTracker.close(); } @Override public void unregisterServlet(String instanceName) { ServletInfo servletInfo = servlets.get(instanceName); if (servletInfo != null) { servletInfo.httpServlet.unregister(servletInfo.alias); servlets.remove(instanceName); } else { logger.warn("Unregister servlet failed: " + instanceName); } } @Override public void registerServlet(KrakenHttpService httpService, String alias, ComponentInstance servletComponentInstance) { Random rand = new Random(); int randKey = rand.nextInt(); while (servlets.containsKey(randKey)) randKey = rand.nextInt(); String servletInstanceName = servletComponentInstance.getInstanceName(); servlets.put(servletInstanceName, new ServletInfo(httpService, alias, servletInstanceName)); } }