AssetRef class
Пакет: com.hypixel.hytale.assetstore.map
Файл: com/hypixel/hytale/assetstore/map/DefaultAssetMap.java
Поля (3)
| Модификаторы | Тип | Имя |
|---|---|---|
|
protected final String |
pack |
|
protected final Path |
path |
|
protected T |
value |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.assetstore.map;
class="kw">import com.hypixel.fastutil.ints.Int2ObjectConcurrentHashMap;
class="kw">import com.hypixel.hytale.assetstore.AssetExtraInfo;
class="kw">import com.hypixel.hytale.assetstore.AssetMap;
class="kw">import com.hypixel.hytale.assetstore.JsonAsset;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetCodec;
class="kw">import it.unimi.dsi.fastutil.ints.IntIterator;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSets;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectSets;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collections;
class="kw">import java.util.HashSet;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.locks.StampedLock;
class="kw">import java.util.stream.Collectors;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class DefaultAssetMap<K, T class="kw">extends JsonAsset<K>> class="kw">extends AssetMap<K, T> {
class="kw">public class="kw">static class="kw">final DefaultAssetMap.AssetRef[] EMPTY_PAIR_ARRAY = new DefaultAssetMap.AssetRef[0];
class="kw">public class="kw">static class="kw">final String DEFAULT_PACK_KEY = "Hytale:Hytale";
class="kw">protected class="kw">final StampedLock assetMapLock = new StampedLock();
@Nonnull
class="kw">protected class="kw">final Map<K, T> assetMap;
class="kw">protected class="kw">final Map<K, DefaultAssetMap.AssetRef<T>[]> assetChainMap;
class="kw">protected class="kw">final Map<String, ObjectSet<K>> packAssetKeys = new ConcurrentHashMap<>();
class="kw">protected class="kw">final Map<Path, ObjectSet<K>> pathToKeyMap = new ConcurrentHashMap<>();
class="kw">protected class="kw">final Map<K, ObjectSet<K>> assetChildren;
class="kw">protected class="kw">final Int2ObjectConcurrentHashMap<Set<K>> tagStorage = new Int2ObjectConcurrentHashMap<>();
class="kw">protected class="kw">final Int2ObjectConcurrentHashMap<Set<K>> unmodifiableTagStorage = new Int2ObjectConcurrentHashMap<>();
class="kw">protected class="kw">final IntSet unmodifiableTagKeys = IntSets.unmodifiable(this.tagStorage.keySet());
class="kw">public DefaultAssetMap() {
this.assetMap = new Object2ObjectOpenCustomHashMap(CaseInsensitiveHashStrategy.getInstance());
this.assetChainMap = new Object2ObjectOpenCustomHashMap(CaseInsensitiveHashStrategy.getInstance());
this.assetChildren = new Object2ObjectOpenCustomHashMap(CaseInsensitiveHashStrategy.getInstance());
}
class="kw">public DefaultAssetMap(@Nonnull Map<K, T> var1) {
this.assetMap = var1;
this.assetChainMap = new Object2ObjectOpenCustomHashMap(CaseInsensitiveHashStrategy.getInstance());
this.assetChildren = new Object2ObjectOpenCustomHashMap(CaseInsensitiveHashStrategy.getInstance());
}
@Nullable
@Override
class="kw">public T getAsset(K var1) {
long var2 = this.assetMapLock.tryOptimisticRead();
JsonAsset var4 = this.assetMap.get(var1);
if (this.assetMapLock.validate(var2)) {
class="kw">return var4;
}
var2 = this.assetMapLock.readLock();
try {
class="kw">return this.assetMap.get(var1);
} class="kw">finally {
this.assetMapLock.unlockRead(var2);
}
}
@Nullable
@Override
class="kw">public T getAsset(@Nonnull String var1, K var2) {
long var3 = this.assetMapLock.tryOptimisticRead();
JsonAsset var5 = this.getAssetForPack0(var1, var2);
if (this.assetMapLock.validate(var3)) {
class="kw">return var5;
}
var3 = this.assetMapLock.readLock();
try {
class="kw">return this.getAssetForPack0(var1, var2);
} class="kw">finally {
this.assetMapLock.unlockRead(var3);
}
}
class="kw">private T getAssetForPack0(@Nonnull String var1, K var2) {
DefaultAssetMap.AssetRef[] var3 = this.assetChainMap.get(var2);
if (var3 == null) {
class="kw">return null;
}
for (int var4 = 0; var4 < var3.length; var4++) {
DefaultAssetMap.AssetRef var5 = var3[var4];
if (Objects.equals(var5.pack, var1)) {
if (var4 == 0) {
class="kw">return null;
}
class="kw">return var3[var4 - 1].value;
}
}
class="kw">return this.assetMap.get(var2);
}
@Nullable
@Override
class="kw">public Path getPath(K var1) {
long var2 = this.assetMapLock.tryOptimisticRead();
Path var4 = this.getPath0(var1);
if (this.assetMapLock.validate(var2)) {
class="kw">return var4;
}
var2 = this.assetMapLock.readLock();
try {
class="kw">return this.getPath0(var1);
} class="kw">finally {
this.assetMapLock.unlockRead(var2);
}
}
@Nullable
@Override
class="kw">public String getAssetPack(K var1) {
long var2 = this.assetMapLock.tryOptimisticRead();
String var4 = this.getAssetPack0(var1);
if (this.assetMapLock.validate(var2)) {
class="kw">return var4;
}
var2 = this.assetMapLock.readLock();
try {
class="kw">return this.getAssetPack0(var1);
} class="kw">finally {
this.assetMapLock.unlockRead(var2);
}
}
@Nullable
class="kw">private Path getPath0(K var1) {
DefaultAssetMap.AssetRef var2 = this.getAssetRef(var1);
class="kw">return var2 != null ? var2.path : null;
}
@Nullable
class="kw">private String getAssetPack0(K var1) {
DefaultAssetMap.AssetRef var2 = this.getAssetRef(var1);
class="kw">return var2 != null ? var2.pack : null;
}
@Nullable
class="kw">private DefaultAssetMap.AssetRef<T> getAssetRef(K var1) {
DefaultAssetMap.AssetRef[] var2 = this.assetChainMap.get(var1);
class="kw">return var2 == null ? null : var2[var2.length - 1];
}
@Override
class="kw">public Set<K> getKeys(@Nonnull Path var1) {
ObjectSet var2 = this.pathToKeyMap.get(var1);
class="kw">return var2 == null ? ObjectSets.emptySet() : ObjectSets.unmodifiable(var2);
}
@Override
class="kw">public Set<K> getChildren(K var1) {
long var2 = this.assetMapLock.tryOptimisticRead();
ObjectSet var4 = this.assetChildren.get(var1);
Set var5 = var4 == null ? ObjectSets.emptySet() : ObjectSets.unmodifiable(var4);
if (this.assetMapLock.validate(var2)) {
class="kw">return var5;
}
var2 = this.assetMapLock.readLock();
try {
var4 = this.assetChildren.get(var1);
class="kw">return var4 == null ? ObjectSets.emptySet() : ObjectSets.unmodifiable(var4);
} class="kw">finally {
this.assetMapLock.unlockRead(var2);
}
}
@Override
class="kw">public int getAssetCount() {
class="kw">return this.assetMap.size();
}
@Nonnull
@Override
class="kw">public Map<K, T> getAssetMap() {
class="kw">return Collections.unmodifiableMap(this.assetMap);
}
@Nonnull
@Override
class="kw">public Map<K, Path> getPathMap(@Nonnull String var1) {
long var2 = this.assetMapLock.readLock();
try {
class="kw">return this.assetChainMap
.entrySet()
.stream()
.map(var1x -> Map.entry(var1x.getKey(), Arrays.stream(var1x.getValue()).filter(var1xx -> Objects.equals(var1xx.pack, var1)).findFirst()))
.filter(var0 -> var0.getValue().isPresent())
.filter(var0 -> var0.getValue().get().path != null)
.collect(Collectors.toMap(Entry::getKey, var0 -> var0.getValue().get().path));
} class="kw">finally {
this.assetMapLock.unlockRead(var2);
}
}
@Override
class="kw">public Set<K> getKeysForTag(int var1) {
class="kw">return this.unmodifiableTagStorage.getOrDefault(var1, ObjectSets.emptySet());
}
@Nonnull
@Override
class="kw">public IntSet getTagIndexes() {
class="kw">return this.unmodifiableTagKeys;
}
@Override
class="kw">public int getTagCount() {
class="kw">return this.tagStorage.size();
}
@Override
class="kw">protected void clear() {
long var1 = this.assetMapLock.writeLock();
try {
this.assetChildren.clear();
this.assetChainMap.clear();
this.pathToKeyMap.clear();
this.assetMap.clear();
this.tagStorage.clear();
this.unmodifiableTagStorage.clear();
} class="kw">finally {
this.assetMapLock.unlockWrite(var1);
}
}
@Override
class="kw">protected void putAll(
@Nonnull String var1, @Nonnull AssetCodec<K, T> var2, @Nonnull Map<K, T> var3, @Nonnull Map<K, Path> var4, @Nonnull Map<K, Set<K>> var5
) {
long var6 = this.assetMapLock.writeLock();
try {
for (Entry var9 : var5.entrySet()) {
this.assetChildren.computeIfAbsent(var9.getKey(), var0 -> new ObjectOpenHashSet(3)).addAll(var9.getValue());
}
for (Entry var22 : var4.entrySet()) {
this.pathToKeyMap.computeIfAbsent(var22.getValue(), var0 -> new ObjectOpenHashSet(1)).add(var22.getKey());
}
for (Entry var23 : var3.entrySet()) {
Object var10 = var23.getKey();
this.packAssetKeys.computeIfAbsent(var1, var0 -> new ObjectOpenHashSet()).add(var10);
DefaultAssetMap.AssetRef[] var11 = this.assetChainMap.get(var10);
if (var11 == null) {
var11 = EMPTY_PAIR_ARRAY;
}
boolean var12 = false;
DefaultAssetMap.AssetRef[] var13 = var11;
int var14 = var13.length;
int var15 = 0;
while (true) {
if (var15 < var14) {
DefaultAssetMap.AssetRef var16 = var13[var15];
if (!Objects.equals(var16.pack, var1)) {
var15++;
class="kw">continue;
}
var16.value = var23.getValue();
var12 = true;
}
if (!var12) {
var11 = Arrays.copyOf(var11, var11.length + 1);
var11[var11.length - 1] = new DefaultAssetMap.AssetRef<>(var1, var4.get(var23.getKey()), var23.getValue());
this.assetChainMap.put(var10, var11);
}
JsonAsset var24 = var11[var11.length - 1].value;
this.assetMap.put(var10, var24);
break;
}
}
} class="kw">finally {
this.assetMapLock.unlockWrite(var6);
}
this.putAssetTags(var2, var3);
}
class="kw">protected void putAssetTags(@Nonnull AssetCodec<K, T> var1, @Nonnull Map<K, T> var2) {
for (Entry var4 : var2.entrySet()) {
AssetExtraInfo.Data var5 = var1.getData(var4.getValue());
if (var5 != null) {
Object var6 = var4.getKey();
IntIterator var7 = var5.getExpandedTagIndexes().iterator();
while (var7.hasNext()) {
int var8 = var7.nextInt();
this.putAssetTag(var6, var8);
}
}
}
}
class="kw">protected void putAssetTag(K var1, int var2) {
this.tagStorage.computeIfAbsent(var2, var1x -> {
ObjectOpenHashSet var2 = new ObjectOpenHashSet(3);
this.unmodifiableTagStorage.put(var1x, ObjectSets.unmodifiable(var2));
class="kw">return var2;
}).add(var1);
}
@Override
class="kw">public Set<K> getKeysForPack(@Nonnull String var1) {
class="kw">return (Set<K>)this.packAssetKeys.get(var1);
}
@Override
class="kw">protected Set<K> remove(@Nonnull Set<K> var1) {
long var2 = this.assetMapLock.writeLock();
try {
Set var4 = new HashSet<>();
for (Object var6 : var1) {
DefaultAssetMap.AssetRef[] var7 = this.assetChainMap.remove(var6);
if (var7 != null) {
DefaultAssetMap.AssetRef var8 = var7[var7.length - 1];
if (var8.path != null) {
this.pathToKeyMap.computeIfPresent(var8.path, (var1x, var2x) -> {
var2x.remove(var6);
class="kw">return var2x.isEmpty() ? null : var2x;
});
}
this.assetMap.remove(var6);
for (DefaultAssetMap.AssetRef var12 : var7) {
this.packAssetKeys.get(Objects.requireNonNullElse(var12.pack, "Hytale:Hytale")).remove(var6);
}
for (ObjectSet var18 : this.assetChildren.values()) {
var18.remove(var6);
}
ObjectSet var17 = this.assetChildren.remove(var6);
if (var17 != null) {
var4.addAll(var17);
}
}
}
this.tagStorage.forEach((var0, var1x, var2x) -> var1x.removeAll(var2x), var1);
var4.removeAll(var1);
class="kw">return var4;
} class="kw">finally {
this.assetMapLock.unlockWrite(var2);
}
}
@Override
class="kw">protected Set<K> remove(@Nonnull String var1, @Nonnull Set<K> var2, @Nonnull List<Entry<String, Object>> var3) {
long var4 = this.assetMapLock.writeLock();
try {
Set var6 = new HashSet<>();
ObjectSet var7 = this.packAssetKeys.get(Objects.requireNonNullElse(var1, "Hytale:Hytale"));
if (var7 == null) {
class="kw">return Collections.emptySet();
}
Iterator var8 = var2.iterator();
while (var8.hasNext()) {
Object var9 = var8.next();
var7.remove(var9);
DefaultAssetMap.AssetRef[] var10 = this.assetChainMap.remove(var9);
if (var10 != null) {
if (var10.length == 1) {
DefaultAssetMap.AssetRef var18 = var10[0];
if (!Objects.equals(var18.pack, var1)) {
var8.remove();
this.assetChainMap.put(var9, var10);
} else {
if (var18.path != null) {
this.pathToKeyMap.computeIfPresent(var18.path, (var1x, var2x) -> {
var2x.remove(var9);
class="kw">return var2x.isEmpty() ? null : var2x;
});
}
this.assetMap.remove(var9);
for (ObjectSet var22 : this.assetChildren.values()) {
var22.remove(var9);
}
ObjectSet var20 = this.assetChildren.remove(var9);
if (var20 != null) {
var6.addAll(var20);
}
}
} else {
var8.remove();
DefaultAssetMap.AssetRef[] var11 = new DefaultAssetMap.AssetRef[var10.length - 1];
int var12 = 0;
for (int var13 = 0; var13 < var10.length; var13++) {
DefaultAssetMap.AssetRef var14 = var10[var13];
if (Objects.equals(var14.pack, var1)) {
if (var14.path != null) {
this.pathToKeyMap.computeIfPresent(var14.path, (var1x, var2x) -> {
var2x.remove(var9);
class="kw">return var2x.isEmpty() ? null : var2x;
});
}
} else {
var11[var12++] = var14;
if (var14.path != null) {
var3.add(Map.entry(var14.pack, var14.path));
} else {
var3.add(Map.entry(var14.pack, var14.value));
}
}
}
this.assetChainMap.put(var9, var11);
DefaultAssetMap.AssetRef var21 = var11[var11.length - 1];
this.assetMap.put(var9, var21.value);
if (var21.path != null) {
this.pathToKeyMap.computeIfAbsent(var21.path, var0 -> new ObjectOpenHashSet(1)).add(var9);
}
}
}
}
this.tagStorage.forEach((var0, var1x, var2x) -> var1x.removeAll(var2x), var2);
var6.removeAll(var2);
class="kw">return var6;
} class="kw">finally {
this.assetMapLock.unlockWrite(var4);
}
}
class="kw">protected class="kw">static class AssetRef<T> {
class="kw">protected class="kw">final String pack;
class="kw">protected class="kw">final Path path;
class="kw">protected T value;
class="kw">protected AssetRef(String var1, Path var2, T var3) {
this.pack = var1;
this.path = var2;
this.value = var3;
}
}
}