package net.ion.craken.node;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import net.ion.craken.listener.CDDHandler;
import net.ion.craken.listener.CDDModifiedEvent;
import net.ion.craken.listener.CDDRemovedEvent;
import net.ion.craken.node.crud.TestBaseCrud;
import net.ion.craken.node.crud.WriteChildren;
import net.ion.craken.node.crud.tree.impl.PropertyValue;
import net.ion.craken.node.crud.util.TransactionJobs;
import net.ion.framework.util.Debug;
public class TestSync extends TestBaseCrud {
public void testDefaultExecutorIsWithIn() throws Exception {
session.tran(TransactionJobs.HelloBleujin); // default exeutor is WithInExecutor
assertEquals(true, session.exists("/bleujin"));
}
public void testChange() throws Exception {
ExecutorService es = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
Debug.line(r + " rejected");
}
});
session.workspace().executorService(es);
session.tran(TransactionJobs.HelloBleujin); // default exeutor is WithInExecutor
assertEquals(false, session.exists("/bleujin"));
}
public void testIndex() throws Exception {
session.workspace().cddm().add(new ToNotiHandler());
session.tran(new TransactionJob<Void>() {
@Override
public Void handle(WriteSession wsession) throws Exception {
wsession.pathBy("/rooms/123/members/bleujin").property("name", "bleujin");
wsession.pathBy("/rooms/123/members/ryun").property("name", "ryunhee");
wsession.pathBy("/rooms/123/members/hero").property("name", "hero");
wsession.pathBy("/rooms/123/messages/abcdefg").property("content", "hello! everyone");
return null;
}
});
}
public void testTranSync() throws Exception {
session.workspace().cddm().add(new ToNotiHandler());
session.tran(new TransactionJob<Void>() {
@Override
public Void handle(WriteSession wsession) throws Exception {
wsession.pathBy("/rooms/123/members/bleujin").property("name", "bleujin");
wsession.pathBy("/rooms/123/members/ryun").property("name", "ryunhee");
wsession.pathBy("/rooms/123/members/hero").property("name", "hero");
wsession.pathBy("/rooms/123/messages/abcdefg").property("content", "hello! everyone");
return null;
}
});
assertEquals(true, session.exists("/rooms/123/members/bleujin/notify/abcdefg"));
assertEquals(true, session.exists("/rooms/123/members/ryun/notify/abcdefg"));
assertEquals(true, session.exists("/rooms/123/members/hero/notify/abcdefg"));
assertEquals("hello! everyone", session.pathBy("/rooms/123/members/hero/notify/abcdefg").ref("message").property("content").stringValue());
PropertyValue path = session.pathBy("/rooms/123/members/hero/notify/abcdefg").property("message");
session.pathBy("/rooms/123/members/hero/notify/abcdefg").toRows("message.content").debugPrint();
}
class ToNotiHandler implements CDDHandler {
@Override
public String pathPattern() {
return "/rooms/{roomId}/messages/{msgId}";
}
@Override
public TransactionJob<Void> modified(Map<String, String> resolveMap, CDDModifiedEvent event) {
final String roomId = resolveMap.get("roomId");
final String msgId = resolveMap.get("msgId");
return new TransactionJob<Void>() {
@Override
public Void handle(WriteSession wsession) throws Exception {
WriteChildren members = wsession.pathBy("/rooms/" + roomId + "/members").children();
for (WriteNode member : members) {
member.child("notify/" + msgId).refTo("message", "/rooms/" + roomId + "/messages/" + msgId);
}
return null;
}
};
}
@Override
public TransactionJob<Void> deleted(Map<String, String> resolveMap, CDDRemovedEvent event) {
return null;
}
}
}