/**
* Copyright (C) 2010 Talend Inc. - www.talend.com
*/
package server.osgi;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.servlet.http.HttpServlet;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.Lifecycle;
/**
* <
* Register the given (CamelHttpTransport) Servlet with the OSGI
* <a href="http://www.osgi.org/javadoc/r4v42/org/osgi/service/http/HttpService.html">
* HttpService</a>.
* </p>
*/
public class OsgiServletRegisterer implements Lifecycle, InitializingBean {
/**
* The alias is the name in the URI namespace of the Http Service at which the registration will be mapped
* An alias must begin with slash ('/') and must not end with slash ('/'), with the exception that an alias
* of the form "/" is used to denote the root alias.
*/
private String alias;
/**
* Servlet to be registered
*/
private HttpServlet servlet;
/**
* HttpService to register with. Get this with osgi:reference in the spring
* context
*/
private HttpService httpService;
private HttpContext httpContext;
private boolean alreadyRegistered;
public void setHttpService(HttpService httpService) {
this.httpService = httpService;
}
public void setAlias(String alias) {
this.alias = alias;
}
public void setServlet(HttpServlet servlet) {
this.servlet = servlet;
}
public void setHttpContext(HttpContext httpContext) {
this.httpContext = httpContext;
}
@Override
public void afterPropertiesSet() throws Exception {
HttpContext actualHttpContext = (httpContext == null)
? httpService.createDefaultHttpContext()
: httpContext;
final Dictionary<String, String> initParams = new Hashtable<String, String>();
// The servlet will always have to match on uri prefix as some endpoints may do so
initParams.put("matchOnUriPrefix", "true");
try {
String servletName = servlet.getServletName();
initParams.put("servlet-name", servletName);
} catch (Exception e) {
// If getServletName is not implemented the default is to throw an exception
// In this case we simply do not set a servlet name
}
httpService.registerServlet(alias, servlet, initParams, actualHttpContext);
alreadyRegistered = true;
}
@Override
public void start() {
}
@Override
public void stop() {
if (alreadyRegistered) {
httpService.unregister(alias);
alreadyRegistered = false;
}
}
@Override
public boolean isRunning() {
return alreadyRegistered;
}
}