View Javadoc

1   package rydeen.io;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.io.InputStream;
6   
7   import rydeen.ProcessTarget;
8   import rydeen.TargetSource;
9   import rydeen.TargetType;
10  
11  /**
12   * 抽象ProcessTargetクラス.
13   *
14   * @author Haruaki Tamada
15   */
16  public abstract class AbstractProcessTarget implements ProcessTarget{
17      private TargetSource source;
18      private String name;
19      private TargetType type;
20      private InputStream in;
21  
22      /**
23       * <p>
24       * 名前と種類を指定してオブジェクトを構築します.
25       * </p>
26       * <p>
27       * もし,sourceがnullの場合はNullPointerExceptionが投げられます.
28       * </p>
29       */
30      public AbstractProcessTarget(TargetSource source, String name, TargetType type){
31          this.source = source;
32          this.name = name;
33          this.type = type;
34      }
35  
36      /**
37       * <p>
38       * 名前を指定してオブジェクトを構築します.
39       * 種類は名前の拡張子から自動的に判断されます.
40       * </p>
41       * <p>
42       * もし,sourceがnullの場合はNullPointerExceptionが投げられます.
43       * </p>
44       * @see TargetType#getType(String)
45       */
46      public AbstractProcessTarget(TargetSource source, String name){
47          this.source = source;
48          this.name = name;
49          this.type = TargetType.getType(name);
50      }
51  
52      /**
53       * <p>
54       * {@link #getType <code>getType</code>}が
55       * {@link TargetType#CLASS_FILE <code>CLASS_FILE</code>}を返す場合にクラス名を返します.
56       * </p><p>
57       * このオブジェクトがCLASS_FILEでない場合は,IllegalStateExceptionが投げられます.
58       * </p><p>
59       * クラス名は,{@link #getName()}が返す文字列から拡張子である「.class」を取り除き,
60       * ファイル名の「/」を「.」に変えたものです.
61       * </p><p>
62       */
63      @Override
64      public String getClassName(){
65          if(type == TargetType.CLASS_FILE){
66              String className = name.substring(0, name.lastIndexOf('.'));
67              className = className.replace('/', '.');
68              return className.replace(File.separatorChar, '.');
69          }
70          throw new IllegalStateException("not class file");
71      }
72  
73      /**
74       * このオブジェクトの名前を返します.
75       */
76      @Override
77      public String getName(){
78          return name;
79      }
80  
81      /**
82       * このオブジェクトの種類を返します.
83       */
84      @Override
85      public final TargetType getType(){
86          return type;
87      }
88  
89      /**
90       * <p>
91       * このオブジェクトが表すデータを読み込むための入力ストリームを返します.
92       * 実際の入力ストリームは{@link #openStream}メソッドで開かれます.
93       * </p><p>
94       * 返される入力ストリームは必要がなくなれば適宜closeを呼び出し,閉じてください.
95       * </p>
96       */
97      @Override
98      public final InputStream getSource() throws IOException{
99          if(in == null){
100             in = openStream();
101         }
102         return in;
103     }
104 
105     /**
106      * このオブジェクトが所属するTargetSourceを返します.
107      */
108     public final TargetSource getTargetSource(){
109         return source;
110     }
111 
112     /**
113      * このオブジェクトが表すデータを読み込むための入力ストリームを返すように,
114      * サブクラスでこのメソッドをオーバーライドしてください.
115      * 返される入力ストリームはユーザ側で閉じられます.
116      */
117     protected abstract InputStream openStream() throws IOException;
118 }