You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by sk...@apache.org on 2010/03/19 19:37:22 UTC

svn commit: r925375 - in /incubator/chemistry/trunk/opencmis/opencmis-client: opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/ opencmis-client-impl/src/m...

Author: sklevenz
Date: Fri Mar 19 18:37:21 2010
New Revision: 925375

URL: http://svn.apache.org/viewvc?rev=925375&view=rev
Log:
Further improvements in r/w unit test cases.
Small API optimization in ObjectFactory

Modified:
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentPropertyImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/AbstractSessionTest.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/WriteObjectTest.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/mock/MockSessionFactory.java

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java?rev=925375&r1=925374&r2=925375&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java Fri Mar 19 18:37:21 2010
@@ -90,9 +90,9 @@ public interface ObjectFactory {
 
   // properties
 
-  <T> Property<T> createProperty(PropertyDefinition<T> type, T value);
+  <T> Property<T> createProperty(PropertyDefinition<?> type, T value);
 
-  <T> Property<T> createPropertyMultivalue(PropertyDefinition<T> type, List<T> values);
+  <T> Property<T> createPropertyMultivalue(PropertyDefinition<?> type, List<T> values);
 
   Map<String, Property<?>> convertProperties(ObjectType objectType, PropertiesData properties);
 

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentPropertyImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentPropertyImpl.java?rev=925375&r1=925374&r2=925375&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentPropertyImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentPropertyImpl.java Fri Mar 19 18:37:21 2010
@@ -42,7 +42,8 @@ public class PersistentPropertyImpl<T> i
   /**
    * Constructs a single-value property.
    */
-  public PersistentPropertyImpl(PropertyDefinition<T> type, T value) {
+  @SuppressWarnings("unchecked")
+  public PersistentPropertyImpl(PropertyDefinition<?> type, T value) {
     if (type == null) {
       throw new IllegalArgumentException("Type must be set!");
     }
@@ -51,19 +52,20 @@ public class PersistentPropertyImpl<T> i
       throw new IllegalArgumentException("Value must be set!");
     }
 
-    this.type = type;
+    this.type = (PropertyDefinition<T>) type;
     this.values = Collections.singletonList(value);
   }
 
   /**
    * Constructs a multi-value property.
    */
-  public PersistentPropertyImpl(PropertyDefinition<T> type, List<T> values) {
+  @SuppressWarnings("unchecked")
+  public PersistentPropertyImpl(PropertyDefinition<?> type, List<T> values) {
     if (type == null) {
       throw new IllegalArgumentException("Type must be set!");
     }
 
-    this.type = type;
+    this.type = (PropertyDefinition<T>) type;
     this.values = values;
   }
 

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java?rev=925375&r1=925374&r2=925375&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java Fri Mar 19 18:37:21 2010
@@ -173,7 +173,7 @@ public class PersistentObjectFactoryImpl
    */
   public AccessControlList convertAces(List<Ace> aces) {
     if (aces == null) {
-      throw new IllegalArgumentException("ACEs must be set!");
+      return null;
     }
 
     ProviderObjectFactory pof = getProviderObjectFactory();
@@ -349,7 +349,7 @@ public class PersistentObjectFactoryImpl
    * org.apache.opencmis.client.api.repository.ObjectFactory#createProperty(org.apache.opencmis.
    * commons.api.PropertyDefinition, java.lang.Object)
    */
-  public <T> Property<T> createProperty(PropertyDefinition<T> type, T value) {
+  public <T> Property<T> createProperty(PropertyDefinition<?> type, T value) {
     return new PersistentPropertyImpl<T>(type, value);
   }
 
@@ -360,7 +360,7 @@ public class PersistentObjectFactoryImpl
    * org.apache.opencmis.client.api.repository.ObjectFactory#createPropertyMultivalue(org.apache
    * .opencmis.commons.api.PropertyDefinition, java.util.List)
    */
-  public <T> Property<T> createPropertyMultivalue(PropertyDefinition<T> type, List<T> values) {
+  public <T> Property<T> createPropertyMultivalue(PropertyDefinition<?> type, List<T> values) {
     return new PersistentPropertyImpl<T>(type, values);
   }
 

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/AbstractSessionTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/AbstractSessionTest.java?rev=925375&r1=925374&r2=925375&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/AbstractSessionTest.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/AbstractSessionTest.java Fri Mar 19 18:37:21 2010
@@ -24,61 +24,84 @@ import java.util.Properties;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.log4j.PropertyConfigurator;
-import org.apache.opencmis.client.api.ObjectId;
 import org.apache.opencmis.client.api.Session;
 import org.apache.opencmis.client.api.SessionFactory;
 import org.apache.opencmis.client.runtime.mock.MockSessionFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.rules.MethodRule;
+import org.junit.rules.TestWatchman;
+import org.junit.runners.model.FrameworkMethod;
 
 /**
  * Create a OpenCMIS test session based on fixture parameter.
  */
 public abstract class AbstractSessionTest {
 
-	protected Log log = LogFactory.getLog(this.getClass());
+  protected Log log = LogFactory.getLog(this.getClass());
 
-	@BeforeClass
-	public static void classSetup() {
-		AbstractSessionTest.initializeLogging();
-		Fixture.logHeader();
-	}
-
-	/**
-	 * Initialize logging support.
-	 */
-	private static void initializeLogging() {
-		Properties p = new Properties();
-		try {
-			p.load(AbstractSessionTest.class
-					.getResourceAsStream("/log4j.properties"));
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-		PropertyConfigurator.configure(p);
-	}
-
-	/**
-	 * test session
-	 */
-	protected Session session = null;
-
-	@Before
-	public void setUp() throws Exception {
-		SessionFactory factory = Fixture.getSessionFactory();
-		this.session = factory.createSession(Fixture.getParamter());
-
-		if (!(factory instanceof MockSessionFactory)) {
-			Fixture.setUpTestData(this.session);
-		}
-	}
-
-	@After
-	public void tearDown() throws Exception {
-		SessionFactory factory = Fixture.getSessionFactory();
-		if (!(factory instanceof MockSessionFactory)) {
-			Fixture.teardownTestData(this.session);
-		}
-	}
+  /**
+   * trace each junit error
+   */
+  @Rule
+  public MethodRule watch = new TestWatchman() {
+    @Override
+    public void failed(Throwable e, FrameworkMethod method) {
+      super.failed(e, method);
+      AbstractSessionTest.this.log.error(method.getName(), e);
+    }
+  };
+
+  @BeforeClass
+  public static void classSetup() {
+    AbstractSessionTest.initializeLogging();
+    Fixture.logHeader();
+  }
+
+  /**
+   * Initialize logging support.
+   */
+  private static void initializeLogging() {
+    Properties p = new Properties();
+    try {
+      p.load(AbstractSessionTest.class.getResourceAsStream("/log4j.properties"));
+    }
+    catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    PropertyConfigurator.configure(p);
+  }
+
+  /**
+   * test session
+   */
+  protected Session session = null;
+
+  @Before
+  public void setUp() throws Exception {
+    SessionFactory factory = Fixture.getSessionFactory();
+    this.session = factory.createSession(Fixture.getParamter());
+
+    if (!(factory instanceof MockSessionFactory)) {
+      Fixture.setUpTestData(this.session);
+    }
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    SessionFactory factory = Fixture.getSessionFactory();
+    if (!(factory instanceof MockSessionFactory)) {
+      Fixture.teardownTestData(this.session);
+    }
+  }
+
+  /**
+   * skip tests not supported by mock implementation
+   * @return flag
+   */
+  protected boolean isMock() {
+    return Fixture.getSessionFactory() instanceof MockSessionFactory;
+  }
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/WriteObjectTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/WriteObjectTest.java?rev=925375&r1=925374&r2=925375&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/WriteObjectTest.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/WriteObjectTest.java Fri Mar 19 18:37:21 2010
@@ -18,133 +18,136 @@
  */
 package org.apache.opencmis.client.runtime;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
 
 import junit.framework.Assert;
 
-import org.apache.opencmis.client.api.Ace;
+import org.apache.opencmis.client.api.ContentStream;
+import org.apache.opencmis.client.api.Document;
 import org.apache.opencmis.client.api.ObjectId;
-import org.apache.opencmis.client.api.Policy;
 import org.apache.opencmis.client.api.Property;
 import org.apache.opencmis.client.api.objecttype.ObjectType;
 import org.apache.opencmis.commons.api.PropertyDefinition;
-import org.apache.opencmis.commons.enums.BaseObjectTypeIds;
 import org.apache.opencmis.commons.enums.CmisProperties;
+import org.apache.opencmis.commons.enums.VersioningState;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class WriteObjectTest extends AbstractSessionTest {
 
-	@Test
-	public void createFolder() {
-		ObjectId parentId = this.session
-				.createObjectId(Fixture.getTestRootId());
-		String folderName = UUID.randomUUID().toString();
-		String typeId = FixtureData.FOLDER_TYPE_ID.value();
-
-		ObjectType ot = this.session.getTypeDefinition(typeId);
-		Map<String, PropertyDefinition<?>> pdefs = ot.getPropertyDefintions();
-		List<Property<?>> properties = new ArrayList<Property<?>>();
-		Property<?> prop = null;
-
-		for (PropertyDefinition<?> pd : pdefs.values()) {
-			try {
-				CmisProperties cmisp = CmisProperties.fromValue(pd.getId());
-				switch (cmisp) {
-				case NAME:
-					prop = this.session.getObjectFactory().createProperty(
-							(PropertyDefinition<String>) pd, folderName);
-					properties.add(prop);
-					break;
-				case OBJECT_TYPE_ID:
-					prop = this.session.getObjectFactory().createProperty(
-							(PropertyDefinition<String>) pd, typeId);
-					properties.add(prop);
-					break;
-				default:
-					break;
-				}
-			} catch (Exception e) {
-				// custom property definition
-			}
-
-		}
-
-		List<Ace> addAce = new ArrayList<Ace>();
-		List<Ace> removeAce = new ArrayList<Ace>();
-		List<Policy> policies = new ArrayList<Policy>();
-		ObjectId id = this.session.createFolder(properties, parentId, policies,
-				addAce, removeAce);
-		Assert.assertNotNull(id);
-	}
-
-	/**
-	 * Method to create named and typed folder using a given parent id.
-	 * 
-	 * @param foldeName
-	 *            Name of folder to create
-	 * @param parentId
-	 *            Id of parent folder to create this folder as a child
-	 */
-	@SuppressWarnings("unchecked")
-	public void createFolder(String folderName, ObjectId parentId) {
-		// retrieve all property definitions for specific cmis type
-		ObjectType ot = this.session.getTypeDefinition("cmis:folder");
-		Map<String, PropertyDefinition<?>> pdefs = ot.getPropertyDefintions();
-
-		// get property definitions from object type
-		PropertyDefinition<String> pdName = (PropertyDefinition<String>) pdefs
-				.get(CmisProperties.NAME.value());
-		PropertyDefinition<String> pdType = (PropertyDefinition<String>) pdefs
-				.get(CmisProperties.OBJECT_TYPE_ID.value());
-
-		// create mandatory properties of object type
-		Property<?> propName = this.session.getObjectFactory().createProperty(
-				pdName, folderName);
-		Property<?> propType = this.session.getObjectFactory().createProperty(
-				pdType, "cmis:folder");
-
-		// fill properties list
-		List<Property<?>> properties = new ArrayList<Property<?>>();
-		properties.add(propName);
-		properties.add(propType);
-
-		// create additional optional parameter
-		List<Ace> ace = new ArrayList<Ace>();
-		List<Policy> pol = null;
-
-		// ready steady go
-		ObjectId id = this.session.createFolder(properties, parentId, pol, ace,
-				ace);
-		Assert.assertNotNull(id);
-	}
-
-	// public void createFolderOptimzed(String folderName, ObjectId parentId) {
-	// // retrieve all property definitions for specific cmis type
-	// ObjectType ot =
-	// this.session.getTypeDefinition(BaseObjectTypeIds.CMIS_FOLDER);
-	// Map<String, PropertyDefinition<?>> pdefs = ot.getPropertyDefintions();
-	//
-	// // get property definitions from object type
-	// PropertyDefinition<?> pdName = pdefs.get(CmisProperties.NAME);
-	// PropertyDefinition<?> pdType = pdefs.get(CmisProperties.OBJECT_TYPE_ID);
-	//
-	// // create mandatory properties of object type
-	// Property<?> propName = this.session.getObjectFactory().createProperty(
-	// pdName, folderName);
-	// Property<?> propType = this.session.getObjectFactory().createProperty(
-	// pdType, "cmis:folder");
-	//
-	// // fill properties list
-	// List<Property<?>> properties = new ArrayList<Property<?>>();
-	// properties.add(propName);
-	// properties.add(propType);
-	//
-	// // ready steady go
-	// ObjectId id = this.session.createFolder(properties, parentId);
-	// Assert.assertNotNull(id);
-	// }
-
+  @Test
+  public void createFolder() {
+    ObjectId parentId = this.session.createObjectId(Fixture.getTestRootId());
+    String folderName = UUID.randomUUID().toString();
+    String typeId = FixtureData.FOLDER_TYPE_ID.value();
+
+    ObjectType ot = this.session.getTypeDefinition(typeId);
+    Collection<PropertyDefinition<?>> pdefs = ot.getPropertyDefintions().values();
+    List<Property<?>> properties = new ArrayList<Property<?>>();
+    Property<?> prop = null;
+
+    for (PropertyDefinition<?> pd : pdefs) {
+      try {
+        CmisProperties cmisp = CmisProperties.fromValue(pd.getId());
+        switch (cmisp) {
+        case NAME:
+          prop = this.session.getObjectFactory().createProperty(pd, folderName);
+          properties.add(prop);
+          break;
+        case OBJECT_TYPE_ID:
+          prop = this.session.getObjectFactory().createProperty(pd, typeId);
+          properties.add(prop);
+          break;
+        default:
+          break;
+        }
+      }
+      catch (Exception e) {
+        // custom property definition
+      }
+
+    }
+
+    ObjectId id = this.session.createFolder(properties, parentId, null, null, null);
+    Assert.assertNotNull(id);
+  }
+
+  @Test
+  public void createDocument() throws IOException {
+    ObjectId parentId = this.session.createObjectId(Fixture.getTestRootId());
+    String folderName = UUID.randomUUID().toString();
+    String typeId = FixtureData.DOCUMENT_TYPE_ID.value();
+
+    ObjectType ot = this.session.getTypeDefinition(typeId);
+    Collection<PropertyDefinition<?>> pdefs = ot.getPropertyDefintions().values();
+    List<Property<?>> properties = new ArrayList<Property<?>>();
+    Property<?> prop = null;
+
+    for (PropertyDefinition<?> pd : pdefs) {
+      try {
+        CmisProperties cmisp = CmisProperties.fromValue(pd.getId());
+        switch (cmisp) {
+        case NAME:
+          prop = this.session.getObjectFactory().createProperty(pd, folderName);
+          properties.add(prop);
+          break;
+        case OBJECT_TYPE_ID:
+          prop = this.session.getObjectFactory().createProperty(pd, typeId);
+          properties.add(prop);
+          break;
+        default:
+          break;
+        }
+      }
+      catch (Exception e) {
+        // custom property definition (note: document type should not have further mandatory
+        // properties)
+      }
+
+    }
+
+    String filename = UUID.randomUUID().toString();
+    String mimetype = "text/html; charset=UTF-8";
+    String content1 = "Im Walde rauscht ein Wasserfall. Wenn's nicht mehr rauscht ist's Wasser all.";
+
+    byte[] buf1 = content1.getBytes("UTF-8");
+    ByteArrayInputStream in1 = new ByteArrayInputStream(buf1);
+    ContentStream contentStream = this.session.getObjectFactory().createContentStream(filename,
+        buf1.length, mimetype, in1);
+    Assert.assertNotNull(contentStream);
+
+    ObjectId id = this.session.createDocument(properties, parentId, contentStream,
+        VersioningState.NONE, null, null, null);
+    Assert.assertNotNull(id);
+
+    // verify content (which is not supported by mock)
+    if (this.isMock()) {
+      return;  
+    }
+    Document doc = (Document) this.session.getObject(id);
+    Assert.assertNotNull(doc);
+//    Assert.assertEquals(buf1.length, doc.getContentStreamLength());
+//    Assert.assertEquals(mimetype, doc.getContentStreamMimeType());
+//    Assert.assertEquals(filename, doc.getContentStreamFileName());
+    ContentStream readStream = doc.getContentStream();
+    InputStream in2 = readStream.getStream();
+    StringBuffer sbuf = null;
+    sbuf = new StringBuffer(in2.available());
+    int count;
+    byte[] buf2 = new byte[100];
+    while ((count = in2.read(buf2)) != -1) {
+      for (int i = 0; i < count; i++) {
+        sbuf.append((char) buf2[i]);
+      }
+    }
+    in2.close();
+    String content2 = sbuf.toString();
+    Assert.assertEquals(content1, content2);
+  }
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/mock/MockSessionFactory.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/mock/MockSessionFactory.java?rev=925375&r1=925374&r2=925375&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/mock/MockSessionFactory.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/mock/MockSessionFactory.java Fri Mar 19 18:37:21 2010
@@ -18,12 +18,15 @@
  */
 package org.apache.opencmis.client.runtime.mock;
 
+import static org.easymock.EasyMock.anyLong;
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 
 import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -79,6 +82,7 @@ import org.apache.opencmis.commons.enums
 import org.apache.opencmis.commons.enums.PropertyType;
 import org.apache.opencmis.commons.enums.SessionType;
 import org.apache.opencmis.commons.enums.TypeOfChanges;
+import org.apache.opencmis.commons.enums.VersioningState;
 import org.apache.opencmis.commons.exceptions.CmisNotSupportedException;
 
 /**
@@ -86,753 +90,686 @@ import org.apache.opencmis.commons.excep
  */
 public class MockSessionFactory implements SessionFactory {
 
-	private Session mockSession;
+  private Session mockSession;
 
-	{
-		this.idObjectIndex = new Hashtable<String, CmisObject>();
-		this.pathObjectIndex = new Hashtable<String, CmisObject>();
-		this.idTypeIndex = new Hashtable<String, ObjectType>();
-		this.mockSession = this.createMockSession();
-	}
-
-	private Hashtable<String, CmisObject> idObjectIndex = null;
-	private Hashtable<String, ObjectType> idTypeIndex = null;
-	private Hashtable<String, CmisObject> pathObjectIndex = null;
-
-	/*
-	 * properties
-	 */
-	private static String PROPERTY_VALUE_STRING = "abc";
-	private static Integer PROPERTY_VALUE_INTEGER = new Integer(4711);
-	private static Boolean PROPERTY_VALUE_BOOLEAN = new Boolean(true);
-	private static Double PROPERTY_VALUE_DOUBLE = new Double(1.0);
-	private static Float PROPERTY_VALUE_FLOAT = new Float(1.0);
-	private static String PROPERTY_VALUE_ID = "xyz";
-	private static String PROPERTY_VALUE_HTML = "<html><body>html value</body></html>";
-	private static Calendar PROPERTY_VALUE_DATETIME = GregorianCalendar
-			.getInstance();
-	private static URI PROPERTY_VALUE_URI = URI.create("http://foo.com");
-
-	@SuppressWarnings("unchecked")
-	public <T extends Session> T createSession(Map<String, String> parameters) {
-		T session = null;
-		SessionType st;
-		String p = parameters.get(SessionParameter.SESSION_TYPE);
-
-		if (p == null) {
-			st = SessionType.PERSISTENT; // default, if type is not set
-		} else {
-			st = SessionType.fromValue(p);
-		}
-
-		switch (st) {
-		case PERSISTENT:
-			session = (T) this.mockSession;
-			break;
-		case TRANSIENT:
-			throw new CmisNotSupportedException("SessionType = " + st);
-		}
-
-		return session;
-	}
-
-	@SuppressWarnings("unchecked")
-	private Session createMockSession() {
-		this.createMockGlobalTypes();
-
-		Session session = createNiceMock(Session.class);
-		Folder rootFolder = this.createMockRepositoryRootFolder();
-		this.createMockTestRootFolder("/", rootFolder);
-
-		for (String path : this.pathObjectIndex.keySet()) {
-			CmisObject o = this.pathObjectIndex.get(path);
-			expect(session.getObjectByPath(path)).andReturn(o).anyTimes();
-		}
-
-		expect(session.getRepositoryInfo()).andReturn(
-				this.createMockRepositoryInfo()).anyTimes();
-		expect(session.getRootFolder()).andReturn(rootFolder).anyTimes();
-
-		String id = rootFolder.getId();
-		ObjectId objectId = createMockObjectId(id);
-		expect(session.createObjectId(id)).andReturn(objectId).anyTimes();
-
-		expect(session.getDefaultContext()).andReturn(
-				this.createMockOperationContext()).anyTimes();
-		expect(session.getLocale()).andReturn(new Locale("EN")).anyTimes();
-		expect(session.getObjectFactory()).andReturn(
-				this.createMockObjectFactory()).anyTimes();
-
-		expect(session.getTypeDefinition(ObjectType.DOCUMENT_BASETYPE_ID))
-				.andReturn(
-						this.idTypeIndex.get(ObjectType.DOCUMENT_BASETYPE_ID))
-				.anyTimes();
-		expect(session.getTypeDefinition(ObjectType.FOLDER_BASETYPE_ID))
-				.andReturn(this.idTypeIndex.get(ObjectType.FOLDER_BASETYPE_ID))
-				.anyTimes();
-		expect(session.getTypeDefinition(ObjectType.POLICY_BASETYPE_ID))
-				.andReturn(this.idTypeIndex.get(ObjectType.POLICY_BASETYPE_ID))
-				.anyTimes();
-		expect(session.getTypeDefinition(ObjectType.RELATIONSHIP_BASETYPE_ID))
-				.andReturn(
-						this.idTypeIndex
-								.get(ObjectType.RELATIONSHIP_BASETYPE_ID))
-				.anyTimes();
-
-		if (!FixtureData.DOCUMENT_TYPE_ID.toString().equalsIgnoreCase(
-				ObjectType.DOCUMENT_BASETYPE_ID)) {
-			expect(
-					session.getTypeDefinition(FixtureData.DOCUMENT_TYPE_ID
-							.toString())).andReturn(
-					this.idTypeIndex.get(FixtureData.DOCUMENT_TYPE_ID
-							.toString())).anyTimes();
-		}
-		if (!FixtureData.FOLDER_TYPE_ID.toString().equalsIgnoreCase(
-				ObjectType.FOLDER_BASETYPE_ID)) {
-			expect(
-					session.getTypeDefinition(FixtureData.FOLDER_TYPE_ID
-							.toString()))
-					.andReturn(
-							this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID
-									.toString())).anyTimes();
-		}
-		/* document child/descendants types */
-		List<ObjectType> dtl = new ArrayList<ObjectType>();
-		dtl.add(this.idTypeIndex.get(FixtureData.DOCUMENT_TYPE_ID.toString()));
-		PagingList<ObjectType> plot = this.createMockPaging(dtl);
-		Container<ObjectType> ctdoc = this.createMockContainer(this.idTypeIndex
-				.get(FixtureData.DOCUMENT_TYPE_ID.toString()), null);
-		expect(
-				session.getTypeChildren(
-						BaseObjectTypeIds.CMIS_DOCUMENT.value(), true, 2))
-				.andReturn(plot).anyTimes();
-		expect(
-				session.getTypeDescendants(BaseObjectTypeIds.CMIS_DOCUMENT
-						.value(), 1, true)).andReturn(
-				Collections.singletonList(ctdoc)).anyTimes();
-
-		/* folder child/descendants types */
-		List<ObjectType> ftl = new ArrayList<ObjectType>();
-		ftl.add(this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()));
-		PagingList<ObjectType> plfot = this.createMockPaging(ftl);
-		Container<ObjectType> ctfolder = this.createMockContainer(
-				this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()),
-				null);
-		expect(
-				session.getTypeChildren(BaseObjectTypeIds.CMIS_FOLDER.value(),
-						true, 2)).andReturn(plfot).anyTimes();
-		expect(
-				session.getTypeDescendants(BaseObjectTypeIds.CMIS_FOLDER
-						.value(), 1, true)).andReturn(
-				Collections.singletonList(ctfolder)).anyTimes();
-
-		/* change support */
-		List<ChangeEvent> cel = this.createMockChangeEvents();
-		PagingList<ChangeEvent> plce = this.createMockPaging(cel);
-		expect(session.getContentChanges(null, -1)).andReturn(plce).anyTimes();
-
-		/* query support */
-		List<QueryResult> queryList = new ArrayList<QueryResult>();
-		for (CmisObject cm : this.idObjectIndex.values()) {
-			queryList.add(createMockQueryResult(cm));
-		}
-		PagingList<QueryResult> plq = this.createMockPaging(queryList);
-		expect(session.query(FixtureData.QUERY.toString(), false, 2))
-				.andReturn(plq).anyTimes();
-
-		this.makeObjectsAccessible(session);
-
-		/*
-		 * WRITE SUPPORT
-		 */
-		expect(
-				session.createFolder((List<Property<?>>) anyObject(),
-						(ObjectId) anyObject(), (List<Policy>) anyObject(),
-						(List<Ace>) anyObject(), (List<Ace>) anyObject()))
-				.andReturn(this.createMockObjectId()).anyTimes();
-
-		replay(session);
-
-		return session;
-	}
-
-	private ObjectId createMockObjectId() {
-		ObjectId id = createNiceMock(ObjectId.class);
-
-		replay(id);
-
-		return id;
-	}
-
-	private List<ChangeEvent> createMockChangeEvents() {
-		List<ChangeEvent> cel = new ArrayList<ChangeEvent>();
-		ChangeEvent ce = createNiceMock(ChangeEvent.class);
-		List<Property<?>> pl = new ArrayList<Property<?>>();
-
-		expect(ce.getObjectId()).andReturn(UUID.randomUUID().toString())
-				.anyTimes();
-		expect(ce.getChangeType()).andReturn(TypeOfChanges.CREATED).anyTimes();
-		expect(ce.getNewProperties()).andReturn(pl).anyTimes();
-
-		replay(ce);
-
-		cel.add(ce);
-
-		return cel;
-	}
-
-	private void makeObjectsAccessible(Session s) {
-		Enumeration<String> e = this.idObjectIndex.keys();
-		String id;
-		CmisObject obj;
-
-		while (e.hasMoreElements()) {
-			id = e.nextElement();
-			obj = this.idObjectIndex.get(id);
-
-			ObjectId objectId = createMockObjectId(id);
-			expect(s.getObject(objectId)).andReturn(obj).anyTimes();
-		}
-	}
-
-	private ObjectFactory createMockObjectFactory() {
-		ObjectFactory of = createNiceMock(ObjectFactory.class);
-
-		replay(of);
-
-		return of;
-	}
-
-	private ObjectId createMockObjectId(String id) {
-		ObjectId oid = createNiceMock(ObjectId.class);
-
-		expect(oid.getId()).andReturn(id).anyTimes();
-
-		replay(oid);
-
-		return oid;
-	}
-
-	private OperationContext createMockOperationContext() {
-		OperationContext oc = createNiceMock(OperationContext.class);
-
-		replay(oc);
-
-		return oc;
-	}
-
-	private Folder createMockTestRootFolder(String parentPath, Folder parent) {
-		Folder f = createNiceMock(Folder.class);
-
-		expect(f.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
-		expect(f.getName()).andReturn(Fixture.TEST_ROOT_FOLDER_NAME).anyTimes();
-		expect(f.getFolderParent()).andReturn(parent).anyTimes();
-		expect(f.getType()).andReturn(
-				this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()))
-				.anyTimes();
-		expect(f.getBaseType()).andReturn(
-				this.idTypeIndex.get(BaseObjectTypeIds.CMIS_FOLDER.value()))
-				.anyTimes();
-		List<CmisObject> children = new ArrayList<CmisObject>();
-		children.add(this.createMockTestFolder(f, "/"
-				+ Fixture.TEST_ROOT_FOLDER_NAME + "/"
-				+ FixtureData.FOLDER1_NAME.toString(), FixtureData.FOLDER1_NAME
-				.toString()));
-		children.add(this.createMockTestFolder(f, "/"
-				+ Fixture.TEST_ROOT_FOLDER_NAME + "/"
-				+ FixtureData.FOLDER2_NAME.toString(), FixtureData.FOLDER2_NAME
-				.toString()));
-		children.add(this.createMockTestDocument(f, "/"
-				+ Fixture.TEST_ROOT_FOLDER_NAME + "/"
-				+ FixtureData.DOCUMENT1_NAME.toString(),
-				FixtureData.DOCUMENT1_NAME.toString()));
-
-		PagingList<CmisObject> pl = this.createMockPaging(children);
-		expect(f.getChildren(1)).andReturn(pl).anyTimes();
-		expect(f.getChildren(2)).andReturn(pl).anyTimes();
-		expect(f.getChildren(1000)).andReturn(pl).anyTimes();
-
-		List<Container<FileableCmisObject>> ct = new ArrayList<Container<FileableCmisObject>>();
-		Folder f1 = this.createMockTestFolder(f, "/"
-				+ FixtureData.FOLDER1_NAME.toString(), FixtureData.FOLDER1_NAME
-				.toString());
-		Folder f2 = this.createMockTestFolder(f, "/"
-				+ FixtureData.FOLDER2_NAME.toString(), FixtureData.FOLDER2_NAME
-				.toString());
-		ct.add(this.createMockContainer((FileableCmisObject) f1, null));
-		ct.add(this.createMockContainer((FileableCmisObject) f2, null));
-
-		expect(f.getDescendants(1)).andReturn(ct).anyTimes();
-		expect(f.getDescendants(2)).andReturn(ct).anyTimes();
-		expect(f.getDescendants(1000)).andReturn(ct).anyTimes();
-		expect(f.getFolderTree(1)).andReturn(ct).anyTimes();
-		expect(f.getFolderTree(2)).andReturn(ct).anyTimes();
-		expect(f.getFolderTree(1000)).andReturn(ct).anyTimes();
-		this.createMockProperties(f);
-
-		replay(f);
-		this.idObjectIndex.put(f.getId(), f);
-		this.pathObjectIndex.put(parentPath + Fixture.TEST_ROOT_FOLDER_NAME, f);
-
-		return f;
-	}
-
-	@SuppressWarnings("unchecked")
-	private void createMockProperties(CmisObject o) {
-		GregorianCalendar date = new GregorianCalendar();
-
-		expect(o.getCreatedBy()).andReturn(
-				Fixture.getParamter().get(SessionParameter.USER)).anyTimes();
-		expect(o.getLastModifiedBy()).andReturn(
-				Fixture.getParamter().get(SessionParameter.USER)).anyTimes();
-		expect(o.getLastModificationDate()).andReturn(date).anyTimes();
-		expect(o.getCreationDate()).andReturn(date).anyTimes();
-
-		{
-			ArrayList a = new ArrayList<Property<Property>>();
-
-			// mandatory default properties
-			a.add(this.createMockStringProperty(PropertyIds.CMIS_BASE_TYPE_ID));
-			a.add(this.createMockStringProperty(PropertyIds.CMIS_NAME));
-			a
-					.add(this
-							.createMockIntegerProperty(PropertyIds.CMIS_CONTENT_STREAM_LENGTH));
-
-			// other properties
-			a.add(this.createMockBooleanProperty(UUID.randomUUID().toString()));
-			a
-					.add(this.createMockDateTimeProperty(UUID.randomUUID()
-							.toString()));
-			a.add(this.createMockFloatProperty(UUID.randomUUID().toString()));
-			a.add(this.createMockDoubleProperty(UUID.randomUUID().toString()));
-			a.add(this.createMockHtmlProperty(UUID.randomUUID().toString()));
-			a.add(this.createMockIdProperty(UUID.randomUUID().toString()));
-			a.add(this.createMockUriProperty(UUID.randomUUID().toString()));
-
-			expect(o.getProperties()).andReturn(a).anyTimes();
-			// expect(o.getProperties(Fixture.PROPERTY_FILTER)).andReturn(a)
-			// .anyTimes();
-
-			/* single property */
-			Property<Object> p1 = (Property<Object>) createMockStringProperty(CmisProperties.OBJECT_ID
-					.value());
-			expect(o.getProperty(CmisProperties.OBJECT_ID.value())).andReturn(
-					p1).anyTimes();
-			expect(o.getPropertyValue(CmisProperties.OBJECT_ID.value()))
-					.andReturn(p1.getValue()).anyTimes();
-
-			/* multi valued property */
-			Property<Object> p2 = (Property<Object>) createMockMultiValuedStringProperty(FixtureData.PROPERTY_NAME_STRING_MULTI_VALUED
-					.toString());
-			expect(
-					o.getProperty(FixtureData.PROPERTY_NAME_STRING_MULTI_VALUED
-							.toString())).andReturn(p2).anyTimes();
-			expect(
-					o
-							.getPropertyMultivalue(FixtureData.PROPERTY_NAME_STRING_MULTI_VALUED
-									.toString())).andReturn(p2.getValues())
-					.anyTimes();
-		}
-
-	}
-
-	private Property<?> createMockMultiValuedStringProperty(String id) {
-		Property<String> p = createNiceMock(StringProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.STRING).anyTimes();
-		expect(p.getValue())
-				.andReturn(MockSessionFactory.PROPERTY_VALUE_STRING).anyTimes();
-		expect(p.isMultiValued()).andReturn(true).anyTimes();
-		List<String> v = new ArrayList<String>();
-		v.add(MockSessionFactory.PROPERTY_VALUE_STRING);
-		v.add(MockSessionFactory.PROPERTY_VALUE_STRING);
-		expect(p.getValues()).andReturn(v).anyTimes();
-		expect(p.getValueAsString()).andReturn(v.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockDateTimeProperty(String id) {
-		Property<Calendar> p = createNiceMock(DateTimeProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.DATETIME).anyTimes();
-		expect(p.getValue()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_DATETIME).anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_DATETIME.toString())
-				.anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockHtmlProperty(String id) {
-		Property<String> p = createNiceMock(StringProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.HTML).anyTimes();
-		expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_HTML)
-				.anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_HTML.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockIdProperty(String id) {
-		Property<String> p = createNiceMock(StringProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.ID).anyTimes();
-		expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_ID)
-				.anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_ID.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockUriProperty(String id) {
-		Property<URI> p = createNiceMock(UriProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.URI).anyTimes();
-		expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_URI)
-				.anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_URI.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockDoubleProperty(String id) {
-		Property<Double> p = createNiceMock(DoubleProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.DECIMAL).anyTimes();
-		expect(p.getValue())
-				.andReturn(MockSessionFactory.PROPERTY_VALUE_DOUBLE).anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_DOUBLE.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockFloatProperty(String id) {
-		Property<Float> p = createNiceMock(FloatProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.DECIMAL).anyTimes();
-		expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_FLOAT)
-				.anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_FLOAT.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockBooleanProperty(String id) {
-		Property<Boolean> p = createNiceMock(BooleanProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.BOOLEAN).anyTimes();
-		expect(p.getValue()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_BOOLEAN).anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_BOOLEAN.toString())
-				.anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockIntegerProperty(String id) {
-		Property<Integer> p = createNiceMock(IntegerProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.INTEGER).anyTimes();
-		expect(p.getValue()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_INTEGER).anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_INTEGER.toString())
-				.anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private Property<?> createMockStringProperty(String id) {
-		Property<String> p = createNiceMock(StringProperty.class);
-
-		expect(p.getType()).andReturn(PropertyType.STRING).anyTimes();
-		expect(p.getValue())
-				.andReturn(MockSessionFactory.PROPERTY_VALUE_STRING).anyTimes();
-		expect(p.getValueAsString()).andReturn(
-				MockSessionFactory.PROPERTY_VALUE_STRING.toString()).anyTimes();
-
-		replay(p);
-
-		return p;
-	}
-
-	private CmisObject createMockTestDocument(Folder parent, String path,
-			String name) {
-		Document d = createNiceMock(Document.class);
-
-		expect(d.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
-		expect(d.getName()).andReturn(name).anyTimes();
-		expect(d.getType()).andReturn(
-				this.idTypeIndex.get(FixtureData.DOCUMENT_TYPE_ID.toString()))
-				.anyTimes();
-		expect(d.getBaseType()).andReturn(
-				this.idTypeIndex.get(BaseObjectTypeIds.CMIS_DOCUMENT.value()))
-				.anyTimes();
-		this.createMockProperties(d);
-		expect(d.getContentStream()).andReturn(this.createMockContentStream())
-				.anyTimes();
-
-		replay(d);
-		this.idObjectIndex.put(d.getId(), d);
-		this.pathObjectIndex.put(path, d);
-
-		return d;
-	}
-
-	private ContentStream createMockContentStream() {
-		ContentStream cs = createNiceMock(ContentStream.class);
-
-		byte[] b = "abc".getBytes();
-		ByteArrayInputStream bais = new ByteArrayInputStream(b);
-
-		expect(cs.getFileName()).andReturn("file.txt").anyTimes();
-		expect(cs.getMimeType()).andReturn("text/html").anyTimes();
-		expect(cs.getLength()).andReturn((long) b.length).anyTimes();
-		expect(cs.getStream()).andReturn(bais).anyTimes();
-
-		replay(cs);
-
-		return cs;
-	}
-
-	private Folder createMockTestFolder(Folder parent, String path, String name) {
-		Folder f = createNiceMock(Folder.class);
-
-		expect(f.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
-		expect(f.getName()).andReturn(name).anyTimes();
-		expect(f.getFolderParent()).andReturn(parent).anyTimes();
-		expect(f.getType()).andReturn(
-				this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()))
-				.anyTimes();
-		expect(f.getBaseType()).andReturn(
-				this.idTypeIndex.get(BaseObjectTypeIds.CMIS_FOLDER.value()))
-				.anyTimes();
-		List<CmisObject> children = new ArrayList<CmisObject>();
-		children.add(this.createMockTestDocument(f, path + "/"
-				+ FixtureData.DOCUMENT1_NAME.toString(),
-				FixtureData.DOCUMENT1_NAME.toString()));
-		children.add(this.createMockTestDocument(f, path + "/"
-				+ FixtureData.DOCUMENT2_NAME.toString(),
-				FixtureData.DOCUMENT2_NAME.toString()));
-
-		PagingList<CmisObject> pl = this.createMockPaging(children);
-		expect(f.getChildren(null, -1)).andReturn(pl).anyTimes();
-
-		List<Container<FileableCmisObject>> ctlist = new ArrayList<Container<FileableCmisObject>>();
-		expect(f.getDescendants(-1)).andReturn(ctlist).anyTimes();
-		expect(f.getFolderTree(-1)).andReturn(ctlist).anyTimes();
-		this.createMockProperties(f);
-
-		replay(f);
-		this.idObjectIndex.put(f.getId(), f);
-
-		return f;
-	}
-
-	private QueryResult createMockQueryResult(CmisObject cmisObject) {
-		QueryResult qr = createNiceMock(QueryResult.class);
-
-		return qr;
-	}
-
-	@SuppressWarnings( { "unchecked" })
-	private <T> PagingList<T> createMockPaging(List<T> items) {
-		PagingList<T> pl = createNiceMock(PagingList.class);
-
-		ArrayList<List<T>> a = new ArrayList<List<T>>();
-		a.add(items);
-		Iterator<List<T>> i = a.iterator();
-
-		expect(pl.get(0)).andReturn(items).anyTimes();
-		// expect(pl.isEmpty()).andReturn(false).anyTimes();
-		expect(pl.iterator()).andReturn(i).anyTimes();
-
-		replay(pl);
-
-		return pl;
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T> Container<T> createMockContainer(T item,
-			List<Container<T>> children) {
-		Container<T> c = createNiceMock(Container.class);
-
-		expect(c.getItem()).andReturn(item).anyTimes();
-		expect(c.getChildren()).andReturn(children).anyTimes();
-
-		replay(c);
-
-		return c;
-	}
-
-	private void createMockGlobalTypes() {
-		FolderType bft = createNiceMock(FolderType.class);
-		expect(bft.getId()).andReturn(ObjectType.FOLDER_BASETYPE_ID).anyTimes();
-		expect(bft.isBaseType()).andReturn(true);
-		expect(bft.getBaseType()).andReturn(null).anyTimes();
-		expect(bft.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>())).anyTimes();
-		
-		FolderType ft = createNiceMock(FolderType.class);
-		expect(ft.getId()).andReturn(FixtureData.FOLDER_TYPE_ID.toString())
-				.anyTimes();
-		expect(ft.isBaseType()).andReturn(false);
-		expect(ft.getBaseType()).andReturn(bft).anyTimes();
-		expect(ft.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>())).anyTimes();
-
-		PolicyType bpt = createNiceMock(PolicyType.class);
-		expect(bpt.getId()).andReturn(ObjectType.POLICY_BASETYPE_ID).anyTimes();
-		expect(bpt.isBaseType()).andReturn(true);
-		expect(bpt.getBaseType()).andReturn(null).anyTimes();
-		expect(bpt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>())).anyTimes();
-
-		RelationshipType brt = createNiceMock(RelationshipType.class);
-		expect(brt.getId()).andReturn(ObjectType.RELATIONSHIP_BASETYPE_ID)
-				.anyTimes();
-		expect(brt.isBaseType()).andReturn(true);
-		expect(brt.getBaseType()).andReturn(null).anyTimes();
-		expect(brt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>())).anyTimes();
-
-		DocumentType bdt = createNiceMock(DocumentType.class);
-		expect(bdt.getId()).andReturn(ObjectType.DOCUMENT_BASETYPE_ID)
-				.anyTimes();
-		expect(bdt.isBaseType()).andReturn(true);
-		expect(bdt.getBaseType()).andReturn(null).anyTimes();
-		expect(bdt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>())).anyTimes();
-
-		DocumentType dt = createNiceMock(DocumentType.class);
-		expect(dt.getId()).andReturn(FixtureData.DOCUMENT_TYPE_ID.toString())
-				.anyTimes();
-		expect(dt.isBaseType()).andReturn(false);
-		expect(dt.getBaseType()).andReturn(bft).anyTimes();
-		expect(dt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>())).anyTimes();
-
-		replay(bft);
-		replay(ft);
-		replay(bdt);
-		replay(dt);
-		replay(bpt);
-		replay(brt);
-
-		this.idTypeIndex.put(ft.getId(), ft);
-		this.idTypeIndex.put(bft.getId(), bft); // can overwrite ft
-
-		this.idTypeIndex.put(dt.getId(), dt);
-		this.idTypeIndex.put(bdt.getId(), bdt); // can overwrite dt
-
-		this.idTypeIndex.put(bpt.getId(), bpt);
-		this.idTypeIndex.put(brt.getId(), brt);
-
-	}
-
-	private Folder createMockRepositoryRootFolder() {
-		Folder f = createNiceMock(Folder.class);
-
-		expect(f.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
-		expect(f.getName()).andReturn("").anyTimes(); // or "root" ?
-		expect(f.getFolderParent()).andReturn(null).anyTimes();
-		expect(f.getType()).andReturn(
-				this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()))
-				.anyTimes();
-		this.createMockProperties(f);
-
-		replay(f);
-		this.idObjectIndex.put(f.getId(), f);
-		this.pathObjectIndex.put("/", f);
-		return f;
-	}
-
-	private RepositoryInfo createMockRepositoryInfo() {
-		RepositoryInfo ri = createNiceMock(RepositoryInfo.class);
-
-		expect(ri.getName()).andReturn("MockRepository").anyTimes();
-		expect(ri.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
-		expect(ri.getDescription()).andReturn("description").anyTimes();
-		expect(ri.getCmisVersionSupported()).andReturn("1.0").anyTimes();
-		expect(ri.getVendorName()).andReturn("Apache").anyTimes();
-		expect(ri.getProductName()).andReturn("OpenCMIS").anyTimes();
-		expect(ri.getPrincipalIdAnonymous()).andReturn("anonymous").anyTimes();
-		expect(ri.getPrincipalIdAnyone()).andReturn("anyone").anyTimes();
-		expect(ri.getThinClientUri()).andReturn("http://foo.com").anyTimes();
-		expect(ri.getChangesOnType()).andReturn(
-				new ArrayList<BaseObjectTypeIds>()).anyTimes();
-
-		expect(ri.getCapabilities()).andReturn(
-				this.createMockRepositoryCapabilities()).anyTimes();
-
-		replay(ri);
-
-		return ri;
-	}
-
-	private RepositoryCapabilities createMockRepositoryCapabilities() {
-		RepositoryCapabilities rc = createNiceMock(RepositoryCapabilities.class);
-
-		expect(rc.getAclSupport()).andReturn(CapabilityAcl.NONE).anyTimes();
-		expect(rc.getChangesSupport()).andReturn(CapabilityChanges.ALL)
-				.anyTimes();
-		expect(rc.getContentStreamUpdatabilitySupport()).andReturn(
-				CapabilityContentStreamUpdates.NONE).anyTimes();
-		expect(rc.getJoinSupport()).andReturn(CapabilityJoin.NONE).anyTimes();
-		expect(rc.getQuerySupport()).andReturn(CapabilityQuery.BOTHCOMBINED)
-				.anyTimes();
-		expect(rc.getRenditionsSupport()).andReturn(CapabilityRendition.NONE)
-				.anyTimes();
-
-		replay(rc);
-
-		return rc;
-	}
-
-	private interface StringProperty extends Property<String> {
-	}
-
-	private interface IntegerProperty extends Property<Integer> {
-	}
-
-	private interface DoubleProperty extends Property<Double> {
-	}
-
-	private interface FloatProperty extends Property<Float> {
-	}
-
-	private interface DateTimeProperty extends Property<Calendar> {
-	}
-
-	private interface UriProperty extends Property<URI> {
-	}
-
-	private interface BooleanProperty extends Property<Boolean> {
-	}
-
-	public List<Repository> getRepositories(Map<String, String> parameters) {
-		return null;
-	}
+  {
+    this.idObjectIndex = new Hashtable<String, CmisObject>();
+    this.pathObjectIndex = new Hashtable<String, CmisObject>();
+    this.idTypeIndex = new Hashtable<String, ObjectType>();
+    this.mockSession = this.createMockSession();
+  }
+
+  private Hashtable<String, CmisObject> idObjectIndex = null;
+  private Hashtable<String, ObjectType> idTypeIndex = null;
+  private Hashtable<String, CmisObject> pathObjectIndex = null;
+
+  /*
+   * properties
+   */
+  private static String PROPERTY_VALUE_STRING = "abc";
+  private static Integer PROPERTY_VALUE_INTEGER = new Integer(4711);
+  private static Boolean PROPERTY_VALUE_BOOLEAN = new Boolean(true);
+  private static Double PROPERTY_VALUE_DOUBLE = new Double(1.0);
+  private static Float PROPERTY_VALUE_FLOAT = new Float(1.0);
+  private static String PROPERTY_VALUE_ID = "xyz";
+  private static String PROPERTY_VALUE_HTML = "<html><body>html value</body></html>";
+  private static Calendar PROPERTY_VALUE_DATETIME = GregorianCalendar.getInstance();
+  private static URI PROPERTY_VALUE_URI = URI.create("http://foo.com");
+
+  @SuppressWarnings("unchecked")
+  public <T extends Session> T createSession(Map<String, String> parameters) {
+    T session = null;
+    SessionType st;
+    String p = parameters.get(SessionParameter.SESSION_TYPE);
+
+    if (p == null) {
+      st = SessionType.PERSISTENT; // default, if type is not set
+    }
+    else {
+      st = SessionType.fromValue(p);
+    }
+
+    switch (st) {
+    case PERSISTENT:
+      session = (T) this.mockSession;
+      break;
+    case TRANSIENT:
+      throw new CmisNotSupportedException("SessionType = " + st);
+    }
+
+    return session;
+  }
+
+  @SuppressWarnings("unchecked")
+  private Session createMockSession() {
+    this.createMockGlobalTypes();
+
+    Session session = createNiceMock(Session.class);
+    Folder rootFolder = this.createMockRepositoryRootFolder();
+    this.createMockTestRootFolder("/", rootFolder);
+
+    for (String path : this.pathObjectIndex.keySet()) {
+      CmisObject o = this.pathObjectIndex.get(path);
+      expect(session.getObjectByPath(path)).andReturn(o).anyTimes();
+    }
+
+    expect(session.getRepositoryInfo()).andReturn(this.createMockRepositoryInfo()).anyTimes();
+    expect(session.getRootFolder()).andReturn(rootFolder).anyTimes();
+
+    String id = rootFolder.getId();
+    ObjectId objectId = createMockObjectId(id);
+    expect(session.createObjectId(id)).andReturn(objectId).anyTimes();
+
+    expect(session.getDefaultContext()).andReturn(this.createMockOperationContext()).anyTimes();
+    expect(session.getLocale()).andReturn(new Locale("EN")).anyTimes();
+    expect(session.getObjectFactory()).andReturn(this.createMockObjectFactory()).anyTimes();
+
+    expect(session.getTypeDefinition(ObjectType.DOCUMENT_BASETYPE_ID)).andReturn(
+        this.idTypeIndex.get(ObjectType.DOCUMENT_BASETYPE_ID)).anyTimes();
+    expect(session.getTypeDefinition(ObjectType.FOLDER_BASETYPE_ID)).andReturn(
+        this.idTypeIndex.get(ObjectType.FOLDER_BASETYPE_ID)).anyTimes();
+    expect(session.getTypeDefinition(ObjectType.POLICY_BASETYPE_ID)).andReturn(
+        this.idTypeIndex.get(ObjectType.POLICY_BASETYPE_ID)).anyTimes();
+    expect(session.getTypeDefinition(ObjectType.RELATIONSHIP_BASETYPE_ID)).andReturn(
+        this.idTypeIndex.get(ObjectType.RELATIONSHIP_BASETYPE_ID)).anyTimes();
+
+    if (!FixtureData.DOCUMENT_TYPE_ID.toString().equalsIgnoreCase(ObjectType.DOCUMENT_BASETYPE_ID)) {
+      expect(session.getTypeDefinition(FixtureData.DOCUMENT_TYPE_ID.toString())).andReturn(
+          this.idTypeIndex.get(FixtureData.DOCUMENT_TYPE_ID.toString())).anyTimes();
+    }
+    if (!FixtureData.FOLDER_TYPE_ID.toString().equalsIgnoreCase(ObjectType.FOLDER_BASETYPE_ID)) {
+      expect(session.getTypeDefinition(FixtureData.FOLDER_TYPE_ID.toString())).andReturn(
+          this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString())).anyTimes();
+    }
+    /* document child/descendants types */
+    List<ObjectType> dtl = new ArrayList<ObjectType>();
+    dtl.add(this.idTypeIndex.get(FixtureData.DOCUMENT_TYPE_ID.toString()));
+    PagingList<ObjectType> plot = this.createMockPaging(dtl);
+    Container<ObjectType> ctdoc = this.createMockContainer(this.idTypeIndex
+        .get(FixtureData.DOCUMENT_TYPE_ID.toString()), null);
+    expect(session.getTypeChildren(BaseObjectTypeIds.CMIS_DOCUMENT.value(), true, 2)).andReturn(
+        plot).anyTimes();
+    expect(session.getTypeDescendants(BaseObjectTypeIds.CMIS_DOCUMENT.value(), 1, true)).andReturn(
+        Collections.singletonList(ctdoc)).anyTimes();
+
+    /* folder child/descendants types */
+    List<ObjectType> ftl = new ArrayList<ObjectType>();
+    ftl.add(this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()));
+    PagingList<ObjectType> plfot = this.createMockPaging(ftl);
+    Container<ObjectType> ctfolder = this.createMockContainer(this.idTypeIndex
+        .get(FixtureData.FOLDER_TYPE_ID.toString()), null);
+    expect(session.getTypeChildren(BaseObjectTypeIds.CMIS_FOLDER.value(), true, 2))
+        .andReturn(plfot).anyTimes();
+    expect(session.getTypeDescendants(BaseObjectTypeIds.CMIS_FOLDER.value(), 1, true)).andReturn(
+        Collections.singletonList(ctfolder)).anyTimes();
+
+    /* change support */
+    List<ChangeEvent> cel = this.createMockChangeEvents();
+    PagingList<ChangeEvent> plce = this.createMockPaging(cel);
+    expect(session.getContentChanges(null, -1)).andReturn(plce).anyTimes();
+
+    /* query support */
+    List<QueryResult> queryList = new ArrayList<QueryResult>();
+    for (CmisObject cm : this.idObjectIndex.values()) {
+      queryList.add(createMockQueryResult(cm));
+    }
+    PagingList<QueryResult> plq = this.createMockPaging(queryList);
+    expect(session.query(FixtureData.QUERY.toString(), false, 2)).andReturn(plq).anyTimes();
+
+    this.makeObjectsAccessible(session);
+
+    /*
+     * WRITE SUPPORT
+     */
+    expect(
+        session.createFolder((List<Property<?>>) anyObject(), (ObjectId) anyObject(),
+            (List<Policy>) anyObject(), (List<Ace>) anyObject(), (List<Ace>) anyObject()))
+        .andReturn(this.createMockObjectId()).anyTimes();
+    expect(
+        session.createDocument((List<Property<?>>) anyObject(), (ObjectId) anyObject(),
+            (ContentStream) anyObject(), (VersioningState) anyObject(), (List<Policy>) anyObject(),
+            (List<Ace>) anyObject(), (List<Ace>) anyObject())).andReturn(this.createMockObjectId())
+        .anyTimes();
+
+    replay(session);
+
+    return session;
+  }
+
+  private ObjectId createMockObjectId() {
+    ObjectId id = createNiceMock(ObjectId.class);
+
+    replay(id);
+
+    return id;
+  }
+
+  private List<ChangeEvent> createMockChangeEvents() {
+    List<ChangeEvent> cel = new ArrayList<ChangeEvent>();
+    ChangeEvent ce = createNiceMock(ChangeEvent.class);
+    List<Property<?>> pl = new ArrayList<Property<?>>();
+
+    expect(ce.getObjectId()).andReturn(UUID.randomUUID().toString()).anyTimes();
+    expect(ce.getChangeType()).andReturn(TypeOfChanges.CREATED).anyTimes();
+    expect(ce.getNewProperties()).andReturn(pl).anyTimes();
+
+    replay(ce);
+
+    cel.add(ce);
+
+    return cel;
+  }
+
+  private void makeObjectsAccessible(Session s) {
+    Enumeration<String> e = this.idObjectIndex.keys();
+    String id;
+    CmisObject obj;
+
+    while (e.hasMoreElements()) {
+      id = e.nextElement();
+      obj = this.idObjectIndex.get(id);
+
+      ObjectId objectId = createMockObjectId(id);
+      expect(s.getObject(objectId)).andReturn(obj).anyTimes();
+    }
+  }
+
+  private ObjectFactory createMockObjectFactory() {
+    ObjectFactory of = createNiceMock(ObjectFactory.class);
+
+    expect(
+        of.createContentStream((String) anyObject(), anyLong(), (String) anyObject(),
+            (InputStream) anyObject())).andReturn(this.createMockContentStream()).anyTimes();
+
+    replay(of);
+
+    return of;
+  }
+
+  private ObjectId createMockObjectId(String id) {
+    ObjectId oid = createNiceMock(ObjectId.class);
+
+    expect(oid.getId()).andReturn(id).anyTimes();
+
+    replay(oid);
+
+    return oid;
+  }
+
+  private OperationContext createMockOperationContext() {
+    OperationContext oc = createNiceMock(OperationContext.class);
+
+    replay(oc);
+
+    return oc;
+  }
+
+  private Folder createMockTestRootFolder(String parentPath, Folder parent) {
+    Folder f = createNiceMock(Folder.class);
+
+    expect(f.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
+    expect(f.getName()).andReturn(Fixture.TEST_ROOT_FOLDER_NAME).anyTimes();
+    expect(f.getFolderParent()).andReturn(parent).anyTimes();
+    expect(f.getType()).andReturn(this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()))
+        .anyTimes();
+    expect(f.getBaseType()).andReturn(this.idTypeIndex.get(BaseObjectTypeIds.CMIS_FOLDER.value()))
+        .anyTimes();
+    List<CmisObject> children = new ArrayList<CmisObject>();
+    children.add(this.createMockTestFolder(f, "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/"
+        + FixtureData.FOLDER1_NAME.toString(), FixtureData.FOLDER1_NAME.toString()));
+    children.add(this.createMockTestFolder(f, "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/"
+        + FixtureData.FOLDER2_NAME.toString(), FixtureData.FOLDER2_NAME.toString()));
+    children.add(this.createMockTestDocument(f, "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/"
+        + FixtureData.DOCUMENT1_NAME.toString(), FixtureData.DOCUMENT1_NAME.toString()));
+
+    PagingList<CmisObject> pl = this.createMockPaging(children);
+    expect(f.getChildren(1)).andReturn(pl).anyTimes();
+    expect(f.getChildren(2)).andReturn(pl).anyTimes();
+    expect(f.getChildren(1000)).andReturn(pl).anyTimes();
+
+    List<Container<FileableCmisObject>> ct = new ArrayList<Container<FileableCmisObject>>();
+    Folder f1 = this.createMockTestFolder(f, "/" + FixtureData.FOLDER1_NAME.toString(),
+        FixtureData.FOLDER1_NAME.toString());
+    Folder f2 = this.createMockTestFolder(f, "/" + FixtureData.FOLDER2_NAME.toString(),
+        FixtureData.FOLDER2_NAME.toString());
+    ct.add(this.createMockContainer((FileableCmisObject) f1, null));
+    ct.add(this.createMockContainer((FileableCmisObject) f2, null));
+
+    expect(f.getDescendants(1)).andReturn(ct).anyTimes();
+    expect(f.getDescendants(2)).andReturn(ct).anyTimes();
+    expect(f.getDescendants(1000)).andReturn(ct).anyTimes();
+    expect(f.getFolderTree(1)).andReturn(ct).anyTimes();
+    expect(f.getFolderTree(2)).andReturn(ct).anyTimes();
+    expect(f.getFolderTree(1000)).andReturn(ct).anyTimes();
+    this.createMockProperties(f);
+
+    replay(f);
+    this.idObjectIndex.put(f.getId(), f);
+    this.pathObjectIndex.put(parentPath + Fixture.TEST_ROOT_FOLDER_NAME, f);
+
+    return f;
+  }
+
+  @SuppressWarnings("unchecked")
+  private void createMockProperties(CmisObject o) {
+    GregorianCalendar date = new GregorianCalendar();
+
+    expect(o.getCreatedBy()).andReturn(Fixture.getParamter().get(SessionParameter.USER)).anyTimes();
+    expect(o.getLastModifiedBy()).andReturn(Fixture.getParamter().get(SessionParameter.USER))
+        .anyTimes();
+    expect(o.getLastModificationDate()).andReturn(date).anyTimes();
+    expect(o.getCreationDate()).andReturn(date).anyTimes();
+
+    {
+      ArrayList a = new ArrayList<Property<Property>>();
+
+      // mandatory default properties
+      a.add(this.createMockStringProperty(PropertyIds.CMIS_BASE_TYPE_ID));
+      a.add(this.createMockStringProperty(PropertyIds.CMIS_NAME));
+      a.add(this.createMockIntegerProperty(PropertyIds.CMIS_CONTENT_STREAM_LENGTH));
+
+      // other properties
+      a.add(this.createMockBooleanProperty(UUID.randomUUID().toString()));
+      a.add(this.createMockDateTimeProperty(UUID.randomUUID().toString()));
+      a.add(this.createMockFloatProperty(UUID.randomUUID().toString()));
+      a.add(this.createMockDoubleProperty(UUID.randomUUID().toString()));
+      a.add(this.createMockHtmlProperty(UUID.randomUUID().toString()));
+      a.add(this.createMockIdProperty(UUID.randomUUID().toString()));
+      a.add(this.createMockUriProperty(UUID.randomUUID().toString()));
+
+      expect(o.getProperties()).andReturn(a).anyTimes();
+      // expect(o.getProperties(Fixture.PROPERTY_FILTER)).andReturn(a)
+      // .anyTimes();
+
+      /* single property */
+      Property<Object> p1 = (Property<Object>) createMockStringProperty(CmisProperties.OBJECT_ID
+          .value());
+      expect(o.getProperty(CmisProperties.OBJECT_ID.value())).andReturn(p1).anyTimes();
+      expect(o.getPropertyValue(CmisProperties.OBJECT_ID.value())).andReturn(p1.getValue())
+          .anyTimes();
+
+      /* multi valued property */
+      Property<Object> p2 = (Property<Object>) createMockMultiValuedStringProperty(FixtureData.PROPERTY_NAME_STRING_MULTI_VALUED
+          .toString());
+      expect(o.getProperty(FixtureData.PROPERTY_NAME_STRING_MULTI_VALUED.toString())).andReturn(p2)
+          .anyTimes();
+      expect(o.getPropertyMultivalue(FixtureData.PROPERTY_NAME_STRING_MULTI_VALUED.toString()))
+          .andReturn(p2.getValues()).anyTimes();
+    }
+
+  }
+
+  private Property<?> createMockMultiValuedStringProperty(String id) {
+    Property<String> p = createNiceMock(StringProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.STRING).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_STRING).anyTimes();
+    expect(p.isMultiValued()).andReturn(true).anyTimes();
+    List<String> v = new ArrayList<String>();
+    v.add(MockSessionFactory.PROPERTY_VALUE_STRING);
+    v.add(MockSessionFactory.PROPERTY_VALUE_STRING);
+    expect(p.getValues()).andReturn(v).anyTimes();
+    expect(p.getValueAsString()).andReturn(v.toString()).anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockDateTimeProperty(String id) {
+    Property<Calendar> p = createNiceMock(DateTimeProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.DATETIME).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_DATETIME).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_DATETIME.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockHtmlProperty(String id) {
+    Property<String> p = createNiceMock(StringProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.HTML).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_HTML).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_HTML.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockIdProperty(String id) {
+    Property<String> p = createNiceMock(StringProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.ID).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_ID).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_ID.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockUriProperty(String id) {
+    Property<URI> p = createNiceMock(UriProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.URI).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_URI).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_URI.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockDoubleProperty(String id) {
+    Property<Double> p = createNiceMock(DoubleProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.DECIMAL).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_DOUBLE).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_DOUBLE.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockFloatProperty(String id) {
+    Property<Float> p = createNiceMock(FloatProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.DECIMAL).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_FLOAT).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_FLOAT.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockBooleanProperty(String id) {
+    Property<Boolean> p = createNiceMock(BooleanProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.BOOLEAN).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_BOOLEAN).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_BOOLEAN.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockIntegerProperty(String id) {
+    Property<Integer> p = createNiceMock(IntegerProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.INTEGER).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_INTEGER).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_INTEGER.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private Property<?> createMockStringProperty(String id) {
+    Property<String> p = createNiceMock(StringProperty.class);
+
+    expect(p.getType()).andReturn(PropertyType.STRING).anyTimes();
+    expect(p.getValue()).andReturn(MockSessionFactory.PROPERTY_VALUE_STRING).anyTimes();
+    expect(p.getValueAsString()).andReturn(MockSessionFactory.PROPERTY_VALUE_STRING.toString())
+        .anyTimes();
+
+    replay(p);
+
+    return p;
+  }
+
+  private CmisObject createMockTestDocument(Folder parent, String path, String name) {
+    Document d = createNiceMock(Document.class);
+
+    expect(d.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
+    expect(d.getName()).andReturn(name).anyTimes();
+    expect(d.getType()).andReturn(this.idTypeIndex.get(FixtureData.DOCUMENT_TYPE_ID.toString()))
+        .anyTimes();
+    expect(d.getBaseType())
+        .andReturn(this.idTypeIndex.get(BaseObjectTypeIds.CMIS_DOCUMENT.value())).anyTimes();
+    this.createMockProperties(d);
+    expect(d.getContentStream()).andReturn(this.createMockContentStream()).anyTimes();
+
+    replay(d);
+    this.idObjectIndex.put(d.getId(), d);
+    this.pathObjectIndex.put(path, d);
+
+    return d;
+  }
+
+  private ContentStream createMockContentStream() {
+    ContentStream cs = createNiceMock(ContentStream.class);
+
+    byte[] b = "abc".getBytes();
+    ByteArrayInputStream bais = new ByteArrayInputStream(b);
+
+    expect(cs.getFileName()).andReturn("file.txt").anyTimes();
+    expect(cs.getMimeType()).andReturn("text/html").anyTimes();
+    expect(cs.getLength()).andReturn((long) b.length).anyTimes();
+    expect(cs.getStream()).andReturn(bais).anyTimes();
+
+    replay(cs);
+
+    return cs;
+  }
+
+  private Folder createMockTestFolder(Folder parent, String path, String name) {
+    Folder f = createNiceMock(Folder.class);
+
+    expect(f.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
+    expect(f.getName()).andReturn(name).anyTimes();
+    expect(f.getFolderParent()).andReturn(parent).anyTimes();
+    expect(f.getType()).andReturn(this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()))
+        .anyTimes();
+    expect(f.getBaseType()).andReturn(this.idTypeIndex.get(BaseObjectTypeIds.CMIS_FOLDER.value()))
+        .anyTimes();
+    List<CmisObject> children = new ArrayList<CmisObject>();
+    children.add(this.createMockTestDocument(f, path + "/" + FixtureData.DOCUMENT1_NAME.toString(),
+        FixtureData.DOCUMENT1_NAME.toString()));
+    children.add(this.createMockTestDocument(f, path + "/" + FixtureData.DOCUMENT2_NAME.toString(),
+        FixtureData.DOCUMENT2_NAME.toString()));
+
+    PagingList<CmisObject> pl = this.createMockPaging(children);
+    expect(f.getChildren(null, -1)).andReturn(pl).anyTimes();
+
+    List<Container<FileableCmisObject>> ctlist = new ArrayList<Container<FileableCmisObject>>();
+    expect(f.getDescendants(-1)).andReturn(ctlist).anyTimes();
+    expect(f.getFolderTree(-1)).andReturn(ctlist).anyTimes();
+    this.createMockProperties(f);
+
+    replay(f);
+    this.idObjectIndex.put(f.getId(), f);
+
+    return f;
+  }
+
+  private QueryResult createMockQueryResult(CmisObject cmisObject) {
+    QueryResult qr = createNiceMock(QueryResult.class);
+
+    return qr;
+  }
+
+  @SuppressWarnings( { "unchecked" })
+  private <T> PagingList<T> createMockPaging(List<T> items) {
+    PagingList<T> pl = createNiceMock(PagingList.class);
+
+    ArrayList<List<T>> a = new ArrayList<List<T>>();
+    a.add(items);
+    Iterator<List<T>> i = a.iterator();
+
+    expect(pl.get(0)).andReturn(items).anyTimes();
+    // expect(pl.isEmpty()).andReturn(false).anyTimes();
+    expect(pl.iterator()).andReturn(i).anyTimes();
+
+    replay(pl);
+
+    return pl;
+  }
+
+  @SuppressWarnings("unchecked")
+  private <T> Container<T> createMockContainer(T item, List<Container<T>> children) {
+    Container<T> c = createNiceMock(Container.class);
+
+    expect(c.getItem()).andReturn(item).anyTimes();
+    expect(c.getChildren()).andReturn(children).anyTimes();
+
+    replay(c);
+
+    return c;
+  }
+
+  private void createMockGlobalTypes() {
+    FolderType bft = createNiceMock(FolderType.class);
+    expect(bft.getId()).andReturn(ObjectType.FOLDER_BASETYPE_ID).anyTimes();
+    expect(bft.isBaseType()).andReturn(true);
+    expect(bft.getBaseType()).andReturn(null).anyTimes();
+    expect(bft.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>()))
+        .anyTimes();
+
+    FolderType ft = createNiceMock(FolderType.class);
+    expect(ft.getId()).andReturn(FixtureData.FOLDER_TYPE_ID.toString()).anyTimes();
+    expect(ft.isBaseType()).andReturn(false);
+    expect(ft.getBaseType()).andReturn(bft).anyTimes();
+    expect(ft.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>()))
+        .anyTimes();
+
+    PolicyType bpt = createNiceMock(PolicyType.class);
+    expect(bpt.getId()).andReturn(ObjectType.POLICY_BASETYPE_ID).anyTimes();
+    expect(bpt.isBaseType()).andReturn(true);
+    expect(bpt.getBaseType()).andReturn(null).anyTimes();
+    expect(bpt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>()))
+        .anyTimes();
+
+    RelationshipType brt = createNiceMock(RelationshipType.class);
+    expect(brt.getId()).andReturn(ObjectType.RELATIONSHIP_BASETYPE_ID).anyTimes();
+    expect(brt.isBaseType()).andReturn(true);
+    expect(brt.getBaseType()).andReturn(null).anyTimes();
+    expect(brt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>()))
+        .anyTimes();
+
+    DocumentType bdt = createNiceMock(DocumentType.class);
+    expect(bdt.getId()).andReturn(ObjectType.DOCUMENT_BASETYPE_ID).anyTimes();
+    expect(bdt.isBaseType()).andReturn(true);
+    expect(bdt.getBaseType()).andReturn(null).anyTimes();
+    expect(bdt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>()))
+        .anyTimes();
+
+    DocumentType dt = createNiceMock(DocumentType.class);
+    expect(dt.getId()).andReturn(FixtureData.DOCUMENT_TYPE_ID.toString()).anyTimes();
+    expect(dt.isBaseType()).andReturn(false);
+    expect(dt.getBaseType()).andReturn(bft).anyTimes();
+    expect(dt.getPropertyDefintions()).andReturn((new HashMap<String, PropertyDefinition<?>>()))
+        .anyTimes();
+
+    replay(bft);
+    replay(ft);
+    replay(bdt);
+    replay(dt);
+    replay(bpt);
+    replay(brt);
+
+    this.idTypeIndex.put(ft.getId(), ft);
+    this.idTypeIndex.put(bft.getId(), bft); // can overwrite ft
+
+    this.idTypeIndex.put(dt.getId(), dt);
+    this.idTypeIndex.put(bdt.getId(), bdt); // can overwrite dt
+
+    this.idTypeIndex.put(bpt.getId(), bpt);
+    this.idTypeIndex.put(brt.getId(), brt);
+
+  }
+
+  private Folder createMockRepositoryRootFolder() {
+    Folder f = createNiceMock(Folder.class);
+
+    expect(f.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
+    expect(f.getName()).andReturn("").anyTimes(); // or "root" ?
+    expect(f.getFolderParent()).andReturn(null).anyTimes();
+    expect(f.getType()).andReturn(this.idTypeIndex.get(FixtureData.FOLDER_TYPE_ID.toString()))
+        .anyTimes();
+    this.createMockProperties(f);
+
+    replay(f);
+    this.idObjectIndex.put(f.getId(), f);
+    this.pathObjectIndex.put("/", f);
+    return f;
+  }
+
+  private RepositoryInfo createMockRepositoryInfo() {
+    RepositoryInfo ri = createNiceMock(RepositoryInfo.class);
+
+    expect(ri.getName()).andReturn("MockRepository").anyTimes();
+    expect(ri.getId()).andReturn(UUID.randomUUID().toString()).anyTimes();
+    expect(ri.getDescription()).andReturn("description").anyTimes();
+    expect(ri.getCmisVersionSupported()).andReturn("1.0").anyTimes();
+    expect(ri.getVendorName()).andReturn("Apache").anyTimes();
+    expect(ri.getProductName()).andReturn("OpenCMIS").anyTimes();
+    expect(ri.getPrincipalIdAnonymous()).andReturn("anonymous").anyTimes();
+    expect(ri.getPrincipalIdAnyone()).andReturn("anyone").anyTimes();
+    expect(ri.getThinClientUri()).andReturn("http://foo.com").anyTimes();
+    expect(ri.getChangesOnType()).andReturn(new ArrayList<BaseObjectTypeIds>()).anyTimes();
+
+    expect(ri.getCapabilities()).andReturn(this.createMockRepositoryCapabilities()).anyTimes();
+
+    replay(ri);
+
+    return ri;
+  }
+
+  private RepositoryCapabilities createMockRepositoryCapabilities() {
+    RepositoryCapabilities rc = createNiceMock(RepositoryCapabilities.class);
+
+    expect(rc.getAclSupport()).andReturn(CapabilityAcl.NONE).anyTimes();
+    expect(rc.getChangesSupport()).andReturn(CapabilityChanges.ALL).anyTimes();
+    expect(rc.getContentStreamUpdatabilitySupport()).andReturn(CapabilityContentStreamUpdates.NONE)
+        .anyTimes();
+    expect(rc.getJoinSupport()).andReturn(CapabilityJoin.NONE).anyTimes();
+    expect(rc.getQuerySupport()).andReturn(CapabilityQuery.BOTHCOMBINED).anyTimes();
+    expect(rc.getRenditionsSupport()).andReturn(CapabilityRendition.NONE).anyTimes();
+
+    replay(rc);
+
+    return rc;
+  }
+
+  private interface StringProperty extends Property<String> {
+  }
+
+  private interface IntegerProperty extends Property<Integer> {
+  }
+
+  private interface DoubleProperty extends Property<Double> {
+  }
+
+  private interface FloatProperty extends Property<Float> {
+  }
+
+  private interface DateTimeProperty extends Property<Calendar> {
+  }
+
+  private interface UriProperty extends Property<URI> {
+  }
+
+  private interface BooleanProperty extends Property<Boolean> {
+  }
+
+  public List<Repository> getRepositories(Map<String, String> parameters) {
+    return null;
+  }
 
 }