prodocServ.Oper.java Source code

Java tutorial

Introduction

Here is the source code for prodocServ.Oper.java

Source

/*
 * OpenProdoc
 * 
 * See the help doc files distributed with
 * this work for additional information regarding copyright ownership.
 * Joaquin Hierro licenses this file to You under:
 * 
 * License GNU GPL v3 http://www.gnu.org/licenses/gpl.html
 * 
 * you may not use this file except in compliance with the License.  
 * Unless agreed to in writing, software is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * author: Joaquin Hierro      2011
 * 
 */

/*
 * Oper.java
 *
 * Created on 29-ene-2014, 0:52:22
 */

package prodocServ;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import prodoc.DriverGeneric;
import prodoc.DriverRemote;
import prodoc.PDDocs;
import prodoc.PDException;
import prodoc.PDLog;
import prodoc.PDMimeType;
import prodoc.ProdocFW;

/**
 *
 * @author jhierrot
 */
public class Oper extends HttpServlet {

    protected static String ProdocProperRef = null;

    private static boolean FWStartted = false;

    /** Initializes the servlet.
     * @param config 
     * @throws ServletException 
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }
    //-----------------------------------------------------------------------------------------------

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException
     * @throws IOException
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/xml;charset=UTF-8");
        response.setStatus(HttpServletResponse.SC_OK);
        try {
            if (!FWStartted) {
                StartFW();
                FWStartted = true;
            }
            if (PDLog.isDebug())
                PDLog.Debug("##########################################################################");
            if (Connected(request) && request.getContentType().contains("multipart")) {
                InsFile(request, response);
                return;
            }
            if (request.getParameter(DriverRemote.ORDER) == null) {
                PrintWriter out = response.getWriter();
                Answer(request, out, "<OPD><Result>KO</Result><Msg>Disconnected</Msg></OPD>");
                out.close();
                return;
            }
            String Order = request.getParameter(DriverRemote.ORDER);
            if (Connected(request) && Order.equals(DriverGeneric.S_RETRIEVEFILE)) {
                SendFile(request, response);
                return;
            }
            if (Connected(request) || Order.equals(DriverGeneric.S_LOGIN)) {
                PrintWriter out = response.getWriter();
                ProcessPage(request, out);
                out.close();
            } else {
                PrintWriter out = response.getWriter();
                Answer(request, out, false, "<OPD><Result>KO</Result><Msg>Disconnected</Msg></OPD>", null);
                out.close();
            }
        } catch (Exception e) {
            PrintWriter out = response.getWriter();
            AddLog(e.getMessage());
            Answer(request, out, false, e.getMessage(), null);
            //    e.printStackTrace();
            out.close();
        }
    }

    //-----------------------------------------------------------------------------------------------
    /**
     *
     * @param Req
     * @param out
     * @param Ok Result of operation
     * @param Message Optional Message
     * @param Data Optional XML Data
     */
    static public void Answer(HttpServletRequest Req, PrintWriter out, boolean Ok, String Message, String Data) {
        out.println("<OPD>");
        out.println("<Result>" + (Ok ? "OK" : "KO") + "</Result>");
        if (Message != null && Message.length() != 0)
            out.println("<Msg>" + Message.replace('<', '^') + "</Msg>");
        if (Data != null && Data.length() != 0)
            out.println("<Data>" + Data + "</Data>");
        if (PDLog.isDebug()) {
            PDLog.Debug("Answer:<Result>" + (Ok ? "OK" : "KO") + "</Result>");
            if (Message != null && Message.length() != 0)
                PDLog.Debug("<Msg>" + Message + "</Msg>");
            if (Data != null && Data.length() != 0)
                PDLog.Debug("<Data>" + Data + "</Data>");
        }
        out.println("</OPD>");
    }

    //-----------------------------------------------------------------------------------------------
    /**
     *
     * @param Req
     * @param out
     * @param AllMessage
     */
    static public void Answer(HttpServletRequest Req, PrintWriter out, String AllMessage) {
        if (PDLog.isDebug())
            PDLog.Debug("Answer:" + AllMessage);
        out.println(AllMessage);
    }
    //-----------------------------------------------------------------------------------------------

    /**
     * 
     * @param Texto
     */
    protected void AddLog(String Texto) {
        System.out.println(">> " + this.getServletName() + ":" + new Date() + "=" + Texto);
    }

    //-----------------------------------------------------------------------------------------------
    /**
     * 
     * @param Req
     * @return
     * @throws PDException
     */
    protected boolean Connected(HttpServletRequest Req) throws Exception {
        if (getSessOPD(Req) == null)
            return (false);
        else
            return (true);
    }

    //-----------------------------------------------------------------------------------------------
    /**
     * 
     * @param Req
     * @param out
     * @throws Exception
     */
    protected void ProcessPage(HttpServletRequest Req, PrintWriter out) throws Exception {
        String Order = Req.getParameter(DriverRemote.ORDER);
        String Param = Req.getParameter(DriverRemote.PARAM);
        if (PDLog.isDebug()) {
            PDLog.Debug("From:" + Req.getRemoteHost() + "/" + Req.getRemoteHost() + ":" + Req.getRemoteUser());
            PDLog.Debug("Order:" + Order);
            PDLog.Debug("Param:" + Param);
        }
        DocumentBuilder DB = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document XMLObjects = DB.parse(new ByteArrayInputStream(Param.getBytes("UTF-8")));
        if (Order.equals(DriverGeneric.S_LOGIN)) {
            NodeList OPDObjectList = XMLObjects.getElementsByTagName("U");
            Node OPDObject = OPDObjectList.item(0);
            String User = OPDObject.getTextContent();
            OPDObjectList = XMLObjects.getElementsByTagName("C");
            OPDObject = OPDObjectList.item(0);
            String Pass = OPDObject.getTextContent();
            DriverGeneric D = ProdocFW.getSession("PD", User, Pass);
            Req.getSession().setAttribute("PRODOC_SESS", D);
            Answer(Req, out, true, null, null);
            return;
        } else if (Order.equals(DriverGeneric.S_UNLOCK)) {
            getSessOPD(Req).UnLock();
            Req.getSession().setAttribute("PRODOC_SESS", null);
            Answer(Req, out, true, null, null);
            return;
        }
        DriverGeneric D = getSessOPD(Req);
        String Results = D.RemoteOrder(Order, XMLObjects);
        Answer(Req, out, Results);
        XMLObjects = null;
        DB.reset();
    }
    //-----------------------------------------------------------------------------------------------

    /** Handles the HTTP <code>GET</code> method.
    * @param request servlet request
     * @param response servlet response
     * @throws ServletException
     * @throws IOException  
    */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    //-----------------------------------------------------------------------------------------------

    /** Handles the HTTP <code>POST</code> method.
    * @param request servlet request
     * @param response servlet response
     * @throws ServletException
     * @throws IOException
    */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    //-----------------------------------------------------------------------------------------------

    /** Returns a short description of the servlet.
     * @return 
     */
    @Override
    public String getServletInfo() {
        return "Servlet for Oper";
    }

    //-----------------------------------------------------------------------------------------------
    /**
     * 
     * @return
     */
    static public String getUrlServlet() {
        return ("Oper");
    }

    //----------------------------------------------------------
    /**
     *
     * @param Req
     * @return
     */
    public static DriverGeneric getSessOPD(HttpServletRequest Req) {
        return (DriverGeneric) Req.getSession(true).getAttribute("PRODOC_SESS");
    }

    //--------------------------------------------------------------
    /**
     *
     * @param Req
     * @param OPDSess
     */
    public static void setSessOPD(HttpServletRequest Req, DriverGeneric OPDSess) {
        Req.getSession().setAttribute("PRODOC_SESS", OPDSess);
    }

    //--------------------------------------------------------------
    /**
     * 
     * @return
     */
    static public String getVersion() {
        return ("0.9");
    }

    //-----------------------------------------------------------------------------------------------
    public static String getProdocProperRef() throws Exception {
        if (ProdocProperRef == null) {
            InputStream Is;
            String Path = System.getProperty("user.home");
            try {
                Is = new FileInputStream(Path + File.separator + "OPDWeb.properties");
            } catch (FileNotFoundException ex) {
                Is = null;
            }
            if (Is == null) {
                Path = System.getenv("OPDWeb");
                Is = new FileInputStream(Path + File.separator + "OPDWeb.properties");
            }
            Properties p = new Properties();
            p.load(Is);
            Is.close();
            ProdocProperRef = p.getProperty("OPDConfig");
        }
        return (ProdocProperRef);
    }

    //----------------------------------------------------------   
    private void StartFW() throws Exception {
        ProdocFW.InitProdoc("PD", getProdocProperRef());
    }
    //----------------------------------------------------------   

    private void SendFile(HttpServletRequest Req, HttpServletResponse response) throws Exception {
        String Param = Req.getParameter(DriverRemote.PARAM);
        if (PDLog.isDebug())
            PDLog.Debug("SendFile Param:" + Param);
        DocumentBuilder DB = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document XMLObjects = DB.parse(new ByteArrayInputStream(Param.getBytes("UTF-8")));
        NodeList OPDObjectList = XMLObjects.getElementsByTagName("Id");
        Node OPDObject = OPDObjectList.item(0);
        String Id = OPDObject.getTextContent();
        OPDObjectList = XMLObjects.getElementsByTagName("Ver");
        OPDObject = OPDObjectList.item(0);
        String Ver = OPDObject.getTextContent();
        DB.reset();
        PDDocs doc = new PDDocs(getSessOPD(Req));
        doc.setPDId(Id);
        if (Ver != null && Ver.length() != 0)
            doc.LoadVersion(Id, Ver);
        else
            doc.LoadCurrent(Id);
        ServletOutputStream out = response.getOutputStream();
        PDMimeType mt = new PDMimeType(getSessOPD(Req));
        mt.Load(doc.getMimeType());
        response.setContentType(mt.getMimeCode());
        response.setHeader("Content-disposition", "inline; filename=" + doc.getName());
        try {
            if (Ver != null && Ver.length() != 0)
                doc.getStreamVer(out);
            else
                doc.getStream(out);
        } catch (Exception e) {
            out.close();
            throw e;
        }
        out.close();
    }

    //----------------------------------------------------------   
    /**
     * 
     * @param request
     * @param response 
     */
    private void InsFile(HttpServletRequest Req, HttpServletResponse response) throws Exception {
        if (PDLog.isDebug())
            PDLog.Debug("InsFile");
        FileItem ItemFile = null;
        InputStream FileData = null;
        HashMap ListFields = new HashMap();
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1000000);
        ServletFileUpload upload = new ServletFileUpload(factory);
        List items = upload.parseRequest(Req);
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (item.isFormField())
                ListFields.put(item.getFieldName(), item.getString());
            else {
                FileData = item.getInputStream();
                ItemFile = item;
            }
        }
        DriverGeneric PDSession = getSessOPD(Req);
        String Id = (String) ListFields.get("Id");
        String Ver = (String) ListFields.get("Ver");
        PDSession.InsertFile(Id, Ver, FileData);
        if (FileData != null)
            FileData.close();
        if (ItemFile != null)
            ItemFile.delete();
        items.clear(); // to help and speed gc
        PrintWriter out = response.getWriter();
        Answer(Req, out, true, null, null);
        out.close();
    }
    //----------------------------------------------------------   
}