/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.engines.impl; import java.io.*; import org.jboss.tools.common.model.plugin.ModelPlugin; public class ProcessOut implements Runnable { Process p = null; InputStream is = null; Writer writer = null; public ProcessOut(Process p, boolean error, Writer writer) { this.p = p; is = (error) ? p.getErrorStream() : p.getInputStream(); this.writer = writer; new Thread(new Notifier()).start(); new Thread(this).start(); } private boolean isAlive() { try { if(is != null && is.available() > 0) return true; } catch (IOException e) { return fireDead(); } return p != null || fireDead(); } private boolean fireDead() { synchronized(waitMonitor) { try { waitMonitor.notifyAll(); } catch (IllegalMonitorStateException e) { //ignore } is = null; return false; } } public void run() { byte[] b = new byte[4096]; while(isAlive()) { int av = -1; try { synchronized (waitMonitor) { if(!isAlive()) return; if((av = is.available()) < 1) { try { Thread.sleep(200); } catch (InterruptedException e) { //ignore } continue; } if(av > b.length) av = b.length; av = is.read(b, 0, av); } writer.write(new String(b, 0, av)); } catch (IOException e) { ModelPlugin.getPluginLog().logError(e); } } } Object waitMonitor = new Object(); public void waitFor() { if(!isAlive()) return; synchronized(waitMonitor) { if(!isAlive()) return; try { wait(); } catch (InterruptedException e) { //ignore } } } class Notifier implements Runnable { public void run() { try { p.waitFor(); } catch (InterruptedException e) { try { p.exitValue(); } catch (IllegalThreadStateException e2) { run(); } } p = null; } } }