view src/alice/jungle/codesegment/LogUpdateCodeSegment.java @ 52:61b2de3f7730

add HashSetDataSegment and HashLogUpdateCodeSegment. fix bugs
author one
date Sat, 13 Jul 2013 17:10:14 +0900
parents 9e782b4eb06e
children ccfe9b5e8f11
line wrap: on
line source

package alice.jungle.codesegment;

import java.io.IOException;

import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
import jungle.test.bbs.JungleManager;
import alice.codesegment.CodeSegment;
import alice.datasegment.CommandType;
import alice.datasegment.Receiver;
import alice.jungle.datasegment.HashSetDataSegment;
import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer;
import alice.jungle.transaction.NetworkDefaultJungleTreeEditor;

public class LogUpdateCodeSegment extends CodeSegment {
	
	Receiver parentLog = ids.create(CommandType.PEEK);
	Receiver host = ids.create(CommandType.PEEK);
	Receiver hashLog = ids.create(CommandType.PEEK);
	
	public LogUpdateCodeSegment() {
		parentLog.setKey("parent", "log");
		host.setKey("host");
		hashLog.setKey("hashLog");
	}
	
	public LogUpdateCodeSegment(int index) {
		parentLog.setKey("parent", "log", index);
		host.setKey("host");
		hashLog.setKey("hashLog");		
	}
	
	public void run() {
		System.out.println("--LogUpdateCodeSegment--");
		int index = parentLog.index;
		String h = host.asString();
		DefaultTreeOperationLogContainer container = parentLog.asClass(DefaultTreeOperationLogContainer.class);
		HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class);
		System.out.println(container.getHashLogString());
		if(ds.hash.contains(container.getHashLogString())) {
			ods.update("hashLog", ds);		
			new LogUpdateCodeSegment(index);
			return;
		}
		DefaultTreeOperationLog log = null;
		try {
			log = container.convert();
		} catch (IOException e) {
			e.printStackTrace();
		}
		String treeName = container.getTreeName();
		if (JungleManager.getJungle().getTreeByName(treeName) == null) {
			if(null == JungleManager.getJungle().createNewTree(treeName)){
				throw new IllegalStateException();
			}
		}
		JungleTree tree = JungleManager.getJungle().getTreeByName(treeName);
		JungleTreeEditor editor = tree.getTreeEditor();
		Either<Error, JungleTreeEditor> either = JungleManager.edit(editor, log);
		if(either.isA()) {
			throw new IllegalStateException();
		}
		editor = either.b();
		either = editor.success();
		if(either.isA()) {
			throw new IllegalStateException();			
		}
		ds.hash.add(container.getHashLogString());
		ods.update("hashLog", ds);		
		System.out.println("ods.put log container");
		ods.put("log", container);
		new LogUpdateCodeSegment(index);
	}
	
	private boolean updaterIsMe(String host, DefaultTreeOperationLogContainer container) {
		return host.equals(container.getServerName());
	}
}