package edu.stanford.sulair.dlss.dor.resource;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Response.Status;
import edu.stanford.sulair.dlss.dor.admin.DateAdapter;
import edu.stanford.sulair.dlss.dor.dao.ProcessDao;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.sun.jersey.spi.resource.PerRequest;
import edu.stanford.sulair.dlss.dor.admin.Workflow;
import edu.stanford.sulair.dlss.dor.admin.Process;
import edu.stanford.sulair.dlss.dor.service.WorkflowService;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
@Path("/")
@PerRequest
@Component
@Scope("prototype")
public class WorkflowResource {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
private Logger logger = Logger.getLogger(WorkflowResource.class);
@Context
UriInfo uriInfo;
@Autowired
WorkflowService wfService;
@Autowired
ProcessDao processDao;
public WorkflowResource() {}
@PUT
@Path("{repo}/objects/{druid}/workflows/{workflow}")
@Consumes("application/xml")
public Response addUpdateWorkflow(@PathParam("repo") String repo, @PathParam("druid") String druid, @PathParam("workflow") String workflow, Workflow gwf) {
try{
gwf.initilizeProcesses(repo, druid, workflow);
wfService.persist(gwf, repo);
} catch(Exception e){
return ResourceUtilities.createErrorResponse(e, logger);
}
return Response.noContent().build();
}
@PUT
@Path("{repo}/objects/{druid}/workflows/{workflow}/{procName}")
@Consumes("application/xml")
public Response addUpdateProcessStep(@PathParam("repo") String repo, @PathParam("druid") String druid,
@PathParam("workflow") String workflow, @PathParam("procName") String procName,
Process p){
if(!p.getName().equals(procName)){
return Response.status(400).entity("Process name does not match URI").build();
}
try{
p.setDruid(druid);
p.setDatastream(workflow);
p.setRepository(repo);
wfService.persist(p, repo);
} catch(Exception e){
return ResourceUtilities.createErrorResponse(e, logger);
}
return Response.noContent().build();
}
@GET
@Path("{repo}/objects/{druid}/workflows/{workflow}/{procName}")
@javax.ws.rs.Produces("application/xml")
public Response getWorkflowStep(
@PathParam("repo") String repo,
@PathParam("druid") String druid,
@PathParam("workflow") String workflow,
@PathParam("procName") String procName)
{
Process p = null;
try{
p = processDao.findProcess(repo, druid, workflow, procName);
} catch(Exception e){
return ResourceUtilities.createErrorResponse(e, logger);
}
if(p != null){
return Response.status(200).entity(p).build();
} else {
return Response.status(Status.NOT_FOUND).entity("Workflow step not found").type(MediaType.TEXT_PLAIN_TYPE).build();
}
}
@GET
@Path("{repo}/objects/{druid}/workflows/{workflow}")
@javax.ws.rs.Produces("application/xml")
public Response getWorkflow(@PathParam("repo") String repo, @PathParam("druid") String druid, @PathParam("workflow") String workflow) {
Workflow gwf = null;
try{
gwf = wfService.findWorkflow(repo, druid, workflow);
} catch(Exception e){
return ResourceUtilities.createErrorResponse(e, logger);
}
if(gwf != null){
return Response.status(200).entity(gwf).build();
} else {
return Response.status(Status.NOT_FOUND).build();
}
}
@GET
@Path("{repo}/objects/{druid}/lifecycle")
@javax.ws.rs.Produces("application/xml")
public Response getLifecycle(@PathParam("repo") String repo, @PathParam("druid") String druid) {
List<Process> procs = null;
try{
procs = processDao.findLifecycleCompletedProcesses(repo, druid);
} catch(Exception e){
return ResourceUtilities.createErrorResponse(e, logger);
}
if(procs != null && procs.size() > 0){
return Response.ok(buildLifecycleXml(procs, druid), MediaType.APPLICATION_XML_TYPE).build();
} else {
return Response.status(Status.NOT_FOUND).entity("No lifecycle found").type(MediaType.TEXT_PLAIN_TYPE).build();
}
}
private String buildLifecycleXml(List<Process> procs, String druid){
StringBuilder xml = new StringBuilder("<lifecycle objectId=\"" + druid + "\">\n");
for(Process p: procs){
xml.append(" <milestone date=\"").append(DateAdapter.STANDARD_DATE_FORMAT.format(p.getDatetime())).append("\">").
append(p.getLifecycle()).append("</milestone>\n");
}
xml.append("</lifecycle>\n");
return xml.toString();
}
}