@@ -56,8 +56,8 @@ class DirectoryRepository<I : Any, T : Any> constructor(
5656 @Throws(RepositoryException ::class )
5757 fun loadOrCreate (defaultEntities : Map <I , T > = emptyMap()) {
5858 try {
59- if (directory.toFile().list()?.isEmpty () != false ) {
60- loadDefaultsFromResources (defaultEntities)
59+ if (Files .newDirectoryStream(directory).use { it.none () } ) {
60+ loadFromResources (defaultEntities)
6161 }
6262
6363 load()
@@ -67,25 +67,25 @@ class DirectoryRepository<I : Any, T : Any> constructor(
6767 }
6868 }
6969
70- private fun loadDefaultsFromResources (defaultEntities : Map <I , T >) {
71- if (directory.toFile().list()?.isEmpty() == true ) {
70+ private fun loadFromResources (
71+ defaultEntities : Map <I , T >,
72+ writeBom : Boolean = true
73+ ) {
74+ val targetDirectory = File (directory.toUri()).apply { mkdirs() }
75+ val last = directory.pathString.split(' /' ).last()
7276
73- val last = directory.pathString.split(' /' ).last()
74-
75- val resourceUrl = DirectoryRepository ::class .java.getResource(" /$last " ) ? : run {
76- logger.warn(" Resource folder '/$last ' not found." )
77- return
78- }
79-
80- when (resourceUrl.protocol) {
81- " file" -> handleFileProtocol(resourceUrl, directory.toFile())
82- " jar" -> handleJarProtocol(resourceUrl, directory.toFile())
83-
84- else -> logger.warn(" Unsupported protocol: ${resourceUrl.protocol} " )
85- }
77+ val resourceUrl = DirectoryRepository ::class .java.getResource(" /$last " ) ? : run {
78+ logger.warn(" $last folder not found in resources" )
79+ return
80+ }
8681
87- defaultEntities.forEach { (id, entity) -> save(id, entity) }
82+ when (resourceUrl.protocol) {
83+ " file" -> handleFileProtocol(resourceUrl, targetDirectory)
84+ " jar" -> handleJarProtocol(resourceUrl, targetDirectory, writeBom)
85+ else -> logger.error(" Unsupported protocol: ${resourceUrl.protocol} " )
8886 }
87+
88+ defaultEntities.forEach { (id, entity) -> save(id, entity) }
8989 }
9090
9191 private fun handleFileProtocol (resourceUrl : URL , targetDirectory : File ) {
@@ -98,33 +98,46 @@ class DirectoryRepository<I : Any, T : Any> constructor(
9898 }
9999 }
100100
101- private fun handleJarProtocol (resourceUrl : URL , targetDirectory : File ) {
101+ private fun handleJarProtocol (
102+ resourceUrl : URL ,
103+ targetDirectory : File ,
104+ writeBom : Boolean
105+ ) {
102106 val jarPath = resourceUrl.path.substringBefore(" !" ).removePrefix(" file:" )
103-
104107 try {
105108 JarFile (jarPath).use { jarFile ->
109+ val last = directory.pathString.split(' /' ).last()
110+ var filesProcessed = 0
111+ var filesFailed = 0
112+
106113 jarFile.entries().asSequence()
107- .filter { it.name.startsWith(" defaults /" ) && ! it.isDirectory }
114+ .filter { it.name.startsWith(" $last /" ) && ! it.isDirectory }
108115 .forEach { entry ->
109- val targetFile = File (targetDirectory, entry.name.removePrefix(" defaults /" ))
116+ val targetFile = File (targetDirectory, entry.name.removePrefix(" $last /" ))
110117 targetFile.parentFile.mkdirs()
111118 try {
112119 jarFile.getInputStream(entry).use { inputStream ->
113120 FileOutputStream (targetFile).use { fos ->
114- fos.write(0xEF )
115- fos.write(0xBB )
116- fos.write(0xBF )
121+ if (writeBom) {
122+ fos.write(0xEF )
123+ fos.write(0xBB )
124+ fos.write(0xBF )
125+ }
117126 inputStream.copyTo(fos)
118127 }
119128 }
129+ filesProcessed++
130+ logger.debug(" Successfully extracted: ${entry.name} " )
120131 } catch (e: Exception ) {
121- logger.error(" Error copying file ${entry.name} : ${e.message} " )
132+ filesFailed++
133+ logger.error(" Error copying file ${entry.name} " )
122134 }
123135 }
136+
137+ logger.debug(" Processed $filesProcessed files from JAR ($filesFailed failed)" )
124138 }
125139 } catch (e: Exception ) {
126- logger.error(" Error processing JAR file: ${e.message} " )
127- e.printStackTrace()
140+ logger.error(" Error processing JAR file" )
128141 }
129142 }
130143
0 commit comments