/**
*
*/
package edu.asu.spring.quadriga.rest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.security.Principal;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import edu.asu.spring.quadriga.domain.factories.IRestVelocityFactory;
import edu.asu.spring.quadriga.domain.factory.workspace.IWorkspaceFactory;
import edu.asu.spring.quadriga.domain.impl.workspacexml.QuadrigaWorkspaceDetailsReply;
import edu.asu.spring.quadriga.domain.impl.workspacexml.Workspace;
import edu.asu.spring.quadriga.domain.impl.workspacexml.WorkspacesList;
import edu.asu.spring.quadriga.domain.workspace.IWorkSpace;
import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.exceptions.RestException;
import edu.asu.spring.quadriga.service.IRestMessage;
import edu.asu.spring.quadriga.service.IUserManager;
import edu.asu.spring.quadriga.service.workspace.IListWSManager;
import edu.asu.spring.quadriga.service.workspace.IModifyWSManager;
/**
* @author satyaswaroop boddu
*
*/
@Controller
public class WorkspaceRestController {
private static final Logger logger = LoggerFactory.getLogger(WorkspaceRestController.class);
@Autowired
private IRestVelocityFactory restVelocityFactory;
@Autowired
private IWorkspaceFactory workspaceFactory;
@Autowired
private IRestMessage errorMessageRest;
@Autowired
IUserManager userManager;
@Autowired
IListWSManager wsManager;
@Autowired
IModifyWSManager modifyWSManager;
/**
* Rest interface for the getting list of workspaces of a project http://<
* <URL>:<PORT>>/quadriga/rest/projects/{project_id}/workspaces
* http://localhost:8080/quadriga/rest/projects/1/workspaces
*
* @author SatyaSwaroop Boddu
*
* @param project_id
* @param model
* @param principal
* @param req
* @return
* @throws RestException
*/
@RequestMapping(value = "rest/projects/{project_id}/workspaces", method = RequestMethod.GET, produces = "application/xml")
public ResponseEntity<String> listWorkspaces(@PathVariable("project_id") String project_id, ModelMap model,
Principal principal, HttpServletRequest req) throws RestException {
try {
VelocityEngine engine = restVelocityFactory.getVelocityEngine();
engine.init();
// will use in future list workspaces need to be modified
String userId = principal.getName();
List<IWorkSpace> workspaceList = wsManager.listWorkspace(project_id, userId);
Template template = engine.getTemplate("velocitytemplates/workspaces.vm");
VelocityContext context = new VelocityContext();
context.put("url", ServletUriComponentsBuilder.fromContextPath(req).toUriString());
context.put("list", workspaceList);
StringWriter writer = new StringWriter();
template.merge(context, writer);
return new ResponseEntity<String>(writer.toString(), HttpStatus.OK);
} catch (ResourceNotFoundException e) {
throw new RestException(404, e);
} catch (ParseErrorException e) {
throw new RestException(500, e);
} catch (MethodInvocationException e) {
throw new RestException(500, e);
} catch (QuadrigaStorageException e) {
throw new RestException(500, e);
} catch (Exception e) {
throw new RestException(500, e);
}
}
/**
* Rest interface for the getting list of workspaces of a project http://<
* <URL>:<PORT>>/quadriga/rest/workspaces/{workspaces_id}
* http://localhost:8080/quadriga/rest/workspaces/95082053023825920
*
* @author SatyaSwaroop Boddu
* @param workspaces_id
* @param model
* @param principal
* @param req
* @return
* @throws RestException
*/
@RequestMapping(value = "rest/workspaces/{workspaces_id}", method = RequestMethod.GET, produces = "application/xml")
public ResponseEntity<String> workspaceDetails(@PathVariable("workspaces_id") String workspaces_id, ModelMap model,
Principal principal, HttpServletRequest req) throws RestException {
try {
// will use in future list workspaces need to be modified
// List<IDictionary> dictionaryList
// =workspaceDictionaryManager.listWorkspaceDictionary(workspaces_id,
// userId);
// List<IConceptCollection> ccList =
// workspaceCCManager.listWorkspaceCC(workspaces_id, userId);
// workspace = wsManager.getWorkspaceDetails(workspaces_id,userId);
VelocityEngine engine = restVelocityFactory.getVelocityEngine();
engine.init();
Template template = engine.getTemplate("velocitytemplates/workspacesdetails.vm");
VelocityContext context = new VelocityContext();
context.put("url", ServletUriComponentsBuilder.fromContextPath(req).toUriString());
context.put("workspaceid", workspaces_id);
// context.put("cclist", ccList);
StringWriter writer = new StringWriter();
template.merge(context, writer);
return new ResponseEntity<String>(writer.toString(), HttpStatus.OK);
} catch (ResourceNotFoundException e) {
throw new RestException(404, e);
} catch (ParseErrorException e) {
throw new RestException(500, e);
} catch (MethodInvocationException e) {
throw new RestException(500, e);
} catch (QuadrigaStorageException e) {
throw new RestException(500, e);
} catch (Exception e) {
throw new RestException(500, e);
}
}
/**
* Rest interface add a new workspace to the project http://<<URL>:
* <PORT>>/quadriga/rest/projects/{project_id}/createworkspace
* http://localhost:8080/quadriga/rest/projects/{project_id}/createworkspace
*
* @author Lohith Dwaraka
* @param userId
* @param model
* @return
* @throws RestException
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
* @throws Exception
*/
@RequestMapping(value = "rest/projects/{project_id}/workspace/add", method = RequestMethod.POST)
public ResponseEntity<String> addWorkspaceToProject(@PathVariable("project_id") String projectId,
HttpServletRequest request, HttpServletResponse response, @RequestBody String xml,
@RequestHeader("Accept") String accept, ModelMap model, Principal principal)
throws RestException, QuadrigaStorageException, QuadrigaAccessException {
logger.debug("XML : " + xml);
JAXBElement<QuadrigaWorkspaceDetailsReply> response1 = null;
try {
JAXBContext context = JAXBContext.newInstance(QuadrigaWorkspaceDetailsReply.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());
InputStream is = new ByteArrayInputStream(xml.getBytes());
response1 = unmarshaller.unmarshal(new StreamSource(is), QuadrigaWorkspaceDetailsReply.class);
} catch (JAXBException e) {
logger.error("Error in unmarshalling", e);
String errorMsg = errorMessageRest.getErrorMsg("Error in unmarshalling", request);
return new ResponseEntity<String>(errorMsg, HttpStatus.BAD_REQUEST);
}
QuadrigaWorkspaceDetailsReply qReply = response1.getValue();
WorkspacesList workList = qReply.getWorkspacesList();
List<Workspace> workspaceList = workList.getWorkspaceList();
if (workspaceList.size() < 1) {
String errorMsg = errorMessageRest.getErrorMsg("Workspace XML is not valid", request);
return new ResponseEntity<String>(errorMsg, HttpStatus.BAD_REQUEST);
}
IWorkSpace workspaceNew = workspaceFactory.createWorkspaceObject();
for (Workspace workspace : workspaceList) {
workspaceNew.setDescription(workspace.getDescription().trim());
workspaceNew.setWorkspaceName(workspace.getName().trim());
modifyWSManager.addWorkspaceToProject(workspaceNew, projectId, principal.getName());
}
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.valueOf(accept));
return new ResponseEntity<String>("success", httpHeaders, HttpStatus.OK);
}
}