Details

    • Type: New Feature New Feature
    • Status: Open Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None
    • Number of attachments :
      0

      Description

      IMO, one of the most irritating issues with groovy are the heinous stacktraces. I made a request previously that they be cleaned up, but it was shot down because of performance issues.

      So how about another approach? Add a method to Exception class called: cleanStackTrace(). This method will pull out all the groovy specific stuff, leaving only the core exception.

      here is an example of an 500 line exception where 15 lines are actually useful java.lang.NoSuchFieldError:

      TRACE
      at com.webmethods.sc.logging.log4j.WmJournalLogger.<clinit>(WmJournalLogger.java:62)
      at com.webmethods.sc.logging.log4j.JavaUtilBridgeHandler.<clinit>(JavaUtilBridgeHandler.java:47)
      at com.webmethods.sc.logging.log4j.WmLogManager.initJulBridge(WmLogManager.java:225)
      at com.webmethods.sc.logging.log4j.WmLogManager.getJulBridge(WmLogManager.java:256)
      at com.webmethods.sc.logging.log4j.LoggerFactoryContext.setBaseLoggerName(LoggerFactoryContext.java:338)
      at com.webmethods.sc.logging.log4j.LoggerFactoryContext.<init>(LoggerFactoryContext.java:176)
      at com.webmethods.sc.logging.log4j.LoggerFactoryContext.<init>(LoggerFactoryContext.java:148)
      at com.webmethods.sc.logging.log4j.LoggerFactoryContext.<clinit>(LoggerFactoryContext.java:140)
      at com.webmethods.sc.logging.log4j.WmLoggerFactory.<init>(WmLoggerFactory.java:30)
      at com.webmethods.sc.logging.log4j.WmLoggerFactory.<init>(WmLoggerFactory.java:23)
      at com.webmethods.sc.logging.log4j.WmLoggerFactory.getInstance(WmLoggerFactory.java:37)
      at com.webmethods.optimize.logging.impl.LoggerSCGJournalImpl.<init>(LoggerSCGJournalImpl.java:29)
      at com.webmethods.optimize.logging.LoggingUtil.init(LoggingUtil.java:45)
      at com.webmethods.optimize.logging.LoggerInitializer.init(LoggerInitializer.java:54)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:725)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:716)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:163)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:188)
      at test.framework.util.UpdateDbConf.writeDbConf(UpdateDbConf.groovy:50)
      at test.framework.util.UpdateDbConf.this$2$writeDbConf(UpdateDbConf.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:361)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at test.framework.util.UpdateDbConf$_write_closure1.doCall(UpdateDbConf.groovy:37)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at groovy.lang.Closure.call(Closure.java:292)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1165)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1141)
      at org.codehaus.groovy.runtime.dgm$87.doMethodInvoke(Unknown Source)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:725)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:716)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:163)
      at test.framework.util.UpdateDbConf.write(UpdateDbConf.groovy:36)
      at test.framework.util.UpdateDbConf$write.call(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at db$_run_closure1.doCall(db.gant:32)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.DelegatingMetaClass.invokeMethod(DelegatingMetaClass.java:142)
      at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:127)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8_closure9.doCall(GantBinding.groovy:152)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8_closure9.doCall(GantBinding.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90)
      at org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:361)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:158)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8.doCall(GantBinding.groovy:152)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8.doCall(GantBinding.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at gant.Gant$_dispatch_closure5_closure14.doCall(Gant.groovy:333)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at groovy.lang.Closure.call(Closure.java:292)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1165)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1141)
      at org.codehaus.groovy.runtime.dgm$87.invoke(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:270)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:333)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at gant.Gant$_dispatch_closure5.doCall(Gant.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at gant.Gant.withBuildListeners(Gant.groovy:344)
      at gant.Gant.this$2$withBuildListeners(Gant.groovy)
      at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at gant.Gant.dispatch(Gant.groovy:333)
      at gant.Gant.this$2$dispatch(Gant.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:720)
      at gant.Gant.invokeMethod(Gant.groovy)
      at groovy.lang.GroovyObject$invokeMethod.callCurrent(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
      at gant.Gant.processTargets(Gant.groovy:495)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:266)
      at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:51)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
      at gant.Gant.processArgs(Gant.groovy:458)
      at gant.Gant$processArgs.call(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at gant.Gant.main(Gant.groovy:511)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:108)
      at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)
      java.lang.NullPointerException
      at com.webmethods.optimize.logging.LoggingUtil.stop(LoggingUtil.java:71)
      at com.webmethods.optimize.logging.LoggerInitializer.stop(LoggerInitializer.java:64)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:725)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:716)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:163)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:188)
      at test.framework.util.UpdateDbConf.writeDbConf(UpdateDbConf.groovy:79)
      at test.framework.util.UpdateDbConf.this$2$writeDbConf(UpdateDbConf.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:361)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at test.framework.util.UpdateDbConf$_write_closure1.doCall(UpdateDbConf.groovy:37)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at groovy.lang.Closure.call(Closure.java:292)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1165)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1141)
      at org.codehaus.groovy.runtime.dgm$87.doMethodInvoke(Unknown Source)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:725)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:716)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:163)
      at test.framework.util.UpdateDbConf.write(UpdateDbConf.groovy:36)
      at test.framework.util.UpdateDbConf$write.call(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at db$_run_closure1.doCall(db.gant:32)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.DelegatingMetaClass.invokeMethod(DelegatingMetaClass.java:142)
      at org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:127)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8_closure9.doCall(GantBinding.groovy:152)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8_closure9.doCall(GantBinding.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90)
      at org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:361)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:158)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8.doCall(GantBinding.groovy:152)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at org.codehaus.gant.GantBinding$_initializeGantBinding_closure4_closure8.doCall(GantBinding.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at gant.Gant$_dispatch_closure5_closure14.doCall(Gant.groovy:333)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at groovy.lang.Closure.call(Closure.java:292)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1165)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1141)
      at org.codehaus.groovy.runtime.dgm$87.invoke(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:270)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:333)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at gant.Gant$_dispatch_closure5.doCall(Gant.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at gant.Gant.withBuildListeners(Gant.groovy:344)
      at gant.Gant.this$2$withBuildListeners(Gant.groovy)
      at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:150)
      at gant.Gant.dispatch(Gant.groovy:333)
      at gant.Gant.this$2$dispatch(Gant.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:720)
      at gant.Gant.invokeMethod(Gant.groovy)
      at groovy.lang.GroovyObject$invokeMethod.callCurrent(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
      at gant.Gant.processTargets(Gant.groovy:495)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:266)
      at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:51)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:142)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
      at gant.Gant.processArgs(Gant.groovy:458)
      at gant.Gant$processArgs.call(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at gant.Gant.main(Gant.groovy:511)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:108)
      at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:130)

        Issue Links

          Activity

          Hide
          Russel Winder added a comment -

          At the point at which a stacktrace is being issued performance is no longer an issue since the program is going to terminate. This means that performance cannot be an issue with repect to making the information comprehensible.

          The actual issue here is the tension between telling the truth (i.e. that Groovy can take 20-30 meta-object protocol method calls just to implement a single user code method call) and focusing on the lines of the stack trace that relate directly to the user code.

          In this particular case, I suspect the only lines that are ever of interest are the ones relating directly to the user source which is db.gant, everything else is irrelevant implementation detail that only a person trying to prove that Groovy is inefficient would be interested in. So what is needed is a 4 stage output system:

          0. No output at all other than a statement that there was an exception.
          1. Just the statement that there was an exception and where it was raised in the user code.
          2. A trace of all the stack frames relating directly to the user source code.
          3. The full stack trace.

          Gant already does some manipulation of the stack trace on error output so perhaps this could be taken further within Gant even if it isn't handled in Groovy – which is where the base facility needs to be present, offered as an API so that applications like Gant can make use of it.

          If filtering the stack trace is deemed not the right thing then usability demands that the lines of the stack trace relating to the user code (as opposed to the infrastructure code) are highlighted in some way, perhaps in bold italic font, so that they can be picked out quickly when perusing the stack trace.

          The real point is that the current state is unacceptable from a usability perspective.

          PS It is also worth noting that the Groovy compilation is failing to add debugging information in some circumstances:

           at gant.Gant$processArgs.call(Unknown Source)
          

          whcih is not good.

          Show
          Russel Winder added a comment - At the point at which a stacktrace is being issued performance is no longer an issue since the program is going to terminate. This means that performance cannot be an issue with repect to making the information comprehensible. The actual issue here is the tension between telling the truth (i.e. that Groovy can take 20-30 meta-object protocol method calls just to implement a single user code method call) and focusing on the lines of the stack trace that relate directly to the user code. In this particular case, I suspect the only lines that are ever of interest are the ones relating directly to the user source which is db.gant, everything else is irrelevant implementation detail that only a person trying to prove that Groovy is inefficient would be interested in. So what is needed is a 4 stage output system: 0. No output at all other than a statement that there was an exception. 1. Just the statement that there was an exception and where it was raised in the user code. 2. A trace of all the stack frames relating directly to the user source code. 3. The full stack trace. Gant already does some manipulation of the stack trace on error output so perhaps this could be taken further within Gant even if it isn't handled in Groovy – which is where the base facility needs to be present, offered as an API so that applications like Gant can make use of it. If filtering the stack trace is deemed not the right thing then usability demands that the lines of the stack trace relating to the user code (as opposed to the infrastructure code) are highlighted in some way, perhaps in bold italic font, so that they can be picked out quickly when perusing the stack trace. The real point is that the current state is unacceptable from a usability perspective. PS It is also worth noting that the Groovy compilation is failing to add debugging information in some circumstances: at gant.Gant$processArgs.call(Unknown Source) whcih is not good.
          Hide
          Guillaume Laforge added a comment -

          The idea of an additional method isn't bad.
          Automatic filtering is a bit risky, at least in the sense that for debugging purpose, when it's a core-groovy error, we (groovy developers) would have sometimes difficulties helping out, since we'd misse the most important traces.
          Anyhow... copy pasting a huge stacktrace in the issue is one thing, but telling us what you'd filter out would be even better!

          Show
          Guillaume Laforge added a comment - The idea of an additional method isn't bad. Automatic filtering is a bit risky, at least in the sense that for debugging purpose, when it's a core-groovy error, we (groovy developers) would have sometimes difficulties helping out, since we'd misse the most important traces. Anyhow... copy pasting a huge stacktrace in the issue is one thing, but telling us what you'd filter out would be even better!
          Hide
          Peter Niederwieser added a comment -

          I agree that Groovy's stack traces are horrible from a usability standpoint. Of course, other alternative JVM languages have the same problem. Groovy should definitely ship with a stack trace filter that filters out all internal calls, and does so reliably. For example, the filter must not suppress lines resulting from user code doing reflection. Because such a filter will need to know about MOP internals, it should be maintained together with the MOP, and hence live in the Groovy codebase. (I once wrote a pretty good filter for Groovy 1.5, but with the MOP changes in 1.6 it became totally useless. Its whole filtering approach was no longer adequate.)

          Note that in general, Groovy cannot apply the filter itself. For example, when a JDK method throws an IllegalArgumentException, only code catching the exception can apply the filter. Hence, applying the filter is best left to code that ultimately renders the stack trace (catch block, app container, IDE, test framework, logging framework, etc.). But it's important that Groovy provides a good filter. Currently, every app (Grails, Spock, ...) invents its own filtering mechanism.

          > At the point at which a stacktrace is being issued performance is no longer an issue since the program is going to terminate
          Not quite true. Often, exceptions will just get logged and the program continues. Anyway, I'd rather increase the performance of my users than the performance of my app.

          > 2. A trace of all the stack frames relating directly to the user source code.
          We need to clarify what "relating directly to the user source code" means. What I'd like to be presented with is a Java-like stack trace. In other words, I do want to see that my call to the JDK's String.getBytes() method calls into StringCoding.encode(), but I don't want to see any MOP internals between a Groovy caller and a callee.

          > So what is needed is a 4 stage output system
          I think Groovy just needs a filter that removes all internal stuff. When/if to apply it is better left to code that processes the exception. That code will also decide if it just prints the exception message, or also the stack trace.

          > PS It is also worth noting that the Groovy compilation is failing to add debugging information in some circumstances
          I've also noticed this in Spock. I think it's a closure-related bug.

          > The idea of an additional method isn't bad.
          Yes, I like it too. Although just the tip of the iceberg, this method is definitely handy.

          Two more requirements I can think of:
          1. Apps should be able to extend the filter (e.g. Grails might want to suppress certain Spring classes).
          2. There should be a way to deactivate the filter from the outside, e.g. by setting a system property.

          Show
          Peter Niederwieser added a comment - I agree that Groovy's stack traces are horrible from a usability standpoint. Of course, other alternative JVM languages have the same problem. Groovy should definitely ship with a stack trace filter that filters out all internal calls, and does so reliably. For example, the filter must not suppress lines resulting from user code doing reflection. Because such a filter will need to know about MOP internals, it should be maintained together with the MOP, and hence live in the Groovy codebase. (I once wrote a pretty good filter for Groovy 1.5, but with the MOP changes in 1.6 it became totally useless. Its whole filtering approach was no longer adequate.) Note that in general, Groovy cannot apply the filter itself. For example, when a JDK method throws an IllegalArgumentException, only code catching the exception can apply the filter. Hence, applying the filter is best left to code that ultimately renders the stack trace (catch block, app container, IDE, test framework, logging framework, etc.). But it's important that Groovy provides a good filter. Currently, every app (Grails, Spock, ...) invents its own filtering mechanism. > At the point at which a stacktrace is being issued performance is no longer an issue since the program is going to terminate Not quite true. Often, exceptions will just get logged and the program continues. Anyway, I'd rather increase the performance of my users than the performance of my app. > 2. A trace of all the stack frames relating directly to the user source code. We need to clarify what "relating directly to the user source code" means. What I'd like to be presented with is a Java-like stack trace. In other words, I do want to see that my call to the JDK's String.getBytes() method calls into StringCoding.encode(), but I don't want to see any MOP internals between a Groovy caller and a callee. > So what is needed is a 4 stage output system I think Groovy just needs a filter that removes all internal stuff. When/if to apply it is better left to code that processes the exception. That code will also decide if it just prints the exception message, or also the stack trace. > PS It is also worth noting that the Groovy compilation is failing to add debugging information in some circumstances I've also noticed this in Spock. I think it's a closure-related bug. > The idea of an additional method isn't bad. Yes, I like it too. Although just the tip of the iceberg, this method is definitely handy. Two more requirements I can think of: 1. Apps should be able to extend the filter (e.g. Grails might want to suppress certain Spring classes). 2. There should be a way to deactivate the filter from the outside, e.g. by setting a system property.
          Hide
          blackdrag blackdrag added a comment -

          What we have is a stack trace sanatizing "tool" that is package based. Grails does use it too. The "tool" is configurable in which packages it will use to blend out trace parts. Why is this not good enough?

          Show
          blackdrag blackdrag added a comment - What we have is a stack trace sanatizing "tool" that is package based. Grails does use it too. The "tool" is configurable in which packages it will use to blend out trace parts. Why is this not good enough?
          Hide
          Russel Winder added a comment -

          I can only imagine because no-one knows about it or how to use it?

          Show
          Russel Winder added a comment - I can only imagine because no-one knows about it or how to use it?
          Hide
          Guillaume Laforge added a comment -

          We've mentioned it several times on most threads about cleaning stacktraces though
          That said, this proposed JIRA AND this stacktrace sanitizer brought together could be interesting for adding the visibility needed it seems.

          Show
          Guillaume Laforge added a comment - We've mentioned it several times on most threads about cleaning stacktraces though That said, this proposed JIRA AND this stacktrace sanitizer brought together could be interesting for adding the visibility needed it seems.
          Hide
          Phil Swenson added a comment -

          I should also note that the stack dump I posted made it past this line of code:

          }catch(Throwable e)

          { throw org.codehaus.groovy.runtime.StackTraceUtils.sanitize(e) }
          Show
          Phil Swenson added a comment - I should also note that the stack dump I posted made it past this line of code: }catch(Throwable e) { throw org.codehaus.groovy.runtime.StackTraceUtils.sanitize(e) }
          Hide
          Guillaume Laforge added a comment -

          What do you mean here Phil?
          The trace you pasted has clearly not been santized, otherwise, you wouldn't see most of these lines.
          I'm not sure I understand what you meant with your last comment.

          My current thinking is that we could create a cleanStackTrace() method on Throwable (in DefaultGroovyMethods), that would returned a cleaner trace (ie. an array of StackTraceElement). We could also have another cleanStackTrace() method taking a different list of packages to filter out than the default one.
          And then, we could add other GDK methods for StackTraceElement[] like print(), print(PrintWriter).

          What do you think?

          Show
          Guillaume Laforge added a comment - What do you mean here Phil? The trace you pasted has clearly not been santized, otherwise, you wouldn't see most of these lines. I'm not sure I understand what you meant with your last comment. My current thinking is that we could create a cleanStackTrace() method on Throwable (in DefaultGroovyMethods), that would returned a cleaner trace (ie. an array of StackTraceElement). We could also have another cleanStackTrace() method taking a different list of packages to filter out than the default one. And then, we could add other GDK methods for StackTraceElement[] like print(), print(PrintWriter). What do you think?
          Hide
          Russel Winder added a comment -

          From a Gant output perspective: I created gant.Gant.constructMessageFrom as a quick hack filter of stack traces trying to extract data useful to users of Gant. It isn't pretty and I am not sure it works as well as Gant users would like.

          The stack trace associated with a Throwable is already a sequence and hence iterable, I am not sure there is any added benefit in having it indexable.

          I think what might be more useful is to have something inspired by XPath/GPath, i.e. a function/method that iterates over a stack trace outputting information (or even a map of "interesting" items) according to some pattern or template for those stack items that meet the criteria specified by a second pattern. Or perhaps we can just use predicates – Groovy is good at doing that sort of thing.

          Show
          Russel Winder added a comment - From a Gant output perspective: I created gant.Gant.constructMessageFrom as a quick hack filter of stack traces trying to extract data useful to users of Gant. It isn't pretty and I am not sure it works as well as Gant users would like. The stack trace associated with a Throwable is already a sequence and hence iterable, I am not sure there is any added benefit in having it indexable. I think what might be more useful is to have something inspired by XPath/GPath, i.e. a function/method that iterates over a stack trace outputting information (or even a map of "interesting" items) according to some pattern or template for those stack items that meet the criteria specified by a second pattern. Or perhaps we can just use predicates – Groovy is good at doing that sort of thing.
          Hide
          Phil Swenson added a comment -

          Guillaume, I do have a }catch(Throwable e)

          { throw org.codehaus.groovy.runtime.StackTraceUtils.sanitize(e) }

          around my entire script. I just figured that util method didn't work right. I will revisit it as I'm pulling in some files dynamically, so perhaps there is something going on I don't get. I'll ask Russel about this as it's a gant script.

          I like your proposed solution.

          Show
          Phil Swenson added a comment - Guillaume, I do have a }catch(Throwable e) { throw org.codehaus.groovy.runtime.StackTraceUtils.sanitize(e) } around my entire script. I just figured that util method didn't work right. I will revisit it as I'm pulling in some files dynamically, so perhaps there is something going on I don't get. I'll ask Russel about this as it's a gant script. I like your proposed solution.
          Hide
          Peter Niederwieser added a comment -

          > The "tool" is configurable in which packages it will use to blend out trace parts. Why is this not good enough?
          Because such a filter is too coarse-grained and simplistic. What's needed is a filter that removes the Groovy internals and just that. I've tried the existing filter for Spock. The resulting stack traces still showed Groovy internals and at the same time missed lines critical for understanding what was going on. One way to achieve better results is to look for patterns (sequences of elements) in the stack trace. That's what I did for 1.5, and it worked quite well.

          Show
          Peter Niederwieser added a comment - > The "tool" is configurable in which packages it will use to blend out trace parts. Why is this not good enough? Because such a filter is too coarse-grained and simplistic. What's needed is a filter that removes the Groovy internals and just that. I've tried the existing filter for Spock. The resulting stack traces still showed Groovy internals and at the same time missed lines critical for understanding what was going on. One way to achieve better results is to look for patterns (sequences of elements) in the stack trace. That's what I did for 1.5, and it worked quite well.
          Hide
          blackdrag blackdrag added a comment -

          to get a better impression.. could you show such a cleaned stack trace, that doesn't meet your requirements and tell us what should be shown and what not?

          Show
          blackdrag blackdrag added a comment - to get a better impression.. could you show such a cleaned stack trace, that doesn't meet your requirements and tell us what should be shown and what not?
          Hide
          Phil Swenson added a comment -

          Jochen, ignore my comment about sanitize not working right. I clearly am doing something wrong... the stack trace I posted in theory went through the sanitizer, but it isn't sanitized. I wouldn't worry about it... I don't have time to debug the issue.

          Show
          Phil Swenson added a comment - Jochen, ignore my comment about sanitize not working right. I clearly am doing something wrong... the stack trace I posted in theory went through the sanitizer, but it isn't sanitized. I wouldn't worry about it... I don't have time to debug the issue.
          Paul King made changes -
          Field Original Value New Value
          Link This issue relates to GROOVY-5496 [ GROOVY-5496 ]

            People

            • Assignee:
              Unassigned
              Reporter:
              Phil Swenson
            • Votes:
              2 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: