Exemple #1
0
        public static void RegisterFormScripts(IDynamicScriptManager scriptManager,
                                               ITypeSource typeSource, IPropertyItemProvider propertyProvider, IServiceProvider serviceProvider)
        {
            if (scriptManager == null)
            {
                throw new ArgumentNullException(nameof(scriptManager));
            }

            if (typeSource == null)
            {
                throw new ArgumentNullException(nameof(typeSource));
            }

            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }

            var scripts = new List <Func <string> >();

            foreach (var type in typeSource.GetTypesWithAttribute(typeof(FormScriptAttribute)))
            {
                var attr   = type.GetCustomAttribute <FormScriptAttribute>();
                var key    = attr.Key ?? type.FullName;
                var script = new FormScript(key, type, propertyProvider, serviceProvider);
                scriptManager.Register(script);
                scripts.Add(script.GetScript);
            }

            scriptManager.Register("FormBundle", new ConcatenatedScript(scripts));
        }
        public static void RegisterDataScripts(IDynamicScriptManager scriptManager,
                                               ITypeSource typeSource, IServiceProvider serviceProvider)
        {
            if (scriptManager == null)
            {
                throw new ArgumentNullException(nameof(scriptManager));
            }

            if (typeSource == null)
            {
                throw new ArgumentNullException(nameof(typeSource));
            }

            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }

            DataScriptAttribute attr;

            foreach (var type in typeSource.GetTypes())
            {
                if (type.IsAbstract ||
                    type.IsInterface ||
                    type.IsGenericTypeDefinition ||
                    !type.IsPublic)
                {
                    continue;
                }

                attr = type.GetCustomAttribute <DataScriptAttribute>();
                if (attr != null)
                {
                    var script = (INamedDynamicScript)ActivatorUtilities
                                 .CreateInstance(serviceProvider, type);
                    scriptManager.Register(script);
                    continue;
                }
            }
        }
        public static void RegisterLookupScripts(IDynamicScriptManager scriptManager,
                                                 ITypeSource typeSource, IServiceProvider serviceProvider)
        {
            if (scriptManager == null)
            {
                throw new ArgumentNullException(nameof(scriptManager));
            }

            if (typeSource == null)
            {
                throw new ArgumentNullException(nameof(typeSource));
            }

            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }

            var registeredType = new Dictionary <string, Type>(StringComparer.OrdinalIgnoreCase);

            foreach (var type in typeSource.GetTypesWithAttribute(typeof(LookupScriptAttribute)))
            {
                var          attr = type.GetCustomAttribute <LookupScriptAttribute>();
                LookupScript script;

                if (typeof(IRow).IsAssignableFrom(type))
                {
                    if (attr.LookupType == null)
                    {
                        script = (LookupScript)ActivatorUtilities.CreateInstance(serviceProvider,
                                                                                 typeof(RowLookupScript <>).MakeGenericType(type));
                    }
                    else if (attr.LookupType.IsGenericType)
                    {
                        script = (LookupScript)ActivatorUtilities.CreateInstance(serviceProvider,
                                                                                 attr.LookupType.MakeGenericType(type));
                    }
                    else if (attr.LookupType.GetCustomAttribute <LookupScriptAttribute>() == null)
                    {
                        script = (LookupScript)ActivatorUtilities.CreateInstance(serviceProvider,
                                                                                 attr.LookupType);
                    }
                    else
                    {
                        // lookup script type already has a LookupScript attribute,
                        // so it's dynamic script will be generated on itself
                        continue;
                    }
                }
                else if (!typeof(LookupScript).IsAssignableFrom(type) ||
                         type.IsAbstract)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
                                                                      "Type {0} can't be registered as a lookup script!", type.FullName));
                }
                else
                {
                    script = (LookupScript)ActivatorUtilities.CreateInstance(serviceProvider, type);
                }

                script.LookupKey = attr.Key ??
                                   LookupScriptAttribute.AutoLookupKeyFor(type);

                if (registeredType.TryGetValue(script.LookupKey, out Type otherType))
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
                                                                      "Types {0} and {1} has the same lookup key (\"{2}\"). " +
                                                                      "\r\n\r\nPlease remove LookupScript attribute from one of them or change the lookup key!",
                                                                      type.FullName, otherType.FullName, script.LookupKey));
                }

                registeredType[script.LookupKey] = type;

                if (attr.Permission != null)
                {
                    script.Permission = attr.Permission;
                }

                if (attr.Expiration != 0)
                {
                    script.Expiration = TimeSpan.FromSeconds(attr.Expiration);
                }

                scriptManager.Register(script.ScriptName, script);
            }
        }
Exemple #4
0
        public static void RegisterDistinctValueScripts(IDynamicScriptManager scriptManager,
                                                        ITypeSource typeSource, IServiceProvider serviceProvider)
        {
            if (scriptManager == null)
            {
                throw new ArgumentNullException(nameof(scriptManager));
            }

            if (typeSource == null)
            {
                throw new ArgumentNullException(nameof(typeSource));
            }

            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }

            var list = new List <DistinctValuesEditorAttribute>();

            foreach (var type in typeSource.GetTypes())
            {
                bool isRow = typeof(IRow).IsAssignableFrom(type) &&
                             !type.IsInterface;

                if (!isRow &&
                    type.GetCustomAttribute <FormScriptAttribute>() == null &&
                    type.GetCustomAttribute <ColumnsScriptAttribute>() == null)
                {
                    continue;
                }

                if (isRow &&
                    type.IsAbstract)
                {
                    continue;
                }

                foreach (var property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                {
                    var attr = property.GetCustomAttribute <DistinctValuesEditorAttribute>();
                    if (attr == null)
                    {
                        continue;
                    }

                    if (attr.RowType != null)
                    {
                        if (attr.RowType.IsInterface ||
                            attr.RowType.IsAbstract ||
                            !typeof(IRow).IsAssignableFrom(attr.RowType))
                        {
                            throw new Exception("DistinctValuesEditor can't be used with type: " +
                                                attr.RowType.FullName + " as it is not a row type. This attribute is specified " +
                                                "on " + property.Name + " property of " + type.FullName);
                        }

                        attr.PropertyName = attr.PropertyName.IsEmptyOrNull() ? property.Name :
                                            attr.PropertyName;
                    }
                    else
                    {
                        if (!isRow)
                        {
                            var basedOnRowAttr = type.GetCustomAttribute <BasedOnRowAttribute>();
                            if (basedOnRowAttr == null || basedOnRowAttr.RowType == null ||
                                basedOnRowAttr.RowType.IsAbstract ||
                                basedOnRowAttr.RowType.IsInterface ||
                                !typeof(IRow).IsAssignableFrom(basedOnRowAttr.RowType))
                            {
                                throw new Exception("Invalid usage of DistinctValuesEditor attribute on " +
                                                    "property " + property.Name + " of " + type.FullName + ". " +
                                                    "RowType has to be specified!");
                            }

                            attr.RowType = basedOnRowAttr.RowType;
                        }
                        else
                        {
                            attr.RowType = type;
                        }

                        attr.PropertyName = attr.PropertyName.IsEmptyOrNull() ? property.Name :
                                            attr.PropertyName;
                    }

                    list.Add(attr);
                }
            }

            var byRowProperty = list.ToLookup(x => new Tuple <Type, string>(x.RowType, x.PropertyName));

            foreach (var key in byRowProperty)
            {
                var row = (IRow)Activator.CreateInstance(key.Key.Item1);

                var script = (LookupScript)ActivatorUtilities.CreateInstance(serviceProvider,
                                                                             typeof(DistinctValuesScript <>).MakeGenericType(key.Key.Item1),
                                                                             new object[] { key.Key.Item2 });

                script.LookupKey = "Distinct." + row.GetFields().LocalTextPrefix + "." +
                                   key.Key.Item2;

                var withPermission = key.FirstOrDefault(x => !string.IsNullOrEmpty(x.Permission));
                if (withPermission != null)
                {
                    script.Permission = withPermission.Permission;
                }

                var withExpiration = key.FirstOrDefault(x => x.Expiration != 0);
                if (withExpiration != null)
                {
                    script.Expiration = TimeSpan.FromSeconds(withExpiration.Expiration);
                }

                scriptManager.Register(script.ScriptName, script);
            }
        }