/* | |
* | |
* 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.File; | |
import java.util.Enumeration; | |
import java.util.Vector; | |
import net.sf.antcontrib.cpptasks.types.ConditionalFileSet; | |
import org.apache.tools.ant.Project; | |
import org.apache.tools.ant.DirectoryScanner; | |
import org.apache.tools.ant.types.DataType; | |
/** | |
* An element that specifies a prototype file and rules for source files that | |
* should not use precompiled headers | |
* | |
* @author Curt Arnold | |
*/ | |
public final class PrecompileDef extends DataType { | |
private final Vector exceptSets = new Vector(); | |
private String ifCond; | |
/** | |
* Directory of prototype file | |
*/ | |
private File prototype = new File("stdafx.cpp"); | |
private String unlessCond; | |
/** | |
* Constructor | |
* | |
*/ | |
public PrecompileDef() { | |
} | |
/** | |
* Method used by PrecompileExceptDef to add exception set to | |
* PrecompileDef. | |
*/ | |
public void appendExceptFileSet(ConditionalFileSet exceptSet) { | |
exceptSet.setProject(getProject()); | |
exceptSets.addElement(exceptSet); | |
} | |
/** | |
* Adds filesets that specify files that should not be processed with | |
* precompiled headers enabled. | |
* | |
* @param exceptSet | |
* FileSet specify files that should not be processed with | |
* precompiled headers enabled. | |
*/ | |
public PrecompileExceptDef createExcept() { | |
return new PrecompileExceptDef(this); | |
} | |
public void execute() throws org.apache.tools.ant.BuildException { | |
throw new org.apache.tools.ant.BuildException( | |
"Not an actual task, but looks like one for documentation purposes"); | |
} | |
public String[] getExceptFiles() { | |
PrecompileDef ref = getRef(); | |
if (ref != null) { | |
return ref.getExceptFiles(); | |
} | |
if (exceptSets.size() == 0) { | |
return new String[0]; | |
} | |
Project p = getProject(); | |
String[] exceptFiles = null; | |
Enumeration setEnum = exceptSets.elements(); | |
while (setEnum.hasMoreElements()) { | |
ConditionalFileSet exceptSet = (ConditionalFileSet) setEnum | |
.nextElement(); | |
if (exceptSet.isActive()) { | |
DirectoryScanner scanner = exceptSet | |
.getDirectoryScanner(p); | |
String[] scannerFiles = scanner.getIncludedFiles(); | |
if (exceptFiles == null) { | |
exceptFiles = scannerFiles; | |
} else { | |
if (scannerFiles.length > 0) { | |
String[] newFiles = new String[exceptFiles.length | |
+ scannerFiles.length]; | |
for (int i = 0; i < exceptFiles.length; i++) { | |
newFiles[i] = exceptFiles[i]; | |
} | |
int index = exceptFiles.length; | |
for (int i = 0; i < scannerFiles.length; i++) { | |
newFiles[index++] = scannerFiles[i]; | |
} | |
exceptFiles = newFiles; | |
} | |
} | |
} | |
} | |
if (exceptFiles == null) { | |
exceptFiles = new String[0]; | |
} | |
return exceptFiles; | |
} | |
/** | |
* Gets prototype source file | |
* | |
*/ | |
public File getPrototype() { | |
PrecompileDef ref = getRef(); | |
if (ref != null) { | |
return ref.getPrototype(); | |
} | |
return prototype; | |
} | |
private PrecompileDef getRef() { | |
if (isReference()) { | |
return ((PrecompileDef) getCheckedRef(PrecompileDef.class, | |
"PrecompileDef")); | |
} | |
return null; | |
} | |
public boolean isActive() { | |
boolean isActive = CUtil.isActive(getProject(), ifCond, unlessCond); | |
if (!isActive) { | |
PrecompileDef ref = getRef(); | |
if (ref != null) { | |
return ref.isActive(); | |
} | |
} | |
return isActive; | |
} | |
/** | |
* Sets a description of the current data type. | |
*/ | |
public void setDescription(String desc) { | |
super.setDescription(desc); | |
} | |
/** | |
* 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 | |
// | |
} | |
/** | |
* Set the 'if' condition. | |
* | |
* The processor will be ignored unless the property is defined. | |
* | |
* The value of property is insignificant, but values that would imply | |
* misinterpretation ("false", "no") will throw an exception when | |
* isActive() is evaluated. | |
* | |
* @param propName | |
* name of property | |
*/ | |
public void setIf(String propName) { | |
ifCond = propName; | |
} | |
/** | |
* Sets file to precompile. | |
* | |
* Should be a source file that includes only one unguarded header file. | |
* Default value is "stdafx.cpp". | |
* | |
* @param prototype | |
* file path for prototype source file | |
*/ | |
public void setPrototype(File prototype) { | |
if (isReference()) { | |
throw tooManyAttributes(); | |
} | |
if (prototype == null) { | |
throw new NullPointerException("prototype"); | |
} | |
this.prototype = prototype; | |
} | |
/** | |
* Specifies that this element should behave as if the content of the | |
* element with the matching id attribute was inserted at this location. | |
* | |
* @param ref | |
* Reference to other element | |
* | |
*/ | |
public void setRefid(org.apache.tools.ant.types.Reference ref) { | |
super.setRefid(ref); | |
} | |
/** | |
* Set the 'unless' condition. If named property exists at execution time, | |
* the processor will be ignored. | |
* | |
* Value of property is insignificant, but values that would imply | |
* misinterpretation ("false", "no") of the behavior will throw an | |
* exception when isActive is called. | |
* | |
* @param propName | |
* name of property | |
*/ | |
public void setUnless(String propName) { | |
unlessCond = propName; | |
} | |
} |