bool XmlProcessing::XmlDocument::addRoot(const std::string &tag) { //adds root if the tree is empty otherwise return false bool flag = false; if (pDocElement_) { for(auto elem:pDocElement_->getChildren()) { if (dynamic_cast<TaggedElement *>(elem.get()) != nullptr) flag = true; } if (flag) return false; else { pDocElement_ = makeDocElement(); std::shared_ptr<AbstractXmlElement> addRoot = makeTaggedElement(tag); pDocElement_->addChild(addRoot); return true; } } else { pDocElement_ = makeDocElement(); std::shared_ptr<AbstractXmlElement> addRoot = makeTaggedElement(tag); pDocElement_->addChild(addRoot); return true; } }
int main(int argc, char* argv[]) { DisplayData::title("Testing Display Package", '='); std::shared_ptr < XmlProcessing::AbstractXmlElement > root = XmlProcessing::makeTaggedElement("root"); root->addChild(XmlProcessing::makeTextElement("this is a test")); std::shared_ptr < XmlProcessing::AbstractXmlElement > child = XmlProcessing::makeTaggedElement("child"); child->addChild(XmlProcessing::makeTextElement("this is another test")); child->addAttrib("first", "test"); root->addChild(child); std::shared_ptr < XmlProcessing::AbstractXmlElement > docEl = makeDocElement(root); DisplayData::title(" show xml tree ", '-'); DisplayData::showXmlTree(docEl); std::vector<std::shared_ptr <XmlProcessing::AbstractXmlElement >> result; result.push_back(root); result.push_back(child); DisplayData::title("show xml elements ", '-'); DisplayData::showData(result); std::vector<std::pair<std::string, std::string>> attributePairs; std::pair < std::string, std::string> pair1 = std::make_pair("att1", "val1"); std::pair < std::string, std::string> pair2 = std::make_pair("att2", "val2"); std::pair < std::string, std::string> pair3 = std::make_pair("att3", "val3"); attributePairs.push_back(pair1); attributePairs.push_back(pair2); attributePairs.push_back(pair3); DisplayData::title("show xml attribute pairs ", '-'); DisplayData::showAttributesPair(attributePairs); std::cout << "\n\n"; return 0; }
//Returns list of packages in XmlDocument XmlDocument Repository::getPackagesList() { vector<sPtr> packages = _packagesInfo->element("Version").select(); vector<string> packageNames; if (packages.size() > 0) { for (auto pckg : packages) { string pckgnm = pckg->getAttrib("Name"); if (pckgnm != ""&& pckgnm != " ") { packageNames.push_back(pckgnm); } } } sPtr rootElem = makeTaggedElement("Packages"); for (auto eachpckg : packageNames) { sPtr pckgelem = makeTaggedElement("Package"); pckgelem->addAttrib("Name", eachpckg); rootElem->addChild(pckgelem); } XmlDocument xmlPackagesList(makeDocElement(rootElem)); return xmlPackagesList; }
//Save dependency info to disk bool Repository::saveDependencyInfotoDisk(string packageName, string dependencyInfoString) { sPtr latestPackgeVersion = getLatestPackageVersion(packageName); string path = latestPackgeVersion->getAttrib("Directory"); string xmlFileNameonDisk = path + "\\DependencyInfo.xml"; XmlDocument dependencyInfoXML(dependencyInfoString); vector<string> depPackVector; vector<string> depVersionVector; std::vector<sPtr> found = dependencyInfoXML.element("Package").select(); for (auto pElem : found) { string pckName = pElem->getAttrib("Name"); if (pckName != ""&&pckName != " ") { cout << "\nDependent Package: " << packageName << " found"; depPackVector.push_back(pckName); } } for (auto depPack : depPackVector) { sPtr pck = getLatestPackageVersion(depPack); string Version = pck->getAttrib("Name"); if (Version != ""&&Version != " ") depVersionVector.push_back(Version); } sPtr root = makeTaggedElement("Dependency"); for (auto latest : depVersionVector) { sPtr latestDpPck = makeTaggedElement("Package"); latestDpPck->addAttrib("Name", latest); root->addChild(latestDpPck); } XmlDocument depXml(makeDocElement(root)); if (path != ""&&path != " ") { ofstream file; //cout << "Writing to file" << xmlFileNameonDisk; file.open(xmlFileNameonDisk, ios::ate); file << depXml.toString(); file.close(); } return false; }
//Create a package directory on Disk bool Repository::createPackageOnDisk(string packageName, string moduleName) { //cout << "Getting latest Package"; sPtr pckgPtr = getLatestPackageVersion(packageName); if (pckgPtr) { PackageDetails pckg = convertsPtrToPackageDetails(pckgPtr, packageName); if (pckg.status() == "Open") { cout << "\nPackage: " << packageName << " already exists with Open status"; return true; } if (pckg.status() == "Closed") { cout << "\nPackage: " << packageName << "exists with closed Status. Creating new version"; } } string timestamp = getTimeStamp(); string path = rootDirectory + "\\" + packageName + "_" + timestamp; cout << "\nCreating package: " << packageName << ", with directory: " << path; std::wstring stemp = std::wstring(path.begin(), path.end()); LPCWSTR sw = stemp.c_str(); ::SHCreateDirectoryEx(NULL, sw, NULL); sPtr XMLroot = _packagesInfo->xmlRoot(); sPtr packageElement = makeTaggedElement("Package"); packageElement->addAttrib("Name", packageName); XMLroot->addChild(packageElement); string versionName = packageName + "_" + timestamp; sPtr versionElement = makeTaggedElement("Version"); versionElement->addAttrib("Name", versionName); versionElement->addAttrib("Directory", path); versionElement->addAttrib("Status", "Open"); packageElement->addChild(versionElement); savePackageInfoXMLtoDisk(); sPtr metRoot = makeTaggedElement("Package Metadata"); XmlDocument metadataDoc(makeDocElement(metRoot)); ofstream file; string metaDataFileOnDisk = path + "\\Metadata.xml"; file.open(metaDataFileOnDisk, ios::ate); file << metadataDoc.toString(); return true; }
void main() { string thePath = "C:\\Users\\Martin\\Desktop\\TestingFolder"; string timestamp = __TIMESTAMP__; cout << endl << "TimeStamp before concatenation: " << timestamp; for (string::iterator i = timestamp.begin(); i < timestamp.end(); ++i) { if (*i == ':' || *i == ' ' || *i == ' ') timestamp.erase(i); } cout << endl << "TimeStamp after concatenation: " << timestamp; string folderwithDate = thePath + timestamp; cout << endl << "Folder along with TimeStamp" << folderwithDate; std::wstring stemp = std::wstring(folderwithDate.begin(), folderwithDate.end()); LPCWSTR sw = stemp.c_str(); ::SHCreateDirectoryEx(NULL, sw, NULL); vector<string> folders = FileSystem::Directory::getDirectories("C:\\Users\\Martin\\Desktop\\TestingFolder"); for (auto folder : folders) cout << endl << folder; sPtr rootElement = makeTaggedElement("Dependency"); for (auto folder : folders) { if (folder != "."&&folder != "..") { sPtr folderElement = makeTaggedElement("Package"); folderElement->addAttrib("Name", folder); rootElement->addChild(folderElement); cout << endl << folder; } } XmlDocument xmlFolderDocument(makeDocElement(rootElement)); std::ofstream file; file.open("PackagesDependency.xml", ios::ate); file << xmlFolderDocument.toString(); file.close(); string xmlString = xmlFolderDocument.toString(); XmlDocument xml(xmlString); XmlDocument xmlInputFile("PackagesDependency.xml", XmlDocument::file); vector<sPtr> packages = xml.element("Package").select(); cout << "No. of Packages found: " << packages.size(); vector<string> foldersList; for (auto package : packages) { if (package->getAttrib("Name") != "."&&package->getAttrib("Name") != ".."&&package->getAttrib("Name") != "") { cout << "Hello\n"; foldersList.push_back(package->getAttrib("Name")); } } vector<string> filesList; for (auto folder : foldersList) { std::vector<std::string> files = FileSystem::Directory::getFiles(thePath + "\\" + folder); filesList.insert(filesList.end(), files.begin(), files.end()); } for (auto file : filesList) cout << endl << file; sPtr XMLroot = makeTaggedElement("Packages"); sPtr packageElement = makeTaggedElement("Package"); packageElement->addAttrib("Name", "Package 1"); XMLroot->addChild(packageElement); sPtr versionElement = makeTaggedElement("Version"); versionElement->addAttrib("Name", "1"); versionElement->addAttrib("Directory", "Package1_1"); versionElement->addAttrib("Status", "Closed"); packageElement->addChild(versionElement); versionElement = makeTaggedElement("Version"); versionElement->addAttrib("Name", "2"); versionElement->addAttrib("Directory", "Package1_2"); versionElement->addAttrib("Status", "Open"); packageElement->addChild(versionElement); packageElement = makeTaggedElement("Package"); packageElement->addAttrib("Name", "Package 2"); XMLroot->addChild(packageElement); versionElement = makeTaggedElement("Version"); versionElement->addAttrib("Name", "1"); versionElement->addAttrib("Directory", "Package2_1"); versionElement->addAttrib("Status", "Open"); packageElement->addChild(versionElement); XmlDocument xmlMessage(makeDocElement(XMLroot)); //cout << xmlMessage.toString(); cout << endl; /*string fileSpec = "Package XML Structure.xml"; XmlDocument file(fileSpec, XmlDocument::file); XmlDocument* filePointer = &file;*/ /*Repository repo; repo.addPackageInfoXML(&xmlMessage); vector<PackageDetails> packages = repo.getPackageVersions("Package 1"); cout << endl << "Printing all Packages with name: Package 1"; for (auto packg : packages) { packg.print(); }*/ cout << endl; string xmlInputFileName = "PackagesStructure.xml"; XmlDocument xmlMessagefromDisk(xmlInputFileName, XmlDocument::file); cout << endl << "Printing XML read from disk: " << xmlMessagefromDisk.toString(); Repository repo2("C:\\Users\\Martin\\Desktop\\OODFolder"); repo2.addPackageInfoXML(&xmlMessagefromDisk); repo2.closePackageVersion("Package 1", "2"); cout << endl << "Printing XML read from disk after closing module status: " << xmlMessagefromDisk.toString(); string xmlOutputFileName = "PackagesStructure.xml"; cout << "Writing file to output: " << xmlOutputFileName; ofstream xmlFileWrite; xmlFileWrite.open(xmlOutputFileName, ios::ate); xmlFileWrite << xmlMessagefromDisk.toString(); cout << endl; /*try { XmlDocument xmlMessagefromDisk(xmlInputFileName, XmlDocument::file); cout << "Printing XML read from disk: " << xmlMessagefromDisk.toString(); } catch (std::exception& ex) { std::cout << "\n\n " << ex.what(); }*/ cout << endl; /*PackageDetails package = repo.getLatestPackageVersion("Package 1"); cout << endl << "Printing latest package version with name: Package 1"; package.print(); cout << endl; packages = repo.getPackageVersions("Package 2"); cout << endl << "Printing all Packages with name: Package 2"; for (auto packg : packages) { packg.print(); }*/ cout << endl; }