package jp.aegif.nemaki.test.nemaki;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.apache.chemistry.opencmis.client.api.ChangeEvents;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.client.api.OperationContext;
import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.codehaus.jackson.node.ObjectNode;
import org.ektorp.CouchDbConnector;
import org.ektorp.CouchDbInstance;
import org.ektorp.http.HttpClient;
import org.ektorp.http.StdHttpClient;
import org.ektorp.http.StdHttpClient.Builder;
import org.ektorp.impl.StdCouchDbInstance;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MultiThreadTest extends TestBase{
@Test
public void checkOutTest_single(){
String folderId = createTestFolder();
String docId = createDocument(folderId, "test.txt", "This is test");
Document doc = (Document) session.getObject(docId);
long start = System.currentTimeMillis();
doc.checkOut();
long end = System.currentTimeMillis();
System.out.println("start=" + start + ", end=" + end);
Folder folder = (Folder) session.getObject(folderId);
folder.deleteTree(true, UnfileObject.DELETE, true);
}
@Test
public void checkOutTest_All() throws InterruptedException, ExecutionException{
//document ids();
List<Document> docs = getDocs(testFolderId);
//checkout
List<Thread> threads = new ArrayList<>();
Integer taskNum = 1;
for(Document doc : docs){
threads.add(new Thread(new CheckOutTask(taskNum, doc)));
taskNum++;
}
for(Thread thread : threads){
thread.start();
}
for(Thread thread : threads){
thread.join();
}
System.out.println("test end: " + threads.size() + " threads processed");
}
@Test
public void checkOutTest_All_By_Executor() throws InterruptedException, ExecutionException{
//document ids();
List<Document> docs = getDocs(testFolderId);
ExecutorService es = Executors.newFixedThreadPool(10);
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(es);
Integer taskNum = 1;
for(Document doc : docs){
completionService.submit(new CheckOutTask(taskNum, doc), null);
taskNum++;
}
es.shutdown();
for (int i = 0; i < docs.size(); i++) {
Future<Object> future = completionService.take();
Object result = future.get();
}
System.out.println("test end: " + taskNum + " threads processed");
}
public class CheckOutTask implements Runnable{
private int taskId;
private Document doc;
public CheckOutTask(int taskId, Document doc){
this.taskId = taskId;
this.doc = doc;
}
@Override
public void run() {
DateTime start = new DateTime();
ObjectId objectId = doc.checkOut();
DateTime end = new DateTime();
Duration duration = new Duration(start, end);
System.out.println(taskId + ", " + duration.getMillis() + ", " + doc.getId() + ", " + start + ", " + end);
}
}
public void checkInTest_All() throws InterruptedException, ExecutionException{
checkOutTest_All();
System.out.println("---checkout test finished---");
System.out.println("---checkin test started---");
//document ids
List<Document> docs = getDocs(testFolderId);
for(Document doc : docs){
}
}
@Test
public void readTest_All() throws InterruptedException{
//document ids
Folder folder = (Folder) session.getObject(testFolderId);
OperationContext oc = simpleOperationContext();
oc.setMaxItemsPerPage(Integer.MAX_VALUE);
ItemIterable<CmisObject> children = folder.getChildren(oc);
Iterator<CmisObject> itr = children.iterator();
List<Document> docs = new ArrayList<>();
while(itr.hasNext()){
CmisObject child = itr.next();
if(child.getBaseTypeId() == BaseTypeId.CMIS_DOCUMENT){
docs.add((Document)child);
}
}
//checkout
List<Thread> threads = new ArrayList<>();
Integer taskNum = 1;
for(Document doc : docs){
threads.add(new Thread(new ReadTask(taskNum, doc.getId())));
taskNum++;
}
for(Thread thread : threads){
thread.start();
}
for(Thread thread : threads){
thread.join();
}
System.out.println("test end: " + threads.size() + " threads processed");
}
public class ReadTask implements Runnable{
private int taskId;
private String objectId;
public ReadTask(int taskId, String objectId){
this.taskId = taskId;
this.objectId = objectId;
}
@Override
public void run() {
System.out.println(taskId + ":start");
OperationContext oc = simpleOperationContext();
oc.setCacheEnabled(false);
DateTime start = new DateTime();
Document doc = (Document) session.getObject(objectId, oc);
DateTime end = new DateTime();
System.out.println(taskId + ":end");
Duration duration = new Duration(start, end);
System.out.println(taskId + ", " + duration.getMillis() + ", " + doc.getId() + ", " + start + ", " + end);
}
}
@Test
public void copyTest_All() throws InterruptedException{
//document ids
List<Document> docs = getDocs(testFolderId);
String targetFolderId = createTestFolder();
System.out.println("taget folder: " + targetFolderId);
List<Thread> threads = new ArrayList<>();
Integer taskNum = 1;
for(Document doc : docs){
threads.add(new Thread(new CopyTask(taskNum, doc, new ObjectIdImpl(targetFolderId))));
taskNum++;
}
for(Thread thread : threads){
thread.start();
}
for(Thread thread : threads){
thread.join();
}
Folder targetFolder = (Folder) session.getObject(targetFolderId);
targetFolder.deleteTree(true, UnfileObject.DELETE, true);
System.out.println("copy test finished. target folder contains " + targetFolder.getChildren().getPageNumItems());
}
private static class CopyTask implements Runnable{
private int taskId;
private Document doc;
private ObjectId targetFolderId;
public CopyTask(int taskId, Document doc, ObjectId targetFolderId){
this.taskId = taskId;
this.doc = doc;
this.targetFolderId = targetFolderId;
}
@Override
public void run() {
System.out.println(taskId + ":start " + doc.getName());
Document copy = doc.copy(targetFolderId);
System.out.println(taskId + ":copied " + copy.getName());
}
}
@Test
public void tooManyThreadTest() throws InterruptedException{
int threadNum = 500;
//couch connector
Builder builder = new StdHttpClient.Builder()
.host("localhost")
.port(5984)
.maxConnections(1000)
.cleanupIdleConnections(true);
HttpClient httpClient = builder.build();
CouchDbInstance dbInstance = new StdCouchDbInstance(httpClient);
CouchDbConnector connector = dbInstance.createConnector("bedroom5", false);
//threads
List<Thread> threads = new ArrayList<>();
Integer taskNum = 1;
for(int i=0; i< threadNum; i++){
threads.add(new Thread(new HttpCallTask(connector, "task" + i)));
taskNum++;
}
for(Thread thread : threads){
thread.start();
}
for(Thread thread : threads){
thread.join();
}
System.out.println("test end: " + threads.size() + " threads processed");
}
private class HttpCallTask implements Runnable{
private CouchDbConnector connector;
private String taskId;
public HttpCallTask(CouchDbConnector connector, String taskId) {
this.connector = connector;
this.taskId = taskId;
}
@Override
public void run() {
DateTime start = new DateTime();
ObjectMapper mapper = new ObjectMapper();
com.fasterxml.jackson.databind.node.ObjectNode obj = mapper.createObjectNode().put("fuga", "hoge");
connector.create(obj);
obj.put("fuga", "piyo");
connector.update(obj);
DateTime end = new DateTime();
Duration duration = new Duration(start, end);
System.out.println(taskId + ", " + duration.getMillis() + ", " + start + ", " + end);
}
}
@Test
public void getContentChangesTest(){
ChangeEvents events = session.getContentChanges("b11bf1bf25317a8fa2941b8f14014d7e", false, 100);
System.out.println("hoge");
}
}