DotCMIS: session can be created with authentication provider instance (see CMIS-379)

git-svn-id: https://svn.apache.org/repos/asf/chemistry/dotcmis/trunk@1129229 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/DotCMIS/binding/binding-impl.cs b/DotCMIS/binding/binding-impl.cs
index cabaf63..3021a4b 100644
--- a/DotCMIS/binding/binding-impl.cs
+++ b/DotCMIS/binding/binding-impl.cs
@@ -35,6 +35,11 @@
         private BindingRepositoryService repositoryServiceWrapper;

 

         public CmisBinding(IDictionary<string, string> sessionParameters)

+            : this(sessionParameters, null)

+        {

+        }

+

+        public CmisBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)

         {

             if (sessionParameters == null)

             {

@@ -54,20 +59,28 @@
             }

 

             // set up authentication provider

-            string authenticationProviderClass;

-            if (sessionParameters.TryGetValue(SessionParameter.AuthenticationProviderClass, out authenticationProviderClass))

+            if (authenticationProvider == null)

             {

-                try

+                string authenticationProviderClass;

+                if (sessionParameters.TryGetValue(SessionParameter.AuthenticationProviderClass, out authenticationProviderClass))

                 {

-                    Type authProvType = Type.GetType(authenticationProviderClass);

-                    AbstractAuthenticationProvider authenticationProvider = (AbstractAuthenticationProvider)Activator.CreateInstance(authProvType);

-                    authenticationProvider.Session = session;

-                    session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);

+                    try

+                    {

+                        Type authProvType = Type.GetType(authenticationProviderClass);

+                        authenticationProvider = (AbstractAuthenticationProvider)Activator.CreateInstance(authProvType);

+                        authenticationProvider.Session = session;

+                        session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);

+                    }

+                    catch (Exception e)

+                    {

+                        throw new CmisRuntimeException("Could not load authentictaion provider: " + e.Message, e);

+                    }

                 }

-                catch (Exception e)

-                {

-                    throw new CmisRuntimeException("Could not load authentictaion provider: " + e.Message, e);

-                }

+            }

+            else

+            {

+                authenticationProvider.Session = session;

+                session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);

             }

 

             // initialize the SPI

diff --git a/DotCMIS/binding/binding-intf.cs b/DotCMIS/binding/binding-intf.cs
index 3318036..3819fc9 100644
--- a/DotCMIS/binding/binding-intf.cs
+++ b/DotCMIS/binding/binding-intf.cs
@@ -218,37 +218,43 @@
             }

         }

 

-        public ICmisBinding CreateCmisBinding(IDictionary<string, string> sessionParameters)

+        public ICmisBinding CreateCmisBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)

         {

             CheckSessionParameters(sessionParameters, true);

             AddDefaultParameters(sessionParameters);

 

-            return new CmisBinding(sessionParameters);

+            return new CmisBinding(sessionParameters, authenticationProvider);

         }

 

-        public ICmisBinding CreateCmisAtomPubBinding(IDictionary<string, string> sessionParameters)

+        public ICmisBinding CreateCmisAtomPubBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)

         {

             CheckSessionParameters(sessionParameters, false);

             sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiAtomPub;

-            if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))

+            if (authenticationProvider == null)

             {

-                sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;

+                if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))

+                {

+                    sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;

+                }

             }

 

             AddDefaultParameters(sessionParameters);

 

             Check(sessionParameters, SessionParameter.AtomPubUrl);

 

-            return new CmisBinding(sessionParameters);

+            return new CmisBinding(sessionParameters, authenticationProvider);

         }

 

-        public ICmisBinding CreateCmisWebServicesBinding(IDictionary<string, string> sessionParameters)

+        public ICmisBinding CreateCmisWebServicesBinding(IDictionary<string, string> sessionParameters, AbstractAuthenticationProvider authenticationProvider)

         {

             CheckSessionParameters(sessionParameters, false);

             sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiWebServices;

-            if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))

+            if (authenticationProvider == null)

             {

-                sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;

+                if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))

+                {

+                    sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;

+                }

             }

 

             AddDefaultParameters(sessionParameters);

@@ -263,7 +269,7 @@
             Check(sessionParameters, SessionParameter.WebServicesRepositoryService);

             Check(sessionParameters, SessionParameter.WebServicesVersioningService);

 

-            return new CmisBinding(sessionParameters);

+            return new CmisBinding(sessionParameters, authenticationProvider);

         }

 

         // ---- internals ----

diff --git a/DotCMIS/client/client-impl.cs b/DotCMIS/client/client-impl.cs
index e303bbc..cd0a89c 100644
--- a/DotCMIS/client/client-impl.cs
+++ b/DotCMIS/client/client-impl.cs
@@ -45,7 +45,12 @@
 

         public ISession CreateSession(IDictionary<string, string> parameters)

         {

-            Session session = new Session(parameters);

+            return CreateSession(parameters, null, null, null);

+        }

+

+        public ISession CreateSession(IDictionary<string, string> parameters, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)

+        {

+            Session session = new Session(parameters, objectFactory, authenticationProvider, cache);

             session.Connect();

 

             return session;

@@ -53,6 +58,11 @@
 

         public IList<IRepository> GetRepositories(IDictionary<string, string> parameters)

         {

+            return GetRepositories(parameters, null, null, null);

+        }

+

+        public IList<IRepository> GetRepositories(IDictionary<string, string> parameters, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)

+        {

             ICmisBinding binding = CmisBindingHelper.CreateBinding(parameters);

 

             IList<IRepositoryInfo> repositoryInfos = binding.GetRepositoryService().GetRepositoryInfos(null);

@@ -60,7 +70,7 @@
             IList<IRepository> result = new List<IRepository>();

             foreach (IRepositoryInfo data in repositoryInfos)

             {

-                result.Add(new Repository(data, parameters, this));

+                result.Add(new Repository(data, parameters, this, objectFactory, authenticationProvider, cache));

             }

 

             return result;

@@ -74,6 +84,11 @@
     {

         public static ICmisBinding CreateBinding(IDictionary<string, string> parameters)

         {

+            return CreateBinding(parameters, null);

+        }

+

+        public static ICmisBinding CreateBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)

+        {

             if (parameters == null)

             {

                 throw new ArgumentNullException("parameters");

@@ -88,36 +103,36 @@
             switch (bt)

             {

                 case BindingType.AtomPub:

-                    return CreateAtomPubBinding(parameters);

+                    return CreateAtomPubBinding(parameters, authenticationProvider);

                 case BindingType.WebServices:

-                    return CreateWebServiceBinding(parameters);

+                    return CreateWebServiceBinding(parameters, authenticationProvider);

                 case BindingType.Custom:

-                    return CreateCustomBinding(parameters);

+                    return CreateCustomBinding(parameters, authenticationProvider);

                 default:

                     throw new CmisRuntimeException("Ambiguous session parameter: " + parameters);

             }

         }

 

-        private static ICmisBinding CreateCustomBinding(IDictionary<string, string> parameters)

+        private static ICmisBinding CreateCustomBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)

         {

             CmisBindingFactory factory = CmisBindingFactory.NewInstance();

-            ICmisBinding binding = factory.CreateCmisBinding(parameters);

+            ICmisBinding binding = factory.CreateCmisBinding(parameters, authenticationProvider);

 

             return binding;

         }

 

-        private static ICmisBinding CreateWebServiceBinding(IDictionary<string, string> parameters)

+        private static ICmisBinding CreateWebServiceBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)

         {

             CmisBindingFactory factory = CmisBindingFactory.NewInstance();

-            ICmisBinding binding = factory.CreateCmisWebServicesBinding(parameters);

+            ICmisBinding binding = factory.CreateCmisWebServicesBinding(parameters, authenticationProvider);

 

             return binding;

         }

 

-        private static ICmisBinding CreateAtomPubBinding(IDictionary<string, string> parameters)

+        private static ICmisBinding CreateAtomPubBinding(IDictionary<string, string> parameters, AbstractAuthenticationProvider authenticationProvider)

         {

             CmisBindingFactory factory = CmisBindingFactory.NewInstance();

-            ICmisBinding binding = factory.CreateCmisAtomPubBinding(parameters);

+            ICmisBinding binding = factory.CreateCmisAtomPubBinding(parameters, authenticationProvider);

 

             return binding;

         }

@@ -129,20 +144,26 @@
     public class Repository : RepositoryInfo, IRepository

     {

         private IDictionary<string, string> parameters;

-        private ISessionFactory sessionFactory;

+        private SessionFactory sessionFactory;

+        private IObjectFactory objectFactory;

+        private AbstractAuthenticationProvider authenticationProvider;

+        private ICache cache;

 

-        public Repository(IRepositoryInfo info, IDictionary<string, string> parameters, ISessionFactory sessionFactory)

+        public Repository(IRepositoryInfo info, IDictionary<string, string> parameters, SessionFactory sessionFactory, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)

             : base(info)

         {

             this.parameters = new Dictionary<string, string>(parameters);

             this.parameters[SessionParameter.RepositoryId] = Id;

 

             this.sessionFactory = sessionFactory;

+            this.objectFactory = objectFactory;

+            this.authenticationProvider = authenticationProvider;

+            this.cache = cache;

         }

 

         public ISession CreateSession()

         {

-            return sessionFactory.CreateSession(parameters);

+            return sessionFactory.CreateSession(parameters, objectFactory, authenticationProvider, cache);

         }

     }

 

@@ -168,6 +189,7 @@
         public string RepositoryId { get { return RepositoryInfo.Id; } }

 

         public IObjectFactory ObjectFactory { get; protected set; }

+        protected AbstractAuthenticationProvider AuthenticationProvider { get; set; }

         protected ICache Cache { get; set; }

         protected bool cachePathOmit;

 

@@ -200,7 +222,7 @@
             }

         }

 

-        public Session(IDictionary<string, string> parameters)

+        public Session(IDictionary<string, string> parameters, IObjectFactory objectFactory, AbstractAuthenticationProvider authenticationProvider, ICache cache)

         {

             if (parameters == null)

             {

@@ -209,8 +231,9 @@
 

             this.parameters = parameters;

 

-            ObjectFactory = CreateObjectFactory();

-            Cache = CreateCache();

+            ObjectFactory = (objectFactory == null ? CreateObjectFactory() : objectFactory);

+            AuthenticationProvider = authenticationProvider;

+            Cache = (cache == null ? CreateCache() : cache);

 

             string cachePathOmitStr;

             if (parameters.TryGetValue(SessionParameter.CachePathOmit, out cachePathOmitStr))

@@ -228,7 +251,7 @@
             Lock();

             try

             {

-                Binding = CmisBindingHelper.CreateBinding(parameters);

+                Binding = CmisBindingHelper.CreateBinding(parameters, AuthenticationProvider);

 

                 string repositoryId;

                 if (!parameters.TryGetValue(SessionParameter.RepositoryId, out repositoryId))