@@ -55,6 +55,9 @@ public class ArchiveEntry
5555
5656 private final int mode ;
5757
58+ private final int defaultDirMode ; // Sometimes a directory needs to be created. Which mode should it be ?
59+ // this mode is at the time of the creation of the archive entry, which is an important distinction
60+
5861 private PlexusIoResourceAttributes attributes ;
5962
6063 /**
@@ -64,12 +67,14 @@ public class ArchiveEntry
6467 * @param type FILE or DIRECTORY
6568 * @param mode octal unix style permissions
6669 * @param collection
70+ * @param defaultDirMode
6771 */
6872 private ArchiveEntry ( String name , @ Nonnull PlexusIoResource resource , int type , int mode ,
69- PlexusIoResourceCollection collection )
73+ PlexusIoResourceCollection collection , int defaultDirMode )
7074 {
7175 this .name = name ;
7276 this .collection = collection ;
77+ this .defaultDirMode = defaultDirMode ;
7378 try {
7479 this .resource = collection != null ? collection .resolve (resource ) : resource ;
7580 } catch (IOException e ) {
@@ -151,18 +156,18 @@ public int getMode()
151156 }
152157
153158 public static ArchiveEntry createFileEntry ( String target , PlexusIoResource resource , int permissions ,
154- PlexusIoResourceCollection collection )
159+ PlexusIoResourceCollection collection , int defaultDirectoryPermissions )
155160 throws ArchiverException
156161 {
157162 if ( resource .isDirectory () )
158163 {
159164 throw new ArchiverException ( "Not a file: " + resource .getName () );
160165 }
161166 final int type = resource .isSymbolicLink () ? SYMLINK : FILE ;
162- return new ArchiveEntry ( target , resource , type , permissions , collection );
167+ return new ArchiveEntry ( target , resource , type , permissions , collection , defaultDirectoryPermissions );
163168 }
164169
165- public static ArchiveEntry createFileEntry ( String target , File file , int permissions )
170+ public static ArchiveEntry createFileEntry ( String target , File file , int permissions , int defaultDirectoryPermissions )
166171 throws ArchiverException
167172 {
168173 if ( !file .isFile () )
@@ -181,21 +186,23 @@ public static ArchiveEntry createFileEntry( String target, File file, int permis
181186 }
182187
183188 final PlexusIoFileResource res = PlexusIoFileResource .justAFile ( file , attrs );
184- return new ArchiveEntry ( target , res , FILE , permissions , null );
189+ return new ArchiveEntry ( target , res , FILE , permissions , null , defaultDirectoryPermissions );
185190 }
186191
187- public static ArchiveEntry createDirectoryEntry ( String target , @ Nonnull PlexusIoResource resource , int permissions )
192+ public static ArchiveEntry createDirectoryEntry ( String target , @ Nonnull PlexusIoResource resource , int permissions ,
193+ int defaultDirectoryPermissions )
188194 throws ArchiverException
189195 {
190196 if ( !resource .isDirectory () )
191197 {
192198 throw new ArchiverException ( "Not a directory: " + resource .getName () );
193199 }
194200 final int type = resource .isSymbolicLink () ? SYMLINK : DIRECTORY ;
195- return new ArchiveEntry ( target , resource , type , permissions , null );
201+ return new ArchiveEntry ( target , resource , type , permissions , null , defaultDirectoryPermissions );
196202 }
197203
198- public static ArchiveEntry createDirectoryEntry ( String target , final File file , int permissions )
204+ public static ArchiveEntry createDirectoryEntry ( String target , final File file , int permissions ,
205+ int defaultDirMode1 )
199206 throws ArchiverException
200207 {
201208 if ( !file .isDirectory () )
@@ -204,31 +211,33 @@ public static ArchiveEntry createDirectoryEntry( String target, final File file,
204211 }
205212
206213 final PlexusIoFileResource res = new PlexusIoFileResource ( file , ArchiverAttributeUtils .getFileAttributes (file ));
207- return new ArchiveEntry ( target , res , DIRECTORY , permissions , null );
214+ return new ArchiveEntry ( target , res , DIRECTORY , permissions , null , defaultDirMode1 );
208215 }
209216
210- public static ArchiveEntry createEntry ( String target , File file , int filePerm , int dirPerm )
217+ public static ArchiveEntry createEntry ( String target , File file , int filePerm , int dirPerm , int defaultDirectoryPermissions )
211218 throws ArchiverException
212219 {
213220 if ( file .isDirectory () )
214221 {
215- return createDirectoryEntry ( target , file , dirPerm );
222+ return createDirectoryEntry ( target , file , dirPerm , defaultDirectoryPermissions );
216223 }
217224 else if ( file .isFile () )
218225 {
219- return createFileEntry ( target , file , filePerm );
226+ return createFileEntry ( target , file , filePerm , defaultDirectoryPermissions );
220227 }
221228 else // FIXME: handle symlinks?
222229 {
223230 throw new ArchiverException ( "Neither a file nor a directory: " + file );
224231 }
225232 }
226233
227- public static ArchiveEntry createSymlinkEntry (String symlinkName , int permissions , String symlinkDestination )
234+ public static ArchiveEntry createSymlinkEntry ( String symlinkName , int permissions , String symlinkDestination ,
235+ int defaultDirectoryPermissions
236+ )
228237 {
229238 File symlinkFile = new File (symlinkName );
230239 final ArchiveEntry archiveEntry = new ArchiveEntry (symlinkName , new PlexusIoVirtualSymlinkResource (symlinkFile , symlinkDestination ), SYMLINK , permissions ,
231- null );
240+ null , defaultDirectoryPermissions );
232241 return archiveEntry ;
233242 }
234243
@@ -246,4 +255,9 @@ public void setResourceAttributes( PlexusIoResourceAttributes attributes )
246255 {
247256 return resource ;
248257 }
258+
259+ public int getDefaultDirMode ()
260+ {
261+ return defaultDirMode ;
262+ }
249263}
0 commit comments