View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership. The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License. You may obtain a copy of the License at
9    * 
10   *      http://www.apache.org/licenses/LICENSE-2.0
11   * 
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.river.jeri.internal.mux;
20  
21  import java.io.IOException;
22  
23  /**
24   * An IOFuture represents an I/O operation that may or may not have
25   * completed yet.
26   *
27   * @author	Sun Microsystems, Inc.
28   * 
29   */
30  final class IOFuture {
31  
32      private boolean done = false;
33      boolean data = false;
34      private int position = -1;
35      private IOException exception = null;
36  
37      IOFuture() { }
38  
39      /**
40       * Waits until the I/O operation has completed.  If this method
41       * returns normally, then the I/O operation has completed
42       * successfully.  If this method throws IOException, then the
43       * I/O operation failed.
44       *
45       * REMIND: Maybe we should support a timeout here, as a paranoid
46       * escape hatch; if this wait really takes a long time, something
47       * has gone dreadfully wrong.  To a large extent, we're really
48       * depending on someone's finally clause to make sure that pending
49       * instances of this class always get notified somehow.
50       *
51       * @throws	IOException if the I/O operation failed
52       *
53       * @throws	InterruptedException if the current thread was
54       * interrupted while waiting for the I/O to complete.
55       * @return true if data remaining.
56       */
57      synchronized boolean waitUntilDone()
58  	throws IOException, InterruptedException
59      {
60  	while (!done) {
61  	    wait();
62  	}
63  	if (exception != null) {
64  	    exception.fillInStackTrace();
65  	    throw exception;
66  	}
67          return data;
68      }
69      
70      synchronized int getPosition(){
71          return position;
72      }
73      
74      /**
75       * Signals that this I/O operation has completed successfully.
76       */
77      synchronized void done() {
78  	assert !done;
79          data = false;
80  	done = true;
81  	notifyAll();
82      }
83      
84      /**
85       * Signals that this I/O operation has remaining data.
86       * @param position 
87       */
88      synchronized void done(int position){
89          assert !done;
90          done = true;
91          data = true;
92          this.position = position;
93          notifyAll();
94      }
95  
96      /**
97       * Signals that this I/O operation has failed (with details of the
98       * failure in the given IOException).
99       *
100      * @param	e detail of the I/O operation's failure
101      */
102     synchronized void done(IOException e) {
103 	if (done) {
104 	    /*
105 	     * This shouldn't normally happen, but it's difficult to prevent
106 	     * in bizarre failure scenarios (like an OutOfMemoryError).
107 	     */
108 	    return;
109 	}
110 	if (e == null) {
111 	    throw new NullPointerException();
112 	}
113 	this.exception = e;
114 	done = true;
115 	notifyAll();
116     }
117 }