* 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; | |||
} | |||
} |