MgByteReader* MgResourceDefinitionManager::GetRepository( MgResourceIdentifier* resource) { assert(NULL != resource && resource->IsRoot()); Ptr<MgByteReader> byteReader; MG_RESOURCE_SERVICE_TRY() // Get the resource. XmlDocument xmlDoc = GetDocument(*resource); // Create a byte reader. string document; xmlDoc.getContent(document); // TODO: Improve performance by using getContentAsXmlInputStream? Ptr<MgByteSource> byteSource = new MgByteSource( (unsigned char*)document.c_str(), (INT32)document.length()); byteSource->SetMimeType(MgMimeType::Xml); byteReader = byteSource->GetReader(); MG_RESOURCE_CONTAINER_CATCH_AND_THROW(L"MgResourceDefinitionManager.GetRepository") return SAFE_ADDREF((MgByteReader*)byteReader); }
MgByteReader* MgResourceDefinitionManager::GetResource( MgResourceIdentifier* resource, const MgDataBindingInfo* dataBindingInfo) { assert(NULL != resource); Ptr<MgByteReader> byteReader; MG_RESOURCE_SERVICE_TRY() // Get the resource. XmlDocument xmlDoc = GetDocument(*resource); string document; xmlDoc.getContent(document); // Bind the data if required. if (NULL != dataBindingInfo) { // Substitute all the tags if necessary. XmlValue tagValue; if (xmlDoc.getMetaData(MgResourceInfo::sm_metadataUri, MgResourceInfo::sm_metadataNames[MgResourceInfo::Tags], tagValue)) { STRING resourceTags; MgUtil::MultiByteToWideChar(tagValue.asString(), resourceTags); // If there is no resource tag, then just do the substitution for // the login username and password. MgTagManager tagManager(resourceTags); tagManager.SubstituteTags(*dataBindingInfo, document); } } // Create a byte reader. Ptr<MgByteSource> byteSource = new MgByteSource( (unsigned char*)document.c_str(), (INT32)document.length()); byteSource->SetMimeType(MgMimeType::Xml); byteReader = byteSource->GetReader(); MG_RESOURCE_CONTAINER_CATCH_AND_THROW(L"MgResourceDefinitionManager.GetResource") return SAFE_ADDREF((MgByteReader*)byteReader); }
void MgResourceDefinitionManager::ValidateDocument(XmlDocument& xmlDoc) { MG_RESOURCE_SERVICE_TRY() MgResourceIdentifier resource(MgUtil::MultiByteToWideChar(xmlDoc.getName())); // Skip XML schema validation on runtime resources. if (!resource.IsRuntimeResource()) { std::string xmlContent; MgXmlUtil xmlUtil(xmlDoc.getContent(xmlContent)); DOMElement* rootNode = xmlUtil.GetRootNode(); if(NULL != rootNode) { assert(NULL != rootNode); STRING rootName; const XMLCh* tag = rootNode->getTagName(); if (NULL != tag) { rootName = X2W(tag); assert(!rootName.empty()); } STRING schemaName; const XMLCh* attr = rootNode->getAttribute(X("xsi:noNamespaceSchemaLocation")); if (NULL != attr) { schemaName = X2W(attr); } ValidateDocument(resource, rootName, schemaName); } } MG_RESOURCE_CONTAINER_CATCH_AND_THROW(L"MgResourceDefinitionManager.ValidateDocument") }
//Get a document from the container using the document name void doGetDocument( XmlTransaction &txn, XmlContainer &container, const std::string docname) { try { std::cout << "Getting document '" << docname << "' from the container." << std::endl; std::cout << "Return to continue: "; getc(stdin); std::cout << "\n"; //Get the document from the container using the document name XmlDocument theDocument = container.getDocument(txn, docname); std::string content; std::cout << "Document name: " << theDocument.getName() << std::endl; std::cout << theDocument.getContent(content) << std::endl; } //Catches XmlException catch(std::exception &e) { std::cerr << "Get document from container failed.\n"; std::cerr << e.what() << "\n"; txn.abort(); exit( -1 ); } }