View Javadoc

1   package rydeen.spi;
2   
3   import rydeen.Arguments;
4   import rydeen.Processor;
5   import rydeen.ProcessorBuildException;
6   import rydeen.utils.Author;
7   import rydeen.utils.Organization;
8   import rydeen.utils.Provider;
9   
10  /**
11   * ProcessorServiceのデフォルト実装を含む抽象クラス.
12   *
13   * @author Haruaki Tamada
14   */
15  public abstract class AbstractProcessorService implements ProcessorService{
16      private Arguments args;
17      private Provider provider;
18  
19      /**
20       * サブクラスのためのコンストラクタ.
21       */
22      protected AbstractProcessorService(){
23          args = createDefaultArguments();
24          provider = createProvider();
25      }
26  
27      /**
28       * このSPIが提供する処理器のパラメータとその初期値を表すArgumentsを作成して返します.
29       * このメソッドはインスタンス化されたときに一度だけ実行されます.
30       * 
31       * @see #getDefaultArguments
32       */
33      protected abstract Arguments createDefaultArguments();
34  
35      /**
36       * このProcessorの提供者情報を作成して返します.
37       * このメソッドはインスタンス化されたときに一度だけ実行されます.
38       * 
39       * @see #getProvider
40       */
41      protected abstract Provider createProvider();
42  
43      /**
44       * {@link Processor <code>Processor</code>}を作成して返します.
45       * このメソッドは必要に応じて何度も呼び出されます.
46       */
47      protected abstract Processor createProcessor() throws ProcessorBuildException;
48  
49      @Override
50      public final Author[] getAuthors(){
51          Provider provider = getProvider();
52          if(provider != null){
53              return provider.getAuthors();
54          }
55          return new Author[0];
56      }
57  
58      /**
59       * <p>
60       * このProviderが定義する{@link Processor <code>Processor</code>}のデフォルトの
61       * {@link Arguments <code>Arguments</code>}を返します.
62       * 返されたArgumentsに変更を加えても,デフォルト値に影響を与えません.
63       * </p><p>
64       * デフォルト値はどのような方法であっても変更不可能です.
65       * 何らかの理由により,デフォルト値を変更したい場合は,新たな
66       * Processorを定義し直さなければいけません.
67       * </p><p>
68       * 返されたArgumentsの値を変更したい場合,返されたオブジェクトに対して,
69       * {@link Arguments#putValue(String, String) Arguments#putValue}
70       * メソッドを呼び出して変更してください.
71       * この変更は自由で,かつ,デフォルト値に全く影響を与えません.
72       * </p>
73       */
74      @Override
75      public final Arguments getDefaultArguments(){
76          return new Arguments(args);
77      }
78  
79      /**
80       * このSPIが作成する処理器の説明を返します.
81       */
82      @Override
83      public abstract String getDescription();
84  
85      /**
86       * このSPIが作成する処理器を作成した団体情報を返します.
87       * {@link #getProvider}がnullを返すとき,このメソッドはnullを返します.
88       * @see Provider#getOrganization
89       */
90      @Override
91      public final Organization getOrganization(){
92          Provider provider = getProvider();
93          if(provider != null){
94              return provider.getOrganization();
95          }
96          return null;
97      }
98  
99      /**
100      * このSPIに対応する処理器を作成して返します.
101      * Processorの作成に失敗した場合,ProcessorBuildExceptionが投げられます.
102      */
103     @Override
104     public final Processor getProcessor() throws ProcessorBuildException{
105         Processor processor = createProcessor();
106         if(processor == null){
107             throw new ProcessorBuildException();
108         }
109 
110         return processor;
111     }
112 
113     /**
114      * このSPIが作成する処理器の名前を返します.
115      */
116     @Override
117     public abstract String getProcessorName();
118 
119     /**
120      * このSPIが作成する処理器の提供者情報を返します.
121      * @see #createProvider
122      */
123     @Override
124     public final Provider getProvider(){
125         return provider;
126     }
127 }