package net.ion.craken.node.crud;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import junit.framework.TestCase;
import net.ion.craken.listener.AsyncCDDModifyHandler;
import net.ion.craken.listener.CDDHandler;
import net.ion.craken.listener.CDDModifiedEvent;
import net.ion.craken.listener.CDDModifyHandler;
import net.ion.craken.listener.CDDRemovedEvent;
import net.ion.craken.node.ReadSession;
import net.ion.craken.node.TransactionJob;
import net.ion.craken.node.Workspace;
import net.ion.craken.node.WriteSession;
import net.ion.craken.node.crud.store.WorkspaceConfigBuilder;
import net.ion.craken.node.crud.tree.impl.GridBlob;
import net.ion.craken.node.crud.tree.impl.PropertyId;
import net.ion.craken.node.crud.tree.impl.PropertyValue;
import net.ion.craken.util.StringInputStream;
import net.ion.framework.util.Debug;
import net.ion.framework.util.IOUtil;
import net.ion.framework.util.InfinityThread;
import net.ion.framework.util.ObjectId;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.io.GridFilesystem;
import org.infinispan.notifications.cachelistener.event.Event.Type;
import org.jboss.netty.util.Timeout;
public class TestCDDBlob extends TestCase {
public void testCallCDD() throws Exception {
Craken craken = Craken.inmemoryCreateWithTest();
ReadSession session = craken.login("test");
final Workspace workspace = session.workspace();
session.workspace().cddm().add(new CDDHandler() {
@Override
public String pathPattern() {
return "/emp/{userid}";
}
@Override
public TransactionJob<Void> modified(Map<String, String> resolveMap, CDDModifiedEvent event) {
try {
Map<PropertyId, PropertyValue> values = event.getValue();
for (PropertyId pid : values.keySet()) {
PropertyValue val = values.get(pid);
if (val.isBlob()) {
InputStream input = ((GridBlob) val.workspace(workspace).asBlob()).toInputStream();
Debug.line(pid, IOUtil.toStringWithClose(input));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public TransactionJob<Void> deleted(Map<String, String> resolveMap, CDDRemovedEvent event) {
return null;
}
});
session.tran(new TransactionJob<Void>() {
@Override
public Void handle(WriteSession wsession) throws Exception {
wsession.pathBy("/emp/bleujin").property("name", "bleujin").blob("stream", new FileInputStream("./resource/helloworld.txt"));
return null;
}
});
}
public void testAtCraken() throws Exception {
Craken craken = Craken.create() ;
craken.createWorkspace("test", WorkspaceConfigBuilder.memoryDir().distMode(CacheMode.REPL_SYNC)) ;
craken.createWorkspace("test2", WorkspaceConfigBuilder.memoryDir().distMode(CacheMode.REPL_SYNC)) ;
craken.start() ;
final ReadSession rsession1 = craken.login("test") ;
final ReadSession rsession2 = craken.login("test2") ;
final GridFilesystem gfs = rsession2.workspace().gfs() ;
rsession1.workspace().cddm().add(new AsyncCDDModifyHandler("/request/{sid}/{uuid}") {
@Override
public TransactionJob<Void> modified(Map<String, String> resolveMap, final CDDModifiedEvent event) {
if (event.getKey().getType().isStructure()) return null;
final String sid = resolveMap.get("sid") ;
final String uuid = resolveMap.get("uuid") ;
final String script = event.property("script").asString() ;
Debug.debug("received event", sid, uuid, event.etype());
TransactionJob<Void> tjob = new TransactionJob<Void>(){
@Override
public Void handle(WriteSession wsession) throws Exception {
StringInputStream sinput = new StringInputStream(script.toUpperCase());
wsession.pathBy("/response", sid, uuid).blob("result", sinput) ;
IOUtil.close(sinput);
Debug.debug("write response", sid, uuid, event.getKey());
return null;
}
};
rsession2.tran(tjob) ;
return null ;
}
}) ;
Debug.debug("started");
new InfinityThread().startNJoin();
}
public void testAtScript() throws Exception {
Craken craken = Craken.create();
craken.start();
craken.createWorkspace("test", WorkspaceConfigBuilder.memoryDir().distMode(CacheMode.REPL_SYNC));
craken.createWorkspace("test2", WorkspaceConfigBuilder.memoryDir().distMode(CacheMode.REPL_SYNC));
ReadSession rsession = craken.login("test");
final ReadSession rsession2 = craken.login("test2");
for (int i = 0; i < 10; i++) {
final CountDownLatch cd = new CountDownLatch(1);
final String uuid = new ObjectId().toString(); // "117";
CDDModifyHandler listener = new CDDModifyHandler("/response/bleujin/" + uuid) {
@Override
public TransactionJob<Void> modified(Map<String, String> resolveMap, CDDModifiedEvent event) {
if (event.getKey().getType().isData()) {
Debug.debug("received", event.etype(), event.getKey());
cd.countDown();
}
return null;
}
};
rsession2.workspace().cddm().add(listener);
long start = System.currentTimeMillis();
rsession.tran(new TransactionJob<Void>() {
public Void handle(WriteSession wsession) throws Exception {
wsession.pathBy("/request/bleujin/" + uuid).property("script", "hello bleujin").property("age", 20);
Debug.debug("started", new Date().getTime());
return null;
}
});
cd.await(5, TimeUnit.SECONDS);
InputStream input = rsession2.pathBy("/response/bleujin/" + uuid).property("result").asBlob().toInputStream();
Debug.line(IOUtil.toStringWithClose(input), System.currentTimeMillis() - start);
rsession2.workspace().cddm().remove(listener);
}
Debug.debug("ended");
// new InfinityThread().startNJoin();
}
}