package org.fluxtream.core.api;
import com.wordnik.swagger.config.ConfigFactory;
import com.wordnik.swagger.config.ScannerFactory;
import com.wordnik.swagger.jaxrs.config.DefaultJaxrsScanner;
import com.wordnik.swagger.jaxrs.config.WebXMLReader;
import com.wordnik.swagger.jaxrs.listing.ApiListingCache;
import com.wordnik.swagger.jersey.JerseyApiReader;
import com.wordnik.swagger.model.ApiInfo;
import com.wordnik.swagger.reader.ClassReaders;
import org.fluxtream.core.Configuration;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import scala.collection.Iterator;
import scala.collection.JavaConversions;
import scala.collection.immutable.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Application;
import java.io.IOException;
import java.util.ArrayList;
/**
* User: candide
* Date: 20/04/14
* Time: 23:00
*/
public class SwaggerBootstrapServlet extends HttpServlet {
public void init(final ServletConfig config) throws ServletException {
super.init(config);
ConfigFactory.setConfig(new WebXMLReader(config));
reload();
}
private void reload() {
System.out.println("ApplicationContext started, setting up REST API info");
WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Configuration env = webContext.getBean(Configuration.class);
final DefaultJaxrsScanner jaxrsScanner = new DefaultJaxrsScanner(){
@Override
public List<Class<?>> classesFromContext(Application app, ServletConfig sc) {
final List<Class<?>> classes = super.classesFromContext(app, sc);
return filterClasses(classes);
}
private List<Class<?>> filterClasses(final List<Class<?>> classes) {
final Iterator<Class<?>> eachClass = classes.iterator();
final ArrayList<Class<?>> filteredClasses = new ArrayList<Class<?>>();
while(eachClass.hasNext()) {
Class clazz = eachClass.next();
// if (clazz.getName().indexOf("fluxtream")!=-1)
// continue;
filteredClasses.add(clazz);
}
return JavaConversions.asScalaBuffer(filteredClasses).toList();
}
@Override
public List<Class<?>> classes() {
final List<Class<?>> classes = super.classes();
return filterClasses(classes);
}
};
ScannerFactory.setScanner(jaxrsScanner);
ClassReaders.setReader(new JerseyApiReader());
String docsBaseURL = env.get("docsHomeBaseUrl")!=null
? env.get("docsHomeBaseUrl")
: env.get("homeBaseUrl");
ApiInfo apiInfo = new ApiInfo(
"Fluxtream Public REST API",
"",
String.format("%shtml/privacyPolicy.html", docsBaseURL),
"info@fluxtream.org",
"Apache 2.0",
"http://www.apache.org/licences/LICENSE-2.0.html"
);
ConfigFactory.config().setBasePath(docsBaseURL+"api");
ConfigFactory.config().setApiInfo(apiInfo);
ConfigFactory.config().setApiVersion("v1");
env.reload();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
reload();
com.wordnik.swagger.jersey.listing.ApiListingCache.invalidateCache();
ApiListingCache.invalidateCache();
resp.getWriter().write("oauth config reloaded - cache invalidated twice");
}
}