diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/archive/Jar.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/archive/Jar.java index 3d9041b9c..14cde3ac2 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/archive/Jar.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/archive/Jar.java @@ -18,12 +18,12 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.util.Enumeration; -import java.util.Iterator; import java.util.zip.ZipFile; import org.apache.aut.zip.ZipOutputStream; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.taskdefs.manifest.Manifest; import org.apache.tools.ant.taskdefs.manifest.ManifestException; +import org.apache.tools.ant.taskdefs.manifest.ManifestUtil; import org.apache.tools.ant.types.FileScanner; /** @@ -89,10 +89,10 @@ public class Jar try { r = new FileReader( manifestFile ); - Manifest newManifest = new Manifest( r ); + Manifest newManifest = ManifestUtil.buildManifest( r ); if( m_manifest == null ) { - m_manifest = Manifest.getDefaultManifest(); + m_manifest = ManifestUtil.getDefaultManifest(); } m_manifest.merge( newManifest ); } @@ -134,7 +134,7 @@ public class Jar { if( m_manifest == null ) { - m_manifest = Manifest.getDefaultManifest(); + m_manifest = ManifestUtil.getDefaultManifest(); } m_manifest.merge( newManifest ); buildFileManifest = true; @@ -172,10 +172,10 @@ public class Jar getLogger().debug( "Updating jar since the current jar has no manifest" ); return false; } - Manifest currentManifest = new Manifest( new InputStreamReader( theZipFile.getInputStream( entry ) ) ); + Manifest currentManifest = ManifestUtil.buildManifest( new InputStreamReader( theZipFile.getInputStream( entry ) ) ); if( m_manifest == null ) { - m_manifest = Manifest.getDefaultManifest(); + m_manifest = ManifestUtil.getDefaultManifest(); } if( !currentManifest.equals( m_manifest ) ) { @@ -231,22 +231,25 @@ public class Jar { try { - m_execManifest = Manifest.getDefaultManifest(); + m_execManifest = ManifestUtil.getDefaultManifest(); if( m_manifest != null ) { m_execManifest.merge( m_manifest ); } + /* for( Iterator e = m_execManifest.getWarnings(); e.hasNext(); ) { getLogger().warn( "Manifest warning: " + (String)e.next() ); } + */ zipDir( null, zOut, "META-INF/" ); // time to write the manifest ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintWriter writer = new PrintWriter( baos ); - m_execManifest.write( writer ); + Manifest manifest = m_execManifest; + ManifestUtil.write( manifest, writer ); writer.flush(); ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() ); @@ -375,11 +378,12 @@ public class Jar { if( m_execManifest == null ) { - m_execManifest = new Manifest( new InputStreamReader( is ) ); + m_execManifest = ManifestUtil.buildManifest( new InputStreamReader( is ) ); } else if( isAddingNewFiles() ) { - m_execManifest.merge( new Manifest( new InputStreamReader( is ) ) ); + final Manifest other = ManifestUtil.buildManifest( new InputStreamReader( is ) ); + m_execManifest.merge( other ); } } catch( ManifestException e ) diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Attribute.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Attribute.java index 7c7bb5514..b0b5fa7c1 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Attribute.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Attribute.java @@ -9,6 +9,7 @@ package org.apache.tools.ant.taskdefs.manifest; import java.io.PrintWriter; import java.io.IOException; +import java.util.jar.Attributes; /** * Class to hold manifest attributes @@ -110,10 +111,11 @@ public class Attribute } final Attribute other = (Attribute)object; + final String name = other.m_name; return - ( null != m_name && null != other.m_name && - m_name.toLowerCase().equals( other.m_name.toLowerCase() ) && - m_value != null && m_value.equals( other.m_value ) ); + ( null != m_name && null != name && + m_name.toLowerCase().equals( name.toLowerCase() ) && + null != m_value && m_value.equals( other.m_value ) ); } } diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Manifest.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Manifest.java index b531ad3bf..39fc5a113 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Manifest.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Manifest.java @@ -7,23 +7,11 @@ */ package org.apache.tools.ant.taskdefs.manifest; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; +import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; -import java.util.jar.Attributes; -import org.apache.myrmidon.api.AbstractTask; +import java.util.Set; import org.apache.myrmidon.api.TaskException; /** @@ -35,42 +23,11 @@ import org.apache.myrmidon.api.TaskException; * @version $Revision$ $Date$ */ public class Manifest - extends AbstractTask { - /** - * The standard Signature Version header - */ - public final static String ATTRIBUTE_SIGNATURE_VERSION = Attributes.Name.SIGNATURE_VERSION.toString(); - - /** - * The Name Attribute is the first in a named section - */ - public final static String ATTRIBUTE_NAME = "Name"; - - /** - * The From Header is disallowed in a Manifest - */ - public final static String ATTRIBUTE_FROM = "From"; - - /** - * The Class-Path Header is special - it can be duplicated - */ - public final static String ATTRIBUTE_CLASSPATH = Attributes.Name.CLASS_PATH.toString(); - - /** - * Default Manifest version if one is not specified - */ - public final static String DEFAULT_MANIFEST_VERSION = "1.0"; - - /** - * The max length of a line in a Manifest - */ - public final static int MAX_LINE_LENGTH = 70; - /** * The version of this manifest */ - private String m_manifestVersion = DEFAULT_MANIFEST_VERSION; + private String m_manifestVersion = ManifestUtil.DEFAULT_MANIFEST_VERSION; /** * The main section of this manifest @@ -82,211 +39,112 @@ public class Manifest */ private Hashtable m_sections = new Hashtable(); - private File m_manifestFile; - - private ManifestMode m_mode; - - /** - * Construct an empty manifest - */ - public Manifest() - throws TaskException + public void setManifestVersion( final String manifestVersion ) { - m_mode = new ManifestMode(); - m_mode.setValue( "replace" ); - m_manifestVersion = null; + m_manifestVersion = manifestVersion; } - /** - * Read a manifest file from the given reader - * - * @param r Description of Parameter - * @exception ManifestException Description of Exception - * @exception IOException Description of Exception - * @throws ManifestException if the manifest is not valid according to the - * JAR spec - * @throws IOException if the manifest cannot be read from the reader. - */ - public Manifest( Reader r ) - throws ManifestException, TaskException, IOException + public void setMainSection( final Section mainSection ) { - BufferedReader reader = new BufferedReader( r ); - // This should be the manifest version - String nextSectionName = m_mainSection.read( reader ); - String readManifestVersion = m_mainSection.getAttributeValue( Attributes.Name.MANIFEST_VERSION.toString() ); - if( readManifestVersion != null ) - { - m_manifestVersion = readManifestVersion; - m_mainSection.removeAttribute( Attributes.Name.MANIFEST_VERSION.toString() ); - } - - String line = null; - while( ( line = reader.readLine() ) != null ) - { - if( line.length() == 0 ) - { - continue; - } - - Section section = new Section(); - if( nextSectionName == null ) - { - Attribute sectionName = ManifestUtil.buildAttribute( line ); - if( !sectionName.getName().equalsIgnoreCase( ATTRIBUTE_NAME ) ) - { - throw new ManifestException( "Manifest sections should start with a \"" + ATTRIBUTE_NAME + - "\" attribute and not \"" + sectionName.getName() + "\"" ); - } - nextSectionName = sectionName.getValue(); - } - else - { - // we have already started reading this section - // this line is the first attribute. set it and then let the normal - // read handle the rest - Attribute firstAttribute = ManifestUtil.buildAttribute( line ); - section.addAttributeAndCheck( firstAttribute ); - } + m_mainSection = mainSection; + } - section.setName( nextSectionName ); - nextSectionName = section.read( reader ); - addSection( section ); - } + public void addAttribute( final Attribute attribute ) + throws ManifestException + { + m_mainSection.addAttribute( attribute ); } - /** - * Construct a manifest from Ant's default manifest file. - * - * @return The DefaultManifest value - * @exception TaskException Description of Exception - */ - public static Manifest getDefaultManifest() - throws TaskException + public void addSection( final Section section ) + throws ManifestException { - try - { - String s = "/org/apache/tools/ant/defaultManifest.mf"; - InputStream in = Manifest.class.getResourceAsStream( s ); - if( in == null ) - { - throw new TaskException( "Could not find default manifest: " + s ); - } - try - { - return new Manifest( new InputStreamReader( in, "ASCII" ) ); - } - catch( UnsupportedEncodingException e ) - { - return new Manifest( new InputStreamReader( in ) ); - } - } - catch( ManifestException e ) - { - throw new TaskException( "Default manifest is invalid !!" ); - } - catch( IOException e ) + if( section.getName() == null ) { - throw new TaskException( "Unable to read default manifest", e ); + final String message = "Sections must have a name"; + throw new ManifestException( message ); } + m_sections.put( section.getName().toLowerCase(), section ); } - /** - * The name of the manifest file to write (if used as a task). - * - * @param f The new File value - */ - public void setFile( File f ) + public String[] getSectionNames( final Manifest other ) { - m_manifestFile = f; + final Set keys = other.m_sections.keySet(); + return (String[])keys.toArray( new String[ keys.size() ] ); } - /** - * Shall we update or replace an existing manifest? - * - * @param m The new ManifestMode value - */ - public void setMode( ManifestMode m ) + public String getManifestVersion() { - m_mode = m; + return m_manifestVersion; } - /** - * Get the warnings for this manifest. - * - * @return an enumeration of warning strings - */ - public Iterator getWarnings() + public Section getMainSection() { - ArrayList warnings = new ArrayList(); - - for( Iterator e2 = m_mainSection.getWarnings(); e2.hasNext(); ) - { - warnings.add( e2.next() ); - } - - // create a vector and add in the warnings for all the sections - for( Enumeration e = m_sections.elements(); e.hasMoreElements(); ) - { - Section section = (Section)e.nextElement(); - for( Iterator e2 = section.getWarnings(); e2.hasNext(); ) - { - warnings.add( e2.next() ); - } - } + return m_mainSection; + } - return warnings.iterator(); + public Section getSection( final String name ) + { + return (Section)m_sections.get( name ); } - public void addAttribute( final Attribute attribute ) - throws ManifestException, TaskException + public Section[] getSections() { - m_mainSection.addAttribute( attribute ); + final Collection sections = m_sections.values(); + return (Section[])sections.toArray( new Section[ sections.size() ] ); } - public void addSection( final Section section ) - throws ManifestException, TaskException + /** + * Merge the contents of the given manifest into this manifest + * + * @param other the Manifest to be merged with this one. + * @throws ManifestException if there is a problem merging the manfest + * according to the Manifest spec. + */ + public void merge( final Manifest other ) + throws ManifestException { - if( section.getName() == null ) + if( other.m_manifestVersion != null ) { - throw new TaskException( "Sections must have a name" ); + m_manifestVersion = other.m_manifestVersion; } - m_sections.put( section.getName().toLowerCase(), section ); + m_mainSection.merge( other.m_mainSection ); + + mergeSections( other ); } - public boolean equals( Object rhs ) + public boolean equals( final Object object ) { - if( !( rhs instanceof Manifest ) ) + if( !( object instanceof Manifest ) ) { return false; } - Manifest rhsManifest = (Manifest)rhs; - if( m_manifestVersion == null ) + final Manifest other = (Manifest)object; + if( m_manifestVersion == null && other.m_manifestVersion != null ) { - if( rhsManifest.m_manifestVersion != null ) - { - return false; - } + return false; } - else if( !m_manifestVersion.equals( rhsManifest.m_manifestVersion ) ) + else if( !m_manifestVersion.equals( other.m_manifestVersion ) ) { return false; } - if( m_sections.size() != rhsManifest.m_sections.size() ) + if( m_sections.size() != other.m_sections.size() ) { return false; } - if( !m_mainSection.equals( rhsManifest.m_mainSection ) ) + if( !m_mainSection.equals( other.m_mainSection ) ) { return false; } - for( Enumeration e = m_sections.elements(); e.hasMoreElements(); ) + final Iterator e = m_sections.values().iterator(); + while( e.hasNext() ) { - Section section = (Section)e.nextElement(); - Section rhsSection = (Section)rhsManifest.m_sections.get( section.getName().toLowerCase() ); - if( !section.equals( rhsSection ) ) + final Section section = (Section)e.next(); + final String key = section.getName().toLowerCase(); + final Section otherSection = (Section)other.m_sections.get( key ); + if( !section.equals( otherSection ) ) { return false; } @@ -295,168 +153,23 @@ public class Manifest return true; } - /** - * Create or update the Manifest when used as a task. - * - * @exception TaskException Description of Exception - */ - public void execute() - throws TaskException - { - if( m_manifestFile == null ) - { - throw new TaskException( "the file attribute is required" ); - } - - Manifest toWrite = getDefaultManifest(); - - if( m_mode.getValue().equals( "update" ) && m_manifestFile.exists() ) - { - FileReader f = null; - try - { - f = new FileReader( m_manifestFile ); - toWrite.merge( new Manifest( f ) ); - } - catch( ManifestException m ) - { - throw new TaskException( "Existing manifest " + m_manifestFile - + " is invalid", m ); - } - catch( IOException e ) - { - throw new - TaskException( "Failed to read " + m_manifestFile, e ); - } - finally - { - if( f != null ) - { - try - { - f.close(); - } - catch( IOException e ) - { - } - } - } - } - - try - { - toWrite.merge( this ); - } - catch( ManifestException m ) - { - throw new TaskException( "Manifest is invalid", m ); - } - - PrintWriter w = null; - try - { - w = new PrintWriter( new FileWriter( m_manifestFile ) ); - toWrite.write( w ); - } - catch( IOException e ) - { - throw new TaskException( "Failed to write " + m_manifestFile, e ); - } - finally - { - if( w != null ) - { - w.close(); - } - } - } - - /** - * Merge the contents of the given manifest into this manifest - * - * @param other the Manifest to be merged with this one. - * @throws ManifestException if there is a problem merging the manfest - * according to the Manifest spec. - */ - public void merge( Manifest other ) + private void mergeSections( final Manifest other ) throws ManifestException { - if( other.m_manifestVersion != null ) - { - m_manifestVersion = other.m_manifestVersion; - } - m_mainSection.merge( other.m_mainSection ); - for( Enumeration e = other.m_sections.keys(); e.hasMoreElements(); ) + final String[] sections = getSectionNames( other ); + for( int i = 0; i < sections.length; i++ ) { - String sectionName = (String)e.nextElement(); - Section ourSection = (Section)m_sections.get( sectionName ); - Section otherSection = (Section)other.m_sections.get( sectionName ); - if( ourSection == null ) + final String sectionName = sections[ i ]; + final Section section = getSection( sectionName ); + final Section otherSection = other.getSection( sectionName ); + if( section == null ) { m_sections.put( sectionName.toLowerCase(), otherSection ); } else { - ourSection.merge( otherSection ); + section.merge( otherSection ); } } - } - - /** - * Convert the manifest to its string representation - * - * @return a multiline string with the Manifest as it appears in a Manifest - * file. - */ - public String toString() - { - StringWriter sw = new StringWriter(); - try - { - write( new PrintWriter( sw ) ); - } - catch( Exception e ) - { - return null; - } - return sw.toString(); - } - - /** - * Write the manifest out to a print writer. - * - * @param writer the Writer to which the manifest is written - * @throws IOException if the manifest cannot be written - */ - public void write( PrintWriter writer ) - throws IOException, TaskException - { - writer.println( Attributes.Name.MANIFEST_VERSION + ": " + m_manifestVersion ); - String signatureVersion = m_mainSection.getAttributeValue( ATTRIBUTE_SIGNATURE_VERSION ); - if( signatureVersion != null ) - { - writer.println( ATTRIBUTE_SIGNATURE_VERSION + ": " + signatureVersion ); - m_mainSection.removeAttribute( ATTRIBUTE_SIGNATURE_VERSION ); - } - m_mainSection.write( writer ); - if( signatureVersion != null ) - { - try - { - m_mainSection.addAttribute( new Attribute( ATTRIBUTE_SIGNATURE_VERSION, signatureVersion ) ); - } - catch( ManifestException e ) - { - // shouldn't happen - ignore - } - } - - for( Enumeration e = m_sections.elements(); e.hasMoreElements(); ) - { - Section section = (Section)e.nextElement(); - section.write( writer ); - } - } - } diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestTask.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestTask.java new file mode 100644 index 000000000..400fd87dd --- /dev/null +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestTask.java @@ -0,0 +1,196 @@ +/* + * 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.tools.ant.taskdefs.manifest; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Iterator; +import org.apache.avalon.excalibur.io.IOUtil; +import org.apache.myrmidon.api.AbstractTask; +import org.apache.myrmidon.api.TaskException; + +/** + * Class to manage Manifest information + * + * @author Peter Donald + * @author Conor MacNeill + * @author Stefan Bodewig + * @version $Revision$ $Date$ + */ +public class ManifestTask + extends AbstractTask +{ + private File m_destFile; + private ManifestMode m_mode; + private Manifest m_manifest = new Manifest(); + + /** + * Construct an empty manifest + */ + public ManifestTask() + throws TaskException + { + m_mode = new ManifestMode(); + m_mode.setValue( "replace" ); + } + + /** + * The name of the manifest file to write. + */ + public void setDestFile( final File destFile ) + { + m_destFile = destFile; + } + + /** + * Shall we update or replace an existing manifest? + */ + public void setMode( final ManifestMode mode ) + { + m_mode = mode; + } + + public void setManifestVersion( String manifestVersion ) + { + m_manifest.setManifestVersion( manifestVersion ); + } + + public void addMainSection( Section mainSection ) + throws Exception + { + m_manifest.setMainSection( mainSection ); + } + + /** + * Get the warnings for this manifest. + * + * @return an enumeration of warning strings + */ + public Iterator getWarnings() + { + ArrayList warnings = new ArrayList(); + + for( Iterator e2 = m_manifest.getMainSection().getWarnings(); e2.hasNext(); ) + { + warnings.add( e2.next() ); + } + + final Section[] sections = m_manifest.getSections(); + for( int i = 0; i < sections.length; i++ ) + { + final Section section = sections[ i ]; + for( Iterator e2 = section.getWarnings(); e2.hasNext(); ) + { + warnings.add( e2.next() ); + } + } + + return warnings.iterator(); + } + + public void addAttribute( final Attribute attribute ) + throws ManifestException, TaskException + { + m_manifest.addAttribute( attribute ); + } + + public void addSection( final Section section ) + throws TaskException + { + try + { + m_manifest.addSection( section ); + } + catch( final ManifestException me ) + { + throw new TaskException( me.getMessage(), me ); + } + } + + /** + * Create or update the Manifest when used as a task. + * + * @exception TaskException Description of Exception + */ + public void execute() + throws TaskException + { + if( null == m_destFile ) + { + throw new TaskException( "the file attribute is required" ); + } + + Manifest toWrite = getDefaultManifest(); + + if( m_mode.getValue().equals( "update" ) && m_destFile.exists() ) + { + FileReader f = null; + try + { + f = new FileReader( m_destFile ); + final Manifest other = ManifestUtil.buildManifest( f ); + toWrite.merge( other ); + } + catch( ManifestException m ) + { + throw new TaskException( "Existing manifest " + m_destFile + + " is invalid", m ); + } + catch( IOException e ) + { + throw new + TaskException( "Failed to read " + m_destFile, e ); + } + finally + { + IOUtil.shutdownReader( f ); + } + } + + try + { + toWrite.merge( m_manifest ); + } + catch( ManifestException m ) + { + throw new TaskException( "Manifest is invalid", m ); + } + + PrintWriter w = null; + try + { + w = new PrintWriter( new FileWriter( m_destFile ) ); + ManifestUtil.write( toWrite, w ); + } + catch( IOException e ) + { + throw new TaskException( "Failed to write " + m_destFile, e ); + } + finally + { + IOUtil.shutdownWriter( w ); + } + } + + private Manifest getDefaultManifest() + throws TaskException + { + try + { + return ManifestUtil.getDefaultManifest(); + } + catch( final ManifestException me ) + { + throw new TaskException( me.getMessage(), me ); + } + } +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java index 8a2a46809..a06825694 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java @@ -8,7 +8,14 @@ package org.apache.tools.ant.taskdefs.manifest; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.PrintWriter; +import java.io.Reader; +import java.io.UnsupportedEncodingException; +import java.io.BufferedReader; +import java.util.jar.Attributes; +import org.apache.myrmidon.api.TaskException; /** * Utility methods for manifest stuff. @@ -20,6 +27,27 @@ import java.io.PrintWriter; */ public final class ManifestUtil { + /** + * The Name Attribute is the first in a named section + */ + public final static String ATTRIBUTE_NAME = "Name"; + /** + * The From Header is disallowed in a Manifest + */ + public final static String ATTRIBUTE_FROM = "From"; + /** + * The Class-Path Header is special - it can be duplicated + */ + public final static String ATTRIBUTE_CLASSPATH = Attributes.Name.CLASS_PATH.toString(); + /** + * Default Manifest version if one is not specified + */ + public final static String DEFAULT_MANIFEST_VERSION = "1.0"; + /** + * The max length of a line in a Manifest + */ + public final static int MAX_LINE_LENGTH = 70; + public static Attribute buildAttribute( final String line ) throws ManifestException { @@ -28,6 +56,100 @@ public final class ManifestUtil return attribute; } + public static Manifest buildManifest( final Reader reader ) + throws ManifestException, IOException + { + final Manifest manifest = new Manifest(); + BufferedReader bufferedReader = new BufferedReader( reader ); + // This should be the manifest version + final Section mainSection = manifest.getMainSection(); + String nextSectionName = mainSection.read( bufferedReader ); + final String readManifestVersion = + mainSection.getAttributeValue( Attributes.Name.MANIFEST_VERSION.toString() ); + if( readManifestVersion != null ) + { + manifest.setManifestVersion( readManifestVersion ); + mainSection.removeAttribute( Attributes.Name.MANIFEST_VERSION.toString() ); + } + + String line = null; + while( ( line = bufferedReader.readLine() ) != null ) + { + if( line.length() == 0 ) + { + continue; + } + + Section section = new Section(); + if( nextSectionName == null ) + { + Attribute sectionName = ManifestUtil.buildAttribute( line ); + if( !sectionName.getName().equalsIgnoreCase( ManifestUtil.ATTRIBUTE_NAME ) ) + { + throw new ManifestException( "Manifest sections should start with a \"" + ManifestUtil.ATTRIBUTE_NAME + + "\" attribute and not \"" + sectionName.getName() + "\"" ); + } + nextSectionName = sectionName.getValue(); + } + else + { + // we have already started reading this section + // this line is the first attribute. set it and then let the normal + // read handle the rest + Attribute firstAttribute = ManifestUtil.buildAttribute( line ); + section.addAttributeAndCheck( firstAttribute ); + } + + section.setName( nextSectionName ); + nextSectionName = section.read( bufferedReader ); + manifest.addSection( section ); + } + + return manifest; + } + + /** + * Construct a manifest from Ant's default manifest file. + */ + public static Manifest getDefaultManifest() + throws ManifestException + { + try + { + final InputStream input = getInputStream(); + final InputStreamReader reader = getReader( input ); + return buildManifest( reader ); + } + catch( final IOException ioe ) + { + throw new ManifestException( "Unable to read default manifest", ioe ); + } + } + + private static InputStream getInputStream() + throws ManifestException + { + final String location = "default.mf"; + final InputStream input = ManifestUtil.class.getResourceAsStream( location ); + if( null == input ) + { + throw new ManifestException( "Could not find default manifest: " + location ); + } + return input; + } + + private static InputStreamReader getReader( final InputStream input ) + { + try + { + return new InputStreamReader( input, "ASCII" ); + } + catch( final UnsupportedEncodingException uee ) + { + return new InputStreamReader( input ); + } + } + /** * Parse a line into name and value pairs * @@ -56,12 +178,12 @@ public final class ManifestUtil final String name = attribute.getName(); final String value = attribute.getValue(); String line = name + ": " + value; - while( line.getBytes().length > Manifest.MAX_LINE_LENGTH ) + while( line.getBytes().length > MAX_LINE_LENGTH ) { // try to find a MAX_LINE_LENGTH byte section - int breakIndex = Manifest.MAX_LINE_LENGTH; + int breakIndex = MAX_LINE_LENGTH; String section = line.substring( 0, breakIndex ); - while( section.getBytes().length > Manifest.MAX_LINE_LENGTH && breakIndex > 0 ) + while( section.getBytes().length > MAX_LINE_LENGTH && breakIndex > 0 ) { breakIndex--; section = line.substring( 0, breakIndex ); @@ -75,4 +197,44 @@ public final class ManifestUtil } writer.println( line ); } + + /** + * Write the manifest out to a print writer. + * + * @param writer the Writer to which the manifest is written + * @throws IOException if the manifest cannot be written + */ + public static void write( Manifest manifest, PrintWriter writer ) + throws IOException + { + final String sigVersionKey = Attributes.Name.SIGNATURE_VERSION.toString(); + + writer.println( Attributes.Name.MANIFEST_VERSION + ": " + manifest.getManifestVersion() ); + + final String signatureVersion = + manifest.getMainSection().getAttributeValue( sigVersionKey ); + if( signatureVersion != null ) + { + writer.println( Attributes.Name.SIGNATURE_VERSION + ": " + signatureVersion ); + manifest.getMainSection().removeAttribute( sigVersionKey ); + } + manifest.getMainSection().write( writer ); + if( signatureVersion != null ) + { + try + { + manifest.getMainSection().addAttribute( new Attribute( sigVersionKey, signatureVersion ) ); + } + catch( ManifestException e ) + { + // shouldn't happen - ignore + } + } + + final Section[] sections = manifest.getSections(); + for( int i = 0; i < sections.length; i++ ) + { + sections[ i ].write( writer ); + } + } } diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Section.java b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Section.java index a15b51b19..2213a6b71 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Section.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/manifest/Section.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; -import org.apache.myrmidon.api.TaskException; /** * Class to represent an individual section in the Manifest. A section @@ -28,26 +27,26 @@ import org.apache.myrmidon.api.TaskException; */ public class Section { - private ArrayList warnings = new ArrayList(); + private final ArrayList m_warnings = new ArrayList(); /** * The section's name if any. The main section in a manifest is unnamed. */ - private String name = null; + private String m_name; /** * The section's attributes. */ - private Hashtable attributes = new Hashtable(); + private final Hashtable m_attributes = new Hashtable(); /** * Set the Section's name * * @param name the section's name */ - public void setName( String name ) + public void setName( final String name ) { - this.name = name; + m_name = name; } /** @@ -57,23 +56,26 @@ public class Section * @return the attribute's value or null if the attribute does not exist * in the section */ - public String getAttributeValue( String attributeName ) + public String getAttributeValue( final String attributeName ) { - Object attribute = attributes.get( attributeName.toLowerCase() ); - if( attribute == null ) + final Object attributeObject = m_attributes.get( attributeName.toLowerCase() ); + if( null == attributeObject ) { return null; } - if( attribute instanceof Attribute ) + else if( attributeObject instanceof Attribute ) { - return ( (Attribute)attribute ).getValue(); + final Attribute attribute = (Attribute)attributeObject; + return attribute.getValue(); } else { String value = ""; - for( Iterator e = ( (ArrayList)attribute ).iterator(); e.hasNext(); ) + final ArrayList attributes = (ArrayList)attributeObject; + Iterator e = attributes.iterator(); + while( e.hasNext() ) { - Attribute classpathAttribute = (Attribute)e.next(); + final Attribute classpathAttribute = (Attribute)e.next(); value += classpathAttribute.getValue() + " "; } return value.trim(); @@ -87,12 +89,12 @@ public class Section */ public String getName() { - return name; + return m_name; } public Iterator getWarnings() { - return warnings.iterator(); + return m_warnings.iterator(); } /** @@ -105,59 +107,59 @@ public class Section * section. */ public String addAttributeAndCheck( Attribute attribute ) - throws ManifestException, TaskException + throws ManifestException { if( attribute.getName() == null || attribute.getValue() == null ) { - throw new TaskException( "Attributes must have name and value" ); + throw new ManifestException( "Attributes must have name and value" ); } - if( attribute.getName().equalsIgnoreCase( Manifest.ATTRIBUTE_NAME ) ) + if( attribute.getName().equalsIgnoreCase( ManifestUtil.ATTRIBUTE_NAME ) ) { - warnings.add( "\"" + Manifest.ATTRIBUTE_NAME + "\" attributes should not occur in the " + + m_warnings.add( "\"" + ManifestUtil.ATTRIBUTE_NAME + "\" attributes should not occur in the " + "main section and must be the first element in all " + "other sections: \"" + attribute.getName() + ": " + attribute.getValue() + "\"" ); return attribute.getValue(); } - if( attribute.getName().toLowerCase().startsWith( Manifest.ATTRIBUTE_FROM.toLowerCase() ) ) + if( attribute.getName().toLowerCase().startsWith( ManifestUtil.ATTRIBUTE_FROM.toLowerCase() ) ) { - warnings.add( "Manifest attributes should not start with \"" + - Manifest.ATTRIBUTE_FROM + "\" in \"" + attribute.getName() + ": " + attribute.getValue() + "\"" ); + m_warnings.add( "Manifest attributes should not start with \"" + + ManifestUtil.ATTRIBUTE_FROM + "\" in \"" + attribute.getName() + ": " + attribute.getValue() + "\"" ); } else { // classpath attributes go into a vector String attributeName = attribute.getName().toLowerCase(); - if( attributeName.equals( Manifest.ATTRIBUTE_CLASSPATH ) ) + if( attributeName.equals( ManifestUtil.ATTRIBUTE_CLASSPATH ) ) { - ArrayList classpathAttrs = (ArrayList)attributes.get( attributeName ); + ArrayList classpathAttrs = (ArrayList)m_attributes.get( attributeName ); if( classpathAttrs == null ) { classpathAttrs = new ArrayList(); - attributes.put( attributeName, classpathAttrs ); + m_attributes.put( attributeName, classpathAttrs ); } classpathAttrs.add( attribute ); } - else if( attributes.containsKey( attributeName ) ) + else if( m_attributes.containsKey( attributeName ) ) { throw new ManifestException( "The attribute \"" + attribute.getName() + "\" may not " + "occur more than once in the same section" ); } else { - attributes.put( attributeName, attribute ); + m_attributes.put( attributeName, attribute ); } } return null; } - public void addAttribute( Attribute attribute ) - throws ManifestException, TaskException + public void addAttribute( final Attribute attribute ) + throws ManifestException { String check = addAttributeAndCheck( attribute ); if( check != null ) { - throw new TaskException( "Specify the section name using the \"name\" attribute of the
element rather " + + throw new ManifestException( "Specify the section name using the \"name\" attribute of the
element rather " + "than using a \"Name\" manifest attribute" ); } } @@ -170,15 +172,15 @@ public class Section } Section rhsSection = (Section)rhs; - if( attributes.size() != rhsSection.attributes.size() ) + if( m_attributes.size() != rhsSection.m_attributes.size() ) { return false; } - for( Enumeration e = attributes.elements(); e.hasMoreElements(); ) + for( Enumeration e = m_attributes.elements(); e.hasMoreElements(); ) { Attribute attribute = (Attribute)e.nextElement(); - Attribute rshAttribute = (Attribute)rhsSection.attributes.get( attribute.getName().toLowerCase() ); + Attribute rshAttribute = (Attribute)rhsSection.m_attributes.get( attribute.getName().toLowerCase() ); if( !attribute.equals( rshAttribute ) ) { return false; @@ -197,21 +199,21 @@ public class Section public void merge( Section section ) throws ManifestException { - if( name == null && section.getName() != null || - name != null && !( name.equalsIgnoreCase( section.getName() ) ) ) + if( m_name == null && section.getName() != null || + m_name != null && !( m_name.equalsIgnoreCase( section.getName() ) ) ) { throw new ManifestException( "Unable to merge sections with different names" ); } - for( Enumeration e = section.attributes.keys(); e.hasMoreElements(); ) + for( Enumeration e = section.m_attributes.keys(); e.hasMoreElements(); ) { String attributeName = (String)e.nextElement(); - if( attributeName.equals( Manifest.ATTRIBUTE_CLASSPATH ) && - attributes.containsKey( attributeName ) ) + if( attributeName.equals( ManifestUtil.ATTRIBUTE_CLASSPATH ) && + m_attributes.containsKey( attributeName ) ) { // classpath entries are vetors which are merged - ArrayList classpathAttrs = (ArrayList)section.attributes.get( attributeName ); - ArrayList ourClasspathAttrs = (ArrayList)attributes.get( attributeName ); + ArrayList classpathAttrs = (ArrayList)section.m_attributes.get( attributeName ); + ArrayList ourClasspathAttrs = (ArrayList)m_attributes.get( attributeName ); for( Iterator e2 = classpathAttrs.iterator(); e2.hasNext(); ) { ourClasspathAttrs.add( e2.next() ); @@ -220,14 +222,14 @@ public class Section else { // the merge file always wins - attributes.put( attributeName, section.attributes.get( attributeName ) ); + m_attributes.put( attributeName, section.m_attributes.get( attributeName ) ); } } // add in the warnings - for( Iterator e = section.warnings.iterator(); e.hasNext(); ) + for( Iterator e = section.m_warnings.iterator(); e.hasNext(); ) { - warnings.add( e.next() ); + m_warnings.add( e.next() ); } } @@ -242,7 +244,7 @@ public class Section * @throws IOException if the section cannot be read from the reader. */ public String read( BufferedReader reader ) - throws ManifestException, IOException, TaskException + throws ManifestException, IOException { Attribute attribute = null; while( true ) @@ -257,11 +259,11 @@ public class Section // continuation line if( attribute == null ) { - if( name != null ) + if( m_name != null ) { // a continuation on the first line is a continuation of the name - concatenate // this line and the name - name += line.substring( 1 ); + m_name += line.substring( 1 ); } else { @@ -292,7 +294,7 @@ public class Section */ public void removeAttribute( String attributeName ) { - attributes.remove( attributeName.toLowerCase() ); + m_attributes.remove( attributeName.toLowerCase() ); } /** @@ -304,12 +306,12 @@ public class Section public void write( PrintWriter writer ) throws IOException { - if( name != null ) + if( m_name != null ) { - Attribute nameAttr = new Attribute( Manifest.ATTRIBUTE_NAME, name ); + Attribute nameAttr = new Attribute( ManifestUtil.ATTRIBUTE_NAME, m_name ); ManifestUtil.write( nameAttr, writer ); } - for( Enumeration e = attributes.elements(); e.hasMoreElements(); ) + for( Enumeration e = m_attributes.elements(); e.hasMoreElements(); ) { Object object = e.nextElement(); if( object instanceof Attribute ) diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/archive/Jar.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/archive/Jar.java index 3d9041b9c..14cde3ac2 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/archive/Jar.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/archive/Jar.java @@ -18,12 +18,12 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.util.Enumeration; -import java.util.Iterator; import java.util.zip.ZipFile; import org.apache.aut.zip.ZipOutputStream; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.taskdefs.manifest.Manifest; import org.apache.tools.ant.taskdefs.manifest.ManifestException; +import org.apache.tools.ant.taskdefs.manifest.ManifestUtil; import org.apache.tools.ant.types.FileScanner; /** @@ -89,10 +89,10 @@ public class Jar try { r = new FileReader( manifestFile ); - Manifest newManifest = new Manifest( r ); + Manifest newManifest = ManifestUtil.buildManifest( r ); if( m_manifest == null ) { - m_manifest = Manifest.getDefaultManifest(); + m_manifest = ManifestUtil.getDefaultManifest(); } m_manifest.merge( newManifest ); } @@ -134,7 +134,7 @@ public class Jar { if( m_manifest == null ) { - m_manifest = Manifest.getDefaultManifest(); + m_manifest = ManifestUtil.getDefaultManifest(); } m_manifest.merge( newManifest ); buildFileManifest = true; @@ -172,10 +172,10 @@ public class Jar getLogger().debug( "Updating jar since the current jar has no manifest" ); return false; } - Manifest currentManifest = new Manifest( new InputStreamReader( theZipFile.getInputStream( entry ) ) ); + Manifest currentManifest = ManifestUtil.buildManifest( new InputStreamReader( theZipFile.getInputStream( entry ) ) ); if( m_manifest == null ) { - m_manifest = Manifest.getDefaultManifest(); + m_manifest = ManifestUtil.getDefaultManifest(); } if( !currentManifest.equals( m_manifest ) ) { @@ -231,22 +231,25 @@ public class Jar { try { - m_execManifest = Manifest.getDefaultManifest(); + m_execManifest = ManifestUtil.getDefaultManifest(); if( m_manifest != null ) { m_execManifest.merge( m_manifest ); } + /* for( Iterator e = m_execManifest.getWarnings(); e.hasNext(); ) { getLogger().warn( "Manifest warning: " + (String)e.next() ); } + */ zipDir( null, zOut, "META-INF/" ); // time to write the manifest ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintWriter writer = new PrintWriter( baos ); - m_execManifest.write( writer ); + Manifest manifest = m_execManifest; + ManifestUtil.write( manifest, writer ); writer.flush(); ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() ); @@ -375,11 +378,12 @@ public class Jar { if( m_execManifest == null ) { - m_execManifest = new Manifest( new InputStreamReader( is ) ); + m_execManifest = ManifestUtil.buildManifest( new InputStreamReader( is ) ); } else if( isAddingNewFiles() ) { - m_execManifest.merge( new Manifest( new InputStreamReader( is ) ) ); + final Manifest other = ManifestUtil.buildManifest( new InputStreamReader( is ) ); + m_execManifest.merge( other ); } } catch( ManifestException e ) diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Attribute.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Attribute.java index 7c7bb5514..b0b5fa7c1 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Attribute.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Attribute.java @@ -9,6 +9,7 @@ package org.apache.tools.ant.taskdefs.manifest; import java.io.PrintWriter; import java.io.IOException; +import java.util.jar.Attributes; /** * Class to hold manifest attributes @@ -110,10 +111,11 @@ public class Attribute } final Attribute other = (Attribute)object; + final String name = other.m_name; return - ( null != m_name && null != other.m_name && - m_name.toLowerCase().equals( other.m_name.toLowerCase() ) && - m_value != null && m_value.equals( other.m_value ) ); + ( null != m_name && null != name && + m_name.toLowerCase().equals( name.toLowerCase() ) && + null != m_value && m_value.equals( other.m_value ) ); } } diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Manifest.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Manifest.java index b531ad3bf..39fc5a113 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Manifest.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Manifest.java @@ -7,23 +7,11 @@ */ package org.apache.tools.ant.taskdefs.manifest; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; +import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; -import java.util.jar.Attributes; -import org.apache.myrmidon.api.AbstractTask; +import java.util.Set; import org.apache.myrmidon.api.TaskException; /** @@ -35,42 +23,11 @@ import org.apache.myrmidon.api.TaskException; * @version $Revision$ $Date$ */ public class Manifest - extends AbstractTask { - /** - * The standard Signature Version header - */ - public final static String ATTRIBUTE_SIGNATURE_VERSION = Attributes.Name.SIGNATURE_VERSION.toString(); - - /** - * The Name Attribute is the first in a named section - */ - public final static String ATTRIBUTE_NAME = "Name"; - - /** - * The From Header is disallowed in a Manifest - */ - public final static String ATTRIBUTE_FROM = "From"; - - /** - * The Class-Path Header is special - it can be duplicated - */ - public final static String ATTRIBUTE_CLASSPATH = Attributes.Name.CLASS_PATH.toString(); - - /** - * Default Manifest version if one is not specified - */ - public final static String DEFAULT_MANIFEST_VERSION = "1.0"; - - /** - * The max length of a line in a Manifest - */ - public final static int MAX_LINE_LENGTH = 70; - /** * The version of this manifest */ - private String m_manifestVersion = DEFAULT_MANIFEST_VERSION; + private String m_manifestVersion = ManifestUtil.DEFAULT_MANIFEST_VERSION; /** * The main section of this manifest @@ -82,211 +39,112 @@ public class Manifest */ private Hashtable m_sections = new Hashtable(); - private File m_manifestFile; - - private ManifestMode m_mode; - - /** - * Construct an empty manifest - */ - public Manifest() - throws TaskException + public void setManifestVersion( final String manifestVersion ) { - m_mode = new ManifestMode(); - m_mode.setValue( "replace" ); - m_manifestVersion = null; + m_manifestVersion = manifestVersion; } - /** - * Read a manifest file from the given reader - * - * @param r Description of Parameter - * @exception ManifestException Description of Exception - * @exception IOException Description of Exception - * @throws ManifestException if the manifest is not valid according to the - * JAR spec - * @throws IOException if the manifest cannot be read from the reader. - */ - public Manifest( Reader r ) - throws ManifestException, TaskException, IOException + public void setMainSection( final Section mainSection ) { - BufferedReader reader = new BufferedReader( r ); - // This should be the manifest version - String nextSectionName = m_mainSection.read( reader ); - String readManifestVersion = m_mainSection.getAttributeValue( Attributes.Name.MANIFEST_VERSION.toString() ); - if( readManifestVersion != null ) - { - m_manifestVersion = readManifestVersion; - m_mainSection.removeAttribute( Attributes.Name.MANIFEST_VERSION.toString() ); - } - - String line = null; - while( ( line = reader.readLine() ) != null ) - { - if( line.length() == 0 ) - { - continue; - } - - Section section = new Section(); - if( nextSectionName == null ) - { - Attribute sectionName = ManifestUtil.buildAttribute( line ); - if( !sectionName.getName().equalsIgnoreCase( ATTRIBUTE_NAME ) ) - { - throw new ManifestException( "Manifest sections should start with a \"" + ATTRIBUTE_NAME + - "\" attribute and not \"" + sectionName.getName() + "\"" ); - } - nextSectionName = sectionName.getValue(); - } - else - { - // we have already started reading this section - // this line is the first attribute. set it and then let the normal - // read handle the rest - Attribute firstAttribute = ManifestUtil.buildAttribute( line ); - section.addAttributeAndCheck( firstAttribute ); - } + m_mainSection = mainSection; + } - section.setName( nextSectionName ); - nextSectionName = section.read( reader ); - addSection( section ); - } + public void addAttribute( final Attribute attribute ) + throws ManifestException + { + m_mainSection.addAttribute( attribute ); } - /** - * Construct a manifest from Ant's default manifest file. - * - * @return The DefaultManifest value - * @exception TaskException Description of Exception - */ - public static Manifest getDefaultManifest() - throws TaskException + public void addSection( final Section section ) + throws ManifestException { - try - { - String s = "/org/apache/tools/ant/defaultManifest.mf"; - InputStream in = Manifest.class.getResourceAsStream( s ); - if( in == null ) - { - throw new TaskException( "Could not find default manifest: " + s ); - } - try - { - return new Manifest( new InputStreamReader( in, "ASCII" ) ); - } - catch( UnsupportedEncodingException e ) - { - return new Manifest( new InputStreamReader( in ) ); - } - } - catch( ManifestException e ) - { - throw new TaskException( "Default manifest is invalid !!" ); - } - catch( IOException e ) + if( section.getName() == null ) { - throw new TaskException( "Unable to read default manifest", e ); + final String message = "Sections must have a name"; + throw new ManifestException( message ); } + m_sections.put( section.getName().toLowerCase(), section ); } - /** - * The name of the manifest file to write (if used as a task). - * - * @param f The new File value - */ - public void setFile( File f ) + public String[] getSectionNames( final Manifest other ) { - m_manifestFile = f; + final Set keys = other.m_sections.keySet(); + return (String[])keys.toArray( new String[ keys.size() ] ); } - /** - * Shall we update or replace an existing manifest? - * - * @param m The new ManifestMode value - */ - public void setMode( ManifestMode m ) + public String getManifestVersion() { - m_mode = m; + return m_manifestVersion; } - /** - * Get the warnings for this manifest. - * - * @return an enumeration of warning strings - */ - public Iterator getWarnings() + public Section getMainSection() { - ArrayList warnings = new ArrayList(); - - for( Iterator e2 = m_mainSection.getWarnings(); e2.hasNext(); ) - { - warnings.add( e2.next() ); - } - - // create a vector and add in the warnings for all the sections - for( Enumeration e = m_sections.elements(); e.hasMoreElements(); ) - { - Section section = (Section)e.nextElement(); - for( Iterator e2 = section.getWarnings(); e2.hasNext(); ) - { - warnings.add( e2.next() ); - } - } + return m_mainSection; + } - return warnings.iterator(); + public Section getSection( final String name ) + { + return (Section)m_sections.get( name ); } - public void addAttribute( final Attribute attribute ) - throws ManifestException, TaskException + public Section[] getSections() { - m_mainSection.addAttribute( attribute ); + final Collection sections = m_sections.values(); + return (Section[])sections.toArray( new Section[ sections.size() ] ); } - public void addSection( final Section section ) - throws ManifestException, TaskException + /** + * Merge the contents of the given manifest into this manifest + * + * @param other the Manifest to be merged with this one. + * @throws ManifestException if there is a problem merging the manfest + * according to the Manifest spec. + */ + public void merge( final Manifest other ) + throws ManifestException { - if( section.getName() == null ) + if( other.m_manifestVersion != null ) { - throw new TaskException( "Sections must have a name" ); + m_manifestVersion = other.m_manifestVersion; } - m_sections.put( section.getName().toLowerCase(), section ); + m_mainSection.merge( other.m_mainSection ); + + mergeSections( other ); } - public boolean equals( Object rhs ) + public boolean equals( final Object object ) { - if( !( rhs instanceof Manifest ) ) + if( !( object instanceof Manifest ) ) { return false; } - Manifest rhsManifest = (Manifest)rhs; - if( m_manifestVersion == null ) + final Manifest other = (Manifest)object; + if( m_manifestVersion == null && other.m_manifestVersion != null ) { - if( rhsManifest.m_manifestVersion != null ) - { - return false; - } + return false; } - else if( !m_manifestVersion.equals( rhsManifest.m_manifestVersion ) ) + else if( !m_manifestVersion.equals( other.m_manifestVersion ) ) { return false; } - if( m_sections.size() != rhsManifest.m_sections.size() ) + if( m_sections.size() != other.m_sections.size() ) { return false; } - if( !m_mainSection.equals( rhsManifest.m_mainSection ) ) + if( !m_mainSection.equals( other.m_mainSection ) ) { return false; } - for( Enumeration e = m_sections.elements(); e.hasMoreElements(); ) + final Iterator e = m_sections.values().iterator(); + while( e.hasNext() ) { - Section section = (Section)e.nextElement(); - Section rhsSection = (Section)rhsManifest.m_sections.get( section.getName().toLowerCase() ); - if( !section.equals( rhsSection ) ) + final Section section = (Section)e.next(); + final String key = section.getName().toLowerCase(); + final Section otherSection = (Section)other.m_sections.get( key ); + if( !section.equals( otherSection ) ) { return false; } @@ -295,168 +153,23 @@ public class Manifest return true; } - /** - * Create or update the Manifest when used as a task. - * - * @exception TaskException Description of Exception - */ - public void execute() - throws TaskException - { - if( m_manifestFile == null ) - { - throw new TaskException( "the file attribute is required" ); - } - - Manifest toWrite = getDefaultManifest(); - - if( m_mode.getValue().equals( "update" ) && m_manifestFile.exists() ) - { - FileReader f = null; - try - { - f = new FileReader( m_manifestFile ); - toWrite.merge( new Manifest( f ) ); - } - catch( ManifestException m ) - { - throw new TaskException( "Existing manifest " + m_manifestFile - + " is invalid", m ); - } - catch( IOException e ) - { - throw new - TaskException( "Failed to read " + m_manifestFile, e ); - } - finally - { - if( f != null ) - { - try - { - f.close(); - } - catch( IOException e ) - { - } - } - } - } - - try - { - toWrite.merge( this ); - } - catch( ManifestException m ) - { - throw new TaskException( "Manifest is invalid", m ); - } - - PrintWriter w = null; - try - { - w = new PrintWriter( new FileWriter( m_manifestFile ) ); - toWrite.write( w ); - } - catch( IOException e ) - { - throw new TaskException( "Failed to write " + m_manifestFile, e ); - } - finally - { - if( w != null ) - { - w.close(); - } - } - } - - /** - * Merge the contents of the given manifest into this manifest - * - * @param other the Manifest to be merged with this one. - * @throws ManifestException if there is a problem merging the manfest - * according to the Manifest spec. - */ - public void merge( Manifest other ) + private void mergeSections( final Manifest other ) throws ManifestException { - if( other.m_manifestVersion != null ) - { - m_manifestVersion = other.m_manifestVersion; - } - m_mainSection.merge( other.m_mainSection ); - for( Enumeration e = other.m_sections.keys(); e.hasMoreElements(); ) + final String[] sections = getSectionNames( other ); + for( int i = 0; i < sections.length; i++ ) { - String sectionName = (String)e.nextElement(); - Section ourSection = (Section)m_sections.get( sectionName ); - Section otherSection = (Section)other.m_sections.get( sectionName ); - if( ourSection == null ) + final String sectionName = sections[ i ]; + final Section section = getSection( sectionName ); + final Section otherSection = other.getSection( sectionName ); + if( section == null ) { m_sections.put( sectionName.toLowerCase(), otherSection ); } else { - ourSection.merge( otherSection ); + section.merge( otherSection ); } } - } - - /** - * Convert the manifest to its string representation - * - * @return a multiline string with the Manifest as it appears in a Manifest - * file. - */ - public String toString() - { - StringWriter sw = new StringWriter(); - try - { - write( new PrintWriter( sw ) ); - } - catch( Exception e ) - { - return null; - } - return sw.toString(); - } - - /** - * Write the manifest out to a print writer. - * - * @param writer the Writer to which the manifest is written - * @throws IOException if the manifest cannot be written - */ - public void write( PrintWriter writer ) - throws IOException, TaskException - { - writer.println( Attributes.Name.MANIFEST_VERSION + ": " + m_manifestVersion ); - String signatureVersion = m_mainSection.getAttributeValue( ATTRIBUTE_SIGNATURE_VERSION ); - if( signatureVersion != null ) - { - writer.println( ATTRIBUTE_SIGNATURE_VERSION + ": " + signatureVersion ); - m_mainSection.removeAttribute( ATTRIBUTE_SIGNATURE_VERSION ); - } - m_mainSection.write( writer ); - if( signatureVersion != null ) - { - try - { - m_mainSection.addAttribute( new Attribute( ATTRIBUTE_SIGNATURE_VERSION, signatureVersion ) ); - } - catch( ManifestException e ) - { - // shouldn't happen - ignore - } - } - - for( Enumeration e = m_sections.elements(); e.hasMoreElements(); ) - { - Section section = (Section)e.nextElement(); - section.write( writer ); - } - } - } diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestTask.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestTask.java new file mode 100644 index 000000000..400fd87dd --- /dev/null +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestTask.java @@ -0,0 +1,196 @@ +/* + * 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.tools.ant.taskdefs.manifest; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Iterator; +import org.apache.avalon.excalibur.io.IOUtil; +import org.apache.myrmidon.api.AbstractTask; +import org.apache.myrmidon.api.TaskException; + +/** + * Class to manage Manifest information + * + * @author Peter Donald + * @author Conor MacNeill + * @author Stefan Bodewig + * @version $Revision$ $Date$ + */ +public class ManifestTask + extends AbstractTask +{ + private File m_destFile; + private ManifestMode m_mode; + private Manifest m_manifest = new Manifest(); + + /** + * Construct an empty manifest + */ + public ManifestTask() + throws TaskException + { + m_mode = new ManifestMode(); + m_mode.setValue( "replace" ); + } + + /** + * The name of the manifest file to write. + */ + public void setDestFile( final File destFile ) + { + m_destFile = destFile; + } + + /** + * Shall we update or replace an existing manifest? + */ + public void setMode( final ManifestMode mode ) + { + m_mode = mode; + } + + public void setManifestVersion( String manifestVersion ) + { + m_manifest.setManifestVersion( manifestVersion ); + } + + public void addMainSection( Section mainSection ) + throws Exception + { + m_manifest.setMainSection( mainSection ); + } + + /** + * Get the warnings for this manifest. + * + * @return an enumeration of warning strings + */ + public Iterator getWarnings() + { + ArrayList warnings = new ArrayList(); + + for( Iterator e2 = m_manifest.getMainSection().getWarnings(); e2.hasNext(); ) + { + warnings.add( e2.next() ); + } + + final Section[] sections = m_manifest.getSections(); + for( int i = 0; i < sections.length; i++ ) + { + final Section section = sections[ i ]; + for( Iterator e2 = section.getWarnings(); e2.hasNext(); ) + { + warnings.add( e2.next() ); + } + } + + return warnings.iterator(); + } + + public void addAttribute( final Attribute attribute ) + throws ManifestException, TaskException + { + m_manifest.addAttribute( attribute ); + } + + public void addSection( final Section section ) + throws TaskException + { + try + { + m_manifest.addSection( section ); + } + catch( final ManifestException me ) + { + throw new TaskException( me.getMessage(), me ); + } + } + + /** + * Create or update the Manifest when used as a task. + * + * @exception TaskException Description of Exception + */ + public void execute() + throws TaskException + { + if( null == m_destFile ) + { + throw new TaskException( "the file attribute is required" ); + } + + Manifest toWrite = getDefaultManifest(); + + if( m_mode.getValue().equals( "update" ) && m_destFile.exists() ) + { + FileReader f = null; + try + { + f = new FileReader( m_destFile ); + final Manifest other = ManifestUtil.buildManifest( f ); + toWrite.merge( other ); + } + catch( ManifestException m ) + { + throw new TaskException( "Existing manifest " + m_destFile + + " is invalid", m ); + } + catch( IOException e ) + { + throw new + TaskException( "Failed to read " + m_destFile, e ); + } + finally + { + IOUtil.shutdownReader( f ); + } + } + + try + { + toWrite.merge( m_manifest ); + } + catch( ManifestException m ) + { + throw new TaskException( "Manifest is invalid", m ); + } + + PrintWriter w = null; + try + { + w = new PrintWriter( new FileWriter( m_destFile ) ); + ManifestUtil.write( toWrite, w ); + } + catch( IOException e ) + { + throw new TaskException( "Failed to write " + m_destFile, e ); + } + finally + { + IOUtil.shutdownWriter( w ); + } + } + + private Manifest getDefaultManifest() + throws TaskException + { + try + { + return ManifestUtil.getDefaultManifest(); + } + catch( final ManifestException me ) + { + throw new TaskException( me.getMessage(), me ); + } + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java index 8a2a46809..a06825694 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/ManifestUtil.java @@ -8,7 +8,14 @@ package org.apache.tools.ant.taskdefs.manifest; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.PrintWriter; +import java.io.Reader; +import java.io.UnsupportedEncodingException; +import java.io.BufferedReader; +import java.util.jar.Attributes; +import org.apache.myrmidon.api.TaskException; /** * Utility methods for manifest stuff. @@ -20,6 +27,27 @@ import java.io.PrintWriter; */ public final class ManifestUtil { + /** + * The Name Attribute is the first in a named section + */ + public final static String ATTRIBUTE_NAME = "Name"; + /** + * The From Header is disallowed in a Manifest + */ + public final static String ATTRIBUTE_FROM = "From"; + /** + * The Class-Path Header is special - it can be duplicated + */ + public final static String ATTRIBUTE_CLASSPATH = Attributes.Name.CLASS_PATH.toString(); + /** + * Default Manifest version if one is not specified + */ + public final static String DEFAULT_MANIFEST_VERSION = "1.0"; + /** + * The max length of a line in a Manifest + */ + public final static int MAX_LINE_LENGTH = 70; + public static Attribute buildAttribute( final String line ) throws ManifestException { @@ -28,6 +56,100 @@ public final class ManifestUtil return attribute; } + public static Manifest buildManifest( final Reader reader ) + throws ManifestException, IOException + { + final Manifest manifest = new Manifest(); + BufferedReader bufferedReader = new BufferedReader( reader ); + // This should be the manifest version + final Section mainSection = manifest.getMainSection(); + String nextSectionName = mainSection.read( bufferedReader ); + final String readManifestVersion = + mainSection.getAttributeValue( Attributes.Name.MANIFEST_VERSION.toString() ); + if( readManifestVersion != null ) + { + manifest.setManifestVersion( readManifestVersion ); + mainSection.removeAttribute( Attributes.Name.MANIFEST_VERSION.toString() ); + } + + String line = null; + while( ( line = bufferedReader.readLine() ) != null ) + { + if( line.length() == 0 ) + { + continue; + } + + Section section = new Section(); + if( nextSectionName == null ) + { + Attribute sectionName = ManifestUtil.buildAttribute( line ); + if( !sectionName.getName().equalsIgnoreCase( ManifestUtil.ATTRIBUTE_NAME ) ) + { + throw new ManifestException( "Manifest sections should start with a \"" + ManifestUtil.ATTRIBUTE_NAME + + "\" attribute and not \"" + sectionName.getName() + "\"" ); + } + nextSectionName = sectionName.getValue(); + } + else + { + // we have already started reading this section + // this line is the first attribute. set it and then let the normal + // read handle the rest + Attribute firstAttribute = ManifestUtil.buildAttribute( line ); + section.addAttributeAndCheck( firstAttribute ); + } + + section.setName( nextSectionName ); + nextSectionName = section.read( bufferedReader ); + manifest.addSection( section ); + } + + return manifest; + } + + /** + * Construct a manifest from Ant's default manifest file. + */ + public static Manifest getDefaultManifest() + throws ManifestException + { + try + { + final InputStream input = getInputStream(); + final InputStreamReader reader = getReader( input ); + return buildManifest( reader ); + } + catch( final IOException ioe ) + { + throw new ManifestException( "Unable to read default manifest", ioe ); + } + } + + private static InputStream getInputStream() + throws ManifestException + { + final String location = "default.mf"; + final InputStream input = ManifestUtil.class.getResourceAsStream( location ); + if( null == input ) + { + throw new ManifestException( "Could not find default manifest: " + location ); + } + return input; + } + + private static InputStreamReader getReader( final InputStream input ) + { + try + { + return new InputStreamReader( input, "ASCII" ); + } + catch( final UnsupportedEncodingException uee ) + { + return new InputStreamReader( input ); + } + } + /** * Parse a line into name and value pairs * @@ -56,12 +178,12 @@ public final class ManifestUtil final String name = attribute.getName(); final String value = attribute.getValue(); String line = name + ": " + value; - while( line.getBytes().length > Manifest.MAX_LINE_LENGTH ) + while( line.getBytes().length > MAX_LINE_LENGTH ) { // try to find a MAX_LINE_LENGTH byte section - int breakIndex = Manifest.MAX_LINE_LENGTH; + int breakIndex = MAX_LINE_LENGTH; String section = line.substring( 0, breakIndex ); - while( section.getBytes().length > Manifest.MAX_LINE_LENGTH && breakIndex > 0 ) + while( section.getBytes().length > MAX_LINE_LENGTH && breakIndex > 0 ) { breakIndex--; section = line.substring( 0, breakIndex ); @@ -75,4 +197,44 @@ public final class ManifestUtil } writer.println( line ); } + + /** + * Write the manifest out to a print writer. + * + * @param writer the Writer to which the manifest is written + * @throws IOException if the manifest cannot be written + */ + public static void write( Manifest manifest, PrintWriter writer ) + throws IOException + { + final String sigVersionKey = Attributes.Name.SIGNATURE_VERSION.toString(); + + writer.println( Attributes.Name.MANIFEST_VERSION + ": " + manifest.getManifestVersion() ); + + final String signatureVersion = + manifest.getMainSection().getAttributeValue( sigVersionKey ); + if( signatureVersion != null ) + { + writer.println( Attributes.Name.SIGNATURE_VERSION + ": " + signatureVersion ); + manifest.getMainSection().removeAttribute( sigVersionKey ); + } + manifest.getMainSection().write( writer ); + if( signatureVersion != null ) + { + try + { + manifest.getMainSection().addAttribute( new Attribute( sigVersionKey, signatureVersion ) ); + } + catch( ManifestException e ) + { + // shouldn't happen - ignore + } + } + + final Section[] sections = manifest.getSections(); + for( int i = 0; i < sections.length; i++ ) + { + sections[ i ].write( writer ); + } + } } diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Section.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Section.java index a15b51b19..2213a6b71 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Section.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/taskdefs/manifest/Section.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; -import org.apache.myrmidon.api.TaskException; /** * Class to represent an individual section in the Manifest. A section @@ -28,26 +27,26 @@ import org.apache.myrmidon.api.TaskException; */ public class Section { - private ArrayList warnings = new ArrayList(); + private final ArrayList m_warnings = new ArrayList(); /** * The section's name if any. The main section in a manifest is unnamed. */ - private String name = null; + private String m_name; /** * The section's attributes. */ - private Hashtable attributes = new Hashtable(); + private final Hashtable m_attributes = new Hashtable(); /** * Set the Section's name * * @param name the section's name */ - public void setName( String name ) + public void setName( final String name ) { - this.name = name; + m_name = name; } /** @@ -57,23 +56,26 @@ public class Section * @return the attribute's value or null if the attribute does not exist * in the section */ - public String getAttributeValue( String attributeName ) + public String getAttributeValue( final String attributeName ) { - Object attribute = attributes.get( attributeName.toLowerCase() ); - if( attribute == null ) + final Object attributeObject = m_attributes.get( attributeName.toLowerCase() ); + if( null == attributeObject ) { return null; } - if( attribute instanceof Attribute ) + else if( attributeObject instanceof Attribute ) { - return ( (Attribute)attribute ).getValue(); + final Attribute attribute = (Attribute)attributeObject; + return attribute.getValue(); } else { String value = ""; - for( Iterator e = ( (ArrayList)attribute ).iterator(); e.hasNext(); ) + final ArrayList attributes = (ArrayList)attributeObject; + Iterator e = attributes.iterator(); + while( e.hasNext() ) { - Attribute classpathAttribute = (Attribute)e.next(); + final Attribute classpathAttribute = (Attribute)e.next(); value += classpathAttribute.getValue() + " "; } return value.trim(); @@ -87,12 +89,12 @@ public class Section */ public String getName() { - return name; + return m_name; } public Iterator getWarnings() { - return warnings.iterator(); + return m_warnings.iterator(); } /** @@ -105,59 +107,59 @@ public class Section * section. */ public String addAttributeAndCheck( Attribute attribute ) - throws ManifestException, TaskException + throws ManifestException { if( attribute.getName() == null || attribute.getValue() == null ) { - throw new TaskException( "Attributes must have name and value" ); + throw new ManifestException( "Attributes must have name and value" ); } - if( attribute.getName().equalsIgnoreCase( Manifest.ATTRIBUTE_NAME ) ) + if( attribute.getName().equalsIgnoreCase( ManifestUtil.ATTRIBUTE_NAME ) ) { - warnings.add( "\"" + Manifest.ATTRIBUTE_NAME + "\" attributes should not occur in the " + + m_warnings.add( "\"" + ManifestUtil.ATTRIBUTE_NAME + "\" attributes should not occur in the " + "main section and must be the first element in all " + "other sections: \"" + attribute.getName() + ": " + attribute.getValue() + "\"" ); return attribute.getValue(); } - if( attribute.getName().toLowerCase().startsWith( Manifest.ATTRIBUTE_FROM.toLowerCase() ) ) + if( attribute.getName().toLowerCase().startsWith( ManifestUtil.ATTRIBUTE_FROM.toLowerCase() ) ) { - warnings.add( "Manifest attributes should not start with \"" + - Manifest.ATTRIBUTE_FROM + "\" in \"" + attribute.getName() + ": " + attribute.getValue() + "\"" ); + m_warnings.add( "Manifest attributes should not start with \"" + + ManifestUtil.ATTRIBUTE_FROM + "\" in \"" + attribute.getName() + ": " + attribute.getValue() + "\"" ); } else { // classpath attributes go into a vector String attributeName = attribute.getName().toLowerCase(); - if( attributeName.equals( Manifest.ATTRIBUTE_CLASSPATH ) ) + if( attributeName.equals( ManifestUtil.ATTRIBUTE_CLASSPATH ) ) { - ArrayList classpathAttrs = (ArrayList)attributes.get( attributeName ); + ArrayList classpathAttrs = (ArrayList)m_attributes.get( attributeName ); if( classpathAttrs == null ) { classpathAttrs = new ArrayList(); - attributes.put( attributeName, classpathAttrs ); + m_attributes.put( attributeName, classpathAttrs ); } classpathAttrs.add( attribute ); } - else if( attributes.containsKey( attributeName ) ) + else if( m_attributes.containsKey( attributeName ) ) { throw new ManifestException( "The attribute \"" + attribute.getName() + "\" may not " + "occur more than once in the same section" ); } else { - attributes.put( attributeName, attribute ); + m_attributes.put( attributeName, attribute ); } } return null; } - public void addAttribute( Attribute attribute ) - throws ManifestException, TaskException + public void addAttribute( final Attribute attribute ) + throws ManifestException { String check = addAttributeAndCheck( attribute ); if( check != null ) { - throw new TaskException( "Specify the section name using the \"name\" attribute of the
element rather " + + throw new ManifestException( "Specify the section name using the \"name\" attribute of the
element rather " + "than using a \"Name\" manifest attribute" ); } } @@ -170,15 +172,15 @@ public class Section } Section rhsSection = (Section)rhs; - if( attributes.size() != rhsSection.attributes.size() ) + if( m_attributes.size() != rhsSection.m_attributes.size() ) { return false; } - for( Enumeration e = attributes.elements(); e.hasMoreElements(); ) + for( Enumeration e = m_attributes.elements(); e.hasMoreElements(); ) { Attribute attribute = (Attribute)e.nextElement(); - Attribute rshAttribute = (Attribute)rhsSection.attributes.get( attribute.getName().toLowerCase() ); + Attribute rshAttribute = (Attribute)rhsSection.m_attributes.get( attribute.getName().toLowerCase() ); if( !attribute.equals( rshAttribute ) ) { return false; @@ -197,21 +199,21 @@ public class Section public void merge( Section section ) throws ManifestException { - if( name == null && section.getName() != null || - name != null && !( name.equalsIgnoreCase( section.getName() ) ) ) + if( m_name == null && section.getName() != null || + m_name != null && !( m_name.equalsIgnoreCase( section.getName() ) ) ) { throw new ManifestException( "Unable to merge sections with different names" ); } - for( Enumeration e = section.attributes.keys(); e.hasMoreElements(); ) + for( Enumeration e = section.m_attributes.keys(); e.hasMoreElements(); ) { String attributeName = (String)e.nextElement(); - if( attributeName.equals( Manifest.ATTRIBUTE_CLASSPATH ) && - attributes.containsKey( attributeName ) ) + if( attributeName.equals( ManifestUtil.ATTRIBUTE_CLASSPATH ) && + m_attributes.containsKey( attributeName ) ) { // classpath entries are vetors which are merged - ArrayList classpathAttrs = (ArrayList)section.attributes.get( attributeName ); - ArrayList ourClasspathAttrs = (ArrayList)attributes.get( attributeName ); + ArrayList classpathAttrs = (ArrayList)section.m_attributes.get( attributeName ); + ArrayList ourClasspathAttrs = (ArrayList)m_attributes.get( attributeName ); for( Iterator e2 = classpathAttrs.iterator(); e2.hasNext(); ) { ourClasspathAttrs.add( e2.next() ); @@ -220,14 +222,14 @@ public class Section else { // the merge file always wins - attributes.put( attributeName, section.attributes.get( attributeName ) ); + m_attributes.put( attributeName, section.m_attributes.get( attributeName ) ); } } // add in the warnings - for( Iterator e = section.warnings.iterator(); e.hasNext(); ) + for( Iterator e = section.m_warnings.iterator(); e.hasNext(); ) { - warnings.add( e.next() ); + m_warnings.add( e.next() ); } } @@ -242,7 +244,7 @@ public class Section * @throws IOException if the section cannot be read from the reader. */ public String read( BufferedReader reader ) - throws ManifestException, IOException, TaskException + throws ManifestException, IOException { Attribute attribute = null; while( true ) @@ -257,11 +259,11 @@ public class Section // continuation line if( attribute == null ) { - if( name != null ) + if( m_name != null ) { // a continuation on the first line is a continuation of the name - concatenate // this line and the name - name += line.substring( 1 ); + m_name += line.substring( 1 ); } else { @@ -292,7 +294,7 @@ public class Section */ public void removeAttribute( String attributeName ) { - attributes.remove( attributeName.toLowerCase() ); + m_attributes.remove( attributeName.toLowerCase() ); } /** @@ -304,12 +306,12 @@ public class Section public void write( PrintWriter writer ) throws IOException { - if( name != null ) + if( m_name != null ) { - Attribute nameAttr = new Attribute( Manifest.ATTRIBUTE_NAME, name ); + Attribute nameAttr = new Attribute( ManifestUtil.ATTRIBUTE_NAME, m_name ); ManifestUtil.write( nameAttr, writer ); } - for( Enumeration e = attributes.elements(); e.hasMoreElements(); ) + for( Enumeration e = m_attributes.elements(); e.hasMoreElements(); ) { Object object = e.nextElement(); if( object instanceof Attribute )