Skip to content

Commit b769ff4

Browse files
committed
Protects name collision.
1 parent f2ef615 commit b769ff4

File tree

17 files changed

+104
-39
lines changed

17 files changed

+104
-39
lines changed
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package kr.toxicity.hud.background
22

3+
import kr.toxicity.hud.configuration.HudConfiguration
34
import kr.toxicity.hud.image.ImageLocation
45
import kr.toxicity.hud.image.LoadedImage
56

67
class HudBackground(
8+
override val path: String,
79
val name: String,
810

911
val left: LoadedImage,
1012
val right: LoadedImage,
1113
val body: LoadedImage,
1214

1315
val location: ImageLocation,
14-
)
16+
): HudConfiguration
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package kr.toxicity.hud.configuration
2+
3+
interface HudConfiguration {
4+
val path: String
5+
}

dist/src/main/kotlin/kr/toxicity/hud/hud/HudImpl.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kr.toxicity.hud.api.component.WidthComponent
66
import kr.toxicity.hud.api.hud.Hud
77
import kr.toxicity.hud.api.player.HudPlayer
88
import kr.toxicity.hud.api.update.UpdateEvent
9+
import kr.toxicity.hud.configuration.HudConfiguration
910
import kr.toxicity.hud.image.ImageLocation
1011
import kr.toxicity.hud.layout.LayoutAnimationType
1112
import kr.toxicity.hud.manager.ConfigManager
@@ -18,7 +19,12 @@ import kr.toxicity.hud.util.*
1819
import net.kyori.adventure.key.Key
1920
import org.bukkit.configuration.ConfigurationSection
2021

21-
class HudImpl(private val internalName: String, file: List<String>, section: ConfigurationSection) : Hud {
22+
class HudImpl(
23+
override val path: String,
24+
private val internalName: String,
25+
file: List<String>,
26+
section: ConfigurationSection
27+
): Hud, HudConfiguration {
2228
companion object {
2329
const val DEFAULT_BIT = 13
2430
const val MAX_BIT = 23 - DEFAULT_BIT

dist/src/main/kotlin/kr/toxicity/hud/image/HudImage.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package kr.toxicity.hud.image
22

3+
import kr.toxicity.hud.configuration.HudConfiguration
34
import kr.toxicity.hud.manager.ListenerManagerImpl
45
import kr.toxicity.hud.util.toConditions
56
import org.bukkit.configuration.ConfigurationSection
67

78
class HudImage(
9+
override val path: String,
810
val name: String,
911
val image: List<NamedLoadedImage>,
1012
val type: ImageType,
1113
setting: ConfigurationSection
12-
) {
14+
): HudConfiguration {
1315
val conditions = setting.toConditions()
1416
val listener = setting.getConfigurationSection("listener")?.let {
1517
ListenerManagerImpl.getListener(it)

dist/src/main/kotlin/kr/toxicity/hud/layout/LayoutGroup.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package kr.toxicity.hud.layout
22

3+
import kr.toxicity.hud.configuration.HudConfiguration
34
import kr.toxicity.hud.equation.AnimationLocation
45
import kr.toxicity.hud.equation.TEquation
56
import kr.toxicity.hud.image.ImageLocation
@@ -9,7 +10,10 @@ import net.kyori.adventure.text.format.NamedTextColor
910
import org.bukkit.configuration.ConfigurationSection
1011
import java.text.DecimalFormat
1112

12-
class LayoutGroup(section: ConfigurationSection) {
13+
class LayoutGroup(
14+
override val path: String,
15+
section: ConfigurationSection
16+
): HudConfiguration {
1317

1418
private val loc = ImageLocation(section)
1519

dist/src/main/kotlin/kr/toxicity/hud/manager/BackgroundManager.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ object BackgroundManager: BetterHudManager {
4343
image.toByteArray()
4444
}
4545
}
46-
backgroundMap.putSync(name) {
46+
backgroundMap.putSync("background", name) {
4747
HudBackground(
48+
it.path,
4849
name,
4950
getImage("left"),
5051
getImage("right"),

dist/src/main/kotlin/kr/toxicity/hud/manager/HudManagerImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ object HudManagerImpl: BetterHudManager, HudManager {
2424
}
2525
DATA_FOLDER.subFolder("huds").forEachAllYamlAsync({ file, s, configurationSection ->
2626
runCatching {
27-
hudMap.putSync(s) {
28-
HudImpl(s, hudFolder, configurationSection)
27+
hudMap.putSync("hud", s) {
28+
HudImpl(file.path, s, hudFolder, configurationSection)
2929
}
3030
}.onFailure { e ->
3131
warn("Unable to load this hud: $s in ${file.name}")

dist/src/main/kotlin/kr/toxicity/hud/manager/ImageManager.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ object ImageManager: BetterHudManager {
3333
val image = when (val type = ImageType.valueOf(configurationSection.getString("type").ifNull("type value not set.").uppercase())) {
3434
ImageType.SINGLE -> {
3535
HudImage(
36+
file.path,
3637
s,
3738
listOf(NamedLoadedImage(
3839
"$s.png",
@@ -52,6 +53,7 @@ object ImageManager: BetterHudManager {
5253
}.getOrNull()
5354
} ?: SplitType.LEFT)
5455
HudImage(
56+
file.path,
5557
s,
5658
splitType.split(s, File(assets, configurationSection.getString("file").ifNull("file value not set."))
5759
.toImage()
@@ -63,6 +65,7 @@ object ImageManager: BetterHudManager {
6365
}
6466
ImageType.SEQUENCE -> {
6567
HudImage(
68+
file.path,
6669
s,
6770
configurationSection.getStringList("files").ifEmpty {
6871
warn("files is empty.")
@@ -79,7 +82,7 @@ object ImageManager: BetterHudManager {
7982
)
8083
}
8184
}
82-
imageMap.putSync(s) {
85+
imageMap.putSync("image", s) {
8386
image
8487
}
8588
}.onFailure { e ->

dist/src/main/kotlin/kr/toxicity/hud/manager/LayoutManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ object LayoutManager: BetterHudManager {
2323
}
2424
DATA_FOLDER.subFolder("layouts").forEachAllYamlAsync({ file, s, configurationSection ->
2525
runCatching {
26-
layoutMap.putSync(s) {
27-
LayoutGroup(configurationSection)
26+
layoutMap.putSync("layout", s) {
27+
LayoutGroup(file.path, configurationSection)
2828
}
2929
}.onFailure { e ->
3030
warn("Unable to load this layout: $s in ${file.name}")

dist/src/main/kotlin/kr/toxicity/hud/manager/PlayerHeadManager.kt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,21 @@ object PlayerHeadManager: BetterHudManager {
4545
}
4646
DATA_FOLDER.subFolder("heads").forEachAllYamlAsync({ file, s, configurationSection ->
4747
runCatching {
48-
val head = HudHead(s , configurationSection)
49-
val pixel = head.pixel
50-
val targetFile = ArrayList(saveLocation).apply {
51-
add("pixel_$pixel.png")
52-
}
53-
PackGenerator.addTask(targetFile) {
54-
BufferedImage(pixel, pixel, BufferedImage.TYPE_INT_ARGB).apply {
55-
createGraphics().run {
56-
color = Color.WHITE
57-
fillRect(0, 0, pixel, pixel)
58-
dispose()
59-
}
60-
}.toByteArray()
61-
}
62-
headMap.putSync(head.name) {
48+
headMap.putSync("head", s) {
49+
val head = HudHead(file.path, s, configurationSection)
50+
val pixel = head.pixel
51+
val targetFile = ArrayList(saveLocation).apply {
52+
add("pixel_$pixel.png")
53+
}
54+
PackGenerator.addTask(targetFile) {
55+
BufferedImage(pixel, pixel, BufferedImage.TYPE_INT_ARGB).apply {
56+
createGraphics().run {
57+
color = Color.WHITE
58+
fillRect(0, 0, pixel, pixel)
59+
dispose()
60+
}
61+
}.toByteArray()
62+
}
6363
head
6464
}
6565
}.onFailure { e ->

dist/src/main/kotlin/kr/toxicity/hud/manager/PopupManagerImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ object PopupManagerImpl: BetterHudManager, PopupManager {
2222
}
2323
DATA_FOLDER.subFolder("popups").forEachAllYamlAsync({ file, s, configurationSection ->
2424
runCatching {
25-
popupMap.putSync(s) {
26-
PopupImpl(save, s, configurationSection)
25+
popupMap.putSync("popup", s) {
26+
PopupImpl(file.path, save, s, configurationSection)
2727
}
2828
}.onFailure { e ->
2929
warn("Unable to load this popup: $s in ${file.name}")

dist/src/main/kotlin/kr/toxicity/hud/manager/TextManager.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ object TextManager: BetterHudManager {
6868
Font.createFont(Font.TRUETYPE_FONT, it)
6969
} ?: BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics().font).deriveFont(scale.toFloat())
7070
val saveName = "${fontTarget?.nameWithoutExtension ?: s}_$scale"
71-
textMap.putSync(s) {
72-
parseFont(s, saveName, fontFile, scale, globalSaveFolder, HashMap<String, LocatedImage>().apply {
71+
textMap.putSync("text", s) {
72+
parseFont(file.path, s, saveName, fontFile, scale, globalSaveFolder, HashMap<String, LocatedImage>().apply {
7373
section.getConfigurationSection("images")?.forEachSubConfiguration { key, configurationSection ->
7474
put(key, LocatedImage(
7575
File(assetsFolder, configurationSection.getString("name").ifNull("image does not set: $key"))
@@ -111,7 +111,7 @@ object TextManager: BetterHudManager {
111111
}
112112
}.getOrNull() else null) ?: BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics().font
113113
}.deriveFont(configScale.toFloat())
114-
val parseDefault = parseFont("default", "default", defaultFont, configScale, ArrayList(resource.textures).apply {
114+
val parseDefault = parseFont("", "default", "default", defaultFont, configScale, ArrayList(resource.textures).apply {
115115
add("font")
116116
}, emptyMap(), ConditionBuilder.alwaysTrue, fontConfig.getBoolean("merge-default-bitmap", true))
117117
val heightMultiply = configHeight.toDouble() / parseDefault.height.toDouble()
@@ -181,6 +181,7 @@ object TextManager: BetterHudManager {
181181
}
182182

183183
private fun parseFont(
184+
path: String,
184185
s: String,
185186
saveName: String,
186187
fontFile: Font,
@@ -263,7 +264,7 @@ object TextManager: BetterHudManager {
263264
}
264265
}
265266
}
266-
return HudText(s, saveName, height, textList, images, charWidthMap, condition)
267+
return HudText(path, s, saveName, height, textList, images, charWidthMap, condition)
267268
}
268269

269270
override fun end() {

dist/src/main/kotlin/kr/toxicity/hud/pack/PackGenerator.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import java.util.zip.ZipOutputStream
1616

1717
object PackGenerator {
1818
private val tasks = TreeMap<String, PackFile>()
19+
1920
@Volatile
2021
private var beforeByte = 0L
2122
private val decimal = DecimalFormat("#,###.###")
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package kr.toxicity.hud.player
22

3+
import kr.toxicity.hud.configuration.HudConfiguration
34
import kr.toxicity.hud.util.toConditions
45
import org.bukkit.configuration.ConfigurationSection
56

6-
class HudHead(val name: String, section: ConfigurationSection) {
7+
class HudHead(
8+
override val path: String,
9+
val name: String,
10+
section: ConfigurationSection
11+
): HudConfiguration {
712
val pixel = section.getInt("pixel", 1).coerceAtLeast(1)
813
val conditions = section.toConditions()
914
}

dist/src/main/kotlin/kr/toxicity/hud/popup/PopupImpl.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kr.toxicity.hud.api.popup.Popup
66
import kr.toxicity.hud.api.popup.PopupSortType
77
import kr.toxicity.hud.api.popup.PopupUpdater
88
import kr.toxicity.hud.api.update.UpdateEvent
9+
import kr.toxicity.hud.configuration.HudConfiguration
910
import kr.toxicity.hud.equation.EquationPairLocation
1011
import kr.toxicity.hud.image.ImageLocation
1112
import kr.toxicity.hud.manager.*
@@ -16,10 +17,11 @@ import java.util.*
1617
import kotlin.collections.ArrayList
1718

1819
class PopupImpl(
20+
override val path: String,
1921
file: List<String>,
2022
val internalName: String,
2123
section: ConfigurationSection
22-
): Popup {
24+
): Popup, HudConfiguration {
2325
val gui = GuiLocation(section)
2426
val move = section.getConfigurationSection("move")?.let {
2527
EquationPairLocation(it)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package kr.toxicity.hud.text
22

3+
import kr.toxicity.hud.configuration.HudConfiguration
34
import kr.toxicity.hud.image.LocatedImage
45
import kr.toxicity.hud.placeholder.ConditionBuilder
56

67
class HudText(
8+
override val path: String,
79
val name: String,
810
val fontName: String,
911
val height: Int,
1012
val array: List<HudTextArray>,
1113
val images: Map<String, LocatedImage>,
1214
val charWidth: Map<Char, Int>,
1315
val conditions: ConditionBuilder
14-
)
16+
): HudConfiguration
Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,39 @@
11
package kr.toxicity.hud.util
22

3-
fun <K, V> MutableMap<K, V>.putSync(k: K, v: () -> V) {
4-
val get = v()
5-
synchronized(this) {
6-
put(k, get)
3+
import kr.toxicity.hud.configuration.HudConfiguration
4+
import java.util.Collections
5+
import java.util.HashSet
6+
import java.util.concurrent.ConcurrentHashMap
7+
8+
private val CACHE_MAP = ConcurrentHashMap<String, MutableSet<String>>()
9+
10+
private fun getCache(name: String) = CACHE_MAP.computeIfAbsent(name) {
11+
Collections.synchronizedSet(HashSet())
12+
}
13+
14+
fun <V: HudConfiguration> MutableMap<String, V>.putSync(name: String, k: String, v: () -> V) {
15+
val cache = getCache(name)
16+
fun warn() = warn("Name collision found: $k in $name")
17+
fun remove() {
18+
cache.remove(k)
19+
if (cache.isEmpty()) CACHE_MAP.remove(name)
20+
}
21+
if (!cache.add(k)) return warn()
22+
runCatching {
23+
synchronized(this) {
24+
get(k)
25+
}?.let {
26+
warn()
27+
return remove()
28+
}
29+
val get = v()
30+
synchronized(this) {
31+
putIfAbsent(k, get)?.let {
32+
warn("Error has been occurred: ${it.path} and ${get.path}")
33+
}
34+
remove()
35+
}
36+
}.onFailure {
37+
remove()
738
}
8-
}
39+
}

0 commit comments

Comments
 (0)