PR: 32126 Obtained from: Tarlika Elisabeth Schmitz git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277064 13f79535-47bb-0310-9956-ffa450edef68master
@@ -89,6 +89,9 @@ Other changes: | |||||
* <apply> has a new "force" attribute that, when true, disables | * <apply> has a new "force" attribute that, when true, disables | ||||
checking of target files. | checking of target files. | ||||
* Added isSigned condition and task, and signedselector selector | |||||
Bugzilla report 32126. | |||||
Changes from Ant 1.6.2 to current Ant 1.6 CVS version | Changes from Ant 1.6.2 to current Ant 1.6 CVS version | ||||
===================================================== | ===================================================== | ||||
@@ -0,0 +1,95 @@ | |||||
/* | |||||
* Copyright 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.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.taskdefs.condition.Condition; | |||||
/** | |||||
* Abstract task to allow defintion of a task or a condition. | |||||
* It has property and value (for the property) attributes. | |||||
* | |||||
* @since Ant 1.7 | |||||
* | |||||
* @ant.task category="control" | |||||
*/ | |||||
public abstract class ConditionAndTask extends Task implements Condition { | |||||
private String property; | |||||
private String value = "true"; | |||||
/** | |||||
* Set the name of the property which will be set if the particular resource | |||||
* is available. | |||||
* | |||||
* @param property the name of the property to set. | |||||
*/ | |||||
public void setProperty(String property) { | |||||
this.property = property; | |||||
} | |||||
/** | |||||
* Set the value to be given to the property if the desired resource is | |||||
* available. | |||||
* | |||||
* @param value the value to be given. | |||||
*/ | |||||
public void setValue(String value) { | |||||
this.value = value; | |||||
} | |||||
/** | |||||
* This method should be overridden by derived classes. | |||||
* It is used by eval() to evaluate the condition. | |||||
* @return true if the condition passes, false otherwise. | |||||
*/ | |||||
protected abstract boolean evaluate(); | |||||
/** | |||||
* This method evaluates the condition. It calls evaluate in the | |||||
* derived class. | |||||
* It sets the property if a property is present and if the | |||||
* evaluate returns true. | |||||
* @return true if the condition passes, false otherwise. | |||||
*/ | |||||
public boolean eval() { | |||||
if (evaluate()) { | |||||
if (property != null) { | |||||
getProject().setNewProperty(property, value); | |||||
} | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
/** | |||||
* Entry point when operating as a task. | |||||
* | |||||
* @exception BuildException if the task is not configured correctly. | |||||
*/ | |||||
public void execute() throws BuildException { | |||||
if (property == null) { | |||||
throw new BuildException("property attribute is required", | |||||
getLocation()); | |||||
} | |||||
eval(); | |||||
} | |||||
} |
@@ -0,0 +1,119 @@ | |||||
/* | |||||
* Copyright 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.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Project; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.zip.ZipEntry; | |||||
import java.util.zip.ZipFile; | |||||
import java.util.Enumeration; | |||||
/** | |||||
* Checks whether a jarfile is signed: if the name of the | |||||
* signature is passed, the file is checked for presence of that | |||||
* particular signature; otherwise the file is checked for the | |||||
* existence of any signature. | |||||
*/ | |||||
public class IsSigned extends ConditionAndTask { | |||||
private static final String SIG_START = "META-INF/"; | |||||
private static final String SIG_END = ".SF"; | |||||
private String name; | |||||
private File file; | |||||
/** | |||||
* The jarfile that is to be tested for the presence | |||||
* of a signature. | |||||
* | |||||
* @param file jarfile to be tested. | |||||
*/ | |||||
public void setFile(File file) { | |||||
this.file = file; | |||||
} | |||||
/** | |||||
* The signature name to check jarfile for. | |||||
* | |||||
* @param name signature to look for. | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* Returns <CODE>true</code> if the file exists and is signed with | |||||
* the signature specified, or, if <CODE>name</code> wasn't | |||||
* specified, if the file contains a signature. | |||||
* @return true if the file is signed. | |||||
*/ | |||||
protected boolean evaluate() { | |||||
if (file == null) { | |||||
throw new BuildException("The file attribute must be set."); | |||||
} | |||||
if (file != null && !file.exists()) { | |||||
log("The file \"" + file.getAbsolutePath() | |||||
+ "\" does not exist.", Project.MSG_VERBOSE); | |||||
return false; | |||||
} | |||||
ZipFile jarFile = null; | |||||
try { | |||||
jarFile = new ZipFile(file); | |||||
if (null == name) { | |||||
Enumeration entries = jarFile.entries(); | |||||
while (entries.hasMoreElements()) { | |||||
String name = ((ZipEntry) entries.nextElement()).getName(); | |||||
if (name.startsWith(SIG_START) && name.endsWith(SIG_END)) { | |||||
log("File \"" + file.getAbsolutePath() | |||||
+ "\" is signed.", Project.MSG_VERBOSE); | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} else { | |||||
boolean shortSig = jarFile.getEntry(SIG_START | |||||
+ name.toUpperCase() | |||||
+ SIG_END) != null; | |||||
boolean longSig = jarFile.getEntry(SIG_START | |||||
+ name.substring(0, 8).toUpperCase() | |||||
+ SIG_END) != null; | |||||
if (shortSig || longSig) { | |||||
log("File \"" + file.getAbsolutePath() | |||||
+ "\" is signed.", Project.MSG_VERBOSE); | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
} catch (IOException e) { | |||||
log("Got IOException reading file \"" + file.getAbsolutePath() | |||||
+ "\"" + e, Project.MSG_VERBOSE); | |||||
return false; | |||||
} finally { | |||||
if (jarFile != null) { | |||||
try { | |||||
jarFile.close(); | |||||
} catch (IOException e) { | |||||
// Ignored | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -80,6 +80,7 @@ defaultexcludes=org.apache.tools.ant.taskdefs.DefaultExcludes | |||||
presetdef=org.apache.tools.ant.taskdefs.PreSetDef | presetdef=org.apache.tools.ant.taskdefs.PreSetDef | ||||
macrodef=org.apache.tools.ant.taskdefs.MacroDef | macrodef=org.apache.tools.ant.taskdefs.MacroDef | ||||
nice=org.apache.tools.ant.taskdefs.Nice | nice=org.apache.tools.ant.taskdefs.Nice | ||||
issigned=org.apache.tools.ant.taskdefs.IsSigned | |||||
libraries=org.apache.tools.ant.taskdefs.repository.Libraries | libraries=org.apache.tools.ant.taskdefs.repository.Libraries | ||||
# optional tasks | # optional tasks | ||||
@@ -28,10 +28,11 @@ extensionSet=org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet | |||||
extension=org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter | extension=org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter | ||||
libfileset=org.apache.tools.ant.taskdefs.optional.extension.LibFileSet | libfileset=org.apache.tools.ant.taskdefs.optional.extension.LibFileSet | ||||
selector=org.apache.tools.ant.types.selectors.SelectSelector | selector=org.apache.tools.ant.types.selectors.SelectSelector | ||||
signedselector=org.apache.tools.ant.types.selectors.SignedSelector | |||||
zipfileset=org.apache.tools.ant.types.ZipFileSet | zipfileset=org.apache.tools.ant.types.ZipFileSet | ||||
scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | ||||
propertyset=org.apache.tools.ant.types.PropertySet | propertyset=org.apache.tools.ant.types.PropertySet | ||||
assertions=org.apache.tools.ant.types.Assertions | assertions=org.apache.tools.ant.types.Assertions | ||||
concatfilter=org.apache.tools.ant.filters.ConcatFilter | concatfilter=org.apache.tools.ant.filters.ConcatFilter | ||||
ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable | ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable | ||||
mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository | |||||
mavenrepository=org.apache.tools.ant.taskdefs.optional.repository.MavenRepository |
@@ -0,0 +1,54 @@ | |||||
/* | |||||
* Copyright 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.tools.ant.types.selectors; | |||||
import java.io.File; | |||||
import org.apache.tools.ant.types.DataType; | |||||
import org.apache.tools.ant.taskdefs.IsSigned; | |||||
/** | |||||
* Selector that chooses files based on whether they are signed or not. | |||||
* | |||||
* @since 1.7 | |||||
*/ | |||||
public class SignedSelector extends DataType implements FileSelector { | |||||
IsSigned isSigned = new IsSigned(); | |||||
/** | |||||
* The signature name to check jarfile for. | |||||
* | |||||
* @param name signature to look for. | |||||
*/ | |||||
public void setName(String name) { | |||||
isSigned.setName(name); | |||||
} | |||||
/** | |||||
* The heart of the matter. This is where the selector gets to decide | |||||
* on the inclusion of a file in a particular fileset. | |||||
* | |||||
* @param basedir the base directory the scan is being done from | |||||
* @param filename is the name of the file to check | |||||
* @param file is a java.io.File object the selector can use | |||||
* @return whether the file should be selected or not | |||||
*/ | |||||
public boolean isSelected(File basedir, String filename, File file) { | |||||
isSigned.setProject(getProject()); | |||||
isSigned.setFile(file); | |||||
return isSigned.eval(); | |||||
} | |||||
} |