/*********************************************************************** * This file is part of iDempiere ERP Open Source * * http://www.idempiere.org * * * * Copyright (C) Contributors * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301, USA. * * * * Contributors: * * - hengsin * **********************************************************************/ package org.adempiere.webui.apps; import java.lang.ref.WeakReference; import org.zkoss.zk.ui.Desktop; /** * If your background task need access to desktop, wrap your runnable with this, i.e new DesktopRunnable(yourRunnable, desktop). * You can then use AEnv.getDesktop() in your runnable to get access to desktop. * @author hengsin * */ public class DesktopRunnable implements Runnable { /** wrapped runnable **/ private Runnable runnable; /** weak reference to Desktop **/ private WeakReference desktopWeakRef; /** ThreadLocal weak reference to Desktop **/ private static ThreadLocal> threadLocalDesktop = new ThreadLocal>() { protected WeakReference initialValue() { return null; } }; /** * @param runnable * @param desktop */ public DesktopRunnable(Runnable runnable, Desktop desktop) { this.runnable = runnable; this.desktopWeakRef = new WeakReference(desktop); } /** * Set thread local Desktop reference and call {@link #runnable}. */ @Override public void run() { try { threadLocalDesktop.set(desktopWeakRef); runnable.run(); } finally { threadLocalDesktop.remove(); } } /* package */static WeakReference getThreadLocalDesktop() { return threadLocalDesktop.get(); } }