Groovy 通过XML-RPC访问带有groovy的snipplr

package net.nautsch.snipplr;

import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

class SnipplrRunner {

  static void main(args) {
	  XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl()
	  config.setServerURL(new URL("http://snipplr.com/xml-rpc.php"))
	  
	  XmlRpcClient client = new XmlRpcClient()
	  client.setConfig(config)
	  Object[] params = ["<insert your id here>"]
	                     
	  def boolean result = client.execute("user.checkkey", params)
	  println result
  }
}

Groovy 快速单元测试

class ConcurrentErrorTest extends GroovyTestCase {
	void testError(){
		shouldFail(ConcurrentModificationException){
			def list = [1,2,3]
			list.eachWithIndex{e, i->
				list.remove(i)
			}
		}
	}
}

Groovy 在jar文件中搜索条目

#!/usr/bin/env groovy

import java.util.jar.*

//Usage check.
if(args.size() <2){
	println "usage: ${this.class.name} searchstr jarfile [jarfile]"
	println "  jarfile can be a directory, which will include all jar files."
	return
}

//Collect args for jar files.
searchstr = args[0]
jarfiles = []
args[1..-1].each{ arg->
	file = new File(arg)
	if(file.isDirectory()){
		file.eachFileMatch(~/.*\.jar$/){ jarfiles.add(it) }
	}else{
		jarfiles.add(file)
	}
}
//println binding.variables

//Find and print the entry listing!
jarfiles.each{ file->
	jarfile = new JarFile(file)
	jarfile.entries().each{ entry->
		if (entry.name =~ searchstr){
			println "$entry.name : $file.canonicalPath"
		}
	}
}

Groovy 在索引处提取列

new StringReader('''
drwxrwxr-x   24 root    admin        816 Nov 26  2006 CPsrsc-50
drwxr-xr-x   13 zemian  zemian       442 Sep 20  2005 JChessBoard-1.5.z1
drwxr-xr-x   28 zemian  admin        952 Mar 13 21:14 PDFBox-0.7.3
drwxr-xr-x   18 zemian  admin        612 Apr  4  2006 abator-0.6.1-119
drwxr-xr-x   13 zemian  admin        442 Oct 24  2006 activemq-4.0.2
''').splitEachLine(/\s+/){ println it[-1] }

Groovy 列总和

new StringReader('''
drwxrwxr-x   24 root    admin        816 Nov 26  2006 CPsrsc-50
drwxr-xr-x   13 zemian  zemian       442 Sep 20  2005 JChessBoard-1.5.z1
drwxr-xr-x   28 zemian  admin        952 Mar 13 21:14 PDFBox-0.7.3
drwxr-xr-x   18 zemian  admin        612 Apr  4  2006 abator-0.6.1-119
''').readLines()[1..-2].inject(0){ sum, it -> sum += it.split(/\s+/)[4].toInteger() }

Groovy 修改XML文件结构(Java)

import java.io.FileWriter;
import java.io.File;
import java.io.IOException;

import org.dom4j.io.*;
import org.dom4j.*;


public class MyClass {
	
    public static void main(String[] args) {

        File dir = new File("in/emissions");
        File[] files = dir.listFiles();
        for (int i=0; i<files.length; i++) {
            if (!files[i].getName().endsWith(".xml")) {
                continue;
            }

            XMLWriter output = null;
            try {
                Element emission = new SAXReader().read(files[i]).getRootElement();

                Element sondage = emission.addElement("pr:sondage");
                sondage.addAttribute("xsi:nil", "true");
                sondage.setText("n/a");

                FileWriter writer = new FileWriter("out/" + files[i].getName());
                output = new XMLWriter(writer, OutputFormat.createPrettyPrint());

                output.write(emission);		
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DocumentException e)
                e.printStackTrace();
            } finally {
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Groovy svnremove.groovy从工作目录中删除所有svn删除的文件

#!/usr/bin/env groovy

// Remove all svn removed files from working dir
def wd = args.size()>0 ? args[0] : '.'
def svnStatusCmd = "svn st $wd"
def svnRemoveCmd = "svn rm "

svnStatusCmd.execute().text.split("\n").each{ line ->
        matcher = (line =~ /^\!\s+(.+)$/)
        if(matcher.find()){
                def file = matcher.group(1)
                def cmd = svnRemoveCmd + " " + file
                print cmd.execute().text
        }
}

Groovy Maven 2 Ant任务 - MavenDependency脚本

class MavenDependency {
    static void require(params) {
        MavenDependencyHelper.getInstance().require(params)
    }
    static MavenDependencyHelper using(classLoader) {
        MavenDependencyHelper.getInstance(classLoader)
    }
}

private class MavenDependencyHelper {
    private classLoader
    private MavenDependencyHelper(classLoader) {
        this.classLoader = classLoader
    }

    static MavenDependencyHelper getInstance(classLoader) {
        return new MavenDependencyHelper(classLoader)
    }

    static MavenDependencyHelper getInstance() {
        return new MavenDependencyHelper(MavenDependencyHelper.classLoader)
    }

    MavenDependencyHelper require(params) {
        def ant = new AntBuilder()
        def mvn = groovy.xml.NamespaceBuilder.newInstance(ant, 'antlib:org.apache.maven.artifact.ant')
        mvn.dependencies(filesetId:"artifact_${params.groupId}_${params.artifactId}_${params.version}") { dependency(params) }
        ant.fileScanner { fileset(refid:"artifact_${params.groupId}_${params.artifactId}_${params.version}") }.each {
            classLoader.addClasspath(it.toString())
        }
        this
    }
}

Groovy Maven 2 Ant任务 - MavenDependencyTest脚本

//		 no jfreechart imports required (we'll find them programmatically)
import groovy.swing.SwingBuilder
import static javax.swing.WindowConstants.EXIT_ON_CLOSE

class MavenDependencyTest extends GroovyTestCase {

	void testSomething() {
		def classLoader = Thread.currentThread().contextClassLoader

//		 load jars and add to classpath
		def maven = MavenDependency.using(classLoader)
		maven.require(groupId:'jfree', artifactId:'jfreechart', version:'1.0.5')
		maven.require(groupId:'jfree', artifactId:'jcommon', version:'1.0.9')

//		 define used classes/instances programmatically
		def factoryClass     = classLoader.loadClass('org.jfree.chart.ChartFactory')
		def orientationClass = classLoader.loadClass('org.jfree.chart.plot.PlotOrientation')
		def dataset = classLoader.loadClass('org.jfree.data.category.DefaultCategoryDataset').newInstance()

//		 normal code below here
		dataset.addValue 150, "no.1", "Jan"
		dataset.addValue 210, "no.1", "Feb"
		dataset.addValue 390, "no.1", "Mar"
		dataset.addValue 300, "no.2", "Jan"
		dataset.addValue 400, "no.2", "Feb"
		dataset.addValue 200, "no.2", "Mar"

		def labels = ["Bugs", "Month", "Count"]
		def options = [true, true, true]
		def chart = factoryClass.createLineChart(*labels, dataset,
		        orientationClass.VERTICAL, *options)
		def swing = new SwingBuilder()
		def frame = swing.frame(title:'Groovy LineChart',
		        defaultCloseOperation:EXIT_ON_CLOSE) {
		    panel(id:'canvas') { rigidArea(width:400, height:400) }
		}
		frame.pack()
		frame.show()
		chart.draw(swing.canvas.graphics, swing.canvas.bounds)
	}

}

Groovy 在Grails中标记:多对多

def setup = {
    new User(name:'user1').save(flush:true)
    new User(name:'user2').save(flush:true)

    tagsForUser1 = ['tag1','tag2']
    tagsForUser2 = ['tag1']

    u1 = User.findByName('user1')
    u2 = User.findByName('user2')
    
    //ITEM1 ***************************************************
    item1 = new Taggable(name:'item1')
    item1.user = u1
    tagsForUser1.each {
        t = Tag.findByName(it)
        if(!t) {
            t = new Tag(name:it).save()
        }
        item1.addToTags(new Tagging(user:u1,tag:t,taggable:item1))
    }
    item1.save(flush:true)
    
    //ITEM2 **************************************************
    item2 = new Taggable(name:'item2')
    item2.user = u2
    tagsForUser2.each {
        t = Tag.findByName(it)
        if(!t) {
            t = new Tag(name:it).save()
        }
        item2.addToTags(new Tagging(user:u2,tag:t,taggable:item2))
    }
    item2.save(flush:true)
}

//setup()

t = Tag.findByName('tag1')
itemsForUserAndTag = Taggable.withCriteria {
    and {
        eq('user', u2)
        tags {
            eq('tag', t)
        }
    }
}

itemsForTag = Taggable.withCriteria {
    tags {
        eq('tag', t)
    }
}

println "Items for user and tag: $itemsForUserAndTag.name"
println "Items for tag: $itemsForTag.name"