55import java .nio .file .Files ;
66import java .nio .file .Path ;
77import java .nio .file .Paths ;
8+ import java .nio .file .StandardCopyOption ;
89import java .security .MessageDigest ;
910import java .security .NoSuchAlgorithmException ;
1011import java .util .ArrayList ;
1112import java .util .Arrays ;
13+ import java .util .Enumeration ;
1214import java .util .List ;
15+ import java .util .jar .JarEntry ;
16+ import java .util .jar .JarFile ;
1317import java .util .zip .ZipEntry ;
1418import java .util .zip .ZipOutputStream ;
1519import lombok .Cleanup ;
@@ -323,6 +327,8 @@ public void extractResource(
323327 return ;
324328 }
325329
330+ getAndMake (target );
331+
326332 try (
327333 final InputStream inputStream = LightningProviders
328334 .inputStreamProvider ()
@@ -331,7 +337,7 @@ public void extractResource(
331337 Valid .notNull (
332338 inputStream ,
333339 "The embedded resource '" + resourcePath + "' cannot be found" );
334- Files .copy (inputStream , target .toPath ());
340+ Files .copy (inputStream , target .toPath (), StandardCopyOption . REPLACE_EXISTING );
335341
336342 } catch (final IOException ioException ) {
337343 throw LightningProviders
@@ -344,6 +350,46 @@ public void extractResource(
344350 }
345351 }
346352
353+ public void extractResourceFolderContents (
354+ @ NonNull final File sourceJarFile ,
355+ @ NonNull final File targetDirectory ,
356+ @ NonNull final String sourceDirectory ,
357+ boolean replace ) {
358+
359+ if (!targetDirectory .exists ()) {
360+ Valid .checkBoolean (
361+ targetDirectory .mkdirs (),
362+ "Can't create directory '" + targetDirectory .getName () + "'" ,
363+ "Parent: '" + getParentDirPath (targetDirectory ) + "'" );
364+ }
365+
366+ Valid .checkBoolean (
367+ targetDirectory .isDirectory (),
368+ "Source directory must be an directory" );
369+
370+ try (final JarFile jarFile = new JarFile (sourceJarFile )) {
371+ for (final Enumeration <JarEntry > entries = jarFile .entries (); entries .hasMoreElements (); ) {
372+ final JarEntry jarEntry = entries .nextElement ();
373+ final String entryName = jarEntry .getName ();
374+
375+ if (entryName .startsWith (sourceDirectory ) && !jarEntry .isDirectory ()) {
376+ extractResource (targetDirectory .getAbsolutePath (), entryName , replace );
377+ }
378+ }
379+
380+ } catch (final Throwable throwable ) {
381+ throw LightningProviders
382+ .exceptionHandler ()
383+ .create (
384+ throwable ,
385+ "Failed to extract folder from '"
386+ + targetDirectory
387+ + "' to '"
388+ + sourceDirectory
389+ + "'" );
390+ }
391+ }
392+
347393 private void copyFolder (
348394 @ NonNull final File source ,
349395 @ NonNull final File destination )
0 commit comments