Thursday, September 3, 2009

Scala based automatic resource freeing

Using following scala resource, one freely release resources like(InputStrea, OutputStream, Sockets, JDBC Connection, JDBC ResultSet, JDBC Statements, SSLSocket, ServerSocket)

Source
Example Usage

ResourceTest.scala

object ResourceTest {
import java.sql.{Connection,ResultSet}
val OraPool = ConnPool("orahost152:1521",3, Db ) // some how get oracle jdbc connection

def main ( args : Array[String] ): Unit = {
Resource.use (OraPool.getConnection){ conn =>
val ts = find(conn)
for ( v <- ts ) println(v)
}
}
case class Tab(tname: String, tabtype: String)

def find(conn: Connection): List[Tab] = {
Resource.use(conn.createStatement){st =>
Resource.use (st.executeQuery("select tname,tabtype from tab")){ rs =>
import scala.collection.mutable.ListBuffer
var list = List[Tab]()
while(rs.next()){
list ::= Tab(rs.getString("tname"), rs.getString("tabtype"))
}
list
}
}
}
}

Thursday, February 19, 2009

Find javac tasks in build.xml that does compile without line-number information

Majority of ANT build files for java proje use javac-task for compiling the java files. But if the javac task does not have debug=true or debug=yes, then compiled java-class files does not contain line numbers in stacktraces. Following groovy script will check all build files in given file and check all javac taks that does not have debug-flags setting off


def s1=System.currentTimeMillis()
def f = new File('c:/all_build_files.txt')
def counter=0
def error=0
def noDebug=0
def noJavac=0
def debug=Boolean.getBoolean("debug")
f.eachLine{
try{
def file=it
def project = new XmlSlurper().parse(new File(file))
def tasks = project.target.javac
if( tasks.size() > 0){
noJavac++
if(debug) println "javac tasks: ${tasks.size()}"
def found=true
def nfound=0
tasks.each{
def flag=it.@debug
if (!( flag =~ /yes/ || flag =~ /true/ )) {
nfound++
found=false
}
}
if(!found) {
noDebug++
println "${nfound} : ${file}"
}
}
counter++
}catch(Exception e){
error++
if(debug) println "${it} --> ${e}"
}
}
def s2=System.currentTimeMillis()
def sd=s2-s1
println "Parsed files:${counter}, Errors:${error}, noDebug:${noDebug}, Javac:${noJavac} Time in millis:${sd}"




Run the above script(buildFile.groovy) using:


C:\>groovy -Ddebug=1true buildFile.groovy 2>nul


...
1 : C:\src\nb-src\main\xtest\build.xml
2 : C:\src\nb-src\main\xtest\pes\build.xml
2 : C:\src\nb-src\main\xtest\plugins_src\ide\build.xml
1 : C:\src\nb-src\main\xtest\plugins_src\jvm\build.xml
Parsed files:4866, Errors:29, noDebug:722, Javac:839 Time in millis:11859