/* * Perforce/Java Integration Layer * Copyright (C) 2001-2002 David Freels * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.dafreels.vcs.command; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * Title: Description: Copyright: Copyright (c) 2001 Company: DF Systems * * @author David Freels * @created July 10, 2002 * @version 1.0 */ public final class ProcessReader extends Thread { private BufferedReader m_in = null; //The input stream to read from private BufferedReader m_err = null; //The error stream to read from /** * Signals the outside process that the Process has finished and the data has * been read. */ private boolean m_finished = false; /** * The current Process to work on */ private Process m_proc = null; /** * Tells the run method if the Thread is still running */ private boolean m_running = false; /** * Tells the ProcessReader that the Process is ready to be read */ private boolean m_ready = false; private final MessageFormatter m_format = MessageFormatter.getInstance(); /** * Singleton instance of the ProcessReader */ private static ProcessReader m_reader = new ProcessReader(true); /** * reader thread for stderr */ private ProcessReader m_errReader = null; /** * Constructor for the ProcessReader object */ private ProcessReader(boolean isParent) { m_running = true; if ( isParent ) { m_errReader = new ProcessReader(false); } this.start(); } /** * Gets the Instance attribute of the ProcessReader class * * @param proc Description * @return The Instance value */ public static ProcessReader getInstance(Process proc) { if (m_reader == null) { m_reader = new ProcessReader(true); //Set the current Process m_reader.setProcess(proc); return m_reader; } //Set the current Process m_reader.setProcess(proc); //Wake up the reader so it can start working m_reader.interrupt(); return m_reader; } /** * Sets the Process attribute of the ProcessReader object * * @param proc The new Process value */ private void setProcess(Process proc) { synchronized (this) { // make sure that the m_in and m_err get set before m_ready does. // just because they come first doesn't mean that the JMM will // execute them that way. Putting them in a synchronized block // makes sure they get executed before m_ready is set. m_proc = proc; //m_err = new BufferedReader(new InputStreamReader(m_proc.getErrorStream())); if ( m_reader == this ) { m_in = new BufferedReader(new InputStreamReader(m_proc.getInputStream())); m_errReader.setProcess(proc); } else { m_in = new BufferedReader(new InputStreamReader(m_proc.getErrorStream())); } } m_ready = true; } /** * Gets the Finished attribute of the ProcessReader object * * @return The Finished value */ public boolean isFinished() { if ( m_reader == this ) { while ( !m_errReader.isFinished()) { } } return m_finished; } /** * Method Description */ public static void stopReader() { if (m_reader != null) { //Flag the Thread as not running m_reader.m_running = false; m_reader.m_errReader.m_running = false; //Wake up the Thread so it can be terminated m_reader.interrupt(); } } /** * Main processing method for the ProcessReader object */ public void run() { while (m_running) { if (m_ready) { String line = ""; m_format.clearMessages(); m_format.addMessage("The command produced the following messages:"); try { String tmp = ""; while ((line = m_in.readLine()) != null ) { if ( m_reader == this ) { m_format.addMessage(line); } else { m_format.addErrorMessage(line); } } //boolean moreIn = true; //boolean moreErr = true; // read both process stdout and stderr. If either // one gets too full it can freeze the application, // JBuilder7 seems to be esp. prone to freezing // Mark Ackerman 7/10/2002 /* while (moreIn || moreErr) { if (moreErr) { if (m_err.ready()) { if ((line = m_err.readLine()) != null) { m_format.addErrorMessage(line); } else { moreErr = false; } } } if (moreIn) { if (m_in.ready()) { if ((line = m_in.readLine()) != null) { m_format.addMessage(line); } else { moreIn = false; } } } } */ } catch (IOException ioe) { System.out.println("[ProcessReader] (run) Error reading data from process!" + System.getProperty("line.separator") + ioe.toString()); } finally { m_proc = null; m_finished = true; m_ready = false; } } else { try { //Sleep for 10 minutes so we don't use //too many CPU cycles //Thread.sleep(600000); synchronized (this) { wait(); } } catch (InterruptedException ie) { //Do nothing, we were probably awaken so that a Process could be run System.out.println("[ProcessReader] (run) Waking up ProcessReader"); } } } } public void interrupt() { super.interrupt(); if ( m_reader == this ) { m_errReader.interrupt(); } } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#9 | 4090 | David Freels |
Fixed bug where paths with spaces would not work. Also checked in new code or JBuilderX. |
||
#8 | 2994 | Mark E. Ackerman |
changed for version 1.0.7. Added display of submitted changelists, redo sync, updated icons, misc bug fixes and improvements. |
||
#7 | 1954 | Mark E. Ackerman |
fix for freeze. stdin and stderr now get read by separate threads. |
||
#6 | 1938 | Mark E. Ackerman | fix for freezing when executing a command. | ||
#5 | 1873 | Mark E. Ackerman | Version 1.0 build. | ||
#4 | 1640 | Mark E. Ackerman |
added diff action, unlock action, status dialog, file history with detail, fixed stretching of submit dialog. added diff to submit dialog. added icons to the popup menu. added status line message for most actions. added confirm to revert action. added displaying of error messages from p4 command. added About Open tool support. added option on Perforce Page to not display output from p4 command. added version info on the PerforcePage. some other misc fixes and changes. changed version number to 0.9.3 |
||
#3 | 1445 | David Freels | Refreshing source tree. | ||
#2 | 1442 | David Freels | Refreshing source tree. | ||
#1 | 1429 | David Freels | New packaging and bug fixes. | ||
//guest/david_freels/p4ot/src/com/dafreels/vcs/command/ProcessReader.java | |||||
#1 | 1428 | David Freels | New packaging. |