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 }