Reworked AssetRepository to link every Asset to a UUID

UUIDs are now being stored in the Replay File and loaded
This commit is contained in:
CrushedPixel
2015-07-07 20:14:40 +02:00
parent 40acb3f72d
commit 89cc6938f8
5 changed files with 97 additions and 25 deletions

View File

@@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.assets;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.ReplayFile;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.ArrayUtils;
@@ -10,46 +11,79 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class AssetRepository {
private List<ReplayAsset> replayAssets;
private Map<UUID, ReplayAsset> replayAssets;
public AssetRepository() {
replayAssets = new ArrayList<ReplayAsset>();
replayAssets = new HashMap<UUID, ReplayAsset>();
}
public ReplayAsset addAsset(String assetFileName, InputStream inputStream) throws IOException {
return addAsset(assetFileName, inputStream, null);
}
public ReplayAsset addAsset(String assetFileName, InputStream inputStream, UUID uuid) throws IOException {
if(uuid == null) {
uuid = UUID.randomUUID();
} else {
assetFileName = assetFileName.replace(uuid.toString()+"_", "");
}
ReplayAsset asset = assetFromFileName(assetFileName);
asset.loadFromStream(inputStream);
replayAssets.add(asset);
replayAssets.put(uuid, asset);
return asset;
}
public void removeAsset(ReplayAsset asset) {
replayAssets.remove(asset);
for(Map.Entry<UUID, ReplayAsset> e :
new HashSet<Map.Entry<UUID, ReplayAsset>>(replayAssets.entrySet()))
if(e.getValue().equals(asset))
replayAssets.remove(e.getKey());
}
public void saveAssets() {
for(ReplayAsset asset : replayAssets) {
try {
String filepath = ReplayFile.ENTRY_ASSET_FOLDER + asset.getDisplayString() + "." + asset.getSavedFileExtension();
try {
ReplayFile replayFile = new ReplayFile(ReplayHandler.getReplayFile());
File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension());
FileOutputStream fos = new FileOutputStream(toAdd);
asset.writeToStream(fos);
ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile());
} catch(IOException e) {
e.printStackTrace();
Enumeration<ZipArchiveEntry> entries = replayFile.getEntries();
while(entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
if(entry.getName().startsWith(ReplayFile.ENTRY_ASSET_FOLDER)) {
ReplayMod.replayFileAppender.registerModifiedFile(null, entry.getName(), ReplayHandler.getReplayFile());
}
}
}
replayFile.close();
ReplayMod.replayFileAppender.deleteAllFilesByFolder(ReplayFile.ENTRY_ASSET_FOLDER, ReplayHandler.getReplayFile());
for(Map.Entry<UUID, ReplayAsset> e : replayAssets.entrySet()) {
UUID uuid = e.getKey();
ReplayAsset asset = e.getValue();
try {
String filepath = ReplayFile.ENTRY_ASSET_FOLDER + uuid.toString()+ "_" + asset.getDisplayString() + "." + asset.getSavedFileExtension();
File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension());
FileOutputStream fos = new FileOutputStream(toAdd);
asset.writeToStream(fos);
ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile());
} catch(IOException io) {
io.printStackTrace();
}
}
} catch(IOException e) {
e.printStackTrace();
}
}
public static ReplayAsset assetFromFileName(String filename) {
@@ -63,6 +97,8 @@ public class AssetRepository {
throw new UnsupportedOperationException("Can't create ReplayAsset from File "+filename);
}
public List<ReplayAsset> getCopyOfReplayAssets() {
return new ArrayList<ReplayAsset>(replayAssets.values());
}
}