private void cleanUp(boolean shutdown, String message) {
    try {
      sr.done();
    } catch (ShutdownException se) {
      // Nothing to do at this point, we're already shutting down
    }

    if (niagara.connection_server.NiagraServer.TIME_OPERATORS) {
      cpuTimer.stop();
      cpuTimer.print(getName() + "(shutdown: " + message + ")");
    }

    try {
      if (!shutdown) outputStream.endOfStream();
      else
        // REFACTOR
        outputStream.putCtrlMsg(ControlFlag.SHUTDOWN, message);
    } catch (java.lang.InterruptedException ie) {
      /* do nothing */
    } catch (ShutdownException se) {
      /* do nothing */
    }

    outputStream = null;
    sr = null;
    return;
  }
  /** Thread run method */
  public void run() {
    if (NiagraServer.RUNNING_NIPROF) JProf.registerThreadName(this.getName());

    if (NiagraServer.TIME_OPERATORS) {
      cpuTimer = new CPUTimer();
      cpuTimer.start();
    }

    boolean shutdown = false;
    String message = "normal";

    try {
      sr = new SAXDOMReader(dm.getInputStreamFor(resource));
      sr.readDocuments(outputStream);
    } catch (SAXException saxE) {
      System.err.println(
          "StreamThread::SAX exception parsing document. Message: " + saxE.getMessage());
      shutdown = true;
      message = "SAX Exception " + saxE.getMessage();
    } catch (java.io.IOException ioe) {
      System.err.println("StreamThread::IOException. Message: " + ioe.getMessage());
      shutdown = true;
      message = "StreamThread::IOException " + ioe.getMessage();
    } catch (ShutdownException se) {
      System.err.println("StreamThread::ShutdownException. Message " + se.getMessage());
      shutdown = true;
      message = se.getMessage();
    }

    cleanUp(shutdown, message);
    return;
  }