org.openbravo.erpCommon.info.ImageInfoBLOB.java Source code

Java tutorial

Introduction

Here is the source code for org.openbravo.erpCommon.info.ImageInfoBLOB.java

Source

/*
 *************************************************************************
 * The contents of this file are subject to the Openbravo  Public  License
 * Version  1.1  (the  "License"),  being   the  Mozilla   Public  License
 * Version 1.1  with a permitted attribution clause; you may not  use this
 * file except in compliance with the License. You  may  obtain  a copy of
 * the License at http://www.openbravo.com/legal/license.html 
 * Software distributed under the License  is  distributed  on  an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific  language  governing  rights  and  limitations
 * under the License. 
 * The Original Code is Openbravo ERP. 
 * The Initial Developer of the Original Code is Openbravo SLU 
 * All portions are Copyright (C) 2009-2014 Openbravo SLU 
 * All Rights Reserved. 
 * Contributor(s):  ______________________________________.
 ************************************************************************
 */
package org.openbravo.erpCommon.info;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.openbravo.base.model.Entity;
import org.openbravo.base.model.ModelProvider;
import org.openbravo.base.provider.OBProvider;
import org.openbravo.base.secureApp.HttpSecureAppServlet;
import org.openbravo.base.secureApp.VariablesSecureApp;
import org.openbravo.base.structure.BaseOBObject;
import org.openbravo.dal.core.OBContext;
import org.openbravo.dal.service.OBDal;
import org.openbravo.data.Sqlc;
import org.openbravo.erpCommon.utility.MimeTypeUtil;
import org.openbravo.erpCommon.utility.Utility;
import org.openbravo.model.ad.datamodel.Column;
import org.openbravo.model.ad.datamodel.Table;
import org.openbravo.model.ad.ui.Tab;
import org.openbravo.model.ad.utility.Image;
import org.openbravo.model.common.enterprise.Organization;
import org.openbravo.xmlEngine.XmlDocument;

public class ImageInfoBLOB extends HttpSecureAppServlet {
    private static final long serialVersionUID = 1L;

    public void init(ServletConfig config) {
        super.init(config);
        boolHist = false;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        VariablesSecureApp vars = new VariablesSecureApp(request);

        String columnName = vars.getStringParameter("columnName");
        if (columnName == null || columnName.equals(""))
            columnName = vars.getStringParameter("inpColumnName");
        String tableId = vars.getStringParameter("tableId");
        if (tableId == null || tableId.equals("")) {
            tableId = vars.getStringParameter("inpTableId");
        }
        if (tableId == null || tableId.equals("")) {
            String tabId = vars.getStringParameter("inpTabId");
            try {
                OBContext.setAdminMode(true);
                Tab tab = OBDal.getInstance().get(Tab.class, tabId);
                tableId = tab.getTable().getId();
            } finally {
                OBContext.restorePreviousMode();
            }
        }
        String imageID = vars.getStringParameter("inp" + Sqlc.TransformaNombreColumna(columnName));
        if (imageID == null || imageID.equals("")) {
            imageID = vars.getStringParameter("imageId");
        }

        String orgId = vars.getStringParameter("inpOrgId");
        if (orgId == null || orgId.equals("")) {
            orgId = vars.getStringParameter("inpadOrgId");
        }
        if (orgId == null || orgId.equals("")) {
            orgId = OBContext.getOBContext().getCurrentOrganization().getId();
        }

        String parentObjectId = vars.getStringParameter("parentObjectId");
        if (parentObjectId == null || parentObjectId.equals("")) {
            OBContext.setAdminMode(true);
            try {
                Table table = OBDal.getInstance().get(Table.class, vars.getStringParameter("inpTableId"));
                if (table != null) {
                    List<Column> cols = table.getADColumnList();
                    String keyCol = "";
                    for (Column col : cols) {
                        if (col.isKeyColumn()) {
                            keyCol = col.getDBColumnName();
                            break;
                        }
                    }
                    parentObjectId = vars.getStringParameter("inp" + Sqlc.TransformaNombreColumna(keyCol));
                }
            } finally {
                OBContext.restorePreviousMode();
            }

        }
        if (vars.commandIn("DEFAULT")) {

            printPageFrame(response, vars, imageID, tableId, columnName, parentObjectId, orgId);
        } else if (vars.getCommand().equals("SAVE")) {
            OBContext.setAdminMode(true);
            try {
                final FileItem fi = vars.getMultiFile("inpFile");
                byte[] bytea = fi.get();
                Long[] size = Utility.computeImageSize(bytea);
                String mimeType = MimeTypeUtil.getInstance().getMimeTypeName(bytea);
                // Using DAL to write the image data to the database
                Image image;
                if (imageID == null || imageID.equals("")) {
                    image = OBProvider.getInstance().get(Image.class);
                    Organization org = OBDal.getInstance().get(Organization.class, orgId);
                    image.setOrganization(org);
                    image.setBindaryData(bytea);
                    image.setActive(true);
                    image.setName("Image");
                    image.setWidth(size[0]);
                    image.setHeight(size[1]);
                    image.setMimetype(mimeType);
                    OBDal.getInstance().save(image);
                    OBDal.getInstance().flush();
                } else {
                    image = OBDal.getInstance().get(Image.class, imageID);
                    image.setActive(true);
                    image.setBindaryData(bytea);
                    image.setWidth(size[0]);
                    image.setHeight(size[1]);
                    image.setMimetype(mimeType);
                    OBDal.getInstance().flush();
                }
                response.setContentType("text/html; charset=UTF-8");
                PrintWriter writer = response.getWriter();
                writeRedirect(writer, image.getId(), columnName);
            } finally {
                OBContext.restorePreviousMode();
            }
        } else if (vars.getCommand().startsWith("SAVE_OB3")) {
            OBContext.setAdminMode(true);
            try {
                final FileItem fi = vars.getMultiFile("inpFile");
                byte[] bytea = fi.get();
                String mimeType = MimeTypeUtil.getInstance().getMimeTypeName(bytea);
                String imageSizeAction = vars.getStringParameter("imageSizeAction");
                String imageId = "";
                Long[] sizeOld = new Long[2];
                Long[] sizeNew = new Long[2];
                if (!mimeType.contains("image") || (!mimeType.contains("jpeg") && !mimeType.contains("png")
                        && !mimeType.contains("gif") && !mimeType.contains("bmp"))) {
                    imageId = "";
                    imageSizeAction = "WRONGFORMAT";
                    sizeOld[0] = (long) 0;
                    sizeOld[1] = (long) 0;
                    sizeNew[0] = (long) 0;
                    sizeNew[1] = (long) 0;
                } else {

                    int newWidth;
                    if (vars.getStringParameter("imageWidthValue") != "") {
                        newWidth = Integer.parseInt(vars.getStringParameter("imageWidthValue"));
                    } else {
                        newWidth = 0;
                    }
                    int newHeight;
                    if (vars.getStringParameter("imageHeightValue") != "") {
                        newHeight = Integer.parseInt(vars.getStringParameter("imageHeightValue"));
                    } else {
                        newHeight = 0;
                    }

                    if (imageSizeAction.equals("ALLOWED") || imageSizeAction.equals("ALLOWED_MINIMUM")
                            || imageSizeAction.equals("ALLOWED_MAXIMUM") || imageSizeAction.equals("RECOMMENDED")
                            || imageSizeAction.equals("RECOMMENDED_MINIMUM")
                            || imageSizeAction.equals("RECOMMENDED_MAXIMUM")) {
                        sizeOld[0] = (long) newWidth;
                        sizeOld[1] = (long) newHeight;
                        sizeNew = Utility.computeImageSize(bytea);
                    } else if (imageSizeAction.equals("RESIZE_NOASPECTRATIO")) {
                        sizeOld = Utility.computeImageSize(bytea);
                        bytea = Utility.resizeImageByte(bytea, newWidth, newHeight, false, false);
                        sizeNew = Utility.computeImageSize(bytea);
                    } else if (imageSizeAction.equals("RESIZE_ASPECTRATIO")) {
                        sizeOld = Utility.computeImageSize(bytea);
                        bytea = Utility.resizeImageByte(bytea, newWidth, newHeight, true, true);
                        sizeNew = Utility.computeImageSize(bytea);
                    } else if (imageSizeAction.equals("RESIZE_ASPECTRATIONL")) {
                        sizeOld = Utility.computeImageSize(bytea);
                        bytea = Utility.resizeImageByte(bytea, newWidth, newHeight, true, false);
                        sizeNew = Utility.computeImageSize(bytea);
                    } else {
                        sizeOld = Utility.computeImageSize(bytea);
                        sizeNew = sizeOld;
                    }

                    mimeType = MimeTypeUtil.getInstance().getMimeTypeName(bytea);
                    // Using DAL to write the image data to the database
                    Image image;

                    image = OBProvider.getInstance().get(Image.class);
                    Organization org = OBDal.getInstance().get(Organization.class, orgId);
                    image.setOrganization(org);
                    image.setBindaryData(bytea);
                    image.setActive(true);
                    image.setName("Image");
                    image.setWidth(sizeNew[0]);
                    image.setHeight(sizeNew[1]);
                    image.setMimetype(mimeType);
                    OBDal.getInstance().save(image);
                    OBDal.getInstance().flush();

                    imageId = image.getId();
                }
                response.setContentType("text/html; charset=UTF-8");
                PrintWriter writer = response.getWriter();
                String selectorId = orgId = vars.getStringParameter("inpSelectorId");
                writeRedirectOB3(writer, selectorId, imageId, imageSizeAction, sizeOld, sizeNew, null);
            } catch (Throwable t) {
                log4j.error("Error uploading image", t);
                response.setContentType("text/html; charset=UTF-8");
                PrintWriter writer = response.getWriter();
                String selectorId = orgId = vars.getStringParameter("inpSelectorId");
                writeRedirectOB3(writer, selectorId, "", "ERROR_UPLOADING", new Long[] { 0L, 0L },
                        new Long[] { 0L, 0L }, t.getMessage());
            } finally {
                OBContext.restorePreviousMode();
            }
        } else if (vars.getCommand().equals("DELETE")) {
            if (imageID != null && !imageID.equals("")) {
                OBContext.setAdminMode(true);
                try {
                    Image image = OBDal.getInstance().get(Image.class, imageID);
                    Table table = OBDal.getInstance().get(Table.class, tableId);
                    Entity entity = ModelProvider.getInstance().getEntityByTableName(table.getDBTableName());
                    String propertyName = entity.getPropertyByColumnName(columnName).getName();
                    BaseOBObject parentObject = OBDal.getInstance().get(entity.getName(), parentObjectId);
                    parentObject.set(propertyName, null);
                    OBDal.getInstance().flush();
                    OBDal.getInstance().remove(image);
                } finally {
                    OBContext.restorePreviousMode();
                }
                response.setContentType("text/html; charset=UTF-8");
                PrintWriter writer = response.getWriter();
                writeRedirect(writer, "", columnName);
            } else {
                printPageFrame(response, vars, imageID, tableId, columnName, parentObjectId, orgId);
            }
        } else if (vars.getCommand().startsWith("DELETE_OB3")) {
            if (imageID != null && !imageID.equals("")) {
                OBContext.setAdminMode(true);
                try {
                    Image image = OBDal.getInstance().get(Image.class, imageID);
                    OBDal.getInstance().flush();
                    OBDal.getInstance().remove(image);
                } finally {
                    OBContext.restorePreviousMode();
                }
            } else {
                printPageFrame(response, vars, imageID, tableId, columnName, parentObjectId, orgId);
            }
        } else {
            pageError(response);
        }
    }

    private void writeRedirectOB3(PrintWriter writer, String selectorId, String imageId, String imageSizeAction,
            Long[] sizeOld, Long[] sizeNew, String msg) {
        writer.write("<HTML><BODY><script type=\"text/javascript\">");
        writer.write("top." + selectorId + ".callback('" + imageId + "', '" + imageSizeAction + "', '" + sizeOld[0]
                + "' ,'" + sizeOld[1] + "' ,'" + sizeNew[0] + "' ,'" + sizeNew[1] + "'");

        if (StringUtils.isNotEmpty(msg)) {
            writer.write(", '" + StringEscapeUtils.escapeJavaScript(msg) + "'");
        }

        writer.write(");");
        writer.write("</SCRIPT></BODY></HTML>");
    }

    private void printPageFrame(HttpServletResponse response, VariablesSecureApp vars, String imageID,
            String tableId, String columnName, String parentObjectId, String orgId)
            throws IOException, ServletException {
        String[] discard;
        if (imageID.equals("")) {
            discard = new String[1];
            discard[0] = "divDelete";
        } else
            discard = new String[0];

        XmlDocument xmlDocument = xmlEngine.readXmlTemplate("org/openbravo/erpCommon/info/ImageInfoBLOB", discard)
                .createXmlDocument();

        xmlDocument.setParameter("parentObjectId", parentObjectId);
        xmlDocument.setParameter("imageId", imageID);
        xmlDocument.setParameter("inpColumnName", columnName);
        xmlDocument.setParameter("inpOrgId", orgId);
        xmlDocument.setParameter("tableId", tableId);
        xmlDocument.setParameter("directory", "var baseDirectory = \"" + strReplaceWith + "/\";\n");
        xmlDocument.setParameter("language", "defaultLang=\"" + vars.getLanguage() + "\";");
        xmlDocument.setParameter("theme", vars.getTheme());
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println(xmlDocument.print());
        out.close();
    }

    private void writeRedirect(PrintWriter writer, String imageId, String columnname) {
        writer.println("<html>");
        writer.println("<head>");
        writer.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
        writer.println(
                "<script language=\"JavaScript\" src=\"../../../../../web/js/searchs.js\" type=\"text/javascript\"></script>");
        writer.println("<script language=\"JavaScript\" type=\"text/javascript\">");
        writer.println("function onLoadDo(){");
        writer.println("var parentWindow = parent.opener;");
        writer.println("parentWindow.document.getElementById('" + columnname + "').value = \"" + imageId + "\";");
        writer.println("parentWindow.document.getElementById('" + columnname
                + "_R').src = \"../utility/ShowImage?id=" + imageId + "\";");
        if (imageId.equals("")) {
            writer.println("parentWindow.document.getElementById('" + columnname
                    + "_R').className = \"Image_NotAvailable_medium\"");
        } else {
            writer.println("parentWindow.document.getElementById('" + columnname
                    + "_R').className = \"dummyClass_\" + parent.opener.document.getElementById('" + columnname
                    + "_R').className;");
        }

        // When deleting an image, reset parent status to not changed in order to avoid trigger Autosave
        if (imageId.equals("")) {
            writer.println("parentWindow.isUserChanges = false;");
            writer.println("parentWindow.document.forms[0].inpLastFieldChanged.value=\"\";");
        }
        writer.println("window.close();");

        writer.println("try { parentWindow.changeToEditingMode('force'); } catch (e) {}");
        writer.println("}");
        writer.println("</script>");
        writer.println("</head>");
        writer.println("<body  onload=\"onLoadDo();\">");
        writer.println("</body>");
        writer.println("</html>");
    }

}