From c66d1357e4ef1e3e9b56512ab6b63784fc47220b Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Sat, 6 Apr 2002 04:25:49 +0000 Subject: [PATCH] Reworked task based on feedback. Moved all attributes relating to extension into a sub-element "extension" Renamed "depends" to "dependsfileset" Renamed "optional" to "optionalfileset" Added "depends" sub element that are the same as "extension" sub-element Added "option" sub element that are the same as "extension" sub-element git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272251 13f79535-47bb-0310-9956-ffa450edef68 --- .../myrmidon/lib/excalibur-extension-1.0a.jar | Bin 39915 -> 20159 bytes .../antlib/extensions/ExtensionAdapter.java | 171 ++++++++ .../antlib/extensions/JarLibManifestTask.java | 366 ++++++------------ .../antlib/extensions/Resources.properties | 3 + proposal/myrmidon/src/samples/sample.ant | 20 +- 5 files changed, 314 insertions(+), 246 deletions(-) create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/extensions/ExtensionAdapter.java diff --git a/proposal/myrmidon/lib/excalibur-extension-1.0a.jar b/proposal/myrmidon/lib/excalibur-extension-1.0a.jar index fdb10a169a9cb4dc751ee5ef7356a163346ce747..08e785f15392be04d7f0fbcab25afaa945c73bcf 100644 GIT binary patch literal 20159 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

}^It~nX+!~=48&7P37-54A=h^m^9o-$RiIQ!Kn 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 Donald + * @version $Revision$ $Date$ + */ +public class ExtensionAdapter +{ + private static final Resources REZ = + ResourceManager.getPackageResources( ExtensionAdapter.class ); + + /** + * The name of the optional package being made available, or required. + */ + private String m_extensionName; + + /** + * The version number (dotted decimal notation) of the specification + * to which this optional package conforms. + */ + private DeweyDecimal m_specificationVersion; + + /** + * The name of the company or organization that originated the + * specification to which this optional package conforms. + */ + private String m_specificationVendor; + + /** + * The unique identifier of the company that produced the optional + * package contained in this JAR file. + */ + private String m_implementationVendorID; + + /** + * The name of the company or organization that produced this + * implementation of this optional package. + */ + private String m_implementationVendor; + + /** + * The version number (dotted decimal notation) for this implementation + * of the optional package. + */ + private DeweyDecimal m_implementationVersion; + + /** + * The URL from which the most recent version of this optional package + * can be obtained if it is not already installed. + */ + private String m_implementationURL; + + /** + * Set the name of extension. + * + * @param extensionName the name of extension + */ + public void setExtensionName( final String extensionName ) + { + m_extensionName = extensionName; + } + + /** + * Set the specificationVersion of extension. + * + * @param specificationVersion the specificationVersion of extension + */ + public void setSpecificationVersion( final String specificationVersion ) + { + m_specificationVersion = new DeweyDecimal( specificationVersion ); + } + + /** + * Set the specificationVendor of extension. + * + * @param specificationVendor the specificationVendor of extension + */ + public void setSpecificationVendor( final String specificationVendor ) + { + m_specificationVendor = specificationVendor; + } + + /** + * Set the implementationVendorID of extension. + * + * @param implementationVendorID the implementationVendorID of extension + */ + public void setImplementationVendorID( final String implementationVendorID ) + { + m_implementationVendorID = implementationVendorID; + } + + /** + * Set the implementationVendor of extension. + * + * @param implementationVendor the implementationVendor of extension + */ + public void setImplementationVendor( final String implementationVendor ) + { + m_implementationVendor = implementationVendor; + } + + /** + * Set the implementationVersion of extension. + * + * @param implementationVersion the implementationVersion of extension + */ + public void setImplementationVersion( final String implementationVersion ) + { + m_implementationVersion = new DeweyDecimal( implementationVersion ); + } + + /** + * Set the implementationURL of extension. + * + * @param implementationURL the implementationURL of extension + */ + public void setImplementationURL( final String implementationURL ) + { + m_implementationURL = implementationURL; + } + + /** + * Convert this adpater object into an extension object. + * + * @return the extension object + */ + Extension toExtension() + throws TaskException + { + if( null == m_extensionName ) + { + final String message = REZ.getString( "extension.noname.error" ); + throw new TaskException( message ); + } + + String specificationVersion = null; + if( null != m_specificationVersion ) + { + specificationVersion = m_specificationVersion.toString(); + } + String implementationVersion = null; + if( null != m_implementationVersion ) + { + implementationVersion = m_implementationVersion.toString(); + } + return new Extension( m_extensionName, + specificationVersion, + m_specificationVendor, + implementationVersion, + m_implementationVendorID, + m_implementationVendor, + m_implementationURL ); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/extensions/JarLibManifestTask.java b/proposal/myrmidon/src/java/org/apache/antlib/extensions/JarLibManifestTask.java index 2fbbaffe2..da9311369 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/extensions/JarLibManifestTask.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/extensions/JarLibManifestTask.java @@ -12,11 +12,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; -import java.util.Vector; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; -import org.apache.avalon.excalibur.extension.DeweyDecimal; import org.apache.avalon.excalibur.extension.Extension; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; @@ -24,7 +22,6 @@ import org.apache.avalon.excalibur.io.IOUtil; import org.apache.myrmidon.Constants; import org.apache.myrmidon.api.AbstractTask; import org.apache.myrmidon.api.TaskException; -import org.apache.myrmidon.framework.FileSet; import org.apache.tools.todo.types.DirectoryScanner; import org.apache.tools.todo.types.ScannerUtil; @@ -44,7 +41,7 @@ import org.apache.tools.todo.types.ScannerUtil; * @author Peter Donald * @ant.task name="jarlib-manifest" */ -public class JarLibManifestTask +public final class JarLibManifestTask extends AbstractTask { private final static Resources REZ = @@ -61,57 +58,33 @@ public class JarLibManifestTask private File m_destfile; /** - * Filesets specifying all the librarys - * to generate dependency information about. - */ - private final Vector m_dependencies = new Vector(); - - /** - * Filesets specifying all the librarys - * to generate optional dependency information about. - */ - private final Vector m_optionals = new Vector(); - - /** - * The name of the optional package being made available, or required. - */ - private String m_extensionName; - - /** - * The version number (dotted decimal notation) of the specification - * to which this optional package conforms. - */ - private DeweyDecimal m_specificationVersion; - - /** - * The name of the company or organization that originated the - * specification to which this optional package conforms. + * The extension supported by this library (if any). */ - private String m_specificationVendor; + private Extension m_extension; /** - * The unique identifier of the company that produced the optional - * package contained in this JAR file. + * ExtensionAdapter objects representing + * dependencies required by library. */ - private String m_implementationVendorID; + private final ArrayList m_dependencies = new ArrayList(); /** - * The name of the company or organization that produced this - * implementation of this optional package. + * ExtensionAdapter objects representing optional + * dependencies required by library. */ - private String m_implementationVendor; + private final ArrayList m_optionals = new ArrayList(); /** - * The version number (dotted decimal notation) for this implementation - * of the optional package. + * Filesets specifying all the librarys + * to generate dependency information about. */ - private DeweyDecimal m_implementationVersion; + private final ArrayList m_dependsFilesets = new ArrayList(); /** - * The URL from which the most recent version of this optional package - * can be obtained if it is not already installed. + * Filesets specifying all the librarys + * to generate optional dependency information about. */ - private String m_implementationURL; + private final ArrayList m_optionalsFilesets = new ArrayList(); /** * Extra attributes the user specifies for main section @@ -120,83 +93,52 @@ public class JarLibManifestTask private final ArrayList m_extraAttributes = new ArrayList(); /** - * Set the name of extension in generated manifest. - * - * @param extensionName the name of extension in generated manifest - */ - public void setExtensionName( final String extensionName ) - { - m_extensionName = extensionName; - } - - /** - * Set the specificationVersion of extension in generated manifest. - * - * @param specificationVersion the specificationVersion of extension in generated manifest - */ - public void setSpecificationVersion( final String specificationVersion ) - { - m_specificationVersion = new DeweyDecimal( specificationVersion ); - } - - /** - * Set the specificationVendor of extension in generated manifest. - * - * @param specificationVendor the specificationVendor of extension in generated manifest - */ - public void setSpecificationVendor( final String specificationVendor ) - { - m_specificationVendor = specificationVendor; - } - - /** - * Set the implementationVendorID of extension in generated manifest. - * - * @param implementationVendorID the implementationVendorID of extension in generated manifest - */ - public void setImplementationVendorID( final String implementationVendorID ) - { - m_implementationVendorID = implementationVendorID; - } - - /** - * Set the implementationVendor of extension in generated manifest. + * The location where generated manifest is placed. * - * @param implementationVendor the implementationVendor of extension in generated manifest + * @param destfile The location where generated manifest is placed. */ - public void setImplementationVendor( final String implementationVendor ) + public void setDestfile( final File destfile ) { - m_implementationVendor = implementationVendor; + m_destfile = destfile; } /** - * Set the implementationVersion of extension in generated manifest. + * Adds an extension that this library implements. * - * @param implementationVersion the implementationVersion of extension in generated manifest + * @param extensionAdapter an extension that this library implements. */ - public void setImplementationVersion( final String implementationVersion ) + public void addExtension( final ExtensionAdapter extensionAdapter ) + throws TaskException { - m_implementationVersion = new DeweyDecimal( implementationVersion ); + if( null != m_extension ) + { + final String message = REZ.getString( "manifest.multi-extension.error" ); + throw new TaskException( message ); + } + else + { + m_extension = extensionAdapter.toExtension(); + } } /** - * Set the implementationURL of extension in generated manifest. + * Adds an extension that this library requires. * - * @param implementationURL the implementationURL of extension in generated manifest + * @param extensionAdapter an extension that this library requires. */ - public void setImplementationURL( final String implementationURL ) + public void addDepends( final ExtensionAdapter extensionAdapter ) { - m_implementationURL = implementationURL; + m_dependencies.add( extensionAdapter ); } /** - * The location where generated manifest is placed. + * Adds an extension that this library optionally requires. * - * @param destfile The location where generated manifest is placed. + * @param extensionAdapter an extension that this library optionally requires. */ - public void setDestfile( final File destfile ) + public void addOption( final ExtensionAdapter extensionAdapter ) { - m_destfile = destfile; + m_optionals.add( extensionAdapter ); } /** @@ -204,9 +146,9 @@ public class JarLibManifestTask * * @param fileSet a set of files about which library data will be displayed. */ - public void addDepends( final LibFileSet fileSet ) + public void addDependsfileset( final LibFileSet fileSet ) { - m_dependencies.add( fileSet ); + m_dependsFilesets.add( fileSet ); } /** @@ -214,9 +156,9 @@ public class JarLibManifestTask * * @param fileSet a set of files about which library data will be displayed. */ - public void addOptional( final LibFileSet fileSet ) + public void addOptionalfileset( final LibFileSet fileSet ) { - m_optionals.addElement( fileSet ); + m_optionalsFilesets.add( fileSet ); } /** @@ -242,14 +184,26 @@ public class JarLibManifestTask appendExtraAttributes( attributes ); - appendExtensionData( attributes ); - - final String extensionKey = Extension.EXTENSION_LIST.toString(); - appendLibrarys( attributes, extensionKey, m_dependencies ); - - final String optionalExtensionKey = - "Optional-" + Extension.EXTENSION_LIST.toString(); - appendLibrarys( attributes, optionalExtensionKey, m_optionals ); + Extension.addExtension( m_extension, attributes ); + + //Add all the dependency data to manifest for dependencies + final ArrayList depends = toExtensions( m_dependencies ); + extractLibraryData( depends, m_dependsFilesets ); + appendExtensionList( attributes, + Extension.EXTENSION_LIST, + "lib", + depends.size() ); + appendLibraryList( attributes, "lib", depends ); + + //Add all the dependency data to manifest for "optional" + //dependencies + final ArrayList option = toExtensions( m_optionals ); + extractLibraryData( option, m_optionalsFilesets ); + appendExtensionList( attributes, + Extension.OPTIONAL_EXTENSION_LIST, + "opt", + option.size() ); + appendLibraryList( attributes, "opt", option ); try { @@ -328,123 +282,78 @@ public class JarLibManifestTask } /** - * Append specified librarys extension data to specified attributes. - * Use the extensionKey to list the extensions, usually "Extension-List:" - * for required dependencies and "Optional-Extension-List:" for optional - * dependencies. NOTE: "Optional" dependencies are not part of the - * specification. + * Generate a list of extensions from a specified fileset. * - * @param attributes the attributes to add extensions to - * @param extensionKey the key under which to add extensions - * @param librarys the filesets containing librarys + * @param librarys the list to add extensions to + * @param fileset the filesets containing librarys * @throws TaskException if an error occurs */ - private void appendLibrarys( final Attributes attributes, - final String extensionKey, - final Vector librarys ) + private void extractLibraryData( final ArrayList librarys, + final ArrayList fileset ) throws TaskException { - if( !librarys.isEmpty() ) + if( !fileset.isEmpty() ) { - final Extension[] extensions = getExtensions( librarys ); - final String[] names = getNames( extensions ); - final StringBuffer sb = new StringBuffer(); - for( int i = 0; i < names.length; i++ ) - { - sb.append( names[ i ] ); - sb.append( ' ' ); - } - - //Extension-List: javahelp java3d - attributes.putValue( extensionKey, sb.toString() ); - - for( int i = 0; i < names.length; i++ ) + final Extension[] extensions = getExtensions( fileset ); + for( int i = 0; i < extensions.length; i++ ) { - appendDependency( attributes, - names[ i ], - extensions[ i ] ); + librarys.add( extensions[ i ] ); } } } /** - * add a extension dependency to manifest. - * Use specified name as prefix name. + * Append specified librarys extension data to specified attributes. + * Use the extensionKey to list the extensions, usually "Extension-List:" + * for required dependencies and "Optional-Extension-List:" for optional + * dependencies. NOTE: "Optional" dependencies are not part of the + * specification. * - * @param attributes the attributes of manifest - * @param name the name to prefix to extension - * @param extension the extension + * @param attributes the attributes to add extensions to + * @param librarys the filesets containing librarys * @throws TaskException if an error occurs */ - private void appendDependency( final Attributes attributes, - final String name, - final Extension extension ) + private void appendLibraryList( final Attributes attributes, + final String listPrefix, + final ArrayList librarys ) throws TaskException { - final String prefix = name + "-"; - attributes.putValue( prefix + Extension.EXTENSION_NAME, - extension.getExtensionName() ); + final int size = librarys.size(); - final String specificationVendor = extension.getSpecificationVendor(); - if( null != specificationVendor ) + for( int i = 0; i < size; i++ ) { - attributes.putValue( prefix + Extension.SPECIFICATION_VENDOR, - specificationVendor ); - } - - final DeweyDecimal specificationVersion = extension.getSpecificationVersion(); - if( null != specificationVersion ) - { - attributes.putValue( prefix + Extension.SPECIFICATION_VERSION, - specificationVersion.toString() ); - } - - final String implementationVendorID = extension.getImplementationVendorID(); - if( null != implementationVendorID ) - { - attributes.putValue( prefix + Extension.IMPLEMENTATION_VENDOR_ID, - implementationVendorID ); - } - - final String implementationVendor = extension.getImplementationVendor(); - if( null != implementationVendor ) - { - attributes.putValue( prefix + Extension.IMPLEMENTATION_VENDOR, - implementationVendor ); - } - - final DeweyDecimal implementationVersion = extension.getImplementationVersion(); - if( null != implementationVersion ) - { - attributes.putValue( prefix + Extension.IMPLEMENTATION_VERSION, - implementationVersion.toString() ); - } - - final String implementationURL = extension.getImplementationURL(); - if( null != implementationURL ) - { - attributes.putValue( prefix + Extension.IMPLEMENTATION_URL, - implementationURL ); + final Extension extension = (Extension)librarys.get( i ); + final String prefix = listPrefix + i + "-"; + Extension.addExtension( extension, prefix, attributes ); } } /** - * Create an array of names that can be used for dependencies - * list for the specified extensions. + * Append an attribute such as "Extension-List: lib0 lib1 lib2" + * using specified prefix and counting up to specified size. + * Also use specified extensionKey so that can generate list of + * optional dependencies aswell. * - * @param extensions the extensions - * @return the names to use for extensions - */ - private String[] getNames( final Extension[] extensions ) + * @param size the number of librarys to list + * @param listPrefix the prefix for all librarys + * @param attributes the attributes to add key-value to + * @param extensionKey the key to use + */ + private void appendExtensionList( final Attributes attributes, + final Attributes.Name extensionKey, + final String listPrefix, + final int size ) { - final String[] results = new String[ extensions.length ]; - for( int i = 0; i < results.length; i++ ) + final StringBuffer sb = new StringBuffer(); + for( int i = 0; i < size; i++ ) { - //Perhaps generate mangled names based on extension in future - results[ i ] = "lib" + i; + sb.append( listPrefix + i ); + sb.append( ' ' ); } - return results; + //add in something like + //"Extension-List: javahelp java3d" + attributes.put( extensionKey, sb.toString() ); } /** @@ -454,14 +363,14 @@ public class JarLibManifestTask * @return the extensions contained in librarys * @throws TaskException if failing to scan librarys */ - private Extension[] getExtensions( final Vector librarys ) + private static Extension[] getExtensions( final ArrayList librarys ) throws TaskException { final ArrayList extensions = new ArrayList(); final Iterator iterator = librarys.iterator(); while( iterator.hasNext() ) { - final FileSet fileSet = (FileSet)iterator.next(); + final LibFileSet fileSet = (LibFileSet)iterator.next(); final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); final File basedir = scanner.getBasedir(); final String[] files = scanner.getIncludedFiles(); @@ -481,8 +390,8 @@ public class JarLibManifestTask * @param extensions the list to add available extensions to * @throws TaskException if there is an error */ - private void loadExtensions( final File file, - final ArrayList extensions ) + private static void loadExtensions( final File file, + final ArrayList extensions ) throws TaskException { try @@ -490,9 +399,9 @@ public class JarLibManifestTask final JarFile jarFile = new JarFile( file ); final Extension[] extension = Extension.getAvailable( jarFile.getManifest() ); - for( int j = 0; j < extension.length; j++ ) + for( int i = 0; i < extension.length; i++ ) { - extensions.add( extension[ j ] ); + extensions.add( extension[ i ] ); } } catch( final Exception e ) @@ -502,42 +411,25 @@ public class JarLibManifestTask } /** - * Add extension data into specified attributes. + * Convert a list of extensionAdapter objects to extensions. * - * @param attributes the attributes to add extension data to + * @param adapters the list of ExtensionAdapterss to add to convert + * @throws TaskException if an error occurs */ - private void appendExtensionData( final Attributes attributes ) + private static ArrayList toExtensions( final ArrayList adapters ) + throws TaskException { - attributes.put( Extension.EXTENSION_NAME, m_extensionName ); - if( null != m_specificationVendor ) - { - attributes.put( Extension.SPECIFICATION_VENDOR, - m_specificationVendor ); - } - if( null != m_specificationVersion ) - { - attributes.put( Extension.SPECIFICATION_VERSION, - m_specificationVersion.toString() ); - } - if( null != m_implementationVendorID ) - { - attributes.put( Extension.IMPLEMENTATION_VENDOR_ID, - m_implementationVendorID ); - } - if( null != m_implementationVendor ) - { - attributes.put( Extension.IMPLEMENTATION_VENDOR, - m_implementationVendor ); - } - if( null != m_implementationVersion ) - { - attributes.put( Extension.IMPLEMENTATION_VERSION, - m_implementationVersion.toString() ); - } - if( null != m_implementationURL ) + final ArrayList results = new ArrayList(); + + final int size = adapters.size(); + for( int i = 0; i < size; i++ ) { - attributes.put( Extension.IMPLEMENTATION_URL, - m_implementationURL ); + final ExtensionAdapter adapter = + (ExtensionAdapter)adapters.get( i ); + final Extension extension = adapter.toExtension(); + results.add( extension ); } + + return results; } } diff --git a/proposal/myrmidon/src/java/org/apache/antlib/extensions/Resources.properties b/proposal/myrmidon/src/java/org/apache/antlib/extensions/Resources.properties index f2500e165..cef51537e 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/extensions/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/antlib/extensions/Resources.properties @@ -5,6 +5,9 @@ extension.bad-file.error="{0}" is not a file. manifest.missing-file.error=Destfile attribute not specified. manifest.bad-file.error="{0}" is not a file. manifest.file.notice=Generating manifest {0}. +manifest.multi-extension.error=Can not have multiple extensions defined in one library. param.noname.error=Missing name from parameter. param.novalue.error=Missing value from parameter "{0}". + +extension.noname.error=Extension is missing name. \ No newline at end of file diff --git a/proposal/myrmidon/src/samples/sample.ant b/proposal/myrmidon/src/samples/sample.ant index 6c0cd517f..33875f1cb 100644 --- a/proposal/myrmidon/src/samples/sample.ant +++ b/proposal/myrmidon/src/samples/sample.ant @@ -337,19 +337,21 @@ Legal: --> - + + - + + - - + + - + +