package net.minecraft.server;
import com.destroystokyo.paper.exception.ServerInternalException;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.koloboke.collect.map.hash.HashObjObjMaps;
import com.koloboke.collect.map.hash.HashObjShortMaps;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
public class PersistentCollection {
private final IDataManager b;
protected Map<String, PersistentBase> a = HashObjObjMaps.newMutableMap();
public final List<PersistentBase> c = Lists.newArrayList(); // Spigot
private final Map<String, Short> d = HashObjShortMaps.newMutableMap();
public PersistentCollection(IDataManager idatamanager) {
this.b = idatamanager;
this.b();
}
@Nullable
public PersistentBase get(Class<? extends PersistentBase> oclass, String s) {
PersistentBase persistentbase = this.a.get(s);
if (persistentbase != null) {
return persistentbase;
} else {
if (this.b != null) {
try {
File file = this.b.getDataFile(s);
if (file != null && file.exists()) {
try {
persistentbase = oclass.getConstructor(new Class[] { String.class}).newInstance(new Object[] { s});
} catch (Exception exception) {
throw new RuntimeException("Failed to instantiate " + oclass, exception);
}
FileInputStream fileinputstream = new FileInputStream(file);
NBTTagCompound nbttagcompound = NBTCompressedStreamTools.a(fileinputstream);
fileinputstream.close();
persistentbase.a(nbttagcompound.getCompound("data"));
}
} catch (Exception exception1) {
exception1.printStackTrace();
ServerInternalException.reportInternalException(exception1); // Paper
}
}
if (persistentbase != null) {
this.a.put(s, persistentbase);
this.c.add(persistentbase);
}
return persistentbase;
}
}
public void a(String s, PersistentBase persistentbase) {
if (this.a.containsKey(s)) {
this.c.remove(this.a.remove(s));
}
this.a.put(s, persistentbase);
this.c.add(persistentbase);
}
public void a() {
for (int i = 0; i < this.c.size(); ++i) {
PersistentBase persistentbase = this.c.get(i);
if (persistentbase.d()) {
this.a(persistentbase);
persistentbase.a(false);
}
}
}
private void a(PersistentBase persistentbase) {
if (this.b != null) {
try {
File file = this.b.getDataFile(persistentbase.id);
if (file != null) {
NBTTagCompound nbttagcompound = new NBTTagCompound();
nbttagcompound.set("data", persistentbase.b(new NBTTagCompound()));
FileOutputStream fileoutputstream = new FileOutputStream(file);
NBTCompressedStreamTools.a(nbttagcompound, fileoutputstream);
fileoutputstream.close();
}
} catch (Exception exception) {
exception.printStackTrace();
ServerInternalException.reportInternalException(exception); // Paper
}
}
}
private void b() {
try {
this.d.clear();
if (this.b == null) {
return;
}
File file = this.b.getDataFile("idcounts");
if (file != null && file.exists()) {
DataInputStream datainputstream = new DataInputStream(new FileInputStream(file));
NBTTagCompound nbttagcompound = NBTCompressedStreamTools.a(datainputstream);
datainputstream.close();
Iterator iterator = nbttagcompound.c().iterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
NBTBase nbtbase = nbttagcompound.get(s);
if (nbtbase instanceof NBTTagShort) {
NBTTagShort nbttagshort = (NBTTagShort) nbtbase;
short short0 = nbttagshort.f();
this.d.put(s, Short.valueOf(short0));
}
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
public int a(String s) {
Short oshort = this.d.get(s);
if (oshort == null) {
oshort = Short.valueOf((short) 0);
} else {
oshort = Short.valueOf((short) (oshort.shortValue() + 1));
}
this.d.put(s, oshort);
if (this.b == null) {
return oshort.shortValue();
} else {
try {
File file = this.b.getDataFile("idcounts");
if (file != null) {
NBTTagCompound nbttagcompound = new NBTTagCompound();
Iterator iterator = this.d.keySet().iterator();
while (iterator.hasNext()) {
String s1 = (String) iterator.next();
nbttagcompound.setShort(s1, this.d.get(s1).shortValue());
}
DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file));
NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) dataoutputstream);
dataoutputstream.close();
}
} catch (Exception exception) {
exception.printStackTrace();
}
return oshort.shortValue();
}
}
}