/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * 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. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.adempiere.webui.window; import java.util.logging.Level; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.Window; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.util.OSTask; import org.compiere.model.MTask; import org.compiere.util.CLogger; import org.compiere.util.Env; import org.compiere.util.Msg; import org.zkoss.zk.ui.DesktopUnavailableException; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zkex.zul.Borderlayout; import org.zkoss.zkex.zul.Center; import org.zkoss.zkex.zul.South; import org.zkoss.zul.Div; import org.zkoss.zul.Html; /** * Application Task * * @author Jorg Janke * @version $Id: ATask.java,v 1.2 2006/07/30 00:51:27 jjanke Exp $ * * @author Low Heng Sin */ public class WTask extends Window implements EventListener { /** * */ private static final long serialVersionUID = -1235619876719378703L; /** * Start Application Task * @param task task model */ public static void start (final String title, final MTask task) { new WTask(title, task); } // start private MTask m_task; private Thread taskThread; /************************************************************************** * Full Constructor * @param title title * @param task task */ public WTask (String title, MTask task) { super (); setTitle(title); try { zkInit(); setAttribute(Window.MODE_KEY, Window.MODE_EMBEDDED); // m_task = task; if (task.isServerProcess()) info.setContent("Executing on Server ..."); else info.setContent("Executing locally ..."); SessionManager.getAppDesktop().showWindow(this); Events.echoEvent("executeTask", this, null); } catch(Exception e) { log.log(Level.SEVERE, task.toString(), e); } } // ATask public void executeTask() { Runnable runnable = new Runnable() { public void run() { //get full control of desktop org.zkoss.zk.ui.Desktop desktop = WTask.this.getDesktop(); String cmd = Msg.parseTranslation(Env.getCtx(), m_task.getOS_Command()).trim(); if (cmd == null || cmd.equals("")) info.setContent("Cannot execute '" + m_task.getOS_Command() + "'"); OSTask osTask = new OSTask(cmd); osTask.start(); while (true) { try { Thread.sleep(500); Executions.activate(desktop, 500); try { StringBuffer sb = new StringBuffer(); sb.append(osTask.getOut()) .append("<br>-----------<br>") .append(osTask.getErr()) .append("<br>-----------"); info.setContent(sb.toString().replace("\n", "<br>")); if (!osTask.isAlive()) { confirmPanel.getButton(ConfirmPanel.A_CANCEL).setEnabled(false); confirmPanel.getOKButton().setEnabled(true); break; } } finally{ //release full control of desktop Executions.deactivate(desktop); } } catch (DesktopUnavailableException e) { log.log(Level.FINE, e.getLocalizedMessage(), e); osTask.interrupt(); break; } catch (InterruptedException e) { log.log(Level.FINE, e.getLocalizedMessage(), e); osTask.interrupt(); break; } } } }; taskThread = new Thread(runnable); taskThread.start(); } /** Logger */ private static CLogger log = CLogger.getCLogger(WTask.class); private ConfirmPanel confirmPanel = new ConfirmPanel(true); private Html info = new Html(); /** * Static Layout * @throws Exception */ private void zkInit() throws Exception { Borderlayout layout = new Borderlayout(); layout.setWidth("100%"); layout.setHeight("100%"); layout.setStyle("position: absolute;"); this.setHeight("100%"); this.setWidth("100%"); appendChild(layout); Center center = new Center(); layout.appendChild(center); Div div = new Div(); div.setStyle("width: 100%; height:100%; overflow: auto"); div.appendChild(info); center.appendChild(div); center.setFlex(true); South south = new South(); layout.appendChild(south); south.setStyle("border: none"); south.appendChild(confirmPanel); // confirmPanel.addActionListener(this); confirmPanel.getOKButton().setEnabled(false); LayoutUtils.sendDeferLayoutEvent(layout, 100); } // jbInit /** * Action Listener * @param e */ public void onEvent(Event e) { if (taskThread != null && taskThread.isAlive()) taskThread.interrupt(); SessionManager.getAppDesktop().closeActiveWindow(); } // actionPerformed } // ATask