/// <summary> /// Creates a new PolicyDocument using the XmlReader instance provided with the possibility of writing. /// </summary> /// <param name="reader">The XmlReader positioned at the begining of the document.</param> /// <param name="schemaVersion">The version of the schema that will be used to validate.</param> public PolicyDocumentReadWrite(XmlReader reader, XacmlVersion schemaVersion) { // Validate the parameters if (reader == null) { throw new ArgumentNullException("reader"); } _schemaVersion = schemaVersion; // Prepare Xsd validation #if NET10 XmlValidatingReader vreader = new XmlValidatingReader( reader ); #endif #if NET20 ValidationEventHandler validationHandler = vreader_ValidationEventHandler; XmlReaderSettings settings = new XmlReaderSettings {ValidationType = ValidationType.Schema}; settings.ValidationEventHandler += validationHandler; XmlReader vreader = null; #endif try { switch (schemaVersion) { case XacmlVersion.Version10: case XacmlVersion.Version11: { Stream schemaStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Xacml10PolicySchemaResourceName); #if NET10 XmlTextReader schemaReader = new XmlTextReader(schemaStream); vreader.Schemas.Add( PolicySchema1.Namespaces.Policy, schemaReader ); #endif #if NET20 if (_compiledSchemas11 == null) { _compiledSchemas11 = new XmlSchemaSet(); _compiledSchemas11.Add(XmlSchema.Read(schemaStream, validationHandler)); _compiledSchemas11.Compile(); } settings.Schemas.Add(_compiledSchemas11); #endif break; } case XacmlVersion.Version20: { Stream schemaStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Xacml20PolicySchemaResourceName); #if NET10 XmlTextReader schemaReader = new XmlTextReader(schemaStream); vreader.Schemas.Add( PolicySchema2.Namespaces.Policy, schemaReader ); #endif #if NET20 if (_compiledSchemas20 == null) { _compiledSchemas20 = new XmlSchemaSet(); _compiledSchemas20.Add(XmlSchema.Read(schemaStream, validationHandler)); _compiledSchemas20.Compile(); } settings.Schemas.Add(_compiledSchemas20); #endif break; } default: throw new ArgumentException(Resource.ResourceManager[Resource.MessageKey.exc_invalid_version_parameter_value], "version"); } #if NET10 vreader.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler( vreader_ValidationEventHandler ); #endif #if NET20 vreader = XmlReader.Create(reader, settings); #endif // Read and validate the document. while (vreader.Read()) { //Read all the namespaces and keep them in the _namespaces hashtable. if (vreader.HasAttributes) { while (vreader.MoveToNextAttribute()) { if (vreader.LocalName == PolicySchema1.Namespaces.XMLNS) { _namespaces.Add(vreader.Prefix, vreader.Value); } else if (vreader.Prefix == PolicySchema1.Namespaces.XMLNS) { _namespaces.Add(vreader.LocalName, vreader.Value); } } vreader.MoveToElement(); } // Check the first element of the document and proceeds to read the contents // depending on the first node name. switch (vreader.LocalName) { case PolicySchema1.PolicySetElement.PolicySet: { _policySet = new PolicySetElementReadWrite(vreader, schemaVersion); return; } case PolicySchema1.PolicyElement.Policy: { _policy = new PolicyElementReadWrite(vreader, schemaVersion); return; } } } } finally { if (vreader != null) { vreader.Close(); } } }