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 | |||
| 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 | |||
| ===================================================== | |||
| @@ -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 | |||
| macrodef=org.apache.tools.ant.taskdefs.MacroDef | |||
| nice=org.apache.tools.ant.taskdefs.Nice | |||
| issigned=org.apache.tools.ant.taskdefs.IsSigned | |||
| libraries=org.apache.tools.ant.taskdefs.repository.Libraries | |||
| # optional tasks | |||
| @@ -28,10 +28,11 @@ extensionSet=org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet | |||
| extension=org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter | |||
| libfileset=org.apache.tools.ant.taskdefs.optional.extension.LibFileSet | |||
| selector=org.apache.tools.ant.types.selectors.SelectSelector | |||
| signedselector=org.apache.tools.ant.types.selectors.SignedSelector | |||
| zipfileset=org.apache.tools.ant.types.ZipFileSet | |||
| scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | |||
| propertyset=org.apache.tools.ant.types.PropertySet | |||
| assertions=org.apache.tools.ant.types.Assertions | |||
| concatfilter=org.apache.tools.ant.filters.ConcatFilter | |||
| 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(); | |||
| } | |||
| } | |||