Skip to content

Commit 9f9d38f

Browse files
authored
Merge pull request #24 from simplecloudapp/fix/directory-repository-resource-loading
fix: resource directory resource loading
2 parents 9a855c2 + f82afcb commit 9f9d38f

File tree

1 file changed

+41
-28
lines changed

1 file changed

+41
-28
lines changed

plugin-shared/src/main/kotlin/app/simplecloud/plugin/api/shared/config/repository/DirectoryRepository.kt

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)