1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18
19 package org.apache.tools.ant.taskdefs;
20
21 import java.io.IOException;
22
23 import org.apache.tools.ant.Task;
24 import org.apache.tools.ant.BuildException;
25 import org.apache.tools.ant.types.PropertySet;
26
27 /**
28 * Call another target in the same project.
29 *
30 * <pre>
31 * <target name="foo">
32 * <antcall target="bar">
33 * <param name="property1" value="aaaaa" />
34 * <param name="foo" value="baz" />
35 * </antcall>
36 * </target>
37 *
38 * <target name="bar" depends="init">
39 * <echo message="prop is ${property1} ${foo}" />
40 * </target>
41 * </pre>
42 *
43 * <p>This only works as expected if neither property1 nor foo are
44 * defined in the project itself.
45 *
46 *
47 * @since Ant 1.2
48 *
49 * @ant.task name="antcall" category="control"
50 */
51 public class CallTarget extends Task {
52
53 private Ant callee;
54 // must match the default value of Ant#inheritAll
55 private boolean inheritAll = true;
56 // must match the default value of Ant#inheritRefs
57 private boolean inheritRefs = false;
58
59 private boolean targetSet = false;
60
61 /**
62 * If true, pass all properties to the new Ant project.
63 * Defaults to true.
64 * @param inherit <code>boolean</code> flag.
65 */
66 public void setInheritAll(boolean inherit) {
67 inheritAll = inherit;
68 }
69
70 /**
71 * If true, pass all references to the new Ant project.
72 * Defaults to false.
73 * @param inheritRefs <code>boolean</code> flag.
74 */
75 public void setInheritRefs(boolean inheritRefs) {
76 this.inheritRefs = inheritRefs;
77 }
78
79 /**
80 * Initialize this task by creating new instance of the ant task and
81 * configuring it by calling its own init method.
82 */
83 public void init() {
84 callee = new Ant(this);
85 callee.init();
86 }
87
88 /**
89 * Delegate the work to the ant task instance, after setting it up.
90 * @throws BuildException on validation failure or if the target didn't
91 * execute.
92 */
93 public void execute() throws BuildException {
94 if (callee == null) {
95 init();
96 }
97 if (!targetSet) {
98 throw new BuildException(
99 "Attribute target or at least one nested target is required.",
100 getLocation());
101 }
102 callee.setAntfile(getProject().getProperty("ant.file"));
103 callee.setInheritAll(inheritAll);
104 callee.setInheritRefs(inheritRefs);
105 callee.execute();
106 }
107
108 /**
109 * Create a new Property to pass to the invoked target(s).
110 * @return a <code>Property</code> object.
111 */
112 public Property createParam() {
113 if (callee == null) {
114 init();
115 }
116 return callee.createProperty();
117 }
118
119 /**
120 * Reference element identifying a data type to carry
121 * over to the invoked target.
122 * @param r the specified <code>Ant.Reference</code>.
123 * @since Ant 1.5
124 */
125 public void addReference(Ant.Reference r) {
126 if (callee == null) {
127 init();
128 }
129 callee.addReference(r);
130 }
131
132 /**
133 * Set of properties to pass to the new project.
134 * @param ps the <code>PropertySet</code> to pass.
135 * @since Ant 1.6
136 */
137 public void addPropertyset(PropertySet ps) {
138 if (callee == null) {
139 init();
140 }
141 callee.addPropertyset(ps);
142 }
143
144 /**
145 * Set target to execute.
146 * @param target the name of the target to execute.
147 */
148 public void setTarget(String target) {
149 if (callee == null) {
150 init();
151 }
152 callee.setTarget(target);
153 targetSet = true;
154 }
155
156 /**
157 * Add a target to the list of targets to invoke.
158 * @param t <code>Ant.TargetElement</code> representing the target.
159 * @since Ant 1.6.3
160 */
161 public void addConfiguredTarget(Ant.TargetElement t) {
162 if (callee == null) {
163 init();
164 }
165 callee.addConfiguredTarget(t);
166 targetSet = true;
167 }
168
169 /**
170 * Handles output.
171 * Send it the the new project if is present, otherwise
172 * call the super class.
173 * @param output The string output to output.
174 * @see Task#handleOutput(String)
175 * @since Ant 1.5
176 */
177 public void handleOutput(String output) {
178 if (callee != null) {
179 callee.handleOutput(output);
180 } else {
181 super.handleOutput(output);
182 }
183 }
184
185 /**
186 * Handles input.
187 * Deleate to the created project, if present, otherwise
188 * call the super class.
189 * @param buffer the buffer into which data is to be read.
190 * @param offset the offset into the buffer at which data is stored.
191 * @param length the amount of data to read.
192 *
193 * @return the number of bytes read.
194 *
195 * @exception IOException if the data cannot be read.
196 * @see Task#handleInput(byte[], int, int)
197 * @since Ant 1.6
198 */
199 public int handleInput(byte[] buffer, int offset, int length)
200 throws IOException {
201 if (callee != null) {
202 return callee.handleInput(buffer, offset, length);
203 }
204 return super.handleInput(buffer, offset, length);
205 }
206
207 /**
208 * Handles output.
209 * Send it the the new project if is present, otherwise
210 * call the super class.
211 * @param output The string to output.
212 * @see Task#handleFlush(String)
213 * @since Ant 1.5.2
214 */
215 public void handleFlush(String output) {
216 if (callee != null) {
217 callee.handleFlush(output);
218 } else {
219 super.handleFlush(output);
220 }
221 }
222
223 /**
224 * Handle error output.
225 * Send it the the new project if is present, otherwise
226 * call the super class.
227 * @param output The string to output.
228 *
229 * @see Task#handleErrorOutput(String)
230 * @since Ant 1.5
231 */
232 public void handleErrorOutput(String output) {
233 if (callee != null) {
234 callee.handleErrorOutput(output);
235 } else {
236 super.handleErrorOutput(output);
237 }
238 }
239
240 /**
241 * Handle error output.
242 * Send it the the new project if is present, otherwise
243 * call the super class.
244 * @param output The string to output.
245 * @see Task#handleErrorFlush(String)
246 * @since Ant 1.5.2
247 */
248 public void handleErrorFlush(String output) {
249 if (callee != null) {
250 callee.handleErrorFlush(output);
251 } else {
252 super.handleErrorFlush(output);
253 }
254 }
255 }