Skip to content

Commit fa9760e

Browse files
committed
MASSEMBLY-769 Forced file mode for collections was broken
Fixed with testcase
1 parent b2ee9ff commit fa9760e

File tree

2 files changed

+143
-16
lines changed

2 files changed

+143
-16
lines changed

src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,30 @@ public abstract class AbstractArchiver
118118
// contextualized.
119119
private ArchiverManager archiverManager;
120120

121+
private static class ResourceCollectionWithModes
122+
{
123+
private final PlexusIoResourceCollection resources;
124+
private final int forcedFileMode;
125+
private final int forcedDirectoryMode;
126+
127+
public ResourceCollectionWithModes( PlexusIoResourceCollection resources, int forcedFileMode,
128+
int forcedDirMode )
129+
{
130+
this.resources = resources;
131+
this.forcedFileMode = forcedFileMode;
132+
this.forcedDirectoryMode = forcedDirMode;
133+
}
134+
135+
private int maybeOverridden(int suggestedMode, boolean isDir){
136+
if (isDir){
137+
return forcedDirectoryMode >= 0 ? forcedDirectoryMode : suggestedMode;
138+
} else {
139+
return forcedFileMode >= 0 ? forcedFileMode : suggestedMode;
140+
141+
}
142+
}
143+
144+
}
121145
/**
122146
* @since 1.1
123147
*/
@@ -376,26 +400,57 @@ protected ArchiveEntry asArchiveEntry( @Nonnull final PlexusIoResource resource,
376400
}
377401
}
378402

403+
private int maybeOverridden(int suggestedMode, boolean isDir){
404+
if (isDir){
405+
return forcedDirectoryMode >= 0 ? forcedDirectoryMode : suggestedMode;
406+
} else {
407+
return forcedFileMode >= 0 ? forcedFileMode : suggestedMode;
408+
409+
}
410+
}
411+
379412
protected ArchiveEntry asArchiveEntry( final PlexusIoResourceCollection collection,
380413
final PlexusIoResource resource )
381414
throws ArchiverException
382415
{
383416
final String destFileName = collection.getName( resource );
384417

385-
int permissions = -1;
418+
int fromResource = -1;
419+
if ( resource instanceof ResourceAttributeSupplier)
420+
{
421+
final PlexusIoResourceAttributes attrs = ( (ResourceAttributeSupplier) resource ).getAttributes();
422+
423+
if ( attrs != null )
424+
{
425+
fromResource = attrs.getOctalMode();
426+
}
427+
}
428+
429+
return asArchiveEntry( resource, destFileName, maybeOverridden(fromResource, resource.isDirectory()), collection );
430+
}
431+
432+
protected ArchiveEntry asArchiveEntry( final ResourceCollectionWithModes collection,
433+
final PlexusIoResource resource )
434+
throws ArchiverException
435+
{
436+
final String destFileName = collection.resources.getName( resource );
437+
438+
int fromResource = -1;
386439
if ( resource instanceof ResourceAttributeSupplier)
387440
{
388441
final PlexusIoResourceAttributes attrs = ( (ResourceAttributeSupplier) resource ).getAttributes();
389442

390443
if ( attrs != null )
391444
{
392-
permissions = attrs.getOctalMode();
445+
fromResource = attrs.getOctalMode();
393446
}
394447
}
395448

396-
return asArchiveEntry( resource, destFileName, permissions, collection );
449+
return asArchiveEntry( resource, destFileName, collection.maybeOverridden( fromResource,
450+
resource.isDirectory() ), collection.resources );
397451
}
398452

453+
399454
public void addResource( final PlexusIoResource resource, final String destFileName, final int permissions )
400455
throws ArchiverException
401456
{
@@ -463,7 +518,7 @@ public ResourceIterator getResources()
463518
{
464519
private final Iterator addedResourceIter = resources.iterator();
465520

466-
private PlexusIoResourceCollection currentResourceCollection;
521+
private ResourceCollectionWithModes currentResourceCollection;
467522

468523
private Iterator ioResourceIter;
469524

@@ -486,13 +541,13 @@ public boolean hasNext()
486541
{
487542
nextEntry = (ArchiveEntry) o;
488543
}
489-
else if ( o instanceof PlexusIoResourceCollection )
544+
else if ( o instanceof ResourceCollectionWithModes )
490545
{
491-
currentResourceCollection = (PlexusIoResourceCollection) o;
546+
currentResourceCollection = (ResourceCollectionWithModes) o;
492547

493548
try
494549
{
495-
ioResourceIter = currentResourceCollection.getResources();
550+
ioResourceIter = currentResourceCollection.resources.getResources();
496551
}
497552
catch ( final IOException e )
498553
{
@@ -760,7 +815,7 @@ protected PlexusIoResourceCollection asResourceCollection( final ArchivedFileSet
760815
public void addResources( final PlexusIoResourceCollection collection )
761816
throws ArchiverException
762817
{
763-
doAddResource( collection );
818+
doAddResource( new ResourceCollectionWithModes( collection, forcedFileMode, forcedDirectoryMode ));
764819
}
765820

766821
private void doAddResource(Object item){
@@ -901,11 +956,11 @@ protected boolean isUptodate()
901956
{
902957
l = ( (ArchiveEntry) o ).getResource().getLastModified();
903958
}
904-
else if ( o instanceof PlexusIoResourceCollection )
959+
else if ( o instanceof ResourceCollectionWithModes )
905960
{
906961
try
907962
{
908-
l = ( (PlexusIoResourceCollection) o ).getLastModified();
963+
l = ( (ResourceCollectionWithModes) o ).resources.getLastModified();
909964
}
910965
catch ( final IOException e )
911966
{

src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@
4141
import org.codehaus.plexus.components.io.attributes.Java7FileAttributes;
4242
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
4343
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
44+
import org.codehaus.plexus.components.io.attributes.SimpleResourceAttributes;
45+
import org.codehaus.plexus.components.io.functions.ContentSupplier;
4446
import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
47+
import org.codehaus.plexus.components.io.resources.PlexusIoFileResource;
4548
import org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection;
4649
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
50+
import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection;
51+
import org.codehaus.plexus.components.io.resources.ResourceFactory;
4752
import org.codehaus.plexus.logging.Logger;
4853
import org.codehaus.plexus.logging.console.ConsoleLogger;
4954
import org.codehaus.plexus.util.FileUtils;
@@ -69,6 +74,7 @@
6974
* @author Emmanuel Venisse
7075
* @version $Id$
7176
*/
77+
@SuppressWarnings( "OctalInteger" )
7278
public class ZipArchiverTest
7379
extends BasePlexusArchiverTest
7480
{
@@ -135,6 +141,7 @@ public void testOverddidenPermissions()
135141
}
136142

137143

144+
138145
public void testCreateArchiveWithDetectedModes()
139146
throws Exception
140147
{
@@ -433,6 +440,9 @@ private ZipArchiver newArchiver( String name )
433440
return archiver;
434441
}
435442

443+
private void fileModeAssert(int expected, int actual){
444+
assertEquals( Integer.toString( expected, 8 ), Integer.toString( actual, 8 ));
445+
}
436446
private void createArchive( ZipArchiver archiver )
437447
throws ArchiverException, IOException
438448
{
@@ -449,34 +459,34 @@ private void createArchive( ZipArchiver archiver )
449459
{
450460
if ( ze.getName().startsWith( "worldwritable" ) )
451461
{
452-
assertEquals( 0777, UnixStat.PERM_MASK & ze.getUnixMode() );
462+
fileModeAssert( 0777, UnixStat.PERM_MASK & ze.getUnixMode() );
453463
}
454464
else if ( ze.getName().startsWith( "groupwritable" ) )
455465
{
456-
assertEquals( 0070, UnixStat.PERM_MASK & ze.getUnixMode() );
466+
fileModeAssert( 0070, UnixStat.PERM_MASK & ze.getUnixMode() );
457467
}
458468
else
459469
{
460-
assertEquals( 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
470+
fileModeAssert( 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
461471
}
462472
}
463473
else
464474
{
465475
if ( ze.getName().equals( "one.txt" ) )
466476
{
467-
assertEquals( 0640, UnixStat.PERM_MASK & ze.getUnixMode() );
477+
fileModeAssert( 0640, UnixStat.PERM_MASK & ze.getUnixMode() );
468478
}
469479
else if ( ze.getName().equals( "two.txt" ) )
470480
{
471-
assertEquals( 0664, UnixStat.PERM_MASK & ze.getUnixMode() );
481+
fileModeAssert( 0664, UnixStat.PERM_MASK & ze.getUnixMode() );
472482
}
473483
else if ( ze.isUnixSymlink() )
474484
{
475485
// assertEquals( ze.getName(), 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
476486
}
477487
else
478488
{
479-
assertEquals( 0400, UnixStat.PERM_MASK & ze.getUnixMode() );
489+
fileModeAssert( 0400, UnixStat.PERM_MASK & ze.getUnixMode() );
480490
}
481491
}
482492

@@ -670,4 +680,66 @@ public void testDefaultUTF8withUTF8()
670680
zipArchiver.addDirectory( new File( "src/test/resources/miscUtf8" ) );
671681
zipArchiver.createArchive();
672682
}
683+
684+
public void testForcedFileModes()
685+
throws IOException
686+
{
687+
File step1file = new File( "target/output/forced-file-mode.zip" );
688+
{
689+
final ZipArchiver zipArchiver = getZipArchiver( step1file );
690+
zipArchiver.setFileMode( 0077 );
691+
zipArchiver.setDirectoryMode( 0007 );
692+
PlexusIoResourceAttributes attrs = new SimpleResourceAttributes( 123, "fred", 22, "filntstones", 0111 );
693+
PlexusIoResource resource =
694+
ResourceFactory.createResource( new File( "src/test/resources/folders/File.txt" ), "Test.txt", null,
695+
attrs );
696+
zipArchiver.addResource( resource, "Test2.txt", 0707 );
697+
PlexusIoFileResourceCollection files = new PlexusIoFileResourceCollection();
698+
files.setBaseDir( new File( "src/test/resources/folders" ) );
699+
files.setPrefix( "sixsixsix/" );
700+
zipArchiver.addResources( files );
701+
702+
zipArchiver.createArchive();
703+
704+
ZipFile zf = new ZipFile( step1file );
705+
fileModeAssert( 040007, zf.getEntry( "sixsixsix/a/" ).getUnixMode() );
706+
fileModeAssert( 0100077, zf.getEntry( "sixsixsix/b/FileInB.txt" ).getUnixMode() );
707+
fileModeAssert( 0100707, zf.getEntry( "Test2.txt" ).getUnixMode() );
708+
zf.close();
709+
}
710+
711+
File Step2file = new File( "target/output/forced-file-mode-from-zip.zip" );
712+
{
713+
final ZipArchiver za2 = getZipArchiver( Step2file );
714+
za2.setFileMode( 0666 );
715+
za2.setDirectoryMode( 0676 );
716+
717+
PlexusIoZipFileResourceCollection zipSrc = new PlexusIoZipFileResourceCollection();
718+
zipSrc.setFile( step1file );
719+
zipSrc.setPrefix( "zz/" );
720+
za2.addResources( zipSrc );
721+
za2.createArchive();
722+
ZipFile zf = new ZipFile( Step2file );
723+
fileModeAssert( 040676, zf.getEntry( "zz/sixsixsix/a/" ).getUnixMode() );
724+
fileModeAssert( 0100666, zf.getEntry( "zz/Test2.txt" ).getUnixMode() );
725+
zf.close();
726+
}
727+
728+
File step3file = new File( "target/output/forced-file-mode-from-zip2.zip" );
729+
{
730+
final ZipArchiver za2 = getZipArchiver( step3file );
731+
za2.setFileMode( 0666 );
732+
za2.setDirectoryMode( 0676 );
733+
734+
PlexusArchiverZipFileResourceCollection zipSrc = new PlexusArchiverZipFileResourceCollection();
735+
zipSrc.setFile( step1file );
736+
zipSrc.setPrefix( "zz/" );
737+
za2.addResources( zipSrc );
738+
za2.createArchive();
739+
ZipFile zf = new ZipFile( Step2file );
740+
fileModeAssert( 040676, zf.getEntry( "zz/sixsixsix/a/" ).getUnixMode() );
741+
fileModeAssert( 0100666, zf.getEntry( "zz/Test2.txt" ).getUnixMode() );
742+
zf.close();
743+
}
744+
}
673745
}

0 commit comments

Comments
 (0)