Exemplo n.º 1
0
        public XElement GetElement(RhspDataID dataID, Type dataType)
        {
            RhspDataAttribute hda     = GetRuntimeHda(dataType);
            XElement          element = getElementUsingHda(ConfigDocument, dataID, hda);

            return(element);
        }
Exemplo n.º 2
0
        public bool Exists(RhspDataID dataID, Type type)
        {
            RhspDataAttribute hda    = GetRuntimeHda(type);
            XElement          parent = getParent(ConfigDocument, hda.Parent);

            return(find(parent, dataID, hda).Count() != 0);
        }
Exemplo n.º 3
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);
     }
 }
Exemplo n.º 4
0
        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();
        }
Exemplo n.º 5
0
        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)));
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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));
            }
        }
Exemplo n.º 8
0
        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());
        }
Exemplo n.º 9
0
        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.
        }
Exemplo n.º 10
0
        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);
        }