git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			715 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			715 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * 
 | |
|  * Copyright 2002-2004 The Ant-Contrib project
 | |
|  *
 | |
|  *  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 net.sf.antcontrib.cpptasks;
 | |
| import java.io.BufferedReader;
 | |
| import java.io.File;
 | |
| import java.io.FileReader;
 | |
| import java.io.IOException;
 | |
| import java.lang.reflect.Method;
 | |
| import java.util.Vector;
 | |
| import net.sf.antcontrib.cpptasks.compiler.LinkType;
 | |
| import net.sf.antcontrib.cpptasks.compiler.Processor;
 | |
| import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
 | |
| import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
 | |
| import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
 | |
| import org.apache.tools.ant.BuildException;
 | |
| import org.apache.tools.ant.DirectoryScanner;
 | |
| import org.apache.tools.ant.Project;
 | |
| import org.apache.tools.ant.types.DataType;
 | |
| import org.apache.tools.ant.types.Environment;
 | |
| import org.apache.tools.ant.types.Reference;
 | |
| /**
 | |
|  * An abstract compiler/linker definition.
 | |
|  * 
 | |
|  * @author Curt Arnold
 | |
|  */
 | |
| public abstract class ProcessorDef extends DataType {
 | |
|     /**
 | |
|      * Returns the equivalent Boolean object for the specified value
 | |
|      * 
 | |
|      * Equivalent to Boolean.valueOf in JDK 1.4
 | |
|      * 
 | |
|      * @param val
 | |
|      *            boolean value
 | |
|      * @return Boolean.TRUE or Boolean.FALSE
 | |
|      */
 | |
|     protected static Boolean booleanValueOf(boolean val) {
 | |
|         if (val) {
 | |
|             return Boolean.TRUE;
 | |
|         }
 | |
|         return Boolean.FALSE;
 | |
|     }
 | |
|     /**
 | |
|      * if true, targets will be built for debugging
 | |
|      */
 | |
|     private Boolean debug;
 | |
|     private Environment env = null;
 | |
|     /**
 | |
|      * Reference for "extends" processor definition
 | |
|      */
 | |
|     private Reference extendsRef = null;
 | |
|     /**
 | |
|      * Name of property that must be present or definition will be ignored. May
 | |
|      * be null.
 | |
|      */
 | |
|     private String ifProp;
 | |
|     /**
 | |
|      * if true, processor definition inherits values from containing <cc>
 | |
|      * element
 | |
|      */
 | |
|     private boolean inherit;
 | |
|     private Boolean libtool = null;
 | |
|     protected boolean newEnvironment = false;
 | |
|     /**
 | |
|      * Processor.
 | |
|      */
 | |
|     private Processor processor;
 | |
|     /**
 | |
|      * Collection of <compilerarg>or <linkerarg>contained by definition
 | |
|      */
 | |
|     private final Vector processorArgs = new Vector();
 | |
|     /**
 | |
|      * Collection of <compilerparam>or <linkerparam>contained by definition
 | |
|      */
 | |
|     private final Vector processorParams = new Vector();
 | |
|     /**
 | |
|      * if true, all targets will be unconditionally rebuilt
 | |
|      */
 | |
|     private Boolean rebuild;
 | |
|     /**
 | |
|      * Collection of <fileset>contained by definition
 | |
|      */
 | |
|     private final Vector srcSets = new Vector();
 | |
|     /**
 | |
|      * Name of property that if present will cause definition to be ignored.
 | |
|      * May be null.
 | |
|      */
 | |
|     private String unlessProp;
 | |
|     /**
 | |
|      * Constructor
 | |
|      *  
 | |
|      */
 | |
|     protected ProcessorDef() throws NullPointerException {
 | |
|         inherit = true;
 | |
|     }
 | |
|     /**
 | |
|      * Adds a <compilerarg>or <linkerarg>
 | |
|      * 
 | |
|      * @param arg
 | |
|      *            command line argument, must not be null
 | |
|      * @throws NullPointerException
 | |
|      *             if arg is null
 | |
|      * @throws BuildException
 | |
|      *             if this definition is a reference
 | |
|      */
 | |
|     protected void addConfiguredProcessorArg(CommandLineArgument arg)
 | |
|             throws NullPointerException, BuildException {
 | |
|         if (arg == null) {
 | |
|             throw new NullPointerException("arg");
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             throw noChildrenAllowed();
 | |
|         }
 | |
|         if(arg.getFile() == null ) {
 | |
|             processorArgs.addElement(arg);
 | |
|         }
 | |
|         else {
 | |
|             loadFile(arg.getFile());
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * Add a <compilerarg>or <linkerarg> if specify the file attribute
 | |
|      * 
 | |
|      * @param arg
 | |
|      *            command line argument, must not be null
 | |
|      * @throws BuildException
 | |
|      *             if the specify file not exist
 | |
|      */
 | |
|     protected void loadFile(File file)
 | |
|         throws BuildException {
 | |
|         FileReader fileReader;
 | |
|         BufferedReader in;
 | |
|         String str;
 | |
|         if (! file.exists()){
 | |
|             throw new BuildException("The file " + file + " is not existed");
 | |
|         }
 | |
|         try {
 | |
|             fileReader = new FileReader(file);
 | |
|             in = new BufferedReader(fileReader);
 | |
|             while ( (str = in.readLine()) != null ){                
 | |
|                 if(str.trim() == ""){
 | |
|                     continue ;
 | |
|                 }
 | |
|                 str = getProject().replaceProperties(str);
 | |
|                 CommandLineArgument newarg = new CommandLineArgument();
 | |
|                 newarg.setValue(str.trim());
 | |
|                 processorArgs.addElement(newarg);
 | |
|             }
 | |
|         }
 | |
|         catch(Exception e){
 | |
|             throw new BuildException(e.getMessage());
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * Adds a <compilerarg>or <linkerarg>
 | |
|      * 
 | |
|      * @param arg
 | |
|      *            command line argument, must not be null
 | |
|      * @throws NullPointerException
 | |
|      *             if arg is null
 | |
|      * @throws BuildException
 | |
|      *             if this definition is a reference
 | |
|      */
 | |
|     protected void addConfiguredProcessorParam(ProcessorParam param)
 | |
|             throws NullPointerException, BuildException {
 | |
|         if (param == null) {
 | |
|             throw new NullPointerException("param");
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             throw noChildrenAllowed();
 | |
|         }
 | |
|         processorParams.addElement(param);
 | |
|     }
 | |
|     /**
 | |
|      * Add an environment variable to the launched process.
 | |
|      */
 | |
|     public void addEnv(Environment.Variable var) {
 | |
|         if (env == null) {
 | |
|             env = new Environment();
 | |
|         }
 | |
|         env.addVariable(var);
 | |
|     }
 | |
|     /**
 | |
|      * Adds a source file set.
 | |
|      * 
 | |
|      * Files in these set will be processed by this configuration and will not
 | |
|      * participate in the auction.
 | |
|      * 
 | |
|      * @param srcSet
 | |
|      *            Fileset identifying files that should be processed by this
 | |
|      *            processor
 | |
|      * @throws BuildException
 | |
|      *             if processor definition is a reference
 | |
|      */
 | |
|     public void addFileset(ConditionalFileSet srcSet) throws BuildException {
 | |
|         if (isReference()) {
 | |
|             throw noChildrenAllowed();
 | |
|         }
 | |
|         srcSet.setProject(getProject());
 | |
|         srcSets.addElement(srcSet);
 | |
|     }
 | |
|     /**
 | |
|      * Creates a configuration
 | |
|      * 
 | |
|      * @param baseDef
 | |
|      *            reference to def from containing <cc>element, may be null
 | |
|      * @return configuration
 | |
|      *  
 | |
|      */
 | |
|     public ProcessorConfiguration createConfiguration(CCTask task,
 | |
|             LinkType linkType, ProcessorDef baseDef, TargetDef targetPlatform) {
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).createConfiguration(task, linkType,
 | |
|                     baseDef, targetPlatform);
 | |
|         }
 | |
|         ProcessorDef[] defaultProviders = getDefaultProviders(baseDef);
 | |
|         Processor proc = getProcessor();
 | |
|         return proc.createConfiguration(task, linkType, defaultProviders, this, targetPlatform);
 | |
|     }
 | |
|     /**
 | |
|      * Prepares list of processor arguments ( <compilerarg>, <linkerarg>) that
 | |
|      * are active for the current project settings.
 | |
|      * 
 | |
|      * @return active compiler arguments
 | |
|      */
 | |
|     public CommandLineArgument[] getActiveProcessorArgs() {
 | |
|     	Project p = getProject();
 | |
|         if (p == null) {
 | |
|             throw new java.lang.IllegalStateException("project must be set");
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getActiveProcessorArgs();
 | |
|         }
 | |
|         Vector activeArgs = new Vector(processorArgs.size());
 | |
|         for (int i = 0; i < processorArgs.size(); i++) {
 | |
|             CommandLineArgument arg = (CommandLineArgument) processorArgs
 | |
|                     .elementAt(i);
 | |
|             if (arg.isActive(p)) {
 | |
|                 activeArgs.addElement(arg);
 | |
|             }
 | |
|         }
 | |
|         CommandLineArgument[] array = new CommandLineArgument[activeArgs.size()];
 | |
|         activeArgs.copyInto(array);
 | |
|         return array;
 | |
|     }
 | |
|     /**
 | |
|      * Prepares list of processor arguments ( <compilerarg>, <linkerarg>) that
 | |
|      * are active for the current project settings.
 | |
|      * 
 | |
|      * @return active compiler arguments
 | |
|      */
 | |
|     public ProcessorParam[] getActiveProcessorParams() {
 | |
|     	Project p = getProject();
 | |
|         if (p == null) {
 | |
|             throw new java.lang.IllegalStateException("project must be set");
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getActiveProcessorParams();
 | |
|         }
 | |
|         Vector activeParams = new Vector(processorParams.size());
 | |
|         for (int i = 0; i < processorParams.size(); i++) {
 | |
|             ProcessorParam param = (ProcessorParam) processorParams
 | |
|                     .elementAt(i);
 | |
|             if (param.isActive(p)) {
 | |
|                 activeParams.addElement(param);
 | |
|             }
 | |
|         }
 | |
|         ProcessorParam[] array = new ProcessorParam[activeParams.size()];
 | |
|         activeParams.copyInto(array);
 | |
|         return array;
 | |
|     }
 | |
|     /**
 | |
|      * Gets boolean indicating debug build
 | |
|      * 
 | |
|      * @param defaultProviders
 | |
|      *            array of ProcessorDef's in descending priority
 | |
|      * @param index
 | |
|      *            index to first element in array that should be considered
 | |
|      * @return if true, built targets for debugging
 | |
|      */
 | |
|     public boolean getDebug(ProcessorDef[] defaultProviders, int index) {
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getDebug(defaultProviders, index);
 | |
|         }
 | |
|         if (debug != null) {
 | |
|             return debug.booleanValue();
 | |
|         } else {
 | |
|             if (defaultProviders != null && index < defaultProviders.length) {
 | |
|                 return defaultProviders[index].getDebug(defaultProviders,
 | |
|                         index + 1);
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|     /**
 | |
|      * Creates an chain of objects which provide default values in descending
 | |
|      * order of significance.
 | |
|      * 
 | |
|      * @param baseDef
 | |
|      *            corresponding ProcessorDef from CCTask, will be last element
 | |
|      *            in array unless inherit = false
 | |
|      * @return default provider array
 | |
|      *  
 | |
|      */
 | |
|     protected final ProcessorDef[] getDefaultProviders(ProcessorDef baseDef) {
 | |
|         ProcessorDef extendsDef = getExtends();
 | |
|         Vector chain = new Vector();
 | |
|         while (extendsDef != null && !chain.contains(extendsDef)) {
 | |
|             chain.addElement(extendsDef);
 | |
|             extendsDef = extendsDef.getExtends();
 | |
|         }
 | |
|         if (baseDef != null && getInherit()) {
 | |
|             chain.addElement(baseDef);
 | |
|         }
 | |
|         ProcessorDef[] defaultProviders = new ProcessorDef[chain.size()];
 | |
|         chain.copyInto(defaultProviders);
 | |
|         return defaultProviders;
 | |
|     }
 | |
|     /**
 | |
|      * Gets the ProcessorDef specified by the extends attribute
 | |
|      * 
 | |
|      * @return Base ProcessorDef, null if extends is not specified
 | |
|      * @throws BuildException
 | |
|      *             if reference is not same type object
 | |
|      */
 | |
|     public ProcessorDef getExtends() throws BuildException {
 | |
|         if (extendsRef != null) {
 | |
|             Object obj = extendsRef.getReferencedObject(getProject());
 | |
|             if (!getClass().isInstance(obj)) {
 | |
|                 throw new BuildException("Referenced object "
 | |
|                         + extendsRef.getRefId() + " not correct type, is "
 | |
|                         + obj.getClass().getName() + " should be "
 | |
|                         + getClass().getName());
 | |
|             }
 | |
|             return (ProcessorDef) obj;
 | |
|         }
 | |
|         return null;
 | |
|     }
 | |
|     /**
 | |
|      * Gets the inherit attribute. If the inherit value is true, this processor
 | |
|      * definition will inherit default values from the containing <cc>element.
 | |
|      * 
 | |
|      * @return if true then properties from the containing <cc>element are
 | |
|      *         used.
 | |
|      */
 | |
|     public final boolean getInherit() {
 | |
|         return inherit;
 | |
|     }
 | |
|     public boolean getLibtool() {
 | |
|         if (libtool != null) {
 | |
|             return libtool.booleanValue();
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getLibtool();
 | |
|         }
 | |
|         ProcessorDef extendsDef = getExtends();
 | |
|         if (extendsDef != null) {
 | |
|             return extendsDef.getLibtool();
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|     /**
 | |
|      * Obtains the appropriate processor (compiler, linker)
 | |
|      * 
 | |
|      * @return processor
 | |
|      */
 | |
|     protected Processor getProcessor() {
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getProcessor();
 | |
|         }
 | |
|         //
 | |
|         //   if a processor has not been explicitly set
 | |
|         //      then may be set by an extended definition
 | |
|         if (processor == null) {
 | |
|             ProcessorDef extendsDef = getExtends();
 | |
|             if (extendsDef != null) {
 | |
|                 return extendsDef.getProcessor();
 | |
|             }
 | |
|         }
 | |
|         return processor;
 | |
|     }
 | |
|     /**
 | |
|      * Gets a boolean value indicating whether all targets must be rebuilt
 | |
|      * regardless of dependency analysis.
 | |
|      * 
 | |
|      * @param defaultProviders
 | |
|      *            array of ProcessorDef's in descending priority
 | |
|      * @param index
 | |
|      *            index to first element in array that should be considered
 | |
|      * @return true if all targets should be rebuilt.
 | |
|      */
 | |
|     public boolean getRebuild(ProcessorDef[] defaultProviders, int index) {
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getRebuild(defaultProviders, index);
 | |
|         }
 | |
|         if (rebuild != null) {
 | |
|             return rebuild.booleanValue();
 | |
|         } else {
 | |
|             if (defaultProviders != null && index < defaultProviders.length) {
 | |
|                 return defaultProviders[index].getRebuild(defaultProviders,
 | |
|                         index + 1);
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|     /**
 | |
|      * Returns true if the processor definition contains embedded file set
 | |
|      * definitions
 | |
|      * 
 | |
|      * @return true if processor definition contains embedded filesets
 | |
|      */
 | |
|     public boolean hasFileSets() {
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).hasFileSets();
 | |
|         }
 | |
|         return srcSets.size() > 0;
 | |
|     }
 | |
|     /**
 | |
|      * Determine if this def should be used.
 | |
|      * 
 | |
|      * Definition will be active if the "if" variable (if specified) is set and
 | |
|      * the "unless" variable (if specified) is not set and that all reference
 | |
|      * or extended definitions are active
 | |
|      * 
 | |
|      * @return true if processor is active
 | |
|      * @throws IllegalStateException
 | |
|      *             if not properly initialized
 | |
|      * @throws BuildException
 | |
|      *             if "if" or "unless" variable contains suspicious values
 | |
|      *             "false" or "no" which indicates possible confusion
 | |
|      */
 | |
|     public boolean isActive() throws BuildException, IllegalStateException {
 | |
|         Project project = getProject();
 | |
|         if (!CUtil.isActive(project, ifProp, unlessProp)) {
 | |
|             return false;
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             if (!((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).isActive()) {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         //
 | |
|         //  walk through any extended definitions
 | |
|         //
 | |
|         ProcessorDef[] defaultProviders = getDefaultProviders(null);
 | |
|         for (int i = 0; i < defaultProviders.length; i++) {
 | |
|             if (!defaultProviders[i].isActive()) {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         return true;
 | |
|     }
 | |
|     /**
 | |
|      * Sets the class name for the adapter. Use the "name" attribute when the
 | |
|      * tool is supported.
 | |
|      * 
 | |
|      * @param className
 | |
|      *            full class name
 | |
|      *  
 | |
|      */
 | |
|     public void setClassname(String className) throws BuildException {
 | |
|         Object proc = null;
 | |
|         try {
 | |
|             Class implClass = ProcessorDef.class.getClassLoader().loadClass(
 | |
|                     className);
 | |
|             try {
 | |
|                 Method getInstance = implClass.getMethod("getInstance",
 | |
|                         new Class[0]);
 | |
|                 proc = getInstance.invoke(null, new Object[0]);
 | |
|             } catch (Exception ex) {
 | |
|                 proc = implClass.newInstance();
 | |
|             }
 | |
|         } catch (Exception ex) {
 | |
|             throw new BuildException(ex);
 | |
|         }
 | |
|         setProcessor((Processor) proc);
 | |
|     }
 | |
|     /**
 | |
|      * If set true, all targets will be built for debugging.
 | |
|      * 
 | |
|      * @param debug
 | |
|      *            true if targets should be built for debugging
 | |
|      * @throws BuildException
 | |
|      *             if processor definition is a reference
 | |
|      */
 | |
|     public void setDebug(boolean debug) throws BuildException {
 | |
|         if (isReference()) {
 | |
|             throw tooManyAttributes();
 | |
|         }
 | |
|         this.debug = booleanValueOf(debug);
 | |
|     }
 | |
|     /**
 | |
|      * Sets a description of the current data type.
 | |
|      */
 | |
|     public void setDescription(String desc) {
 | |
|         super.setDescription(desc);
 | |
|     }
 | |
|     /**
 | |
|      * Specifies that this element extends the element with id attribute with a
 | |
|      * matching value. The configuration will be constructed from the settings
 | |
|      * of this element, element referenced by extends, and the containing cc
 | |
|      * element.
 | |
|      * 
 | |
|      * @param extendsRef
 | |
|      *            Reference to the extended processor definition.
 | |
|      * @throws BuildException
 | |
|      *             if this processor definition is a reference
 | |
|      */
 | |
|     public void setExtends(Reference extendsRef) throws BuildException {
 | |
|         if (isReference()) {
 | |
|             throw tooManyAttributes();
 | |
|         }
 | |
|         this.extendsRef = extendsRef;
 | |
|     }
 | |
|     /**
 | |
|      * Sets an id that can be used to reference this element.
 | |
|      * 
 | |
|      * @param id
 | |
|      *            id
 | |
|      */
 | |
|     public void setId(String id) {
 | |
|         //
 | |
|         //  this is actually accomplished by a different
 | |
|         //     mechanism, but we can document it
 | |
|         //
 | |
|     }
 | |
|     /**
 | |
|      * Sets the property name for the 'if' condition.
 | |
|      * 
 | |
|      * The configuration will be ignored unless the property is defined.
 | |
|      * 
 | |
|      * The value of the property is insignificant, but values that would imply
 | |
|      * misinterpretation ("false", "no") will throw an exception when
 | |
|      * evaluated.
 | |
|      * 
 | |
|      * @param propName
 | |
|      *            name of property
 | |
|      */
 | |
|     public void setIf(String propName) {
 | |
|         ifProp = propName;
 | |
|     }
 | |
|     /**
 | |
|      * If inherit has the default value of true, defines, includes and other
 | |
|      * settings from the containing <cc>element will be inherited.
 | |
|      * 
 | |
|      * @param inherit
 | |
|      *            new value
 | |
|      * @throws BuildException
 | |
|      *             if processor definition is a reference
 | |
|      */
 | |
|     public void setInherit(boolean inherit) throws BuildException {
 | |
|         if (isReference()) {
 | |
|             throw super.tooManyAttributes();
 | |
|         }
 | |
|         this.inherit = inherit;
 | |
|     }
 | |
|     /**
 | |
|      * Set use of libtool.
 | |
|      * 
 | |
|      * If set to true, the "libtool " will be prepended to the command line
 | |
|      * 
 | |
|      * @param libtool
 | |
|      *            If true, use libtool.
 | |
|      */
 | |
|     public void setLibtool(boolean libtool) {
 | |
|         if (isReference()) {
 | |
|             throw tooManyAttributes();
 | |
|         }
 | |
|         this.libtool = booleanValueOf(libtool);
 | |
|     }
 | |
|     /**
 | |
|      * Do not propagate old environment when new environment variables are
 | |
|      * specified.
 | |
|      */
 | |
|     public void setNewenvironment(boolean newenv) {
 | |
|         newEnvironment = newenv;
 | |
|     }
 | |
|     /**
 | |
|      * Sets the processor
 | |
|      * 
 | |
|      * @param processor
 | |
|      *            processor, may not be null.
 | |
|      * @throws BuildException
 | |
|      *             if ProcessorDef is a reference
 | |
|      * @throws NullPointerException
 | |
|      *             if processor is null
 | |
|      */
 | |
|     protected void setProcessor(Processor processor) throws BuildException,
 | |
|             NullPointerException {
 | |
|         if (processor == null) {
 | |
|             throw new NullPointerException("processor");
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             throw super.tooManyAttributes();
 | |
|         }
 | |
|         if (env == null && !newEnvironment) {
 | |
|             this.processor = processor;
 | |
|         } else {
 | |
|             this.processor = processor.changeEnvironment(newEnvironment, env);
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * If set true, all targets will be unconditionally rebuilt.
 | |
|      * 
 | |
|      * @param rebuild
 | |
|      *            if true, rebuild all targets.
 | |
|      * @throws BuildException
 | |
|      *             if processor definition is a reference
 | |
|      */
 | |
|     public void setRebuild(boolean rebuild) throws BuildException {
 | |
|         if (isReference()) {
 | |
|             throw tooManyAttributes();
 | |
|         }
 | |
|         this.rebuild = booleanValueOf(rebuild);
 | |
|     }
 | |
|     /**
 | |
|      * Specifies that this element should behave as if the content of the
 | |
|      * element with the matching id attribute was inserted at this location. If
 | |
|      * specified, no other attributes or child content should be specified,
 | |
|      * other than "if", "unless" and "description".
 | |
|      * 
 | |
|      * @param ref
 | |
|      *            Reference to other element
 | |
|      *  
 | |
|      */
 | |
|     public void setRefid(org.apache.tools.ant.types.Reference ref) {
 | |
|         super.setRefid(ref);
 | |
|     }
 | |
|     /**
 | |
|      * Set the property name for the 'unless' condition.
 | |
|      * 
 | |
|      * If named property is set, the configuration will be ignored.
 | |
|      * 
 | |
|      * The value of the property is insignificant, but values that would imply
 | |
|      * misinterpretation ("false", "no") of the behavior will throw an
 | |
|      * exception when evaluated.
 | |
|      * 
 | |
|      * @param propName
 | |
|      *            name of property
 | |
|      */
 | |
|     public void setUnless(String propName) {
 | |
|         unlessProp = propName;
 | |
|     }
 | |
|     /**
 | |
|      * This method calls the FileVistor's visit function for every file in the
 | |
|      * processors definition
 | |
|      * 
 | |
|      * @param visitor
 | |
|      *            object whose visit method is called for every file
 | |
|      */
 | |
|     public void visitFiles(FileVisitor visitor) {
 | |
|     	Project p = getProject();
 | |
|         if (p == null) {
 | |
|             throw new java.lang.IllegalStateException(
 | |
|                     "project must be set before this call");
 | |
|         }
 | |
|         if (isReference()) {
 | |
|             ((ProcessorDef) getCheckedRef(ProcessorDef.class, "ProcessorDef"))
 | |
|                     .visitFiles(visitor);
 | |
|         }
 | |
|         //
 | |
|         //   if this processor extends another,
 | |
|         //      visit its files first
 | |
|         //
 | |
|         ProcessorDef extendsDef = getExtends();
 | |
|         if (extendsDef != null) {
 | |
|             extendsDef.visitFiles(visitor);
 | |
|         }
 | |
|         for (int i = 0; i < srcSets.size(); i++) {
 | |
|             ConditionalFileSet srcSet = (ConditionalFileSet) srcSets
 | |
|                     .elementAt(i);
 | |
|             if (srcSet.isActive()) {
 | |
|                 // Find matching source files
 | |
|                 DirectoryScanner scanner = srcSet.getDirectoryScanner(p);
 | |
|                 // Check each source file - see if it needs compilation
 | |
|                 String[] fileNames = scanner.getIncludedFiles();
 | |
|                 File parentDir = scanner.getBasedir();
 | |
|                 for (int j = 0; j < fileNames.length; j++) {
 | |
|                     String currentFile = fileNames[j];
 | |
|                     visitor.visit(parentDir, currentFile);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     public Vector getSrcSets() {
 | |
|         if (isReference()) {
 | |
|             return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
 | |
|                     "ProcessorDef")).getSrcSets();
 | |
|         }
 | |
|         return srcSets;
 | |
|     }
 | |
| }
 |