You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2014/03/06 12:33:53 UTC

svn commit: r1574843 - in /chemistry/opencmis/trunk: chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/ chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/open...

Author: fmui
Date: Thu Mar  6 11:33:53 2014
New Revision: 1574843

URL: http://svn.apache.org/r1574843
Log:
CMIS-764: pluggable CMIS service wrappers (clean up) 

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManagerTest.java   (with props)
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/AbstractBridgeServiceFactory.java
    chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/FilterCmisService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManager.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/AbstractBridgeServiceFactory.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/AbstractBridgeServiceFactory.java?rev=1574843&r1=1574842&r2=1574843&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/AbstractBridgeServiceFactory.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/AbstractBridgeServiceFactory.java Thu Mar  6 11:33:53 2014
@@ -27,6 +27,8 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.server.support.CmisServiceWrapper;
+import org.apache.chemistry.opencmis.server.support.wrapper.CallContextAwareCmisService;
+import org.apache.chemistry.opencmis.server.support.wrapper.ConformanceCmisServiceWrapper;
 
 public abstract class AbstractBridgeServiceFactory extends AbstractServiceFactory {
 
@@ -45,7 +47,7 @@ public abstract class AbstractBridgeServ
     private static final BigInteger DEFAULT_MAX_ITEMS_TYPES = BigInteger.valueOf(1000);
     private static final BigInteger DEFAULT_DEPTH_TYPES = BigInteger.valueOf(10);
 
-    private ThreadLocal<CmisServiceWrapper<FilterCmisService>> threadLocalService = new ThreadLocal<CmisServiceWrapper<FilterCmisService>>();
+    private ThreadLocal<CallContextAwareCmisService> threadLocalService = new ThreadLocal<CallContextAwareCmisService>();
 
     private Map<String, String> parameters;
 
@@ -110,16 +112,16 @@ public abstract class AbstractBridgeServ
 
     @Override
     public CmisService getService(CallContext context) {
-        CmisServiceWrapper<FilterCmisService> wrapperService = threadLocalService.get();
-        if (wrapperService == null) {
-            wrapperService = new CmisServiceWrapper<FilterCmisService>(createService(context), defaultTypesMaxItems,
+        CallContextAwareCmisService service = threadLocalService.get();
+        if (service == null) {
+            service = new ConformanceCmisServiceWrapper(createService(context), defaultTypesMaxItems,
                     defaultTypesDepth, defaultMaxItems, defaultDepth);
-            threadLocalService.set(wrapperService);
+            threadLocalService.set(service);
         }
 
-        wrapperService.getWrappedService().setCallContext(context);
+        service.setCallContext(context);
 
-        return wrapperService;
+        return service;
     }
 
     /**

Modified: chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/FilterCmisService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/FilterCmisService.java?rev=1574843&r1=1574842&r2=1574843&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/FilterCmisService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/java/org/apache/chemistry/opencmis/bridge/FilterCmisService.java Thu Mar  6 11:33:53 2014
@@ -60,11 +60,13 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.spi.RelationshipService;
 import org.apache.chemistry.opencmis.commons.spi.RepositoryService;
 import org.apache.chemistry.opencmis.commons.spi.VersioningService;
+import org.apache.chemistry.opencmis.server.support.wrapper.CallContextAwareCmisService;
 
 /**
  * Forwards incoming calls to a CMIS repository.
  */
-public abstract class FilterCmisService extends AbstractCmisService implements Serializable {
+public abstract class FilterCmisService extends AbstractCmisService implements CallContextAwareCmisService,
+        Serializable {
 
     private static final long serialVersionUID = 1L;
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java?rev=1574843&r1=1574842&r2=1574843&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java Thu Mar  6 11:33:53 2014
@@ -41,7 +41,7 @@ import org.apache.chemistry.opencmis.jcr
 import org.apache.chemistry.opencmis.jcr.impl.DefaultFolderTypeHandler;
 import org.apache.chemistry.opencmis.jcr.impl.DefaultUnversionedDocumentTypeHandler;
 import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
-import org.apache.chemistry.opencmis.server.support.CmisServiceWrapper;
+import org.apache.chemistry.opencmis.server.support.wrapper.ConformanceCmisServiceWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -82,11 +82,12 @@ public class JcrServiceFactory extends A
 
     @Override
     public CmisService getService(CallContext context) {
-        CmisServiceWrapper<JcrService> serviceWrapper = new CmisServiceWrapper<JcrService>(createJcrService(
-                jcrRepository, context), DEFAULT_MAX_ITEMS_TYPES, DEFAULT_DEPTH_TYPES, DEFAULT_MAX_ITEMS_OBJECTS,
-                DEFAULT_DEPTH_OBJECTS);
+        JcrService service = createJcrService(jcrRepository, context);
+        service.setCallContext(context);
+        
+        ConformanceCmisServiceWrapper serviceWrapper = new ConformanceCmisServiceWrapper(service, 
+                DEFAULT_MAX_ITEMS_TYPES, DEFAULT_DEPTH_TYPES, DEFAULT_MAX_ITEMS_OBJECTS, DEFAULT_DEPTH_OBJECTS);
 
-        serviceWrapper.getWrappedService().setCallContext(context);
         return serviceWrapper;
     }
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java?rev=1574843&r1=1574842&r2=1574843&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/CmisServiceWrapper.java Thu Mar  6 11:33:53 2014
@@ -21,1236 +21,28 @@
 package org.apache.chemistry.opencmis.server.support;
 
 import java.math.BigInteger;
-import java.util.List;
 
-import org.apache.chemistry.opencmis.commons.PropertyIds;
-import org.apache.chemistry.opencmis.commons.data.Acl;
-import org.apache.chemistry.opencmis.commons.data.AllowableActions;
-import org.apache.chemistry.opencmis.commons.data.BulkUpdateObjectIdAndChangeToken;
-import org.apache.chemistry.opencmis.commons.data.ContentStream;
-import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
-import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData;
-import org.apache.chemistry.opencmis.commons.data.ObjectData;
-import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
-import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
-import org.apache.chemistry.opencmis.commons.data.ObjectList;
-import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
-import org.apache.chemistry.opencmis.commons.data.Properties;
-import org.apache.chemistry.opencmis.commons.data.PropertyData;
-import org.apache.chemistry.opencmis.commons.data.RenditionData;
-import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
-import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
-import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
-import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
-import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
-import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
-import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
-import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
-import org.apache.chemistry.opencmis.commons.enums.VersioningState;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
-import org.apache.chemistry.opencmis.commons.server.ObjectInfo;
-import org.apache.chemistry.opencmis.commons.spi.Holder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.chemistry.opencmis.server.support.wrapper.ConformanceCmisServiceWrapper;
 
 /**
  * Service wrapper.
+ * 
+ * @deprecated use {@link ConformanceCmisServiceWrapper} instead
  */
-public class CmisServiceWrapper<T extends CmisService> implements CmisService {
-
-    public static final BigInteger MINUS_ONE = BigInteger.valueOf(-1);
-
-    private static final Logger LOG = LoggerFactory.getLogger(CmisServiceWrapper.class);
-
-    private BigInteger defaultTypesMaxItems = null;
-    private BigInteger defaultTypesDepth = MINUS_ONE;
-
-    private BigInteger defaultMaxItems = null;
-    private BigInteger defaultDepth = MINUS_ONE;
-
-    private final T service;
+public class CmisServiceWrapper<T extends CmisService> extends ConformanceCmisServiceWrapper {
 
     /**
      * Constructor.
      */
     public CmisServiceWrapper(T service, BigInteger defaultTypesMaxItems, BigInteger defaultTypesDepth,
             BigInteger defaultMaxItems, BigInteger defaultDepth) {
-        if (service == null) {
-            throw new IllegalArgumentException("Service must be set!");
-        }
-
-        this.service = service;
-
-        this.defaultTypesMaxItems = defaultTypesMaxItems;
-        this.defaultTypesDepth = defaultTypesDepth;
-        this.defaultMaxItems = defaultMaxItems;
-        this.defaultDepth = defaultDepth;
-    }
-
-    // --- wrapper operations ---
-
-    /**
-     * Set the default maxItems.
-     */
-    protected void setDefaultTypesMaxItems(BigInteger defaultTypesMaxItems) {
-        this.defaultTypesMaxItems = defaultTypesMaxItems;
-    }
-
-    /**
-     * Set the default depth.
-     */
-    protected void setDefaultTypesDepth(BigInteger defaultTypesDepth) {
-        this.defaultTypesDepth = defaultTypesDepth;
-    }
-
-    /**
-     * Set the default maxItems.
-     */
-    protected void setDefaultMaxItems(BigInteger defaultMaxItems) {
-        this.defaultMaxItems = defaultMaxItems;
-    }
-
-    /**
-     * Set the default depth.
-     */
-    protected void setDefaultDepth(BigInteger defaultDepth) {
-        this.defaultDepth = defaultDepth;
-    }
-
-    /**
-     * Converts the given exception into a CMIS exception.
-     */
-    protected CmisBaseException createCmisException(Exception e) {
-        if (e == null) {
-            // should never happen
-            // if it happens its the fault of the framework...
-
-            return new CmisRuntimeException("Unknown exception!");
-        } else if (e instanceof CmisBaseException) {
-            return (CmisBaseException) e;
-        } else {
-            // should not happen if the connector works correctly
-            // it's alarming enough to log the exception
-            LOG.warn(e.toString(), e);
-
-            return new CmisRuntimeException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Throws an exception if the given id is <code>null</code> or empty.
-     */
-    protected void checkId(String name, String id) {
-        if (id == null) {
-            throw new CmisInvalidArgumentException(name + " must be set!");
-        }
-
-        if (id.length() == 0) {
-            throw new CmisInvalidArgumentException(name + " must not be empty!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given ids are all <code>null</code> or empty.
-     */
-    protected void checkIds(String name, String... ids) {
-        for (String id : ids) {
-            if (id != null && id.length() > 0) {
-                return;
-            }
-        }
-
-        throw new CmisInvalidArgumentException(name + " must be set!");
-    }
-
-    /**
-     * Throws an exception if the given holder or id is <code>null</code> or
-     * empty.
-     */
-    protected void checkHolderId(String name, Holder<String> holder) {
-        if (holder == null) {
-            throw new CmisInvalidArgumentException(name + " must be set!");
-        }
-
-        checkId(name, holder.getValue());
-    }
-
-    /**
-     * Throws an exception if the repository id is <code>null</code> or empty.
-     */
-    protected void checkRepositoryId(String repositoryId) {
-        checkId("Repository Id", repositoryId);
-    }
-
-    /**
-     * Throws an exception if the given path is <code>null</code> or invalid.
-     */
-    protected void checkPath(String name, String path) {
-        if (path == null) {
-            throw new CmisInvalidArgumentException(name + " must be set!");
-        }
-
-        if (path.length() == 0) {
-            throw new CmisInvalidArgumentException(name + " must not be empty!");
-        }
-
-        if (path.charAt(0) != '/') {
-            throw new CmisInvalidArgumentException(name + " must start with '/'!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given properties set is <code>null</code>.
-     */
-    protected void checkProperties(Properties properties) {
-        if (properties == null) {
-            throw new CmisInvalidArgumentException("Properties must be set!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given property isn't set or of the wrong type.
-     */
-    protected void checkProperty(Properties properties, String propertyId, Class<?> clazz) {
-        if (properties.getProperties() == null) {
-            throw new CmisInvalidArgumentException("Property " + propertyId + " must be set!");
-        }
-
-        PropertyData<?> property = properties.getProperties().get(propertyId);
-        if (property == null) {
-            throw new CmisInvalidArgumentException("Property " + propertyId + " must be set!");
-        }
-
-        Object value = property.getFirstValue();
-        if (value == null) {
-            throw new CmisInvalidArgumentException("Property " + propertyId + " must have a value!");
-        }
-
-        if (!clazz.isAssignableFrom(value.getClass())) {
-            throw new CmisInvalidArgumentException("Property " + propertyId + " has the wrong type!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given content object is <code>null</code>.
-     */
-    protected void checkContentStream(ContentStream content) {
-        if (content == null) {
-            throw new CmisInvalidArgumentException("Content must be set!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given query statement is <code>null</code> or
-     * empty.
-     */
-    protected void checkQueryStatement(String statement) {
-        if (statement == null) {
-            throw new CmisInvalidArgumentException("Statement must be set!");
-        }
-
-        if (statement.length() == 0) {
-            throw new CmisInvalidArgumentException("Statement must not be empty!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given type definition is <code>null</code>.
-     */
-    protected void checkTypeDefinition(TypeDefinition typeDef) {
-        if (typeDef == null) {
-            throw new CmisInvalidArgumentException("Type definition must be set!");
-        }
-    }
-
-    /**
-     * Throws an exception if the given list is <code>null</code> or empty.
-     */
-    protected void checkList(String name, List<?> list) {
-        if (list == null) {
-            throw new CmisInvalidArgumentException(name + " must be set!");
-        }
-
-        if (list.isEmpty()) {
-            throw new CmisInvalidArgumentException(name + " must not be empty!");
-        }
+        super(service, defaultTypesMaxItems, defaultTypesDepth, defaultMaxItems, defaultDepth);
     }
 
-    /**
-     * Returns <code>true</code> if <code>value</code> is <code>null</code>.
-     */
-    protected Boolean getDefaultTrue(Boolean value) {
-        if (value == null) {
-            return Boolean.TRUE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns <code>false</code> if <code>value</code> is <code>null</code>.
-     */
-    protected Boolean getDefaultFalse(Boolean value) {
-        if (value == null) {
-            return Boolean.FALSE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the <code>IncludeRelationships.NONE</code> if <code>value</code>
-     * is <code>null</code>.
-     */
-    protected IncludeRelationships getDefault(IncludeRelationships value) {
-        if (value == null) {
-            return IncludeRelationships.NONE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the <code>VersioningState.MAJOR</code> if <code>value</code> is
-     * <code>null</code>.
-     */
-    protected VersioningState getDefault(VersioningState value) {
-        if (value == null) {
-            return VersioningState.MAJOR;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the <code>UnfileObjects.DELETE</code> if <code>value</code> is
-     * <code>null</code>.
-     */
-    protected UnfileObject getDefault(UnfileObject value) {
-        if (value == null) {
-            return UnfileObject.DELETE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the <code>AclPropagation.REPOSITORYDETERMINED</code> if
-     * <code>value</code> is <code>null</code>.
-     */
-    protected AclPropagation getDefault(AclPropagation value) {
-        if (value == null) {
-            return AclPropagation.REPOSITORYDETERMINED;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the <code>RelationshipDirection.SOURCE</code> if
-     * <code>value</code> is <code>null</code> .
-     */
-    protected RelationshipDirection getDefault(RelationshipDirection value) {
-        if (value == null) {
-            return RelationshipDirection.SOURCE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the <code>"cmis:none"</code> if <code>value</code> is
-     * <code>null</code>.
-     */
-    protected String getDefaultRenditionFilter(String value) {
-        if ((value == null) || (value.length() == 0)) {
-            return "cmis:none";
-        }
-
-        return value;
-    }
-
-    /**
-     * Returns the default maxItems if <code>maxItems</code> ==
-     * <code>null</code>, throws an exception if <code>maxItems</code> &lt; 0,
-     * returns <code>maxItems</code> otherwise.
-     */
-    protected BigInteger getTypesMaxItems(BigInteger maxItems) {
-        if (maxItems == null) {
-            return defaultTypesMaxItems;
-        }
-
-        if (maxItems.compareTo(BigInteger.ZERO) == -1) {
-            throw new CmisInvalidArgumentException("maxItems must not be negative!");
-        }
-
-        return maxItems;
-    }
-
-    /**
-     * Checks the depth parameter if it complies with CMIS specification and
-     * returns the default value if <code>depth</code> is <code>null</code>.
-     */
-    protected BigInteger getTypesDepth(BigInteger depth) {
-        if (depth == null) {
-            return defaultTypesDepth;
-        }
-
-        if (depth.compareTo(BigInteger.ZERO) == 0) {
-            throw new CmisInvalidArgumentException("depth must not be 0!");
-        }
-
-        if (depth.compareTo(MINUS_ONE) == -1) {
-            throw new CmisInvalidArgumentException("depth must not be <-1!");
-        }
-
-        return depth;
-    }
-
-    /**
-     * Returns the default maxItems if <code>maxItems</code> ==
-     * <code>null</code>, throws an exception if <code>maxItems</code> &lt; 0,
-     * returns <code>maxItems</code> otherwise.
-     */
-    protected BigInteger getMaxItems(BigInteger maxItems) {
-        if (maxItems == null) {
-            return defaultMaxItems;
-        }
-
-        if (maxItems.compareTo(BigInteger.ZERO) == -1) {
-            throw new CmisInvalidArgumentException("maxItems must not be negative!");
-        }
-
-        return maxItems;
-    }
-
-    /**
-     * Returns 0 if <code>skipCount</code> == <code>null</code>, throws an
-     * exception if <code>skipCount</code> &lt; 0, returns
-     * <code>skipCount</code> otherwise.
-     */
-    protected BigInteger getSkipCount(BigInteger skipCount) {
-        if (skipCount == null) {
-            return BigInteger.ZERO;
-        }
-
-        if (skipCount.compareTo(BigInteger.ZERO) == -1) {
-            throw new CmisInvalidArgumentException("skipCount must not be negative!");
-        }
-
-        return skipCount;
-    }
-
-    /**
-     * Checks the depth parameter if it complies with CMIS specification and
-     * returns the default value if <code>depth</code> is <code>null</code>.
-     */
-    protected BigInteger getDepth(BigInteger depth) {
-        if (depth == null) {
-            return defaultDepth;
-        }
-
-        if (depth.compareTo(BigInteger.ZERO) == 0) {
-            throw new CmisInvalidArgumentException("depth must not be 0!");
-        }
-
-        if (depth.compareTo(MINUS_ONE) == -1) {
-            throw new CmisInvalidArgumentException("depth must not be <-1!");
-        }
-
-        return depth;
-    }
-
-    /**
-     * Throws an exception if the given value is negative.
-     */
-    protected void checkNullOrPositive(String name, BigInteger value) {
-        if (value == null) {
-            return;
-        }
-
-        if (value.compareTo(BigInteger.ZERO) == -1) {
-            throw new CmisInvalidArgumentException(name + " must not be negative!");
-        }
-    }
-
-    // --- service operations ---
-
+    @Override
+    @SuppressWarnings("unchecked")
     public T getWrappedService() {
-        return service;
-    }
-
-    public ObjectInfo getObjectInfo(String repositoryId, String objectId) {
-        return service.getObjectInfo(repositoryId, objectId);
-    }
-
-    public void close() {
-        service.close();
-    }
-
-    // --- repository service ---
-
-    public RepositoryInfo getRepositoryInfo(String repositoryId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-
-        try {
-            return service.getRepositoryInfo(repositoryId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<RepositoryInfo> getRepositoryInfos(ExtensionsData extension) {
-        try {
-            return service.getRepositoryInfos(extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public TypeDefinitionList getTypeChildren(String repositoryId, String typeId, Boolean includePropertyDefinitions,
-            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        includePropertyDefinitions = getDefaultFalse(includePropertyDefinitions);
-        maxItems = getTypesMaxItems(maxItems);
-        skipCount = getSkipCount(skipCount);
-
-        try {
-            return service.getTypeChildren(repositoryId, typeId, includePropertyDefinitions, maxItems, skipCount,
-                    extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public TypeDefinition getTypeDefinition(String repositoryId, String typeId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Type Id", typeId);
-
-        try {
-            return service.getTypeDefinition(repositoryId, typeId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<TypeDefinitionContainer> getTypeDescendants(String repositoryId, String typeId, BigInteger depth,
-            Boolean includePropertyDefinitions, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        includePropertyDefinitions = getDefaultFalse(includePropertyDefinitions);
-        depth = getTypesDepth(depth);
-
-        try {
-            return service.getTypeDescendants(repositoryId, typeId, depth, includePropertyDefinitions, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public TypeDefinition createType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkTypeDefinition(type);
-
-        try {
-            return service.createType(repositoryId, type, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public TypeDefinition updateType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkTypeDefinition(type);
-
-        try {
-            return service.updateType(repositoryId, type, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void deleteType(String repositoryId, String typeId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Type Id", typeId);
-
-        try {
-            service.deleteType(repositoryId, typeId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- navigation service ---
-
-    public ObjectList getCheckedOutDocs(String repositoryId, String folderId, String filter, String orderBy,
-            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
-            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        maxItems = getMaxItems(maxItems);
-        skipCount = getSkipCount(skipCount);
-
-        try {
-            return service.getCheckedOutDocs(repositoryId, folderId, filter, orderBy, includeAllowableActions,
-                    includeRelationships, renditionFilter, maxItems, skipCount, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ObjectInFolderList getChildren(String repositoryId, String folderId, String filter, String orderBy,
-            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
-            Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Folder Id", folderId);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includePathSegment = getDefaultFalse(includePathSegment);
-        maxItems = getMaxItems(maxItems);
-        skipCount = getSkipCount(skipCount);
-
-        try {
-            return service.getChildren(repositoryId, folderId, filter, orderBy, includeAllowableActions,
-                    includeRelationships, renditionFilter, includePathSegment, maxItems, skipCount, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<ObjectInFolderContainer> getDescendants(String repositoryId, String folderId, BigInteger depth,
-            String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
-            String renditionFilter, Boolean includePathSegment, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Folder Id", folderId);
-        depth = getDepth(depth);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includePathSegment = getDefaultFalse(includePathSegment);
-
-        try {
-            return service.getDescendants(repositoryId, folderId, depth, filter, includeAllowableActions,
-                    includeRelationships, renditionFilter, includePathSegment, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ObjectData getFolderParent(String repositoryId, String folderId, String filter, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Folder Id", folderId);
-
-        try {
-            return service.getFolderParent(repositoryId, folderId, filter, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<ObjectInFolderContainer> getFolderTree(String repositoryId, String folderId, BigInteger depth,
-            String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
-            String renditionFilter, Boolean includePathSegment, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Folder Id", folderId);
-        depth = getDepth(depth);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includePathSegment = getDefaultFalse(includePathSegment);
-
-        try {
-            return service.getFolderTree(repositoryId, folderId, depth, filter, includeAllowableActions,
-                    includeRelationships, renditionFilter, includePathSegment, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<ObjectParentData> getObjectParents(String repositoryId, String objectId, String filter,
-            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
-            Boolean includeRelativePathSegment, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includeRelativePathSegment = getDefaultFalse(includeRelativePathSegment);
-
-        try {
-            return service.getObjectParents(repositoryId, objectId, filter, includeAllowableActions,
-                    includeRelationships, renditionFilter, includeRelativePathSegment, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- object service ---
-
-    public String create(String repositoryId, Properties properties, String folderId, ContentStream contentStream,
-            VersioningState versioningState, List<String> policies, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkProperties(properties);
-        checkProperty(properties, PropertyIds.OBJECT_TYPE_ID, String.class);
-        versioningState = getDefault(versioningState);
-
-        try {
-            return service.create(repositoryId, properties, folderId, contentStream, versioningState, policies,
-                    extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public String createDocument(String repositoryId, Properties properties, String folderId,
-            ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addAces,
-            Acl removeAces, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkProperties(properties);
-        checkProperty(properties, PropertyIds.OBJECT_TYPE_ID, String.class);
-        versioningState = getDefault(versioningState);
-
-        try {
-            return service.createDocument(repositoryId, properties, folderId, contentStream, versioningState, policies,
-                    addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public String createDocumentFromSource(String repositoryId, String sourceId, Properties properties,
-            String folderId, VersioningState versioningState, List<String> policies, Acl addAces, Acl removeAces,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Source Id", sourceId);
-        versioningState = getDefault(versioningState);
-
-        try {
-            return service.createDocumentFromSource(repositoryId, sourceId, properties, folderId, versioningState,
-                    policies, addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public String createFolder(String repositoryId, Properties properties, String folderId, List<String> policies,
-            Acl addAces, Acl removeAces, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkProperties(properties);
-        checkProperty(properties, PropertyIds.OBJECT_TYPE_ID, String.class);
-        checkId("Folder Id", folderId);
-
-        try {
-            return service.createFolder(repositoryId, properties, folderId, policies, addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public String createPolicy(String repositoryId, Properties properties, String folderId, List<String> policies,
-            Acl addAces, Acl removeAces, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkProperties(properties);
-        checkProperty(properties, PropertyIds.OBJECT_TYPE_ID, String.class);
-
-        try {
-            return service.createPolicy(repositoryId, properties, folderId, policies, addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public String createItem(String repositoryId, Properties properties, String folderId, List<String> policies,
-            Acl addAces, Acl removeAces, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkProperties(properties);
-        checkProperty(properties, PropertyIds.OBJECT_TYPE_ID, String.class);
-
-        try {
-            return service.createItem(repositoryId, properties, folderId, policies, addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public String createRelationship(String repositoryId, Properties properties, List<String> policies, Acl addAces,
-            Acl removeAces, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkProperties(properties);
-        checkProperty(properties, PropertyIds.OBJECT_TYPE_ID, String.class);
-        // checkProperty(properties, PropertyIds.SOURCE_ID, String.class);
-        // checkProperty(properties, PropertyIds.TARGET_ID, String.class);
-
-        try {
-            return service.createRelationship(repositoryId, properties, policies, addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void deleteContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-
-        try {
-            service.deleteContentStream(repositoryId, objectId, changeToken, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void deleteObject(String repositoryId, String objectId, Boolean allVersions, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        allVersions = getDefaultTrue(allVersions);
-
-        try {
-            service.deleteObject(repositoryId, objectId, allVersions, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void deleteObjectOrCancelCheckOut(String repositoryId, String objectId, Boolean allVersions,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        allVersions = getDefaultTrue(allVersions);
-
-        try {
-            service.deleteObjectOrCancelCheckOut(repositoryId, objectId, allVersions, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public FailedToDeleteData deleteTree(String repositoryId, String folderId, Boolean allVersions,
-            UnfileObject unfileObjects, Boolean continueOnFailure, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Folder Id", folderId);
-        allVersions = getDefaultTrue(allVersions);
-        unfileObjects = getDefault(unfileObjects);
-        continueOnFailure = getDefaultFalse(continueOnFailure);
-
-        try {
-            return service.deleteTree(repositoryId, folderId, allVersions, unfileObjects, continueOnFailure, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public AllowableActions getAllowableActions(String repositoryId, String objectId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-
-        try {
-            return service.getAllowableActions(repositoryId, objectId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ContentStream getContentStream(String repositoryId, String objectId, String streamId, BigInteger offset,
-            BigInteger length, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        checkNullOrPositive("Offset", offset);
-        checkNullOrPositive("Length", length);
-
-        try {
-            return service.getContentStream(repositoryId, objectId, streamId, offset, length, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ObjectData getObject(String repositoryId, String objectId, String filter, Boolean includeAllowableActions,
-            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
-            Boolean includeAcl, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includePolicyIds = getDefaultFalse(includePolicyIds);
-        includeAcl = getDefaultFalse(includeAcl);
-
-        try {
-            return service.getObject(repositoryId, objectId, filter, includeAllowableActions, includeRelationships,
-                    renditionFilter, includePolicyIds, includeAcl, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ObjectData getObjectByPath(String repositoryId, String path, String filter, Boolean includeAllowableActions,
-            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
-            Boolean includeAcl, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkPath("Path", path);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includePolicyIds = getDefaultFalse(includePolicyIds);
-        includeAcl = getDefaultFalse(includeAcl);
-
-        try {
-            return service.getObjectByPath(repositoryId, path, filter, includeAllowableActions, includeRelationships,
-                    renditionFilter, includePolicyIds, includeAcl, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public Properties getProperties(String repositoryId, String objectId, String filter, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-
-        try {
-            return service.getProperties(repositoryId, objectId, filter, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<RenditionData> getRenditions(String repositoryId, String objectId, String renditionFilter,
-            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        maxItems = getMaxItems(maxItems);
-        skipCount = getSkipCount(skipCount);
-
-        try {
-            return service.getRenditions(repositoryId, objectId, renditionFilter, maxItems, skipCount, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void moveObject(String repositoryId, Holder<String> objectId, String targetFolderId, String sourceFolderId,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-        checkId("Target Folder Id", targetFolderId);
-
-        try {
-            service.moveObject(repositoryId, objectId, targetFolderId, sourceFolderId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void setContentStream(String repositoryId, Holder<String> objectId, Boolean overwriteFlag,
-            Holder<String> changeToken, ContentStream contentStream, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-        overwriteFlag = getDefaultTrue(overwriteFlag);
-        checkContentStream(contentStream);
-
-        try {
-            service.setContentStream(repositoryId, objectId, overwriteFlag, changeToken, contentStream, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void appendContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
-            ContentStream contentStream, boolean isLastChunk, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-        checkContentStream(contentStream);
-
-        try {
-            service.appendContentStream(repositoryId, objectId, changeToken, contentStream, isLastChunk, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void updateProperties(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
-            Properties properties, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-        checkProperties(properties);
-
-        try {
-            service.updateProperties(repositoryId, objectId, changeToken, properties, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<BulkUpdateObjectIdAndChangeToken> bulkUpdateProperties(String repositoryId,
-            List<BulkUpdateObjectIdAndChangeToken> objectIdAndChangeToken, Properties properties,
-            List<String> addSecondaryTypeIds, List<String> removeSecondaryTypeIds, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkList("Object Id list", objectIdAndChangeToken);
-        checkProperties(properties);
-
-        try {
-            return service.bulkUpdateProperties(repositoryId, objectIdAndChangeToken, properties, addSecondaryTypeIds,
-                    removeSecondaryTypeIds, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- versioning service ---
-
-    public void cancelCheckOut(String repositoryId, String objectId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-
-        try {
-            service.cancelCheckOut(repositoryId, objectId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void checkIn(String repositoryId, Holder<String> objectId, Boolean major, Properties properties,
-            ContentStream contentStream, String checkinComment, List<String> policies, Acl addAces, Acl removeAces,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-        major = getDefaultTrue(major);
-
-        try {
-            service.checkIn(repositoryId, objectId, major, properties, contentStream, checkinComment, policies,
-                    addAces, removeAces, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void checkOut(String repositoryId, Holder<String> objectId, ExtensionsData extension,
-            Holder<Boolean> contentCopied) {
-        checkRepositoryId(repositoryId);
-        checkHolderId("Object Id", objectId);
-
-        try {
-            service.checkOut(repositoryId, objectId, extension, contentCopied);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ObjectData getObjectOfLatestVersion(String repositoryId, String objectId, String versionSeriesId,
-            Boolean major, String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
-            String renditionFilter, Boolean includePolicyIds, Boolean includeAcl, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkIds("Version Series Id", objectId, versionSeriesId);
-        major = getDefaultFalse(major);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        includePolicyIds = getDefaultFalse(includePolicyIds);
-        includeAcl = getDefaultFalse(includeAcl);
-
-        try {
-            return service.getObjectOfLatestVersion(repositoryId, objectId, versionSeriesId, major, filter,
-                    includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeAcl,
-                    extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public Properties getPropertiesOfLatestVersion(String repositoryId, String objectId, String versionSeriesId,
-            Boolean major, String filter, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkIds("Version Series Id", objectId, versionSeriesId);
-        major = getDefaultFalse(major);
-
-        try {
-            return service.getPropertiesOfLatestVersion(repositoryId, objectId, versionSeriesId, major, filter,
-                    extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<ObjectData> getAllVersions(String repositoryId, String objectId, String versionSeriesId, String filter,
-            Boolean includeAllowableActions, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkIds("Version Series Id", objectId, versionSeriesId);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-
-        try {
-            return service.getAllVersions(repositoryId, objectId, versionSeriesId, filter, includeAllowableActions,
-                    extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- discovery service ---
-
-    public ObjectList getContentChanges(String repositoryId, Holder<String> changeLogToken, Boolean includeProperties,
-            String filter, Boolean includePolicyIds, Boolean includeAcl, BigInteger maxItems, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        includeProperties = getDefaultFalse(includeProperties);
-        includePolicyIds = getDefaultFalse(includePolicyIds);
-        includeAcl = getDefaultFalse(includeAcl);
-        maxItems = getMaxItems(maxItems);
-
-        try {
-            return service.getContentChanges(repositoryId, changeLogToken, includeProperties, filter, includePolicyIds,
-                    includeAcl, maxItems, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public ObjectList query(String repositoryId, String statement, Boolean searchAllVersions,
-            Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
-            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkQueryStatement(statement);
-        searchAllVersions = getDefaultFalse(searchAllVersions);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        includeRelationships = getDefault(includeRelationships);
-        renditionFilter = getDefaultRenditionFilter(renditionFilter);
-        maxItems = getMaxItems(maxItems);
-        skipCount = getSkipCount(skipCount);
-
-        try {
-            return service.query(repositoryId, statement, searchAllVersions, includeAllowableActions,
-                    includeRelationships, renditionFilter, maxItems, skipCount, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- multi filing service ---
-
-    public void addObjectToFolder(String repositoryId, String objectId, String folderId, Boolean allVersions,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        checkId("Folder Id", folderId);
-        allVersions = getDefaultTrue(allVersions);
-
-        try {
-            service.addObjectToFolder(repositoryId, objectId, folderId, allVersions, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void removeObjectFromFolder(String repositoryId, String objectId, String folderId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-
-        try {
-            service.removeObjectFromFolder(repositoryId, objectId, folderId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- relationship service ---
-
-    public ObjectList getObjectRelationships(String repositoryId, String objectId, Boolean includeSubRelationshipTypes,
-            RelationshipDirection relationshipDirection, String typeId, String filter, Boolean includeAllowableActions,
-            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        includeSubRelationshipTypes = getDefaultFalse(includeSubRelationshipTypes);
-        relationshipDirection = getDefault(relationshipDirection);
-        includeAllowableActions = getDefaultFalse(includeAllowableActions);
-        maxItems = getMaxItems(maxItems);
-        skipCount = getSkipCount(skipCount);
-
-        try {
-            return service.getObjectRelationships(repositoryId, objectId, includeSubRelationshipTypes,
-                    relationshipDirection, typeId, filter, includeAllowableActions, maxItems, skipCount, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- ACL service ---
-
-    public Acl applyAcl(String repositoryId, String objectId, Acl aces, AclPropagation aclPropagation) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        aclPropagation = getDefault(aclPropagation);
-
-        try {
-            return service.applyAcl(repositoryId, objectId, aces, aclPropagation);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public Acl applyAcl(String repositoryId, String objectId, Acl addAces, Acl removeAces,
-            AclPropagation aclPropagation, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        aclPropagation = getDefault(aclPropagation);
-
-        try {
-            return service.applyAcl(repositoryId, objectId, addAces, removeAces, aclPropagation, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public Acl getAcl(String repositoryId, String objectId, Boolean onlyBasicPermissions, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-        onlyBasicPermissions = getDefaultTrue(onlyBasicPermissions);
-
-        try {
-            return service.getAcl(repositoryId, objectId, onlyBasicPermissions, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    // --- policy service ---
-
-    public void applyPolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Policy Id", policyId);
-        checkId("Object Id", objectId);
-
-        try {
-            service.applyPolicy(repositoryId, policyId, objectId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public List<ObjectData> getAppliedPolicies(String repositoryId, String objectId, String filter,
-            ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Object Id", objectId);
-
-        try {
-            return service.getAppliedPolicies(repositoryId, objectId, filter, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
-    }
-
-    public void removePolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
-        checkRepositoryId(repositoryId);
-        checkId("Policy Id", policyId);
-        checkId("Object Id", objectId);
-
-        try {
-            service.removePolicy(repositoryId, policyId, objectId, extension);
-        } catch (Exception e) {
-            throw createCmisException(e);
-        }
+        return (T) super.getWrappedService();
     }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManager.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManager.java?rev=1574843&r1=1574842&r2=1574843&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManager.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManager.java Thu Mar  6 11:33:53 2014
@@ -19,7 +19,6 @@
 package org.apache.chemistry.opencmis.server.support.wrapper;
 
 import java.lang.reflect.Constructor;
-import java.util.LinkedList;
 import java.util.Locale;
 import java.util.Map;
 import java.util.TreeMap;
@@ -39,10 +38,15 @@ public class CmisServiceWrapperManager {
 
     private static final String PARAMS_SERVICE_WRAPPER_PREFIX = "servicewrapper.";
 
-    private final LinkedList<WrapperDefinition> wrapperDefinitions;
+    private WrapperDefinition outerMost;
+    private WrapperDefinition innerMost;
 
+    /**
+     * Constructor.
+     */
     public CmisServiceWrapperManager() {
-        wrapperDefinitions = new LinkedList<WrapperDefinition>();
+        outerMost = null;
+        innerMost = null;
     }
 
     /**
@@ -54,7 +58,14 @@ public class CmisServiceWrapperManager {
      *            wrapper parameters
      */
     public void addOuterWrapper(Class<? extends AbstractCmisServiceWrapper> wrapperClass, Object... params) {
-        wrapperDefinitions.addLast(new WrapperDefinition(wrapperClass, params));
+        WrapperDefinition wd = new WrapperDefinition(wrapperClass, params);
+        if (outerMost == null) {
+            outerMost = wd;
+            innerMost = wd;
+        } else {
+            outerMost.setOuterWrapper(wd);
+            outerMost = wd;
+        }
 
         LOG.debug("Added outer service wrapper: {}", wrapperClass.getName());
     }
@@ -68,7 +79,14 @@ public class CmisServiceWrapperManager {
      *            wrapper parameters
      */
     public void addInnerWrapper(Class<? extends AbstractCmisServiceWrapper> wrapperClass, Object... params) {
-        wrapperDefinitions.addFirst(new WrapperDefinition(wrapperClass, params));
+        WrapperDefinition wd = new WrapperDefinition(wrapperClass, params);
+        if (innerMost == null) {
+            outerMost = wd;
+            innerMost = wd;
+        } else {
+            innerMost.setInnerWrapper(wd);
+            innerMost = wd;
+        }
 
         LOG.debug("Added inner service wrapper: {}", wrapperClass.getName());
     }
@@ -76,10 +94,22 @@ public class CmisServiceWrapperManager {
     /**
      * Gets wrapper settings from the service factory parameters and adds them
      * to the wrappers.
+     * <p>
+     * The factory parameters properties file should look like this:
+     * 
+     * <pre>
+     * servicewrapper.1=com.example.my.SimpleWrapper
+     * servicewrapper.2=com.example.my.AdvancedWrapper,1,cmis:documents
+     * servicewrapper.2=com.example.my.DebuggingWrapper,testRepositoryId
+     * </pre>
+     * 
+     * Syntax:
+     * {@code servicewrapper.&lt;position>=&lt;classname>[,parameter1[,parameter2[...]]]}
      * 
      * @param parameters
      *            service factory parameters
      */
+    @SuppressWarnings("unchecked")
     public void addWrappersFromServiceFactoryParameters(Map<String, String> parameters) {
         if (parameters == null) {
             return;
@@ -92,7 +122,7 @@ public class CmisServiceWrapperManager {
             if (key.startsWith(PARAMS_SERVICE_WRAPPER_PREFIX) && entry.getKey() != null) {
                 int index = 0;
                 try {
-                    Integer.valueOf(key.substring(PARAMS_SERVICE_WRAPPER_PREFIX.length()));
+                    index = Integer.valueOf(key.substring(PARAMS_SERVICE_WRAPPER_PREFIX.length()));
                 } catch (NumberFormatException e) {
                     throw new CmisRuntimeException("Invalid service wrapper configuration: " + key, e);
                 }
@@ -120,8 +150,8 @@ public class CmisServiceWrapperManager {
                         throw new CmisRuntimeException("More than one service wrapper at the same position: " + index);
                     }
 
-                    LOG.debug("Found wrapper [{}] {} ({})", index, wrapperClass.getName(),
-                            params == null ? "" : params.toString());
+                    LOG.trace("Found wrapper at index {}: {}{}", index, wrapperClass.getName(), params == null ? ""
+                            : params.toString());
 
                     wrappers.put(index, new WrapperDefinition(
                             (Class<? extends AbstractCmisServiceWrapper>) wrapperClass, params));
@@ -129,9 +159,26 @@ public class CmisServiceWrapperManager {
             }
         }
 
-        for (WrapperDefinition def : wrappers.values()) {
-            wrapperDefinitions.add(def);
-            LOG.debug("Added outer service wrapper: {}", def.getWrapperClass().getName());
+        if (!wrappers.isEmpty()) {
+            WrapperDefinition first = null;
+            WrapperDefinition prev = null;
+            for (WrapperDefinition def : wrappers.values()) {
+                def.setOuterWrapper(prev);
+                prev = def;
+                if (first == null) {
+                    first = def;
+                }
+
+                LOG.debug("Added service wrapper: {}", def.getWrapperClass().getName());
+            }
+
+            if (outerMost == null) {
+                outerMost = first;
+                innerMost = prev;
+            } else {
+                outerMost.setOuterWrapper(prev);
+                outerMost = first;
+            }
         }
     }
 
@@ -139,8 +186,13 @@ public class CmisServiceWrapperManager {
      * Removes the outer-most wrapper.
      */
     public void removeOuterWrapper() {
-        if (!wrapperDefinitions.isEmpty()) {
-            wrapperDefinitions.removeLast();
+        if (outerMost != null) {
+            outerMost = outerMost.getInnerWrapper();
+            if (outerMost == null) {
+                innerMost = null;
+            } else {
+                outerMost.setOuterWrapper(null);
+            }
         }
     }
 
@@ -148,8 +200,13 @@ public class CmisServiceWrapperManager {
      * Removes the inner-most wrapper.
      */
     public void removeInnerWrapper() {
-        if (!wrapperDefinitions.isEmpty()) {
-            wrapperDefinitions.removeFirst();
+        if (innerMost != null) {
+            innerMost = innerMost.getOuterWrapper();
+            if (innerMost == null) {
+                outerMost = null;
+            } else {
+                innerMost.setInnerWrapper(null);
+            }
         }
     }
 
@@ -163,8 +220,10 @@ public class CmisServiceWrapperManager {
     public CmisService wrap(CmisService service) {
         CmisService result = service;
 
-        for (WrapperDefinition def : wrapperDefinitions) {
+        WrapperDefinition def = innerMost;
+        while (def != null) {
             result = def.createWrapperObject(result);
+            def = def.getOuterWrapper();
         }
 
         return result;
@@ -172,19 +231,17 @@ public class CmisServiceWrapperManager {
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder("[ ");
+        StringBuilder sb = new StringBuilder();
 
-        int i = 0;
-        for (WrapperDefinition def : wrapperDefinitions) {
-            if (i > 0) {
-                sb.append(",");
-            }
+        WrapperDefinition def = outerMost;
+        while (def != null) {
 
-            sb.append(i);
-            sb.append(": ");
-            sb.append(def.getWrapperClass().getName());
+            sb.append('[');
+            sb.append(def.toString());
+            sb.append(']');
+
+            def = def.getInnerWrapper();
         }
-        sb.append("]");
 
         return sb.toString();
     }
@@ -200,6 +257,9 @@ public class CmisServiceWrapperManager {
         private final Constructor<? extends AbstractCmisServiceWrapper> wrapperConstructor;
         private final Object[] params;
 
+        private WrapperDefinition outer;
+        private WrapperDefinition inner;
+
         public WrapperDefinition(Class<? extends AbstractCmisServiceWrapper> wrapperClass, Object... params) {
             this.wrapperClass = wrapperClass;
             this.params = params;
@@ -231,5 +291,40 @@ public class CmisServiceWrapperManager {
                         + e.toString(), e);
             }
         }
+
+        public void setOuterWrapper(WrapperDefinition wrapper) {
+            outer = wrapper;
+            if (wrapper != null) {
+                wrapper.inner = this;
+            }
+        }
+
+        public WrapperDefinition getOuterWrapper() {
+            return outer;
+        }
+
+        public void setInnerWrapper(WrapperDefinition wrapper) {
+            inner = wrapper;
+            if (wrapper != null) {
+                wrapper.outer = this;
+            }
+        }
+
+        public WrapperDefinition getInnerWrapper() {
+            return inner;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder(wrapperClass.getName());
+            if (params != null) {
+                for (int i = 0; i < params.length; i++) {
+                    sb.append(',');
+                    sb.append(params[i]);
+                }
+            }
+
+            return sb.toString();
+        }
     }
 }

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManagerTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManagerTest.java?rev=1574843&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManagerTest.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManagerTest.java Thu Mar  6 11:33:53 2014
@@ -0,0 +1,214 @@
+/*
+ *
+ * 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.chemistry.opencmis.server.support.wrapper;
+
+import static org.junit.Assert.assertTrue;
+
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
+import org.apache.chemistry.opencmis.commons.data.ObjectData;
+import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
+import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
+import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
+import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
+import org.apache.chemistry.opencmis.commons.impl.server.AbstractCmisService;
+import org.apache.chemistry.opencmis.commons.server.CmisService;
+import org.junit.Test;
+
+public class CmisServiceWrapperManagerTest {
+
+    @Test
+    public void testWrapperManager() {
+        CmisServiceWrapperManager manager = new CmisServiceWrapperManager();
+
+        manager.addOuterWrapper(SimpleLoggingCmisServiceWrapper.class);
+        manager.addOuterWrapper(ConformanceCmisServiceWrapper.class, -1, 100, -1, 1000);
+        manager.addOuterWrapper(SimpleLoggingCmisServiceWrapper.class, "outer");
+        manager.addInnerWrapper(SimpleLoggingCmisServiceWrapper.class, "inner");
+
+        DummyService service = new DummyService();
+        CmisService wrapperedService = manager.wrap(service);
+        assertTrue(wrapperedService instanceof AbstractCmisServiceWrapper);
+
+        AbstractCmisServiceWrapper wrapper = (AbstractCmisServiceWrapper) wrapperedService;
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof ConformanceCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        assertTrue(wrapper.getWrappedService() instanceof DummyService);
+
+        // removing outer wrapper
+        manager.removeOuterWrapper();
+
+        service = new DummyService();
+        wrapperedService = manager.wrap(service);
+
+        assertTrue(wrapperedService instanceof AbstractCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapperedService;
+        assertTrue(wrapper instanceof ConformanceCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        assertTrue(wrapper.getWrappedService() instanceof DummyService);
+
+        // removing inner wrapper
+        manager.removeInnerWrapper();
+
+        service = new DummyService();
+        wrapperedService = manager.wrap(service);
+
+        assertTrue(wrapperedService instanceof AbstractCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapperedService;
+        assertTrue(wrapper instanceof ConformanceCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        assertTrue(wrapper.getWrappedService() instanceof DummyService);
+    }
+
+    @Test
+    public void testWrapperManagerFromParameters() {
+        Map<String, String> parameters = new HashMap<String, String>();
+
+        parameters.put("dummy", "something");
+
+        parameters.put("servicewrapper.1", SimpleLoggingCmisServiceWrapper.class.getName() + ",1");
+        parameters.put("servicewrapper.2", ConformanceCmisServiceWrapper.class.getName() + ",2");
+        parameters.put("servicewrapper.3", SimpleLoggingCmisServiceWrapper.class.getName() + ",3");
+        parameters.put("servicewrapper.4", SimpleLoggingCmisServiceWrapper.class.getName() + ",4");
+
+        CmisServiceWrapperManager manager = new CmisServiceWrapperManager();
+        manager.addWrappersFromServiceFactoryParameters(parameters);
+
+        DummyService service = new DummyService();
+        CmisService wrapperedService = manager.wrap(service);
+        assertTrue(wrapperedService instanceof AbstractCmisServiceWrapper);
+
+        AbstractCmisServiceWrapper wrapper = (AbstractCmisServiceWrapper) wrapperedService;
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof ConformanceCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        assertTrue(wrapper.getWrappedService() instanceof DummyService);
+
+        // removing outer wrapper
+        manager.removeOuterWrapper();
+
+        service = new DummyService();
+        wrapperedService = manager.wrap(service);
+
+        assertTrue(wrapperedService instanceof AbstractCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapperedService;
+        assertTrue(wrapper instanceof ConformanceCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        assertTrue(wrapper.getWrappedService() instanceof DummyService);
+
+        // removing inner wrapper
+        manager.removeInnerWrapper();
+
+        service = new DummyService();
+        wrapperedService = manager.wrap(service);
+
+        assertTrue(wrapperedService instanceof AbstractCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapperedService;
+        assertTrue(wrapper instanceof ConformanceCmisServiceWrapper);
+
+        wrapper = (AbstractCmisServiceWrapper) wrapper.getWrappedService();
+        assertTrue(wrapper instanceof SimpleLoggingCmisServiceWrapper);
+
+        assertTrue(wrapper.getWrappedService() instanceof DummyService);
+    }
+
+    private static class DummyService extends AbstractCmisService {
+
+        @Override
+        public List<RepositoryInfo> getRepositoryInfos(ExtensionsData extension) {
+            return null;
+        }
+
+        @Override
+        public TypeDefinitionList getTypeChildren(String repositoryId, String typeId,
+                Boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
+            return null;
+        }
+
+        @Override
+        public TypeDefinition getTypeDefinition(String repositoryId, String typeId, ExtensionsData extension) {
+            return null;
+        }
+
+        @Override
+        public ObjectInFolderList getChildren(String repositoryId, String folderId, String filter, String orderBy,
+                Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
+                Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
+            return null;
+        }
+
+        @Override
+        public List<ObjectParentData> getObjectParents(String repositoryId, String objectId, String filter,
+                Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
+                Boolean includeRelativePathSegment, ExtensionsData extension) {
+            return null;
+        }
+
+        @Override
+        public ObjectData getObject(String repositoryId, String objectId, String filter,
+                Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
+                Boolean includePolicyIds, Boolean includeAcl, ExtensionsData extension) {
+            return null;
+        }
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/test/java/org/apache/chemistry/opencmis/server/support/wrapper/CmisServiceWrapperManagerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native