/**
* Copyright (C) 2010 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xcmis.wssoap;
import junit.framework.TestCase;
import org.apache.cxf.bus.CXFBusFactory;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.invoker.BeanInvoker;
import org.xcmis.core.CmisObjectType;
import org.xcmis.core.CmisPropertiesType;
import org.xcmis.core.CmisProperty;
import org.xcmis.core.CmisPropertyId;
import org.xcmis.core.CmisPropertyString;
import org.xcmis.core.EnumBaseObjectTypeIds;
import org.xcmis.core.EnumPropertiesRelationship;
import org.xcmis.spi.CmisConstants;
import org.xcmis.spi.CmisRegistry;
import org.xcmis.spi.Connection;
import org.xcmis.spi.FilterNotValidException;
import org.xcmis.spi.ItemsList;
import org.xcmis.spi.ObjectNotFoundException;
import org.xcmis.spi.model.BaseType;
import org.xcmis.spi.model.CmisObject;
import org.xcmis.spi.model.VersioningState;
import org.xcmis.spi.utils.Logger;
import org.xcmis.wssoap.impl.TypeConverter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public abstract class BaseTest extends TestCase
{
protected final Logger LOG = Logger.getLogger(BaseTest.class);
protected String repositoryId = "cmis1";
protected String principal = "root";
protected Connection conn;
protected String rootFolderId;
protected String testFolderId;
protected ArrayList<AbstractPhaseInterceptor<?>> interceptors;
@Override
public void setUp() throws Exception
{
conn = CmisRegistry.getInstance().getConnection(repositoryId);
rootFolderId = conn.getStorage().getRepositoryInfo().getRootFolderId();
try
{
testFolderId = createFolder(rootFolderId, "testFolder");
}
catch (Exception e)
{
clearRoot();
testFolderId = createFolder(rootFolderId, "testFolder");
}
interceptors = new ArrayList<AbstractPhaseInterceptor<?>>();
interceptors.add(new UserContextInterceptor(principal));
}
/**
* Complex deploy service.
*
* @param address string service address
* @param object service object
* @param inInterceptors List<AbstractPhaseInterceptor> in interceptors
* @param outInterceptors List<AbstractPhaseInterceptor> out interceptorss
* @param wrapped boolean
* @return server instance
*/
protected Server complexDeployService(String address, Object object,
List<AbstractPhaseInterceptor<?>> inInterceptors, List<AbstractPhaseInterceptor<?>> outInterceptors,
boolean wrapped)
{
if (LOG.isDebugEnabled())
{
LOG.debug("Starting Service: object = " + object + " at the address = " + address);
}
JaxWsServerFactoryBean serverFactory = new JaxWsServerFactoryBean();
serverFactory.getServiceFactory().setDataBinding(new JAXBDataBinding());
serverFactory.setServiceClass(object.getClass());
serverFactory.setAddress(address);
serverFactory.setBus(CXFBusFactory.getDefaultBus());
Server server = serverFactory.create();
if (LOG.isDebugEnabled())
{
serverFactory.getServiceFactory().getService().getInInterceptors().add(new LoggingInInterceptor());
serverFactory.getServiceFactory().getService().getOutInterceptors().add(new LoggingOutInterceptor());
}
if (inInterceptors != null && inInterceptors.size() > 0)
{
for (AbstractPhaseInterceptor<?> in : inInterceptors)
{
serverFactory.getServiceFactory().getService().getInInterceptors().add(in);
}
}
if (outInterceptors != null && outInterceptors.size() > 0)
{
for (AbstractPhaseInterceptor<?> out : outInterceptors)
{
serverFactory.getServiceFactory().getService().getOutInterceptors().add(out);
}
}
if (wrapped)
{
serverFactory.getServiceFactory().setAnonymousWrapperTypes(true);
serverFactory.getServiceFactory().setQualifyWrapperSchema(true);
serverFactory.getServiceFactory().setWrapped(true);
}
Service service = server.getEndpoint().getService();
service.setInvoker(new BeanInvoker(object));
server.start();
return server;
}
protected String createDocument(String parentId, String name) throws Exception
{
CmisPropertiesType props = new CmisPropertiesType();
// typeId
CmisPropertyId propTypeId = new CmisPropertyId();
propTypeId.setPropertyDefinitionId(CmisConstants.OBJECT_TYPE_ID);
propTypeId.getValue().add(EnumBaseObjectTypeIds.CMIS_DOCUMENT.value());
// name
CmisPropertyString propName = new CmisPropertyString();
propName.setPropertyDefinitionId(CmisConstants.NAME);
propName.getValue().add(name);
props.getProperty().add(propTypeId);
props.getProperty().add(propName);
return conn.createDocument(parentId, TypeConverter.getPropertyMap(props), null, null, null, null,
VersioningState.MAJOR);
}
protected String createFolder(String parentId, String name) throws Exception
{
CmisPropertiesType props = new CmisPropertiesType();
// typeId
CmisPropertyId propTypeId = new CmisPropertyId();
propTypeId.setPropertyDefinitionId(CmisConstants.OBJECT_TYPE_ID);
propTypeId.getValue().add(EnumBaseObjectTypeIds.CMIS_FOLDER.value());
// name
CmisPropertyString propName = new CmisPropertyString();
propName.setPropertyDefinitionId(CmisConstants.NAME);
propName.getValue().add(name);
props.getProperty().add(propTypeId);
props.getProperty().add(propName);
return conn.createFolder(parentId, TypeConverter.getPropertyMap(props), null, null, null);
}
protected String createPolicy(String parentId, String name, String policyText) throws Exception
{
CmisPropertiesType props = new CmisPropertiesType();
// typeId
CmisPropertyId propTypeId = new CmisPropertyId();
propTypeId.setPropertyDefinitionId(CmisConstants.OBJECT_TYPE_ID);
propTypeId.setLocalName(CmisConstants.OBJECT_TYPE_ID);
propTypeId.getValue().add(EnumBaseObjectTypeIds.CMIS_POLICY.value());
// name
CmisPropertyString propName = new CmisPropertyString();
propName.setPropertyDefinitionId(CmisConstants.NAME);
propName.setLocalName(CmisConstants.NAME);
propName.getValue().add(name + "1");
// text
CmisPropertyString propText = new CmisPropertyString();
propText.setPropertyDefinitionId(CmisConstants.POLICY_TEXT);
propText.setLocalName(CmisConstants.POLICY_TEXT);
propText.getValue().add(name + "2");
props.getProperty().add(propTypeId);
props.getProperty().add(propName);
props.getProperty().add(propText);
return conn.createPolicy(parentId, TypeConverter.getPropertyMap(props), null, null, null);
}
protected String createRelationship(String source, String target) throws Exception
{
// typeId
CmisPropertyId propTypeId = new CmisPropertyId();
propTypeId.setPropertyDefinitionId(CmisConstants.OBJECT_TYPE_ID);
propTypeId.getValue().add(EnumBaseObjectTypeIds.CMIS_RELATIONSHIP.value());
// name
CmisPropertyString propName = new CmisPropertyString();
propName.setPropertyDefinitionId(CmisConstants.NAME);
propName.getValue().add("relation1" + source);
// sourceId
CmisPropertyId sourceId = new CmisPropertyId();
sourceId.setPropertyDefinitionId(EnumPropertiesRelationship.CMIS_SOURCE_ID.value());
sourceId.getValue().add(source);
// targetId
CmisPropertyId targetId = new CmisPropertyId();
targetId.setPropertyDefinitionId(EnumPropertiesRelationship.CMIS_TARGET_ID.value());
targetId.getValue().add(target);
CmisPropertiesType props = new CmisPropertiesType();
props.getProperty().add(propTypeId);
props.getProperty().add(propName);
props.getProperty().add(sourceId);
props.getProperty().add(targetId);
return conn.createRelationship(TypeConverter.getPropertyMap(props), null, null, null);
}
protected String getObjectId(CmisObjectType cmis)
{
return ((CmisPropertyId)getProperty(cmis, CmisConstants.OBJECT_ID)).getValue().get(0);
}
protected CmisProperty getProperty(CmisObjectType cmis, String propName)
{
List<CmisProperty> props = cmis.getProperties().getProperty();
for (CmisProperty prop : props)
{
if (prop.getPropertyDefinitionId().equals(propName))
{
return prop;
}
}
return null;
}
private void deleteObject(CmisObject obj)
{
String objId = obj.getObjectInfo().getId();
try
{
if (obj.getObjectInfo().getBaseType().value().equals(BaseType.FOLDER.value()))
{
for (Iterator<CmisObject> iter = getChildren(objId).getItems().iterator(); iter.hasNext();)
{
CmisObject obj2 = iter.next();
deleteObject(obj2);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
try
{
conn.deleteObject(objId, null);
}
catch (Exception e)
{
e.printStackTrace();
}
}
protected ItemsList<CmisObject> getChildren(String folderId) throws ObjectNotFoundException, FilterNotValidException
{
return conn.getChildren(folderId, false, null, false, true, CmisConstants.WILDCARD, null, null, -1, 0);
}
@Override
protected void tearDown() throws Exception
{
clearRoot();
super.tearDown();
conn.close();
}
private void clearRoot()
{
try
{
conn.deleteTree(testFolderId, true, null, true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}