/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.cmis;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.test.AvailablePortFinder;
import org.apache.camel.test.junit4.CamelTestSupport;
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.Repository;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.SessionFactory;
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
public class CMISTestSupport extends CamelTestSupport {
protected static final String CMIS_ENDPOINT_TEST_SERVER
= "http://localhost:%s/chemistry-opencmis-server-inmemory/atom11";
protected static final String OPEN_CMIS_SERVER_WAR_PATH
= "target/dependency/chemistry-opencmis-server-inmemory-0.13.0.war";
protected static Server cmisServer;
protected static int port;
protected String getUrl() {
return String.format(CMIS_ENDPOINT_TEST_SERVER, port);
}
protected Exchange createExchangeWithInBody(String body) {
DefaultExchange exchange = new DefaultExchange(context);
if (body != null) {
exchange.getIn().setBody(body);
}
return exchange;
}
protected CmisObject retrieveCMISObjectByIdFromServer(String nodeId) throws Exception {
Session session = createSession();
return session.getObject(nodeId);
}
protected void deleteAllContent() {
Session session = createSession();
Folder rootFolder = session.getRootFolder();
ItemIterable<CmisObject> children = rootFolder.getChildren();
for (CmisObject cmisObject : children) {
if ("cmis:folder".equals(cmisObject.getPropertyValue(PropertyIds.OBJECT_TYPE_ID))) {
List<String> notDeltedIdList = ((Folder)cmisObject)
.deleteTree(true, UnfileObject.DELETE, true);
if (notDeltedIdList != null && notDeltedIdList.size() > 0) {
throw new RuntimeException("Cannot empty repo");
}
} else {
cmisObject.delete(true);
}
}
session.getBinding().close();
}
protected Session createSession() {
SessionFactory sessionFactory = SessionFactoryImpl.newInstance();
Map<String, String> parameter = new HashMap<String, String>();
parameter.put(SessionParameter.ATOMPUB_URL, getUrl());
parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
Repository repository = sessionFactory.getRepositories(parameter).get(0);
return repository.createSession();
}
protected String getDocumentContentAsString(String nodeId) throws Exception {
CmisObject cmisObject = retrieveCMISObjectByIdFromServer(nodeId);
Document doc = (Document)cmisObject;
InputStream inputStream = doc.getContentStream().getStream();
return readFromStream(inputStream);
}
protected String readFromStream(InputStream in) throws Exception {
StringBuilder result = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
result.append(strLine);
}
in.close();
return result.toString();
}
protected Folder createFolderWithName(String folderName) {
Folder rootFolder = createSession().getRootFolder();
return createChildFolderWithName(rootFolder, folderName);
}
protected Folder createChildFolderWithName(Folder parent, String childName) {
Map<String, String> newFolderProps = new HashMap<String, String>();
newFolderProps.put(PropertyIds.OBJECT_TYPE_ID, "cmis:folder");
newFolderProps.put(PropertyIds.NAME, childName);
return parent.createFolder(newFolderProps);
}
protected void createTextDocument(Folder newFolder, String content, String fileName)
throws UnsupportedEncodingException {
byte[] buf = content.getBytes("UTF-8");
ByteArrayInputStream input = new ByteArrayInputStream(buf);
ContentStream contentStream = createSession().getObjectFactory()
.createContentStream(fileName, buf.length, "text/plain; charset=UTF-8", input);
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
properties.put(PropertyIds.NAME, fileName);
newFolder.createDocument(properties, contentStream, VersioningState.NONE);
}
@BeforeClass
public static void startServer() throws Exception {
port = AvailablePortFinder.getNextAvailable(26500);
cmisServer = new Server(port);
cmisServer.setHandler(new WebAppContext(OPEN_CMIS_SERVER_WAR_PATH, "/chemistry-opencmis-server-inmemory"));
cmisServer.start();
}
@AfterClass
public static void stopServer() throws Exception {
cmisServer.stop();
}
@Override
@Before
public void setUp() throws Exception {
deleteAllContent();
super.setUp();
}
}