Exemple #1
0
        public virtual void RegisterModelContextEvent <TSPObject, TDefinitionType>(
            ModelEventType actionType,
            Action <OnCreatingContext <TSPObject, TDefinitionType> > action)
            where TDefinitionType : DefinitionBase
        {
            if (action == null)
            {
                return;
            }

            if (!ModelContextEvents.ContainsKey(actionType))
            {
                ModelContextEvents.Add(actionType, new List <object>());
            }

            ModelContextEvents[actionType].Add(action);
        }
Exemple #2
0
        public virtual void InvokeOnModelContextEvents(object sender, ModelEventArgs eventArgs)
        {
            var eventType = eventArgs.EventType;

            // type.. can be null, so?
            var spObjectType = eventArgs.ObjectType;

            if (!ModelContextEvents.ContainsKey(eventType))
            {
                return;
            }

            var targetEvents = ModelContextEvents[eventType];

            // yea, yea..
            foreach (MulticastDelegate action in targetEvents)
            {
                var modelContextType = typeof(OnCreatingContext <,>);

                var nonDefinition  = new Type[] { spObjectType, typeof(DefinitionBase) };
                var withDefinition = new Type[] { spObjectType, eventArgs.ObjectDefinition.GetType() };

                var modelNonDefInstanceType  = modelContextType.MakeGenericType(nonDefinition);
                var modelWithDefInstanceType = modelContextType.MakeGenericType(withDefinition);

                object modelContextInstance = null;

                if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelNonDefInstanceType))
                {
                    modelContextInstance = Activator.CreateInstance(modelNonDefInstanceType);
                }
                else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelWithDefInstanceType))
                {
                    modelContextInstance = Activator.CreateInstance(modelWithDefInstanceType);
                }

                SetProperty(modelContextInstance, "Model", eventArgs.Model);
                SetProperty(modelContextInstance, "CurrentModelNode", eventArgs.CurrentModelNode);

                SetProperty(modelContextInstance, "Object", eventArgs.Object);
                SetProperty(modelContextInstance, "ObjectDefinition", eventArgs.ObjectDefinition);

                action.DynamicInvoke(modelContextInstance);
            }
        }
Exemple #3
0
        public virtual void InvokeOnModelContextEvents(object sender, ModelEventArgs eventArgs)
        {
            var objectType = typeof(object);
            var eventType  = eventArgs.EventType;

            // type.. can be null, so?
            var spObjectType = eventArgs.ObjectType;

            if (!ModelContextEvents.ContainsKey(eventType))
            {
                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Cannot find ModelContextEvents for eventType: [{0}]", eventType);
                return;
            }
            else
            {
                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Calling ModelContextEvents for eventType: [{0}]", eventType);
            }

            var targetEvents = ModelContextEvents[eventType];

            // yea, yea..
            foreach (MulticastDelegate action in targetEvents)
            {
                var modelContextType = typeof(OnCreatingContext <,>);

                var nonDefinition        = new Type[] { spObjectType, typeof(DefinitionBase) };
                var withDefinition       = new Type[] { spObjectType, eventArgs.ObjectDefinition.GetType() };
                var nonObjectDefinition  = new Type[] { objectType, typeof(DefinitionBase) };
                var withObjectDefinition = new Type[] { objectType, eventArgs.ObjectDefinition.GetType() };

                var modelNonDefInstanceType        = modelContextType.MakeGenericType(nonDefinition);
                var modelWithDefInstanceType       = modelContextType.MakeGenericType(withDefinition);
                var modelNonObjectDefInstanceType  = modelContextType.MakeGenericType(nonObjectDefinition);
                var modelWithObjectDefInstanceType = modelContextType.MakeGenericType(withObjectDefinition);

                object modelContextInstance = null;

                if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelNonDefInstanceType))
                {
                    modelContextInstance = Activator.CreateInstance(modelNonDefInstanceType);
                }
                else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelWithDefInstanceType))
                {
                    modelContextInstance = Activator.CreateInstance(modelWithDefInstanceType);
                }
                else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelNonObjectDefInstanceType))
                {
                    modelContextInstance = Activator.CreateInstance(modelNonObjectDefInstanceType);
                }
                else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelWithObjectDefInstanceType))
                {
                    modelContextInstance = Activator.CreateInstance(modelWithObjectDefInstanceType);
                }

                if (modelContextInstance == null)
                {
                    TraceService.ErrorFormat((int)LogEventId.ModelTreeModelContextEventIsNull,
                                             "Cannot find model content instance for method: [{0}]. Throwing SPMeta2Exception.", action.Method);

                    throw new SPMeta2Exception("Cannot find a proper ModelContextEvents overload");
                }

                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [Model]: [{0}]", eventArgs.Model);
                SetProperty(modelContextInstance, "Model", eventArgs.Model);

                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [CurrentModelNode]: [{0}]", eventArgs.CurrentModelNode);
                SetProperty(modelContextInstance, "CurrentModelNode", eventArgs.CurrentModelNode);

                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [Object]: [{0}]", eventArgs.Object);
                SetProperty(modelContextInstance, "Object", eventArgs.Object);

                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [ObjectDefinition]: [{0}]", eventArgs.ObjectDefinition);
                SetProperty(modelContextInstance, "ObjectDefinition", eventArgs.ObjectDefinition);

                TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [ModelHost]: [{0}]", eventArgs.ModelHost);
                SetProperty(modelContextInstance, "ModelHost", eventArgs.ModelHost);

                TraceService.Verbose((int)LogEventId.CoreCalls, "Invoking event.");
                action.DynamicInvoke(modelContextInstance);
            }
        }