package com.mobius.controllers;
/**
* Created with IntelliJ IDEA.
* User: Pawel
* Date: 19.12.13
* Time: 13:05
* To change this template use File | Settings | File Templates.
*/
import com.adobe.idp.dsc.InvocationRequest;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory;
import com.adobe.idp.taskmanager.dsc.client.TaskManagerClientFactory;
import com.adobe.idp.taskmanager.dsc.client.task.*;
import com.mobius.model.entity.TblPatientE;
import com.mobius.utils.*;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.springframework.core.io.Resource;
import com.mobius.livecycle.LiveCycleService;
import com.mobius.model.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.w3c.dom.*;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@Controller
@RequestMapping("/doc")
public class LiveCycleDoc {
String fP(String fname) {
return "c:\\projects\\eform_rest\\resurce\\" + fname;
}
@RequestMapping(method = RequestMethod.POST, produces = "application/json", value = "/task")
public
@ResponseBody
ResponseData postdataTask(@RequestBody RequestTemplateData data, BindingResult result, HttpServletRequest request) {
try {
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
LoggedUser user = ((MyAuthenticationToken) authentication).getMyUser();
LiveCycleService lvService = user.getLiveCycleService();
ServiceClientFactory serviceClientFactory = lvService.getServiceClientFactory();
LiveCycleTask.impersonateUserAndSetClientFactory(user.getCanonicalName(), user.getDomainName(), serviceClientFactory, user.getResourceManager());
TaskManager taskManager = TaskManagerClientFactory.getTaskManager(serviceClientFactory);
com.adobe.idp.Document myDocument = getDocument(data);
long taskID = data.getProcess().getId();
TaskInfo tInfo = taskManager.getTaskInfo(taskID);
FormInstance[] arrFormInstances = tInfo.getTaskItems();
FormInstance fiTask = arrFormInstances[0];
InputStream in = myDocument.getInputStream();
byte[] formarray = new byte[in.available()];
in.read(formarray);
//Get an empty form instance
FormInstance newForm = taskManager.getEmptyForm();
newForm.setTemplatePath(fiTask.getTemplatePath());
newForm.setXFAData(formarray);
newForm.setDocument(myDocument);
//Save the modified form
SaveTaskResult taskResult = taskManager.save(taskID, newForm);
CompleteTaskResult completeTaskResult = taskManager.completeTask(taskID, data.getProcess().getAction_name());
System.out.println(completeTaskResult.isProcessInitiated());
} catch (Exception exc) {
exc.printStackTrace();
return ResponseData.error(exc);
}
return ResponseData.succes();
}
@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public
@ResponseBody
ResponseData postdata(@RequestBody RequestTemplateData data, BindingResult result, HttpServletRequest request) {
try {
if (data.isTask()) {
return postdataTask(data, result, request);
}
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
LoggedUser user = ((MyAuthenticationToken) authentication).getMyUser();
LiveCycleService lvService = user.getLiveCycleService();
EntityManager em = MyEntityManagerFactory.getEm(request.getSession());
Query q = em.createQuery("SELECT t.process FROM TblDocTypeE t where t.id=:id", String.class);
q.setParameter("id", data.getDoc_type());
List l = q.getResultList();
String process = (String) l.get(0);
ApplicationContext appContext = new ClassPathXmlApplicationContext();
Resource resource = appContext.getResource("classpath:patient.xml");
InputStream is = resource.getInputStream();
ObjectMapper objectMapper = new ObjectMapper();
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
HashMap<String, Object> patientValues;
if(data.getPatient()!=null) {
q = em.createQuery("SELECT p FROM TblPatientE p where p.id=:id", TblPatientE.class);
q.setParameter("id", data.getPatient());
l = q.getResultList();
TblPatientE patient = (TblPatientE)l.get(0);
patientValues = patient.xfaData(user.getUserName());
} else {
patientValues = objectMapper.readValue(data.getPatient_data(), typeRef);
}
//JavaType type = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, String.class) ;
HashMap<String, Object> formValues = objectMapper.readValue(data.getData(), typeRef);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);
Node dataDescriptionNode = XMLXFAHelper.findNode(document.getDocumentElement(), "dd:dataDescription");
Node dataNode = XMLXFAHelper.findNode(document.getDocumentElement(), "xfa:data");
Node clonedNode = XMLXFAHelper.findNode(dataDescriptionNode, "patient").cloneNode(true);
//dataNode.appendChild(clonedNode);
//document.renameNode(clonedNode,null,"xfa:data");
dataNode.appendChild(prepareXml(clonedNode, patientValues, formValues,document));
Element newNode = document.createElement("FSTARGETURL_");
dataNode.appendChild(newNode);
newNode = document.createElement("FSTEMPLATE_");
newNode.setTextContent("/Applications/Prescription/1.0/forms/InPatientPrescription.xdp");
dataNode.appendChild(newNode);
newNode = document.createElement("FSFORMQUERY_");
newNode.setTextContent("/Applications/Prescription/1.0/forms/InPatientPrescription.xdp");
dataNode.appendChild(newNode);
newNode = document.createElement("FSTRANSFORMATIONID_");
newNode.setTextContent("PDFForm");
dataNode.appendChild(newNode);
newNode = document.createElement("FSTARGETURL_");
dataNode.appendChild(newNode);
newNode = document.createElement("FSAWR_");
dataNode.appendChild(newNode);
newNode = document.createElement("FSWR_");
dataNode.appendChild(newNode);
newNode = document.createElement("FSCRURI_");
newNode.setTextContent("repository://");
dataNode.appendChild(newNode);
newNode = document.createElement("FSBASEURL_");
dataNode.appendChild(newNode);
DOMSource domSource = new DOMSource(document);
StringWriter writer = new StringWriter();
StreamResult streamResult = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, streamResult);
//String xmlString = writer.toString();
//System.out.print(xmlString);
// Resource resourceP = appContext.getResource("classpath:proper_data_sended_to_livecycle.xml");
// InputStream isP = resourceP.getInputStream();
// DocumentBuilder builderP = factory.newDocumentBuilder();
// Document documentP = builderP.parse(isP);
// invokeAndPostDataToLC(documentP, process, lvService);
invokeAndPostDataToLC(document, process, lvService);
} catch (Exception exc) {
exc.printStackTrace();
return ResponseData.error(exc);
}
return ResponseData.succes();
}
//get Adobe livecycle document from data
private com.adobe.idp.Document getDocument(RequestTemplateData data) throws IOException, ParserConfigurationException, ParseException, SAXException, TransformerException {
ApplicationContext appContext = new ClassPathXmlApplicationContext();
Resource resource = appContext.getResource("classpath:patient.xml");
InputStream is = resource.getInputStream();
ObjectMapper objectMapper = new ObjectMapper();
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {
};
HashMap<String, Object> patientValues = objectMapper.readValue(data.getPatient_data(), typeRef);
HashMap<String, Object> formValues = objectMapper.readValue(data.getData(), typeRef);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);
Node dataDescriptionNode = XMLXFAHelper.findNode(document.getDocumentElement(), "dd:dataDescription");
Node dataNode = XMLXFAHelper.findNode(document.getDocumentElement(), "xfa:data");
Node clonedNode = XMLXFAHelper.findNode(dataDescriptionNode, "patient").cloneNode(true);
//dataNode.appendChild(clonedNode);
dataNode.appendChild(prepareXml(clonedNode, patientValues, formValues,document));
DOMSource source = new DOMSource(document);
StringWriter xmlAsWriter = new StringWriter();
StreamResult result = new StreamResult(xmlAsWriter);
TransformerFactory.newInstance().newTransformer().transform(source, result);
// write changes
ByteArrayInputStream inputStream = new ByteArrayInputStream(xmlAsWriter.toString().getBytes("UTF-8"));
com.adobe.idp.Document myDocument = new com.adobe.idp.Document(inputStream);
return myDocument;
}
public String deserializeObject(Object value) throws IOException, ParseException {
if (value != null) {
if (value.getClass().equals(String.class)) {
String objectString = (String) value;
if (objectString.startsWith("{\"__date\":")) {
ObjectMapper objectMapper = new ObjectMapper();
ResponseDate responseDate = objectMapper.readValue(objectString, ResponseDate.class);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(responseDate.get__date());
}
return objectString;
}
HashMap<String, Object> objectHashMapp = new HashMap<String, Object>();
if (value.getClass().equals(LinkedHashMap.class)) {
HashMap<String, Object> subvalues = (HashMap<String, Object>) value;
if (subvalues.containsKey("__date")) {
SimpleDateFormat formatterFrom = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date dateObj = formatterFrom.parse((String) subvalues.get("__date"));
return formatter.format(dateObj);
}
}
return value.toString();
}
return "";
}
public Node prepareXml(Node patientNode, HashMap<String, Object> patientValues, HashMap<String, Object> formValues,Document document) throws IOException, ParseException {
Node patient = patientNode;//document.createElement("patient");
for (Map.Entry<String, Object> entry : patientValues.entrySet()) {
if (entry.getValue() != null) {
Node lastnode = patient;
String nodeName = entry.getKey();
Node newNode = XMLXFAHelper.findNodeDeep(patient, nodeName);
if(newNode!=null) {
newNode.setTextContent(deserializeObject(entry.getValue()));
}else {
if (entry.getKey().contains("__")) {
String[] subkeys = entry.getKey().split("__");
for (int i = 0; i < subkeys.length; i++) {
if (i < subkeys.length - 1) {
newNode = XMLXFAHelper.findNode(lastnode, subkeys[i]);
if (newNode == null) {
newNode = document.createElement(subkeys[i]);
lastnode.appendChild(newNode);
}
lastnode = newNode;
} else {
nodeName = subkeys[i];
}
}
}
newNode = document.createElement(nodeName);
newNode.setTextContent(deserializeObject(entry.getValue()));
lastnode.appendChild(newNode);
}
}
}
//Node form = document.createElement("form");
Node form = XMLXFAHelper.findNode(patientNode,"form");
//patient.appendChild(form);
for (Map.Entry<String, Object> entry : formValues.entrySet()) {
if (entry.getValue() != null) {
Node lastnode = form;
String nodeName = entry.getKey();
Node newNode = XMLXFAHelper.findNodeDeep(form, nodeName);
if(newNode!=null) {
newNode.setTextContent(deserializeObject(entry.getValue()));
}else {
if (entry.getKey().contains("__")) {
String[] subkeys = entry.getKey().split("__");
for (int i = 0; i < subkeys.length; i++) {
if (i < subkeys.length - 1) {
newNode = XMLXFAHelper.findNode(lastnode, subkeys[i]);
if (newNode == null) {
newNode = document.createElement(subkeys[i]);
lastnode.appendChild(newNode);
}
lastnode = newNode;
} else {
nodeName = subkeys[i];
}
}
}
newNode = document.createElement(nodeName);
newNode.setTextContent(deserializeObject(entry.getValue()));
lastnode.appendChild(newNode);
}
}
}
Element newNode = document.createElement("FSTARGETURL_");
patient.appendChild(newNode);
newNode = document.createElement("AWS_ASSIGNED_ID");
newNode.setTextContent("F995BA79-48A9-102E-B7D8-0000C0A80264");
patient.appendChild(newNode);
newNode = document.createElement("AWS_TASKID");
newNode.setTextContent("11780");
patient.appendChild(newNode);
newNode = document.createElement("AWS_MAILTO");
newNode.setTextContent("admin@company.com");
patient.appendChild(newNode);
newNode = document.createElement("AWS_ACTION");
patient.appendChild(newNode);
newNode = document.createElement("AWS_STATUS");
newNode.setTextContent("2");
patient.appendChild(newNode);
newNode = document.createElement("AWS_CHOICE");
patient.appendChild(newNode);
return patient;
}
private void invokeAndPostDataToLC(Document xmlData, String process, LiveCycleService lvService) {
try {
ServiceClientFactory serviceClientFactory = lvService.getServiceClientFactory();
Map<String, Object> inputParams = new HashMap<String, Object>();
inputParams.put("formData1", xmlData);
InvocationRequest request = serviceClientFactory.createInvocationRequest(process, "invoke", inputParams, false);
serviceClientFactory.getServiceClient().invoke(request);
} catch (Exception exc) {
exc.printStackTrace();
}
}
}