org.adempiere.webui.apps.FeedbackRequestWindow.java Source code

Java tutorial

Introduction

Here is the source code for org.adempiere.webui.apps.FeedbackRequestWindow.java

Source

/******************************************************************************
 * Copyright (C) 2013 Heng Sin Low                                            *
 * Copyright (C) 2013 Trek Global                                        *
 * This program is free software; you can redistribute it and/or modify it    *
 * under the terms version 2 of the GNU General Public License as published   *
 * by the Free Software Foundation. This program is distributed in the hope   *
 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.           *
 * See the GNU General Public License for more details.                       *
 * You should have received a copy of the GNU General Public License along    *
 * with this program; if not, write to the Free Software Foundation, Inc.,    *
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.                     *
 *****************************************************************************/
package org.adempiere.webui.apps;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;

import javax.activation.DataSource;

import org.adempiere.webui.AdempiereWebUI;
import org.adempiere.webui.component.AttachmentItem;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Textbox;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.editor.WTableDirEditor;
import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.FeedbackManager;
import org.adempiere.webui.window.FDialog;
import org.apache.commons.io.IOUtils;
import org.compiere.model.MAttachment;
import org.compiere.model.MColumn;
import org.compiere.model.MLookup;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MRequest;
import org.compiere.model.MRole;
import org.compiere.util.ByteArrayDataSource;
import org.compiere.util.CLogger;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Trx;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Center;
import org.zkoss.zul.Div;
import org.zkoss.zul.South;

/**
 * 
 * @author hengsin
 *
 */
public class FeedbackRequestWindow extends Window implements EventListener<Event> {

    /**
     * generated serial id
     */
    private static final long serialVersionUID = 8586980192148533197L;

    private static CLogger log = CLogger.getCLogger(FeedbackRequestWindow.class);

    protected WTableDirEditor requestTypeField, priorityField, salesRepField;
    protected Textbox txtSummary;
    protected ConfirmPanel confirmPanel;

    protected List<DataSource> attachments = new ArrayList<DataSource>();
    protected Div attachmentBox;

    public FeedbackRequestWindow() {

        super();

        setTitle(Msg.getMsg(Env.getCtx(), "RequestNew"));
        setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
        setWidth("400px");
        this.setSclass("popup-dialog");
        this.setBorder("normal");
        this.setShadow(true);
        this.setClosable(true);

        boolean readOnly = !MRole.getDefault().canUpdate(Env.getAD_Client_ID(Env.getCtx()),
                Env.getAD_Org_ID(Env.getCtx()), MRequest.Table_ID, 0, false);

        if (readOnly) {
            throw new RuntimeException(Msg.getMsg(Env.getCtx(), "AccessTableNoUpdate"));
        }

        Label lblRequestType = new Label("Request Type");
        Label lblPriority = new Label("Priority");
        Label lblSummary = new Label("Summary");
        Label lblSalesRep = new Label("Sales Representative");

        int columnID = MColumn.getColumn_ID(MRequest.Table_Name, MRequest.COLUMNNAME_R_RequestType_ID);
        MLookup lookup = MLookupFactory.get(Env.getCtx(), 0, 0, columnID, DisplayType.TableDir);
        requestTypeField = new WTableDirEditor("R_RequestType_ID", true, false, true, lookup);
        requestTypeField.setValue(Env.getContext(Env.getCtx(), "P232|R_RequestType_ID"));
        if (requestTypeField.getValue() == null || requestTypeField.getValue().equals(""))
            if (requestTypeField.getComponent().getItemCount() > 1)
                requestTypeField.setValue(requestTypeField.getComponent().getItemAtIndex(1).getValue());

        columnID = MColumn.getColumn_ID(MRequest.Table_Name, MRequest.COLUMNNAME_Priority);
        lookup = MLookupFactory.get(Env.getCtx(), 0, 0, columnID, DisplayType.List);
        priorityField = new WTableDirEditor("Priority", true, false, true, lookup);
        priorityField.setValue(Env.getContext(Env.getCtx(), "P232|Priority"));
        if (priorityField.getValue() == null || priorityField.getValue().equals(""))
            if (priorityField.getComponent().getItemCount() > 1)
                priorityField.setValue(priorityField.getComponent().getItemAtIndex(1).getValue());

        columnID = MColumn.getColumn_ID(MRequest.Table_Name, MRequest.COLUMNNAME_SalesRep_ID);
        lookup = MLookupFactory.get(Env.getCtx(), 0, 0, columnID, DisplayType.TableDir);
        salesRepField = new WTableDirEditor("SalesRep_ID", true, false, true, lookup);
        salesRepField.setValue(Env.getContextAsInt(Env.getCtx(), "SalesRep_ID"));
        if (salesRepField.getValue() == null || salesRepField.getValue().equals("0"))
            if (salesRepField.getComponent().getItemCount() > 1)
                salesRepField.setValue(salesRepField.getComponent().getItemAtIndex(1).getValue());

        txtSummary = new Textbox();
        txtSummary.setRows(10);
        txtSummary.setWidth("95%");
        txtSummary.setHeight("100%");

        confirmPanel = new ConfirmPanel(true);
        confirmPanel.addActionListener(this);

        Grid grid = GridFactory.newGridLayout();
        grid.setVflex("min");

        Rows rows = new Rows();
        grid.appendChild(rows);

        Row row = rows.newRow();
        row.setStyle("padding: 4px 4px 0px 6px");
        row.appendChild(lblRequestType);

        row = rows.newRow();
        row.setStyle("padding: 0px 4px 4px 6px");
        row.appendChild(requestTypeField.getComponent());

        row = rows.newRow();
        row.setStyle("padding: 4px 4px 0px 6px");
        row.appendChild(lblPriority);

        row = rows.newRow();
        row.setStyle("padding: 0px 4px 4px 6px");
        row.appendChild(priorityField.getComponent());

        row = rows.newRow();
        row.setStyle("padding: 4px 4px 0px 6px");
        row.appendChild(lblSummary);

        row = rows.newRow();
        row.setStyle("padding: 0px 4px 4px 6px");
        row.appendChild(txtSummary);

        row = rows.newRow();
        row.setStyle("padding: 4px 4px 0px 6px");
        row.appendChild(lblSalesRep);

        row = rows.newRow();
        row.setStyle("padding: 0px 4px 4px 6px");
        row.appendChild(salesRepField.getComponent());

        row = rows.newRow();
        row.setStyle("padding: 4px 4px 0px 6px");
        row.appendChild(new Label(Msg.getMsg(Env.getCtx(), "Attachment")));

        attachmentBox = new Div();
        attachmentBox.setHflex("1");
        attachmentBox.setVflex("1");
        row = rows.newRow();
        row.setStyle("padding: 0px 4px 4px 6px");
        row.appendChild(attachmentBox);

        Borderlayout borderlayout = new Borderlayout();
        this.appendChild(borderlayout);
        borderlayout.setHflex("1");
        borderlayout.setVflex("min");

        Center centerPane = new Center();
        centerPane.setSclass("dialog-content");
        centerPane.setAutoscroll(true);
        borderlayout.appendChild(centerPane);

        centerPane.appendChild(grid);
        grid.setVflex("1");
        grid.setHflex("1");

        South southPane = new South();
        southPane.setSclass("dialog-footer");
        borderlayout.appendChild(southPane);
        southPane.appendChild(confirmPanel);

        Button btn = new Button();
        btn.setImage(ThemeManager.getThemeResource("images/Attachment24.png"));
        btn.setUpload(AdempiereWebUI.getUploadSetting());
        btn.addEventListener(Events.ON_UPLOAD, this);
        btn.setTooltiptext(Msg.getMsg(Env.getCtx(), "Attachment"));
        confirmPanel.addComponentsLeft(btn);
        confirmPanel.getButton(ConfirmPanel.A_OK).setWidgetListener("onClick", "zAu.cmd0.showBusy(null)");

        addAttachment(FeedbackManager.getLogAttachment(false), false);
    }

    public void onEvent(Event e) throws Exception {
        if (e.getTarget() == confirmPanel.getButton(ConfirmPanel.A_OK)) {
            Clients.clearBusy();
            // Check Mandatory fields
            if (requestTypeField.getValue() == null || requestTypeField.getValue().equals("0"))
                throw new WrongValueException(requestTypeField.getComponent(),
                        Msg.translate(Env.getCtx(), "FillMandatory"));
            if (priorityField.getValue() == null || priorityField.getValue().equals(""))
                throw new WrongValueException(priorityField.getComponent(),
                        Msg.translate(Env.getCtx(), "FillMandatory"));
            if (txtSummary.getText() == null || txtSummary.getText().equals(""))
                throw new WrongValueException(txtSummary, Msg.translate(Env.getCtx(), "FillMandatory"));
            if (salesRepField.getValue() == null || salesRepField.getValue().equals("0"))
                throw new WrongValueException(salesRepField.getComponent(),
                        Msg.translate(Env.getCtx(), "FillMandatory"));

            saveRequest();

            this.detach();
        } else if (e.getTarget() == confirmPanel.getButton(ConfirmPanel.A_CANCEL)) {
            this.detach();
        } else if (e instanceof UploadEvent) {
            UploadEvent ue = (UploadEvent) e;
            Media media = ue.getMedia();
            if (media != null) {
                byte[] data = getMediaData(media);
                ByteArrayDataSource dataSource = new ByteArrayDataSource(data, media.getContentType());
                dataSource.setName(media.getName());
                addAttachment(dataSource, true);
            }
        }
    }

    protected void saveRequest() throws IOException {
        Trx trx = Trx.get(Trx.createTrxName("SaveNewRequest"), true);
        try {
            trx.start();
            MRequest request = createMRequest(trx);

            boolean success = request.save();
            if (success) {
                MAttachment attachment = null;
                for (DataSource ds : attachments) {
                    if (attachment == null) {
                        attachment = new MAttachment(Env.getCtx(), 0, request.get_TrxName());
                        attachment.setAD_Table_ID(request.get_Table_ID());
                        attachment.setRecord_ID(request.get_ID());
                    }

                    attachment.addEntry(ds.getName(), IOUtils.toByteArray(ds.getInputStream()));
                }
                if (attachment != null)
                    success = attachment.save();

                if (success)
                    success = trx.commit();

            }

            if (success) {
                FDialog.info(0, null, Msg.getMsg(Env.getCtx(), "Saved"));
            } else {
                trx.rollback();
                FDialog.error(0, this, Msg.getMsg(Env.getCtx(), "SaveError"));
            }
        } finally {
            trx.close();
        }
    }

    protected MRequest createMRequest(Trx trx) {
        MRequest request = new MRequest(Env.getCtx(), 0, trx.getTrxName());
        request.setAD_Org_ID(Env.getAD_Org_ID(Env.getCtx()));
        request.setR_RequestType_ID((Integer) requestTypeField.getValue());
        request.setPriority((String) priorityField.getValue());
        request.setSummary(txtSummary.getText());
        request.setSalesRep_ID((Integer) salesRepField.getValue());
        return request;
    }

    public void addAttachment(DataSource dataSource, boolean removable) {
        attachments.add(dataSource);
        AttachmentItem item = new AttachmentItem(dataSource, attachments, removable);
        attachmentBox.appendChild(item);
        getFirstChild().invalidate();
    }

    private byte[] getMediaData(Media media) {
        byte[] bytes = null;

        try {
            if (media.inMemory()) {
                bytes = media.isBinary() ? media.getByteData()
                        : media.getStringData().getBytes(getCharset(media.getContentType()));
            } else {

                InputStream is = media.getStreamData();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buf = new byte[1000];
                int byteread = 0;

                while ((byteread = is.read(buf)) != -1)
                    baos.write(buf, 0, byteread);

                bytes = baos.toByteArray();
            }
        } catch (IOException e) {
            log.log(Level.SEVERE, e.getLocalizedMessage(), e);
            throw new IllegalStateException(e.getLocalizedMessage());
        }

        return bytes;
    }

    private String getCharset(String contentType) {
        if (contentType != null) {
            int j = contentType.indexOf("charset=");
            if (j >= 0) {
                String cs = contentType.substring(j + 8).trim();
                if (cs.length() > 0)
                    return cs;
            }
        }
        return "UTF-8";
    }
}