Package com.mobius.controllers

Source Code of com.mobius.controllers.LiveCycleDoc

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();
        }
    }


}
TOP

Related Classes of com.mobius.controllers.LiveCycleDoc

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.