package jp.aegif.nemaki.test.nemaki;
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.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.activation.FileTypeMap;
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.api.Session;
import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl;
import org.apache.chemistry.opencmis.client.runtime.OperationContextImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.junit.AfterClass;
import org.junit.BeforeClass;
public class TestBase {
protected static Session session;
protected static String testFolderId;
@BeforeClass
public static void before() throws Exception {
session = SessionUtil.createCmisSession("bedroom", "admin", "admin");
//testFolderId = prepareData();
}
public static void after() throws Exception {
Folder folder = (Folder) session.getObject(testFolderId);
folder.deleteTree(true, UnfileObject.DELETE, true);
}
public static String prepareData() throws Exception{
int itemNumber = 100;
String rootFolderId = session.getRepositoryInfo().getRootFolderId();
String testFolderId = createFolder(rootFolderId, "test_general_" + System.currentTimeMillis());
List<CreateDocumentTask> tasks = new ArrayList<>();
for(int i=1; i<=itemNumber; i++){
tasks.add(new CreateDocumentTask("task_" + i , testFolderId, "task_" + i + ".txt", "これはテストです"));
}
ExecutorService executionService = Executors.newFixedThreadPool(10);
CompletionService<String> completionService = new ExecutorCompletionService<>(executionService);
for(int i=1; i<=itemNumber; i++){
completionService.submit(new CreateDocumentTask("task_" + i , testFolderId, "task_" + i + ".txt", "これはテストです"));
}
for(int i=1; i<=itemNumber; i++){
Future<String> result = completionService.take();
result.get();
}
System.out.println("data initilization completed: " + itemNumber + " items");
return testFolderId;
}
public static String createFolder(String parentId, String name){
Map<String, Object>map = new HashMap<>();
map.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_FOLDER.value());
map.put(PropertyIds.PARENT_ID, parentId);
map.put(PropertyIds.NAME, name);
ObjectId result = session.createFolder(map, new ObjectIdImpl(parentId));
return result.getId();
}
private static class CreateDocumentTask implements Callable<String>{
String taskId;
String parentId;
String name;
String text;
public CreateDocumentTask(String taskId, String parentId, String name, String text) {
super();
this.taskId = taskId;
this.parentId = parentId;
this.name = name;
this.text = text;
}
@Override
public String call() throws Exception {
String objectId = createDocument(parentId, name, text);
System.out.println(objectId + "(" + name + ") is created.");
return objectId;
}
}
protected static OperationContext simpleOperationContext(String...filters ){
OperationContextImpl oc = new OperationContextImpl();
if(filters.length > 0){
Set<String> _filters = new HashSet<String>(Arrays.asList(PropertyIds.OBJECT_ID));
oc.setFilter(_filters);
}
oc.setIncludeAllowableActions(false);
oc.setIncludeAcls(false);
oc.setIncludePolicies(false);
oc.setIncludeRelationships(IncludeRelationships.NONE);
return oc;
}
public static String createTestFolder(){
String rootFolderId = session.getRepositoryInfo().getRootFolderId();
Map<String, Object>map = new HashMap<>();
map.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_FOLDER.value());
map.put(PropertyIds.PARENT_ID, rootFolderId);
map.put(PropertyIds.NAME, "testFolder_" + System.currentTimeMillis());
ObjectId result = session.createFolder(map, new ObjectIdImpl(rootFolderId));
return result.getId();
}
public static String createDocument(String parentId, String name, File file){
Map<String, Object>map = new HashMap<>();
map.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_DOCUMENT.value());
map.put(PropertyIds.NAME, name);
ContentStream contentStream = convertFileToContentStream(session, file);
ObjectId objectId = session.createDocument(map, new ObjectIdImpl(parentId), contentStream, VersioningState.MAJOR);
return objectId.getId();
}
public static String createDocument(String parentId, String name, String string){
Map<String, Object>map = new HashMap<>();
map.put(PropertyIds.OBJECT_TYPE_ID, BaseTypeId.CMIS_DOCUMENT.value());
map.put(PropertyIds.NAME, name);
ContentStream contentStream = new ContentStreamImpl(name, "text/plain", string);
ObjectId objectId = session.createDocument(map, new ObjectIdImpl(parentId), contentStream, VersioningState.MAJOR);
return objectId.getId();
}
public List<Document> getDocs(String testFolderId){
//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);
}
}
return docs;
}
public static File convertInputStreamToFile(InputStream inputStream)
throws IOException {
File file = File.createTempFile(
String.valueOf(System.currentTimeMillis()), null);
file.deleteOnExit();
OutputStream out = new FileOutputStream(file);
try {
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}finally{
inputStream.close();
out.close();
}
return file;
}
public static ContentStream convertFileToContentStream(Session session,
File file) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileTypeMap filetypeMap = FileTypeMap.getDefaultFileTypeMap();
String mimetype = filetypeMap.getContentType(file);
ContentStream cs = session.getObjectFactory().createContentStream(
file.getName(), file.length(), mimetype, fis);
return cs;
}
}