* ExtensionSet: (Contains set of extensions - oh der) * LibFileSet: allows you to extract a list of extensions from a fileset. It also allows you to explicitly pick certain features to include in extension set (ie don't include implementation attributes or url attributes unless explicitly required) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272603 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,169 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional.extension; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.types.DataType; | |||
| import org.apache.tools.ant.types.Reference; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| /** | |||
| * The Extension set lists a set of "Optional Packages" / | |||
| * "Extensions". | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.data-type name="extension-set" | |||
| */ | |||
| public class ExtensionSet | |||
| extends DataType | |||
| { | |||
| /** | |||
| * ExtensionAdapter objects representing extensions. | |||
| */ | |||
| private final ArrayList m_extensions = new ArrayList(); | |||
| /** | |||
| * Filesets specifying all the extensions wanted. | |||
| */ | |||
| private final ArrayList m_extensionsFilesets = new ArrayList(); | |||
| /** | |||
| * Adds an extension that this library requires. | |||
| * | |||
| * @param extensionAdapter an extension that this library requires. | |||
| */ | |||
| public void addExtension( final ExtensionAdapter extensionAdapter ) | |||
| { | |||
| m_extensions.add( extensionAdapter ); | |||
| } | |||
| /** | |||
| * Adds a set of files about which extensions data will be extracted. | |||
| * | |||
| * @param fileSet a set of files about which extensions data will be extracted. | |||
| */ | |||
| public void addLibfileset( final LibFileSet fileSet ) | |||
| { | |||
| m_extensionsFilesets.add( fileSet ); | |||
| } | |||
| /** | |||
| * Adds a set of files about which extensions data will be extracted. | |||
| * | |||
| * @param fileSet a set of files about which extensions data will be extracted. | |||
| */ | |||
| public void addFileset( final FileSet fileSet ) | |||
| { | |||
| m_extensionsFilesets.add( fileSet ); | |||
| } | |||
| /** | |||
| * Extract a set of Extension objects from the ExtensionSet. | |||
| * | |||
| * @throws BuildException if an error occurs | |||
| */ | |||
| public Extension[] toExtensions( final Project project ) | |||
| throws BuildException | |||
| { | |||
| final ArrayList extensions = ExtensionUtil.toExtensions( m_extensions ); | |||
| ExtensionUtil.extractExtensions( project, extensions, m_extensionsFilesets ); | |||
| return (Extension[])extensions.toArray( new Extension[ extensions.size() ] ); | |||
| } | |||
| /** | |||
| * Makes this instance in effect a reference to another ExtensionSet | |||
| * instance. | |||
| * | |||
| * <p>You must not set another attribute or nest elements inside | |||
| * this element if you make it a reference.</p> | |||
| * | |||
| * @param reference the reference to which this instance is associated | |||
| * @exception BuildException if this instance already has been configured. | |||
| */ | |||
| public void setRefid( final Reference reference ) | |||
| throws BuildException | |||
| { | |||
| if( !m_extensions.isEmpty() || | |||
| !m_extensionsFilesets.isEmpty() ) | |||
| { | |||
| throw tooManyAttributes(); | |||
| } | |||
| // change this to get the objects from the other reference | |||
| final Object object = | |||
| reference.getReferencedObject( getProject() ); | |||
| if( object instanceof ExtensionSet ) | |||
| { | |||
| final ExtensionSet other = (ExtensionSet)object; | |||
| m_extensions.addAll( other.m_extensions ); | |||
| m_extensionsFilesets.addAll( other.m_extensionsFilesets ); | |||
| } | |||
| else | |||
| { | |||
| final String message = | |||
| reference.getRefId() + " doesn\'t refer to a ExtensionSet"; | |||
| throw new BuildException( message ); | |||
| } | |||
| super.setRefid( reference ); | |||
| } | |||
| public String toString() | |||
| { | |||
| return "ExtensionSet" + Arrays.asList( toExtensions( getProject() ) ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,238 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional.extension; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.jar.JarFile; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| /** | |||
| * A set of useful methods relating to extensions. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class ExtensionUtil | |||
| { | |||
| /** | |||
| * Convert a list of extensionAdapter objects to extensions. | |||
| * | |||
| * @param adapters the list of ExtensionAdapterss to add to convert | |||
| * @throws BuildException if an error occurs | |||
| */ | |||
| static ArrayList toExtensions( final ArrayList adapters ) | |||
| throws BuildException | |||
| { | |||
| final ArrayList results = new ArrayList(); | |||
| final int size = adapters.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final ExtensionAdapter adapter = | |||
| (ExtensionAdapter)adapters.get( i ); | |||
| final Extension extension = adapter.toExtension(); | |||
| results.add( extension ); | |||
| } | |||
| return results; | |||
| } | |||
| /** | |||
| * Generate a list of extensions from a specified fileset. | |||
| * | |||
| * @param librarys the list to add extensions to | |||
| * @param fileset the filesets containing librarys | |||
| * @throws BuildException if an error occurs | |||
| */ | |||
| static void extractExtensions( final Project project, | |||
| final ArrayList librarys, | |||
| final ArrayList fileset ) | |||
| throws BuildException | |||
| { | |||
| if( !fileset.isEmpty() ) | |||
| { | |||
| final Extension[] extensions = getExtensions( project, | |||
| fileset ); | |||
| for( int i = 0; i < extensions.length; i++ ) | |||
| { | |||
| librarys.add( extensions[ i ] ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Retrieve extensions from the specified librarys. | |||
| * | |||
| * @param librarys the filesets for librarys | |||
| * @return the extensions contained in librarys | |||
| * @throws BuildException if failing to scan librarys | |||
| */ | |||
| private static Extension[] getExtensions( final Project project, | |||
| final ArrayList librarys ) | |||
| throws BuildException | |||
| { | |||
| final ArrayList extensions = new ArrayList(); | |||
| final Iterator iterator = librarys.iterator(); | |||
| while( iterator.hasNext() ) | |||
| { | |||
| final FileSet fileSet = (FileSet)iterator.next(); | |||
| boolean includeImpl = true; | |||
| boolean includeURL = true; | |||
| if( fileSet instanceof LibFileSet ) | |||
| { | |||
| LibFileSet libFileSet = (LibFileSet)fileSet; | |||
| includeImpl = libFileSet.isIncludeImpl(); | |||
| includeURL = libFileSet.isIncludeURL(); | |||
| } | |||
| final DirectoryScanner scanner = fileSet.getDirectoryScanner( project ); | |||
| final File basedir = scanner.getBasedir(); | |||
| final String[] files = scanner.getIncludedFiles(); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final File file = new File( basedir, files[ i ] ); | |||
| loadExtensions( file, extensions, includeImpl, includeURL ); | |||
| } | |||
| } | |||
| return (Extension[])extensions.toArray( new Extension[ extensions.size() ] ); | |||
| } | |||
| /** | |||
| * Load list of available extensions from specified file. | |||
| * | |||
| * @param file the file | |||
| * @param extensionList the list to add available extensions to | |||
| * @throws BuildException if there is an error | |||
| */ | |||
| private static void loadExtensions( final File file, | |||
| final ArrayList extensionList, | |||
| final boolean includeImpl, | |||
| final boolean includeURL ) | |||
| throws BuildException | |||
| { | |||
| try | |||
| { | |||
| final JarFile jarFile = new JarFile( file ); | |||
| final Extension[] extensions = | |||
| Extension.getAvailable( jarFile.getManifest() ); | |||
| for( int i = 0; i < extensions.length; i++ ) | |||
| { | |||
| final Extension extension = extensions[ i ]; | |||
| addExtension( extensionList, extension, includeImpl, includeURL ); | |||
| } | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new BuildException( e.getMessage(), e ); | |||
| } | |||
| } | |||
| /** | |||
| * Add extension to list. | |||
| * If extension should not have implementation details but | |||
| * does strip them. If extension should not have url but does | |||
| * then strip it. | |||
| * | |||
| * @param extensionList the list of extensions to add to | |||
| * @param originalExtension the extension | |||
| * @param includeImpl false to exclude implementation details | |||
| * @param includeURL false to exclude implementation URL | |||
| */ | |||
| private static void addExtension( final ArrayList extensionList, | |||
| final Extension originalExtension, | |||
| final boolean includeImpl, | |||
| final boolean includeURL ) | |||
| { | |||
| Extension extension = originalExtension; | |||
| if( !includeURL && | |||
| null != extension.getImplementationURL() ) | |||
| { | |||
| extension = | |||
| new Extension( extension.getExtensionName(), | |||
| extension.getSpecificationVersion().toString(), | |||
| extension.getSpecificationVendor(), | |||
| extension.getImplementationVersion().toString(), | |||
| extension.getImplementationVendor(), | |||
| extension.getImplementationVendorID(), | |||
| null ); | |||
| } | |||
| final boolean hasImplAttributes = | |||
| null != extension.getImplementationURL() || | |||
| null != extension.getImplementationVersion() || | |||
| null != extension.getImplementationVendorID() || | |||
| null != extension.getImplementationVendor(); | |||
| if( !includeImpl && hasImplAttributes ) | |||
| { | |||
| extension = | |||
| new Extension( extension.getExtensionName(), | |||
| extension.getSpecificationVersion().toString(), | |||
| extension.getSpecificationVendor(), | |||
| null, | |||
| null, | |||
| null, | |||
| extension.getImplementationURL() ); | |||
| } | |||
| extensionList.add( extension ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,165 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional.extension; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| /** | |||
| * LibFileSet represents a fileset containing libraries. | |||
| * Asociated with the libraries is data pertaining to | |||
| * how they are to be handled when building manifests. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class LibFileSet | |||
| extends FileSet | |||
| { | |||
| /** | |||
| * Flag indicating whether should include the | |||
| * "Implementation-URL" attribute in manifest. | |||
| * Defaults to false. | |||
| */ | |||
| private boolean m_includeURL; | |||
| /** | |||
| * Flag indicating whether should include the | |||
| * "Implementation-*" attributes in manifest. | |||
| * Defaults to false. | |||
| */ | |||
| private boolean m_includeImpl; | |||
| /** | |||
| * String that is the base URL for the librarys | |||
| * when constructing the "Implementation-URL" | |||
| * attribute. For instance setting the base to | |||
| * "http://jakarta.apache.org/avalon/libs/" and then | |||
| * including the library "excalibur-cli-1.0.jar" in the | |||
| * fileset will result in the "Implementation-URL" attribute | |||
| * being set to "http://jakarta.apache.org/avalon/libs/excalibur-cli-1.0.jar" | |||
| * | |||
| * Note this is only used if the library does not define | |||
| * "Implementation-URL" itself. | |||
| * | |||
| * Note that this also implies includeURL=true | |||
| */ | |||
| private String m_urlBase; | |||
| /** | |||
| * Flag indicating whether should include the | |||
| * "Implementation-URL" attribute in manifest. | |||
| * Defaults to false. | |||
| * | |||
| * @param includeURL the flag | |||
| * @see #m_includeURL | |||
| */ | |||
| public void setIncludeUrl( boolean includeURL ) | |||
| { | |||
| m_includeURL = includeURL; | |||
| } | |||
| /** | |||
| * Flag indicating whether should include the | |||
| * "Implementation-*" attributes in manifest. | |||
| * Defaults to false. | |||
| * | |||
| * @param includeImpl the flag | |||
| * @see #m_includeImpl | |||
| */ | |||
| public void setIncludeImpl( boolean includeImpl ) | |||
| { | |||
| m_includeImpl = includeImpl; | |||
| } | |||
| /** | |||
| * Set the url base for fileset. | |||
| * | |||
| * @param urlBase the base url | |||
| * @see #m_urlBase | |||
| */ | |||
| public void setUrlBase( String urlBase ) | |||
| { | |||
| m_urlBase = urlBase; | |||
| } | |||
| /** | |||
| * Get the includeURL flag. | |||
| * | |||
| * @return the includeURL flag. | |||
| */ | |||
| boolean isIncludeURL() | |||
| { | |||
| return m_includeURL; | |||
| } | |||
| /** | |||
| * Get the includeImpl flag. | |||
| * | |||
| * @return the includeImpl flag. | |||
| */ | |||
| boolean isIncludeImpl() | |||
| { | |||
| return m_includeImpl; | |||
| } | |||
| /** | |||
| * Get the urlbase. | |||
| * | |||
| * @return the urlbase. | |||
| */ | |||
| String getUrlBase() | |||
| { | |||
| return m_urlBase; | |||
| } | |||
| } | |||