View Javadoc
1   package rydeen.io;
2   
3   import rydeen.Destination;
4   import rydeen.ProcessTarget;
5   import rydeen.TargetSource;
6   
7   import java.io.ByteArrayOutputStream;
8   import java.io.IOException;
9   import java.io.OutputStream;
10  
11  /**
12   * <p>
13   * DestinationとTargetSourceを繋ぐためのDestinationの実装クラスです.
14   * </p><p>
15   * Destinationとして扱われますが,{@link #getTargetSource <code>getTargetSource</code>}
16   * メソッドを呼び出してTargetSourceを取り出せます.
17   * </p>
18   *
19   * @author Haruaki Tamada
20   */
21  public class GlueDestination implements Destination{
22      private MemoryTargetSource source = new MemoryTargetSource();
23      private boolean closed = false;
24  
25      /**
26       * <p>
27       * このオブジェクトが持つTargetSourceを返します.
28       * </p><p>
29       * 返されるTargetSourceには{@link #getOutput <code>getOutput</code>}
30       * メソッドなどを使って出力したデータが含まれます.
31       * </p><p>
32       * このメソッドは常に有効なTargetSourceを返します.
33       * </p>
34       */
35      public TargetSource getTargetSource(){
36          return source;
37      }
38  
39      /**
40       * <p>
41       * 引数で与えられた文字列に出力するための出力ストリームを作成して,返します.
42       * 返される出力ストリームは,必要なデータを出力し終えたら閉じてください.
43       * </p>
44       *
45       * @param name 出力する名前.
46       */
47      @Override
48      public OutputStream getOutput(final String name) throws IOException{
49          return new ByteArrayOutputStream(){
50              @Override
51              public void close() throws IOException{
52                  super.close();
53  
54                  byte[] data = toByteArray();
55                  source.addTarget(new ByteArrayProcessTarget(source, name, data));
56              }
57          };
58      }
59  
60      /**
61       * <p>
62       * 引数で与えられたProcessTargetを出力するための出力ストリームを作成して,返します.
63       * 返される出力ストリームは,必要なデータを出力し終えたら閉じてください.
64       * </p>
65       *
66       * @param target 出力するProcessTarget.
67       */
68      @Override
69      public OutputStream getOutput(ProcessTarget target) throws IOException{
70          return getOutput(target.getName());
71      }
72  
73      /**
74       * このオブジェクトが持つTargetSourceにそのまま引数のProcessTargetを追加します.
75       */
76      @Override
77      public void output(ProcessTarget target) throws IOException{
78          source.addTarget(target);
79      }
80  
81      /**
82       * 何も行いません.
83       */
84      @Override
85      public synchronized void close(){
86          closed = true;
87      }
88  
89      @Override
90      public boolean isClosed(){
91          return closed;
92      }
93  }