📄 foreachtask.java
字号:
/* * Copyright 1999,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.axis.tools.ant.foreach;import org.apache.tools.ant.BuildException;import org.apache.tools.ant.Task;import org.apache.tools.ant.taskdefs.Ant;import org.apache.tools.ant.taskdefs.Java;import org.apache.tools.ant.taskdefs.Property;import org.apache.tools.ant.types.Commandline;import org.apache.tools.ant.types.Path;import java.util.Enumeration;import java.util.Hashtable;import java.util.Vector;/** * Call a target foreach entry in a set of parameters based on a fileset. * <p> * <i>For Axis development; there is no support or stability associated * with this task</i> * <pre> * <target name="target1"> * <foreach target="target2"> * <param name="param1"> * <fileset refid="fset1"/> * </param> * <param name="param2"> * <item value="jar" /> * <item value="zip" /> * </param> * </foreach> * </target> * * <target name="target2"> * <echo message="prop is ${param1}.${param2}" /> * </target> * </pre> * <br> * Really this just a wrapper around "AntCall" * <br> * Added a "type" attribute that works precisely like its equivalent * in <code>ExecuteOn</code>. It allows the user * to specify whether directories, files, or both directories and files * from the filesets are included as entries in the parameter set. * @ant.task category="axis" * @author <a href="mailto:tpv@spamcop.net">Tim Vernum</a> * @author Davanum Srinivas */public class ForeachTask extends Task { private Ant callee; private Java callee2; private String subTarget; private Vector params; private Hashtable properties; // must match the default value of Ant#inheritAll private boolean inheritAll = true; // must match the default value of Ant#inheritRefs private boolean inheritRefs = false; private boolean fork = false; private boolean verbose = false; public ForeachTask() { params = new Vector(); properties = new Hashtable(); } public void init() { } /** * If true, pass all properties to the new Ant project. * Defaults to true. */ public void setInheritAll(boolean inherit) { inheritAll = inherit; } /** * If true, pass all references to the new Ant project. * Defaults to false * @param inheritRefs new value */ public void setInheritRefs(boolean inheritRefs) { this.inheritRefs = inheritRefs; } /** * Target to execute, required. */ public void setTarget(String target) { subTarget = target; } /** * If true, forks the ant invocation. * * @param f "true|false|on|off|yes|no" */ public void setFork(boolean f) { fork = f; } /** * Enable verbose output when signing * ; optional: default false */ public void setVerbose(final boolean verbose) { this.verbose = verbose; } public ParamSet createParam() { ParamSet param = new ParamSet(); params.addElement(param); return param; } private void buildProperty(String propName, String propValue) { properties.put(propName, propValue); } private void executeTarget() { if (subTarget == null) { throw new BuildException("Attribute target is required.", getLocation()); } if(fork) { executeForkedAntTask(); } else { executeAntTask(); } } private void executeForkedAntTask() { /* if (callee2 == null) { */ callee2 = (Java) getProject().createTask("java"); callee2.setOwningTarget(getOwningTarget()); callee2.setTaskName(getTaskName()); callee2.setLocation(getLocation()); callee2.setClassname("org.apache.tools.ant.Main"); callee2.setAppend(true); callee2.setFork(true); callee2.createJvmarg().setValue("-Xbootclasspath/p:" + System.getProperty("sun.boot.class.path")); /* } */ String systemClassPath = System.getProperty("java.class.path"); callee2.setClasspath(new Path(getProject(), systemClassPath)); String args = "-buildfile " + properties.get("file"); Commandline.Argument arguments = callee2.createArg(); arguments.setLine(args); if (verbose) { callee2.createArg().setValue("-verbose"); } callee2.createArg().setValue(subTarget); if (callee2.executeJava() != 0) { throw new BuildException("Execution of ANT Task failed"); } } private void executeAntTask() { /* if (callee == null) { */ callee = (Ant) getProject().createTask("ant"); callee.setOwningTarget(getOwningTarget()); callee.setTaskName(getTaskName()); callee.init(); /* } */ callee.setAntfile(getProject().getProperty("ant.file")); callee.setTarget(subTarget); callee.setInheritAll(inheritAll); callee.setInheritRefs(inheritRefs); Enumeration keys = properties.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String val = (String) properties.get(key); Property prop = callee.createProperty(); prop.setName(key); prop.setValue(val); } callee.execute(); System.gc(); System.gc(); System.gc(); } /** * This method is used to recursively iterate through * each parameter set. * It ends up being something like: * <pre> * for( i=0; i< params[0].size ; i++ ) * for( j=0; j < params[1].size ; j++ ) * for( k=0; k < params[2].size ; k++ ) * executeTarget( params[0][i], params[1][j] , params[2][k] ) ; * </pre> */ private void executeParameters(int paramNumber) { if (paramNumber == params.size()) { executeTarget(); } else { ParamSet paramSet = (ParamSet) params.elementAt(paramNumber); Enumeration values = paramSet.getValues(getProject()); while (values.hasMoreElements()) { String val = (String) values.nextElement(); buildProperty(paramSet.getName(), val); executeParameters(paramNumber + 1); } } } public void execute() { if (subTarget == null) { throw new BuildException("Attribute target is required.", getLocation()); } executeParameters(0); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -