public XElement GetElement(RhspDataID dataID, Type dataType) { RhspDataAttribute hda = GetRuntimeHda(dataType); XElement element = getElementUsingHda(ConfigDocument, dataID, hda); return(element); }
public bool Exists(RhspDataID dataID, Type type) { RhspDataAttribute hda = GetRuntimeHda(type); XElement parent = getParent(ConfigDocument, hda.Parent); return(find(parent, dataID, hda).Count() != 0); }
private object createFromElement(XElement element, Type dataType) { try { RhspDataAttribute hda = GetRuntimeHda(dataType); object data = Activator.CreateInstance(dataType); if (data is IRhspData) { IRhspData hd = (IRhspData)data; hd.DataID = new RhspDataID(element.Element(hda.ID).Value); hd.FromElement(element, this); } else { throw new NotSupportedException( "The data type must implement interface " + typeof(IRhspData).Name + " for an instance " + "to be created from an XML element."); } return(data); } catch (TargetInvocationException ex) { // Rethrow the target invocation exception, but pull the message to the top. throw new TargetInvocationException(ex.InnerException.Message, ex.InnerException); } }
private void deleteWithoutSave(RhspDataID dataID, Type dataType, XDocument document) { RhspDataAttribute hdca = GetRuntimeHda(dataType); XElement element = getElementUsingHda(document, dataID, hdca); // Simply remove the element. element.Remove(); }
public IEnumerable <TData> GetQueryForAllOfType <TData>() where TData : IRhspData { RhspDataAttribute hdca = GetRuntimeHda(typeof(TData)); XElement parent = getParent(ConfigDocument, hdca.Parent); return(from element in parent.Elements() select(TData) createFromElement(element, typeof(TData))); }
private void update(IRhspData data, XDocument document) { RhspDataAttribute hdca = GetRuntimeHda(data.GetType()); XElement element = getElementUsingHda(document, data.DataID, hdca); // Delegate element update to object it's self. data.UpdateElement(element, this); /* Set the latest schema version (as re-saving automatically * updates the object to this version). Versions are only ever * opened as earlier versions and never saved as this. */ updateVersionElement(element, hdca); }
private void updateVersionElement(XElement element, RhspDataAttribute hdca) { var q = from e in element.Elements() where e.Name == SchemaVersionElement select e; /* Due to a bug in earlier versions, there may be multiple version tags, * so remove any version tags that exist already. */ q.Remove(); if (hdca.SchemaVersion != 0) { // Re-add the element after removing any traces (only if version specified). element.AddFirst(new XElement(SchemaVersionElement, hdca.SchemaVersion)); } }
private XElement getElementUsingHda( XDocument document, RhspDataID dataID, RhspDataAttribute hda) { XElement parent = getParent(document, hda.Parent); var uniqueQuery = find(parent, dataID, hda); // Ensure that ID actually exists. if (uniqueQuery.Count() == 0) { throw new InvalidOperationException( "Unable to find element with unique ID of '" + dataID.Value + "'."); } return(uniqueQuery.First()); }
private IEnumerable <XElement> find( XElement parent, RhspDataID dataID, RhspDataAttribute hda) { if (dataID == null) { throw new ArgumentNullException("dataID"); } return(from child in ( from element in parent.Elements() select element.Element(hda.ID) ) where child.Value == dataID.Value select child.Parent); // Select the owner of the ID. }
private void create(IRhspData data, XDocument document) { if (data.DataID == null) { throw new Exception( "Hosting ID cannot be unassigned."); } RhspDataAttribute hda = GetRuntimeHda(data.GetType()); XElement parent = getParent(document, hda.Parent); var uniqueQuery = find(parent, data.DataID, hda); // Ensure that IDs are not duplicated. if (uniqueQuery.Count() != 0) { throw new InvalidOperationException( "An element with name '" + hda.Name + "' in parent " + "'" + hda.Parent + "' already contains unique ID " + "with value of '" + data.DataID + "'."); } // Get original data without unique ID present. XElement element = data.ToXElement(this); // Add ID first for better visual diagnosis. element.AddFirst(new XElement(hda.ID, data.DataID.Value)); if (hda.SchemaVersion != 0) { // Add version before the ID element, but only if neccecary. element.AddFirst(new XElement(SchemaVersionElement, hda.SchemaVersion)); } // Add the element with unique ID present. parent.Add(element); }