package org.foo.webapp.servletapp;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.felix.ipojo.annotations.Bind;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.Unbind;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
import org.osgi.service.log.LogService;
@Component(immediate=true)
public class ServletManager {
@Requires(optional=true)
private LogService log;
private LinkedList<HttpService> services = new LinkedList<HttpService>();
private Map<String, Servlet> servlets = new HashMap<String, Servlet>();
@Bind(aggregate=true)
void bindHttp(HttpService http) {
Map<String, Servlet> snapshot;
synchronized( servlets ) {
snapshot = new HashMap<String, Servlet>(servlets);
services.add( http );
}
for ( Map.Entry<String, Servlet> entry : snapshot.entrySet() ) {
String ctx = entry.getKey();
Servlet s = entry.getValue();
try {
http.registerServlet(ctx, s, null, null);
} catch (ServletException e) {
//log.log(LogService.LOG_WARNING, "Failed to registerServlet", e);
} catch (NamespaceException e) {
//log.log(LogService.LOG_WARNING, "Failed to registerServlet", e);
}
}
}
@Unbind
void unbindHttp(HttpService http) {
Map<String, Servlet> snapshot;
synchronized( servlets ) {
snapshot = new HashMap<String, Servlet>(servlets);
services.remove(http);
}
for ( String ctx : snapshot.keySet() ) {
http.unregister(ctx);
}
}
@Bind(aggregate=true)
void bindServlet(Servlet servlet, Map attrs) {
String ctx = (String) attrs.get("Web-ContextPath");
if ( ctx != null ) {
LinkedList<HttpService> snapshot;
synchronized( servlets ) {
servlets.put(ctx, servlet);
snapshot = new LinkedList<HttpService>(services);
}
for ( HttpService s : snapshot ) {
try {
s.registerServlet(ctx, servlet, null, null);
} catch (ServletException e) {
//log.log(LogService.LOG_WARNING, "Failed to registerServlet", e);
} catch (NamespaceException e) {
//log.log(LogService.LOG_WARNING, "Failed to registerServlet", e);
}
}
}
}
@Unbind
void unbindServlet(Servlet servlet, Map attrs) {
String ctx = (String) attrs.get("Web-ContextPath");
if ( ctx != null ) {
LinkedList<HttpService> snapshot;
synchronized( servlets ) {
servlets.remove(ctx);
snapshot = new LinkedList<HttpService>(services);
}
for ( HttpService s : snapshot ) {
s.unregister(ctx);
}
}
}
}