* ActivationServices.cs: Added the method Activate that performs the forwards the
authorLluis Sanchez <lluis@novell.com>
Thu, 20 Mar 2003 20:31:27 +0000 (20:31 -0000)
committerLluis Sanchez <lluis@novell.com>
Thu, 20 Mar 2003 20:31:27 +0000 (20:31 -0000)
  creation message to the right message sink. Added support for AppDomainLevelActivator.
* ConstructionLevelActivator.cs: Activate does not use the object identity because
  it may not be set yet.
* ContextLevelActivator.cs: this activator is now always called for CBOs. A new context
  has to be created only if the construction message says so.
* AppDomainLevelActivator.cs: Added. Implements an IActivator that makes a remote creation.

svn path=/trunk/mcs/; revision=12713

mcs/class/corlib/System.Runtime.Remoting.Activation/ActivationServices.cs
mcs/class/corlib/System.Runtime.Remoting.Activation/AppDomainLevelActivator.cs [new file with mode: 0644]
mcs/class/corlib/System.Runtime.Remoting.Activation/ChangeLog
mcs/class/corlib/System.Runtime.Remoting.Activation/ConstructionLevelActivator.cs
mcs/class/corlib/System.Runtime.Remoting.Activation/ContextLevelActivator.cs

index 6c7a33380fe0de73ccfaa91b77e115c000df76cb..59da20bb9b8207983d8c36d5b4ab9e784c18e627 100644 (file)
@@ -5,31 +5,63 @@
 //
 // (C) 2002, Lluis Sanchez Gual
 //
-\r
-using System;\r
-using System.Runtime.Remoting.Messaging;\r
-using System.Runtime.Remoting.Activation;\r
-using System.Runtime.Remoting.Contexts;\r
-using System.Reflection;\r
+
+using System;
+using System.Threading;
+using System.Runtime.Remoting.Messaging;
+using System.Runtime.Remoting.Activation;
+using System.Runtime.Remoting.Contexts;
+using System.Runtime.Remoting.Proxies;
+using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Collections;
 using System.Runtime.Remoting.Channels;
-\r
-namespace System.Runtime.Remoting.Activation\r
-{\r
-       internal class ActivationServices\r
-       {\r
-               static IActivator _constructionActivator = new ConstructionLevelActivator ();\r
-\r
-               public static object CreateProxyFromAttributes (Type type, object[] activationAttributes)\r
-               {\r
-                       string activationUrl = null;\r
+
+namespace System.Runtime.Remoting.Activation
+{
+       internal class ActivationServices
+       {
+               static IActivator _constructionActivator = new ConstructionLevelActivator ();
+
+               public static IMessage Activate (RemotingProxy proxy, ConstructionCall ctorCall)
+               {
+                       IMessage response;
+
+                       if (Thread.CurrentContext.HasExitSinks && !ctorCall.IsContextOk)
+                               response = Thread.CurrentContext.GetClientContextSinkChain ().SyncProcessMessage (ctorCall);
+                       else
+                               response = RemoteActivate (ctorCall);
+
+                       if (response is IConstructionReturnMessage)
+                       {
+                               Identity identity = RemotingServices.GetMessageTargetIdentity (ctorCall);
+                               proxy.AttachIdentity (identity);
+                       }
+
+                       return response;
+               }
+
+               public static IMessage RemoteActivate (IConstructionCallMessage ctorCall)
+               {
+                       try \r
+                       {
+                               return ctorCall.Activator.Activate (ctorCall);
+                       }
+                       catch (Exception ex) \r
+                       {
+                               return new ReturnMessage (ex, ctorCall);
+                       }               \r
+               }
+
+               public static object CreateProxyFromAttributes (Type type, object[] activationAttributes)
+               {
+                       string activationUrl = null;
                        foreach (object attr in activationAttributes)
                        {
                                if (!(attr is IContextAttribute)) throw new RemotingException ("Activation attribute does not implement the IContextAttribute interface");
                                if (attr is UrlAttribute) activationUrl = ((UrlAttribute)attr).UrlValue;
                        }
-\r
+
                        if (activationUrl != null)
                                return RemotingServices.CreateClientProxy (type, activationUrl, activationAttributes);
 
@@ -41,14 +73,25 @@ namespace System.Runtime.Remoting.Activation
                                return RemotingServices.CreateClientProxyForContextBound (type, activationAttributes);
                        
                        return null;
-               }\r
-\r
+               }
+
                public static ConstructionCall CreateConstructionCall (Type type, string activationUrl, object[] activationAttributes)
                {
                        ConstructionCall ctorCall = new ConstructionCall (type);
-                       ctorCall.Activator = _constructionActivator;
 
-                       if (!type.IsContextful) return ctorCall;
+                       if (!type.IsContextful) 
+                       {
+                               // Must be a remote activated object
+                               ctorCall.Activator = new AppDomainLevelActivator (activationUrl, _constructionActivator);
+                               ctorCall.IsContextOk = false;   // It'll be activated in a remote context
+                               return ctorCall;
+                       }
+
+                       // It is a CBO. Need collect context properties and
+                       // check if a new context is needed.
+
+                       IActivator activatorChain = _constructionActivator;
+                       activatorChain = new ContextLevelActivator (activatorChain);
 
                        ArrayList attributes = new ArrayList ();
                        if (activationAttributes != null) attributes.AddRange (activationAttributes);
@@ -56,11 +99,11 @@ namespace System.Runtime.Remoting.Activation
                        bool isContextOk = (activationUrl == ChannelServices.CrossContextUrl);  // Remote CBOs are always created in a new context
                        Context currentContext = Threading.Thread.CurrentContext;
 
-                       if (isContextOk) \r
+                       if (isContextOk) 
                        {
-                               foreach (IContextAttribute attr in attributes) \r
+                               foreach (IContextAttribute attr in attributes) 
                                {
-                                       if (!attr.IsContextOK (currentContext, ctorCall)) \r
+                                       if (!attr.IsContextOK (currentContext, ctorCall)) 
                                        {
                                                isContextOk = false;
                                                break;
@@ -69,42 +112,47 @@ namespace System.Runtime.Remoting.Activation
                        }
 
                        object[] typeAttributes = type.GetCustomAttributes (true);
-                       foreach (object attr in typeAttributes) \r
+                       foreach (object attr in typeAttributes) 
                        {
-                               if (attr is IContextAttribute) \r
-                               {\r
-                                       isContextOk = isContextOk && ((IContextAttribute)attr).IsContextOK (currentContext, ctorCall);\r
+                               if (attr is IContextAttribute) 
+                               {
+                                       isContextOk = isContextOk && ((IContextAttribute)attr).IsContextOK (currentContext, ctorCall);
                                        attributes.Add (attr);
                                }
                        }
 
                        if (!isContextOk)
                        {
-                               // A new context is needed. Collect the context properties and set
+                               // A new context is needed. Collect the context properties and chain
                                // the context level activator.
 
                                ctorCall.SetActivationAttributes (attributes.ToArray());
-                               ctorCall.Activator = new ContextLevelActivator (ctorCall.Activator);
 
                                foreach (IContextAttribute attr in attributes)
                                        attr.GetPropertiesForNewContext (ctorCall);
                        }
 
+                       if (activationUrl != ChannelServices.CrossContextUrl)
+                               activatorChain = new AppDomainLevelActivator (activationUrl, activatorChain);
+                       
+                       ctorCall.Activator = activatorChain;
+                       ctorCall.IsContextOk = isContextOk;
+
                        return ctorCall;
-               }\r
-\r
-               public static IMessage CreateInstanceFromMessage (IConstructionCallMessage ctorCall)\r
-               {\r
-                       object obj = AllocateUninitializedClassInstance (ctorCall.ActivationType);\r
-                       ctorCall.MethodBase.Invoke (obj, ctorCall.Args);\r
-\r
+               }
+
+               public static IMessage CreateInstanceFromMessage (IConstructionCallMessage ctorCall)
+               {
+                       object obj = AllocateUninitializedClassInstance (ctorCall.ActivationType);
+                       ctorCall.MethodBase.Invoke (obj, ctorCall.Args);
+
                        ServerIdentity identity = (ServerIdentity) RemotingServices.GetMessageTargetIdentity (ctorCall);
 
                        identity.AttachServerObject ((MarshalByRefObject) obj, Threading.Thread.CurrentContext);
 
                        return new ConstructionResponse (obj, null, ctorCall);
-               }\r
-\r
+               }
+
                public static object CreateProxyForType (Type type)
                {
                        // Called by the runtime when creating an instance of a type
@@ -125,13 +173,13 @@ namespace System.Runtime.Remoting.Activation
                                return RemotingServices.CreateClientProxyForContextBound (type, null);
 
                        return null;
-               }\r
-\r
-               // Allocates an uninitialized instance. It never creates proxies.\r
+               }
+
+               // Allocates an uninitialized instance. It never creates proxies.
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern object AllocateUninitializedClassInstance (Type type);
-\r
+
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static void EnableProxyActivation (Type type, bool enable);
-       }\r
-}\r
+       }
+}
diff --git a/mcs/class/corlib/System.Runtime.Remoting.Activation/AppDomainLevelActivator.cs b/mcs/class/corlib/System.Runtime.Remoting.Activation/AppDomainLevelActivator.cs
new file mode 100644 (file)
index 0000000..e47464f
--- /dev/null
@@ -0,0 +1,58 @@
+//
+// System.Runtime.Remoting.Activation.AppDomainLevelActivator.cs
+//
+// Author: Lluis Sanchez Gual (lluis@ideary.com)
+//
+// (C) 2003, Lluis Sanchez Gual
+//
+
+using System;
+using System.Runtime.Remoting.Messaging;
+
+namespace System.Runtime.Remoting.Activation
+{
+       public class AppDomainLevelActivator: IActivator
+       {
+               string _activationUrl;
+               IActivator _next;
+
+               public AppDomainLevelActivator(string activationUrl, IActivator next)
+               {
+                       _activationUrl = activationUrl;
+                       _next = next;
+               }
+
+               public ActivatorLevel Level 
+               {
+                       get { return ActivatorLevel.AppDomain; }
+               }
+
+               public IActivator NextActivator 
+               {
+                       get { return _next; }
+                       set { _next = value; }
+               }
+
+               public IConstructionReturnMessage Activate (IConstructionCallMessage ctorCall)
+               {
+                       IConstructionReturnMessage response;
+
+                       // Create the object by calling the remote activation service
+
+                       RemoteActivator remoteActivator = (RemoteActivator) RemotingServices.Connect (typeof (RemoteActivator), _activationUrl);
+                       ctorCall.Activator = ctorCall.Activator.NextActivator;
+
+                       response = remoteActivator.Activate (ctorCall);
+
+                       // Create the client identity for the remote object
+
+                       ObjRef objRef = (ObjRef) response.ReturnValue;
+                       if (RemotingServices.GetIdentityForUri (objRef.URI) != null)
+                               throw new RemotingException("Inconsistent state during activation; there may be two proxies for the same object");
+
+                       Identity identity = RemotingServices.GetOrCreateClientIdentity (objRef, ctorCall.ActivationType);
+                       RemotingServices.SetMessageTargetIdentity (ctorCall, identity);
+                       return response;
+               }
+       }
+}
index 9c088bb176460322a137b645236f298cad0fe4f9..0d36c020dca50220a06d4dfb76edb7767767aeca 100644 (file)
@@ -1,3 +1,13 @@
+2003-03-21  Lluis Sanchez Gual <lluis@ideary.com>
+
+       * ActivationServices.cs: Added the method Activate that performs the forwards the
+         creation message to the right message sink. Added support for AppDomainLevelActivator.
+       * ConstructionLevelActivator.cs: Activate does not use the object identity because
+         it may not be set yet.
+       * ContextLevelActivator.cs: this activator is now always called for CBOs. A new context
+         has to be created only if the construction message says so.
+       * AppDomainLevelActivator.cs: Added. Implements an IActivator that makes a remote creation.
+       
 2003-02-25  Lluis Sanchez Gual <lluis@ideary.com>
 
        * ActivationServices.cs: Added method for creating a proxy from a list
index 2be6ab115e61b8515e2fffe811cb24f756093f1d..c8009e56a5767ab98a146d6867acf2e90f952b84 100644 (file)
@@ -30,11 +30,7 @@ namespace System.Runtime.Remoting.Activation
                public IConstructionReturnMessage Activate (IConstructionCallMessage msg)
                {
                        // The StackBuilderSink at the end of the server context sink chain will do the job
-                       
-                       ServerIdentity identity = (ServerIdentity) RemotingServices.GetMessageTargetIdentity (msg);
-                       if (identity.Context == null) identity.Context = Threading.Thread.CurrentContext;
-
-                       return (IConstructionReturnMessage) identity.Context.GetServerContextSinkChain().SyncProcessMessage (msg);
+                       return (IConstructionReturnMessage) Threading.Thread.CurrentContext.GetServerContextSinkChain().SyncProcessMessage (msg);
                }
        }
 }
index 003c17330efafdd82fcd88f0d3df1789ddfc929a..52cf269c4a7ecc6274b198b62895f8e52ad37826 100644 (file)
@@ -7,6 +7,7 @@
 //
 
 using System;
+using System.Runtime.Remoting.Messaging;
 using System.Runtime.Remoting.Contexts;
 
 namespace System.Runtime.Remoting.Activation
@@ -34,19 +35,26 @@ namespace System.Runtime.Remoting.Activation
 
                public IConstructionReturnMessage Activate (IConstructionCallMessage ctorCall)
                {
-                       ServerIdentity identity = (ServerIdentity) RemotingServices.GetMessageTargetIdentity (ctorCall);
-                       identity.Context = Context.CreateNewContext (ctorCall);
+                       ServerIdentity identity = RemotingServices.CreateContextBoundObjectIdentity (ctorCall.ActivationType);
+                       RemotingServices.SetMessageTargetIdentity (ctorCall, identity);
 
-                       Context oldContext = Context.SwitchToContext (identity.Context);
-                       try
+                       ConstructionCall call = ctorCall as ConstructionCall;
+                       if (call == null || !call.IsContextOk)
                        {
-                               IConstructionReturnMessage response = (IConstructionReturnMessage) _next.Activate (ctorCall);
-                               return response;
-                       }
-                       finally
-                       {
-                               Context.SwitchToContext (oldContext);
+                               identity.Context = Context.CreateNewContext (ctorCall);
+                               Context oldContext = Context.SwitchToContext (identity.Context);
+
+                               try
+                               {
+                                       return _next.Activate (ctorCall);
+                               }
+                               finally
+                               {
+                                       Context.SwitchToContext (oldContext);
+                               }
                        }
+                       else
+                               return _next.Activate (ctorCall);
                }
        }
 }