package org.terasology.entitySystem.persistence; import com.google.protobuf.TextFormat; import org.terasology.entitySystem.EntityManager; import org.terasology.entitySystem.PersistableEntityManager; import org.terasology.protobuf.EntityData; import java.io.*; import java.util.logging.Level; import java.util.logging.Logger; /** * @author Immortius <immortius@gmail.com> */ public class WorldPersister { public enum SaveFormat { Binary { @Override void save(OutputStream out, EntityData.World world) throws IOException { world.writeTo(out); out.flush(); } @Override EntityData.World load(InputStream in) throws IOException { return EntityData.World.parseFrom(in); } }, Text { @Override void save(OutputStream out, EntityData.World world) throws IOException { BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out)); TextFormat.print(world, bufferedWriter); bufferedWriter.flush(); } @Override EntityData.World load(InputStream in) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); EntityData.World.Builder builder = EntityData.World.newBuilder(); TextFormat.merge(bufferedReader, builder); return builder.build(); } }, JSON { @Override void save(OutputStream out, EntityData.World world) throws IOException { BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out)); EntityDataJSONFormat.write(world, bufferedWriter); bufferedWriter.flush(); } @Override EntityData.World load(InputStream in) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); return EntityDataJSONFormat.readWorld(bufferedReader); } }; abstract void save(OutputStream out, EntityData.World world) throws IOException; abstract EntityData.World load(InputStream in) throws IOException; } private Logger logger = Logger.getLogger(getClass().getName()); private EntityManager entityManager; private EntityPersisterHelper persisterHelper; public WorldPersister(EntityManager entityManager) { this.entityManager = entityManager; this.persisterHelper = new EntityPersisterHelperImpl((PersistableEntityManager) entityManager); } public void save(File file, SaveFormat format) throws IOException { final EntityData.World world = persisterHelper.serializeWorld(); File parentFile = file.getParentFile(); if (parentFile != null) { parentFile.mkdirs(); } FileOutputStream out = new FileOutputStream(file); try { format.save(out, world); } finally { // JAVA7 : Replace with improved resource handling try { out.close(); } catch (IOException e) { logger.log(Level.SEVERE, "Failed to close file", e); } } } public void load(File file, SaveFormat format) throws IOException { entityManager.clear(); FileInputStream in = new FileInputStream(file); EntityData.World world = null; try { world = format.load(in); } finally { // JAVA7: Replace with improved resource handling try { in.close(); } catch (IOException e) { logger.log(Level.SEVERE, "Failed to close file", e); } } if (world != null) { persisterHelper.deserializeWorld(world); } } }