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