Browse Source

More checkstyle fixes

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274766 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 22 years ago
parent
commit
12d6c01879
5 changed files with 521 additions and 487 deletions
  1. +15
    -6
      check.xml
  2. +26
    -19
      src/etc/checkstyle/checkstyle-config
  3. +11
    -3
      src/main/org/apache/tools/ant/taskdefs/CVSPass.java
  4. +193
    -239
      src/main/org/apache/tools/ant/taskdefs/optional/extension/Specification.java
  5. +276
    -220
      src/main/org/apache/tools/tar/TarEntry.java

+ 15
- 6
check.xml View File

@@ -1,13 +1,13 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<project default="checkstyle" name="CheckAnt"> <project default="checkstyle" name="CheckAnt">


<!-- <import file="build.xml"/> -->
<!-- <import file="build.xml"/> -->
<property name="src.dir" value="src"/> <property name="src.dir" value="src"/>
<property name="java.dir" value="${src.dir}/main"/> <property name="java.dir" value="${src.dir}/main"/>
<property name="etc.dir" value="${src.dir}/etc"/> <property name="etc.dir" value="${src.dir}/etc"/>
<property name="config.dir" value="${etc.dir}/checkstyle"/> <property name="config.dir" value="${etc.dir}/checkstyle"/>
<property name="build.dir" value="build"/> <property name="build.dir" value="build"/>
<property name="checkstyle.reportdir" value="${build.dir}/reports/checkstyle"/> <property name="checkstyle.reportdir" value="${build.dir}/reports/checkstyle"/>
<property name="checkstyle.raw" value="${checkstyle.reportdir}/raw.xml"/> <property name="checkstyle.raw" value="${checkstyle.reportdir}/raw.xml"/>
<property name="stylesheet.html" value="${config.dir}/checkstyle-frames.xsl"/> <property name="stylesheet.html" value="${config.dir}/checkstyle-frames.xsl"/>
@@ -17,9 +17,11 @@
<property name="checkstyle.basedir" location="${java.dir}"/> <property name="checkstyle.basedir" location="${java.dir}"/>


<!-- Ant Checkstyle report --> <!-- Ant Checkstyle report -->
<property name="tocheck" value="**/*.java"/>
<property name="tocheck" value="**/*.java"/>
<property name="javadoc.scope" value="public"/> <property name="javadoc.scope" value="public"/>

<taskdef resource="simiantask.properties"/>

<target name="checkstyle"> <target name="checkstyle">
<mkdir dir="${checkstyle.reportdir}"/> <mkdir dir="${checkstyle.reportdir}"/>
<taskdef resource="checkstyletask.properties"/> <taskdef resource="checkstyletask.properties"/>
@@ -28,6 +30,7 @@
<fileset dir="${java.dir}"> <fileset dir="${java.dir}">
<include name="${tocheck}"/> <include name="${tocheck}"/>
<exclude name="**/BZip2Constants.java"/> <exclude name="**/BZip2Constants.java"/>
<exclude name="**/CVSPass.java"/>
</fileset> </fileset>
</checkstyle> </checkstyle>
</target> </target>
@@ -39,7 +42,7 @@
<param name="basedir" expression="${checkstyle.basedir}"/> <param name="basedir" expression="${checkstyle.basedir}"/>
</style> </style>
</target> </target>
<target name="textreport"> <target name="textreport">
<style in="${checkstyle.raw}" style="${stylesheet.text}" <style in="${checkstyle.raw}" style="${stylesheet.text}"
out="${checkstyle.reportdir}/report.txt"> out="${checkstyle.reportdir}/report.txt">
@@ -58,6 +61,12 @@
<filelist dir="${checkstyle.reportdir}" files="report.txt"/> <filelist dir="${checkstyle.reportdir}" files="report.txt"/>
</concat> </concat>
</target> </target>

<target name="simiancheck">
<simian>
<fileset dir="${java.dir}" />
</simian>
</target>

</project> </project>



+ 26
- 19
src/etc/checkstyle/checkstyle-config View File

@@ -14,8 +14,8 @@
</module> </module>
<module name="JavadocVariable"> <module name="JavadocVariable">
<property name="scope" value="public"/> <property name="scope" value="public"/>
</module>
</module>
<!-- element naming --> <!-- element naming -->
<module name="PackageName"/> <module name="PackageName"/>
<module name="TypeName"/> <module name="TypeName"/>
@@ -26,22 +26,25 @@
<module name="MethodName"/> <module name="MethodName"/>
<module name="ParameterName"/> <module name="ParameterName"/>
<module name="StaticVariableName"/> <module name="StaticVariableName"/>
<!-- required licence file --> <!-- required licence file -->
<module name="Header"> <module name="Header">
<property name="headerFile" value="${config.dir}/RequiredHeader.txt"/> <property name="headerFile" value="${config.dir}/RequiredHeader.txt"/>
<property name="ignoreLines" value="4"/> <property name="ignoreLines" value="4"/>
</module> </module>
<!-- Import conventions --> <!-- Import conventions -->
<module name="AvoidStarImport"/> <module name="AvoidStarImport"/>
<module name="IllegalImport"/> <module name="IllegalImport"/>
<module name="RedundantImport"/> <module name="RedundantImport"/>
<module name="UnusedImports"/> <module name="UnusedImports"/>
<!-- size limits --> <!-- size limits -->
<module name="FileLength"/> <module name="FileLength"/>
<module name="LineLength"/>
<module name="LineLength">
<property name="max" value="100"/>
<property name="ignorePattern" value="^ *\* *[^ ]+$"/>
</module>
<module name="MethodLength"/> <module name="MethodLength"/>
<module name="ParameterNumber"/> <module name="ParameterNumber"/>


@@ -58,19 +61,21 @@
<!-- Modifier Checks --> <!-- Modifier Checks -->
<module name="ModifierOrder"/> <module name="ModifierOrder"/>
<module name="RedundantModifier"/> <module name="RedundantModifier"/>
<!-- Checks for blocks --> <!-- Checks for blocks -->
<module name="AvoidNestedBlocks"/> <module name="AvoidNestedBlocks"/>
<module name="EmptyBlock"/>
<module name="EmptyBlock">
<property name="option" value="text"/>
</module>
<module name="LeftCurly"/> <module name="LeftCurly"/>
<module name="NeedBraces"/> <module name="NeedBraces"/>
<module name="RightCurly"/> <module name="RightCurly"/>
<!-- Checks for common coding problems --> <!-- Checks for common coding problems -->
<module name="AvoidInlineConditionals"/>
<module name="DoubleCheckedLocking"/>
<!--<module name="AvoidInlineConditionals"/> -->
<module name="DoubleCheckedLocking"/>
<module name="EmptyStatement"/> <module name="EmptyStatement"/>
<module name="EqualsHashCode"/> <module name="EqualsHashCode"/>
<module name="IllegalInstantiation"> <module name="IllegalInstantiation">
@@ -79,18 +84,20 @@
<module name="InnerAssignment"/> <module name="InnerAssignment"/>
<module name="MagicNumber"/> <module name="MagicNumber"/>
<module name="MissingSwitchDefault"/> <module name="MissingSwitchDefault"/>
<module name="RedundantThrows"/>
<module name="RedundantThrows">
<property name="allowUnchecked" value="true"/>
</module>
<module name="SimplifyBooleanExpression"/> <module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/> <module name="SimplifyBooleanReturn"/>
<!-- Checks for class design --> <!-- Checks for class design -->
<module name="DesignForExtension"/>
<!-- <module name="DesignForExtension"/> -->
<module name="FinalClass"/> <module name="FinalClass"/>
<module name="HideUtilityClassConstructor"/> <module name="HideUtilityClassConstructor"/>
<module name="InterfaceIsType"/> <module name="InterfaceIsType"/>
<module name="VisibilityModifier"/> <module name="VisibilityModifier"/>
<!-- Miscellaneous other checks. -->
<!-- Miscellaneous other checks. -->
<module name="ArrayTypeStyle"/> <module name="ArrayTypeStyle"/>
<module name="GenericIllegalRegexp"> <module name="GenericIllegalRegexp">
<property name="format" value="\s+$"/> <property name="format" value="\s+$"/>
@@ -99,5 +106,5 @@
<module name="TodoComment"/> <module name="TodoComment"/>
<module name="UpperEll"/> <module name="UpperEll"/>
</module> </module>
<module name="au.com.redhillconsulting.simian.SimianCheck"/>
<!-- <module name="au.com.redhillconsulting.simian.SimianCheck"/> -->
</module> </module>

+ 11
- 3
src/main/org/apache/tools/ant/taskdefs/CVSPass.java View File

@@ -106,7 +106,7 @@ public class CVSPass extends Task {
/** /**
* Create a CVS task using the default cvspass file location. * Create a CVS task using the default cvspass file location.
*/ */
public CVSPass(){
public CVSPass() {
passFile = new File( passFile = new File(
System.getProperty("cygwin.user.home", System.getProperty("cygwin.user.home",
System.getProperty("user.home")) System.getProperty("user.home"))
@@ -161,7 +161,9 @@ public class CVSPass extends Task {
if (reader != null) { if (reader != null) {
try { try {
reader.close(); reader.close();
} catch (IOException e) {}
} catch (IOException e) {
// ignore
}
} }
if (writer != null) { if (writer != null) {
writer.close(); writer.close();
@@ -169,7 +171,7 @@ public class CVSPass extends Task {
} }
} }


private final String mangle(String password){
private final String mangle(String password) {
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
for (int i = 0; i < password.length(); i++) { for (int i = 0; i < password.length(); i++) {
buf.append(shifts[password.charAt(i)]); buf.append(shifts[password.charAt(i)]);
@@ -179,6 +181,8 @@ public class CVSPass extends Task {


/** /**
* The CVS repository to add an entry for. * The CVS repository to add an entry for.
*
* @param cvsRoot the CVS repository
*/ */
public void setCvsroot(String cvsRoot) { public void setCvsroot(String cvsRoot) {
this.cvsRoot = cvsRoot; this.cvsRoot = cvsRoot;
@@ -186,6 +190,8 @@ public class CVSPass extends Task {


/** /**
* Password file to add the entry to. * Password file to add the entry to.
*
* @param passFile the password file.
*/ */
public void setPassfile(File passFile) { public void setPassfile(File passFile) {
this.passFile = passFile; this.passFile = passFile;
@@ -193,6 +199,8 @@ public class CVSPass extends Task {


/** /**
* Password to be added to the password file. * Password to be added to the password file.
*
* @param password the password.
*/ */
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;


+ 193
- 239
src/main/org/apache/tools/ant/taskdefs/optional/extension/Specification.java View File

@@ -71,81 +71,79 @@ import java.util.jar.Manifest;
* Java2 Standard Edition package, in file * Java2 Standard Edition package, in file
* <code>guide/extensions/versioning.html</code>.</p> * <code>guide/extensions/versioning.html</code>.</p>
* *
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
* This file is from excalibur.extension package. Dont edit this file
* directly as there is no unit tests to make sure it is operational
* in ant. Edit file in excalibur and run tests there before changing
* ants file.
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
*
* @author <a href="mailto:peter@apache.org">Peter Donald</a> * @author <a href="mailto:peter@apache.org">Peter Donald</a>
* @version $Revision$ $Date$ * @version $Revision$ $Date$
*/ */
public final class Specification
{
public final class Specification {
/** /**
* Manifest Attribute Name object for SPECIFICATION_TITLE. * Manifest Attribute Name object for SPECIFICATION_TITLE.
* @see Attributes.Name#SPECIFICATION_TITLE * @see Attributes.Name#SPECIFICATION_TITLE
*/ */
public static final Attributes.Name SPECIFICATION_TITLE = Attributes.Name.SPECIFICATION_TITLE;
public static final Attributes.Name SPECIFICATION_TITLE
= Attributes.Name.SPECIFICATION_TITLE;


/** /**
* Manifest Attribute Name object for SPECIFICATION_VERSION. * Manifest Attribute Name object for SPECIFICATION_VERSION.
* @see Attributes.Name#SPECIFICATION_VERSION * @see Attributes.Name#SPECIFICATION_VERSION
*/ */
public static final Attributes.Name SPECIFICATION_VERSION = Attributes.Name.SPECIFICATION_VERSION;
public static final Attributes.Name SPECIFICATION_VERSION
= Attributes.Name.SPECIFICATION_VERSION;


/** /**
* Manifest Attribute Name object for SPECIFICATION_VENDOR. * Manifest Attribute Name object for SPECIFICATION_VENDOR.
* @see Attributes.Name#SPECIFICATION_VENDOR * @see Attributes.Name#SPECIFICATION_VENDOR
*/ */
public static final Attributes.Name SPECIFICATION_VENDOR = Attributes.Name.SPECIFICATION_VENDOR;
public static final Attributes.Name SPECIFICATION_VENDOR
= Attributes.Name.SPECIFICATION_VENDOR;


/** /**
* Manifest Attribute Name object for IMPLEMENTATION_TITLE. * Manifest Attribute Name object for IMPLEMENTATION_TITLE.
* @see Attributes.Name#IMPLEMENTATION_TITLE * @see Attributes.Name#IMPLEMENTATION_TITLE
*/ */
public static final Attributes.Name IMPLEMENTATION_TITLE = Attributes.Name.IMPLEMENTATION_TITLE;
public static final Attributes.Name IMPLEMENTATION_TITLE
= Attributes.Name.IMPLEMENTATION_TITLE;


/** /**
* Manifest Attribute Name object for IMPLEMENTATION_VERSION. * Manifest Attribute Name object for IMPLEMENTATION_VERSION.
* @see Attributes.Name#IMPLEMENTATION_VERSION * @see Attributes.Name#IMPLEMENTATION_VERSION
*/ */
public static final Attributes.Name IMPLEMENTATION_VERSION = Attributes.Name.IMPLEMENTATION_VERSION;
public static final Attributes.Name IMPLEMENTATION_VERSION
= Attributes.Name.IMPLEMENTATION_VERSION;


/** /**
* Manifest Attribute Name object for IMPLEMENTATION_VENDOR. * Manifest Attribute Name object for IMPLEMENTATION_VENDOR.
* @see Attributes.Name#IMPLEMENTATION_VENDOR * @see Attributes.Name#IMPLEMENTATION_VENDOR
*/ */
public static final Attributes.Name IMPLEMENTATION_VENDOR = Attributes.Name.IMPLEMENTATION_VENDOR;
public static final Attributes.Name IMPLEMENTATION_VENDOR
= Attributes.Name.IMPLEMENTATION_VENDOR;


/** /**
* Enum indicating that extension is compatible with other Package * Enum indicating that extension is compatible with other Package
* Specification. * Specification.
*/ */
public static final Compatibility COMPATIBLE = public static final Compatibility COMPATIBLE =
new Compatibility( "COMPATIBLE" );
new Compatibility("COMPATIBLE");


/** /**
* Enum indicating that extension requires an upgrade * Enum indicating that extension requires an upgrade
* of specification to be compatible with other Package Specification. * of specification to be compatible with other Package Specification.
*/ */
public static final Compatibility REQUIRE_SPECIFICATION_UPGRADE = public static final Compatibility REQUIRE_SPECIFICATION_UPGRADE =
new Compatibility( "REQUIRE_SPECIFICATION_UPGRADE" );
new Compatibility("REQUIRE_SPECIFICATION_UPGRADE");


/** /**
* Enum indicating that extension requires a vendor * Enum indicating that extension requires a vendor
* switch to be compatible with other Package Specification. * switch to be compatible with other Package Specification.
*/ */
public static final Compatibility REQUIRE_VENDOR_SWITCH = public static final Compatibility REQUIRE_VENDOR_SWITCH =
new Compatibility( "REQUIRE_VENDOR_SWITCH" );
new Compatibility("REQUIRE_VENDOR_SWITCH");


/** /**
* Enum indicating that extension requires an upgrade * Enum indicating that extension requires an upgrade
* of implementation to be compatible with other Package Specification. * of implementation to be compatible with other Package Specification.
*/ */
public static final Compatibility REQUIRE_IMPLEMENTATION_CHANGE = public static final Compatibility REQUIRE_IMPLEMENTATION_CHANGE =
new Compatibility( "REQUIRE_IMPLEMENTATION_CHANGE" );
new Compatibility("REQUIRE_IMPLEMENTATION_CHANGE");


/** /**
* Enum indicating that extension is incompatible with * Enum indicating that extension is incompatible with
@@ -154,46 +152,46 @@ public final class Specification
* may have a different ID. * may have a different ID.
*/ */
public static final Compatibility INCOMPATIBLE = public static final Compatibility INCOMPATIBLE =
new Compatibility( "INCOMPATIBLE" );
new Compatibility("INCOMPATIBLE");


/** /**
* The name of the Package Specification. * The name of the Package Specification.
*/ */
private String m_specificationTitle;
private String specificationTitle;


/** /**
* The version number (dotted decimal notation) of the specification * The version number (dotted decimal notation) of the specification
* to which this optional package conforms. * to which this optional package conforms.
*/ */
private DeweyDecimal m_specificationVersion;
private DeweyDecimal specificationVersion;


/** /**
* The name of the company or organization that originated the * The name of the company or organization that originated the
* specification to which this specification conforms. * specification to which this specification conforms.
*/ */
private String m_specificationVendor;
private String specificationVendor;


/** /**
* The title of implementation. * The title of implementation.
*/ */
private String m_implementationTitle;
private String implementationTitle;


/** /**
* The name of the company or organization that produced this * The name of the company or organization that produced this
* implementation of this specification. * implementation of this specification.
*/ */
private String m_implementationVendor;
private String implementationVendor;


/** /**
* The version string for implementation. The version string is * The version string for implementation. The version string is
* opaque. * opaque.
*/ */
private String m_implementationVersion;
private String implementationVersion;


/** /**
* The sections of jar that the specification applies to. * The sections of jar that the specification applies to.
*/ */
private String[] m_sections;
private String[] sections;


/** /**
* Return an array of <code>Package Specification</code> objects. * Return an array of <code>Package Specification</code> objects.
@@ -201,12 +199,12 @@ public final class Specification
* *
* @param manifest Manifest to be parsed * @param manifest Manifest to be parsed
* @return the Package Specifications extensions in specified manifest * @return the Package Specifications extensions in specified manifest
* @throws ParseException if the attributes of the specifications cannot
* be parsed according to their expected formats.
*/ */
public static Specification[] getSpecifications( final Manifest manifest )
throws ParseException
{
if( null == manifest )
{
public static Specification[] getSpecifications(final Manifest manifest)
throws ParseException {
if (null == manifest) {
return new Specification[ 0 ]; return new Specification[ 0 ];
} }


@@ -214,19 +212,18 @@ public final class Specification


final Map entries = manifest.getEntries(); final Map entries = manifest.getEntries();
final Iterator keys = entries.keySet().iterator(); final Iterator keys = entries.keySet().iterator();
while( keys.hasNext() )
{
final String key = (String)keys.next();
final Attributes attributes = (Attributes)entries.get( key );
final Specification specification = getSpecification( key, attributes );
if( null != specification )
{
results.add( specification );
while (keys.hasNext()) {
final String key = (String) keys.next();
final Attributes attributes = (Attributes) entries.get(key);
final Specification specification
= getSpecification(key, attributes);
if (null != specification) {
results.add(specification);
} }
} }


final ArrayList trimmedResults = removeDuplicates( results );
return (Specification[])trimmedResults.toArray( new Specification[ 0 ] );
final ArrayList trimmedResults = removeDuplicates(results);
return (Specification[]) trimmedResults.toArray(new Specification[0]);
} }


/** /**
@@ -241,16 +238,15 @@ public final class Specification
* @param implementationVersion the implementation Version. * @param implementationVersion the implementation Version.
* @param implementationVendor the implementation Vendor. * @param implementationVendor the implementation Vendor.
*/ */
public Specification( final String specificationTitle,
public Specification(final String specificationTitle,
final String specificationVersion, final String specificationVersion,
final String specificationVendor, final String specificationVendor,
final String implementationTitle, final String implementationTitle,
final String implementationVersion, final String implementationVersion,
final String implementationVendor )
{
this( specificationTitle, specificationVersion, specificationVendor,
final String implementationVendor) {
this(specificationTitle, specificationVersion, specificationVendor,
implementationTitle, implementationVersion, implementationVendor, implementationTitle, implementationVersion, implementationVendor,
null );
null);
} }


/** /**
@@ -266,47 +262,42 @@ public final class Specification
* @param implementationVendor the implementation Vendor. * @param implementationVendor the implementation Vendor.
* @param sections the sections/packages that Specification applies to. * @param sections the sections/packages that Specification applies to.
*/ */
public Specification( final String specificationTitle,
public Specification(final String specificationTitle,
final String specificationVersion, final String specificationVersion,
final String specificationVendor, final String specificationVendor,
final String implementationTitle, final String implementationTitle,
final String implementationVersion, final String implementationVersion,
final String implementationVendor, final String implementationVendor,
final String[] sections )
{
m_specificationTitle = specificationTitle;
m_specificationVendor = specificationVendor;

if( null != specificationVersion )
{
try
{
m_specificationVersion = new DeweyDecimal( specificationVersion );
}
catch( final NumberFormatException nfe )
{
final String error = "Bad specification version format '" + specificationVersion +
"' in '" + specificationTitle + "'. (Reason: " + nfe + ")";
throw new IllegalArgumentException( error );
final String[] sections) {
this.specificationTitle = specificationTitle;
this.specificationVendor = specificationVendor;

if (null != specificationVersion) {
try {
this.specificationVersion
= new DeweyDecimal(specificationVersion);
} catch (final NumberFormatException nfe) {
final String error = "Bad specification version format '"
+ specificationVersion + "' in '" + specificationTitle
+ "'. (Reason: " + nfe + ")";
throw new IllegalArgumentException(error);
} }
} }


m_implementationTitle = implementationTitle;
m_implementationVendor = implementationVendor;
m_implementationVersion = implementationVersion;
this.implementationTitle = implementationTitle;
this.implementationVendor = implementationVendor;
this.implementationVersion = implementationVersion;


if( null == m_specificationTitle )
{
throw new NullPointerException( "specificationTitle" );
if (null == this.specificationTitle) {
throw new NullPointerException("specificationTitle");
} }


String[] copy = null; String[] copy = null;
if( null != sections )
{
if (null != sections) {
copy = new String[ sections.length ]; copy = new String[ sections.length ];
System.arraycopy( sections, 0, copy, 0, sections.length );
System.arraycopy(sections, 0, copy, 0, sections.length);
} }
m_sections = copy;
this.sections = copy;
} }


/** /**
@@ -314,9 +305,8 @@ public final class Specification
* *
* @return the title of speciication * @return the title of speciication
*/ */
public String getSpecificationTitle()
{
return m_specificationTitle;
public String getSpecificationTitle() {
return specificationTitle;
} }


/** /**
@@ -324,9 +314,8 @@ public final class Specification
* *
* @return the vendor of the specification. * @return the vendor of the specification.
*/ */
public String getSpecificationVendor()
{
return m_specificationVendor;
public String getSpecificationVendor() {
return specificationVendor;
} }


/** /**
@@ -334,9 +323,8 @@ public final class Specification
* *
* @return the title of the specification. * @return the title of the specification.
*/ */
public String getImplementationTitle()
{
return m_implementationTitle;
public String getImplementationTitle() {
return implementationTitle;
} }


/** /**
@@ -344,9 +332,8 @@ public final class Specification
* *
* @return the version of the specification. * @return the version of the specification.
*/ */
public DeweyDecimal getSpecificationVersion()
{
return m_specificationVersion;
public DeweyDecimal getSpecificationVersion() {
return specificationVersion;
} }


/** /**
@@ -354,9 +341,8 @@ public final class Specification
* *
* @return the vendor of the extensions implementation. * @return the vendor of the extensions implementation.
*/ */
public String getImplementationVendor()
{
return m_implementationVendor;
public String getImplementationVendor() {
return implementationVendor;
} }


/** /**
@@ -364,9 +350,8 @@ public final class Specification
* *
* @return the version of the implementation. * @return the version of the implementation.
*/ */
public String getImplementationVersion()
{
return m_implementationVersion;
public String getImplementationVersion() {
return implementationVersion;
} }


/** /**
@@ -376,65 +361,55 @@ public final class Specification
* @return an array containing sections to which specification applies * @return an array containing sections to which specification applies
* or null if relevent to no sections. * or null if relevent to no sections.
*/ */
public String[] getSections()
{
if( null == m_sections )
{
public String[] getSections() {
if (null == sections) {
return null; return null;
}
else
{
final String[] sections = new String[ m_sections.length ];
System.arraycopy( m_sections, 0, sections, 0, m_sections.length );
return sections;
} else {
final String[] newSections = new String[ sections.length ];
System.arraycopy(sections, 0, newSections, 0, sections.length);
return newSections;
} }
} }


/** /**
* Return a Compatibility enum indicating the relationship of this * Return a Compatibility enum indicating the relationship of this
* <code>Package Specification</code> with the specified <code>Extension</code>.
* <code>Package Specification</code> with the specified
* <code>Extension</code>.
* *
* @param other the other specification * @param other the other specification
* @return the enum indicating the compatibility (or lack thereof) * @return the enum indicating the compatibility (or lack thereof)
* of specifed Package Specification * of specifed Package Specification
*/ */
public Compatibility getCompatibilityWith( final Specification other )
{
public Compatibility getCompatibilityWith(final Specification other) {
// Specification Name must match // Specification Name must match
if( !m_specificationTitle.equals( other.getSpecificationTitle() ) )
{
if (!specificationTitle.equals(other.getSpecificationTitle())) {
return INCOMPATIBLE; return INCOMPATIBLE;
} }


// Available specification version must be >= required // Available specification version must be >= required
final DeweyDecimal specificationVersion = other.getSpecificationVersion();
if( null != specificationVersion )
{
if( null == m_specificationVersion ||
!isCompatible( m_specificationVersion, specificationVersion ) )
{
final DeweyDecimal specificationVersion
= other.getSpecificationVersion();
if (null != specificationVersion) {
if (null == specificationVersion
|| !isCompatible(specificationVersion, specificationVersion)) {
return REQUIRE_SPECIFICATION_UPGRADE; return REQUIRE_SPECIFICATION_UPGRADE;
} }
} }


// Implementation Vendor ID must match // Implementation Vendor ID must match
final String implementationVendor = other.getImplementationVendor(); final String implementationVendor = other.getImplementationVendor();
if( null != implementationVendor )
{
if( null == m_implementationVendor ||
!m_implementationVendor.equals( implementationVendor ) )
{
if (null != implementationVendor) {
if (null == implementationVendor
|| !implementationVendor.equals(implementationVendor)) {
return REQUIRE_VENDOR_SWITCH; return REQUIRE_VENDOR_SWITCH;
} }
} }


// Implementation version must be >= required // Implementation version must be >= required
final String implementationVersion = other.getImplementationVersion(); final String implementationVersion = other.getImplementationVersion();
if( null != implementationVersion )
{
if( null == m_implementationVersion ||
!m_implementationVersion.equals( implementationVersion ) )
{
if (null != implementationVersion) {
if (null == implementationVersion
|| !implementationVersion.equals(implementationVersion)) {
return REQUIRE_IMPLEMENTATION_CHANGE; return REQUIRE_IMPLEMENTATION_CHANGE;
} }
} }
@@ -451,9 +426,8 @@ public final class Specification
* @param other the specification * @param other the specification
* @return true if the specification is compatible with this specification * @return true if the specification is compatible with this specification
*/ */
public boolean isCompatibleWith( final Specification other )
{
return ( COMPATIBLE == getCompatibilityWith( other ) );
public boolean isCompatibleWith(final Specification other) {
return (COMPATIBLE == getCompatibilityWith(other));
} }


/** /**
@@ -461,54 +435,49 @@ public final class Specification
* *
* @return string representation of object. * @return string representation of object.
*/ */
public String toString()
{
final String lineSeparator = System.getProperty( "line.separator" );
public String toString() {
final String lineSeparator = System.getProperty("line.separator");
final String brace = ": "; final String brace = ": ";


final StringBuffer sb = new StringBuffer( SPECIFICATION_TITLE.toString() );
sb.append( brace );
sb.append( m_specificationTitle );
sb.append( lineSeparator );
if( null != m_specificationVersion )
{
sb.append( SPECIFICATION_VERSION );
sb.append( brace );
sb.append( m_specificationVersion );
sb.append( lineSeparator );
final StringBuffer sb
= new StringBuffer(SPECIFICATION_TITLE.toString());
sb.append(brace);
sb.append(specificationTitle);
sb.append(lineSeparator);
if (null != specificationVersion) {
sb.append(SPECIFICATION_VERSION);
sb.append(brace);
sb.append(specificationVersion);
sb.append(lineSeparator);
} }


if( null != m_specificationVendor )
{
sb.append( SPECIFICATION_VENDOR );
sb.append( brace );
sb.append( m_specificationVendor );
sb.append( lineSeparator );
if (null != specificationVendor) {
sb.append(SPECIFICATION_VENDOR);
sb.append(brace);
sb.append(specificationVendor);
sb.append(lineSeparator);
} }


if( null != m_implementationTitle )
{
sb.append( IMPLEMENTATION_TITLE );
sb.append( brace );
sb.append( m_implementationTitle );
sb.append( lineSeparator );
if (null != implementationTitle) {
sb.append(IMPLEMENTATION_TITLE);
sb.append(brace);
sb.append(implementationTitle);
sb.append(lineSeparator);
} }


if( null != m_implementationVersion )
{
sb.append( IMPLEMENTATION_VERSION );
sb.append( brace );
sb.append( m_implementationVersion );
sb.append( lineSeparator );
if (null != implementationVersion) {
sb.append(IMPLEMENTATION_VERSION);
sb.append(brace);
sb.append(implementationVersion);
sb.append(lineSeparator);
} }


if( null != m_implementationVendor )
{
sb.append( IMPLEMENTATION_VENDOR );
sb.append( brace );
sb.append( m_implementationVendor );
sb.append( lineSeparator );
if (null != implementationVendor) {
sb.append(IMPLEMENTATION_VENDOR);
sb.append(brace);
sb.append(implementationVendor);
sb.append(lineSeparator);
} }


return sb.toString(); return sb.toString();
@@ -521,9 +490,9 @@ public final class Specification
* @param first First version number (dotted decimal) * @param first First version number (dotted decimal)
* @param second Second version number (dotted decimal) * @param second Second version number (dotted decimal)
*/ */
private boolean isCompatible( final DeweyDecimal first, final DeweyDecimal second )
{
return first.isGreaterThanOrEqual( second );
private boolean isCompatible(final DeweyDecimal first,
final DeweyDecimal second) {
return first.isGreaterThanOrEqual(second);
} }


/** /**
@@ -536,31 +505,26 @@ public final class Specification
* @param list the array of results to trim * @param list the array of results to trim
* @return an array list with all duplicates removed * @return an array list with all duplicates removed
*/ */
private static ArrayList removeDuplicates( final ArrayList list )
{
private static ArrayList removeDuplicates(final ArrayList list) {
final ArrayList results = new ArrayList(); final ArrayList results = new ArrayList();
final ArrayList sections = new ArrayList(); final ArrayList sections = new ArrayList();
while( list.size() > 0 )
{
final Specification specification = (Specification)list.remove( 0 );
while (list.size() > 0) {
final Specification specification = (Specification) list.remove(0);
final Iterator iterator = list.iterator(); final Iterator iterator = list.iterator();
while( iterator.hasNext() )
{
final Specification other = (Specification)iterator.next();
if( isEqual( specification, other ) )
{
while (iterator.hasNext()) {
final Specification other = (Specification) iterator.next();
if (isEqual(specification, other)) {
final String[] otherSections = other.getSections(); final String[] otherSections = other.getSections();
if( null != sections )
{
sections.addAll( Arrays.asList( otherSections ) );
if (null != sections) {
sections.addAll(Arrays.asList(otherSections));
} }
iterator.remove(); iterator.remove();
} }
} }


final Specification merged = final Specification merged =
mergeInSections( specification, sections );
results.add( merged );
mergeInSections(specification, sections);
results.add(merged);
//Reset list of sections //Reset list of sections
sections.clear(); sections.clear();
} }
@@ -576,16 +540,15 @@ public final class Specification
* @return true if two specifications are equal except for their * @return true if two specifications are equal except for their
* sections, else false * sections, else false
*/ */
private static boolean isEqual( final Specification specification,
final Specification other )
{
private static boolean isEqual(final Specification specification,
final Specification other) {
return return
specification.getSpecificationTitle().equals( other.getSpecificationTitle() ) &&
specification.getSpecificationVersion().isEqual( other.getSpecificationVersion() ) &&
specification.getSpecificationVendor().equals( other.getSpecificationVendor() ) &&
specification.getImplementationTitle().equals( other.getImplementationTitle() ) &&
specification.getImplementationVersion().equals( other.getImplementationVersion() ) &&
specification.getImplementationVendor().equals( other.getImplementationVendor() );
specification.getSpecificationTitle().equals(other.getSpecificationTitle())
&& specification.getSpecificationVersion().isEqual(other.getSpecificationVersion())
&& specification.getSpecificationVendor().equals(other.getSpecificationVendor())
&& specification.getImplementationTitle().equals(other.getImplementationTitle())
&& specification.getImplementationVersion().equals(other.getImplementationVersion())
&& specification.getImplementationVendor().equals(other.getImplementationVendor());
} }


/** /**
@@ -596,27 +559,23 @@ public final class Specification
* @param sectionsToAdd the list of sections to merge * @param sectionsToAdd the list of sections to merge
* @return the merged specification * @return the merged specification
*/ */
private static Specification mergeInSections( final Specification specification,
final ArrayList sectionsToAdd )
{
if( 0 == sectionsToAdd.size() )
{
private static Specification mergeInSections(final Specification specification,
final ArrayList sectionsToAdd) {
if (0 == sectionsToAdd.size()) {
return specification; return specification;
}
else
{
sectionsToAdd.addAll( Arrays.asList( specification.getSections() ) );
} else {
sectionsToAdd.addAll(Arrays.asList(specification.getSections()));


final String[] sections = final String[] sections =
(String[])sectionsToAdd.toArray( new String[ sectionsToAdd.size() ] );
(String[]) sectionsToAdd.toArray(new String[sectionsToAdd.size()]);


return new Specification( specification.getSpecificationTitle(),
return new Specification(specification.getSpecificationTitle(),
specification.getSpecificationVersion().toString(), specification.getSpecificationVersion().toString(),
specification.getSpecificationVendor(), specification.getSpecificationVendor(),
specification.getImplementationTitle(), specification.getImplementationTitle(),
specification.getImplementationVersion(), specification.getImplementationVersion(),
specification.getImplementationVendor(), specification.getImplementationVendor(),
sections );
sections);
} }
} }


@@ -626,14 +585,10 @@ public final class Specification
* @param value the string to trim or null * @param value the string to trim or null
* @return the trimmed string or null * @return the trimmed string or null
*/ */
private static String getTrimmedString( final String value )
{
if( null == value )
{
private static String getTrimmedString(final String value) {
if (null == value) {
return null; return null;
}
else
{
} else {
return value.trim(); return value.trim();
} }
} }
@@ -644,51 +599,50 @@ public final class Specification
* @param attributes Attributes to searched * @param attributes Attributes to searched
* @return the new Specification object, or null * @return the new Specification object, or null
*/ */
private static Specification getSpecification( final String section,
final Attributes attributes )
throws ParseException
{
private static Specification getSpecification(final String section,
final Attributes attributes)
throws ParseException {
//WARNING: We trim the values of all the attributes because //WARNING: We trim the values of all the attributes because
//Some extension declarations are badly defined (ie have spaces //Some extension declarations are badly defined (ie have spaces
//after version or vendor) //after version or vendor)
final String name = getTrimmedString( attributes.getValue( SPECIFICATION_TITLE ) );
if( null == name )
{
final String name
= getTrimmedString(attributes.getValue(SPECIFICATION_TITLE));
if (null == name) {
return null; return null;
} }


final String specVendor = getTrimmedString( attributes.getValue( SPECIFICATION_VENDOR ) );
if( null == specVendor )
{
throw new ParseException( "Missing " + SPECIFICATION_VENDOR, 0 );
final String specVendor
= getTrimmedString(attributes.getValue(SPECIFICATION_VENDOR));
if (null == specVendor) {
throw new ParseException("Missing " + SPECIFICATION_VENDOR, 0);
} }


final String specVersion = getTrimmedString( attributes.getValue( SPECIFICATION_VERSION ) );
if( null == specVersion )
{
throw new ParseException( "Missing " + SPECIFICATION_VERSION, 0 );
final String specVersion
= getTrimmedString(attributes.getValue(SPECIFICATION_VERSION));
if (null == specVersion) {
throw new ParseException("Missing " + SPECIFICATION_VERSION, 0);
} }


final String impTitle = getTrimmedString( attributes.getValue( IMPLEMENTATION_TITLE ) );
if( null == impTitle )
{
throw new ParseException( "Missing " + IMPLEMENTATION_TITLE, 0 );
final String impTitle
= getTrimmedString(attributes.getValue(IMPLEMENTATION_TITLE));
if (null == impTitle) {
throw new ParseException("Missing " + IMPLEMENTATION_TITLE, 0);
} }


final String impVersion = getTrimmedString( attributes.getValue( IMPLEMENTATION_VERSION ) );
if( null == impVersion )
{
throw new ParseException( "Missing " + IMPLEMENTATION_VERSION, 0 );
final String impVersion
= getTrimmedString(attributes.getValue(IMPLEMENTATION_VERSION));
if (null == impVersion) {
throw new ParseException("Missing " + IMPLEMENTATION_VERSION, 0);
} }


final String impVendor = getTrimmedString( attributes.getValue( IMPLEMENTATION_VENDOR ) );
if( null == impVendor )
{
throw new ParseException( "Missing " + IMPLEMENTATION_VENDOR, 0 );
final String impVendor
= getTrimmedString(attributes.getValue(IMPLEMENTATION_VENDOR));
if (null == impVendor) {
throw new ParseException("Missing " + IMPLEMENTATION_VENDOR, 0);
} }


return new Specification( name, specVersion, specVendor,
return new Specification(name, specVersion, specVendor,
impTitle, impVersion, impVendor, impTitle, impVersion, impVendor,
new String[]{section} );
new String[]{section});
} }
} }

+ 276
- 220
src/main/org/apache/tools/tar/TarEntry.java View File

@@ -53,7 +53,7 @@
*/ */


/* /*
* This package is based on the work done by Timothy Gerard Endres
* This package is based on the work done by Timothy Gerard Endres
* (time@ice.com) to whom the Ant project is very grateful for his great code. * (time@ice.com) to whom the Ant project is very grateful for his great code.
*/ */


@@ -88,7 +88,7 @@ import java.util.Locale;
* the archive, and the header information is constructed from * the archive, and the header information is constructed from
* other information. In this case the header fields are set to * other information. In this case the header fields are set to
* defaults and the File is set to null. * defaults and the File is set to null.
*
*
* <p> * <p>
* The C structure for a Tar Entry's header is: * The C structure for a Tar Entry's header is:
* <pre> * <pre>
@@ -109,209 +109,265 @@ import java.util.Locale;
* char devminor[8]; * char devminor[8];
* } header; * } header;
* </pre> * </pre>
*
*
* @author Timothy Gerard Endres <a href="mailto:time@ice.com">time@ice.com</a> * @author Timothy Gerard Endres <a href="mailto:time@ice.com">time@ice.com</a>
* @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a> * @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a>
*/ */
public class TarEntry implements TarConstants { public class TarEntry implements TarConstants {
/** The entry's name. */
private StringBuffer name;

/** The entry's permission mode. */
private int mode;

/** The entry's user id. */
private int userId;

/** The entry's group id. */
private int groupId;

/** The entry's size. */
private long size;

/** The entry's modification time. */
private long modTime;

/** The entry's checksum. */
private int checkSum;

/** The entry's link flag. */
private byte linkFlag;

/** The entry's link name. */
private StringBuffer linkName;

/** The entry's magic tag. */
private StringBuffer magic;

/** The entry's user name. */
private StringBuffer userName;

/** The entry's group name. */
private StringBuffer groupName;


private StringBuffer name; /** The entry's name. */
private int mode; /** The entry's permission mode. */
private int userId; /** The entry's user id. */
private int groupId; /** The entry's group id. */
private long size; /** The entry's size. */
private long modTime; /** The entry's modification time. */
private int checkSum; /** The entry's checksum. */
private byte linkFlag; /** The entry's link flag. */
private StringBuffer linkName; /** The entry's link name. */
private StringBuffer magic; /** The entry's magic tag. */
private StringBuffer userName; /** The entry's user name. */
private StringBuffer groupName; /** The entry's group name. */
private int devMajor; /** The entry's major device number. */
private int devMinor; /** The entry's minor device number. */
private File file; /** The entry's file reference */

/**
/** The entry's major device number. */
private int devMajor;

/** The entry's minor device number. */
private int devMinor;

/** The entry's file reference */
private File file;

/** Maximum length of a user's name in the tar file */
public static final int MAX_NAMELEN = 31;

/** Default permissions bits for directories */
public static final int DEFAULT_DIR_MODE = 040755;

/** Default permissions bits for files */
public static final int DEFAULT_FILE_MODE = 0100644;

/** Convert millis to seconds */
public static final int MILLIS_PER_SECOND = 1000;

/**
* Construct an empty entry and prepares the header values. * Construct an empty entry and prepares the header values.
*/
*/
private TarEntry () { private TarEntry () {
this.magic = new StringBuffer(TMAGIC); this.magic = new StringBuffer(TMAGIC);
this.name = new StringBuffer(); this.name = new StringBuffer();
this.linkName = new StringBuffer(); this.linkName = new StringBuffer();
String user = System.getProperty("user.name", ""); String user = System.getProperty("user.name", "");
if (user.length() > 31) {
user = user.substring(0, 31);
}
if (user.length() > MAX_NAMELEN) {
user = user.substring(0, MAX_NAMELEN);
}
this.userId = 0; this.userId = 0;
this.groupId = 0; this.groupId = 0;
this.userName = new StringBuffer(user); this.userName = new StringBuffer(user);
this.groupName = new StringBuffer(""); this.groupName = new StringBuffer("");
this.file = null; this.file = null;
} }
/**
/**
* Construct an entry with only a name. This allows the programmer * Construct an entry with only a name. This allows the programmer
* to construct the entry's header "by hand". File is set to null. * to construct the entry's header "by hand". File is set to null.
*/
*
* @param name the entry name
*/
public TarEntry(String name) { public TarEntry(String name) {
this(); this();
boolean isDir = name.endsWith("/"); boolean isDir = name.endsWith("/");
this.checkSum = 0; this.checkSum = 0;
this.devMajor = 0; this.devMajor = 0;
this.devMinor = 0; this.devMinor = 0;
this.name = new StringBuffer(name); this.name = new StringBuffer(name);
this.mode = isDir ? 040755 : 0100644;
this.mode = isDir ? DEFAULT_DIR_MODE : DEFAULT_FILE_MODE;
this.linkFlag = isDir ? LF_DIR : LF_NORMAL; this.linkFlag = isDir ? LF_DIR : LF_NORMAL;
this.userId = 0; this.userId = 0;
this.groupId = 0; this.groupId = 0;
this.size = 0; this.size = 0;
this.checkSum = 0; this.checkSum = 0;
this.modTime = (new Date()).getTime() / 1000;
this.modTime = (new Date()).getTime() / MILLIS_PER_SECOND;
this.linkName = new StringBuffer(""); this.linkName = new StringBuffer("");
this.userName = new StringBuffer(""); this.userName = new StringBuffer("");
this.groupName = new StringBuffer(""); this.groupName = new StringBuffer("");
this.devMajor = 0; this.devMajor = 0;
this.devMinor = 0; this.devMinor = 0;


}
/**
}
/**
* Construct an entry with a name an a link flag. * Construct an entry with a name an a link flag.
*/
*
* @param name the entry name
* @param linkFlag the entry link flag.
*/
public TarEntry(String name, byte linkFlag) { public TarEntry(String name, byte linkFlag) {
this(name); this(name);
this.linkFlag = linkFlag; this.linkFlag = linkFlag;
}
/**
}
/**
* Construct an entry for a file. File is set to file, and the * Construct an entry for a file. File is set to file, and the
* header is constructed from information from the file. * header is constructed from information from the file.
*
*
* @param file The file that the entry represents. * @param file The file that the entry represents.
*/
*/
public TarEntry(File file) { public TarEntry(File file) {
this(); this();
this.file = file; this.file = file;
String name = file.getPath(); String name = file.getPath();
String osname = System.getProperty("os.name").toLowerCase(Locale.US); String osname = System.getProperty("os.name").toLowerCase(Locale.US);
if (osname != null) { if (osname != null) {
// Strip off drive letters! // Strip off drive letters!
// REVIEW Would a better check be "(File.separator == '\')"? // REVIEW Would a better check be "(File.separator == '\')"?
if (osname.startsWith("windows")) { if (osname.startsWith("windows")) {
if (name.length() > 2) { if (name.length() > 2) {
char ch1 = name.charAt(0); char ch1 = name.charAt(0);
char ch2 = name.charAt(1); char ch2 = name.charAt(1);
if (ch2 == ':'
&& ((ch1 >= 'a' && ch1 <= 'z')
if (ch2 == ':'
&& ((ch1 >= 'a' && ch1 <= 'z')
|| (ch1 >= 'A' && ch1 <= 'Z'))) { || (ch1 >= 'A' && ch1 <= 'Z'))) {
name = name.substring(2); name = name.substring(2);
}
}
}
}
} else if (osname.indexOf("netware") > -1) { } else if (osname.indexOf("netware") > -1) {
int colon = name.indexOf(':'); int colon = name.indexOf(':');
if (colon != -1) { if (colon != -1) {
name = name.substring(colon + 1); name = name.substring(colon + 1);
} }
} }
}
}
name = name.replace(File.separatorChar, '/'); name = name.replace(File.separatorChar, '/');
// No absolute pathnames // No absolute pathnames
// Windows (and Posix?) paths can start with "\\NetworkDrive\", // Windows (and Posix?) paths can start with "\\NetworkDrive\",
// so we loop on starting /'s. // so we loop on starting /'s.
while (name.startsWith("/")) { while (name.startsWith("/")) {
name = name.substring(1); name = name.substring(1);
} }
this.linkName = new StringBuffer(""); this.linkName = new StringBuffer("");
this.name = new StringBuffer(name); this.name = new StringBuffer(name);
if (file.isDirectory()) { if (file.isDirectory()) {
this.mode = 040755;
this.mode = DEFAULT_DIR_MODE;
this.linkFlag = LF_DIR; this.linkFlag = LF_DIR;
if (this.name.charAt(this.name.length() - 1) != '/') { if (this.name.charAt(this.name.length() - 1) != '/') {
this.name.append("/"); this.name.append("/");
}
}
} else { } else {
this.mode = 0100644;
this.mode = DEFAULT_FILE_MODE;
this.linkFlag = LF_NORMAL; this.linkFlag = LF_NORMAL;
}
}
this.size = file.length(); this.size = file.length();
this.modTime = file.lastModified() / 1000;
this.modTime = file.lastModified() / MILLIS_PER_SECOND;
this.checkSum = 0; this.checkSum = 0;
this.devMajor = 0; this.devMajor = 0;
this.devMinor = 0; this.devMinor = 0;
}
/**
}
/**
* Construct an entry from an archive's header bytes. File is set * Construct an entry from an archive's header bytes. File is set
* to null. * to null.
*
*
* @param headerBuf The header bytes from a tar archive entry. * @param headerBuf The header bytes from a tar archive entry.
*/
*/
public TarEntry(byte[] headerBuf) { public TarEntry(byte[] headerBuf) {
this(); this();
this.parseTarHeader(headerBuf); this.parseTarHeader(headerBuf);
}
/**
}
/**
* Determine if the two entries are equal. Equality is determined * Determine if the two entries are equal. Equality is determined
* by the header names being equal. * by the header names being equal.
*
* @return it Entry to be checked for equality.
*
* @param it Entry to be checked for equality.
* @return True if the entries are equal. * @return True if the entries are equal.
*/
*/
public boolean equals(TarEntry it) { public boolean equals(TarEntry it) {
return this.getName().equals(it.getName()); return this.getName().equals(it.getName());
}
/**
}

/**
* Hashcodes are based on entry names.
*
* @return the entry hashcode
*/
public int hashCode() {
return getName().hashCode();
}

/**
* Determine if the given entry is a descendant of this entry. * Determine if the given entry is a descendant of this entry.
* Descendancy is determined by the name of the descendant * Descendancy is determined by the name of the descendant
* starting with this entry's name. * starting with this entry's name.
*
*
* @param desc Entry to be checked as a descendent of this. * @param desc Entry to be checked as a descendent of this.
* @return True if entry is a descendant of this. * @return True if entry is a descendant of this.
*/
*/
public boolean isDescendent(TarEntry desc) { public boolean isDescendent(TarEntry desc) {
return desc.getName().startsWith(this.getName()); return desc.getName().startsWith(this.getName());
}
/**
}
/**
* Get this entry's name. * Get this entry's name.
*
*
* @return This entry's name. * @return This entry's name.
*/
*/
public String getName() { public String getName() {
return this.name.toString(); return this.name.toString();
}
/**
}
/**
* Set this entry's name. * Set this entry's name.
*
*
* @param name This entry's new name. * @param name This entry's new name.
*/
*/
public void setName(String name) { public void setName(String name) {
this.name = new StringBuffer(name); this.name = new StringBuffer(name);
}
}


/** /**
* Set the mode for this entry * Set the mode for this entry
*
* @param mode the mode for this entry
*/ */
public void setMode(int mode) { public void setMode(int mode) {
this.mode = mode; this.mode = mode;
@@ -326,138 +382,138 @@ public class TarEntry implements TarConstants {
return this.linkName.toString(); return this.linkName.toString();
} }


/**
/**
* Get this entry's user id. * Get this entry's user id.
*
*
* @return This entry's user id. * @return This entry's user id.
*/
*/
public int getUserId() { public int getUserId() {
return this.userId; return this.userId;
}
/**
}
/**
* Set this entry's user id. * Set this entry's user id.
*
*
* @param userId This entry's new user id. * @param userId This entry's new user id.
*/
*/
public void setUserId(int userId) { public void setUserId(int userId) {
this.userId = userId; this.userId = userId;
}
/**
}
/**
* Get this entry's group id. * Get this entry's group id.
*
*
* @return This entry's group id. * @return This entry's group id.
*/
*/
public int getGroupId() { public int getGroupId() {
return this.groupId; return this.groupId;
}
/**
}
/**
* Set this entry's group id. * Set this entry's group id.
*
*
* @param groupId This entry's new group id. * @param groupId This entry's new group id.
*/
*/
public void setGroupId(int groupId) { public void setGroupId(int groupId) {
this.groupId = groupId; this.groupId = groupId;
}
/**
}
/**
* Get this entry's user name. * Get this entry's user name.
*
*
* @return This entry's user name. * @return This entry's user name.
*/
*/
public String getUserName() { public String getUserName() {
return this.userName.toString(); return this.userName.toString();
}
/**
}
/**
* Set this entry's user name. * Set this entry's user name.
*
*
* @param userName This entry's new user name. * @param userName This entry's new user name.
*/
*/
public void setUserName(String userName) { public void setUserName(String userName) {
this.userName = new StringBuffer(userName); this.userName = new StringBuffer(userName);
}
/**
}
/**
* Get this entry's group name. * Get this entry's group name.
*
*
* @return This entry's group name. * @return This entry's group name.
*/
*/
public String getGroupName() { public String getGroupName() {
return this.groupName.toString(); return this.groupName.toString();
}
/**
}
/**
* Set this entry's group name. * Set this entry's group name.
*
*
* @param groupName This entry's new group name. * @param groupName This entry's new group name.
*/
*/
public void setGroupName(String groupName) { public void setGroupName(String groupName) {
this.groupName = new StringBuffer(groupName); this.groupName = new StringBuffer(groupName);
}
/**
}
/**
* Convenience method to set this entry's group and user ids. * Convenience method to set this entry's group and user ids.
*
*
* @param userId This entry's new user id. * @param userId This entry's new user id.
* @param groupId This entry's new group id. * @param groupId This entry's new group id.
*/
*/
public void setIds(int userId, int groupId) { public void setIds(int userId, int groupId) {
this.setUserId(userId); this.setUserId(userId);
this.setGroupId(groupId); this.setGroupId(groupId);
}
/**
}
/**
* Convenience method to set this entry's group and user names. * Convenience method to set this entry's group and user names.
*
*
* @param userName This entry's new user name. * @param userName This entry's new user name.
* @param groupName This entry's new group name. * @param groupName This entry's new group name.
*/
*/
public void setNames(String userName, String groupName) { public void setNames(String userName, String groupName) {
this.setUserName(userName); this.setUserName(userName);
this.setGroupName(groupName); this.setGroupName(groupName);
}
/**
}
/**
* Set this entry's modification time. The parameter passed * Set this entry's modification time. The parameter passed
* to this method is in "Java time". * to this method is in "Java time".
*
*
* @param time This entry's new modification time. * @param time This entry's new modification time.
*/
*/
public void setModTime(long time) { public void setModTime(long time) {
this.modTime = time / 1000;
}
/**
this.modTime = time / MILLIS_PER_SECOND;
}
/**
* Set this entry's modification time. * Set this entry's modification time.
*
*
* @param time This entry's new modification time. * @param time This entry's new modification time.
*/
*/
public void setModTime(Date time) { public void setModTime(Date time) {
this.modTime = time.getTime() / 1000;
}
/**
this.modTime = time.getTime() / MILLIS_PER_SECOND;
}
/**
* Set this entry's modification time. * Set this entry's modification time.
*
* @param time This entry's new modification time.
*/
*
* @return time This entry's new modification time.
*/
public Date getModTime() { public Date getModTime() {
return new Date(this.modTime * 1000);
}
/**
return new Date(this.modTime * MILLIS_PER_SECOND);
}
/**
* Get this entry's file. * Get this entry's file.
*
*
* @return This entry's file. * @return This entry's file.
*/
*/
public File getFile() { public File getFile() {
return this.file; return this.file;
}
/**
}
/**
* Get this entry's mode. * Get this entry's mode.
* *
* @return This entry's mode. * @return This entry's mode.
@@ -468,96 +524,96 @@ public class TarEntry implements TarConstants {


/** /**
* Get this entry's file size. * Get this entry's file size.
*
*
* @return This entry's file size. * @return This entry's file size.
*/
*/
public long getSize() { public long getSize() {
return this.size; return this.size;
}
/**
}
/**
* Set this entry's file size. * Set this entry's file size.
*
*
* @param size This entry's new file size. * @param size This entry's new file size.
*/
*/
public void setSize(long size) { public void setSize(long size) {
this.size = size; this.size = size;
}
}



/** /**
* Indicate if this entry is a GNU long name block * Indicate if this entry is a GNU long name block
* *
* @return true if this is a long name extension provided by GNU tar * @return true if this is a long name extension provided by GNU tar
*/ */
public boolean isGNULongNameEntry() { public boolean isGNULongNameEntry() {
return linkFlag == LF_GNUTYPE_LONGNAME &&
name.toString().equals(GNU_LONGLINK);
}
return linkFlag == LF_GNUTYPE_LONGNAME
&& name.toString().equals(GNU_LONGLINK);
}


/**
/**
* Return whether or not this entry represents a directory. * Return whether or not this entry represents a directory.
*
*
* @return True if this entry is a directory. * @return True if this entry is a directory.
*/
*/
public boolean isDirectory() { public boolean isDirectory() {
if (this.file != null) { if (this.file != null) {
return this.file.isDirectory(); return this.file.isDirectory();
}
}
if (this.linkFlag == LF_DIR) { if (this.linkFlag == LF_DIR) {
return true; return true;
}
}
if (this.getName().endsWith("/")) { if (this.getName().endsWith("/")) {
return true; return true;
}
}
return false; return false;
}
/**
}
/**
* If this entry represents a file, and the file is a directory, return * If this entry represents a file, and the file is a directory, return
* an array of TarEntries for this entry's children. * an array of TarEntries for this entry's children.
*
*
* @return An array of TarEntry's for this entry's children. * @return An array of TarEntry's for this entry's children.
*/
*/
public TarEntry[] getDirectoryEntries() { public TarEntry[] getDirectoryEntries() {
if (this.file == null || !this.file.isDirectory()) { if (this.file == null || !this.file.isDirectory()) {
return new TarEntry[0]; return new TarEntry[0];
}
}
String[] list = this.file.list(); String[] list = this.file.list();
TarEntry[] result = new TarEntry[list.length]; TarEntry[] result = new TarEntry[list.length];
for (int i = 0; i < list.length; ++i) { for (int i = 0; i < list.length; ++i) {
result[i] = new TarEntry(new File(this.file, list[i])); result[i] = new TarEntry(new File(this.file, list[i]));
}
}
return result; return result;
}
/**
}
/**
* Write an entry's header information to a header buffer. * Write an entry's header information to a header buffer.
*
*
* @param outbuf The tar entry header buffer to fill in. * @param outbuf The tar entry header buffer to fill in.
*/
*/
public void writeEntryHeader(byte[] outbuf) { public void writeEntryHeader(byte[] outbuf) {
int offset = 0; int offset = 0;
offset = TarUtils.getNameBytes(this.name, outbuf, offset, NAMELEN); offset = TarUtils.getNameBytes(this.name, outbuf, offset, NAMELEN);
offset = TarUtils.getOctalBytes(this.mode, outbuf, offset, MODELEN); offset = TarUtils.getOctalBytes(this.mode, outbuf, offset, MODELEN);
offset = TarUtils.getOctalBytes(this.userId, outbuf, offset, UIDLEN); offset = TarUtils.getOctalBytes(this.userId, outbuf, offset, UIDLEN);
offset = TarUtils.getOctalBytes(this.groupId, outbuf, offset, GIDLEN); offset = TarUtils.getOctalBytes(this.groupId, outbuf, offset, GIDLEN);
offset = TarUtils.getLongOctalBytes(this.size, outbuf, offset, SIZELEN); offset = TarUtils.getLongOctalBytes(this.size, outbuf, offset, SIZELEN);
offset = TarUtils.getLongOctalBytes(this.modTime, outbuf, offset, MODTIMELEN); offset = TarUtils.getLongOctalBytes(this.modTime, outbuf, offset, MODTIMELEN);
int csOffset = offset; int csOffset = offset;
for (int c = 0; c < CHKSUMLEN; ++c) { for (int c = 0; c < CHKSUMLEN; ++c) {
outbuf[offset++] = (byte) ' '; outbuf[offset++] = (byte) ' ';
} }
outbuf[offset++] = this.linkFlag; outbuf[offset++] = this.linkFlag;
offset = TarUtils.getNameBytes(this.linkName, outbuf, offset, NAMELEN); offset = TarUtils.getNameBytes(this.linkName, outbuf, offset, NAMELEN);
offset = TarUtils.getNameBytes(this.magic, outbuf, offset, MAGICLEN); offset = TarUtils.getNameBytes(this.magic, outbuf, offset, MAGICLEN);
@@ -565,27 +621,27 @@ public class TarEntry implements TarConstants {
offset = TarUtils.getNameBytes(this.groupName, outbuf, offset, GNAMELEN); offset = TarUtils.getNameBytes(this.groupName, outbuf, offset, GNAMELEN);
offset = TarUtils.getOctalBytes(this.devMajor, outbuf, offset, DEVLEN); offset = TarUtils.getOctalBytes(this.devMajor, outbuf, offset, DEVLEN);
offset = TarUtils.getOctalBytes(this.devMinor, outbuf, offset, DEVLEN); offset = TarUtils.getOctalBytes(this.devMinor, outbuf, offset, DEVLEN);
while (offset < outbuf.length) { while (offset < outbuf.length) {
outbuf[offset++] = 0; outbuf[offset++] = 0;
} }
long checkSum = TarUtils.computeCheckSum(outbuf); long checkSum = TarUtils.computeCheckSum(outbuf);
TarUtils.getCheckSumOctalBytes(checkSum, outbuf, csOffset, CHKSUMLEN); TarUtils.getCheckSumOctalBytes(checkSum, outbuf, csOffset, CHKSUMLEN);
}
/**
}
/**
* Parse an entry's header information from a header buffer. * Parse an entry's header information from a header buffer.
*
*
* @param header The tar entry header buffer to get information from. * @param header The tar entry header buffer to get information from.
*/
*/
public void parseTarHeader(byte[] header) { public void parseTarHeader(byte[] header) {
int offset = 0; int offset = 0;
this.name = TarUtils.parseName(header, offset, NAMELEN);
this.name = TarUtils.parseName(header, offset, NAMELEN);
offset += NAMELEN; offset += NAMELEN;
this.mode = (int) TarUtils.parseOctal(header, offset, MODELEN);
this.mode = (int) TarUtils.parseOctal(header, offset, MODELEN);
offset += MODELEN; offset += MODELEN;
this.userId = (int) TarUtils.parseOctal(header, offset, UIDLEN); this.userId = (int) TarUtils.parseOctal(header, offset, UIDLEN);
offset += UIDLEN; offset += UIDLEN;
@@ -610,4 +666,4 @@ public class TarEntry implements TarConstants {
offset += DEVLEN; offset += DEVLEN;
this.devMinor = (int) TarUtils.parseOctal(header, offset, DEVLEN); this.devMinor = (int) TarUtils.parseOctal(header, offset, DEVLEN);
} }
}
}

Loading…
Cancel
Save