git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272164 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -237,10 +237,10 @@ Legal: | |||
| <javac | |||
| destdir="${build.classes}" | |||
| debug="${debug}" | |||
| deprecation="${deprecation}" | |||
| deprecation="${deprecation}" | |||
| includeAntRuntime="false" | |||
| includeJavaRuntime="false"> | |||
| <classpath refid="project.class.path"/> | |||
| <src location="src/todo"/> | |||
| <src path="${java.dir}" /> | |||
| @@ -494,6 +494,10 @@ Legal: | |||
| <property name="antlib.name" value="core"/> | |||
| </ant> | |||
| <ant antfile="antlib.xml"> | |||
| <property name="antlib.name" value="extensions"/> | |||
| </ant> | |||
| <ant antfile="antlib.xml"> | |||
| <property name="antlib.name" value="file"/> | |||
| </ant> | |||
| @@ -546,12 +550,12 @@ Legal: | |||
| destdir="${test.classes}" | |||
| debug="${debug}" | |||
| deprecation="${deprecation}"> | |||
| <classpath> | |||
| <pathelement location="${build.classes}"/> | |||
| <path refid="project.class.path"/> | |||
| </classpath> | |||
| <exclude name="**/SmbFileSystemTestCase.java" unless="jcifs.present"/> | |||
| <exclude name="**/FtpFileSystemTestCase.java" unless="netcomp.present"/> | |||
| </javac> | |||
| @@ -611,7 +615,7 @@ Legal: | |||
| tofile="${test.classes}/META-INF/ant-descriptor.xml"/> | |||
| <!-- Run all the tests --> | |||
| <junit printsummary="on" | |||
| <junit printsummary="on" | |||
| fork="true" failureProperty="test.failed"> | |||
| <formatter type="brief" usefile="false"/> | |||
| <classpath> | |||
| @@ -637,7 +641,7 @@ Legal: | |||
| <!-- Need Ant1.5+ to run Ant1Compat tests, because of classpath | |||
| problems in Ant1.4 JUnit Task (prepends ant.jar to classpath) --> | |||
| <exclude name="**/Ant1CompatTestCase.class" unless="ant1.5"/> | |||
| <!-- This test fails, as it has no test methods --> | |||
| <exclude name="**/SimpleConvertersTestCase.class" unless="single.test"/> | |||
| </fileset> | |||
| @@ -781,7 +785,7 @@ Legal: | |||
| <exclude name="jdepend.jar"/> | |||
| </fileset> | |||
| </copy> | |||
| <copy todir="${dist.lib}" file="../../lib/optional/junit.jar" /> | |||
| <copy todir="${dist.bin}"> | |||
| @@ -0,0 +1,125 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.extensions; | |||
| import java.io.File; | |||
| import java.util.Iterator; | |||
| import java.util.Vector; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| 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; | |||
| /** | |||
| * Display the "Optional Package" and "Package Specification" information | |||
| * contained within the specified jars. | |||
| * | |||
| * <p>Prior to JDK1.3, an "Optional Package" was known as an Extension. | |||
| * The specification for this mechanism is available in the JDK1.3 | |||
| * documentation in the directory | |||
| * $JDK_HOME/docs/guide/extensions/versioning.html. Alternatively it is | |||
| * available online at <a href="http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html"> | |||
| * http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html</a>.</p> | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="extension-display" | |||
| */ | |||
| public class ExtensionDisplayTask | |||
| extends AbstractTask | |||
| { | |||
| private final static Resources REZ = | |||
| ResourceManager.getPackageResources( ExtensionDisplayTask.class ); | |||
| /** | |||
| * The library to display information about. | |||
| */ | |||
| private File m_file; | |||
| /** | |||
| * Filesets specifying all the librarys | |||
| * to display information about. | |||
| */ | |||
| private final Vector m_filesets = new Vector(); | |||
| /** | |||
| * The jar library to display information for. | |||
| * | |||
| * @param file The jar library to display information for. | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Adds a set of files about which library data will be displayed. | |||
| * | |||
| * @param fileSet a set of files about which library data will be displayed. | |||
| */ | |||
| public void addFileset( final FileSet fileSet ) | |||
| { | |||
| m_filesets.addElement( fileSet ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final LibraryDisplay displayer = new LibraryDisplay(); | |||
| // Check if list of files to check has been specified | |||
| if( !m_filesets.isEmpty() ) | |||
| { | |||
| final Iterator iterator = m_filesets.iterator(); | |||
| while( iterator.hasNext() ) | |||
| { | |||
| final FileSet fileSet = (FileSet)iterator.next(); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| 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 ] ); | |||
| displayer.displayLibrary( file ); | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| displayer.displayLibrary( m_file ); | |||
| } | |||
| } | |||
| /** | |||
| * Validate the tasks parameters. | |||
| * | |||
| * @throws TaskException if invalid parameters found | |||
| */ | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_file && m_filesets.isEmpty() ) | |||
| { | |||
| final String message = REZ.getString( "extension.missing-file.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && !m_file.exists() ) | |||
| { | |||
| final String message = REZ.getString( "extension.file-noexist.error", m_file ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && !m_file.isFile() ) | |||
| { | |||
| final String message = REZ.getString( "extension.bad-file.error", m_file ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,164 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.extensions; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.jar.Manifest; | |||
| import java.util.jar.JarFile; | |||
| import java.text.ParseException; | |||
| import java.lang.StringBuffer; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.avalon.excalibur.extension.Extension; | |||
| import org.apache.avalon.excalibur.extension.Specification; | |||
| /** | |||
| * Utility class to output the information in a jar relating | |||
| * to "Optional Packages" (formely known as "Extensions") | |||
| * and Package Specifications. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| class LibraryDisplay | |||
| { | |||
| /** | |||
| * Display the extensions and specifications contained | |||
| * within specified file. | |||
| * | |||
| * @param file the file | |||
| * @throws TaskException if fail to read file | |||
| */ | |||
| public void displayLibrary( final File file ) | |||
| throws TaskException | |||
| { | |||
| final Manifest manifest = getManifest( file ); | |||
| final Extension[] available = Extension.getAvailable( manifest ); | |||
| final Extension[] required = Extension.getRequired( manifest ); | |||
| final Specification[] specifications = getSpecifications( manifest ); | |||
| if( 0 == available.length && | |||
| 0 == required.length && | |||
| 0 == specifications.length ) | |||
| { | |||
| return; | |||
| } | |||
| final String message = "File: " + file; | |||
| final int size = message.length(); | |||
| printLine( size ); | |||
| System.out.println( message ); | |||
| printLine( size ); | |||
| if( 0 != available.length ) | |||
| { | |||
| System.out.println( "Extensions Supported By Library:" ); | |||
| for( int i = 0; i < available.length; i++ ) | |||
| { | |||
| final Extension extension = available[ i ]; | |||
| System.out.println( extension.toString() ); | |||
| } | |||
| } | |||
| if( 0 != required.length ) | |||
| { | |||
| System.out.println( "Extensions Required By Library:" ); | |||
| for( int i = 0; i < required.length; i++ ) | |||
| { | |||
| final Extension extension = required[ i ]; | |||
| System.out.println( extension.toString() ); | |||
| } | |||
| } | |||
| if( 0 != specifications.length ) | |||
| { | |||
| System.out.println( "Specifications Supported By Library:" ); | |||
| for( int i = 0; i < specifications.length; i++ ) | |||
| { | |||
| final Specification specification = specifications[ i ]; | |||
| displaySpecification( specification ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Print out a line of '-'s equal to specified size. | |||
| * | |||
| * @param size the number of dashes to printout | |||
| */ | |||
| private void printLine( final int size ) | |||
| { | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| System.out.print( "-" ); | |||
| } | |||
| System.out.println(); | |||
| } | |||
| /** | |||
| * Get specifications from manifest. | |||
| * | |||
| * @param manifest the manifest | |||
| * @return the specifications or null if none | |||
| * @throws org.apache.myrmidon.api.TaskException if malformed specification sections | |||
| */ | |||
| private Specification[] getSpecifications( final Manifest manifest ) | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| return Specification.getSpecifications( manifest ); | |||
| } | |||
| catch( final ParseException pe ) | |||
| { | |||
| throw new TaskException( pe.getMessage(), pe ); | |||
| } | |||
| } | |||
| /** | |||
| * Print out specification details. | |||
| * | |||
| * @param specification the specification | |||
| */ | |||
| private void displaySpecification( final Specification specification ) | |||
| { | |||
| final String[] sections = specification.getSections(); | |||
| if( null != sections ) | |||
| { | |||
| final StringBuffer sb = new StringBuffer( "Sections: " ); | |||
| for( int i = 0; i < sections.length; i++ ) | |||
| { | |||
| sb.append( " " ); | |||
| sb.append( sections[ i ] ); | |||
| } | |||
| System.out.println( sb ); | |||
| } | |||
| System.out.println( specification.toString() ); | |||
| } | |||
| /** | |||
| * retrieve manifest for specified file. | |||
| * | |||
| * @param file the file | |||
| * @return the manifest | |||
| * @throws org.apache.myrmidon.api.TaskException if errror occurs (file not exist, | |||
| * file not a jar, manifest not exist in file) | |||
| */ | |||
| private Manifest getManifest( final File file ) | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| final JarFile jarFile = new JarFile( file ); | |||
| return jarFile.getManifest(); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,3 @@ | |||
| extension.missing-file.error=File attribute not specified. | |||
| extension.file-noexist.error=File "{0}" does not exist. | |||
| extension.bad-file.error="{0}" is not a file. | |||
| @@ -323,4 +323,14 @@ Legal: | |||
| </changelog> | |||
| </target> | |||
| <target name="extension-test"> | |||
| <extension-display file="../../src/ant1compat/jar/ant.jar"/> | |||
| <extension-display> | |||
| <fileset dir="../../"> | |||
| <include name="src/ant1compat/jar/*.jar"/> | |||
| <include name="lib/*.jar"/> | |||
| </fileset> | |||
| </extension-display> | |||
| </target> | |||
| </project> | |||