git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271175 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,394 +0,0 @@ | |||
/* | |||
* 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.optional; | |||
import java.io.File; | |||
import java.io.FileInputStream; | |||
import java.io.FileNotFoundException; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.Comparator; | |||
import java.util.Iterator; | |||
import java.util.ListIterator; | |||
import java.util.StringTokenizer; | |||
import org.apache.avalon.excalibur.util.StringUtil; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* Task for creating a manifest file for a jar archiv. use: <pre> | |||
* <taskdef name="manifest" classname="ManifestFile"/> | |||
* <target name="jar_manifest"> | |||
* <manifest file="manifest.mf" method="replaceAll"> | |||
* <entry value="Manifest-Version: 1_0"/> | |||
* </manifest> </target> </pre> | |||
* | |||
* @author Thomas Kerle | |||
*/ | |||
public class ManifestFile extends Task | |||
{ | |||
private final static String keyValueSeparator = ":"; | |||
private final static String UPDATE_ = "update"; | |||
private final static String REPLACEALL_ = "replaceAll"; | |||
private EntryContainer container; | |||
private String currentMethod; | |||
private ArrayList entries; | |||
private File manifestFile; | |||
public ManifestFile() | |||
{ | |||
entries = new ArrayList(); | |||
container = new EntryContainer(); | |||
} | |||
/** | |||
* Setter for the file attribute | |||
* | |||
* @param f The new File value | |||
*/ | |||
public void setFile( File f ) | |||
{ | |||
manifestFile = f; | |||
} | |||
/** | |||
* Setter for the method attribute (update/replaceAll) | |||
* | |||
* @param method Method to set task | |||
*/ | |||
public void setMethod( String method ) | |||
{ | |||
currentMethod = method.toUpperCase(); | |||
} | |||
/** | |||
* creating entries by Ant | |||
* | |||
* @return Description of the Returned Value | |||
*/ | |||
public Entry createEntry() | |||
{ | |||
final Entry entry = new Entry(); | |||
entries.add( entry ); | |||
return entry; | |||
} | |||
/** | |||
* execute task | |||
* | |||
* @exception TaskException : Failure in building | |||
*/ | |||
public void execute() | |||
throws TaskException | |||
{ | |||
checkParameters(); | |||
if( isUpdate( currentMethod ) ) { | |||
readFile(); | |||
} | |||
executeOperation(); | |||
writeFile(); | |||
} | |||
private StringTokenizer getLineTokens( StringBuffer buffer ) | |||
{ | |||
String manifests = buffer.toString(); | |||
StringTokenizer strTokens = new StringTokenizer( manifests, StringUtil.LINE_SEPARATOR ); | |||
return strTokens; | |||
} | |||
private boolean isReplaceAll( String method ) | |||
{ | |||
return method.equals( REPLACEALL_.toUpperCase() ); | |||
} | |||
private boolean isUpdate( String method ) | |||
{ | |||
return method.equals( UPDATE_.toUpperCase() ); | |||
} | |||
private void addLine( final String line ) | |||
throws TaskException | |||
{ | |||
Entry entry = new Entry(); | |||
entry.setValue( line ); | |||
entry.addTo( container ); | |||
} | |||
private StringBuffer buildBuffer() | |||
{ | |||
StringBuffer buffer = new StringBuffer(); | |||
ListIterator iterator = container.iterator(); | |||
while( iterator.hasNext() ) | |||
{ | |||
Entry entry = (Entry)iterator.next(); | |||
String key = (String)entry.getKey(); | |||
String value = (String)entry.getValue(); | |||
String entry_string = key + keyValueSeparator + value; | |||
buffer.append( entry_string + StringUtil.LINE_SEPARATOR ); | |||
} | |||
return buffer; | |||
} | |||
private boolean checkParam( String param ) | |||
{ | |||
return !( ( param == null ) || ( param.equals( "null" ) ) ); | |||
} | |||
private boolean checkParam( File param ) | |||
{ | |||
return !( param == null ); | |||
} | |||
private void checkParameters() | |||
throws TaskException | |||
{ | |||
if( !checkParam( manifestFile ) ) | |||
{ | |||
throw new TaskException( "file token must not be null." ); | |||
} | |||
} | |||
/** | |||
* adding entries to a container | |||
* | |||
* @exception TaskException | |||
*/ | |||
private void executeOperation() | |||
throws TaskException | |||
{ | |||
Iterator enum = entries.iterator(); | |||
while( enum.hasNext() ) | |||
{ | |||
Entry entry = (Entry)enum.next(); | |||
entry.addTo( container ); | |||
} | |||
} | |||
private void readFile() | |||
throws TaskException | |||
{ | |||
if( manifestFile.exists() ) | |||
{ | |||
getLogger().info( "update existing manifest file " + manifestFile.getAbsolutePath() ); | |||
if( container != null ) | |||
{ | |||
try | |||
{ | |||
FileInputStream fis = new FileInputStream( manifestFile ); | |||
int c; | |||
StringBuffer buffer = new StringBuffer( "" ); | |||
boolean stop = false; | |||
while( !stop ) | |||
{ | |||
c = fis.read(); | |||
if( c == -1 ) | |||
{ | |||
stop = true; | |||
} | |||
else { | |||
buffer.append( (char)c ); | |||
} | |||
} | |||
fis.close(); | |||
StringTokenizer lineTokens = getLineTokens( buffer ); | |||
while( lineTokens.hasMoreElements() ) | |||
{ | |||
String currentLine = (String)lineTokens.nextElement(); | |||
addLine( currentLine ); | |||
} | |||
} | |||
catch( FileNotFoundException fnfe ) | |||
{ | |||
throw new TaskException( "File not found exception " + fnfe.toString() ); | |||
} | |||
catch( IOException ioe ) | |||
{ | |||
throw new TaskException( "Unknown input/output exception " + ioe.toString() ); | |||
} | |||
} | |||
} | |||
} | |||
private void writeFile() | |||
throws TaskException | |||
{ | |||
try | |||
{ | |||
manifestFile.delete(); | |||
getLogger().info( "Replacing or creating new manifest file " + manifestFile.getAbsolutePath() ); | |||
if( manifestFile.createNewFile() ) | |||
{ | |||
FileOutputStream fos = new FileOutputStream( manifestFile ); | |||
StringBuffer buffer = buildBuffer(); | |||
int size = buffer.length(); | |||
for( int i = 0; i < size; i++ ) | |||
{ | |||
fos.write( (char)buffer.charAt( i ) ); | |||
} | |||
fos.flush(); | |||
fos.close(); | |||
} | |||
else | |||
{ | |||
throw new TaskException( "Can't create manifest file" ); | |||
} | |||
} | |||
catch( IOException ioe ) | |||
{ | |||
throw new TaskException( "An input/ouput error occured" + ioe.toString() ); | |||
} | |||
} | |||
public class Entry implements Comparator | |||
{ | |||
//extern format | |||
private String value = null; | |||
//intern representation | |||
private String val = null; | |||
private String key = null; | |||
public Entry() | |||
{ | |||
} | |||
public void setValue( String value ) | |||
{ | |||
this.value = new String( value ); | |||
} | |||
public String getKey() | |||
{ | |||
return key; | |||
} | |||
public String getValue() | |||
{ | |||
return val; | |||
} | |||
public int compare( Object o1, Object o2 ) | |||
{ | |||
int result = -1; | |||
try | |||
{ | |||
Entry e1 = (Entry)o1; | |||
Entry e2 = (Entry)o2; | |||
String key_1 = e1.getKey(); | |||
String key_2 = e2.getKey(); | |||
result = key_1.compareTo( key_2 ); | |||
} | |||
catch( Exception e ) | |||
{ | |||
} | |||
return result; | |||
} | |||
public boolean equals( Object obj ) | |||
{ | |||
Entry ent = new Entry(); | |||
boolean result = false; | |||
int res = ent.compare( this, (Entry)obj ); | |||
if( res == 0 ) { | |||
result = true; | |||
} | |||
return result; | |||
} | |||
protected void addTo( EntryContainer container ) | |||
throws TaskException | |||
{ | |||
checkFormat(); | |||
split(); | |||
container.set( this ); | |||
} | |||
private void checkFormat() | |||
throws TaskException | |||
{ | |||
if( value == null ) | |||
{ | |||
throw new TaskException( "no argument for value" ); | |||
} | |||
StringTokenizer st = new StringTokenizer( value, ManifestFile.keyValueSeparator ); | |||
int size = st.countTokens(); | |||
if( size < 2 ) | |||
{ | |||
throw new TaskException( "value has not the format of a manifest entry" ); | |||
} | |||
} | |||
private void split() | |||
{ | |||
StringTokenizer st = new StringTokenizer( value, ManifestFile.keyValueSeparator ); | |||
key = (String)st.nextElement(); | |||
val = (String)st.nextElement(); | |||
} | |||
} | |||
public class EntryContainer | |||
{ | |||
private ArrayList list = null; | |||
public EntryContainer() | |||
{ | |||
list = new ArrayList(); | |||
} | |||
public void set( Entry entry ) | |||
{ | |||
if( list.contains( entry ) ) | |||
{ | |||
int index = list.indexOf( entry ); | |||
list.remove( index ); | |||
list.add( index, entry ); | |||
} | |||
else | |||
{ | |||
list.add( entry ); | |||
} | |||
} | |||
public ListIterator iterator() | |||
{ | |||
ListIterator iterator = list.listIterator(); | |||
return iterator; | |||
} | |||
} | |||
} |
@@ -1,394 +0,0 @@ | |||
/* | |||
* 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.optional; | |||
import java.io.File; | |||
import java.io.FileInputStream; | |||
import java.io.FileNotFoundException; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.Comparator; | |||
import java.util.Iterator; | |||
import java.util.ListIterator; | |||
import java.util.StringTokenizer; | |||
import org.apache.avalon.excalibur.util.StringUtil; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* Task for creating a manifest file for a jar archiv. use: <pre> | |||
* <taskdef name="manifest" classname="ManifestFile"/> | |||
* <target name="jar_manifest"> | |||
* <manifest file="manifest.mf" method="replaceAll"> | |||
* <entry value="Manifest-Version: 1_0"/> | |||
* </manifest> </target> </pre> | |||
* | |||
* @author Thomas Kerle | |||
*/ | |||
public class ManifestFile extends Task | |||
{ | |||
private final static String keyValueSeparator = ":"; | |||
private final static String UPDATE_ = "update"; | |||
private final static String REPLACEALL_ = "replaceAll"; | |||
private EntryContainer container; | |||
private String currentMethod; | |||
private ArrayList entries; | |||
private File manifestFile; | |||
public ManifestFile() | |||
{ | |||
entries = new ArrayList(); | |||
container = new EntryContainer(); | |||
} | |||
/** | |||
* Setter for the file attribute | |||
* | |||
* @param f The new File value | |||
*/ | |||
public void setFile( File f ) | |||
{ | |||
manifestFile = f; | |||
} | |||
/** | |||
* Setter for the method attribute (update/replaceAll) | |||
* | |||
* @param method Method to set task | |||
*/ | |||
public void setMethod( String method ) | |||
{ | |||
currentMethod = method.toUpperCase(); | |||
} | |||
/** | |||
* creating entries by Ant | |||
* | |||
* @return Description of the Returned Value | |||
*/ | |||
public Entry createEntry() | |||
{ | |||
final Entry entry = new Entry(); | |||
entries.add( entry ); | |||
return entry; | |||
} | |||
/** | |||
* execute task | |||
* | |||
* @exception TaskException : Failure in building | |||
*/ | |||
public void execute() | |||
throws TaskException | |||
{ | |||
checkParameters(); | |||
if( isUpdate( currentMethod ) ) { | |||
readFile(); | |||
} | |||
executeOperation(); | |||
writeFile(); | |||
} | |||
private StringTokenizer getLineTokens( StringBuffer buffer ) | |||
{ | |||
String manifests = buffer.toString(); | |||
StringTokenizer strTokens = new StringTokenizer( manifests, StringUtil.LINE_SEPARATOR ); | |||
return strTokens; | |||
} | |||
private boolean isReplaceAll( String method ) | |||
{ | |||
return method.equals( REPLACEALL_.toUpperCase() ); | |||
} | |||
private boolean isUpdate( String method ) | |||
{ | |||
return method.equals( UPDATE_.toUpperCase() ); | |||
} | |||
private void addLine( final String line ) | |||
throws TaskException | |||
{ | |||
Entry entry = new Entry(); | |||
entry.setValue( line ); | |||
entry.addTo( container ); | |||
} | |||
private StringBuffer buildBuffer() | |||
{ | |||
StringBuffer buffer = new StringBuffer(); | |||
ListIterator iterator = container.iterator(); | |||
while( iterator.hasNext() ) | |||
{ | |||
Entry entry = (Entry)iterator.next(); | |||
String key = (String)entry.getKey(); | |||
String value = (String)entry.getValue(); | |||
String entry_string = key + keyValueSeparator + value; | |||
buffer.append( entry_string + StringUtil.LINE_SEPARATOR ); | |||
} | |||
return buffer; | |||
} | |||
private boolean checkParam( String param ) | |||
{ | |||
return !( ( param == null ) || ( param.equals( "null" ) ) ); | |||
} | |||
private boolean checkParam( File param ) | |||
{ | |||
return !( param == null ); | |||
} | |||
private void checkParameters() | |||
throws TaskException | |||
{ | |||
if( !checkParam( manifestFile ) ) | |||
{ | |||
throw new TaskException( "file token must not be null." ); | |||
} | |||
} | |||
/** | |||
* adding entries to a container | |||
* | |||
* @exception TaskException | |||
*/ | |||
private void executeOperation() | |||
throws TaskException | |||
{ | |||
Iterator enum = entries.iterator(); | |||
while( enum.hasNext() ) | |||
{ | |||
Entry entry = (Entry)enum.next(); | |||
entry.addTo( container ); | |||
} | |||
} | |||
private void readFile() | |||
throws TaskException | |||
{ | |||
if( manifestFile.exists() ) | |||
{ | |||
getLogger().info( "update existing manifest file " + manifestFile.getAbsolutePath() ); | |||
if( container != null ) | |||
{ | |||
try | |||
{ | |||
FileInputStream fis = new FileInputStream( manifestFile ); | |||
int c; | |||
StringBuffer buffer = new StringBuffer( "" ); | |||
boolean stop = false; | |||
while( !stop ) | |||
{ | |||
c = fis.read(); | |||
if( c == -1 ) | |||
{ | |||
stop = true; | |||
} | |||
else { | |||
buffer.append( (char)c ); | |||
} | |||
} | |||
fis.close(); | |||
StringTokenizer lineTokens = getLineTokens( buffer ); | |||
while( lineTokens.hasMoreElements() ) | |||
{ | |||
String currentLine = (String)lineTokens.nextElement(); | |||
addLine( currentLine ); | |||
} | |||
} | |||
catch( FileNotFoundException fnfe ) | |||
{ | |||
throw new TaskException( "File not found exception " + fnfe.toString() ); | |||
} | |||
catch( IOException ioe ) | |||
{ | |||
throw new TaskException( "Unknown input/output exception " + ioe.toString() ); | |||
} | |||
} | |||
} | |||
} | |||
private void writeFile() | |||
throws TaskException | |||
{ | |||
try | |||
{ | |||
manifestFile.delete(); | |||
getLogger().info( "Replacing or creating new manifest file " + manifestFile.getAbsolutePath() ); | |||
if( manifestFile.createNewFile() ) | |||
{ | |||
FileOutputStream fos = new FileOutputStream( manifestFile ); | |||
StringBuffer buffer = buildBuffer(); | |||
int size = buffer.length(); | |||
for( int i = 0; i < size; i++ ) | |||
{ | |||
fos.write( (char)buffer.charAt( i ) ); | |||
} | |||
fos.flush(); | |||
fos.close(); | |||
} | |||
else | |||
{ | |||
throw new TaskException( "Can't create manifest file" ); | |||
} | |||
} | |||
catch( IOException ioe ) | |||
{ | |||
throw new TaskException( "An input/ouput error occured" + ioe.toString() ); | |||
} | |||
} | |||
public class Entry implements Comparator | |||
{ | |||
//extern format | |||
private String value = null; | |||
//intern representation | |||
private String val = null; | |||
private String key = null; | |||
public Entry() | |||
{ | |||
} | |||
public void setValue( String value ) | |||
{ | |||
this.value = new String( value ); | |||
} | |||
public String getKey() | |||
{ | |||
return key; | |||
} | |||
public String getValue() | |||
{ | |||
return val; | |||
} | |||
public int compare( Object o1, Object o2 ) | |||
{ | |||
int result = -1; | |||
try | |||
{ | |||
Entry e1 = (Entry)o1; | |||
Entry e2 = (Entry)o2; | |||
String key_1 = e1.getKey(); | |||
String key_2 = e2.getKey(); | |||
result = key_1.compareTo( key_2 ); | |||
} | |||
catch( Exception e ) | |||
{ | |||
} | |||
return result; | |||
} | |||
public boolean equals( Object obj ) | |||
{ | |||
Entry ent = new Entry(); | |||
boolean result = false; | |||
int res = ent.compare( this, (Entry)obj ); | |||
if( res == 0 ) { | |||
result = true; | |||
} | |||
return result; | |||
} | |||
protected void addTo( EntryContainer container ) | |||
throws TaskException | |||
{ | |||
checkFormat(); | |||
split(); | |||
container.set( this ); | |||
} | |||
private void checkFormat() | |||
throws TaskException | |||
{ | |||
if( value == null ) | |||
{ | |||
throw new TaskException( "no argument for value" ); | |||
} | |||
StringTokenizer st = new StringTokenizer( value, ManifestFile.keyValueSeparator ); | |||
int size = st.countTokens(); | |||
if( size < 2 ) | |||
{ | |||
throw new TaskException( "value has not the format of a manifest entry" ); | |||
} | |||
} | |||
private void split() | |||
{ | |||
StringTokenizer st = new StringTokenizer( value, ManifestFile.keyValueSeparator ); | |||
key = (String)st.nextElement(); | |||
val = (String)st.nextElement(); | |||
} | |||
} | |||
public class EntryContainer | |||
{ | |||
private ArrayList list = null; | |||
public EntryContainer() | |||
{ | |||
list = new ArrayList(); | |||
} | |||
public void set( Entry entry ) | |||
{ | |||
if( list.contains( entry ) ) | |||
{ | |||
int index = list.indexOf( entry ); | |||
list.remove( index ); | |||
list.add( index, entry ); | |||
} | |||
else | |||
{ | |||
list.add( entry ); | |||
} | |||
} | |||
public ListIterator iterator() | |||
{ | |||
ListIterator iterator = list.listIterator(); | |||
return iterator; | |||
} | |||
} | |||
} |