/**
* Copyright (C) 2008 Progress Software, Inc. All rights reserved.
* http://fusesource.com
*
* The software in this package is published under the terms of the AGPL license
* a copy of which has been included with this distribution in the license.txt file.
*/
package org.fusesource.cloudmix.controller.bundle;
import java.util.Dictionary;
import java.util.Hashtable;
import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.fusesource.cloudmix.common.HttpAuthenticator;
import org.osgi.service.http.HttpService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
//import org.fusesource.cloudmix.common.spring.SpringServlet;
@SuppressWarnings("unused")
public class JerseyServletFactory implements ApplicationContextAware, InitializingBean {
private static final transient Log LOG = LogFactory.getLog(JerseyServletFactory.class);
private String classNames;
private String rootContext;
private ApplicationContext applicationContext;
private HttpService httpService;
private HttpAuthenticator authenticator;
public void setJerseyClassNames(String ... names) {
StringBuilder sb = new StringBuilder();
boolean firstTime = true;
for (String name : names) {
if (firstTime) {
firstTime = false;
} else {
sb.append(';');
}
sb.append(name);
}
classNames = sb.toString();
}
public void setRootContext(String ctx) {
rootContext = ctx;
}
public void setHttpService(HttpService svc) throws Exception {
httpService = svc;
}
public void setAuthenticator(HttpAuthenticator ca) {
authenticator = ca;
}
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
applicationContext = ctx;
}
public void afterPropertiesSet() throws Exception {
// This property is needed for JAXB to properly operate inside OSGi
System.setProperty("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
Dictionary<String, String> initParams = new Hashtable<String, String>();
initParams.put("com.sun.jersey.config.feature.Redirect", "true");
initParams.put("com.sun.jersey.config.feature.ImplicitViewables", "true");
initParams.put(
"com.sun.jersey.config.property.resourceConfigClass",
"org.fusesource.cloudmix.controller.bundle.OSGiResourceConfig");
initParams.put(
"jersey_osgi.classnames",
classNames);
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
// TODO is there another way to do this now using the standard Jersey stuff?
//SpringServlet jerseyServlet = new SpringServlet(applicationContext, authenticator);
SpringServlet jerseyServlet = new SpringServlet();
httpService.registerServlet(rootContext, jerseyServlet, initParams, null);
LOG.info("Registered servlet at: " + rootContext);
LOG.info("With initialization : " + initParams);
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
}
}