public HeD.Engine.Model.Library Read(HeD.Engine.Model.LibraryRef libraryRef)
        {
            DoMessage("Loading library document...");

            var libraryDocument = XDocument.Load(libraryRef.Path, LoadOptions.SetLineInfo);

            DoMessage("Verifying artifact schema...");

            var schemaSet = new XmlSchemaSet();

            foreach (var schemaLocation in ELMLibrarySettings.Default.SchemaLocation.Split(';', ',', ' '))
            {
                schemaSet.Add(null, schemaLocation);
            }

            libraryDocument.Validate(schemaSet, onValidationEvent, true);

            if (libraryDocument.Root.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)
            {
                throw new InvalidOperationException("Library does not conform to the schema.");
            }

            var result = new HeD.Engine.Model.Library();

            // TODO: Read library nodes...

            result.Name = libraryRef.Name;
            //result.Version;

            var ns = libraryDocument.Root.GetDefaultNamespace();

            // Pull models
            var dataModelsElement = libraryDocument.Root.Element(ns + "usings");

            if (dataModelsElement != null)
            {
                result.Models = ReadModels(ns, dataModelsElement.Elements(ns + "def")).ToList();
            }
            else
            {
                result.Models = new List <HeD.Engine.Model.ModelRef>();
            }

            // Pull libraries
            var librariesElement = libraryDocument.Root.Element(ns + "includes");

            if (librariesElement != null)
            {
                result.Libraries = ReadLibraries(ns, librariesElement.Elements(ns + "def")).ToList();
            }
            else
            {
                result.Libraries = new List <HeD.Engine.Model.LibraryRef>();
            }

            // TODO: Codesystems
            result.CodeSystems = new List <HeD.Engine.Model.CodeSystemDef>();

            // Pull Valuesets
            var valuesetsElement = libraryDocument.Root.Element(ns + "valueSets");

            if (valuesetsElement != null)
            {
                result.ValueSets = ReadValueSets(ns, valuesetsElement.Elements(ns + "def")).ToList();
            }
            else
            {
                result.ValueSets = new List <HeD.Engine.Model.ValueSetDef>();
            }

            // Pull parameters
            var parametersElement = libraryDocument.Root.Element(ns + "parameters");

            if (parametersElement != null)
            {
                result.Parameters = ReadParameters(ns, parametersElement.Elements(ns + "def")).ToList();
            }
            else
            {
                result.Parameters = new List <HeD.Engine.Model.ParameterDef>();
            }

            // Pull expression defs
            var statementsElement = libraryDocument.Root.Element(ns + "statements");

            if (statementsElement != null)
            {
                // TODO: FunctionDefs
                result.Expressions = ReadExpressionDefs(ns, statementsElement.Elements(ns + "def")).ToList();
            }
            else
            {
                result.Expressions = new List <HeD.Engine.Model.ExpressionDef>();
            }

            return(result);
        }
		public HeD.Engine.Model.Library Read(HeD.Engine.Model.LibraryRef libraryRef)
		{
			DoMessage("Loading library document...");
				
			var libraryDocument = XDocument.Load(libraryRef.Path, LoadOptions.SetLineInfo);

			DoMessage("Verifying artifact schema...");

			var schemaSet = new XmlSchemaSet();
			foreach (var schemaLocation in ELMLibrarySettings.Default.SchemaLocation.Split(';', ',', ' '))
			{
				schemaSet.Add(null, schemaLocation);
			}

			libraryDocument.Validate(schemaSet, onValidationEvent, true);

			if (libraryDocument.Root.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)
			{
				throw new InvalidOperationException("Library does not conform to the schema.");
			}

			var result = new HeD.Engine.Model.Library();

			// TODO: Read library nodes...

			result.Name = libraryRef.Name;
			//result.Version;

			var ns = libraryDocument.Root.GetDefaultNamespace();

			// Pull models
			var dataModelsElement = libraryDocument.Root.Element(ns + "usings");
			if (dataModelsElement != null)
			{
				result.Models = ReadModels(ns, dataModelsElement.Elements(ns + "def")).ToList();
			}
			else
			{
				result.Models = new List<HeD.Engine.Model.ModelRef>();
			}

			// Pull libraries
			var librariesElement = libraryDocument.Root.Element(ns + "includes");
			if (librariesElement != null)
			{
				result.Libraries = ReadLibraries(ns, librariesElement.Elements(ns + "def")).ToList();
			}
			else
			{
				result.Libraries = new List<HeD.Engine.Model.LibraryRef>();
			}

            // Pull Codesystems
			var codesystemsElement = libraryDocument.Root.Element(ns + "codeSystems");
			if (codesystemsElement != null)
			{
				result.CodeSystems = ReadCodeSystems(ns, codesystemsElement.Elements(ns + "def")).ToList();
			}
			else
			{
				result.CodeSystems = new List<HeD.Engine.Model.CodeSystemDef>();
			}

			// Pull Valuesets
            var valuesetsElement = libraryDocument.Root.Element(ns + "valueSets");
            if (valuesetsElement != null)
            {
                result.ValueSets = ReadValueSets(ns, valuesetsElement.Elements(ns + "def")).ToList();
            }
            else
            {
                result.ValueSets = new List<HeD.Engine.Model.ValueSetDef>();
            }

			// Pull parameters
			var parametersElement = libraryDocument.Root.Element(ns + "parameters");
			if (parametersElement != null)
			{
				result.Parameters = ReadParameters(ns, parametersElement.Elements(ns + "def")).ToList();
			}
			else
			{
				result.Parameters = new List<HeD.Engine.Model.ParameterDef>();
			}

            // Pull expression defs
			var statementsElement = libraryDocument.Root.Element(ns + "statements");
			if (statementsElement != null)
			{
                // TODO: FunctionDefs
				result.Expressions = ReadExpressionDefs(ns, statementsElement.Elements(ns + "def")).ToList();
			}
			else
			{
				result.Expressions = new List<HeD.Engine.Model.ExpressionDef>();
			}

			return result;
		}