项目需求:把指定的Spring配置文件的指定密码提取出来,用Spring风格的占位符取代。
并把取出的密码集中保存到唯一的properties格式的文件中。
完整的项目代码和资源请查看附件。
build.gradle
apply plugin: 'groovy' repositories { mavenLocal() mavenCentral() } dependencies { compile 'org.codehaus.groovy:groovy-all:2.3.7' compile 'org.apache.ant:ant:1.9.4' testCompile 'junit:junit:4.11' testCompile 'commons-io:commons-io:2.2' } sourceSets { main { groovy { srcDirs = ['./src/main/groovy'] include 'Main.groovy' } } test { groovy { srcDirs = ['./src/test/groovy'] } } } task runScript(type: JavaExec) { description 'Run Groovy script' // Set main property to name of Groovy script class. main = 'Main' // Set classpath for running the Groovy script. classpath = sourceSets.main.runtimeClasspath } defaultTasks 'runScript'
Main.groovy
import groovy.util.Node import groovy.xml.XmlUtil public class Main{ public static final String LINE_SEPARATOR = System.getProperty("line.separator") boolean extractPassword(Node root, def map){ boolean update = false String beanId String propertyName for(def entry: map.entrySet()){ beanId = entry.key.split('_')[0] propertyName = entry.key.split('_')[-1] def node = root.find{ it."@id" == beanId }.find{ it."@name" == propertyName } String password = node.attribute("value") if( password ==~ /\$\{.*?\}/ ){ println "It's already a place-holder of Spring style. Skip." continue } node."@value" = '${' + entry.key + '}' entry.value = password update = true //println XmlUtil.serialize(node) } return update } void saveXml(String fileName, Node xml){ def writer = new FileWriter(fileName) def printer = new XmlNodePrinter(new PrintWriter(writer)) printer.preserveWhitespace = true printer.print(xml) } void saveSstsConfiguration(String fileName, def map){ File file = new File(fileName) Properties props = new Properties() file.withInputStream{ stream -> props.load(stream) } boolean update = false map.entrySet().each{ entry-> if(props[entry.key] == null){ if( !(entry.value ==~ /\$\{.*?\}/) ){ file.append(LINE_SEPARATOR + "${entry.key}=${entry.value}") update = true } } } if(update){ file.append(LINE_SEPARATOR) } } static main(args){ Main obj = new Main() String fileName = "./src/main/resources/Spring-Config.xml" def map = ["database_password":"", "sybase_password":""] File file = new File(fileName) Node root = new XmlParser().parseText(file.getText()) boolean update = obj.extractPassword(root, map) if(update){ new AntBuilder().copy( file:fileName, tofile:fileName + "_Bak") obj.saveXml(fileName, root) String sstsConfiguration = "./src/main/resources/ssts.configuration" new AntBuilder().copy( file:sstsConfiguration, tofile:sstsConfiguration + "_Bak") obj.saveSstsConfiguration(sstsConfiguration, map) }else{ println "No update and no replication." } println map } }
MainTest.groovy
import org.junit.* import static org.junit.Assert.* import org.apache.commons.io.FileUtils import groovy.util.AntBuilder import groovy.xml.XmlUtil import groovy.util.Node import org.apache.commons.io.FileUtils class MainTest { private obj = null static final String input = '''<beans xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bean id="database" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/> <property name="username" value="root"/> <property name="password" value="sa"/> </bean> <bean id="sybase" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/> <property name="username" value="root"/> <property name="password" value="ind_suezssts"/> </bean> </beans> ''' static final String target = '''<beans xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bean id="database" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/> <property name="username" value="root"/> <property name="password" value="${database_password}"/> </bean> <bean id="sybase" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/> <property name="username" value="root"/> <property name="password" value="${sybase_password}"/> </bean> </beans> ''' static def map = null static Node root static Node xml @BeforeClass public static void enter(){ } @Before public void setUp(){ root = new XmlParser().parseText(input) xml = new XmlParser().parseText(target) obj = new Main() map = ["database_password":"", "sybase_password":""] } @Test public void extractPasswordReturnTrue(){ boolean result = obj.extractPassword(root, map) def mymap = ["database_password":"sa", "sybase_password":"ind_suezssts"] assertTrue result assertEquals mymap,map assertEquals XmlUtil.serialize(xml), XmlUtil.serialize(root) } @Test public void extractPasswordReturnFalse(){ Node myxml = new XmlParser().parseText(target) boolean result = obj.extractPassword(xml, map) def mymap = ["database_password":"", "sybase_password":""] assertFalse result assertEquals mymap,map assertEquals XmlUtil.serialize(myxml), XmlUtil.serialize(xml) } @Test public void saveXml(){ //String fileName, Node xml String fileName = "./src/test/resources/test-A.xml" new File(fileName).delete() obj.saveXml(fileName, xml) assertTrue new File(fileName).exists() Node myxml = new XmlParser().parseText(new File(fileName).getText()) assertEquals XmlUtil.serialize(myxml), XmlUtil.serialize(xml) } // void saveSstsConfiguration(String fileName, def map){ @Test public void saveSstsConfiguration(){ String fileName = "./src/test/resources/ssts.configuration.test" String fileTarget = "./src/test/resources/ssts.configuration.target" new File(fileName).write("") boolean result = obj.extractPassword(root, map) obj.saveSstsConfiguration(fileName, map) assertEquals(FileUtils.readLines(new File(fileName)), FileUtils.readLines(new File(fileTarget))); } }
项目结构:
G:\share\groovy\centralize-password>tree 卷 DOC 的文件夹 PATH 列表 卷序列号为 9AC5-4EB7 G:. ├─src │ ├─main │ │ ├─groovy │ │ └─resources │ └─test │ ├─groovy │ └─resources
相关推荐
随着城镇人口居住的集中化加剧,传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个通过数据库集成各种公共信息资源统一管理的管理系统来代替传统的文件管理,以提高物管的工作效率、为住户提供更好的...
系统启动权限管理功能 电机运行功能 电机堵转保护措施 用电保护功能 边列密码锁定保护功能 节能功能 档案库房一体化智能管理系统全文共19页,当前为第16页。 实体档案管理系统 档案管理 自定义档案库模板,根据模板...
一款真正的网络版桶装水送水业务管理系统,适用于总店-分店模式的连锁店经营,软件能够通过互联网访问总部数据,数据既能集中化管理,各水店又能独立运营,软件具有严格的权限分配,操作数据更加放心。 软件主要...
kongx(最新版本2.2.0)是网关kong的可视化界面管理平台(参考konga的部分界面布局方式),能够集中化管理应用不同环境的网关配置,提供同步各环境的网关配置功能,并且具备规范的权限管理、参数配置、环境管理及日志...
运行管理中心是一款致力于软件监控与问题排查的平台软件,可提供自动化指标检测和告警、批量集中部署配置、 软件版本管理、 高效日志分析等功能,帮助用户及时发现和解决问题,提升交付和运维效率,为业务平台提供...
为了解决上述问题,目前需要利用所学知识,采用软件工程学的研究方法,设计出一个集中管理、分散操作、信息共享、便于操作的数字化综合信息管理系统。 关键词:软件工程;信息共享;就业协议;信息化管理 部署方式:...
主要功能有: 1、会员管理:会员注册、会员资料修改、密码...8、服务器集群管理:可以对无数定个服务器进行集中管理 9、域名实时注册:提供中国频道及国外两种域名实时注册接口 10、站点在线实时开通、删除、修改等
随着城镇人口居住的集中化加剧,传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个专门的管理系统。来提高物管的工作效率、为住户提供更好的服务。随着人民生活水平不断提高,人们对生活环境要求日益...
此系统是基于ASP+ACCESS技术开发的电子商务平台,运行安全,稳定,快速,全自动化、全智能的在线方式管理、维护、更新的企业网站管理系统。提供下载的整站,程序源码,功能完全,欢迎大家下载使用,提出建议,使这一套企业...
We7 CMS 是一套采用C#开发的,基于.net2.0,可以运行于Oracle、SQLite、Sqlserver、MySQL、Access等数据库之上的网站内容管理系统软件(Content Manage System,简称CMS)。 We7 CMS v2.8将更多的注意力集中在了...
通过部署安全的集中式保管库来存储和访问密码,从而消除了密码疲劳和安全漏洞; 2.通过自动化关键系统中所需的频繁密码更改,多次提高了IT生产力。通过批准工作流和有关密码访问的实时警报进行侦探性安全控制4.满足...
企业员工信息管理系统是一个基于Spring和SpringMVC技术栈开发的企业资源规划(ERP)组件,它通过提供一个集中化的平台来优化人力资源管理流程。该系统的核心功能包括: 密码修改:允许员工和管理员安全地更新账户...
基于JSP企业员工信息管理系统设计软件程序源码+数据库+WORD毕业设计论文文档. 企业员工信息管理系统主要用于实现公司的员工相关信息管理,基本功能包括...员工信息管理系统设计的主要目的是对企业员工的信息进行集中管
客户关系管理系统(CRM):集中管理客户信息,优化销售、营销和服务流程,提升客户满意度和忠诚度。 供应链管理系统(SCM):整合供应商、制造商、分销商、零售商等供应链各环节,实现物流、资金流、信息流的协同...
系统可以提供信息显示和相应服务,其管理员管理宿管员,管理学生,修改密码,维护个人信息。宿管员管理公寓资产,缴费信息,公共场所清理信息,日常事务信息,审核学生床位安排信息。学生查看公共场所清理信息,日常...
我们开发图书 管理信息系统就是采用现代化的信息管理方式代替手工管理方式,提高图书管理工作效 率,作到信息的规管理,科学统计和快速查询,让图书馆更好的为学校,社会服务。 1.2.2 经济可行性 目标系统开发需求...
系统可以提供信息显示和相应服务,其管理员管理宿管员,管理学生,修改密码,维护个人信息。宿管员管理公寓资产,缴费信息,公共场所清理信息,日常事务信息,审核学生床位安排信息。学生查看公共场所清理信息,日常...
系统可以提供信息显示和相应服务,其管理员管理宿管员,管理学生,修改密码,维护个人信息。宿管员管理公寓资产,缴费信息,公共场所清理信息,日常事务信息,审核学生床位安排信息。学生查看公共场所清理信息,日常...
系统可以提供信息显示和相应服务,其管理员管理宿管员,管理学生,修改密码,维护个人信息。宿管员管理公寓资产,缴费信息,公共场所清理信息,日常事务信息,审核学生床位安排信息。学生查看公共场所清理信息,日常...