chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sklev...@apache.org
Subject svn commit: r937238 [2/2] - in /incubator/chemistry/opencmis/trunk: chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/ chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/j...
Date Fri, 23 Apr 2010 10:38:11 GMT
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentSessionImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentSessionImpl.java?rev=937238&r1=937237&r2=937238&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentSessionImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentSessionImpl.java Fri Apr 23 10:38:11 2010
@@ -74,774 +74,775 @@ import org.apache.commons.logging.LogFac
  */
 public class PersistentSessionImpl implements Session, Serializable {
 
-	private static final OperationContext DEFAULT_CONTEXT = new OperationContextImpl(null, false, true, false,
-			IncludeRelationships.NONE, null, true, null, true);
+    private static final OperationContext DEFAULT_CONTEXT = new OperationContextImpl(null, false, true, false,
+            IncludeRelationships.NONE, null, true, null, true);
 
-	private static final Set<Updatability> CREATE_UPDATABILITY = new HashSet<Updatability>();
-	static {
-		CREATE_UPDATABILITY.add(Updatability.ONCREATE);
-		CREATE_UPDATABILITY.add(Updatability.READWRITE);
-	}
-
-	private static Log log = LogFactory.getLog(PersistentSessionImpl.class);
-
-	private final ReentrantReadWriteLock fLock = new ReentrantReadWriteLock();
-
-	/*
-	 * default session context (serializable)
-	 */
-	private OperationContext context = DEFAULT_CONTEXT;
-
-	/*
-	 * session parameter (serializable)
-	 */
-	private Map<String, String> parameters = null;
-
-	/*
-	 * CMIS provider (serializable)
-	 */
-	private CmisBinding binding = null;
-
-	/*
-	 * Session Locale, determined from session parameter (serializable)
-	 */
-	private Locale locale = null;
-
-	/*
-	 * Object cache (serializable)
-	 */
-	private Cache cache = null;
-
-	/*
-	 * Lazy loaded repository info. Will be invalid after clear(). Access by
-	 * getter always. (serializable)
-	 */
-	private RepositoryInfo repositoryInfo;
-
-	/*
-	 * helper factory (non serializable)
-	 */
-	private final ObjectFactory objectFactory = PersistentObjectFactoryImpl.newInstance(this);
-
-	/**
-	 * required for serialization
-	 */
-	private static final long serialVersionUID = -4287481628831198383L;
-
-	/**
-	 * Constructor.
-	 */
-	public PersistentSessionImpl(Map<String, String> parameters) {
-		this.parameters = parameters;
-		PersistentSessionImpl.log.info("Session Parameters: " + parameters);
-
-		this.locale = this.determineLocale(parameters);
-		PersistentSessionImpl.log.info("Session Locale: " + this.locale.toString());
-
-		int cacheSize = this.determineCacheSize(parameters);
-
-		if (cacheSize == -1) {
-			this.cache = CacheImpl.newInstance();
-		} else {
-			this.cache = CacheImpl.newInstance(cacheSize);
-		}
-		PersistentSessionImpl.log.info("Session Cache Size: " + this.cache.getCacheSize());
-	}
-
-	private int determineCacheSize(Map<String, String> parameters) {
-		int size = -1;
-
-		return size;
-	}
-
-	private String determineRepositoryId(Map<String, String> parameters) {
-		String repositoryId = parameters.get(SessionParameter.REPOSITORY_ID);
-		// if null then the provider will return a repository id (lazy)
-		return repositoryId;
-	}
-
-	private Locale determineLocale(Map<String, String> parameters) {
-		Locale locale = null;
-
-		String language = parameters.get(SessionParameter.LOCALE_ISO639_LANGUAGE);
-		String country = parameters.get(SessionParameter.LOCALE_ISO3166_COUNTRY);
-		String variant = parameters.get(SessionParameter.LOCALE_VARIANT);
-
-		if (variant != null) {
-			// all 3 parameter must not be null and valid
-			locale = new Locale(language, country, variant);
-		} else {
-			if (country != null) {
-				// 2 parameter must not be null and valid
-				locale = new Locale(language, country);
-			} else {
-				if (language != null) {
-					// 1 parameter must not be null and valid
-					locale = new Locale(language);
-				} else {
-					locale = Locale.getDefault();
-				}
-			}
-		}
-
-		return locale;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#clear()
-	 */
-	public void clear() {
-		fLock.writeLock().lock();
-		try {
-			int cacheSize = this.determineCacheSize(this.parameters);
-			if (cacheSize == -1) {
-				this.cache = CacheImpl.newInstance();
-			} else {
-				this.cache = CacheImpl.newInstance(cacheSize);
-			}
-			PersistentSessionImpl.log.info("Session Cache Size: " + this.cache.getCacheSize());
-
-			/*
-			 * clear provider cache
-			 */
-			getBinding().clearAllCaches();
-		} finally {
-			fLock.writeLock().unlock();
-		}
-	}
-
-	public void save() {
-		// nop
-	}
-
-	public void cancel() {
-		throw new UnsupportedOperationException("cancel");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getObjectFactory()
-	 */
-	public ObjectFactory getObjectFactory() {
-		return this.objectFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getCheckedOutDocs(int)
-	 */
-	public PagingIterable<Document> getCheckedOutDocs(int itemsPerPage) {
-		return getCheckedOutDocs(getDefaultContext(), itemsPerPage);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.apache.opencmis.client.api.Session#getCheckedOutDocs(org.apache.
-	 * opencmis.client.api. OperationContext, int)
-	 */
-	public PagingIterable<Document> getCheckedOutDocs(OperationContext context, final int itemsPerPage) {
-		if (itemsPerPage < 1) {
-			throw new IllegalArgumentException("itemsPerPage must be > 0!");
-		}
-
-		final NavigationService navigationService = getBinding().getNavigationService();
-		final ObjectFactory objectFactory = getObjectFactory();
-		final OperationContext ctxt = new OperationContextImpl(context);
-
-		return new DefaultPagingIterable<Document>(new AbstractPageFetch<Document>() {
-
-			@Override
-			protected AbstractPageFetch.PageFetchResult<Document> fetchPage(long skipCount) {
-
-				// get all checked out documents
-				ObjectList checkedOutDocs = navigationService.getCheckedOutDocs(getRepositoryId(), null, ctxt
-						.getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(), ctxt
-						.getIncludeRelationships(), ctxt.getRenditionFilterString(), BigInteger.valueOf(itemsPerPage),
-						BigInteger.valueOf(skipCount), null);
-
-				// convert objects
-				List<Document> page = new ArrayList<Document>();
-				if (checkedOutDocs.getObjects() != null) {
-					for (ObjectData objectData : checkedOutDocs.getObjects()) {
-						CmisObject doc = objectFactory.convertObject(objectData, ctxt);
-						if (!(doc instanceof Document)) {
-							// should not happen...
-							continue;
-						}
-
-						page.add((Document) doc);
-					}
-				}
-
-				return new AbstractPageFetch.PageFetchResult<Document>(page, checkedOutDocs.getNumItems(),
-						checkedOutDocs.hasMoreItems()) {
-				};
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#getContentChanges(java.lang.String
-	 * , int)
-	 */
-	public PagingIterable<ChangeEvent> getContentChanges(String changeLogToken, int itemsPerPage) {
-		throw new CmisRuntimeException("not implemented");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getDefaultContext()
-	 */
-	public OperationContext getDefaultContext() {
-		fLock.readLock().lock();
-		try {
-			return this.context;
-		} finally {
-			fLock.readLock().unlock();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.apache.opencmis.client.api.Session#setDefaultContext(org.apache.
-	 * opencmis.client.api. OperationContext)
-	 */
-	public void setDefaultContext(OperationContext context) {
-		fLock.writeLock().lock();
-		try {
-			this.context = (context == null ? DEFAULT_CONTEXT : context);
-		} finally {
-			fLock.writeLock().unlock();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#createOperationContext(java.util
-	 * .Set, boolean, boolean, boolean,
-	 * org.apache.opencmis.commons.enums.IncludeRelationships, java.util.Set,
-	 * boolean, java.lang.String, boolean)
-	 */
-	public OperationContext createOperationContext(Set<String> filter, boolean includeAcls,
-			boolean includeAllowableActions, boolean includePolicies, IncludeRelationships includeRelationships,
-			Set<String> renditionFilter, boolean includePathSegments, String orderBy, boolean cacheEnabled) {
-		return new OperationContextImpl(filter, includeAcls, includeAllowableActions, includePolicies,
-				includeRelationships, renditionFilter, includePathSegments, orderBy, cacheEnabled);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#createObjectId(java.lang.String)
-	 */
-	public ObjectId createObjectId(String id) {
-		return new ObjectIdImpl(id);
-	}
-
-	public Locale getLocale() {
-		return this.locale;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getObject(java.lang.String)
-	 */
-	public CmisObject getObject(ObjectId objectId) {
-		return getObject(objectId, getDefaultContext());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getObject(java.lang.String,
-	 * org.apache.opencmis.client.api.OperationContext)
-	 */
-	public CmisObject getObject(ObjectId objectId, OperationContext context) {
-		if ((objectId == null) || (objectId.getId() == null)) {
-			throw new IllegalArgumentException("Object Id must be set!");
-		}
-		if (context == null) {
-			throw new IllegalArgumentException("Operation context must be set!");
-		}
-
-		CmisObject result = null;
-
-		// ask the cache first
-		if (context.isCacheEnabled()) {
-			result = this.cache.getById(objectId.getId(), context.getCacheKey());
-			if (result != null) {
-				return result;
-			}
-		}
-
-		// get the object
-		ObjectData objectData = this.binding.getObjectService().getObject(getRepositoryId(), objectId.getId(),
-				context.getFilterString(), context.isIncludeAllowableActions(), context.getIncludeRelationships(),
-				context.getRenditionFilterString(), context.isIncludePolicies(), context.isIncludeAcls(), null);
-
-		result = getObjectFactory().convertObject(objectData, context);
-
-		// put into cache
-		if (context.isCacheEnabled()) {
-			this.cache.put(result, context.getCacheKey());
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#getObjectByPath(java.lang.String)
-	 */
-	public CmisObject getObjectByPath(String path) {
-		return getObjectByPath(path, getDefaultContext());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#getObjectByPath(java.lang.String,
-	 * org.apache.opencmis.client.api.OperationContext)
-	 */
-	public CmisObject getObjectByPath(String path, OperationContext context) {
-		if (path == null) {
-			throw new IllegalArgumentException("Path must be set!");
-		}
-		if (context == null) {
-			throw new IllegalArgumentException("Operation context must be set!");
-		}
-
-		CmisObject result = null;
-
-		// ask the cache first
-		if (context.isCacheEnabled()) {
-			result = this.cache.getByPath(path, context.getCacheKey());
-			if (result != null) {
-				return result;
-			}
-		}
-
-		// get the object
-		ObjectData objectData = this.binding.getObjectService().getObjectByPath(getRepositoryId(), path,
-				context.getFilterString(), context.isIncludeAllowableActions(), context.getIncludeRelationships(),
-				context.getRenditionFilterString(), context.isIncludePolicies(), context.isIncludeAcls(), null);
-
-		result = getObjectFactory().convertObject(objectData, context);
-
-		// put into cache
-		if (context.isCacheEnabled()) {
-			this.cache.putPath(path, result, context.getCacheKey());
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getRepositoryInfo()
-	 */
-	public RepositoryInfo getRepositoryInfo() {
-		fLock.readLock().lock();
-		try {
-			return this.repositoryInfo;
-		} finally {
-			fLock.readLock().unlock();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getRootFolder()
-	 */
-	public Folder getRootFolder() {
-		return getRootFolder(getDefaultContext());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * 
-	 * 
-	 * 
-	 * 
-	 * 
-	 * 
-	 * 
-	 * 
-	 * @seeorg.apache.opencmis.client.api.Session#getRootFolder(org.apache.opencmis
-	 * .client.api. OperationContext)
-	 */
-	public Folder getRootFolder(OperationContext context) {
-		String rootFolderId = getRepositoryInfo().getRootFolderId();
-
-		CmisObject rootFolder = getObject(createObjectId(rootFolderId), context);
-		if (!(rootFolder instanceof Folder)) {
-			throw new CmisRuntimeException("Root folder object is not a folder!");
-		}
-
-		return (Folder) rootFolder;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#getTypeChildren(java.lang.String,
-	 * boolean, int)
-	 */
-	public PagingIterable<ObjectType> getTypeChildren(final String typeId, final boolean includePropertyDefinitions,
-			final int itemsPerPage) {
-		if (itemsPerPage < 1) {
-			throw new IllegalArgumentException("itemsPerPage must be > 0!");
-		}
-
-		final RepositoryService repositoryService = getBinding().getRepositoryService();
-		final ObjectFactory objectFactory = this.getObjectFactory();
-
-		return new DefaultPagingIterable<ObjectType>(new AbstractPageFetch<ObjectType>() {
-
-			@Override
-			protected AbstractPageFetch.PageFetchResult<ObjectType> fetchPage(long skipCount) {
-
-				// fetch the data
-				TypeDefinitionList tdl = repositoryService.getTypeChildren(
-						PersistentSessionImpl.this.getRepositoryId(), typeId, includePropertyDefinitions, BigInteger
-								.valueOf(itemsPerPage), BigInteger.valueOf(skipCount), null);
-
-				// convert type definitions
-				List<ObjectType> page = new ArrayList<ObjectType>(tdl.getList().size());
-				for (TypeDefinition typeDefinition : tdl.getList()) {
-					page.add(objectFactory.convertTypeDefinition(typeDefinition));
-				}
-
-				return new AbstractPageFetch.PageFetchResult<ObjectType>(page, tdl.getNumItems(), tdl.hasMoreItems()) {
-				};
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#getTypeDefinition(java.lang.String
-	 * )
-	 */
-	public ObjectType getTypeDefinition(String typeId) {
-		TypeDefinition typeDefinition = getBinding().getRepositoryService().getTypeDefinition(getRepositoryId(),
-				typeId, null);
-		return objectFactory.convertTypeDefinition(typeDefinition);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#getTypeDescendants(java.lang.String
-	 * , int, boolean)
-	 */
-	public List<Tree<ObjectType>> getTypeDescendants(String typeId, int depth, boolean includePropertyDefinitions) {
-		List<TypeDefinitionContainer> descendants = getBinding().getRepositoryService().getTypeDescendants(
-				getRepositoryId(), typeId, BigInteger.valueOf(depth), includePropertyDefinitions, null);
-
-		return convertTypeDescendants(descendants);
-	}
-
-	/**
-	 * Converts provider <code>TypeDefinitionContainer</code> to API
-	 * <code>Container</code>.
-	 */
-	private List<Tree<ObjectType>> convertTypeDescendants(List<TypeDefinitionContainer> descendantsList) {
-		List<Tree<ObjectType>> result = new ArrayList<Tree<ObjectType>>();
-
-		for (TypeDefinitionContainer container : descendantsList) {
-			ObjectType objectType = objectFactory.convertTypeDefinition(container.getTypeDefinition());
-			List<Tree<ObjectType>> children = convertTypeDescendants(container.getChildren());
-
-			result.add(new ContainerImpl<ObjectType>(objectType, children));
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#query(java.lang.String,
-	 * boolean, int)
-	 */
-	public PagingIterable<QueryResult> query(final String statement, final boolean searchAllVersions,
-			final int itemsPerPage) {
-		return query(statement, searchAllVersions, getDefaultContext(), itemsPerPage);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#query(java.lang.String,
-	 * boolean, org.apache.opencmis.client.api.OperationContext, int)
-	 */
-	public PagingIterable<QueryResult> query(final String statement, final boolean searchAllVersions,
-			OperationContext context, final int itemsPerPage) {
-
-		if (itemsPerPage < 1) {
-			throw new IllegalArgumentException("itemsPerPage must be > 0!");
-		}
-
-		final DiscoveryService discoveryService = getBinding().getDiscoveryService();
-		final ObjectFactory objectFactory = this.getObjectFactory();
-		final OperationContext ctxt = new OperationContextImpl(context);
-
-		return new DefaultPagingIterable<QueryResult>(new AbstractPageFetch<QueryResult>() {
-
-			@Override
-			protected AbstractPageFetch.PageFetchResult<QueryResult> fetchPage(long skipCount) {
-
-				// fetch the data
-				ObjectList resultList = discoveryService.query(getRepositoryId(), statement, searchAllVersions, ctxt
-						.isIncludeAllowableActions(), ctxt.getIncludeRelationships(), ctxt.getRenditionFilterString(),
-						BigInteger.valueOf(itemsPerPage), BigInteger.valueOf(skipCount), null);
-
-				// convert type definitions
-				List<QueryResult> page = new ArrayList<QueryResult>();
-				if (resultList.getObjects() != null) {
-					for (ObjectData objectData : resultList.getObjects()) {
-						if (objectData == null) {
-							continue;
-						}
-
-						page.add(objectFactory.convertQueryResult(objectData));
-					}
-				}
-
-				return new AbstractPageFetch.PageFetchResult<QueryResult>(page, resultList.getNumItems(), resultList
-						.hasMoreItems()) {
-				};
-			}
-		});
-
-	}
-
-	public String setExtensionContext(String context) {
-		throw new CmisRuntimeException("not implemented");
-	}
-
-	public ExtensionHandler setExtensionHandler(String context, ExtensionHandler extensionHandler) {
-		throw new CmisRuntimeException("not implemented");
-	}
-
-	/**
-	 * Connect session object to the provider. This is the very first call after
-	 * a session is created.
-	 * <p>
-	 * In dependency of the parameter set an {@code AtomPub}, a {@code
-	 * WebService} or an {@code InMemory} provider is selected.
-	 */
-	public void connect() {
-		fLock.writeLock().lock();
-		try {
-			this.binding = CmisBindingHelper.createProvider(this.parameters);
-
-			/* get initial repository id from session parameter */
-			String repositoryId = this.determineRepositoryId(this.parameters);
-			if (repositoryId == null) {
-				throw new IllegalStateException("Repository Id is not set!");
-			}
-
-			repositoryInfo = getBinding().getRepositoryService().getRepositoryInfo(repositoryId, null);
-		} finally {
-			fLock.writeLock().unlock();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#getBinding()
-	 */
-	public CmisBinding getBinding() {
-		fLock.readLock().lock();
-		try {
-			return this.binding;
-		} finally {
-			fLock.readLock().unlock();
-		}
-	}
-
-	public Cache getCache() {
-		fLock.readLock().lock();
-		try {
-			return this.cache;
-		} finally {
-			fLock.readLock().unlock();
-		}
-	}
-
-	/**
-	 * Returns the repository id.
-	 */
-	public String getRepositoryId() {
-		return getRepositoryInfo().getId();
-	}
-
-	// creates
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#createDocument(java.util.Map,
-	 * org.apache.opencmis.client.api.ObjectId,
-	 * org.apache.opencmis.client.api.ContentStream,
-	 * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
-	 * java.util.List, java.util.List)
-	 */
-	public ObjectId createDocument(Map<String, ?> properties, ObjectId folderId, ContentStream contentStream,
-			VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces) {
-		if ((folderId != null) && (folderId.getId() == null)) {
-			throw new IllegalArgumentException("Folder Id must be set!");
-		}
-
-		String newId = getBinding().getObjectService().createDocument(getRepositoryId(),
-				objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
-				(folderId == null ? null : folderId.getId()), objectFactory.convertContentStream(contentStream),
-				versioningState, objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces),
-				objectFactory.convertAces(removeAces), null);
-
-		if (newId == null) {
-			return null;
-		}
-
-		return createObjectId(newId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#createDocumentFromSource(org.apache
-	 * .opencmis.client. api.ObjectId, java.util.Map,
-	 * org.apache.opencmis.client.api.ObjectId,
-	 * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
-	 * java.util.List, java.util.List)
-	 */
-	public ObjectId createDocumentFromSource(ObjectId source, Map<String, ?> properties, ObjectId folderId,
-			VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces) {
-		if ((folderId != null) && (folderId.getId() == null)) {
-			throw new IllegalArgumentException("Folder Id must be set!");
-		}
-
-		// get the type of the source document
-		ObjectType type = null;
-		if (source instanceof CmisObject) {
-			type = ((CmisObject) source).getBaseType();
-		} else {
-			CmisObject sourceObj = getObject(source);
-			type = sourceObj.getType();
-		}
-
-		if (type.getBaseTypeId() != BaseTypeId.CMIS_DOCUMENT) {
-			throw new IllegalArgumentException("Source object must be a document!");
-		}
-
-		String newId = getBinding().getObjectService().createDocumentFromSource(getRepositoryId(), source.getId(),
-				objectFactory.convertProperties(properties, type, CREATE_UPDATABILITY),
-				(folderId == null ? null : folderId.getId()), versioningState, objectFactory.convertPolicies(policies),
-				objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null);
-
-		if (newId == null) {
-			return null;
-		}
-
-		return createObjectId(newId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#createFolder(java.util.Map,
-	 * org.apache.opencmis.client.api.ObjectId, java.util.List, java.util.List,
-	 * java.util.List)
-	 */
-	public ObjectId createFolder(Map<String, ?> properties, ObjectId folderId, List<Policy> policies,
-			List<Ace> addAces, List<Ace> removeAces) {
-		if ((folderId != null) && (folderId.getId() == null)) {
-			throw new IllegalArgumentException("Folder Id must be set!");
-		}
-
-		String newId = getBinding().getObjectService().createFolder(getRepositoryId(),
-				objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
-				(folderId == null ? null : folderId.getId()), objectFactory.convertPolicies(policies),
-				objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null);
-
-		if (newId == null) {
-			return null;
-		}
-
-		return createObjectId(newId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.opencmis.client.api.Session#createPolicy(java.util.Map,
-	 * org.apache.opencmis.client.api.ObjectId, java.util.List, java.util.List,
-	 * java.util.List)
-	 */
-	public ObjectId createPolicy(Map<String, ?> properties, ObjectId folderId, List<Policy> policies,
-			List<Ace> addAces, List<Ace> removeAces) {
-		if ((folderId != null) && (folderId.getId() == null)) {
-			throw new IllegalArgumentException("Folder Id must be set!");
-		}
-
-		String newId = getBinding().getObjectService().createPolicy(getRepositoryId(),
-				objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
-				(folderId == null ? null : folderId.getId()), objectFactory.convertPolicies(policies),
-				objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null);
-
-		if (newId == null) {
-			return null;
-		}
-
-		return createObjectId(newId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.api.Session#createRelationship(java.util.Map,
-	 * java.util.List, java.util.List, java.util.List)
-	 */
-	public ObjectId createRelationship(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces,
-			List<Ace> removeAces) {
-		String newId = getBinding().getObjectService().createRelationship(getRepositoryId(),
-				objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
-				objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces),
-				objectFactory.convertAces(removeAces), null);
-
-		if (newId == null) {
-			return null;
-		}
+    private static final Set<Updatability> CREATE_UPDATABILITY = new HashSet<Updatability>();
+    static {
+        CREATE_UPDATABILITY.add(Updatability.ONCREATE);
+        CREATE_UPDATABILITY.add(Updatability.READWRITE);
+    }
+
+    private static Log log = LogFactory.getLog(PersistentSessionImpl.class);
+
+    private final ReentrantReadWriteLock fLock = new ReentrantReadWriteLock();
+
+    /*
+     * default session context (serializable)
+     */
+    private OperationContext context = DEFAULT_CONTEXT;
+
+    /*
+     * session parameter (serializable)
+     */
+    private Map<String, String> parameters = null;
+
+    /*
+     * CMIS provider (serializable)
+     */
+    private CmisBinding binding = null;
+
+    /*
+     * Session Locale, determined from session parameter (serializable)
+     */
+    private Locale locale = null;
+
+    /*
+     * Object cache (serializable)
+     */
+    private Cache cache = null;
+
+    /*
+     * Lazy loaded repository info. Will be invalid after clear(). Access by
+     * getter always. (serializable)
+     */
+    private RepositoryInfo repositoryInfo;
+
+    /*
+     * helper factory (non serializable)
+     */
+    private final ObjectFactory objectFactory = PersistentObjectFactoryImpl.newInstance(this);
+
+    /**
+     * required for serialization
+     */
+    private static final long serialVersionUID = -4287481628831198383L;
+
+    /**
+     * Constructor.
+     */
+    public PersistentSessionImpl(Map<String, String> parameters) {
+        this.parameters = parameters;
+        PersistentSessionImpl.log.info("Session Parameters: " + parameters);
+
+        this.locale = this.determineLocale(parameters);
+        PersistentSessionImpl.log.info("Session Locale: " + this.locale.toString());
+
+        int cacheSize = this.determineCacheSize(parameters);
+
+        if (cacheSize == -1) {
+            this.cache = CacheImpl.newInstance();
+        } else {
+            this.cache = CacheImpl.newInstance(cacheSize);
+        }
+        PersistentSessionImpl.log.info("Session Cache Size: " + this.cache.getCacheSize());
+    }
+
+    private int determineCacheSize(Map<String, String> parameters) {
+        int size = -1;
+
+        return size;
+    }
+
+    private String determineRepositoryId(Map<String, String> parameters) {
+        String repositoryId = parameters.get(SessionParameter.REPOSITORY_ID);
+        // if null then the provider will return a repository id (lazy)
+        return repositoryId;
+    }
+
+    private Locale determineLocale(Map<String, String> parameters) {
+        Locale locale = null;
+
+        String language = parameters.get(SessionParameter.LOCALE_ISO639_LANGUAGE);
+        String country = parameters.get(SessionParameter.LOCALE_ISO3166_COUNTRY);
+        String variant = parameters.get(SessionParameter.LOCALE_VARIANT);
+
+        if (variant != null) {
+            // all 3 parameter must not be null and valid
+            locale = new Locale(language, country, variant);
+        } else {
+            if (country != null) {
+                // 2 parameter must not be null and valid
+                locale = new Locale(language, country);
+            } else {
+                if (language != null) {
+                    // 1 parameter must not be null and valid
+                    locale = new Locale(language);
+                } else {
+                    locale = Locale.getDefault();
+                }
+            }
+        }
+
+        return locale;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#clear()
+     */
+    public void clear() {
+        fLock.writeLock().lock();
+        try {
+            int cacheSize = this.determineCacheSize(this.parameters);
+            if (cacheSize == -1) {
+                this.cache = CacheImpl.newInstance();
+            } else {
+                this.cache = CacheImpl.newInstance(cacheSize);
+            }
+            PersistentSessionImpl.log.info("Session Cache Size: " + this.cache.getCacheSize());
+
+            /*
+             * clear provider cache
+             */
+            getBinding().clearAllCaches();
+        } finally {
+            fLock.writeLock().unlock();
+        }
+    }
+
+    public void save() {
+        // nop
+    }
+
+    public void cancel() {
+        throw new UnsupportedOperationException("cancel");
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getObjectFactory()
+     */
+    public ObjectFactory getObjectFactory() {
+        return this.objectFactory;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getCheckedOutDocs(int)
+     */
+    public PagingIterable<Document> getCheckedOutDocs(int itemsPerPage) {
+        return getCheckedOutDocs(getDefaultContext(), itemsPerPage);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @seeorg.apache.opencmis.client.api.Session#getCheckedOutDocs(org.apache.
+     * opencmis.client.api. OperationContext, int)
+     */
+    public PagingIterable<Document> getCheckedOutDocs(OperationContext context, final int itemsPerPage) {
+        if (itemsPerPage < 1) {
+            throw new IllegalArgumentException("itemsPerPage must be > 0!");
+        }
+
+        final NavigationService navigationService = getBinding().getNavigationService();
+        final ObjectFactory objectFactory = getObjectFactory();
+        final OperationContext ctxt = new OperationContextImpl(context);
+
+        return new DefaultPagingIterable<Document>(new AbstractPageFetch<Document>() {
+
+            @Override
+            protected AbstractPageFetch.PageFetchResult<Document> fetchPage(long skipCount) {
+
+                // get all checked out documents
+                ObjectList checkedOutDocs = navigationService.getCheckedOutDocs(getRepositoryId(), null, ctxt
+                        .getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(), ctxt
+                        .getIncludeRelationships(), ctxt.getRenditionFilterString(), BigInteger.valueOf(itemsPerPage),
+                        BigInteger.valueOf(skipCount), null);
+
+                // convert objects
+                List<Document> page = new ArrayList<Document>();
+                if (checkedOutDocs.getObjects() != null) {
+                    for (ObjectData objectData : checkedOutDocs.getObjects()) {
+                        CmisObject doc = objectFactory.convertObject(objectData, ctxt);
+                        if (!(doc instanceof Document)) {
+                            // should not happen...
+                            continue;
+                        }
+
+                        page.add((Document) doc);
+                    }
+                }
+
+                return new AbstractPageFetch.PageFetchResult<Document>(page, checkedOutDocs.getNumItems(),
+                        checkedOutDocs.hasMoreItems()) {
+                };
+            }
+        });
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#getContentChanges(java.lang.String
+     * , int)
+     */
+    public PagingIterable<ChangeEvent> getContentChanges(String changeLogToken, int itemsPerPage) {
+        throw new CmisRuntimeException("not implemented");
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getDefaultContext()
+     */
+    public OperationContext getDefaultContext() {
+        fLock.readLock().lock();
+        try {
+            return this.context;
+        } finally {
+            fLock.readLock().unlock();
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @seeorg.apache.opencmis.client.api.Session#setDefaultContext(org.apache.
+     * opencmis.client.api. OperationContext)
+     */
+    public void setDefaultContext(OperationContext context) {
+        fLock.writeLock().lock();
+        try {
+            this.context = (context == null ? DEFAULT_CONTEXT : context);
+        } finally {
+            fLock.writeLock().unlock();
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#createOperationContext(java.util
+     * .Set, boolean, boolean, boolean,
+     * org.apache.opencmis.commons.enums.IncludeRelationships, java.util.Set,
+     * boolean, java.lang.String, boolean)
+     */
+    public OperationContext createOperationContext(Set<String> filter, boolean includeAcls,
+            boolean includeAllowableActions, boolean includePolicies, IncludeRelationships includeRelationships,
+            Set<String> renditionFilter, boolean includePathSegments, String orderBy, boolean cacheEnabled) {
+        return new OperationContextImpl(filter, includeAcls, includeAllowableActions, includePolicies,
+                includeRelationships, renditionFilter, includePathSegments, orderBy, cacheEnabled);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#createObjectId(java.lang.String)
+     */
+    public ObjectId createObjectId(String id) {
+        return new ObjectIdImpl(id);
+    }
+
+    public Locale getLocale() {
+        return this.locale;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getObject(java.lang.String)
+     */
+    public CmisObject getObject(ObjectId objectId) {
+        return getObject(objectId, getDefaultContext());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getObject(java.lang.String,
+     * org.apache.opencmis.client.api.OperationContext)
+     */
+    public CmisObject getObject(ObjectId objectId, OperationContext context) {
+        if ((objectId == null) || (objectId.getId() == null)) {
+            throw new IllegalArgumentException("Object Id must be set!");
+        }
+        if (context == null) {
+            throw new IllegalArgumentException("Operation context must be set!");
+        }
+
+        CmisObject result = null;
+
+        // ask the cache first
+        if (context.isCacheEnabled()) {
+            result = this.cache.getById(objectId.getId(), context.getCacheKey());
+            if (result != null) {
+                return result;
+            }
+        }
+
+        // get the object
+        ObjectData objectData = this.binding.getObjectService().getObject(getRepositoryId(), objectId.getId(),
+                context.getFilterString(), context.isIncludeAllowableActions(), context.getIncludeRelationships(),
+                context.getRenditionFilterString(), context.isIncludePolicies(), context.isIncludeAcls(), null);
+
+        result = getObjectFactory().convertObject(objectData, context);
+
+        // put into cache
+        if (context.isCacheEnabled()) {
+            this.cache.put(result, context.getCacheKey());
+        }
+
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#getObjectByPath(java.lang.String)
+     */
+    public CmisObject getObjectByPath(String path) {
+        return getObjectByPath(path, getDefaultContext());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#getObjectByPath(java.lang.String,
+     * org.apache.opencmis.client.api.OperationContext)
+     */
+    public CmisObject getObjectByPath(String path, OperationContext context) {
+        if (path == null) {
+            throw new IllegalArgumentException("Path must be set!");
+        }
+        if (context == null) {
+            throw new IllegalArgumentException("Operation context must be set!");
+        }
+
+        CmisObject result = null;
+
+        // ask the cache first
+        if (context.isCacheEnabled()) {
+            result = this.cache.getByPath(path, context.getCacheKey());
+            if (result != null) {
+                return result;
+            }
+        }
+
+        // get the object
+        ObjectData objectData = this.binding.getObjectService().getObjectByPath(getRepositoryId(), path,
+                context.getFilterString(), context.isIncludeAllowableActions(), context.getIncludeRelationships(),
+                context.getRenditionFilterString(), context.isIncludePolicies(), context.isIncludeAcls(), null);
+
+        result = getObjectFactory().convertObject(objectData, context);
+
+        // put into cache
+        if (context.isCacheEnabled()) {
+            this.cache.putPath(path, result, context.getCacheKey());
+        }
+
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getRepositoryInfo()
+     */
+    public RepositoryInfo getRepositoryInfo() {
+        fLock.readLock().lock();
+        try {
+            return this.repositoryInfo;
+        } finally {
+            fLock.readLock().unlock();
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getRootFolder()
+     */
+    public Folder getRootFolder() {
+        return getRootFolder(getDefaultContext());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * 
+     * 
+     * 
+     * 
+     * 
+     * 
+     * 
+     * 
+     * 
+     * @seeorg.apache.opencmis.client.api.Session#getRootFolder(org.apache.opencmis
+     * .client.api. OperationContext)
+     */
+    public Folder getRootFolder(OperationContext context) {
+        String rootFolderId = getRepositoryInfo().getRootFolderId();
+
+        CmisObject rootFolder = getObject(createObjectId(rootFolderId), context);
+        if (!(rootFolder instanceof Folder)) {
+            throw new CmisRuntimeException("Root folder object is not a folder!");
+        }
+
+        return (Folder) rootFolder;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#getTypeChildren(java.lang.String,
+     * boolean, int)
+     */
+    public PagingIterable<ObjectType> getTypeChildren(final String typeId, final boolean includePropertyDefinitions,
+            final int itemsPerPage) {
+        if (itemsPerPage < 1) {
+            throw new IllegalArgumentException("itemsPerPage must be > 0!");
+        }
+
+        final RepositoryService repositoryService = getBinding().getRepositoryService();
+        final ObjectFactory objectFactory = this.getObjectFactory();
+
+        return new DefaultPagingIterable<ObjectType>(new AbstractPageFetch<ObjectType>() {
+
+            @Override
+            protected AbstractPageFetch.PageFetchResult<ObjectType> fetchPage(long skipCount) {
+
+                // fetch the data
+                TypeDefinitionList tdl = repositoryService.getTypeChildren(
+                        PersistentSessionImpl.this.getRepositoryId(), typeId, includePropertyDefinitions, BigInteger
+                                .valueOf(itemsPerPage), BigInteger.valueOf(skipCount), null);
+
+                // convert type definitions
+                List<ObjectType> page = new ArrayList<ObjectType>(tdl.getList().size());
+                for (TypeDefinition typeDefinition : tdl.getList()) {
+                    page.add(objectFactory.convertTypeDefinition(typeDefinition));
+                }
+
+                return new AbstractPageFetch.PageFetchResult<ObjectType>(page, tdl.getNumItems(), tdl.hasMoreItems()) {
+                };
+            }
+        });
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#getTypeDefinition(java.lang.String
+     * )
+     */
+    public ObjectType getTypeDefinition(String typeId) {
+        TypeDefinition typeDefinition = getBinding().getRepositoryService().getTypeDefinition(getRepositoryId(),
+                typeId, null);
+        return objectFactory.convertTypeDefinition(typeDefinition);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#getTypeDescendants(java.lang.String
+     * , int, boolean)
+     */
+    public List<Tree<ObjectType>> getTypeDescendants(String typeId, int depth, boolean includePropertyDefinitions) {
+        List<TypeDefinitionContainer> descendants = getBinding().getRepositoryService().getTypeDescendants(
+                getRepositoryId(), typeId, BigInteger.valueOf(depth), includePropertyDefinitions, null);
+
+        return convertTypeDescendants(descendants);
+    }
+
+    /**
+     * Converts provider <code>TypeDefinitionContainer</code> to API
+     * <code>Container</code>.
+     */
+    private List<Tree<ObjectType>> convertTypeDescendants(List<TypeDefinitionContainer> descendantsList) {
+        List<Tree<ObjectType>> result = new ArrayList<Tree<ObjectType>>();
+
+        for (TypeDefinitionContainer container : descendantsList) {
+            ObjectType objectType = objectFactory.convertTypeDefinition(container.getTypeDefinition());
+            List<Tree<ObjectType>> children = convertTypeDescendants(container.getChildren());
+
+            result.add(new ContainerImpl<ObjectType>(objectType, children));
+        }
+
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#query(java.lang.String,
+     * boolean, int)
+     */
+    public PagingIterable<QueryResult> query(final String statement, final boolean searchAllVersions,
+            final int itemsPerPage) {
+        return query(statement, searchAllVersions, getDefaultContext(), itemsPerPage);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#query(java.lang.String,
+     * boolean, org.apache.opencmis.client.api.OperationContext, int)
+     */
+    public PagingIterable<QueryResult> query(final String statement, final boolean searchAllVersions,
+            OperationContext context, final int itemsPerPage) {
+
+        if (itemsPerPage < 1) {
+            throw new IllegalArgumentException("itemsPerPage must be > 0!");
+        }
+
+        final DiscoveryService discoveryService = getBinding().getDiscoveryService();
+        final ObjectFactory objectFactory = this.getObjectFactory();
+        final OperationContext ctxt = new OperationContextImpl(context);
+
+        return new DefaultPagingIterable<QueryResult>(new AbstractPageFetch<QueryResult>() {
+
+            @Override
+            protected AbstractPageFetch.PageFetchResult<QueryResult> fetchPage(long skipCount) {
+
+                // fetch the data
+                ObjectList resultList = discoveryService.query(getRepositoryId(), statement, searchAllVersions, ctxt
+                        .isIncludeAllowableActions(), ctxt.getIncludeRelationships(), ctxt.getRenditionFilterString(),
+                        BigInteger.valueOf(itemsPerPage), BigInteger.valueOf(skipCount), null);
+
+                // convert type definitions
+                List<QueryResult> page = new ArrayList<QueryResult>();
+                if (resultList.getObjects() != null) {
+                    for (ObjectData objectData : resultList.getObjects()) {
+                        if (objectData == null) {
+                            continue;
+                        }
+
+                        page.add(objectFactory.convertQueryResult(objectData));
+                    }
+                }
+
+                return new AbstractPageFetch.PageFetchResult<QueryResult>(page, resultList.getNumItems(), resultList
+                        .hasMoreItems()) {
+                };
+            }
+        });
+
+    }
+
+    public String setExtensionContext(String context) {
+        throw new CmisRuntimeException("not implemented");
+    }
+
+    public ExtensionHandler setExtensionHandler(String context, ExtensionHandler extensionHandler) {
+        throw new CmisRuntimeException("not implemented");
+    }
+
+    /**
+     * Connect session object to the provider. This is the very first call after
+     * a session is created.
+     * <p>
+     * In dependency of the parameter set an {@code AtomPub}, a {@code
+     * WebService} or an {@code InMemory} provider is selected.
+     */
+    public void connect() {
+        fLock.writeLock().lock();
+        try {
+            this.binding = CmisBindingHelper.createProvider(this.parameters);
+
+            /* get initial repository id from session parameter */
+            String repositoryId = this.determineRepositoryId(this.parameters);
+            if (repositoryId == null) {
+                throw new IllegalStateException("Repository Id is not set!");
+            }
+
+            repositoryInfo = getBinding().getRepositoryService().getRepositoryInfo(repositoryId, null);
+        } finally {
+            fLock.writeLock().unlock();
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#getBinding()
+     */
+    public CmisBinding getBinding() {
+        fLock.readLock().lock();
+        try {
+            return this.binding;
+        } finally {
+            fLock.readLock().unlock();
+        }
+    }
+
+    public Cache getCache() {
+        fLock.readLock().lock();
+        try {
+            return this.cache;
+        } finally {
+            fLock.readLock().unlock();
+        }
+    }
+
+    /**
+     * Returns the repository id.
+     */
+    public String getRepositoryId() {
+        return getRepositoryInfo().getId();
+    }
+
+    // creates
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#createDocument(java.util.Map,
+     * org.apache.opencmis.client.api.ObjectId,
+     * org.apache.opencmis.client.api.ContentStream,
+     * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
+     * java.util.List, java.util.List)
+     */
+    public ObjectId createDocument(Map<String, ?> properties, ObjectId folderId, ContentStream contentStream,
+            VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces) {
+        if ((folderId != null) && (folderId.getId() == null)) {
+            throw new IllegalArgumentException("Folder Id must be set!");
+        }
+
+        String newId = getBinding().getObjectService().createDocument(getRepositoryId(),
+                objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
+                (folderId == null ? null : folderId.getId()), objectFactory.convertContentStream(contentStream),
+                versioningState, objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces),
+                objectFactory.convertAces(removeAces), null);
+
+        if (newId == null) {
+            return null;
+        }
+
+        return createObjectId(newId);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#createDocumentFromSource(org.apache
+     * .opencmis.client. api.ObjectId, java.util.Map,
+     * org.apache.opencmis.client.api.ObjectId,
+     * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
+     * java.util.List, java.util.List)
+     */
+    public ObjectId createDocumentFromSource(ObjectId source, Map<String, ?> properties, ObjectId folderId,
+            VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces) {
+        if ((folderId != null) && (folderId.getId() == null)) {
+            throw new IllegalArgumentException("Folder Id must be set!");
+        }
+
+        // get the type of the source document
+        ObjectType type = null;
+        if (source instanceof CmisObject) {
+            type = ((CmisObject) source).getBaseType();
+        } else {
+            CmisObject sourceObj = getObject(source);
+            type = sourceObj.getType();
+        }
+
+        if (type.getBaseTypeId() != BaseTypeId.CMIS_DOCUMENT) {
+            throw new IllegalArgumentException("Source object must be a document!");
+        }
+
+        String newId = getBinding().getObjectService().createDocumentFromSource(getRepositoryId(), source.getId(),
+                objectFactory.convertProperties(properties, type, CREATE_UPDATABILITY),
+                (folderId == null ? null : folderId.getId()), versioningState, objectFactory.convertPolicies(policies),
+                objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null);
+
+        if (newId == null) {
+            return null;
+        }
+
+        return createObjectId(newId);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#createFolder(java.util.Map,
+     * org.apache.opencmis.client.api.ObjectId, java.util.List, java.util.List,
+     * java.util.List)
+     */
+    public ObjectId createFolder(Map<String, ?> properties, ObjectId folderId, List<Policy> policies,
+            List<Ace> addAces, List<Ace> removeAces) {
+        if ((folderId != null) && (folderId.getId() == null)) {
+            throw new IllegalArgumentException("Folder Id must be set!");
+        }
+
+        String newId = getBinding().getObjectService().createFolder(getRepositoryId(),
+                objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
+                (folderId == null ? null : folderId.getId()), objectFactory.convertPolicies(policies),
+                objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null);
+
+        if (newId == null) {
+            return null;
+        }
+
+        return createObjectId(newId);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.opencmis.client.api.Session#createPolicy(java.util.Map,
+     * org.apache.opencmis.client.api.ObjectId, java.util.List, java.util.List,
+     * java.util.List)
+     */
+    public ObjectId createPolicy(Map<String, ?> properties, ObjectId folderId, List<Policy> policies,
+            List<Ace> addAces, List<Ace> removeAces) {
+        if ((folderId != null) && (folderId.getId() == null)) {
+            throw new IllegalArgumentException("Folder Id must be set!");
+        }
+
+        String newId = getBinding().getObjectService().createPolicy(getRepositoryId(),
+                objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
+                (folderId == null ? null : folderId.getId()), objectFactory.convertPolicies(policies),
+                objectFactory.convertAces(addAces), objectFactory.convertAces(removeAces), null);
+
+        if (newId == null) {
+            return null;
+        }
+
+        return createObjectId(newId);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.api.Session#createRelationship(java.util.Map,
+     * java.util.List, java.util.List, java.util.List)
+     */
+    public ObjectId createRelationship(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces,
+            List<Ace> removeAces) {
+        String newId = getBinding().getObjectService().createRelationship(getRepositoryId(),
+                objectFactory.convertProperties(properties, null, CREATE_UPDATABILITY),
+                objectFactory.convertPolicies(policies), objectFactory.convertAces(addAces),
+                objectFactory.convertAces(removeAces), null);
+
+        if (newId == null) {
+            return null;
+        }
 
-		return createObjectId(newId);
-	}
+        return createObjectId(newId);
+    }
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/java/org/apache/chemistry/opencmis/client/runtime/PagingListTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/java/org/apache/chemistry/opencmis/client/runtime/PagingListTest.java?rev=937238&r1=937237&r2=937238&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/java/org/apache/chemistry/opencmis/client/runtime/PagingListTest.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/test/java/org/apache/chemistry/opencmis/client/runtime/PagingListTest.java Fri Apr 23 10:38:11 2010
@@ -55,9 +55,10 @@ public class PagingListTest {
                     hasMoreItems = Boolean.FALSE;
                 }
 
-                //. simulate rolling total number of items (for repositories that don't necessarily know up front)
+                // . simulate rolling total number of items (for repositories
+                // that don't necessarily know up front)
                 int totalItems = (to == data.length) ? to : to + 1;
-                
+
                 for (int i = from; i < to; i++) {
                     page.add(data[i]);
                 }
@@ -130,7 +131,7 @@ public class PagingListTest {
         assertEquals(pageSize + 1, i.getPosition());
         assertEquals(this.data10.length, i.getTotalNumItems());
     }
-    
+
     private void loopSkip(String[] data, int skipCount, int pageSize) {
         System.out.println("\nloopSkip (" + skipCount + ", " + pageSize + ")");
 

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectRelationIT.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectRelationIT.java?rev=937238&r1=937237&r2=937238&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectRelationIT.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectRelationIT.java Fri Apr 23 10:38:11 2010
@@ -34,33 +34,35 @@ import org.apache.chemistry.opencmis.com
 import org.junit.Ignore;
 import org.junit.Test;
 
-@Ignore // relations not yet supported
+// relations not yet supported
+@Ignore
 public class WriteObjectRelationIT extends AbstractSessionTest {
 
-	@Test
-	public void createAndLoopRelations() {
-		String path1 = "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/" + FixtureData.DOCUMENT1_NAME;
-		Document document1 = (Document) this.session.getObjectByPath(path1);
-		assertNotNull("Document not found: " + path1, document1);
-		
-		String path2 = "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/" + FixtureData.DOCUMENT2_NAME;
-		Document document2 = (Document) this.session.getObjectByPath(path2);
-		assertNotNull("Document not found: " + path2, document2);
+    @Test
+    public void createAndLoopRelations() {
+        String path1 = "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/" + FixtureData.DOCUMENT1_NAME;
+        Document document1 = (Document) this.session.getObjectByPath(path1);
+        assertNotNull("Document not found: " + path1, document1);
+
+        String path2 = "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/" + FixtureData.DOCUMENT2_NAME;
+        Document document2 = (Document) this.session.getObjectByPath(path2);
+        assertNotNull("Document not found: " + path2, document2);
 
         Map<String, Object> properties = new HashMap<String, Object>();
         properties.put(PropertyIds.OBJECT_TYPE_ID, ObjectType.RELATIONSHIP_BASETYPE_ID);
         properties.put(PropertyIds.SOURCE_ID, document1.getId());
         properties.put(PropertyIds.TARGET_ID, document2.getId());
 
-		ObjectId id = this.session.createRelationship(properties, null, null, null);
+        ObjectId id = this.session.createRelationship(properties, null, null, null);
+
+        ObjectType ot = document1.getType();
+        PagingIterable<Relationship> relations = document1.getRelationships(true, RelationshipDirection.EITHER, ot,
+                this.session.getDefaultContext(), 10);
+        for (Relationship r : relations) {
+            assertNotNull(r);
+            assertEquals(id, r.getId());
+            break;
+        }
+    }
 
-		ObjectType ot = document1.getType();
-		PagingIterable<Relationship> relations = document1.getRelationships(true, RelationshipDirection.EITHER, ot, this.session.getDefaultContext(), 10);
-		for (Relationship r : relations) {
-			assertNotNull(r);
-			assertEquals(id, r.getId());
-			break;
-		}
-	}
-	
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectVersionIT.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectVersionIT.java?rev=937238&r1=937237&r2=937238&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectVersionIT.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-test/chemistry-opencmis-test-fit/src/test/java/org/apache/chemistry/opencmis/fit/runtime/WriteObjectVersionIT.java Fri Apr 23 10:38:11 2010
@@ -29,31 +29,31 @@ import org.apache.chemistry.opencmis.cli
 import org.junit.Test;
 
 public class WriteObjectVersionIT extends AbstractSessionTest {
-	@Test
-	public void checkOutDocs() {
+    @Test
+    public void checkOutDocs() {
 
-		/* check out one versionable document */
-		String path = "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/" + FixtureData.DOCUMENT1_NAME;
-		Document document = (Document) this.session.getObjectByPath(path);
-		assertNotNull("Document not found: " + path, document);
-		DocumentType dt = (DocumentType) document.getType();
-		assertNotNull(dt);
-		ObjectId id = null;
-		if (dt.isVersionable()) {
-			id = document.checkOut();
-		}
+        /* check out one versionable document */
+        String path = "/" + Fixture.TEST_ROOT_FOLDER_NAME + "/" + FixtureData.DOCUMENT1_NAME;
+        Document document = (Document) this.session.getObjectByPath(path);
+        assertNotNull("Document not found: " + path, document);
+        DocumentType dt = (DocumentType) document.getType();
+        assertNotNull(dt);
+        ObjectId id = null;
+        if (dt.isVersionable()) {
+            id = document.checkOut();
+        }
 
-		/* get all verchecked out docs which should be exactly one or zero */
-		Folder f = this.session.getRootFolder();
-		assertNotNull(f);
-		PagingIterable<Document> pi = f.getCheckedOutDocs(10);
-		assertNotNull(pi);
+        /* get all verchecked out docs which should be exactly one or zero */
+        Folder f = this.session.getRootFolder();
+        assertNotNull(f);
+        PagingIterable<Document> pi = f.getCheckedOutDocs(10);
+        assertNotNull(pi);
 
-		for (Document d : pi) {
-			assertNotNull(d);
-			assertEquals(id, d.getId());
-			break; // check only first and only loop entry
-		}
-	}
+        for (Document d : pi) {
+            assertNotNull(d);
+            assertEquals(id, d.getId());
+            break; // check only first and only loop entry
+        }
+    }
 
 }



Mime
View raw message