`

Show Your ToolBox——锋利的groovy

 
阅读更多

在工作中使用groovy做了很多辅助工具,这里以代码形式发出来,和喜欢groovy的童鞋们交流下

 

1. 文件操作类

1.1 清除.svn文件夹

import static groovy.io.FileType.*

new File('.').eachFileRecurse(DIRECTORIES, ~/^\.svn$/){
	it.delete()
}
 

 

1.2 在一堆jar中找一个class

 

import java.util.Enumeration
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import java.util.zip.ZipOutputStream

def findJarFile(File zipFile, String target){
	ZipFile zip = new ZipFile(zipFile)
	ZipEntry entry = null
	Enumeration<? extends ZipEntry> en = zip.entries()
	while (en.hasMoreElements()) {
		entry = en.nextElement()
		if (entry.isDirectory()) {
			continue
		}

		if(entry.name.endsWith(target)){
			println zipFile.name
			println entry
		}
	}
	zip.close()
}

String target = 'TESTMY.class'
new File('D:/lib').eachFile{
	if(it.name.endsWith('.jar'))
		findJarFile(it, target)
}

 

 

1.3 从mvn repository下载一个jar到groovy.conf的path下()

import groovy.grape.Grape

String dir_lib = System.getProperty('user.home').replaceAll("\\\\", '/') + 
	'/.groovy/lib/'
List mvn = [
	'org.apache.poi', 
	'poi', 
	'3.7'
]
Grape.grab(group:mvn[0], 
	module:mvn[1], version:mvn[2])

String jar_path = System.getProperty('user.home').replaceAll("\\\\", '/') + 
	'/.groovy/grapes/' + mvn[0] + '/' + mvn[1] + '/jars/' + mvn[1] + '-' + mvn[2] + '.jar'

def ant = new AntBuilder()
ant.copy file : jar_path, todir : dir_lib
 

1.4 比较文件夹下的文件不同

String path1 = 'D:/soft/eclipse/plugins/org.apache.ant_1.7.0.v200803061910/lib'

String path2 = 'C:/ANT_HOME/Apache-Ant-1.7.0/lib'

List ll = new File(path1).listFiles().collect{it.name}
List ll2 = new File(path2).listFiles().grep{it.name.endsWith('.jar')}.collect{it.name}

def ant = new AntBuilder()
(ll2 - ll).each{
	ant.copy todir : path1, file : path2 + '/' + it
}
 

1.5 下载一个url到本地文件(爬漫画弄个多线程,很给力的)

 

long begin = System.currentTimeMillis()
String url = 'http://**host.com/***'
new File('output.xml') << new URL(url).text
println System.currentTimeMillis() - begin

 

 

2. 用一些第三方库

2.1 jxl

import jxl.*

String path = "my.xls"
int begin_row = 1
List cols = 'a'..'l'
List ll = []

File file = new File(path)
Workbook wb =  Workbook.getWorkbook(file)
def sheet = wb.sheets[0]

for(i in begin_row..<sheet.rows){
	Map item = [:]
	cols.eachWithIndex{cc, j ->
		Cell cell = sheet.getCell(j, i)
		String content = cell.getContents()
		if(content == null)
			content = ''

		item[cc] = content
	}
	if(item[cols[0]])
		ll << item
}

// excel -> 到一个二位列表了ll,然后你就可以随心所欲了

  2.2 email

import java.security.Security;

import javax.mail.* 

final String POP3Host = '***'
final String userName = 'xx'
final String pwd = 'xxx'

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())
def prop = System.getProperties()
prop.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
prop.setProperty("mail.pop3.socketFactory.fallback", "false")
prop.put("mail.pop3.host", POP3Host)
prop.put("mail.imap.starttls.enable", "true")
prop.put("mail.debug", "true")
prop.setProperty("mail.pop3.port ", "995")
prop.setProperty("mail.pop3.socketFactory.port", "995")

def auth = [
	getPasswordAuthentication : {
		new PasswordAuthentication(userName, pwd)
	}
] as Authenticator
def s = Session.getDefaultInstance(prop, auth)
def store = s.getStore("pop3")  
store.connect(POP3Host, userName, pwd) 

Folder folder = store.getFolder("Inbox")  
folder.open(Folder.READ_ONLY) 

FetchProfile profile = new FetchProfile()  
profile.add(FetchProfile.Item.ENVELOPE) 
Message[] arr = folder.getMessages()
folder.fetch(arr, profile) 

println "收件箱的邮件数:" + arr.length  

folder.close(false) 
store.close()

 

2.3 css压缩

def ant = new AntBuilder()

String dir = 'cssjs'

ant.taskdef name: 'yuicompress', 
	classname: 'com.yahoo.platform.yui.compressor.YUICompressTask'

ant.yuicompress linebreak: 300, warn: 'false', munge: 'yes', 
	preserveallsemicolons: 'true', outputfolder: dir, {
		fileset dir: dir, {
			include name: '*.css'
		}
	}

  2.4 执行下fastjson方法

import com.alibaba.fastjson.JSON

import com.alibaba.fastjson.parser.Feature
import com.alibaba.fastjson.serializer.SerializerFeature

List ll = [[test: 'test']]
def sll = [] as SerializerFeature[]
def fll = [] as Feature[]

def bytes = JSON.toJSONBytes(ll, sll)

println JSON.parse(bytes, fll)

  2.5 jftp

import net.sf.jftp.net.* 
import net.sf.jftp.config.Settings

import org.apache.commons.io.IOUtils
   
String host = "xx"
int port = 22
String user = "xx"
String pwd = "xx"

String file = "/xx.txt"

Settings.bufferSize = 16384  
def con = new FtpConnection(host, port, "<default>")
con.setConnectionHandler(new ConnectionHandler()) 
con.login(user, pwd) 
           
InputStream is = con.getDownloadInputStream(file) 
IOUtils.copy(is, new FileOutputStream(new File(file)))
 

3. 文本分析类——这块就用起来比较多了,数据源可以是文本,excel,db,下面只贴一个我最近做的一个分析友盟(umeng.com)自定义事件的一个数据分析的代码(业务场景是ios的一个应用做一个发送、接收的动作,分析下一天中这些动作的错误情况),我贴这段代码没有实际参考价值,只能表明groovy可以做很多很多的事儿

import groovy.sql.Sql

final String format = 'yyyy-MM-dd'
final List versions = ['2.1.9', '2.2.0', 
	'2.2.1', '2.2.2', '2.2.3']
final List datRange = Date.parse(format, '2012-07-07')..Date.parse(format, '2012-07-09')
def pat = /,,,/

// 去掉第一行,取一天的数据和一个版本的数据
def ll = []
new File('umeng').eachFile{ff ->
	ll += ff.readLines()[1..-1]
}

// 中文字符对齐
def padRightGbk = {str, num ->
	return str
//	return str.padRight(num - str.bytes.size() + str.size())
}

def getLinesTarget = {dat, version ->
	def rll = ll.grep{
		it.contains(version)
	}

	if(dat)
		rll = rll.grep{it.startsWith(dat)}
	return rll
}

def printStat = {lines, version ->
	// 发送成功率统计
	def sendLl = lines.grep{
		def arr = it.split(pat)
		// 参数值
		String result = arr[2]
		return result.contains('上传开始') || 
			result.contains('上传结束')
	}.collect{
		def arr = it.split(pat)

		String dat = arr[0]
		
		// 参数值
		String result = arr[2]
		String reportId = result.split(' ')[0]
		String sendTimes = arr[4]

		String type = 'end'
		if(result.endsWith('上传开始'))
			type = 'start'

		boolean flag = false
		String typeEnd = 'endOk'

		// 发送成功,有结束返回且不是网络超时
		if(result.contains('上传结束')){
			if(result.endsWith('上传结束')){
				typeEnd = 'endOk'
				flag = true
			}else{
				if(result.contains('网络超时')){
					typeEnd = 'endTimeout'
				}else{
					typeEnd = 'endFail'
				}
			}
		}

		return [reportId: reportId, type: type, flag: flag, typeEnd: typeEnd, 
			sendTimes: Double.valueOf(sendTimes), dat: dat]
	}

	// ID列表
	def reportIdLl = sendLl.clone().collect{it.reportId}.unique().sort()
	def sendResultLl = reportIdLl.collect{reportId ->
		def llSub = sendLl.grep{it.reportId == reportId}
		// 最终发送成功的标示
		boolean isOk = llSub.any{'end' == it.type && it.flag}

		def startLl = llSub.grep{'start' == it.type}
		def endLlOk = llSub.grep{'end' == it.type && 'endOk' == it.typeEnd}
		def endLlFail = llSub.grep{'end' == it.type && 'endFail' == it.typeEnd}
		def endLlTimeout = llSub.grep{'end' == it.type && 'endTimeout' == it.typeEnd}

		int startSendTimes = 0
		if(startLl){
			startSendTimes = startLl.sum{it.sendTimes ?: 0}
		}

		int endSendTimesOk = 0
		if(endLlOk){
			endSendTimesOk = endLlOk.sum{it.sendTimes ?: 0}
		}

		int endSendTimesFail = 0
		if(endLlFail){
			endSendTimesFail = endLlFail.sum{it.sendTimes ?: 0}
		}

		int endSendTimesTimeout = 0
		if(endLlTimeout){
			endSendTimesTimeout = endLlTimeout.sum{it.sendTimes ?: 0}
		}

		return [isOk: isOk, reportId: reportId, 
			startNum: startLl.size(), 
			endNumOk: endLlOk.size(), 
			endNumFail: endLlFail.size(), 
			endNumTimeout: endLlTimeout.size(), 
			startSendTimes: startSendTimes, 
			endSendTimesOk: endSendTimesOk,
			endSendTimesFail: endSendTimesFail, 
			endSendTimesTimeout: endSendTimesTimeout, 
			dat: llSub ? llSub[0]['dat'] : '',
			version: version
			]
	}

	// 把分析出来的结果放到数据库里以利用sql进行分析
	if(sendResultLl){
		def p = [
		  url:'jdbc:h2:tcp://localhost/data/all/crashreport', 
		  u:'sa', 
		  p:'', 
		  driver:'org.h2.Driver'
		]
		def db = Sql.newInstance(p.url, p.u, p.p, p.driver)

		try {
			db.execute('''
			create table if not exists t_send_stat(
				is_ok boolean,
				report_id varchar, 
				
				start_num int,
				end_num_ok int,
				end_num_fail int,
				end_num_timeout int,
				
				start_times int,
				end_times_ok int,
				end_times_fail int,
				end_times_timeout int,

				dat date, 
				version varchar
			);
			'''
			)
			sendResultLl.each{
				db.executeInsert("""
				insert into t_send_stat values(
					?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
				)
				""",
				[it.isOk, it.reportId, 
					it.startNum, 
					it.endNumOk,
					it.endNumFail,
					it.endNumTimeout,
					it.startSendTimes,
					it.endSendTimesOk,
					it.endSendTimesFail,
					it.endSendTimesTimeout,
					it.dat,
					it.version])
			}
		}finally {
		    db.close()
		}
	}
	//def rows = new File('reportSendDept.txt').readLines().collect{
	//	def arr = it.split(pat)
	//	[REPORT_ID: arr[1], COMPANY_CODE: arr[-1]]
	//	// substring(0, 3)
	//}
	//sendResultLl.each{
	//	def item = rows.find{row -> row['REPORT_ID'] == it.reportId}
	//	it.dept = item ? item['COMPANY_CODE'] : '???'
	//}
	/*
	CREATE CACHED TABLE T_SEND_STAT(
		FLAG BOOL,
		REPORT_ID VARCHAR(20),
		NUM_START INT,
		NUM_END_OK INT,
		NUM_END_FAIL INT,
		TIMES_START INT,
		TIMES_END_OK INT,
		TIMES_END_FAIL INT,
		DEPT VARCHAR(10)
	);

	insert into T_SEND_STAT select csvread('data/reportSendDept.txt');
	*/

	// 总数
	int numAll = sendResultLl.size()
	if(!numAll)
		return

	// 发送总数
	int numOk = sendResultLl.grep{it.isOk}.size()
	int numFail = numAll - numOk

	// 无返回结果的发送
	int numFailWithNoErrorEnd = sendResultLl.grep{
		!it.isOk && it.endNumError == 0
	}.size()

	final int padNum = 30
//	print padRightGbk('总数', padNum) + ',' + numAll + ','
//	print padRightGbk('发送成功总数', padNum) + ',' + numOk + ','
//	print padRightGbk('发送失败总数', padNum) + ',' + numFail + '(其中无返回信息' + numFailWithNoErrorEnd + ')' + ','
//	print padRightGbk('发送成功率', padNum) + ',' + (numOk / numAll) + ','

	println '总数,发送成功总数,发送失败总数,其中无返回信息,发送成功率'
	print numAll
	print ','
	print numOk
	print ','
	print numFail
	print ','
	print numFailWithNoErrorEnd
	print ','
	print (numOk / numAll)
	print ','
	println ''

	// 计算消息数
	int startNum = sendResultLl.collect{it.startSendTimes ?: 1}.sum()

	// ****** ****** ****** ****** ****** ****** ****** ****** ******
	// ****** ****** ****** ****** ****** ****** ****** ****** ******
	// ****** ****** ****** ****** ****** ****** ****** ****** ******
	// 更新、发送时长统计
	def sendTimeLl = lines.grep{
		def arr = it.split(pat)
		// 参数
		String key = arr[1]
		return key in ['更新耗时', '上传耗时']
	}.collect{
		def arr = it.split(pat)

		String type = arr[1] == '上传耗时' ? 'up' : 'down'
		String secStr = arr[2]
		if(secStr.contains(':'))
			secStr = secStr.split(':')[1]

		return [type: type, sec: Double.valueOf(secStr), 
			sendTimes: Double.valueOf(arr[4])]
	}

	println '单个刷新总数,平均刷新时间,超7s次数,发送平均时长,超3分钟次数'
	if(sendTimeLl){
		def sendTimeLlDown = sendTimeLl.grep{'down' == it.type}
		if(sendTimeLlDown){
//			print padRightGbk('单个刷新总数', padNum) + ',' + sendTimeLlDown.sum{it.sendTimes ?: 0} + ','
//			print padRightGbk('平均刷新时间', padNum) + ',' + (sendTimeLlDown.sum{it.sec * it.sendTimes} / sendTimeLlDown.sum{it.sendTimes}) + ','
//			print padRightGbk('超7s次数', padNum) + ',' + sendTimeLlDown.grep{it.sec > 7}.size() + ','

			print sendTimeLlDown.sum{it.sendTimes ?: 0}
			print ','
			print (sendTimeLlDown.sum{it.sec * it.sendTimes} / sendTimeLlDown.sum{it.sendTimes})
			print ','
			print sendTimeLlDown.grep{it.sec > 7}.sum{it.sendTimes}
			print ','
		}else{
			print '??,??,??,'
		}

		def sendTimeLlUp = sendTimeLl.grep{'up' == it.type}
		if(sendTimeLlUp){
			print sendTimeLlUp.sum{it.sec * it.sendTimes} / sendTimeLlUp.sum{it.sendTimes}
			print ','
			print sendTimeLlUp.grep{it.sec > 3 * 60}.sum{it.sendTimes} ?: 0
			print ','
		}else{
			print '??,??,'
		}
	}
	println ''
}

def parseStat = {lines ->
	lines.grep{it.contains('上传开始')}.grep{
		def arr = it.split(pat)
		arr[4] != '1.0'
	}.each{
		println it
	}
}

for(version in versions){
	for(dat in datRange){
		String datStr = dat.format(format)
		println datStr + ',' + version.padRight(20)
		List lines = getLinesTarget(datStr, version)
		printStat(lines, version)
	}
}

 

下面一段是根据table ddl(oracle)生成一些项目框架需要的文件(ibatis之类的,abator等工具太不局限了,自己写想怎么生成就怎么生成,顺便推荐大家用用国人的smarty4j,很8错)

 

import xx.Tpl

String dir = './'
String tpl_dir = dir + 'tpl/'

String output_dir = dir + 'output/'
String scriptfile = 'dbscript.sql'
String ns = 'quotation'

File f = new File(dir, scriptfile)

final String begin = 'create table'
final String end = ');'

// 把分析出的表和字段信息保存到这个List中
List dto_ll = []

// 根据ORACLE字段类型对应Java类型
def get_type = {str ->
	if(str.contains('NUMBER'))
		return 'BigDecimal'
	switch (str) {
	    case ~/CHAR/:
	        return 'String'
	    case ~/DATE/:
	        return 'Date'
	    case ~/NUMBER/:
	        return 'BigDecimal'
	    default:
	        return 'String'
	}
}

// 大小写转换到驼峰格式
def get_name = {str ->
	String r = str.toLowerCase().split('_').collect{it.capitalize()}.join('')
	return r[0].toLowerCase() + r[1..-1]
}

// 设置表主键
def add_table_pk = {table, cols ->
	for(item in dto_ll){
		if(item.name.equalsIgnoreCase(table)){
			cols.split(/,/).collect{it.trim()}.each{
				for(col in item.cols){
					if(col.src_name.equalsIgnoreCase(it))
						col.is_pk = true
				}
			}
		}
	}
}

// 添加表注释
def add_table_comment = {table, comment ->
	for(item in dto_ll){
		if(item.name.equalsIgnoreCase(table)){
			item.comment = comment.replaceAll(/\r\n/, ' ')
		}
	}
}

// 添加表字段注释
def add_comment = {table, col, comment ->
	for(item in dto_ll){
		if(item.name.equalsIgnoreCase(table)){
			for(it in item.cols){
				if(it.name == get_name(col)){
					it.comment = comment.replaceAll(/\r\n/, ' ')
				}
			}
		}
	}
}

// 分析表和字段
def parse = { str ->
	def mat = str =~ /(?s)create table ([^\(]+) +\((.+)\);/
	if(!mat)
		return

	String table_name = mat[0][1].toLowerCase().trim()
	String columns = mat[0][2]

	Map item = [name: table_name, 
		clazz: get_name(table_name).capitalize(), cols : []]
	columns.split(',').each{
		def arr = it.split(/\s+/)
		if(arr.size() > 1){
			item.cols << [src_name: arr[0], name: get_name(arr[0]), type: get_type(arr[1])]
		}
	}
	dto_ll << item
}

// 每一行遍历SQL文件,先分析表和字段
StringBuffer buffer = new StringBuffer()
boolean is_begin = false
boolean is_end = true
f.eachLine{line ->
	line = line.trim()
	if(line){
		line = line.replace(/\s+/, ' ')
		if(is_end && line.startsWith(begin)){
			is_begin = true
			is_end = false
		}
		if(is_begin && line.endsWith(end)){
			buffer << line

			is_end = true
			is_begin = false

			parse(buffer.toString())
			buffer.delete(0, buffer.size())
		}

		if(is_begin && !is_end)
			buffer << line
	}
}

// 分析注释(字段)
def mat = f.text =~ /(?s)comment on column ([^;]+) is([^;]+);/
mat.each{
	String table_col = it[1].trim()
	String comment = it[2].replaceAll(/\'/, '').trim()
	
	def arr = it[1].split(/\./)
	String table = arr[0]
	String col = arr[1]

	add_comment(table, col, comment)
}
// 分析注释(表)
def mat2 = f.text =~ /(?s)comment on table ([^;]+) is([^;]+);/
mat2.each{
	String table = it[1].trim()
	String comment = it[2].replaceAll(/\'/, '').trim()
	
	add_table_comment(table, comment)
}

// 分析主外健
def mat3 = f.text =~ /(?s)alter table ([^ ]+)[^;]+primary key \(([^\)]+)\)/
mat3.each{
	String table = it[1].trim()
	String primary_key_cols = it[2].trim()

	add_table_pk(table, primary_key_cols)
}

// 现在已经获取到DDL的信息
// 先创建必要的文件夹
def ant = new AntBuilder()
ant.mkdir dir : output_dir
ant.mkdir dir : output_dir + 'dto'
ant.mkdir dir : output_dir + 'sql'
ant.mkdir dir : output_dir + 'xml'
ant.mkdir dir : output_dir + 'dao'
ant.mkdir dir : output_dir + 'daoImpl'
ant.mkdir dir : output_dir + 'service'
ant.mkdir dir : output_dir + 'serviceImpl'
ant.mkdir dir : output_dir + 'action'
ant.mkdir dir : output_dir + 'test'
ant.mkdir dir : output_dir + 'mock'

//dto_ll.each{
//	println it
//}

final String pkg = 'com.***.' + ns
Tpl.init(tpl_dir, 'gbk')

if(args){
	if(args[0] == 'add'){
		// 生成insert语句
		if(args.size() != 2){
			println '请输入表名!'
		}else{
			String table = args[1]
			for(item in dto_ll){
				if(item.name.equalsIgnoreCase(table)){
					String cols_str = item.cols*.src_name.join(', ')
					String cols_str2 = item.cols*.name.collect{"#" + it + "#"}.join(', ')
					println "insert into ${item.name} (${cols_str}) values (${cols_str2})"
					break
				}
			}
		}
	}else if(args[0] == 'update'){
		// 生成update语句
		if(args.size() != 2){
			println '请输入表名!'
		}else{
			String table = args[1]
			for(item in dto_ll){
				if(item.name.equalsIgnoreCase(table)){
					String cols_str = item.cols.collect{it.src_name + " = #" + it.name + "#"}.join(', ')
					println "update ${item.name} set ${cols_str} where ***"
					break
				}
			}
		}
	}else if(args[0] == 'mock'){
		// 生成dto mock对象
		def out = new FileWriter(new File(new File(output_dir + 'mock'), 
			'DTOMock.java'))
		int half = dto_ll.size() / 2 as int
		Tpl.out([pkg: pkg, clazz: 'Mock', ll: dto_ll[0..half]], 'Mock.java', out)
		def out2 = new FileWriter(new File(new File(output_dir + 'mock'), 
			'DTOMock2.java'))
		Tpl.out([pkg: pkg, clazz: 'Mock2', ll: dto_ll[half + 1..-1]], 'Mock.java', out2)

		println 'Done DTO Mock'
	}else if(args[0] == 'deploy'){
		final String to_dir = 'D:/CCShare/epcis_ahs_dev3.0.0/epcis_ahs/ahs_j2ee/src/'
		String pkg_dir = pkg.replaceAll(/\./, '/')

		// Copy Java
		['/dto' : output_dir + 'dto', 
			'/integration/dao' : output_dir + 'dao', 
			'/integration/dao/ibatis' : output_dir + 'daoImpl', 
			'/biz/service' : output_dir + 'service', 
			'/biz/service/impl' : output_dir + 'serviceImpl', 
			].each{k, v ->
			String dir_to = to_dir + 'java/' + pkg_dir + k
			ant.copy todir : dir_to, {
				fileset dir : v
			}
		}

		// Copy Sql
		// Copy Bean Xml
		ant.copy todir : to_dir + 'config/biz', {
			fileset dir : output_dir + 'sql'
			fileset dir : output_dir + 'xml'
		}		
		println 'Done Deploy'
	}else if(args[0] == 'deploy_clear'){
		final String to_dir = 'D:/CCShare/epcis_ahs_dev3.0.0/epcis_ahs/ahs_j2ee/src/'
		String pkg_dir = pkg.replaceAll(/\./, '/')

		// Delete Java
		['/dto' : output_dir + 'dto', 
			'/integration/dao' : output_dir + 'dao', 
			'/integration/dao/ibatis' : output_dir + 'daoImpl', 
			'/biz/service' : output_dir + 'service', 
			'/biz/service/impl' : output_dir + 'serviceImpl', 
			].each{k, v ->
			String dir_to = to_dir + 'java/' + pkg_dir + k
			ant.delete dir : dir_to
		}

		println 'Clear Deploy'
	}
}else{
	// -- 输出生成DTO Java文件
	// 父类
	final String parent_clazz = 'BaseDTO'
	// 父类的包名
	final String parent_clazz_pkg = 'com.xxx.dto'
	def params = [pkg: pkg]
	params.parent_clazz = parent_clazz
	params.parent_clazz_pkg = parent_clazz_pkg
	dto_ll.each{
		String clazz = get_name(it.name).capitalize()
		params.clazz = clazz
		params.cols = it.cols
		params.has_date = it.cols.any{col -> col.type == 'Date'}
		params.has_bigdecimal = it.cols.any{col -> col.type == 'BigDecimal'}
		params.comment = it.comment

		def out = new FileWriter(new File(new File(output_dir + 'dto'), 
			clazz + 'DTO.java'))
		Tpl.out(params, 'Dto.java', out)

		println 'Done DTO For ' + clazz
	}

	// -- 输出生成Sql Mapping文件
	def params_ll = []
	dto_ll.each{item ->
		def one = [:]
		
		String clazz = get_name(item.name)
		one.clazz = clazz.capitalize()
		one.clazz2 = clazz
		one.comment = item.comment
		one.pk_col = item.cols.grep{it.is_pk}*.name.join(',')

		String cols_str = item.cols*.src_name.join(', ')
		String cols_str2 = item.cols*.name.collect{"#" + it + "#"}.join(', ')
		one.insert_sql = "insert into ${item.name} (${cols_str}) values (${cols_str2})"

		String cols_str3 = item.cols.grep{!it.is_pk}.collect{it.src_name + " = #" + it.name + "#"}.join(', ')
		String cols_str4 = item.cols.grep{it.is_pk}.collect{it.src_name + " = #" + it.name + "#"}.join(' and ')
		one.update_sql = "update ${item.name} set ${cols_str3} where ${cols_str4}"
		String cols_str44 = item.cols.grep{it.is_pk}.collect{it.src_name + " = #value#"}.join(' and ')
		one.delete_sql = "delete from ${item.name} where ${cols_str44}"

		String cols_str5 = item.cols.collect{it.src_name + " " + it.name}.join(', ')
		one.select_sql = "select ${cols_str5} from ${item.name} where 1 = 1 and ${cols_str4}"

		params_ll << one
	}
	def out = new FileWriter(new File(new File(output_dir + 'sql'), "sqlmap-mapping-${ns}.xml"))
	Tpl.out([namespace: ns.capitalize(), pkg: pkg, ll: params_ll], 
		'sql-mapping.xml', out)
	println 'Done Sql'

	// -- 输出dao/serivce
	params_ll.each{
		def params_sub = [pkg: pkg] + it
		def out1 = new FileWriter(new File(new File(output_dir + 'dao'), it.clazz + 'DAO.java'))
		Tpl.out(params_sub, 'IDao.java', out1)

		def out2 = new FileWriter(new File(new File(output_dir + 'daoImpl'), it.clazz + 'IbatisDAO.java'))
		Tpl.out(params_sub, 'Dao.java', out2)
		println 'Done DAO For ' + it.clazz

		def out3 = new FileWriter(new File(new File(output_dir + 'service'), it.clazz + 'Service.java'))
		Tpl.out(params_sub, 'IService.java', out3)
		def out4 = new FileWriter(new File(new File(output_dir + 'serviceImpl'), it.clazz + 'ServiceImpl.java'))
		Tpl.out(params_sub, 'Service.java', out4)
		println 'Done Service For ' + it.clazz
	}

	// -- 输出bean定义
	def out2 = new FileWriter(new File(new File(output_dir + 'xml'), "biz-context-${ns}.xml"))
	Tpl.out([namespace: ns.capitalize(), pkg: pkg, ll: params_ll], 
		'bean.xml', out2)
	println 'Done Bean'

//	ant.zip basedir : dir, destfile : dir + '../my.zip'
}
 

4. 一些算法和无聊写的小程序

模拟下双色球中奖的概率

 

def range = 1..33

int len = 7
List his = [
	[num: 10000, result: [3,5,16,18,23,24,15]], 
]

def rand = new Random()

def play = {
	int cc = 0
	List ll = []
	while(1){
		int one = rand.nextInt(range.size()) + 1
		if(one in ll){
		}else{
			ll << one
		}

		if(ll.size() == len && his.any{it.result == ll}){
			def target = his.find{it.result == ll}

			println cc
			println target.num
			println cc / target.num
			println target

			cc = 0
			ll.removeAll()

			break
		}

		if(ll.size() > len){
			ll.removeAll()
		}

		cc++
	}
}

play()

 

附件是一个简单的数字图像识别的程序——很简单的笔画匹配思路,很弱智的,大家也可以看看

 

 

这些是我零零散散找到的最近写过的groovy脚本——很多只是用到了简单的groovy语言的语法和api,不过很有意思而且确实能给自己带来工作的方便,喜欢groovy的童鞋们,一起继续支持啦

 

 

还有就是建议不要使用eclipse和groovy的插件——不给力的,找个简单的文本编辑器,vim/notepad++/editplus之类的,弄个宏运行bat,更快捷些

  • img.rar (7.6 KB)
  • 下载次数: 11
分享到:
评论
1 楼 悲剧了 2012-08-11  

相关推荐

Global site tag (gtag.js) - Google Analytics