class DependencyManagementHandler @@reactorHandler = ReactorHandler.new @@dependencyHandler = DependencyHandler.new @@mvnReactorization = MvnReactorization.new def handleDependencyManagement(project_dir) commonDependencyList = findCommonDependency(project_dir) putCommonDependencyInReactorPom(project_dir,commonDependencyList) removePluginversionFromChildModule(project_dir,commonDependencyList,"project/dependencies/dependency") removePluginversionFromChildModule(project_dir,commonDependencyList,"project/dependencyManagement/dependencies/dependency") puts "Dependecy management is done" end def findCommonDependency(project_dir) pomArr = @@reactorHandler.fetchGidArtifactIdAndVersionFromChildModule(project_dir,false) if !(pomArr.nil? || pomArr.empty?) allDepedencyList = Array.new allDependencyManagementList = Array.new masterList = Array.new pomArr.each do |eachPomPath| pom_document = @@reactorHandler.parse_xml_from_file(eachPomPath) dependencyList = findAllDepedenciesOfAProject(pom_document,"project/dependencies/dependency") allDepedencyList.push(dependencyList.uniq) dependencyManagementList = findAllDepedenciesOfAProject(pom_document,"project/dependencyManagement/dependencies/dependency",dependencyList) allDependencyManagementList.push(dependencyManagementList.uniq) mergedList = mergeDependencies(dependencyList,dependencyManagementList) filterList = addVersionOfMergedList(pom_document,mergedList) masterList.push(filterList.uniq) end commonDependencyList = findCommonDepedencyFromMasterList(masterList) return commonDependencyList end end def findCommonDepedencyFromMasterList(masterList) commonDependencyList = Array.new masterList.each_with_index do |eachPomDependencyList,index| if index==0 commonDependencyList = eachPomDependencyList else commonDependencyList = commonDependencyList & eachPomDependencyList end end return commonDependencyList end def findAllDepedenciesOfAProject(pom_document,tag,dependencyList=nil) commonDependencyArr = Array.new pom_document.css(tag).each do |eachDependency| gid = eachDependency.at("groupId").text artifactId = eachDependency.at("artifactId").text version=nil if !(eachDependency.at("version").nil?) version = eachDependency.at("version").text end fullArtifactId = "#{gid}:#{artifactId}:#{version}" deleteArtId = "#{gid}:#{artifactId}" if !(commonDependencyArr.include?fullArtifactId) if (!((!eachDependency.at("exclusions").nil?) and (eachDependency.at("exclusions").parent.name == "dependency") and (tag.include?"project/dependencyManagement"))) commonDependencyArr.push(fullArtifactId) elsif (!dependencyList.nil?) dependencyList.each do |eachEntry| eachEntryArr = eachEntry.split(":") ltstGrp = eachEntryArr[0] ltstArtifact= eachEntryArr[1] fullArtifact = "#{ltstGrp}:#{ltstArtifact}" if (fullArtifact == deleteArtId) dependencyList.delete(eachEntry) end end end end end return commonDependencyArr end def mergeDependencies(allDepedencyList,allDependencyManagementList) dependencyListWithoutVersion = Array.new dependencyManagementListWithoutVersion = Array.new allDepedencyList.each do |eachDependency| eachDependencyArr = eachDependency.split(":") cordinateDepedency = "#{eachDependencyArr[0]}:#{eachDependencyArr[1]}" dependencyListWithoutVersion.push(cordinateDepedency) end allDependencyManagementList.each do |eachDependency| eachDependencyArr = eachDependency.split(":") cordinateDepedency = "#{eachDependencyArr[0]}:#{eachDependencyArr[1]}" dependencyManagementListWithoutVersion.push(cordinateDepedency) end commonDependencyList = dependencyListWithoutVersion & dependencyManagementListWithoutVersion uncommonDependencyList = (dependencyListWithoutVersion+dependencyManagementListWithoutVersion) - (dependencyListWithoutVersion&dependencyManagementListWithoutVersion) mergedList = commonDependencyList + uncommonDependencyList return mergedList end def addVersionOfMergedList(pom_document,mergedList) filterMergedList = Array.new mergedList.each do |eachEntry| dependecyNode = pom_document.css ("project/dependencies/dependency") dependecyManagementNode = pom_document.css ("project/dependencyManagement/dependencies/dependency") dependecies = findVersionFromDependency(eachEntry,dependecyNode) if dependecies.nil? dependecies = findVersionFromDependency(eachEntry,dependecyManagementNode) end filterMergedList.push(dependecies) end return filterMergedList end def findVersionFromDependency(eachEntry,nodeObj) cordinatedependency = nil nodeObj.each do |eachNode| gid = eachNode.at("groupId").text artifactId = eachNode.at("artifactId").text fullDependency = "#{gid}:#{artifactId}" if fullDependency == eachEntry if (eachNode.at("version") and eachNode.at("version").parent.name == "dependency") version = eachNode.at("version").text cordinatedependency = "#{fullDependency}:#{version}" end end end return cordinatedependency end def putCommonDependencyInReactorPom(project_directory,commonList) pomPath = "#{project_directory}/pom.xml" pom_document = @@reactorHandler.parse_xml_from_file(pomPath) if commonList.length>0 nokObj = Nokogiri::XML::Node projectNode = pom_document.at("project") dependencyManagementNode = nokObj.new("dependencyManagement",projectNode) dependenciesNode = nokObj.new("dependencies",projectNode) commonList.each do |eachDependency| dependencyArr = eachDependency.split(":") gid = dependencyArr[0] artifactId = dependencyArr[1] version = dependencyArr[2] dependencyNode = nokObj.new("dependency",projectNode) grpNode = nokObj.new("groupId",projectNode) grpNode.content=gid artifactNode = nokObj.new("artifactId",projectNode) artifactNode.content=artifactId versionNode = nokObj.new("version",projectNode) versionNode.content=version dependencyNode.add_child(grpNode) dependencyNode.add_child(artifactNode) dependencyNode.add_child(versionNode) dependenciesNode.add_child(dependencyNode) end dependencyManagementNode.add_child(dependenciesNode) @@dependencyHandler.add_node_element('//project', dependencyManagementNode, pom_document) @@mvnReactorization.write_nokogiri_to_xml(pomPath, pom_document) puts "Dependency management is added in reactor pom" end end def removePluginversionFromChildModule(project_directory,commonList,tag) pomArr = @@reactorHandler.fetchGidArtifactIdAndVersionFromChildModule(project_directory,false) if !(pomArr.nil? || pomArr.empty?) pomArr.each do |eachPomPath| pom_document = @@reactorHandler.parse_xml_from_file(eachPomPath) pom_document.css(tag).each do |eachDependency| fullDepedency=nil grpId = eachDependency.at("groupId").text artifactId = eachDependency.at("artifactId").text partialDependency = "#{grpId}:#{artifactId}" if (!eachDependency.at("version").nil?) version = eachDependency.at("version").text fullDepedency = "#{grpId}:#{artifactId}:#{version}" if (commonList.include?fullDepedency) if (tag.include?"dependencyManagement/") eachDependency.remove else eachDependency.at("version").remove end end end end @@mvnReactorization.write_nokogiri_to_xml(eachPomPath, pom_document) end end end end