view src/alice/jungle/persistence/NetworkJournal.java @ 83:b3ccefdf2b43

Added PersistentExample
author one
date Fri, 25 Oct 2013 18:44:29 +0900
parents b9dd8ec0e66e
children 82d1d3dac7bc
line wrap: on
line source

package alice.jungle.persistence;

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;

import org.msgpack.MessagePack;

import alice.jungle.operations.NetworkTreeOperationLog;

import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;

public class NetworkJournal  implements Journal {
	
	private static final NetworkChangeListWriter WRITER = new NetworkChangeListWriter();
	private static final NetworkChangeListReader READER = new NetworkChangeListReader();
	private static MessagePack msgpack = new MessagePack();
	private static OutputStream out = null;
	private static InputStream in = null;
	
	public NetworkJournal() {
		
	}
	
	public NetworkJournal(File file) throws FileNotFoundException {
		out = new FileOutputStream(file, true);
		in = new FileInputStream(file);
	}
	
	@Override
	public ChangeListReader getReader() {
		return READER;
	}
	@Override
	public ChangeListWriter getWriter() {
		return WRITER;
	}
	
	public void close() throws IOException {
		out.close();
		in.close();
	}
	
	public void setOutputStream(OutputStream _out) {
		out = _out;
	}
	
	public OutputStream getOutputStream() {
		return out;
	}
	
	public void setInputStream(InputStream _in) {
		in = _in;
	}
	
	public InputStream getInputStream() {
		return in;
	}
	
	private static class NetworkChangeListWriter implements ChangeListWriter
	{
		@Override
		public Result write(ChangeList _operations)
		{
			NetworkTreeOperationLog log = new NetworkTreeOperationLog(_operations);
			try {
				msgpack.write(out, log);
				out.flush();
			} catch (IOException e) {
				return null;
			}
			return Result.SUCCESS;
		}
	}
	
	public MessagePack getMessagePack() {
		return msgpack;
	}

	private static class NetworkChangeListReader implements ChangeListReader
	{
		
		
		@Override
		public ChangeListReader newReader()
		{
			return this;
		}
		
		@Override 
		public ChangeList read()
		{
			try {
				final NetworkTreeOperationLog readLog = msgpack.read(in, NetworkTreeOperationLog.class);
				ChangeList cl = new ChangeList() {
					@Override
					public Iterator<TreeOperation> iterator() {
						return readLog.iterator();
					}
				};
				return cl;
			} catch (EOFException e){
//				e.printStackTrace();
			} catch (IOException e) {
//				e.printStackTrace();
			}
			return null;
		}

	}
}