OSDN Git Service

変更内容を記述
[ea2ddl/ea2ddl.git] / ea2ddl-common / src / main / java / org / seasar / extension / jdbc / gen / task / AbstractTask.java
1 /*\r
2  * Copyright 2004-2008 the Seasar Foundation and the Others.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, \r
13  * either express or implied. See the License for the specific language\r
14  * governing permissions and limitations under the License.\r
15  */\r
16 package org.seasar.extension.jdbc.gen.task;\r
17 \r
18 import java.util.List;\r
19 \r
20 import org.apache.tools.ant.BuildException;\r
21 import org.apache.tools.ant.Task;\r
22 import org.apache.tools.ant.taskdefs.Java;\r
23 import org.apache.tools.ant.types.Commandline;\r
24 import org.apache.tools.ant.types.Environment;\r
25 import org.apache.tools.ant.types.Path;\r
26 import org.apache.tools.ant.types.Reference;\r
27 import org.seasar.extension.jdbc.gen.command.Command;\r
28 import org.seasar.extension.jdbc.gen.command.CommandAdapter;\r
29 import org.seasar.extension.jdbc.gen.internal.arg.ArgumentsBuilder;\r
30 import org.seasar.extension.jdbc.gen.internal.command.CommandInvokerImpl;\r
31 \r
32 /**\r
33  * {@link Task}の抽象クラスです。\r
34  * \r
35  * S2JDBC-Gen依存部分を切り離し、AntからS2を使うための汎用タスクとしました。\r
36  * \r
37  * @author taedium\r
38  * @author taktos\r
39  */\r
40 public abstract class AbstractTask extends Task {\r
41 \r
42     /** JavaタスクのresultPropertyのサフィックス */\r
43     protected static String RESULT_PROPERTY_NAME_SUFFIX = "_result";\r
44 \r
45     /** JavaタスクのerrorPropertyのサフィックス */\r
46     protected static String ERROR_PROPERTY_NAME_SUFFIX = "_error";\r
47 \r
48     /** Javaタスク */\r
49     protected Java java = new Java();\r
50 \r
51     /** JVMのコマンドライン */\r
52     protected Commandline jvmCommandline = new Commandline();\r
53 \r
54     /** コマンドを呼び出すクラスの名前 */\r
55     protected String commandInvokerClassName = CommandInvokerImpl.class\r
56             .getName();\r
57 \r
58     /** クラスパス */\r
59     protected Path classpath;\r
60 \r
61     /**\r
62      * JVMの引数を作成します。\r
63      * \r
64      * @return JVMの引数\r
65      */\r
66     public Commandline.Argument createJvmarg() {\r
67         return jvmCommandline.createArgument();\r
68     }\r
69 \r
70     /**\r
71      * コマンドを呼び出すクラスの名前を返します。\r
72      * \r
73      * @return コマンドを呼び出すクラスの名前\r
74      */\r
75     public String getCommandInvokerClassName() {\r
76         return commandInvokerClassName;\r
77     }\r
78 \r
79     /**\r
80      * コマンドを呼び出すクラスの名前を設定します。\r
81      * \r
82      * @param commandInvokerClassName\r
83      *            コマンドを呼び出すクラスの名前\r
84      */\r
85     public void setCommandInvokerClassName(String commandInvokerClassName) {\r
86         this.commandInvokerClassName = commandInvokerClassName;\r
87     }\r
88 \r
89     /**\r
90      * クラスパスを設定します。\r
91      * \r
92      * @param classpath\r
93      *            クラスパス\r
94      */\r
95     public void setClasspath(Path classpath) {\r
96         createClasspath().append(classpath);\r
97     }\r
98 \r
99     /**\r
100      * クラスパスの参照を設定します。\r
101      * \r
102      * @param reference\r
103      *            クラスパスの参照\r
104      */\r
105     public void setClasspathRef(Reference reference) {\r
106         createClasspath().setRefid(reference);\r
107     }\r
108 \r
109     /**\r
110      * クラスパスを作成します。\r
111      * \r
112      * @return クラスパス\r
113      */\r
114     public Path createClasspath() {\r
115         if (classpath == null) {\r
116             classpath = new Path(getProject());\r
117         }\r
118         return classpath.createPath();\r
119     }\r
120 \r
121     @Override\r
122     public void execute() throws BuildException {\r
123         if (classpath == null) {\r
124             throw new BuildException("classpath is not specified for '"\r
125                     + getTaskName() + "' task");\r
126         }\r
127         if (classpath.list().length == 0) {\r
128             throw new BuildException("classpath is empty for '" + getTaskName()\r
129                     + "' task");\r
130         }\r
131         executeCommand();\r
132     }\r
133 \r
134     /**\r
135      * コマンドを実行します。\r
136      */\r
137     protected void executeCommand() {\r
138         Command command = getCommand();\r
139         String commandName = command.getClass().getName();\r
140 \r
141         ArgumentsBuilder builder = new ArgumentsBuilder(command);\r
142         List<String> args = builder.build();\r
143 \r
144         Environment.Variable commandProperty = new Environment.Variable();\r
145         commandProperty.setKey(CommandAdapter.COMMAND_KEY);\r
146         commandProperty.setValue(commandName);\r
147 \r
148         Environment.Variable commandInvokerProperty = new Environment.Variable();\r
149         commandInvokerProperty.setKey(CommandAdapter.COMMAND_INVOKER_KEY);\r
150         commandInvokerProperty.setValue(commandInvokerClassName);\r
151 \r
152         long time = System.currentTimeMillis();\r
153         String resultPropertyName = commandName + time\r
154                 + RESULT_PROPERTY_NAME_SUFFIX;\r
155         String errorPropertyName = commandName + time\r
156                 + ERROR_PROPERTY_NAME_SUFFIX;\r
157 \r
158         java.bindToOwner(this);\r
159         java.addSysproperty(commandProperty);\r
160         java.addSysproperty(commandInvokerProperty);\r
161         for (String arg : args) {\r
162             java.createArg().setValue(arg);\r
163         }\r
164         for (String arg : jvmCommandline.getArguments()) {\r
165             java.createJvmarg().setValue(arg);\r
166         }\r
167         java.setClasspath(classpath);\r
168         java.setClassname(CommandAdapter.class.getName());\r
169         java.setResultProperty(resultPropertyName);\r
170         java.setErrorProperty(errorPropertyName);\r
171         java.setFork(true);\r
172         java.execute();\r
173 \r
174         String result = getProject().getProperty(resultPropertyName);\r
175         if (!"0".equals(result)) {\r
176             throw new BuildException(getProject()\r
177                     .getProperty(errorPropertyName));\r
178         }\r
179     }\r
180 \r
181     /**\r
182      * コマンドを返します。\r
183      * \r
184      * @return コマンド\r
185      */\r
186     protected abstract Command getCommand();\r
187 }\r