implemented enumerators

git-svn-id: https://svn.apache.org/repos/asf/incubator/chemistry/dotcmis/trunk@1065064 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/DotCMIS.suo b/DotCMIS.suo
index b358d86..f786b4b 100644
--- a/DotCMIS.suo
+++ b/DotCMIS.suo
Binary files differ
diff --git a/DotCMIS/DotCMIS.csproj b/DotCMIS/DotCMIS.csproj
index 037c7bb..6a25571 100644
--- a/DotCMIS/DotCMIS.csproj
+++ b/DotCMIS/DotCMIS.csproj
@@ -59,6 +59,7 @@
     <Compile Include="client\client-objectfactory.cs" />

     <Compile Include="client\client-objects.cs" />

     <Compile Include="client\client-types.cs" />

+    <Compile Include="client\client-utils.cs" />

     <Compile Include="const.cs" />

     <Compile Include="data\data-impl.cs" />

     <Compile Include="data\data-intf.cs" />

diff --git a/DotCMIS/binding/atompub/atompub-linkcache.cs b/DotCMIS/binding/atompub/atompub-linkcache.cs
index 4d8c718..815cc78 100644
--- a/DotCMIS/binding/atompub/atompub-linkcache.cs
+++ b/DotCMIS/binding/atompub/atompub-linkcache.cs
@@ -256,7 +256,7 @@
     {

         public ContentTypeCacheLevel()

         {

-            EnableKeyFallback(null);

+            EnableKeyFallback(NullKey);

         }

 

         public override object this[string key]

diff --git a/DotCMIS/binding/binding-caches.cs b/DotCMIS/binding/binding-caches.cs
index 2ee5f23..c115fc0 100644
--- a/DotCMIS/binding/binding-caches.cs
+++ b/DotCMIS/binding/binding-caches.cs
@@ -352,7 +352,7 @@
 

     internal abstract class AbstractDictionaryCacheLevel : ICacheLevel

     {

-        private static string NullKey = "";

+        protected static string NullKey = "";

 

         private IDictionary<string, object> dict;

         private bool fallbackEnabled = false;

diff --git a/DotCMIS/client/client-impl.cs b/DotCMIS/client/client-impl.cs
index b9cc86e..603b912 100644
--- a/DotCMIS/client/client-impl.cs
+++ b/DotCMIS/client/client-impl.cs
@@ -26,6 +26,7 @@
 using System.Threading;

 using DotCMIS.Enums;

 using DotCMIS.Data.Extensions;

+using DotCMIS.Binding.Services;

 

 namespace DotCMIS.Client

 {

@@ -332,11 +333,51 @@
             return ObjectFactory.ConvertTypeDefinition(typeDefinition);

         }

 

-        public IItemIterable<IObjectType> GetTypeChildren(string typeId, bool includePropertyDefinitions)

-        { throw new CmisNotSupportedException("Client not implemented!"); }

+        public IItemEnumerable<IObjectType> GetTypeChildren(string typeId, bool includePropertyDefinitions)

+        {

+            IRepositoryService repositoryService = Binding.GetRepositoryService();

+

+            PageFetcher<IObjectType>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)

+            {

+                // fetch the data

+                ITypeDefinitionList tdl = repositoryService.GetTypeChildren(RepositoryId, typeId, includePropertyDefinitions, maxNumItems, skipCount, null);

+

+                // convert type definitions

+                IList<IObjectType> page = new List<IObjectType>(tdl.List.Count);

+                foreach (ITypeDefinition typeDefinition in tdl.List)

+                {

+                    page.Add(ObjectFactory.ConvertTypeDefinition(typeDefinition));

+                }

+

+                return new PageFetcher<IObjectType>.Page<IObjectType>(page, tdl.NumItems, tdl.HasMoreItems);

+            };

+

+            return new CollectionEnumerable<IObjectType>(new PageFetcher<IObjectType>(DefaultContext.MaxItemsPerPage, fetchPageDelegate));

+        }

 

         public IList<ITree<IObjectType>> GetTypeDescendants(string typeId, int depth, bool includePropertyDefinitions)

-        { throw new CmisNotSupportedException("Client not implemented!"); }

+        {

+            IList<ITypeDefinitionContainer> descendants = Binding.GetRepositoryService().GetTypeDescendants(

+            RepositoryId, typeId, depth, includePropertyDefinitions, null);

+

+            return ConvertTypeDescendants(descendants);

+        }

+

+        private IList<ITree<IObjectType>> ConvertTypeDescendants(IList<ITypeDefinitionContainer> descendantsList)

+        {

+            IList<ITree<IObjectType>> result = new List<ITree<IObjectType>>();

+

+            foreach (ITypeDefinitionContainer container in descendantsList)

+            {

+                Tree<IObjectType> tree = new Tree<IObjectType>();

+                tree.Item = ObjectFactory.ConvertTypeDefinition(container.TypeDefinition);

+                tree.Children = ConvertTypeDescendants(container.Children);

+

+                result.Add(tree);

+            }

+

+            return result;

+        }

 

         // navigation

 

@@ -347,9 +388,7 @@
 

         public IFolder GetRootFolder(IOperationContext context)

         {

-            string rootFolderId = RepositoryInfo.RootFolderId;

-

-            ICmisObject rootFolder = GetObject(CreateObjectId(rootFolderId), context);

+            ICmisObject rootFolder = GetObject(CreateObjectId(RepositoryInfo.RootFolderId), context);

             if (!(rootFolder is IFolder))

             {

                 throw new CmisRuntimeException("Root folder object is not a folder!");

@@ -358,10 +397,10 @@
             return (IFolder)rootFolder;

         }

 

-        public IItemIterable<IDocument> GetCheckedOutDocs()

+        public IItemEnumerable<IDocument> GetCheckedOutDocs()

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IItemIterable<IDocument> GetCheckedOutDocs(IOperationContext context)

+        public IItemEnumerable<IDocument> GetCheckedOutDocs(IOperationContext context)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

         public ICmisObject GetObject(IObjectId objectId)

@@ -382,59 +421,59 @@
 

         // discovery

 

-        public IItemIterable<IQueryResult> Query(string statement, bool searchAllVersions)

+        public IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IItemIterable<IQueryResult> query(string statement, bool searchAllVersions, IOperationContext context)

+        public IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions, IOperationContext context)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IChangeEvents getContentChanges(string changeLogToken, bool includeProperties, long maxNumItems)

+        public IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IChangeEvents getContentChanges(string changeLogToken, bool includeProperties, long maxNumItems,

+        public IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems,

                 IOperationContext context)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

         // create

 

-        public IObjectId CreateDocument(IDictionary<string, string> properties, IObjectId folderId, IContentStream contentStream,

+        public IObjectId CreateDocument(IDictionary<string, object> properties, IObjectId folderId, IContentStream contentStream,

                 VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateDocument(IDictionary<string, string> properties, IObjectId folderId, IContentStream contentStream,

+        public IObjectId CreateDocument(IDictionary<string, object> properties, IObjectId folderId, IContentStream contentStream,

                 VersioningState? versioningState)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, string> properties, IObjectId folderId,

+        public IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, object> properties, IObjectId folderId,

                 VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, string> properties, IObjectId folderId,

+        public IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, object> properties, IObjectId folderId,

                 VersioningState? versioningState)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateFolder(IDictionary<string, string> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

+        public IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

                 IList<IAce> removeAces)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateFolder(IDictionary<string, string> properties, IObjectId folderId)

+        public IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreatePolicy(IDictionary<string, string> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

+        public IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

                 IList<IAce> removeAces)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreatePolicy(IDictionary<string, string> properties, IObjectId folderId)

+        public IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateRelationship(IDictionary<string, string> properties, IList<IPolicy> policies, IList<IAce> addAces,

+        public IObjectId CreateRelationship(IDictionary<string, object> properties, IList<IPolicy> policies, IList<IAce> addAces,

                 IList<IAce> removeAces)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IObjectId CreateRelationship(IDictionary<string, string> properties)

+        public IObjectId CreateRelationship(IDictionary<string, object> properties)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

-        public IItemIterable<IRelationship> GetRelationships(IObjectId objectId, bool includeSubRelationshipTypes,

+        public IItemEnumerable<IRelationship> GetRelationships(IObjectId objectId, bool includeSubRelationshipTypes,

                 RelationshipDirection? relationshipDirection, IObjectType type, IOperationContext context)

         { throw new CmisNotSupportedException("Client not implemented!"); }

 

@@ -462,335 +501,4 @@
             Monitor.Exit(sessionLock);

         }

     }

-

-    /// <summary>

-    /// Operation context implementation.

-    /// </summary>

-    public class OperationContext : IOperationContext

-    {

-        public const string PropertiesStar = "*";

-        public const string RenditionNone = "cmis:none";

-

-        private HashSet<string> filter;

-        private bool includeAllowableActions;

-        private bool includeAcls;

-        private IncludeRelationshipsFlag? includeRelationships;

-        private bool includePolicies;

-        private HashSet<string> renditionFilter;

-        private bool includePathSegments;

-        private string orderBy;

-        private bool cacheEnabled;

-        private string cacheKey;

-        private int maxItemsPerPage;

-

-        public OperationContext()

-        {

-            filter = null;

-            includeAcls = false;

-            includeAllowableActions = true;

-            includePolicies = false;

-            includeRelationships = IncludeRelationshipsFlag.None;

-            renditionFilter = null;

-            includePathSegments = true;

-            orderBy = null;

-            cacheEnabled = false;

-            maxItemsPerPage = 100;

-

-            GenerateCacheKey();

-        }

-

-        public OperationContext(IOperationContext source)

-        {

-            filter = new HashSet<string>(source.Filter);

-            includeAcls = source.IncludeAcls;

-            includeAllowableActions = source.IncludeAllowableActions;

-            includePolicies = source.IncludePolicies;

-            includeRelationships = source.IncludeRelationships;

-            renditionFilter = new HashSet<string>(source.RenditionFilter);

-            includePathSegments = source.IncludePathSegments;

-            orderBy = source.OrderBy;

-            cacheEnabled = source.CacheEnabled;

-            maxItemsPerPage = source.MaxItemsPerPage;

-

-            GenerateCacheKey();

-        }

-

-        public OperationContext(HashSet<string> filter, bool includeAcls, bool includeAllowableActions,

-            bool includePolicies, IncludeRelationshipsFlag includeRelationships, HashSet<string> renditionFilter,

-            bool includePathSegments, String orderBy, bool cacheEnabled, int maxItemsPerPage)

-        {

-            this.filter = filter;

-            this.includeAcls = includeAcls;

-            this.includeAllowableActions = includeAllowableActions;

-            this.includePolicies = includePolicies;

-            this.includeRelationships = includeRelationships;

-            this.renditionFilter = renditionFilter;

-            this.includePathSegments = includePathSegments;

-            this.orderBy = orderBy;

-            this.cacheEnabled = cacheEnabled;

-            this.maxItemsPerPage = maxItemsPerPage;

-

-            GenerateCacheKey();

-        }

-

-        public HashSet<string> Filter

-        {

-            get { return new HashSet<string>(filter); }

-            set

-            {

-                if (value != null)

-                {

-                    HashSet<string> tempSet = new HashSet<string>();

-                    foreach (string oid in value)

-                    {

-                        if (oid == null) { continue; }

-

-                        string toid = oid.Trim();

-                        if (toid.Length == 0) { continue; }

-                        if (toid == PropertiesStar)

-                        {

-                            tempSet = new HashSet<string>();

-                            tempSet.Add(PropertiesStar);

-                            break;

-                        }

-                        if (toid.IndexOf(',') > -1)

-                        {

-                            throw new ArgumentException("Query id must not contain a comma!");

-                        }

-

-                        tempSet.Add(toid);

-                    }

-

-                    if (tempSet.Count == 0) { filter = null; }

-                    else { filter = tempSet; }

-                }

-                else

-                {

-                    filter = null;

-                }

-

-                GenerateCacheKey();

-            }

-        }

-

-        public string FilterString

-        {

-            get

-            {

-                if (filter == null) { return null; }

-

-                if (filter.Contains(PropertiesStar))

-                {

-                    return PropertiesStar;

-                }

-

-                this.filter.Add(PropertyIds.ObjectId);

-                this.filter.Add(PropertyIds.BaseTypeId);

-                this.filter.Add(PropertyIds.ObjectTypeId);

-

-                StringBuilder sb = new StringBuilder();

-

-                foreach (String oid in filter)

-                {

-                    if (sb.Length > 0) { sb.Append(','); }

-                    sb.Append(oid);

-                }

-

-                return sb.ToString();

-            }

-

-            set

-            {

-                if (value == null || value.Trim().Length == 0)

-                {

-                    Filter = null;

-                    return;

-                }

-

-                string[] ids = value.Split(',');

-                HashSet<string> tempSet = new HashSet<string>();

-                foreach (string qid in ids)

-                {

-                    tempSet.Add(qid);

-                }

-

-                Filter = tempSet;

-            }

-        }

-

-        public bool IncludeAllowableActions

-        {

-            get { return includeAllowableActions; }

-            set { includeAllowableActions = value; GenerateCacheKey(); }

-        }

-

-        public bool IncludeAcls

-        {

-            get { return includeAcls; }

-            set { includeAcls = value; GenerateCacheKey(); }

-        }

-

-        public IncludeRelationshipsFlag? IncludeRelationships

-        {

-            get { return includeRelationships; }

-            set { includeRelationships = value; GenerateCacheKey(); }

-        }

-

-        public bool IncludePolicies

-        {

-            get { return includePolicies; }

-            set { includePolicies = value; GenerateCacheKey(); }

-        }

-

-        public HashSet<string> RenditionFilter

-        {

-            get { return new HashSet<string>(renditionFilter); }

-            set

-            {

-                HashSet<string> tempSet = new HashSet<string>();

-                if (value != null)

-                {

-                    foreach (String rf in value)

-                    {

-                        if (rf == null) { continue; }

-

-                        String trf = rf.Trim();

-                        if (trf.Length == 0) { continue; }

-                        if (trf.IndexOf(',') > -1)

-                        {

-                            throw new ArgumentException("Rendition must not contain a comma!");

-                        }

-

-                        tempSet.Add(trf);

-                    }

-

-                    if (tempSet.Count == 0)

-                    {

-                        tempSet.Add(RenditionNone);

-                    }

-                }

-                else

-                {

-                    tempSet.Add(RenditionNone);

-                }

-

-                renditionFilter = tempSet;

-

-                GenerateCacheKey();

-            }

-        }

-

-        public string RenditionFilterString

-        {

-            get

-            {

-                if (renditionFilter == null) { return null; }

-

-                StringBuilder sb = new StringBuilder();

-                foreach (string rf in renditionFilter)

-                {

-                    if (sb.Length > 0) { sb.Append(','); }

-                    sb.Append(rf);

-                }

-

-                return sb.ToString();

-            }

-

-            set

-            {

-                if (value == null || value.Trim().Length == 0)

-                {

-                    RenditionFilter = null;

-                    return;

-                }

-

-                string[] renditions = value.Split(',');

-                HashSet<string> tempSet = new HashSet<string>();

-                foreach (string rend in renditions)

-                {

-                    tempSet.Add(rend);

-                }

-

-                RenditionFilter = tempSet;

-            }

-        }

-

-        public bool IncludePathSegments

-        {

-            get { return includePathSegments; }

-            set { includePathSegments = value; GenerateCacheKey(); }

-        }

-

-        public string OrderBy

-        {

-            get { return orderBy; }

-            set { orderBy = value; GenerateCacheKey(); }

-        }

-

-        public bool CacheEnabled

-        {

-            get { return cacheEnabled; }

-            set { cacheEnabled = value; GenerateCacheKey(); }

-        }

-

-        public string CacheKey

-        {

-            get { return cacheKey; }

-        }

-

-        public int MaxItemsPerPage

-        {

-            get { return maxItemsPerPage; }

-            set { maxItemsPerPage = value; }

-        }

-

-        protected void GenerateCacheKey()

-        {

-            if (!cacheEnabled)

-            {

-                cacheKey = null;

-            }

-

-            StringBuilder sb = new StringBuilder();

-

-            sb.Append(includeAcls ? "1" : "0");

-            sb.Append(includeAllowableActions ? "1" : "0");

-            sb.Append(includePolicies ? "1" : "0");

-            sb.Append("|");

-            sb.Append(filter == null ? "" : FilterString);

-            sb.Append("|");

-            sb.Append(includeRelationships == null ? "" : includeRelationships.GetCmisValue());

-

-            sb.Append("|");

-            sb.Append(renditionFilter == null ? "" : RenditionFilterString);

-

-            cacheKey = sb.ToString();

-        }

-    }

-

-    /// <summary>

-    /// Object id implementation.

-    /// </summary>

-    public class ObjectId : IObjectId

-    {

-        private string id;

-        public string Id

-        {

-            get { return id; }

-            set

-            {

-                if (value == null || value.Length == 0)

-                {

-                    throw new ArgumentException("Id must be set!");

-                }

-

-                id = value;

-            }

-        }

-

-        public ObjectId(string id)

-        {

-            Id = id;

-        }

-    }

 }

diff --git a/DotCMIS/client/client-intf.cs b/DotCMIS/client/client-intf.cs
index 4de4142..f551d5b 100644
--- a/DotCMIS/client/client-intf.cs
+++ b/DotCMIS/client/client-intf.cs
@@ -60,15 +60,15 @@
         // types

 

         IObjectType GetTypeDefinition(string typeId);

-        IItemIterable<IObjectType> GetTypeChildren(string typeId, bool includePropertyDefinitions);

+        IItemEnumerable<IObjectType> GetTypeChildren(string typeId, bool includePropertyDefinitions);

         IList<ITree<IObjectType>> GetTypeDescendants(string typeId, int depth, bool includePropertyDefinitions);

 

         // navigation

 

         IFolder GetRootFolder();

         IFolder GetRootFolder(IOperationContext context);

-        IItemIterable<IDocument> GetCheckedOutDocs();

-        IItemIterable<IDocument> GetCheckedOutDocs(IOperationContext context);

+        IItemEnumerable<IDocument> GetCheckedOutDocs();

+        IItemEnumerable<IDocument> GetCheckedOutDocs(IOperationContext context);

         ICmisObject GetObject(IObjectId objectId);

         ICmisObject GetObject(IObjectId objectId, IOperationContext context);

         ICmisObject GetObjectByPath(string path);

@@ -76,33 +76,33 @@
 

         // discovery

 

-        IItemIterable<IQueryResult> Query(string statement, bool searchAllVersions);

-        IItemIterable<IQueryResult> query(string statement, bool searchAllVersions, IOperationContext context);

-        IChangeEvents getContentChanges(string changeLogToken, bool includeProperties, long maxNumItems);

-        IChangeEvents getContentChanges(string changeLogToken, bool includeProperties, long maxNumItems,

+        IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions);

+        IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions, IOperationContext context);

+        IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems);

+        IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems,

                 IOperationContext context);

 

         // create

 

-        IObjectId CreateDocument(IDictionary<string, string> properties, IObjectId folderId, IContentStream contentStream,

+        IObjectId CreateDocument(IDictionary<string, object> properties, IObjectId folderId, IContentStream contentStream,

                 VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces);

-        IObjectId CreateDocument(IDictionary<string, string> properties, IObjectId folderId, IContentStream contentStream,

+        IObjectId CreateDocument(IDictionary<string, object> properties, IObjectId folderId, IContentStream contentStream,

                 VersioningState? versioningState);

-        IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, string> properties, IObjectId folderId,

+        IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, object> properties, IObjectId folderId,

                 VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces);

-        IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, string> properties, IObjectId folderId,

+        IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, object> properties, IObjectId folderId,

                 VersioningState? versioningState);

-        IObjectId CreateFolder(IDictionary<string, string> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

+        IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

                 IList<IAce> removeAces);

-        IObjectId CreateFolder(IDictionary<string, string> properties, IObjectId folderId);

-        IObjectId CreatePolicy(IDictionary<string, string> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

+        IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId);

+        IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,

                 IList<IAce> removeAces);

-        IObjectId CreatePolicy(IDictionary<string, string> properties, IObjectId folderId);

-        IObjectId CreateRelationship(IDictionary<string, string> properties, IList<IPolicy> policies, IList<IAce> addAces,

+        IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId);

+        IObjectId CreateRelationship(IDictionary<string, object> properties, IList<IPolicy> policies, IList<IAce> addAces,

                 IList<IAce> removeAces);

-        IObjectId CreateRelationship(IDictionary<string, string> properties);

+        IObjectId CreateRelationship(IDictionary<string, object> properties);

 

-        IItemIterable<IRelationship> GetRelationships(IObjectId objectId, bool includeSubRelationshipTypes,

+        IItemEnumerable<IRelationship> GetRelationships(IObjectId objectId, bool includeSubRelationshipTypes,

                 RelationshipDirection? relationshipDirection, IObjectType type, IOperationContext context);

 

         // permissions

@@ -169,7 +169,7 @@
     public interface ITree<T>

     {

         T Item { get; }

-        IList<ITree<T>> GetChildren();

+        IList<ITree<T>> Children { get; }

     }

 

     public interface IObjectType : ITypeDefinition

@@ -177,7 +177,7 @@
         bool IsBaseType { get; }

         IObjectType GetBaseType();

         IObjectType GetParentType();

-        IItemIterable<IObjectType> GetChildren();

+        IItemEnumerable<IObjectType> GetChildren();

         IList<ITree<IObjectType>> GetDescendants(int depth);

     }

 

@@ -201,11 +201,11 @@
     {

     }

 

-    public interface IItemIterable<T>

+    public interface IItemEnumerable<T> : IEnumerable<T>

     {

-        IItemIterable<T> SkipTo(long position);

-        IItemIterable<T> GetPage();

-        IItemIterable<T> GetPage(int maxNumItems);

+        IItemEnumerable<T> SkipTo(long position);

+        IItemEnumerable<T> GetPage();

+        IItemEnumerable<T> GetPage(int maxNumItems);

         long PageNumItems { get; }

         bool HasMoreItems { get; }

         long TotalNumItems { get; }

@@ -369,13 +369,13 @@
         IList<ITree<IFileableCmisObject>> GetFolderTree(int depth, IOperationContext context);

         IList<ITree<IFileableCmisObject>> GetDescendants(int depth);

         IList<ITree<IFileableCmisObject>> GetDescendants(int depth, IOperationContext context);

-        IItemIterable<ICmisObject> GetChildren();

-        IItemIterable<ICmisObject> GetChildren(IOperationContext context);

+        IItemEnumerable<ICmisObject> GetChildren();

+        IItemEnumerable<ICmisObject> GetChildren(IOperationContext context);

         bool IsRootFolder { get; }

         IFolder FolderParent { get; }

         string Path { get; }

-        IItemIterable<IDocument> GetCheckedOutDocs();

-        IItemIterable<IDocument> GetCheckedOutDocs(IOperationContext context);

+        IItemEnumerable<IDocument> GetCheckedOutDocs();

+        IItemEnumerable<IDocument> GetCheckedOutDocs(IOperationContext context);

     }

 

     public interface IPolicyProperties

diff --git a/DotCMIS/client/client-types.cs b/DotCMIS/client/client-types.cs
index c559981..3b4a93a 100644
--- a/DotCMIS/client/client-types.cs
+++ b/DotCMIS/client/client-types.cs
@@ -25,6 +25,9 @@
 

 namespace DotCMIS.Client

 {

+    /// <summary>

+    /// Helper for all type implementations.

+    /// </summary>

     internal class ObjectTypeHelper

     {

         private ISession session;

@@ -62,7 +65,7 @@
             return parentType;

         }

 

-        public IItemIterable<IObjectType> GetChildren()

+        public IItemEnumerable<IObjectType> GetChildren()

         {

             return session.GetTypeChildren(objectType.Id, true);

         }

@@ -73,6 +76,9 @@
         }

     }

 

+    /// <summary>

+    /// Document type implementation.

+    /// </summary>

     public class DocumentType : DocumentTypeDefinition, IDocumentType

     {

         private ObjectTypeHelper helper;

@@ -87,7 +93,7 @@
 

         public IObjectType GetBaseType() { return helper.GetBaseType(); }

 

-        public IItemIterable<IObjectType> GetChildren() { return helper.GetChildren(); }

+        public IItemEnumerable<IObjectType> GetChildren() { return helper.GetChildren(); }

 

         public IList<ITree<IObjectType>> GetDescendants(int depth) { return helper.GetDescendants(depth); }

 

@@ -96,6 +102,9 @@
         public bool IsBaseType { get { return helper.IsBaseType; } }

     }

 

+    /// <summary>

+    /// Folder type implementation.

+    /// </summary>

     public class FolderType : FolderTypeDefinition, IFolderType

     {

         private ObjectTypeHelper helper;

@@ -108,7 +117,7 @@
 

         public IObjectType GetBaseType() { return helper.GetBaseType(); }

 

-        public IItemIterable<IObjectType> GetChildren() { return helper.GetChildren(); }

+        public IItemEnumerable<IObjectType> GetChildren() { return helper.GetChildren(); }

 

         public IList<ITree<IObjectType>> GetDescendants(int depth) { return helper.GetDescendants(depth); }

 

@@ -117,6 +126,9 @@
         public bool IsBaseType { get { return helper.IsBaseType; } }

     }

 

+    /// <summary>

+    /// Relationship type implementation.

+    /// </summary>

     public class RelationshipType : RelationshipTypeDefinition, IRelationshipType

     {

         private ObjectTypeHelper helper;

@@ -131,7 +143,7 @@
 

         public IObjectType GetBaseType() { return helper.GetBaseType(); }

 

-        public IItemIterable<IObjectType> GetChildren() { return helper.GetChildren(); }

+        public IItemEnumerable<IObjectType> GetChildren() { return helper.GetChildren(); }

 

         public IList<ITree<IObjectType>> GetDescendants(int depth) { return helper.GetDescendants(depth); }

 

@@ -182,6 +194,9 @@
         }

     }

 

+    /// <summary>

+    /// Policy type implementation.

+    /// </summary>

     public class PolicyType : PolicyTypeDefinition, IPolicyType

     {

         private ObjectTypeHelper helper;

@@ -194,7 +209,7 @@
 

         public IObjectType GetBaseType() { return helper.GetBaseType(); }

 

-        public IItemIterable<IObjectType> GetChildren() { return helper.GetChildren(); }

+        public IItemEnumerable<IObjectType> GetChildren() { return helper.GetChildren(); }

 

         public IList<ITree<IObjectType>> GetDescendants(int depth) { return helper.GetDescendants(depth); }

 

diff --git a/DotCMIS/client/client-utils.cs b/DotCMIS/client/client-utils.cs
new file mode 100644
index 0000000..d9a229c
--- /dev/null
+++ b/DotCMIS/client/client-utils.cs
@@ -0,0 +1,682 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ * http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+using System;

+using System.Collections.Generic;

+using System.Linq;

+using System.Text;

+using DotCMIS.Enums;

+using System.Collections;

+

+namespace DotCMIS.Client

+{

+    /// <summary>

+    /// Operation context implementation.

+    /// </summary>

+    public class OperationContext : IOperationContext

+    {

+        public const string PropertiesStar = "*";

+        public const string RenditionNone = "cmis:none";

+

+        private HashSet<string> filter;

+        private bool includeAllowableActions;

+        private bool includeAcls;

+        private IncludeRelationshipsFlag? includeRelationships;

+        private bool includePolicies;

+        private HashSet<string> renditionFilter;

+        private bool includePathSegments;

+        private string orderBy;

+        private bool cacheEnabled;

+        private string cacheKey;

+        private int maxItemsPerPage;

+

+        public OperationContext()

+        {

+            filter = null;

+            includeAcls = false;

+            includeAllowableActions = true;

+            includePolicies = false;

+            includeRelationships = IncludeRelationshipsFlag.None;

+            renditionFilter = null;

+            includePathSegments = true;

+            orderBy = null;

+            cacheEnabled = false;

+            maxItemsPerPage = 100;

+

+            GenerateCacheKey();

+        }

+

+        public OperationContext(IOperationContext source)

+        {

+            filter = new HashSet<string>(source.Filter);

+            includeAcls = source.IncludeAcls;

+            includeAllowableActions = source.IncludeAllowableActions;

+            includePolicies = source.IncludePolicies;

+            includeRelationships = source.IncludeRelationships;

+            renditionFilter = new HashSet<string>(source.RenditionFilter);

+            includePathSegments = source.IncludePathSegments;

+            orderBy = source.OrderBy;

+            cacheEnabled = source.CacheEnabled;

+            maxItemsPerPage = source.MaxItemsPerPage;

+

+            GenerateCacheKey();

+        }

+

+        public OperationContext(HashSet<string> filter, bool includeAcls, bool includeAllowableActions,

+            bool includePolicies, IncludeRelationshipsFlag includeRelationships, HashSet<string> renditionFilter,

+            bool includePathSegments, String orderBy, bool cacheEnabled, int maxItemsPerPage)

+        {

+            this.filter = filter;

+            this.includeAcls = includeAcls;

+            this.includeAllowableActions = includeAllowableActions;

+            this.includePolicies = includePolicies;

+            this.includeRelationships = includeRelationships;

+            this.renditionFilter = renditionFilter;

+            this.includePathSegments = includePathSegments;

+            this.orderBy = orderBy;

+            this.cacheEnabled = cacheEnabled;

+            this.maxItemsPerPage = maxItemsPerPage;

+

+            GenerateCacheKey();

+        }

+

+        public HashSet<string> Filter

+        {

+            get { return new HashSet<string>(filter); }

+            set

+            {

+                if (value != null)

+                {

+                    HashSet<string> tempSet = new HashSet<string>();

+                    foreach (string oid in value)

+                    {

+                        if (oid == null) { continue; }

+

+                        string toid = oid.Trim();

+                        if (toid.Length == 0) { continue; }

+                        if (toid == PropertiesStar)

+                        {

+                            tempSet = new HashSet<string>();

+                            tempSet.Add(PropertiesStar);

+                            break;

+                        }

+                        if (toid.IndexOf(',') > -1)

+                        {

+                            throw new ArgumentException("Query id must not contain a comma!");

+                        }

+

+                        tempSet.Add(toid);

+                    }

+

+                    if (tempSet.Count == 0) { filter = null; }

+                    else { filter = tempSet; }

+                }

+                else

+                {

+                    filter = null;

+                }

+

+                GenerateCacheKey();

+            }

+        }

+

+        public string FilterString

+        {

+            get

+            {

+                if (filter == null) { return null; }

+

+                if (filter.Contains(PropertiesStar))

+                {

+                    return PropertiesStar;

+                }

+

+                this.filter.Add(PropertyIds.ObjectId);

+                this.filter.Add(PropertyIds.BaseTypeId);

+                this.filter.Add(PropertyIds.ObjectTypeId);

+

+                StringBuilder sb = new StringBuilder();

+

+                foreach (String oid in filter)

+                {

+                    if (sb.Length > 0) { sb.Append(','); }

+                    sb.Append(oid);

+                }

+

+                return sb.ToString();

+            }

+

+            set

+            {

+                if (value == null || value.Trim().Length == 0)

+                {

+                    Filter = null;

+                    return;

+                }

+

+                string[] ids = value.Split(',');

+                HashSet<string> tempSet = new HashSet<string>();

+                foreach (string qid in ids)

+                {

+                    tempSet.Add(qid);

+                }

+

+                Filter = tempSet;

+            }

+        }

+

+        public bool IncludeAllowableActions

+        {

+            get { return includeAllowableActions; }

+            set { includeAllowableActions = value; GenerateCacheKey(); }

+        }

+

+        public bool IncludeAcls

+        {

+            get { return includeAcls; }

+            set { includeAcls = value; GenerateCacheKey(); }

+        }

+

+        public IncludeRelationshipsFlag? IncludeRelationships

+        {

+            get { return includeRelationships; }

+            set { includeRelationships = value; GenerateCacheKey(); }

+        }

+

+        public bool IncludePolicies

+        {

+            get { return includePolicies; }

+            set { includePolicies = value; GenerateCacheKey(); }

+        }

+

+        public HashSet<string> RenditionFilter

+        {

+            get { return new HashSet<string>(renditionFilter); }

+            set

+            {

+                HashSet<string> tempSet = new HashSet<string>();

+                if (value != null)

+                {

+                    foreach (String rf in value)

+                    {

+                        if (rf == null) { continue; }

+

+                        String trf = rf.Trim();

+                        if (trf.Length == 0) { continue; }

+                        if (trf.IndexOf(',') > -1)

+                        {

+                            throw new ArgumentException("Rendition must not contain a comma!");

+                        }

+

+                        tempSet.Add(trf);

+                    }

+

+                    if (tempSet.Count == 0)

+                    {

+                        tempSet.Add(RenditionNone);

+                    }

+                }

+                else

+                {

+                    tempSet.Add(RenditionNone);

+                }

+

+                renditionFilter = tempSet;

+

+                GenerateCacheKey();

+            }

+        }

+

+        public string RenditionFilterString

+        {

+            get

+            {

+                if (renditionFilter == null) { return null; }

+

+                StringBuilder sb = new StringBuilder();

+                foreach (string rf in renditionFilter)

+                {

+                    if (sb.Length > 0) { sb.Append(','); }

+                    sb.Append(rf);

+                }

+

+                return sb.ToString();

+            }

+

+            set

+            {

+                if (value == null || value.Trim().Length == 0)

+                {

+                    RenditionFilter = null;

+                    return;

+                }

+

+                string[] renditions = value.Split(',');

+                HashSet<string> tempSet = new HashSet<string>();

+                foreach (string rend in renditions)

+                {

+                    tempSet.Add(rend);

+                }

+

+                RenditionFilter = tempSet;

+            }

+        }

+

+        public bool IncludePathSegments

+        {

+            get { return includePathSegments; }

+            set { includePathSegments = value; GenerateCacheKey(); }

+        }

+

+        public string OrderBy

+        {

+            get { return orderBy; }

+            set { orderBy = value; GenerateCacheKey(); }

+        }

+

+        public bool CacheEnabled

+        {

+            get { return cacheEnabled; }

+            set { cacheEnabled = value; GenerateCacheKey(); }

+        }

+

+        public string CacheKey

+        {

+            get { return cacheKey; }

+        }

+

+        public int MaxItemsPerPage

+        {

+            get { return maxItemsPerPage; }

+            set { maxItemsPerPage = value; }

+        }

+

+        protected void GenerateCacheKey()

+        {

+            if (!cacheEnabled)

+            {

+                cacheKey = null;

+            }

+

+            StringBuilder sb = new StringBuilder();

+

+            sb.Append(includeAcls ? "1" : "0");

+            sb.Append(includeAllowableActions ? "1" : "0");

+            sb.Append(includePolicies ? "1" : "0");

+            sb.Append("|");

+            sb.Append(filter == null ? "" : FilterString);

+            sb.Append("|");

+            sb.Append(includeRelationships == null ? "" : includeRelationships.GetCmisValue());

+

+            sb.Append("|");

+            sb.Append(renditionFilter == null ? "" : RenditionFilterString);

+

+            cacheKey = sb.ToString();

+        }

+    }

+

+    /// <summary>

+    /// Object id implementation.

+    /// </summary>

+    public class ObjectId : IObjectId

+    {

+        private string id;

+        public string Id

+        {

+            get { return id; }

+            set

+            {

+                if (value == null || value.Length == 0)

+                {

+                    throw new ArgumentException("Id must be set!");

+                }

+

+                id = value;

+            }

+        }

+

+        public ObjectId(string id)

+        {

+            Id = id;

+        }

+    }

+

+    /// <summary>

+    /// Tree implementation.

+    /// </summary>

+    public class Tree<T> : ITree<T>

+    {

+        public T Item { get; set; }

+        public IList<ITree<T>> Children { get; set; }

+    }

+

+    /// <summary>

+    /// Base class for IItemEnumerable's.

+    /// </summary>

+    public abstract class AbstractEnumerable<T> : IItemEnumerable<T>

+    {

+        private AbstractEnumerator<T> enumerator;

+        protected AbstractEnumerator<T> Enumerator

+        {

+            get

+            {

+                if (enumerator == null) { enumerator = CreateEnumerator(); }

+                return enumerator;

+            }

+        }

+

+        protected PageFetcher<T> PageFetcher { get; set; }

+        protected long SkipCount { get; private set; }

+

+        public AbstractEnumerable(PageFetcher<T> pageFetcher) :

+            this(0, pageFetcher) { }

+

+        protected AbstractEnumerable(long position, PageFetcher<T> pageFetcher)

+        {

+            this.PageFetcher = pageFetcher;

+            this.SkipCount = position;

+        }

+

+        protected abstract AbstractEnumerator<T> CreateEnumerator();

+

+        IEnumerator<T> IEnumerable<T>.GetEnumerator()

+        {

+            return Enumerator;

+        }

+

+        IEnumerator IEnumerable.GetEnumerator()

+        {

+            return Enumerator;

+        }

+

+        public IItemEnumerable<T> SkipTo(long position)

+        {

+            return new CollectionEnumerable<T>(position, PageFetcher);

+        }

+

+        public IItemEnumerable<T> GetPage()

+        {

+            return new CollectionPageEnumerable<T>(SkipCount, PageFetcher);

+        }

+

+        public IItemEnumerable<T> GetPage(int maxNumItems)

+        {

+            PageFetcher.MaxNumItems = maxNumItems;

+            return new CollectionPageEnumerable<T>(SkipCount, PageFetcher);

+        }

+

+        public long PageNumItems { get { return Enumerator.PageNumItems; } }

+

+        public bool HasMoreItems { get { return Enumerator.HasMoreItems; } }

+

+        public long TotalNumItems { get { return Enumerator.TotalNumItems; } }

+    }

+

+    /// <summary>

+    /// Abstract Enumerator implementation.

+    /// </summary>

+    public abstract class AbstractEnumerator<T> : IEnumerator<T>

+    {

+        private PageFetcher<T> pageFetcher;

+        private PageFetcher<T>.Page<T> page = null;

+        private long? totalNumItems = null;

+        private bool? hasMoreItems = null;

+

+        protected T current;

+

+        public AbstractEnumerator(long skipCount, PageFetcher<T> pageFetcher)

+        {

+            this.SkipCount = skipCount;

+            this.pageFetcher = pageFetcher;

+        }

+

+        T IEnumerator<T>.Current { get { return current; } }

+        object IEnumerator.Current { get { return current; } }

+

+        public void Reset()

+        {

+            throw new NotSupportedException();

+        }

+

+        public abstract bool MoveNext();

+

+        public void Dispose() { }

+

+        public long SkipCount { get; protected set; }

+

+        public int SkipOffset { get; protected set; }

+

+        public long Position { get { return SkipCount + SkipOffset; } }

+

+        public long PageNumItems

+        {

+            get

+            {

+                PageFetcher<T>.Page<T> page = GetCurrentPage();

+                if (page != null)

+                {

+                    IList<T> items = page.Items;

+                    if (items != null)

+                    {

+                        return items.Count;

+                    }

+                }

+                return 0;

+            }

+        }

+

+        public long TotalNumItems

+        {

+            get

+            {

+                if (totalNumItems == null)

+                {

+                    totalNumItems = -1;

+                    PageFetcher<T>.Page<T> page = GetCurrentPage();

+                    if (page != null)

+                    {

+                        totalNumItems = page.TotalNumItems;

+                    }

+                }

+                return (long)totalNumItems;

+            }

+        }

+

+        public bool HasMoreItems

+        {

+            get

+            {

+                if (hasMoreItems == null)

+                {

+                    hasMoreItems = false;

+                    PageFetcher<T>.Page<T> page = GetCurrentPage();

+                    if (page != null)

+                    {

+                        if (page.HasMoreItems.HasValue)

+                        {

+                            hasMoreItems = page.HasMoreItems;

+                        }

+                    }

+                }

+                return (bool)hasMoreItems;

+            }

+        }

+

+        protected int IncrementSkipOffset()

+        {

+            return SkipOffset++;

+        }

+

+        protected PageFetcher<T>.Page<T> GetCurrentPage()

+        {

+            if (page == null)

+            {

+                page = pageFetcher.FetchNextPage(SkipCount);

+            }

+            return page;

+        }

+

+        protected PageFetcher<T>.Page<T> IncrementPage()

+        {

+            SkipCount += SkipOffset;

+            SkipOffset = 0;

+            totalNumItems = null;

+            hasMoreItems = null;

+            page = pageFetcher.FetchNextPage(SkipCount);

+            return page;

+        }

+    }

+

+    /// <summary>

+    /// Page fetcher.

+    /// </summary>

+    public class PageFetcher<T>

+    {

+        public delegate Page<T> FetchPage(long maxNumItems, long skipCount);

+

+        private FetchPage fetchPageDelegate;

+

+        public PageFetcher(long maxNumItems, FetchPage fetchPageDelegate)

+        {

+            MaxNumItems = maxNumItems;

+            this.fetchPageDelegate = fetchPageDelegate;

+        }

+

+        public long MaxNumItems { get; set; }

+

+        public Page<T> FetchNextPage(long skipCount)

+        {

+            return fetchPageDelegate(MaxNumItems, skipCount);

+        }

+

+        public class Page<P>

+        {

+            public Page(IList<P> items, long? totalNumItems, bool? hasMoreItems)

+            {

+                Items = items;

+                TotalNumItems = totalNumItems;

+                HasMoreItems = hasMoreItems;

+            }

+

+            public IList<P> Items { get; private set; }

+            public long? TotalNumItems { get; private set; }

+            public bool? HasMoreItems { get; private set; }

+        }

+    }

+

+    /// <summary>

+    /// CMIS Collection Enumerable.

+    /// </summary>

+    public class CollectionEnumerable<T> : AbstractEnumerable<T>

+    {

+        public CollectionEnumerable(PageFetcher<T> pageFetcher) :

+            this(0, pageFetcher) { }

+

+        public CollectionEnumerable(long position, PageFetcher<T> pageFetcher) :

+            base(position, pageFetcher) { }

+

+        protected override AbstractEnumerator<T> CreateEnumerator()

+        {

+            return new CollectionEnumerator<T>(SkipCount, PageFetcher);

+        }

+    }

+

+    /// <summary>

+    /// Enumerator for iterating over all items in a CMIS Collection.

+    /// </summary>

+    public class CollectionEnumerator<T> : AbstractEnumerator<T>

+    {

+        public CollectionEnumerator(long skipCount, PageFetcher<T> pageFetcher) :

+            base(skipCount, pageFetcher) { }

+

+        public override bool MoveNext()

+        {

+            PageFetcher<T>.Page<T> page = GetCurrentPage();

+            if (page == null)

+            {

+                return false;

+            }

+

+            IList<T> items = page.Items;

+            if (items == null || items.Count == 0)

+            {

+                return false;

+            }

+

+            if (SkipOffset == items.Count)

+            {

+                page = IncrementPage();

+                items = page == null ? null : page.Items;

+            }

+

+            if (items == null || items.Count == 0 || SkipOffset == items.Count)

+            {

+                return false;

+            }

+

+            current = items[IncrementSkipOffset()];

+

+            return true;

+        }

+    }

+

+    /// <summary>

+    /// Enumerable for a CMIS Collection Page.

+    /// </summary>

+    public class CollectionPageEnumerable<T> : AbstractEnumerable<T>

+    {

+        public CollectionPageEnumerable(PageFetcher<T> pageFetcher) :

+            this(0, pageFetcher) { }

+

+        public CollectionPageEnumerable(long position, PageFetcher<T> pageFetcher) :

+            base(position, pageFetcher) { }

+

+        protected override AbstractEnumerator<T> CreateEnumerator()

+        {

+            return new CollectionPageEnumerator<T>(SkipCount, PageFetcher);

+        }

+    }

+

+    /// <summary>

+    /// Enumerator for iterating over a page of items in a CMIS Collection.

+    /// </summary>

+    public class CollectionPageEnumerator<T> : AbstractEnumerator<T>

+    {

+        public CollectionPageEnumerator(long skipCount, PageFetcher<T> pageFetcher) :

+            base(skipCount, pageFetcher) { }

+

+        public override bool MoveNext()

+        {

+            PageFetcher<T>.Page<T> page = GetCurrentPage();

+            if (page == null)

+            {

+                return false;

+            }

+

+            IList<T> items = page.Items;

+            if (items == null || items.Count == 0 || SkipOffset == items.Count)

+            {

+                return false;

+            }

+

+            current = items[IncrementSkipOffset()];

+

+            return true;

+        }

+    }

+}

diff --git a/DotCMISUnitTest/DotCMISUnitTest.csproj b/DotCMISUnitTest/DotCMISUnitTest.csproj
index 10d10cc..5e12df9 100644
--- a/DotCMISUnitTest/DotCMISUnitTest.csproj
+++ b/DotCMISUnitTest/DotCMISUnitTest.csproj
@@ -44,7 +44,9 @@
   </ItemGroup>

   <ItemGroup>

     <Compile Include="CRUDTest.cs" />

+    <Compile Include="EnumeratorTest.cs" />

     <Compile Include="Properties\AssemblyInfo.cs" />

+    <Compile Include="SmokeTest.cs" />

     <Compile Include="TestFramework.cs" />

     <Compile Include="TypeTest.cs" />

   </ItemGroup>

diff --git a/DotCMISUnitTest/DotCMISUnitTest.csproj.user b/DotCMISUnitTest/DotCMISUnitTest.csproj.user
index c7b83a2..9029fec 100644
--- a/DotCMISUnitTest/DotCMISUnitTest.csproj.user
+++ b/DotCMISUnitTest/DotCMISUnitTest.csproj.user
@@ -3,7 +3,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">

     <StartAction>Program</StartAction>

     <StartProgram>C:\Program Files (x86)\NUnit 2.5.9\bin\net-2.0\nunit-console.exe</StartProgram>

-    <StartArguments>C:\projects\opencmis\DotCMIS\DotCMISUnitTest\bin\Debug\DotCMISUnitTest.dll</StartArguments>

-    <StartWorkingDirectory>C:\projects\opencmis\DotCMIS\DotCMISUnitTest\bin\Debug</StartWorkingDirectory>

+    <StartArguments>C:\projects\chemistry\dotcmis\trunk\DotCMISUnitTest\bin\Debug\DotCMISUnitTest.dll</StartArguments>

+    <StartWorkingDirectory>C:\projects\chemistry\dotcmis\trunk\DotCMISUnitTest\bin\Debug\</StartWorkingDirectory>

   </PropertyGroup>

 </Project>
\ No newline at end of file
diff --git a/DotCMISUnitTest/EnumeratorTest.cs b/DotCMISUnitTest/EnumeratorTest.cs
new file mode 100644
index 0000000..bd6a750
--- /dev/null
+++ b/DotCMISUnitTest/EnumeratorTest.cs
@@ -0,0 +1,133 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ * http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+using System.Collections.Generic;

+using DotCMIS.Client;

+using NUnit.Framework;

+

+namespace DotCMISUnitTest

+{

+    [TestFixture]

+    class EnumeratorTest

+    {

+        private const int PageSize = 12;

+

+        private IList<int> source;

+        private IItemEnumerable<int> testEnumerable;

+

+        [SetUp]

+        public void Init()

+        {

+            source = new List<int>();

+            for (int i = 0; i < 100; i++)

+            {

+                source.Add(i);

+            }

+

+            PageFetcher<int>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)

+            {

+                IList<int> page = new List<int>();

+

+                for (int i = (int)skipCount; i < skipCount + maxNumItems; i++)

+                {

+                    if (source.Count <= i) { break; }

+                    page.Add(source[i]);

+                }

+

+                return new PageFetcher<int>.Page<int>(page, source.Count, skipCount + maxNumItems < source.Count);

+            };

+

+            testEnumerable = new CollectionEnumerable<int>(new PageFetcher<int>(PageSize, fetchPageDelegate));

+        }

+

+        [Test]

+        public void TestIteration()

+        {

+            Assert.AreEqual(source.Count, testEnumerable.TotalNumItems);

+            Assert.AreEqual(PageSize, testEnumerable.PageNumItems);

+

+            int i = 0;

+            foreach (int x in testEnumerable)

+            {

+                Assert.AreEqual(i, x);

+                i++;

+            }

+        }

+

+        [Test]

+        public void TestSkip()

+        {

+            int i = 42;

+            foreach (int x in testEnumerable.SkipTo(42))

+            {

+                Assert.AreEqual(i, x);

+                i++;

+            }

+

+            Assert.AreEqual(source.Count, i);

+        }

+

+        [Test]

+        public void TestOverSkip()

+        {

+            foreach (int x in testEnumerable.SkipTo(source.Count + 1))

+            {

+                Assert.Fail();

+            }

+        }

+

+        [Test]

+        public void TestPage()

+        {

+            int i = 0;

+            foreach (int x in testEnumerable.GetPage(8))

+            {

+                Assert.AreEqual(i, x);

+                i++;

+            }

+

+            Assert.AreEqual(8, i);

+        }

+

+        [Test]

+        public void TestBigPage()

+        {

+            int i = 0;

+            foreach (int x in testEnumerable.GetPage(source.Count * 2))

+            {

+                Assert.AreEqual(i, x);

+                i++;

+            }

+

+            Assert.AreEqual(source.Count, i);

+        }

+

+        [Test]

+        public void TestSkipAndPage()

+        {

+            int i = 42;

+            foreach (int x in testEnumerable.SkipTo(42).GetPage(20))

+            {

+                Assert.AreEqual(i, x);

+                i++;

+            }

+

+            Assert.AreEqual(62, i);

+        }

+    }

+}

diff --git a/DotCMISUnitTest/SmokeTest.cs b/DotCMISUnitTest/SmokeTest.cs
new file mode 100644
index 0000000..9b26d8f
--- /dev/null
+++ b/DotCMISUnitTest/SmokeTest.cs
@@ -0,0 +1,129 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ * http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+using System;

+using System.Collections.Generic;

+using System.Linq;

+using System.Text;

+using NUnit.Framework;

+using DotCMIS.Client;

+using DotCMIS.Enums;

+

+namespace DotCMISUnitTest

+{

+    [TestFixture]

+    class SmokeTest : TestFramework

+    {

+        [Test]

+        public void TestSession()

+        {

+            Assert.NotNull(Session);

+            Assert.NotNull(Session.Binding);

+            Assert.NotNull(Session.RepositoryInfo);

+            Assert.NotNull(Session.RepositoryInfo.Id);

+            Assert.NotNull(Session.RepositoryInfo.RootFolderId);

+            Assert.NotNull(Session.DefaultContext);

+            Assert.NotNull(Session.ObjectFactory);

+

+            Assert.AreEqual("test", Session.CreateObjectId("test").Id);

+        }

+

+        [Test]

+        public void SmokeTestTypes()

+        {

+            // getTypeDefinition

+            IObjectType documentType = Session.GetTypeDefinition("cmis:document");

+            Assert.NotNull(documentType);

+            Assert.True(documentType is DocumentType);

+            Assert.AreEqual("cmis:document", documentType.Id);

+            Assert.AreEqual(BaseTypeId.CmisDocument, documentType.BaseTypeId);

+            Assert.True(documentType.IsBaseType);

+            Assert.Null(documentType.ParentTypeId);

+            Assert.NotNull(documentType.PropertyDefintions);

+            Assert.True(documentType.PropertyDefintions.Count >= 9);

+

+            IObjectType folderType = Session.GetTypeDefinition("cmis:folder");

+            Assert.NotNull(folderType);

+            Assert.True(folderType is FolderType);

+            Assert.AreEqual("cmis:folder", folderType.Id);

+            Assert.AreEqual(BaseTypeId.CmisFolder, folderType.BaseTypeId);

+            Assert.True(folderType.IsBaseType);

+            Assert.Null(folderType.ParentTypeId);

+            Assert.NotNull(folderType.PropertyDefintions);

+            Assert.True(folderType.PropertyDefintions.Count >= 9);

+

+            // getTypeChildren

+            Session.Clear();

+

+            IItemEnumerable<IObjectType> children = Session.GetTypeChildren(null, true);

+            Assert.NotNull(children);

+

+            int count;

+            count = 0;

+            foreach (IObjectType type in children)

+            {

+                Assert.NotNull(type);

+                Assert.NotNull(type.Id);

+                Assert.True(type.IsBaseType);

+                Assert.Null(type.ParentTypeId);

+                Assert.NotNull(type.PropertyDefintions);

+

+                Session.Clear();

+                IObjectType type2 = Session.GetTypeDefinition(type.Id);

+                AssertAreEqual(type, type2);

+

+                Session.GetTypeChildren(type.Id, true);

+

+                count++;

+            }

+

+            Assert.True(count >= 2);

+            Assert.True(count <= 4);

+

+            // getTypeDescendants

+            Session.Clear();

+

+            IList<ITree<IObjectType>> descendants = Session.GetTypeDescendants(null, -1, true);

+

+            count = 0;

+            foreach (ITree<IObjectType> tree in descendants)

+            {

+                Assert.NotNull(tree);

+                Assert.NotNull(tree.Item);

+

+                IObjectType type = tree.Item;

+                Assert.NotNull(type);

+                Assert.NotNull(type.Id);

+                Assert.True(type.IsBaseType);

+                Assert.Null(type.ParentTypeId);

+                Assert.NotNull(type.PropertyDefintions);

+

+                Session.Clear();

+                IObjectType type2 = Session.GetTypeDefinition(type.Id);

+                AssertAreEqual(type, type2);

+

+                Session.GetTypeDescendants(type.Id, 2, true);

+

+                count++;

+            }

+

+            Assert.True(count >= 2);

+            Assert.True(count <= 4);

+        }

+    }

+}

diff --git a/DotCMISUnitTest/TestFramework.cs b/DotCMISUnitTest/TestFramework.cs
index bb8702b..9246e9d 100644
--- a/DotCMISUnitTest/TestFramework.cs
+++ b/DotCMISUnitTest/TestFramework.cs
@@ -26,6 +26,7 @@
 using DotCMIS.Enums;

 using DotCMIS.Exceptions;

 using NUnit.Framework;

+using DotCMIS.Client;

 

 namespace DotCMISUnitTest

 {

@@ -33,7 +34,8 @@
     {

         private IRepositoryInfo repositoryInfo;

 

-        public ICmisBinding Binding { get; set; }

+        public ISession Session { get; set; }

+        public ICmisBinding Binding { get { return Session.Binding; } }

         public IRepositoryInfo RepositoryInfo

         {

             get

@@ -59,51 +61,59 @@
             DefaultDocumentType = "cmis:document";

             DefaultFolderType = "cmis:folder";

 

-            Binding = ConnectAtomPub();

+            Session = ConnectAtomPub();

         }

 

-        public ICmisBinding ConnectAtomPub()

+        public ISession ConnectAtomPub()

         {

-            Dictionary<string, string> parametersAtom = new Dictionary<string, string>();

+            Dictionary<string, string> parameters = new Dictionary<string, string>();

 

-            string baseUrlAtom = "http://localhost:8080/alfresco/opencmis-atom";

+            string baseUrlAtom = "http://localhost:8080/alfresco/service/cmis";

 

-            parametersAtom[SessionParameter.AtomPubUrl] = baseUrlAtom;

-            parametersAtom[SessionParameter.User] = "admin";

-            parametersAtom[SessionParameter.Password] = "admin";

+            parameters[SessionParameter.BindingType] = BindingType.AtomPub;

+            parameters[SessionParameter.AtomPubUrl] = baseUrlAtom;

+            parameters[SessionParameter.User] = "admin";

+            parameters[SessionParameter.Password] = "admin";

 

-            CmisBindingFactory factory = CmisBindingFactory.NewInstance();

-            ICmisBinding binding = factory.CreateCmisAtomPubBinding(parametersAtom);

+            SessionFactory factory = SessionFactory.NewInstance();

+            ISession session = factory.GetRepositories(parameters)[0].CreateSession();

 

-            Assert.NotNull(binding);

+            Assert.NotNull(session);

+            Assert.NotNull(session.Binding);

+            Assert.NotNull(session.RepositoryInfo);

+            Assert.NotNull(session.RepositoryInfo.Id);

 

-            return binding;

+            return session;

         }

 

-        public ICmisBinding ConnectWebServices()

+        public ISession ConnectWebServices()

         {

-            Dictionary<string, string> parametersWS = new Dictionary<string, string>();

+            Dictionary<string, string> parameters = new Dictionary<string, string>();

 

-            string baseUrlWS = "https://localhost:8443/alfresco/opencmis-ws";

+            string baseUrlWS = "http://localhost:8080/alfresco/cmis";

 

-            parametersWS[SessionParameter.WebServicesRepositoryService] = baseUrlWS + "/RepositoryService?wsdl";

-            parametersWS[SessionParameter.WebServicesAclService] = baseUrlWS + "/AclService?wsdl";

-            parametersWS[SessionParameter.WebServicesDiscoveryService] = baseUrlWS + "/DiscoveryService?wsdl";

-            parametersWS[SessionParameter.WebServicesMultifilingService] = baseUrlWS + "/MultifilingService?wsdl";

-            parametersWS[SessionParameter.WebServicesNavigationService] = baseUrlWS + "/NavigationService?wsdl";

-            parametersWS[SessionParameter.WebServicesObjectService] = baseUrlWS + "/ObjectService?wsdl";

-            parametersWS[SessionParameter.WebServicesPolicyService] = baseUrlWS + "/PolicyService?wsdl";

-            parametersWS[SessionParameter.WebServicesRelationshipService] = baseUrlWS + "/RelationshipService?wsdl";

-            parametersWS[SessionParameter.WebServicesVersioningService] = baseUrlWS + "/VersioningService?wsdl";

-            parametersWS[SessionParameter.User] = "admin";

-            parametersWS[SessionParameter.Password] = "admin";

+            parameters[SessionParameter.BindingType] = BindingType.WebServices;

+            parameters[SessionParameter.WebServicesRepositoryService] = baseUrlWS + "/RepositoryService?wsdl";

+            parameters[SessionParameter.WebServicesAclService] = baseUrlWS + "/AclService?wsdl";

+            parameters[SessionParameter.WebServicesDiscoveryService] = baseUrlWS + "/DiscoveryService?wsdl";

+            parameters[SessionParameter.WebServicesMultifilingService] = baseUrlWS + "/MultifilingService?wsdl";

+            parameters[SessionParameter.WebServicesNavigationService] = baseUrlWS + "/NavigationService?wsdl";

+            parameters[SessionParameter.WebServicesObjectService] = baseUrlWS + "/ObjectService?wsdl";

+            parameters[SessionParameter.WebServicesPolicyService] = baseUrlWS + "/PolicyService?wsdl";

+            parameters[SessionParameter.WebServicesRelationshipService] = baseUrlWS + "/RelationshipService?wsdl";

+            parameters[SessionParameter.WebServicesVersioningService] = baseUrlWS + "/VersioningService?wsdl";

+            parameters[SessionParameter.User] = "admin";

+            parameters[SessionParameter.Password] = "admin";

 

-            CmisBindingFactory factory = CmisBindingFactory.NewInstance();

-            ICmisBinding binding = factory.CreateCmisWebServicesBinding(parametersWS);

+            SessionFactory factory = SessionFactory.NewInstance();

+            ISession session = factory.GetRepositories(parameters)[0].CreateSession();

 

-            Assert.NotNull(binding);

+            Assert.NotNull(session);

+            Assert.NotNull(session.Binding);

+            Assert.NotNull(session.RepositoryInfo);

+            Assert.NotNull(session.RepositoryInfo.Id);

 

-            return binding;

+            return session;

         }

 

         public IObjectData GetFullObject(string objectId)

@@ -311,5 +321,28 @@
 

             return result;

         }

+

+        // ---- asserts ----

+

+        public void AssertAreEqual(IObjectType expected, IObjectType actual)

+        {

+            if (expected == null && actual == null)

+            {

+                return;

+            }

+

+            Assert.NotNull(expected);

+            Assert.NotNull(actual);

+

+            Assert.AreEqual(expected.Id, actual.Id);

+            Assert.AreEqual(expected.IsBaseType, actual.IsBaseType);

+            Assert.AreEqual(expected.BaseTypeId, actual.BaseTypeId);

+            Assert.AreEqual(expected.DisplayName, actual.DisplayName);

+            Assert.AreEqual(expected.Description, actual.Description);

+            Assert.AreEqual(expected.LocalName, actual.LocalName);

+            Assert.AreEqual(expected.LocalNamespace, actual.LocalNamespace);

+            Assert.AreEqual(expected.QueryName, actual.QueryName);

+            Assert.AreEqual(expected.PropertyDefintions.Count, actual.PropertyDefintions.Count);

+        }

     }

 }