private static bool IsTypeDefined(ClassDeclaration c, List<ResourceType> complexTypeResources, List<ResourceType> entityResources, Dictionary<string, Schema.AssociationType> associationResources) { Func<ResourceType, bool> func = null; Func<ResourceType, bool> func1 = null; SchemaLoader.ClassCategory category = c.GetCategory(); switch (category) { case SchemaLoader.ClassCategory.Complex: { object obj = null; List<ResourceType> resourceTypes = complexTypeResources; if (func1 == null) { func1 = (ResourceType it) => string.Equals(it.FullName, SchemaLoader.TransformCimNameToCsdl(c.Name.FullName, true)); } return obj != resourceTypes.FirstOrDefault<ResourceType>(func1); } case SchemaLoader.ClassCategory.Entity: { object obj1 = null; List<ResourceType> resourceTypes1 = entityResources; if (func == null) { func = (ResourceType it) => string.Equals(it.FullName, SchemaLoader.TransformCimNameToCsdl(c.Name.FullName, true)); } return obj1 != resourceTypes1.FirstOrDefault<ResourceType>(func); } case SchemaLoader.ClassCategory.Association: { return associationResources.Keys.Contains<string>(SchemaLoader.TransformCimNameToCsdl(c.Name.FullName, true)); } } throw new NotImplementedException(string.Concat("class category ", c.GetCategory())); }
private static void CreateResourceType(ClassDeclaration c, HashSet<MofProduction> mof, Schema schema, List<ResourceType> complexTypeResources, List<ResourceType> entityResources) { Func<MofProduction, bool> func = null; if (!SchemaLoader.IsTypeDefined(c, complexTypeResources, entityResources, schema.AssociationTypes)) { if (!c.IsClassAndSuperclassesContainsLoop(mof)) { SchemaLoader.ClassCategory category = c.GetCategory(); ResourceType resourceType = null; if (c.SuperclassName != null) { HashSet<MofProduction> mofProductions = mof; if (func == null) { func = (MofProduction item) => string.Equals(c.SuperclassName.FullName, item.GetFullClassName(), StringComparison.Ordinal); } ClassDeclaration classDeclaration = mofProductions.FirstOrDefault<MofProduction>(func) as ClassDeclaration; if (classDeclaration != null) { SchemaLoader.ClassCategory classCategory = classDeclaration.GetCategory(); if (category == classCategory) { if (!SchemaLoader.IsTypeDefined(classDeclaration, complexTypeResources, entityResources, schema.AssociationTypes)) { SchemaLoader.CreateResourceType(classDeclaration, mof, schema, complexTypeResources, entityResources); } if (!schema.ResourceTypes.TryGetValue(SchemaLoader.TransformCimNameToCsdl(classDeclaration.Name.FullName, true), out resourceType)) { object[] fullName = new object[2]; fullName[0] = classDeclaration.Name.FullName; fullName[1] = c.Name.FullName; throw new MetadataException(ExceptionHelpers.GetExceptionMessage(Resources.BaseClassNotFound, fullName)); } } else { object[] superclassName = new object[2]; superclassName[0] = c.Name.FullName; superclassName[1] = c.SuperclassName; throw new MetadataException(ExceptionHelpers.GetExceptionMessage(Resources.CrossCategoryDerivation, superclassName)); } } else { object[] objArray = new object[2]; objArray[0] = c.Name.FullName; objArray[1] = c.SuperclassName; throw new MetadataException(ExceptionHelpers.GetExceptionMessage(Resources.MissingBaseClass, objArray)); } } SchemaLoader.ClassCategory category1 = c.GetCategory(); switch (category1) { case SchemaLoader.ClassCategory.Complex: { complexTypeResources.Add(schema.AddResourceType(c.Name.Identifier, ResourceTypeKind.ComplexType, SchemaLoader.TransformCimNameToCsdl(c.Name.Schema, false), resourceType, null)); return; } case SchemaLoader.ClassCategory.Entity: { entityResources.Add(schema.AddResourceType(c.Name.Identifier, ResourceTypeKind.EntityType, SchemaLoader.TransformCimNameToCsdl(c.Name.Schema, false), resourceType, null)); return; } case SchemaLoader.ClassCategory.Association: { schema.AddAssociationType(SchemaLoader.TransformCimNameToCsdl(c.Name.Identifier, false), SchemaLoader.TransformCimNameToCsdl(c.Name.Schema, false)); return; } } throw new NotImplementedException(string.Concat("class category ", c.GetCategory())); } else { object[] identifier = new object[1]; identifier[0] = c.Name.Identifier; throw new MetadataException(ExceptionHelpers.GetExceptionMessage(Resources.BaseClassesNotPresentOrRecursive, identifier)); } } else { return; } }