Beispiel #1
0
        public INode Filter(ref INodeResolver resolver, ref INodeAddress address, ref NodeType nodeType, out bool canCache)
        {
            if (nodeType.GetType().IsGenericType&& nodeType.GetType().GetGenericTypeDefinition() == typeof(DataFileNodeType <>))
            {
                var innerNodeType = nodeType.InnerType ?? NodeType.File;

                var file = (IFile)resolver.Resolve(address.PathAndQuery, innerNodeType);

                var dataFileType = typeof(DataFile <>);

                dataFileType = dataFileType.MakeGenericType(nodeType.GetType().GetGenericArguments());

                var dataFile = (INode)Activator.CreateInstance(dataFileType, file, nodeType);

                canCache = true;

                return(dataFile);
            }
            else
            {
                canCache = false;

                return(null);
            }
        }
		public INode Filter(ref INodeResolver resolver, ref INodeAddress address, ref NodeType nodeType, out bool canCache)
		{
			if (nodeType.GetType().IsGenericType && nodeType.GetType().GetGenericTypeDefinition() == typeof(DataFileNodeType<>))
			{
				var innerNodeType = nodeType.InnerType ?? NodeType.File;
				
				var file = (IFile)resolver.Resolve(address.PathAndQuery, innerNodeType);

				var dataFileType = typeof(DataFile<>);

				dataFileType = dataFileType.MakeGenericType(nodeType.GetType().GetGenericArguments());

				var dataFile = (INode)Activator.CreateInstance(dataFileType, file, nodeType);

				canCache = true;

				return dataFile;
			}
			else
			{
				canCache = false;

				return null;
			}
		}
        public override ICollection <Type> GetKnownTypes([Optional] Container container)
        {
            Console.WriteLine("Expression Node KnownType");

            return(new Type [] { Type?.FromNode(container), this.GetType(), NodeType.GetType() });
        }
Beispiel #4
0
        public void Add(NodeType nodeType)
        {
            if (null == nodeType) {
                throw new ArgumentNullException("nodeType");
            }

            // Open subschema
            if (SubSchemas.ContainsKey(nodeType.Id)) {
                throw new InvalidTypeException(nodeType.Id, "Node type definition already loaded.");
            }
            var subSchema = SubSchemas[nodeType.Id] = new SubSchema();

            // Find all instance fields on DomainType
            Type type = nodeType.GetType();
            var fields = type.GetFields();
            foreach (var field in fields) {

                // Check if the field is a PropertyType
                var propertyType = field.GetValue(nodeType) as PropertyType;
                if (null != propertyType) {
                    if (subSchema.Properties.ContainsKey(propertyType.Key)) {
                        throw new InvalidKeyException(nodeType.Id, propertyType.Key, "Key already defined.");
                    }
                    subSchema.Properties[propertyType.Key] = propertyType;

                    // Gettables
                    foreach (var item in propertyType.GroupsRead) {
                        subSchema.GetGroupAccess(item.Id).GettableProperties.Add(propertyType.Key);
                    }

                    // Settables
                    foreach (var item in propertyType.GroupsWrite) {
                        subSchema.GetGroupAccess(item.Id).SettableProperties.Add(propertyType.Key);
                    }
                }

                // Check if the field is a LinkType
                var linkType = field.GetValue(nodeType) as LinkType;
                if (null != linkType) {
                    if (subSchema.Links.ContainsKey(linkType.Key)) {
                        throw new InvalidKeyException(nodeType.Id, linkType.Key, "Key already defined.");
                    }
                    subSchema.Links[linkType.Key] = linkType;

                    // Gettables
                    foreach (var item in linkType.GroupsRead) {
                        subSchema.GetGroupAccess(item.Id).GettableLinks.Add(linkType.Key);
                    }

                    // Settables
                    foreach (var item in linkType.GroupsWrite) {
                        subSchema.GetGroupAccess(item.Id).SettableLinks.Add(linkType.Key);
                    }
                }

            }

            // CanDelete
            foreach (var item in nodeType.CanDelete) {
                subSchema.GetGroupAccess(item.Id).CanDelete = true;
            }

            Loaded = true;
        }