package org.aksw.sparqlify.admin.web.api;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.aksw.service_framework.core.ServiceRepository;
import org.aksw.sparqlify.admin.model.JdbcDataSource;
import org.aksw.sparqlify.admin.model.Rdb2RdfConfig;
import org.springframework.stereotype.Service;
import com.google.gson.Gson;
@Service
@Path("/api/action")
public class ServletManager
{
@Resource(name="entityManagerFactory")
private EntityManagerFactory emf;
@Resource
private ServiceManager serviceManager;
@Resource
private ServiceRepository<?> serviceRepo;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/test")
public String test() {
return "{}";
}
/**
* TODO Somehow we need to create servlets from a configurable set of classes.
* The main question is how to inject the proper resources - i.e.
* So we somehow need to create an appropriate servlet context and servlet mapping object.
* This will probably be some fun fiddling around :/
*
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/testCreate")
public String testCreate(@Context HttpServletRequest req, @Context HttpServletResponse res) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setJdbcUrl("jdbc:postgresql//foobar");
dataSource.setUsername("postgres");
dataSource.setPassword("postgres"); //.toCharArray());
dataSource.setPrimaryLabel("My datasource");
dataSource.setPrimaryComment("");
em.persist(dataSource);
em.getTransaction().commit();
// Criteria c = session.createCriteria(JdbcDataSource.class); //.add(Restrictions.eq("", "test spec"));
// List<?> l = c.list();
// for(Object o : l) {
// System.out.println(o);
// }
em.close();
// res.setContentType("text/plain");
// res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
// res.setHeader("Location", "foobar");
// Dynamic dynamic = context.addServlet("SNORQL-Namespaces", "com.sun.jersey.spi.spring.container.servlet.SpringServlet");
// dynamic.addMapping("SNORQL-Namespaces", "/foobar/*");
// dynamic.setAsyncSupported(true);
// dynamic.setInitParameter("com.sun.jersey.config.property.packages", "org.aksw.sparqlify.platform.web");
//dynamic.setLoadOnStartup(1);
//context.addServlet("/sparql", HttpSparqlEndpoint.class);
//ServletContext context;
// ServletHolder sh = new ServletHolder(ServletContainer.class);
//
// sh.setInitParameter(
// "com.sun.jersey.config.property.resourceConfigClass",
// "com.sun.jersey.api.core.PackagesResourceConfig");
//
// sh.setInitParameter("com.sun.jersey.config.property.packages",
// "org.aksw.sparqlify.web");
//
// Server server = new Server(port);
// ServletContextHandler context = new ServletContextHandler(server, "/",
// ServletContextHandler.SESSIONS);
//
// QueryExecutionFactory qef = null;
//
// context.getServletContext().setAttribute("queryExecutionFactory", qef);
// context.addServlet(sh, "/*");
//
return "{}";
}
// @POST
// @Produces(MediaType.APPLICATION_JSON)
// @Path("/deleteContext")
// public String deleteContext(@FormParam("id") Integer id) {
//
//// EntityManager em = emf.createEntityManager();
//// em.getTransaction().begin();
////
//// Rdb2RdfConfig proto = new Rdb2RdfConfig();
//// proto.setId(id);
//// em.remove(proto);
////
//// em.getTransaction().commit();
//// em.close();
////
//
// return "{}";
// }
/**
* Create a new service based on the given configuration
*
* @param json
* @return
*/
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/createService")
public String createInstance(
@FormParam("data") String json
/*
@FormParam("path") String path,
@FormParam("hostname") String hostname,
@FormParam("dbname") String dbname,
@FormParam("username") String username,
@FormParam("password") String password,
@FormParam("mappingText") String mappingText
*/
)
{
// configCollection.add(rdb2rdfConfig)
//
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Gson gson = new Gson();
Rdb2RdfConfig rdb2rdfConfig = gson.fromJson(json, Rdb2RdfConfig.class);
System.out.println(json);
System.out.println(rdb2rdfConfig);
/*
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setJdbcUrl("jdbc:postgresql//foobar");
dataSource.setUsername("postgres");
dataSource.setPassword("postgres".toCharArray());
dataSource.setPrimaryLabel("My datasource");
dataSource.setPrimaryComment("");
TextResource textResource = new TextResource();
textResource.setData(mappingText);
textResource.setFormat("application/rdb2rdf-sml");
textResource.setType("sml");
textResource.setPrimaryComment("no comment");
textResource.setPrimaryLabel("no label");
Rdb2RdfConfig rdb2rdfConfig = new Rdb2RdfConfig();
rdb2rdfConfig.setJdbcDatasource(jdbcDataSource);
rdb2rdfConfig.setTextResource(textResource);
*/
em.persist(rdb2rdfConfig);
em.flush();
em.getTransaction().commit();
em.close();
//serviceManager.registerService(rdb2rdfConfig);
serviceRepo.startByConfigId(rdb2rdfConfig.getId());
//serviceManager.startService(rdb2rdfConfig.getId());
return "{}";
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/deleteService")
public String deleteService(@FormParam("id") String id) {
// Remove the config object
Object configId = serviceManager.getConfigId(id);
if(configId == null) {
throw new RuntimeException("No config found for id " + id);
}
serviceManager.deleteService(id);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//serviceManager.deleteService(id);
Rdb2RdfConfig config = em.find(Rdb2RdfConfig.class, configId);
em.remove(config);
em.getTransaction().commit();
em.close();
return "{}";
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/startService")
public String startService(@FormParam("id") String id) {
serviceManager.startService(id);
return "{}";
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/stopService")
public String stopService(@FormParam("id") String id) {
serviceManager.stopService(id);
return "{}";
}
}