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