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(); | |||||
| } | |||||
| } | |||||