/// <summary> /// Adds an attribute with given name and type to the class with the given name /// </summary> /// <param name="targetClass">The class, we want to add the new attribute to.</param> /// <param name="myAttributeName">The name of the attribute.</param> /// <param name="attributeType">The type of the attribute.</param> /// <returns>Ture, if the attribute could be added to the target class. Else, false. (attribute contained in superclass)</returns> public Exceptional<ResultType> AddAttributeToType(GraphDBType mytype, TypeAttribute myTypeAttribute) { #region check if already initialized if (GetTypeByUUID(myTypeAttribute.DBTypeUUID) == null) { return new Exceptional<ResultType>(new Error_TypeDoesNotExist(myTypeAttribute.DBTypeUUID.ToString())); } #endregion #region Check if any ParentType already have an attribute with this name foreach (var aType in GetAllParentTypes(mytype, true, true)) { if (aType.GetTypeAttributeByName(myTypeAttribute.Name) != null) { return new Exceptional<ResultType>(new Error_AttributeExistsInSupertype(myTypeAttribute.Name, aType.Name)); } } #endregion #region adapt type //if we reach this code, no other superclass contains an attribute with this name, so add it! myTypeAttribute.RelatedGraphDBTypeUUID = mytype.UUID; if (myTypeAttribute.DefaultValue != null) { mytype.AddMandatoryAttribute(myTypeAttribute.UUID, this); } mytype.AddAttribute(myTypeAttribute, this, true); var FlushExcept = FlushType(mytype); if (FlushExcept.Failed()) return new Exceptional<ResultType>(FlushExcept); #endregion #region update lookup tables ob sub-classes foreach (var aSubType in GetAllSubtypes(mytype, false)) { aSubType.AttributeLookupTable.Add(myTypeAttribute.UUID, myTypeAttribute); } #endregion return new Exceptional<ResultType>(ResultType.Successful); }