GORM outside Grails

View: New views
11 Messages — Rating Filter:   Alert me  

GORM outside Grails

by cjmason :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Can anyone help update this code for grails 1.0.3?

http://jweldin.com/blog/?p=6

Does anyone have this working?  (I see several posts but none of them
seem to have successful resolutions.)

Thanks so much!

-c


import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import org.codehaus.groovy.grails.commons.*;
import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
import org.hibernate.SessionFactory;
import org.springframework.core.io.*;
import org.springframework.core.io.support.*
import org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
import org.codehaus.groovy.grails.compiler.injection.ClassInjector;

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

            if (args.length < 2) {
                    println "Usage: java -jar profiler-script.jar <db.props> <script
name> <script args>"
            }

         GrailsApplication grailsApplication = null;
         SessionFactory sessionFactory = null;

         PathMatchingResourcePatternResolver resolver = new
PathMatchingResourcePatternResolver();

         Resource[] groovyFiles =
resolver.getResources("classpath*:**grails-app/**/*.groovy");

         grailsApplication = new DefaultGrailsApplication(groovyFiles);

            GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
            gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector() ] as
ClassInjector[])

         DefaultGrailsDomainConfiguration config = new
DefaultGrailsDomainConfiguration();
         config.setGrailsApplication(grailsApplication);

         Properties props = new Properties();
            props.load(new FileInputStream(args[0]));
         config.setProperties(props);

         sessionFactory = config.buildSessionFactory();

         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
grailsApplication);

         GroovyClassLoader cl = gcl //grailsApplication.getClassLoader()

         println "\n-----------\nBefore Main\n-----------\n"

            Binding b = new Binding(args[3..args.length-1] as String[])
         def TestDomainScript =
(Script)cl.loadClass(args[1],false,true).newInstance(b)
         TestDomainScript.run()

         println "\n-----------\nAfter Main\n-----------\n"
         println "\nDone";

     }
}


import
org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation;
import org.codehaus.groovy.grails.compiler.injection.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.classgen.GeneratorContext;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilationUnit;
import org.codehaus.groovy.control.Phases;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
import org.codehaus.groovy.grails.commons.GrailsResourceUtils
import org.codehaus.groovy.grails.compiler.GrailsClassLoader;

public class MyInjectionOperation extends GrailsInjectionOperation
{
       
         private static GrailsDomainClassInjector injector = new
DefaultGrailsDomainClassInjector();;
        private GrailsResourceLoader resourceLoader;
       
        public void call(SourceUnit source, GeneratorContext context, ClassNode
classNode) throws CompilationFailedException
         {
               
                 if(resourceLoader != null)
                 {
                        try {
                                URL url;
                                if(GrailsResourceUtils.isGrailsPath(source.getName()))
                                 {
                                        url =
resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.getName()));
                                }
                                else
                                 {
                                        url = resourceLoader.loadGroovySource(source.getName());
                                }
                                if(GrailsResourceUtils.isDomainClass(url))
                                 {
 
this.injector.performInjection(source,context,classNode);
                                }
                               
                        }
                         catch (MalformedURLException e)
                         {
                                println("Error loading URL during addition of compile time
properties: " + e.getMessage(),e);
                                throw new CompilationFailedException(Phases.CONVERSION,source,e);
                        }
                }
        }
       
        public void setResourceLoader(GrailsResourceLoader resourceLoader)
         {
                this.resourceLoader = resourceLoader;
        }
}




---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by cjmason :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Clarifying:

So there are two projects that purport to allow one to use grails
without having a web server around:

http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
which is based on:
http://jweldin.com/blog/?p=6

However, both are over a year old and don't compile.  Both use this
constructor:

       application =
          new DefaultGrailsApplication( groovyFiles, new
GormInjectionOperation() )

which, it seems, no longer exists.

My suspicion is that this configuration is all done now via Spring.  Is
this true?

I'm trying to read through the grails Gant scripts source to figure out
how grails starts up, but it's not clear yet.  I've tried various
methods on GrailsUtil like:

   GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
or
   ApplicationContext appContext = GrailsUtil
        .bootstrapGrailsFromClassPath()
   DefaultGrailsApplication grailsApplication =
        (DefaultGrailsApplication)appContext
           .getBean("grailsApplication", D
             efaultGrailsApplication.class);

but this seems to result in class not found errors, I assume because the
Gant scripts are responsible for classpathy stuff that I'm not yet doing
(eg Init.groovy:setClasspath()). Am I headed in the right direction?

If I simply omit the GormInjectionOperation from the code posted above,
obviously, none of the GORM methods are available on doman objects.

Any hints would be most appreciated.  My goal is something I can run via
java -jar that will execute a groovy script using GORM domain classes.

I offer beer to anyone who can help me get this working!  And I promise
to post it somewhere for all to read!

-c


Christopher Mason wrote:

>
> Can anyone help update this code for grails 1.0.3?
>
> http://jweldin.com/blog/?p=6
>
> Does anyone have this working?  (I see several posts but none of them
> seem to have successful resolutions.)
>
> Thanks so much!
>
> -c
>
>
> import groovy.lang.GroovyClassLoader;
> import groovy.lang.GroovyObject;
> import org.codehaus.groovy.grails.commons.*;
> import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
> import org.hibernate.SessionFactory;
> import org.springframework.core.io.*;
> import org.springframework.core.io.support.*
> import org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
> import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
>
> class RunScript
> {
>     public static void main(String[] args)
>     {
>
>         if (args.length < 2) {
>             println "Usage: java -jar profiler-script.jar <db.props>
> <script name> <script args>"
>         }
>
>         GrailsApplication grailsApplication = null;
>         SessionFactory sessionFactory = null;
>
>         PathMatchingResourcePatternResolver resolver = new
> PathMatchingResourcePatternResolver();
>
>         Resource[] groovyFiles =
> resolver.getResources("classpath*:**grails-app/**/*.groovy");
>
>         grailsApplication = new DefaultGrailsApplication(groovyFiles);
>
>         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
>         gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector() ]
> as ClassInjector[])
>
>         DefaultGrailsDomainConfiguration config = new
> DefaultGrailsDomainConfiguration();
>         config.setGrailsApplication(grailsApplication);
>
>         Properties props = new Properties();
>         props.load(new FileInputStream(args[0]));
>         config.setProperties(props);
>
>         sessionFactory = config.buildSessionFactory();
>
>         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
> grailsApplication);
>
>         GroovyClassLoader cl = gcl //grailsApplication.getClassLoader()
>
>         println "\n-----------\nBefore Main\n-----------\n"
>
>         Binding b = new Binding(args[3..args.length-1] as String[])
>         def TestDomainScript =
> (Script)cl.loadClass(args[1],false,true).newInstance(b)
>         TestDomainScript.run()
>
>         println "\n-----------\nAfter Main\n-----------\n"
>         println "\nDone";
>
>     }
> }
>
>
> import
> org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation;
> import org.codehaus.groovy.grails.compiler.injection.*;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.codehaus.groovy.ast.ClassNode;
> import org.codehaus.groovy.classgen.GeneratorContext;
> import org.codehaus.groovy.control.CompilationFailedException;
> import org.codehaus.groovy.control.CompilationUnit;
> import org.codehaus.groovy.control.Phases;
> import org.codehaus.groovy.control.SourceUnit;
> import org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
> import org.codehaus.groovy.grails.commons.GrailsResourceUtils
> import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
>
> public class MyInjectionOperation extends GrailsInjectionOperation
> {
>    
>         private static GrailsDomainClassInjector injector = new
> DefaultGrailsDomainClassInjector();;
>     private GrailsResourceLoader resourceLoader;
>    
>     public void call(SourceUnit source, GeneratorContext context,
> ClassNode classNode) throws CompilationFailedException
>         {
>        
>                 if(resourceLoader != null)
>                 {
>             try {
>                 URL url;
>                 if(GrailsResourceUtils.isGrailsPath(source.getName()))
>                                 {
>                     url =
> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.getName()));
>
>                 }
>                 else
>                                 {
>                     url =
> resourceLoader.loadGroovySource(source.getName());
>                 }
>                 if(GrailsResourceUtils.isDomainClass(url))
>                                 {
>
> this.injector.performInjection(source,context,classNode);
>                 }
>                
>             }
>                         catch (MalformedURLException e)
>                         {
>                 println("Error loading URL during addition of compile
> time properties: " + e.getMessage(),e);
>                 throw new
> CompilationFailedException(Phases.CONVERSION,source,e);
>             }          
>         }
>     }
>    
>     public void setResourceLoader(GrailsResourceLoader resourceLoader)
>         {
>         this.resourceLoader = resourceLoader;
>     }
> }
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>    http://xircles.codehaus.org/manage_email
>
>


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by Burt Beckwith :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I spent some time on this and got it working. I've posted a writeup and a zip
file here: http://burtbeckwith.com/blog/?p=66

Burt

On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:

> Clarifying:
>
> So there are two projects that purport to allow one to use grails
> without having a web server around:
>
> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
> which is based on:
> http://jweldin.com/blog/?p=6
>
> However, both are over a year old and don't compile.  Both use this
> constructor:
>
>        application =
>           new DefaultGrailsApplication( groovyFiles, new
> GormInjectionOperation() )
>
> which, it seems, no longer exists.
>
> My suspicion is that this configuration is all done now via Spring.  Is
> this true?
>
> I'm trying to read through the grails Gant scripts source to figure out
> how grails starts up, but it's not clear yet.  I've tried various
> methods on GrailsUtil like:
>
>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
> or
>    ApplicationContext appContext = GrailsUtil
> .bootstrapGrailsFromClassPath()
>    DefaultGrailsApplication grailsApplication =
>         (DefaultGrailsApplication)appContext
>            .getBean("grailsApplication", D
>              efaultGrailsApplication.class);
>
> but this seems to result in class not found errors, I assume because the
> Gant scripts are responsible for classpathy stuff that I'm not yet doing
> (eg Init.groovy:setClasspath()). Am I headed in the right direction?
>
> If I simply omit the GormInjectionOperation from the code posted above,
> obviously, none of the GORM methods are available on doman objects.
>
> Any hints would be most appreciated.  My goal is something I can run via
> java -jar that will execute a groovy script using GORM domain classes.
>
> I offer beer to anyone who can help me get this working!  And I promise
> to post it somewhere for all to read!
>
> -c
>
> Christopher Mason wrote:
> > Can anyone help update this code for grails 1.0.3?
> >
> > http://jweldin.com/blog/?p=6
> >
> > Does anyone have this working?  (I see several posts but none of them
> > seem to have successful resolutions.)
> >
> > Thanks so much!
> >
> > -c
> >
> >
> > import groovy.lang.GroovyClassLoader;
> > import groovy.lang.GroovyObject;
> > import org.codehaus.groovy.grails.commons.*;
> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
> > import org.hibernate.SessionFactory;
> > import org.springframework.core.io.*;
> > import org.springframework.core.io.support.*
> > import
> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
> > import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
> >
> > class RunScript
> > {
> >     public static void main(String[] args)
> >     {
> >
> >         if (args.length < 2) {
> >             println "Usage: java -jar profiler-script.jar <db.props>
> > <script name> <script args>"
> >         }
> >
> >         GrailsApplication grailsApplication = null;
> >         SessionFactory sessionFactory = null;
> >
> >         PathMatchingResourcePatternResolver resolver = new
> > PathMatchingResourcePatternResolver();
> >
> >         Resource[] groovyFiles =
> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
> >
> >         grailsApplication = new DefaultGrailsApplication(groovyFiles);
> >
> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
> >         gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector() ]
> > as ClassInjector[])
> >
> >         DefaultGrailsDomainConfiguration config = new
> > DefaultGrailsDomainConfiguration();
> >         config.setGrailsApplication(grailsApplication);
> >
> >         Properties props = new Properties();
> >         props.load(new FileInputStream(args[0]));
> >         config.setProperties(props);
> >
> >         sessionFactory = config.buildSessionFactory();
> >
> >         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
> > grailsApplication);
> >
> >         GroovyClassLoader cl = gcl //grailsApplication.getClassLoader()
> >
> >         println "\n-----------\nBefore Main\n-----------\n"
> >
> >         Binding b = new Binding(args[3..args.length-1] as String[])
> >         def TestDomainScript =
> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
> >         TestDomainScript.run()
> >
> >         println "\n-----------\nAfter Main\n-----------\n"
> >         println "\nDone";
> >
> >     }
> > }
> >
> >
> > import
> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation;
> > import org.codehaus.groovy.grails.compiler.injection.*;
> > import org.apache.commons.logging.Log;
> > import org.apache.commons.logging.LogFactory;
> > import org.codehaus.groovy.ast.ClassNode;
> > import org.codehaus.groovy.classgen.GeneratorContext;
> > import org.codehaus.groovy.control.CompilationFailedException;
> > import org.codehaus.groovy.control.CompilationUnit;
> > import org.codehaus.groovy.control.Phases;
> > import org.codehaus.groovy.control.SourceUnit;
> > import org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
> >
> > public class MyInjectionOperation extends GrailsInjectionOperation
> > {
> >
> >         private static GrailsDomainClassInjector injector = new
> > DefaultGrailsDomainClassInjector();;
> >     private GrailsResourceLoader resourceLoader;
> >
> >     public void call(SourceUnit source, GeneratorContext context,
> > ClassNode classNode) throws CompilationFailedException
> >         {
> >
> >                 if(resourceLoader != null)
> >                 {
> >             try {
> >                 URL url;
> >                 if(GrailsResourceUtils.isGrailsPath(source.getName()))
> >                                 {
> >                     url =
> > resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.g
> >etName()));
> >
> >                 }
> >                 else
> >                                 {
> >                     url =
> > resourceLoader.loadGroovySource(source.getName());
> >                 }
> >                 if(GrailsResourceUtils.isDomainClass(url))
> >                                 {
> >
> > this.injector.performInjection(source,context,classNode);
> >                 }
> >
> >             }
> >                         catch (MalformedURLException e)
> >                         {
> >                 println("Error loading URL during addition of compile
> > time properties: " + e.getMessage(),e);
> >                 throw new
> > CompilationFailedException(Phases.CONVERSION,source,e);
> >             }
> >         }
> >     }
> >
> >     public void setResourceLoader(GrailsResourceLoader resourceLoader)
> >         {
> >         this.resourceLoader = resourceLoader;
> >     }
> > }
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe from this list, please visit:
> >
> >    http://xircles.codehaus.org/manage_email
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>     http://xircles.codehaus.org/manage_email



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by cjmason :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Burt-

This is excellent, thanks.

Could someone with access perhaps add this link to

   http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
and/or
   http://grails.org/GORM+-+StandAlone+Gorm

Let me know where to send the beer!

-c


Burt Beckwith wrote:

> I spent some time on this and got it working. I've posted a writeup and a zip
> file here: http://burtbeckwith.com/blog/?p=66
>
> Burt
>
> On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
>> Clarifying:
>>
>> So there are two projects that purport to allow one to use grails
>> without having a web server around:
>>
>> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
>> which is based on:
>> http://jweldin.com/blog/?p=6
>>
>> However, both are over a year old and don't compile.  Both use this
>> constructor:
>>
>>        application =
>>           new DefaultGrailsApplication( groovyFiles, new
>> GormInjectionOperation() )
>>
>> which, it seems, no longer exists.
>>
>> My suspicion is that this configuration is all done now via Spring.  Is
>> this true?
>>
>> I'm trying to read through the grails Gant scripts source to figure out
>> how grails starts up, but it's not clear yet.  I've tried various
>> methods on GrailsUtil like:
>>
>>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
>> or
>>    ApplicationContext appContext = GrailsUtil
>> .bootstrapGrailsFromClassPath()
>>    DefaultGrailsApplication grailsApplication =
>>         (DefaultGrailsApplication)appContext
>>            .getBean("grailsApplication", D
>>              efaultGrailsApplication.class);
>>
>> but this seems to result in class not found errors, I assume because the
>> Gant scripts are responsible for classpathy stuff that I'm not yet doing
>> (eg Init.groovy:setClasspath()). Am I headed in the right direction?
>>
>> If I simply omit the GormInjectionOperation from the code posted above,
>> obviously, none of the GORM methods are available on doman objects.
>>
>> Any hints would be most appreciated.  My goal is something I can run via
>> java -jar that will execute a groovy script using GORM domain classes.
>>
>> I offer beer to anyone who can help me get this working!  And I promise
>> to post it somewhere for all to read!
>>
>> -c
>>
>> Christopher Mason wrote:
>>> Can anyone help update this code for grails 1.0.3?
>>>
>>> http://jweldin.com/blog/?p=6
>>>
>>> Does anyone have this working?  (I see several posts but none of them
>>> seem to have successful resolutions.)
>>>
>>> Thanks so much!
>>>
>>> -c
>>>
>>>
>>> import groovy.lang.GroovyClassLoader;
>>> import groovy.lang.GroovyObject;
>>> import org.codehaus.groovy.grails.commons.*;
>>> import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
>>> import org.hibernate.SessionFactory;
>>> import org.springframework.core.io.*;
>>> import org.springframework.core.io.support.*
>>> import
>>> org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
>>> import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
>>>
>>> class RunScript
>>> {
>>>     public static void main(String[] args)
>>>     {
>>>
>>>         if (args.length < 2) {
>>>             println "Usage: java -jar profiler-script.jar <db.props>
>>> <script name> <script args>"
>>>         }
>>>
>>>         GrailsApplication grailsApplication = null;
>>>         SessionFactory sessionFactory = null;
>>>
>>>         PathMatchingResourcePatternResolver resolver = new
>>> PathMatchingResourcePatternResolver();
>>>
>>>         Resource[] groovyFiles =
>>> resolver.getResources("classpath*:**grails-app/**/*.groovy");
>>>
>>>         grailsApplication = new DefaultGrailsApplication(groovyFiles);
>>>
>>>         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
>>>         gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector() ]
>>> as ClassInjector[])
>>>
>>>         DefaultGrailsDomainConfiguration config = new
>>> DefaultGrailsDomainConfiguration();
>>>         config.setGrailsApplication(grailsApplication);
>>>
>>>         Properties props = new Properties();
>>>         props.load(new FileInputStream(args[0]));
>>>         config.setProperties(props);
>>>
>>>         sessionFactory = config.buildSessionFactory();
>>>
>>>         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
>>> grailsApplication);
>>>
>>>         GroovyClassLoader cl = gcl //grailsApplication.getClassLoader()
>>>
>>>         println "\n-----------\nBefore Main\n-----------\n"
>>>
>>>         Binding b = new Binding(args[3..args.length-1] as String[])
>>>         def TestDomainScript =
>>> (Script)cl.loadClass(args[1],false,true).newInstance(b)
>>>         TestDomainScript.run()
>>>
>>>         println "\n-----------\nAfter Main\n-----------\n"
>>>         println "\nDone";
>>>
>>>     }
>>> }
>>>
>>>
>>> import
>>> org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation;
>>> import org.codehaus.groovy.grails.compiler.injection.*;
>>> import org.apache.commons.logging.Log;
>>> import org.apache.commons.logging.LogFactory;
>>> import org.codehaus.groovy.ast.ClassNode;
>>> import org.codehaus.groovy.classgen.GeneratorContext;
>>> import org.codehaus.groovy.control.CompilationFailedException;
>>> import org.codehaus.groovy.control.CompilationUnit;
>>> import org.codehaus.groovy.control.Phases;
>>> import org.codehaus.groovy.control.SourceUnit;
>>> import org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
>>> import org.codehaus.groovy.grails.commons.GrailsResourceUtils
>>> import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
>>>
>>> public class MyInjectionOperation extends GrailsInjectionOperation
>>> {
>>>
>>>         private static GrailsDomainClassInjector injector = new
>>> DefaultGrailsDomainClassInjector();;
>>>     private GrailsResourceLoader resourceLoader;
>>>
>>>     public void call(SourceUnit source, GeneratorContext context,
>>> ClassNode classNode) throws CompilationFailedException
>>>         {
>>>
>>>                 if(resourceLoader != null)
>>>                 {
>>>             try {
>>>                 URL url;
>>>                 if(GrailsResourceUtils.isGrailsPath(source.getName()))
>>>                                 {
>>>                     url =
>>> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.g
>>> etName()));
>>>
>>>                 }
>>>                 else
>>>                                 {
>>>                     url =
>>> resourceLoader.loadGroovySource(source.getName());
>>>                 }
>>>                 if(GrailsResourceUtils.isDomainClass(url))
>>>                                 {
>>>
>>> this.injector.performInjection(source,context,classNode);
>>>                 }
>>>
>>>             }
>>>                         catch (MalformedURLException e)
>>>                         {
>>>                 println("Error loading URL during addition of compile
>>> time properties: " + e.getMessage(),e);
>>>                 throw new
>>> CompilationFailedException(Phases.CONVERSION,source,e);
>>>             }
>>>         }
>>>     }
>>>
>>>     public void setResourceLoader(GrailsResourceLoader resourceLoader)
>>>         {
>>>         this.resourceLoader = resourceLoader;
>>>     }
>>> }
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe from this list, please visit:
>>>
>>>    http://xircles.codehaus.org/manage_email
>> ---------------------------------------------------------------------
>> To unsubscribe from this list, please visit:
>>
>>     http://xircles.codehaus.org/manage_email
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>     http://xircles.codehaus.org/manage_email
>
>


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by Gregory W. Bond :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

i've been playing around with this code for a couple of days now trying to get it to work in a self-contained jar file (since i eventually want to use the code to access gorm from java) - the problem i run into is that the dynamic gorm 'save()' method isn't found at runtime (see stack trace below) - the problem disappears if i include the 'grails-app' directory containing the domain class definitions in the same directory as the jar file containing the compiled class files

my jar file ('beckwith.jar') includes all the class files generated by 'grails compile' as well as the 'grails-app' directory contents and the 'application.properties' file - at the moment i have to include the file 'scripts/Main.groovy' in the same directory as the jar file until i figure out how to load it as a resource from the jar file

here's the command i'm using to run the program

java -classpath beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/spring-2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/grails-core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-spring-1.0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibernate-annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j-1.6.1.jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME/lib/commons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/mysql-connector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar Tester

here's the exception i get - any idea how to get around this?

Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: com.burtbeckwith.gorm.domain.Book.save() is applicable for argument types: () values: {}
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:60)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:172)
        at com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy)
        at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:784)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:198)
        at Main.run(Main.groovy:7)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
        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:230)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
        at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
        at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:778)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
        at Tester$_main_closure1.doCall(Tester.groovy:12)
        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:230)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
        at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
        at groovy.lang.Closure.call(Closure.java:292)
        at groovy.lang.Closure.call(Closure.java:305)
        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:230)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
        at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
        at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:778)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:758)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
        at com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(GormHelper.groovy:133)
        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:230)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
        at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
        at groovy.lang.Closure.call(Closure.java:292)
        at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:48)
        at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:72)
        at $Proxy0.doInTransaction(Unknown Source)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
        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:230)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
        at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
        at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:766)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:754)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
        at com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132)
        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:230)
        at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:749)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
        at Tester.main(Tester.groovy:10)



burtbeckwith wrote:
I spent some time on this and got it working. I've posted a writeup and a zip
file here: http://burtbeckwith.com/blog/?p=66

Burt

On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
> Clarifying:
>
> So there are two projects that purport to allow one to use grails
> without having a web server around:
>
> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
> which is based on:
> http://jweldin.com/blog/?p=6
>
> However, both are over a year old and don't compile.  Both use this
> constructor:
>
>        application =
>           new DefaultGrailsApplication( groovyFiles, new
> GormInjectionOperation() )
>
> which, it seems, no longer exists.
>
> My suspicion is that this configuration is all done now via Spring.  Is
> this true?
>
> I'm trying to read through the grails Gant scripts source to figure out
> how grails starts up, but it's not clear yet.  I've tried various
> methods on GrailsUtil like:
>
>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
> or
>    ApplicationContext appContext = GrailsUtil
> .bootstrapGrailsFromClassPath()
>    DefaultGrailsApplication grailsApplication =
>         (DefaultGrailsApplication)appContext
>            .getBean("grailsApplication", D
>              efaultGrailsApplication.class);
>
> but this seems to result in class not found errors, I assume because the
> Gant scripts are responsible for classpathy stuff that I'm not yet doing
> (eg Init.groovy:setClasspath()). Am I headed in the right direction?
>
> If I simply omit the GormInjectionOperation from the code posted above,
> obviously, none of the GORM methods are available on doman objects.
>
> Any hints would be most appreciated.  My goal is something I can run via
> java -jar that will execute a groovy script using GORM domain classes.
>
> I offer beer to anyone who can help me get this working!  And I promise
> to post it somewhere for all to read!
>
> -c
>
> Christopher Mason wrote:
> > Can anyone help update this code for grails 1.0.3?
> >
> > http://jweldin.com/blog/?p=6
> >
> > Does anyone have this working?  (I see several posts but none of them
> > seem to have successful resolutions.)
> >
> > Thanks so much!
> >
> > -c
> >
> >
> > import groovy.lang.GroovyClassLoader;
> > import groovy.lang.GroovyObject;
> > import org.codehaus.groovy.grails.commons.*;
> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
> > import org.hibernate.SessionFactory;
> > import org.springframework.core.io.*;
> > import org.springframework.core.io.support.*
> > import
> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
> > import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
> >
> > class RunScript
> > {
> >     public static void main(String[] args)
> >     {
> >
> >         if (args.length < 2) {
> >             println "Usage: java -jar profiler-script.jar <db.props>
> > <script name> <script args>"
> >         }
> >
> >         GrailsApplication grailsApplication = null;
> >         SessionFactory sessionFactory = null;
> >
> >         PathMatchingResourcePatternResolver resolver = new
> > PathMatchingResourcePatternResolver();
> >
> >         Resource[] groovyFiles =
> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
> >
> >         grailsApplication = new DefaultGrailsApplication(groovyFiles);
> >
> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
> >         gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector() ]
> > as ClassInjector[])
> >
> >         DefaultGrailsDomainConfiguration config = new
> > DefaultGrailsDomainConfiguration();
> >         config.setGrailsApplication(grailsApplication);
> >
> >         Properties props = new Properties();
> >         props.load(new FileInputStream(args[0]));
> >         config.setProperties(props);
> >
> >         sessionFactory = config.buildSessionFactory();
> >
> >         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
> > grailsApplication);
> >
> >         GroovyClassLoader cl = gcl //grailsApplication.getClassLoader()
> >
> >         println "\n-----------\nBefore Main\n-----------\n"
> >
> >         Binding b = new Binding(args[3..args.length-1] as String[])
> >         def TestDomainScript =
> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
> >         TestDomainScript.run()
> >
> >         println "\n-----------\nAfter Main\n-----------\n"
> >         println "\nDone";
> >
> >     }
> > }
> >
> >
> > import
> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation;
> > import org.codehaus.groovy.grails.compiler.injection.*;
> > import org.apache.commons.logging.Log;
> > import org.apache.commons.logging.LogFactory;
> > import org.codehaus.groovy.ast.ClassNode;
> > import org.codehaus.groovy.classgen.GeneratorContext;
> > import org.codehaus.groovy.control.CompilationFailedException;
> > import org.codehaus.groovy.control.CompilationUnit;
> > import org.codehaus.groovy.control.Phases;
> > import org.codehaus.groovy.control.SourceUnit;
> > import org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
> >
> > public class MyInjectionOperation extends GrailsInjectionOperation
> > {
> >
> >         private static GrailsDomainClassInjector injector = new
> > DefaultGrailsDomainClassInjector();;
> >     private GrailsResourceLoader resourceLoader;
> >
> >     public void call(SourceUnit source, GeneratorContext context,
> > ClassNode classNode) throws CompilationFailedException
> >         {
> >
> >                 if(resourceLoader != null)
> >                 {
> >             try {
> >                 URL url;
> >                 if(GrailsResourceUtils.isGrailsPath(source.getName()))
> >                                 {
> >                     url =
> > resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.g
> >etName()));
> >
> >                 }
> >                 else
> >                                 {
> >                     url =
> > resourceLoader.loadGroovySource(source.getName());
> >                 }
> >                 if(GrailsResourceUtils.isDomainClass(url))
> >                                 {
> >
> > this.injector.performInjection(source,context,classNode);
> >                 }
> >
> >             }
> >                         catch (MalformedURLException e)
> >                         {
> >                 println("Error loading URL during addition of compile
> > time properties: " + e.getMessage(),e);
> >                 throw new
> > CompilationFailedException(Phases.CONVERSION,source,e);
> >             }
> >         }
> >     }
> >
> >     public void setResourceLoader(GrailsResourceLoader resourceLoader)
> >         {
> >         this.resourceLoader = resourceLoader;
> >     }
> > }
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe from this list, please visit:
> >
> >    http://xircles.codehaus.org/manage_email
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>     http://xircles.codehaus.org/manage_email



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Re: GORM outside Grails

by Burt Beckwith :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Right, I mentioned the problem with the metaclass methods in the blog post. I
won't have time today to look at this but I'll take a look this evening.

Burt

On Tuesday 02 September 2008 11:03:52 am Gregory W. Bond wrote:

> i've been playing around with this code for a couple of days now trying to
> get it to work in a self-contained jar file (since i eventually want to use
> the code to access gorm from java) - the problem i run into is that the
> dynamic gorm 'save()' method isn't found at runtime (see stack trace below)
> - the problem disappears if i include the 'grails-app' directory containing
> the domain class definitions in the same directory as the jar file
> containing the compiled class files
>
> my jar file ('beckwith.jar') includes all the class files generated by
> 'grails compile' as well as the 'grails-app' directory contents and the
> 'application.properties' file - at the moment i have to include the file
> 'scripts/Main.groovy' in the same directory as the jar file until i figure
> out how to load it as a resource from the jar file
>
> here's the command i'm using to run the program
>
> java -classpath
> beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/spring-
>2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/grails-
>core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-spring-1
>.0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibernate-
>annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j-1.6.1
>.jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME/lib/c
>ommons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/mysql-c
>onnector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar Tester
>
> here's the exception i get - any idea how to get around this?
>
> Exception in thread "main" groovy.lang.MissingMethodException: No signature
> of method: com.burtbeckwith.gorm.domain.Book.save() is applicable for
> argument types: () values: {}
>         at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdap
>ter.java:55) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdap
>ter.java:60) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>odeAdapter.java:172) at
> com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy) at
> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>va:784) at
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>58) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>odeAdapter.java:170) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytec
>odeAdapter.java:198) at Main.run(Main.groovy:7)
>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>9) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>l.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:230)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>         at
> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>         at
> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>va:778) at
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>58) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>odeAdapter.java:170) at Tester$_main_closure1.doCall(Tester.groovy:12)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>9) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>l.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:230)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>         at
> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>         at groovy.lang.Closure.call(Closure.java:292)
>         at groovy.lang.Closure.call(Closure.java:305)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>9) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>l.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:230)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>         at
> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>         at
> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>va:778) at
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>58) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>odeAdapter.java:170) at
> com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(GormHelpe
>r.groovy:133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>9) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>l.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:230)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>         at
> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>         at groovy.lang.Closure.call(Closure.java:292)
>         at
> org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.
>java:48) at
> org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java
>:72) at $Proxy0.doInTransaction(Unknown Source)
>         at
> org.springframework.transaction.support.TransactionTemplate.execute(Transac
>tionTemplate.java:128) at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>9) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>l.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:230)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>         at
> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>         at
> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.ja
>va:766) at
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>54) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>odeAdapter.java:170) at
> com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>9) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>l.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:230)
>         at
> groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
>         at
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>49) at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>odeAdapter.java:170) at Tester.main(Tester.groovy:10)
>
> burtbeckwith wrote:
> > I spent some time on this and got it working. I've posted a writeup and a
> > zip
> > file here: http://burtbeckwith.com/blog/?p=66
> >
> > Burt
> >
> > On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
> >> Clarifying:
> >>
> >> So there are two projects that purport to allow one to use grails
> >> without having a web server around:
> >>
> >> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
> >> which is based on:
> >> http://jweldin.com/blog/?p=6
> >>
> >> However, both are over a year old and don't compile.  Both use this
> >> constructor:
> >>
> >>        application =
> >>           new DefaultGrailsApplication( groovyFiles, new
> >> GormInjectionOperation() )
> >>
> >> which, it seems, no longer exists.
> >>
> >> My suspicion is that this configuration is all done now via Spring.  Is
> >> this true?
> >>
> >> I'm trying to read through the grails Gant scripts source to figure out
> >> how grails starts up, but it's not clear yet.  I've tried various
> >> methods on GrailsUtil like:
> >>
> >>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
> >> or
> >>    ApplicationContext appContext = GrailsUtil
> >> .bootstrapGrailsFromClassPath()
> >>    DefaultGrailsApplication grailsApplication =
> >>         (DefaultGrailsApplication)appContext
> >>            .getBean("grailsApplication", D
> >>              efaultGrailsApplication.class);
> >>
> >> but this seems to result in class not found errors, I assume because the
> >> Gant scripts are responsible for classpathy stuff that I'm not yet doing
> >> (eg Init.groovy:setClasspath()). Am I headed in the right direction?
> >>
> >> If I simply omit the GormInjectionOperation from the code posted above,
> >> obviously, none of the GORM methods are available on doman objects.
> >>
> >> Any hints would be most appreciated.  My goal is something I can run via
> >> java -jar that will execute a groovy script using GORM domain classes.
> >>
> >> I offer beer to anyone who can help me get this working!  And I promise
> >> to post it somewhere for all to read!
> >>
> >> -c
> >>
> >> Christopher Mason wrote:
> >> > Can anyone help update this code for grails 1.0.3?
> >> >
> >> > http://jweldin.com/blog/?p=6
> >> >
> >> > Does anyone have this working?  (I see several posts but none of them
> >> > seem to have successful resolutions.)
> >> >
> >> > Thanks so much!
> >> >
> >> > -c
> >> >
> >> >
> >> > import groovy.lang.GroovyClassLoader;
> >> > import groovy.lang.GroovyObject;
> >> > import org.codehaus.groovy.grails.commons.*;
> >> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
> >> > import org.hibernate.SessionFactory;
> >> > import org.springframework.core.io.*;
> >> > import org.springframework.core.io.support.*
> >> > import
> >> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
> >> > import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
> >> >
> >> > class RunScript
> >> > {
> >> >     public static void main(String[] args)
> >> >     {
> >> >
> >> >         if (args.length < 2) {
> >> >             println "Usage: java -jar profiler-script.jar <db.props>
> >> > <script name> <script args>"
> >> >         }
> >> >
> >> >         GrailsApplication grailsApplication = null;
> >> >         SessionFactory sessionFactory = null;
> >> >
> >> >         PathMatchingResourcePatternResolver resolver = new
> >> > PathMatchingResourcePatternResolver();
> >> >
> >> >         Resource[] groovyFiles =
> >> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
> >> >
> >> >         grailsApplication = new DefaultGrailsApplication(groovyFiles);
> >> >
> >> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
> >> >         gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector()
> >>
> >> ]
> >>
> >> > as ClassInjector[])
> >> >
> >> >         DefaultGrailsDomainConfiguration config = new
> >> > DefaultGrailsDomainConfiguration();
> >> >         config.setGrailsApplication(grailsApplication);
> >> >
> >> >         Properties props = new Properties();
> >> >         props.load(new FileInputStream(args[0]));
> >> >         config.setProperties(props);
> >> >
> >> >         sessionFactory = config.buildSessionFactory();
> >> >
> >> >         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
> >> > grailsApplication);
> >> >
> >> >         GroovyClassLoader cl = gcl
> >> > //grailsApplication.getClassLoader()
> >> >
> >> >         println "\n-----------\nBefore Main\n-----------\n"
> >> >
> >> >         Binding b = new Binding(args[3..args.length-1] as String[])
> >> >         def TestDomainScript =
> >> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
> >> >         TestDomainScript.run()
> >> >
> >> >         println "\n-----------\nAfter Main\n-----------\n"
> >> >         println "\nDone";
> >> >
> >> >     }
> >> > }
> >> >
> >> >
> >> > import
> >> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation
> >> >; import org.codehaus.groovy.grails.compiler.injection.*;
> >> > import org.apache.commons.logging.Log;
> >> > import org.apache.commons.logging.LogFactory;
> >> > import org.codehaus.groovy.ast.ClassNode;
> >> > import org.codehaus.groovy.classgen.GeneratorContext;
> >> > import org.codehaus.groovy.control.CompilationFailedException;
> >> > import org.codehaus.groovy.control.CompilationUnit;
> >> > import org.codehaus.groovy.control.Phases;
> >> > import org.codehaus.groovy.control.SourceUnit;
> >> > import
> >>
> >> org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
> >>
> >> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
> >> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
> >> >
> >> > public class MyInjectionOperation extends GrailsInjectionOperation
> >> > {
> >> >
> >> >         private static GrailsDomainClassInjector injector = new
> >> > DefaultGrailsDomainClassInjector();;
> >> >     private GrailsResourceLoader resourceLoader;
> >> >
> >> >     public void call(SourceUnit source, GeneratorContext context,
> >> > ClassNode classNode) throws CompilationFailedException
> >> >         {
> >> >
> >> >                 if(resourceLoader != null)
> >> >                 {
> >> >             try {
> >> >                 URL url;
> >> >                 if(GrailsResourceUtils.isGrailsPath(source.getName()))
> >> >                                 {
> >> >                     url =
> >>
> >> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.
> >>g
> >>
> >> >etName()));
> >> >
> >> >                 }
> >> >                 else
> >> >                                 {
> >> >                     url =
> >> > resourceLoader.loadGroovySource(source.getName());
> >> >                 }
> >> >                 if(GrailsResourceUtils.isDomainClass(url))
> >> >                                 {
> >> >
> >> > this.injector.performInjection(source,context,classNode);
> >> >                 }
> >> >
> >> >             }
> >> >                         catch (MalformedURLException e)
> >> >                         {
> >> >                 println("Error loading URL during addition of compile
> >> > time properties: " + e.getMessage(),e);
> >> >                 throw new
> >> > CompilationFailedException(Phases.CONVERSION,source,e);
> >> >             }
> >> >         }
> >> >     }
> >> >
> >> >     public void setResourceLoader(GrailsResourceLoader resourceLoader)
> >> >         {
> >> >         this.resourceLoader = resourceLoader;
> >> >     }
> >> > }
> >> >
> >> >
> >> >
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe from this list, please visit:
> >> >
> >> >    http://xircles.codehaus.org/manage_email
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe from this list, please visit:
> >>
> >>     http://xircles.codehaus.org/manage_email
> >
> > ---------------------------------------------------------------------
> > To unsubscribe from this list, please visit:
> >
> >     http://xircles.codehaus.org/manage_email



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by Gregory W. Bond :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

playing around some more i've managed to get burt's entire example to
run in a jar file without any groovy scripts in the jar (!) -
unfortunately it's not a general solution but perhaps what i've done
will help achieve one

the major change i made is to explicitly load the domain classes into
the application - i've attached a zip with the updated code but here's
a quick overview of what i've done (it's not much really):

1) i moved Main.groovy from the scripts dir to src/groovy in order to
get it to be compiled

2) i've replaced occurrences of classLoader.getResource(...groovy
files...) with appropriate variations on classLoader.loadClass()

3) instead of creating the application this way:

application = new DefaultGrailsApplication(groovyFiles)

i'm using this (cumbersome, non-general, but working) approach:

       Class bookClass =
GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Book")
       Class carClass =
GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Car")
       Class personClass =
GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Person")
       Class songClass =
GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Song")
       Class[] domainClasses = new Class[4]
       domainClasses[0] = bookClass
       domainClasses[1] = carClass
       domainClasses[2] = personClass
       domainClasses[3] = songClass
               application = new DefaultGrailsApplication(domainClasses, new
GroovyClassLoader(GormHelper.classLoader))

(as a sidenote that probably highlights my ignorance of grails and
groovy: i kept getting compilation errors when i tried to initialize
the domain class array when i declared it e.g. using syntax 'Class[]
domainClasses = new Class[] { bookClass, .... }')

greg

On Tue, Sep 2, 2008 at 12:05 PM, Burt Beckwith <burt@...> wrote:

> Right, I mentioned the problem with the metaclass methods in the blog post. I
> won't have time today to look at this but I'll take a look this evening.
>
> Burt
>
> On Tuesday 02 September 2008 11:03:52 am Gregory W. Bond wrote:
>> i've been playing around with this code for a couple of days now trying to
>> get it to work in a self-contained jar file (since i eventually want to use
>> the code to access gorm from java) - the problem i run into is that the
>> dynamic gorm 'save()' method isn't found at runtime (see stack trace below)
>> - the problem disappears if i include the 'grails-app' directory containing
>> the domain class definitions in the same directory as the jar file
>> containing the compiled class files
>>
>> my jar file ('beckwith.jar') includes all the class files generated by
>> 'grails compile' as well as the 'grails-app' directory contents and the
>> 'application.properties' file - at the moment i have to include the file
>> 'scripts/Main.groovy' in the same directory as the jar file until i figure
>> out how to load it as a resource from the jar file
>>
>> here's the command i'm using to run the program
>>
>> java -classpath
>> beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/spring-
>>2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/grails-
>>core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-spring-1
>>.0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibernate-
>>annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j-1.6.1
>>.jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME/lib/c
>>ommons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/mysql-c
>>onnector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar Tester
>>
>> here's the exception i get - any idea how to get around this?
>>
>> Exception in thread "main" groovy.lang.MissingMethodException: No signature
>> of method: com.burtbeckwith.gorm.domain.Book.save() is applicable for
>> argument types: () values: {}
>>         at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdap
>>ter.java:55) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdap
>>ter.java:60) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:172) at
>> com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>>va:784) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>58) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytec
>>odeAdapter.java:198) at Main.run(Main.groovy:7)
>>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
>>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>         at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.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:230)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>>         at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>>         at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>>va:778) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>58) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at Tester$_main_closure1.doCall(Tester.groovy:12)
>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>         at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.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:230)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>>         at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>>         at groovy.lang.Closure.call(Closure.java:292)
>>         at groovy.lang.Closure.call(Closure.java:305)
>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>         at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.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:230)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>>         at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>>         at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.ja
>>va:778) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>58) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at
>> com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(GormHelpe
>>r.groovy:133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.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:230)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>>         at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>>         at groovy.lang.Closure.call(Closure.java:292)
>>         at
>> org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.
>>java:48) at
>> org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java
>>:72) at $Proxy0.doInTransaction(Unknown Source)
>>         at
>> org.springframework.transaction.support.TransactionTemplate.execute(Transac
>>tionTemplate.java:128) at
>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.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:230)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
>>         at
>> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
>>         at
>> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.ja
>>va:766) at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>54) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at
>> com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132)
>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>         at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3
>>9) at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp
>>l.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:230)
>>         at
>> groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
>>         at
>> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:7
>>49) at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytec
>>odeAdapter.java:170) at Tester.main(Tester.groovy:10)
>>
>> burtbeckwith wrote:
>> > I spent some time on this and got it working. I've posted a writeup and a
>> > zip
>> > file here: http://burtbeckwith.com/blog/?p=66
>> >
>> > Burt
>> >
>> > On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
>> >> Clarifying:
>> >>
>> >> So there are two projects that purport to allow one to use grails
>> >> without having a web server around:
>> >>
>> >> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
>> >> which is based on:
>> >> http://jweldin.com/blog/?p=6
>> >>
>> >> However, both are over a year old and don't compile.  Both use this
>> >> constructor:
>> >>
>> >>        application =
>> >>           new DefaultGrailsApplication( groovyFiles, new
>> >> GormInjectionOperation() )
>> >>
>> >> which, it seems, no longer exists.
>> >>
>> >> My suspicion is that this configuration is all done now via Spring.  Is
>> >> this true?
>> >>
>> >> I'm trying to read through the grails Gant scripts source to figure out
>> >> how grails starts up, but it's not clear yet.  I've tried various
>> >> methods on GrailsUtil like:
>> >>
>> >>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
>> >> or
>> >>    ApplicationContext appContext = GrailsUtil
>> >>    .bootstrapGrailsFromClassPath()
>> >>    DefaultGrailsApplication grailsApplication =
>> >>         (DefaultGrailsApplication)appContext
>> >>            .getBean("grailsApplication", D
>> >>              efaultGrailsApplication.class);
>> >>
>> >> but this seems to result in class not found errors, I assume because the
>> >> Gant scripts are responsible for classpathy stuff that I'm not yet doing
>> >> (eg Init.groovy:setClasspath()). Am I headed in the right direction?
>> >>
>> >> If I simply omit the GormInjectionOperation from the code posted above,
>> >> obviously, none of the GORM methods are available on doman objects.
>> >>
>> >> Any hints would be most appreciated.  My goal is something I can run via
>> >> java -jar that will execute a groovy script using GORM domain classes.
>> >>
>> >> I offer beer to anyone who can help me get this working!  And I promise
>> >> to post it somewhere for all to read!
>> >>
>> >> -c
>> >>
>> >> Christopher Mason wrote:
>> >> > Can anyone help update this code for grails 1.0.3?
>> >> >
>> >> > http://jweldin.com/blog/?p=6
>> >> >
>> >> > Does anyone have this working?  (I see several posts but none of them
>> >> > seem to have successful resolutions.)
>> >> >
>> >> > Thanks so much!
>> >> >
>> >> > -c
>> >> >
>> >> >
>> >> > import groovy.lang.GroovyClassLoader;
>> >> > import groovy.lang.GroovyObject;
>> >> > import org.codehaus.groovy.grails.commons.*;
>> >> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
>> >> > import org.hibernate.SessionFactory;
>> >> > import org.springframework.core.io.*;
>> >> > import org.springframework.core.io.support.*
>> >> > import
>> >> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoader
>> >> > import org.codehaus.groovy.grails.compiler.injection.ClassInjector;
>> >> >
>> >> > class RunScript
>> >> > {
>> >> >     public static void main(String[] args)
>> >> >     {
>> >> >
>> >> >         if (args.length < 2) {
>> >> >             println "Usage: java -jar profiler-script.jar <db.props>
>> >> > <script name> <script args>"
>> >> >         }
>> >> >
>> >> >         GrailsApplication grailsApplication = null;
>> >> >         SessionFactory sessionFactory = null;
>> >> >
>> >> >         PathMatchingResourcePatternResolver resolver = new
>> >> > PathMatchingResourcePatternResolver();
>> >> >
>> >> >         Resource[] groovyFiles =
>> >> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
>> >> >
>> >> >         grailsApplication = new DefaultGrailsApplication(groovyFiles);
>> >> >
>> >> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
>> >> >         gcl.setClassInjectors([ new DefaultGrailsDomainClassInjector()
>> >>
>> >> ]
>> >>
>> >> > as ClassInjector[])
>> >> >
>> >> >         DefaultGrailsDomainConfiguration config = new
>> >> > DefaultGrailsDomainConfiguration();
>> >> >         config.setGrailsApplication(grailsApplication);
>> >> >
>> >> >         Properties props = new Properties();
>> >> >         props.load(new FileInputStream(args[0]));
>> >> >         config.setProperties(props);
>> >> >
>> >> >         sessionFactory = config.buildSessionFactory();
>> >> >
>> >> >         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
>> >> > grailsApplication);
>> >> >
>> >> >         GroovyClassLoader cl = gcl
>> >> > //grailsApplication.getClassLoader()
>> >> >
>> >> >         println "\n-----------\nBefore Main\n-----------\n"
>> >> >
>> >> >         Binding b = new Binding(args[3..args.length-1] as String[])
>> >> >         def TestDomainScript =
>> >> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
>> >> >         TestDomainScript.run()
>> >> >
>> >> >         println "\n-----------\nAfter Main\n-----------\n"
>> >> >         println "\nDone";
>> >> >
>> >> >     }
>> >> > }
>> >> >
>> >> >
>> >> > import
>> >> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperation
>> >> >; import org.codehaus.groovy.grails.compiler.injection.*;
>> >> > import org.apache.commons.logging.Log;
>> >> > import org.apache.commons.logging.LogFactory;
>> >> > import org.codehaus.groovy.ast.ClassNode;
>> >> > import org.codehaus.groovy.classgen.GeneratorContext;
>> >> > import org.codehaus.groovy.control.CompilationFailedException;
>> >> > import org.codehaus.groovy.control.CompilationUnit;
>> >> > import org.codehaus.groovy.control.Phases;
>> >> > import org.codehaus.groovy.control.SourceUnit;
>> >> > import
>> >>
>> >> org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
>> >>
>> >> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
>> >> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
>> >> >
>> >> > public class MyInjectionOperation extends GrailsInjectionOperation
>> >> > {
>> >> >
>> >> >         private static GrailsDomainClassInjector injector = new
>> >> > DefaultGrailsDomainClassInjector();;
>> >> >     private GrailsResourceLoader resourceLoader;
>> >> >
>> >> >     public void call(SourceUnit source, GeneratorContext context,
>> >> > ClassNode classNode) throws CompilationFailedException
>> >> >         {
>> >> >
>> >> >                 if(resourceLoader != null)
>> >> >                 {
>> >> >             try {
>> >> >                 URL url;
>> >> >                 if(GrailsResourceUtils.isGrailsPath(source.getName()))
>> >> >                                 {
>> >> >                     url =
>> >>
>> >> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(source.
>> >>g
>> >>
>> >> >etName()));
>> >> >
>> >> >                 }
>> >> >                 else
>> >> >                                 {
>> >> >                     url =
>> >> > resourceLoader.loadGroovySource(source.getName());
>> >> >                 }
>> >> >                 if(GrailsResourceUtils.isDomainClass(url))
>> >> >                                 {
>> >> >
>> >> > this.injector.performInjection(source,context,classNode);
>> >> >                 }
>> >> >
>> >> >             }
>> >> >                         catch (MalformedURLException e)
>> >> >                         {
>> >> >                 println("Error loading URL during addition of compile
>> >> > time properties: " + e.getMessage(),e);
>> >> >                 throw new
>> >> > CompilationFailedException(Phases.CONVERSION,source,e);
>> >> >             }
>> >> >         }
>> >> >     }
>> >> >
>> >> >     public void setResourceLoader(GrailsResourceLoader resourceLoader)
>> >> >         {
>> >> >         this.resourceLoader = resourceLoader;
>> >> >     }
>> >> > }
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > ---------------------------------------------------------------------
>> >> > To unsubscribe from this list, please visit:
>> >> >
>> >> >    http://xircles.codehaus.org/manage_email
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe from this list, please visit:
>> >>
>> >>     http://xircles.codehaus.org/manage_email
>> >
>> > ---------------------------------------------------------------------
>> > To unsubscribe from this list, please visit:
>> >
>> >     http://xircles.codehaus.org/manage_email
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>    http://xircles.codehaus.org/manage_email
>
>
>


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email

gorm.zip (22K) Download Attachment

Re: GORM outside Grails

by Burt Beckwith :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Interesting progress. I couldn't get it to run - are you running from the
commandline using Ant? I'm not seeing how the classloader will find the
classes if they're not under src/groovy.

Btw - the array problem is due to Groovy thinking you're defining a closure,
but this will work:

   def domainClasses = [bookClass, carClass, personClass, songClass]
   application = new DefaultGrailsApplication(domainClasses as Class[],
         new GroovyClassLoader(GormHelper.classLoader))

Burt

On Saturday 06 September 2008 11:37:17 pm Gregory Bond wrote:

> playing around some more i've managed to get burt's entire example to
> run in a jar file without any groovy scripts in the jar (!) -
> unfortunately it's not a general solution but perhaps what i've done
> will help achieve one
>
> the major change i made is to explicitly load the domain classes into
> the application - i've attached a zip with the updated code but here's
> a quick overview of what i've done (it's not much really):
>
> 1) i moved Main.groovy from the scripts dir to src/groovy in order to
> get it to be compiled
>
> 2) i've replaced occurrences of classLoader.getResource(...groovy
> files...) with appropriate variations on classLoader.loadClass()
>
> 3) instead of creating the application this way:
>
> application = new DefaultGrailsApplication(groovyFiles)
>
> i'm using this (cumbersome, non-general, but working) approach:
>
>        Class bookClass =
> GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Book")
>        Class carClass =
> GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Car")
>        Class personClass =
> GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Person")
>        Class songClass =
> GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Song")
>        Class[] domainClasses = new Class[4]
>        domainClasses[0] = bookClass
>        domainClasses[1] = carClass
>        domainClasses[2] = personClass
>        domainClasses[3] = songClass
>                application = new DefaultGrailsApplication(domainClasses,
> new GroovyClassLoader(GormHelper.classLoader))
>
> (as a sidenote that probably highlights my ignorance of grails and
> groovy: i kept getting compilation errors when i tried to initialize
> the domain class array when i declared it e.g. using syntax 'Class[]
> domainClasses = new Class[] { bookClass, .... }')
>
> greg
>
> On Tue, Sep 2, 2008 at 12:05 PM, Burt Beckwith <burt@...>
wrote:

> > Right, I mentioned the problem with the metaclass methods in the blog
> > post. I won't have time today to look at this but I'll take a look this
> > evening.
> >
> > Burt
> >
> > On Tuesday 02 September 2008 11:03:52 am Gregory W. Bond wrote:
> >> i've been playing around with this code for a couple of days now trying
> >> to get it to work in a self-contained jar file (since i eventually want
> >> to use the code to access gorm from java) - the problem i run into is
> >> that the dynamic gorm 'save()' method isn't found at runtime (see stack
> >> trace below) - the problem disappears if i include the 'grails-app'
> >> directory containing the domain class definitions in the same directory
> >> as the jar file containing the compiled class files
> >>
> >> my jar file ('beckwith.jar') includes all the class files generated by
> >> 'grails compile' as well as the 'grails-app' directory contents and the
> >> 'application.properties' file - at the moment i have to include the file
> >> 'scripts/Main.groovy' in the same directory as the jar file until i
> >> figure out how to load it as a resource from the jar file
> >>
> >> here's the command i'm using to run the program
> >>
> >> java -classpath
> >> beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/spri
> >>ng-
> >> 2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/gra
> >>ils-
> >> core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-spri
> >>ng-1
> >> .0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibern
> >>ate-
> >> annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j-1
> >>.6.1
> >> .jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME/l
> >>ib/c
> >> ommons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/mys
> >>ql-c onnector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar
> >> Tester
> >>
> >> here's the exception i get - any idea how to get around this?
> >>
> >> Exception in thread "main" groovy.lang.MissingMethodException: No
> >> signature of method: com.burtbeckwith.gorm.domain.Book.save() is
> >> applicable for argument types: () values: {}
> >>         at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeA
> >>dap ter.java:55) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeA
> >>dap ter.java:60) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBy
> >>tec odeAdapter.java:172) at
> >> com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper
> >>.ja va:784) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.jav
> >>a:7 58) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBy
> >>tec odeAdapter.java:170) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBy
> >>tec odeAdapter.java:198) at Main.run(Main.groovy:7)
> >>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
> >>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
> >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>         at
> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> >>a:3 9) at
> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> >>Imp l.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:230)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper
> >>.ja va:778) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.jav
> >>a:7 58) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBy
> >>tec odeAdapter.java:170) at
> >> Tester$_main_closure1.doCall(Tester.groovy:12) at
> >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> >>a:3 9) at
> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> >>Imp l.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:230)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> >> groovy.lang.Closure.call(Closure.java:292)
> >>         at groovy.lang.Closure.call(Closure.java:305)
> >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>         at
> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> >>a:3 9) at
> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> >>Imp l.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:230)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper
> >>.ja va:778) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.jav
> >>a:7 58) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBy
> >>tec odeAdapter.java:170) at
> >> com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(GormHe
> >>lpe r.groovy:133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> >> Method) at
> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> >>a:3 9) at
> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> >>Imp l.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:230)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> >> groovy.lang.Closure.call(Closure.java:292)
> >>         at
> >> org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosu
> >>re. java:48) at
> >> org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.j
> >>ava
> >>
> >>:72) at $Proxy0.doInTransaction(Unknown Source)
> >>
> >>         at
> >> org.springframework.transaction.support.TransactionTemplate.execute(Tran
> >>sac tionTemplate.java:128) at
> >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> >>a:3 9) at
> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> >>Imp l.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:230)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper
> >>.ja va:766) at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.jav
> >>a:7 54) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBy
> >>tec odeAdapter.java:170) at
> >> com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132)
> >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>         at
> >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
> >>a:3 9) at
> >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
> >>Imp l.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:230)
> >>         at
> >> groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
> >>         at
> >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.jav
> >>a:7 49) at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBy
> >>tec odeAdapter.java:170) at Tester.main(Tester.groovy:10)
> >>
> >> burtbeckwith wrote:
> >> > I spent some time on this and got it working. I've posted a writeup
> >> > and a zip
> >> > file here: http://burtbeckwith.com/blog/?p=66
> >> >
> >> > Burt
> >> >
> >> > On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
> >> >> Clarifying:
> >> >>
> >> >> So there are two projects that purport to allow one to use grails
> >> >> without having a web server around:
> >> >>
> >> >> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
> >> >> which is based on:
> >> >> http://jweldin.com/blog/?p=6
> >> >>
> >> >> However, both are over a year old and don't compile.  Both use this
> >> >> constructor:
> >> >>
> >> >>        application =
> >> >>           new DefaultGrailsApplication( groovyFiles, new
> >> >> GormInjectionOperation() )
> >> >>
> >> >> which, it seems, no longer exists.
> >> >>
> >> >> My suspicion is that this configuration is all done now via Spring.
> >> >> Is this true?
> >> >>
> >> >> I'm trying to read through the grails Gant scripts source to figure
> >> >> out how grails starts up, but it's not clear yet.  I've tried various
> >> >> methods on GrailsUtil like:
> >> >>
> >> >>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
> >> >> or
> >> >>    ApplicationContext appContext = GrailsUtil
> >> >>    .bootstrapGrailsFromClassPath()
> >> >>    DefaultGrailsApplication grailsApplication =
> >> >>         (DefaultGrailsApplication)appContext
> >> >>            .getBean("grailsApplication", D
> >> >>              efaultGrailsApplication.class);
> >> >>
> >> >> but this seems to result in class not found errors, I assume because
> >> >> the Gant scripts are responsible for classpathy stuff that I'm not
> >> >> yet doing (eg Init.groovy:setClasspath()). Am I headed in the right
> >> >> direction?
> >> >>
> >> >> If I simply omit the GormInjectionOperation from the code posted
> >> >> above, obviously, none of the GORM methods are available on doman
> >> >> objects.
> >> >>
> >> >> Any hints would be most appreciated.  My goal is something I can run
> >> >> via java -jar that will execute a groovy script using GORM domain
> >> >> classes.
> >> >>
> >> >> I offer beer to anyone who can help me get this working!  And I
> >> >> promise to post it somewhere for all to read!
> >> >>
> >> >> -c
> >> >>
> >> >> Christopher Mason wrote:
> >> >> > Can anyone help update this code for grails 1.0.3?
> >> >> >
> >> >> > http://jweldin.com/blog/?p=6
> >> >> >
> >> >> > Does anyone have this working?  (I see several posts but none of
> >> >> > them seem to have successful resolutions.)
> >> >> >
> >> >> > Thanks so much!
> >> >> >
> >> >> > -c
> >> >> >
> >> >> >
> >> >> > import groovy.lang.GroovyClassLoader;
> >> >> > import groovy.lang.GroovyObject;
> >> >> > import org.codehaus.groovy.grails.commons.*;
> >> >> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
> >> >> > import org.hibernate.SessionFactory;
> >> >> > import org.springframework.core.io.*;
> >> >> > import org.springframework.core.io.support.*
> >> >> > import
> >> >> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoade
> >> >> >r import
> >> >> > org.codehaus.groovy.grails.compiler.injection.ClassInjector;
> >> >> >
> >> >> > class RunScript
> >> >> > {
> >> >> >     public static void main(String[] args)
> >> >> >     {
> >> >> >
> >> >> >         if (args.length < 2) {
> >> >> >             println "Usage: java -jar profiler-script.jar
> >> >> > <db.props> <script name> <script args>"
> >> >> >         }
> >> >> >
> >> >> >         GrailsApplication grailsApplication = null;
> >> >> >         SessionFactory sessionFactory = null;
> >> >> >
> >> >> >         PathMatchingResourcePatternResolver resolver = new
> >> >> > PathMatchingResourcePatternResolver();
> >> >> >
> >> >> >         Resource[] groovyFiles =
> >> >> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
> >> >> >
> >> >> >         grailsApplication = new
> >> >> > DefaultGrailsApplication(groovyFiles);
> >> >> >
> >> >> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
> >> >> >         gcl.setClassInjectors([ new
> >> >> > DefaultGrailsDomainClassInjector()
> >> >>
> >> >> ]
> >> >>
> >> >> > as ClassInjector[])
> >> >> >
> >> >> >         DefaultGrailsDomainConfiguration config = new
> >> >> > DefaultGrailsDomainConfiguration();
> >> >> >         config.setGrailsApplication(grailsApplication);
> >> >> >
> >> >> >         Properties props = new Properties();
> >> >> >         props.load(new FileInputStream(args[0]));
> >> >> >         config.setProperties(props);
> >> >> >
> >> >> >         sessionFactory = config.buildSessionFactory();
> >> >> >
> >> >> >         GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
> >> >> > grailsApplication);
> >> >> >
> >> >> >         GroovyClassLoader cl = gcl
> >> >> > //grailsApplication.getClassLoader()
> >> >> >
> >> >> >         println "\n-----------\nBefore Main\n-----------\n"
> >> >> >
> >> >> >         Binding b = new Binding(args[3..args.length-1] as String[])
> >> >> >         def TestDomainScript =
> >> >> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
> >> >> >         TestDomainScript.run()
> >> >> >
> >> >> >         println "\n-----------\nAfter Main\n-----------\n"
> >> >> >         println "\nDone";
> >> >> >
> >> >> >     }
> >> >> > }
> >> >> >
> >> >> >
> >> >> > import
> >> >> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOperat
> >> >> >ion ; import org.codehaus.groovy.grails.compiler.injection.*;
> >> >> > import org.apache.commons.logging.Log;
> >> >> > import org.apache.commons.logging.LogFactory;
> >> >> > import org.codehaus.groovy.ast.ClassNode;
> >> >> > import org.codehaus.groovy.classgen.GeneratorContext;
> >> >> > import org.codehaus.groovy.control.CompilationFailedException;
> >> >> > import org.codehaus.groovy.control.CompilationUnit;
> >> >> > import org.codehaus.groovy.control.Phases;
> >> >> > import org.codehaus.groovy.control.SourceUnit;
> >> >> > import
> >> >>
> >> >> org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
> >> >>
> >> >> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
> >> >> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
> >> >> >
> >> >> > public class MyInjectionOperation extends GrailsInjectionOperation
> >> >> > {
> >> >> >
> >> >> >         private static GrailsDomainClassInjector injector = new
> >> >> > DefaultGrailsDomainClassInjector();;
> >> >> >     private GrailsResourceLoader resourceLoader;
> >> >> >
> >> >> >     public void call(SourceUnit source, GeneratorContext context,
> >> >> > ClassNode classNode) throws CompilationFailedException
> >> >> >         {
> >> >> >
> >> >> >                 if(resourceLoader != null)
> >> >> >                 {
> >> >> >             try {
> >> >> >                 URL url;
> >> >> >                
> >> >> > if(GrailsResourceUtils.isGrailsPath(source.getName())) {
> >> >> >                     url =
> >> >>
> >> >> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(sour
> >> >>ce. g
> >> >>
> >> >> >etName()));
> >> >> >
> >> >> >                 }
> >> >> >                 else
> >> >> >                                 {
> >> >> >                     url =
> >> >> > resourceLoader.loadGroovySource(source.getName());
> >> >> >                 }
> >> >> >                 if(GrailsResourceUtils.isDomainClass(url))
> >> >> >                                 {
> >> >> >
> >> >> > this.injector.performInjection(source,context,classNode);
> >> >> >                 }
> >> >> >
> >> >> >             }
> >> >> >                         catch (MalformedURLException e)
> >> >> >                         {
> >> >> >                 println("Error loading URL during addition of
> >> >> > compile time properties: " + e.getMessage(),e);
> >> >> >                 throw new
> >> >> > CompilationFailedException(Phases.CONVERSION,source,e);
> >> >> >             }
> >> >> >         }
> >> >> >     }
> >> >> >
> >> >> >     public void setResourceLoader(GrailsResourceLoader
> >> >> > resourceLoader) {
> >> >> >         this.resourceLoader = resourceLoader;
> >> >> >     }
> >> >> > }
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> > -------------------------------------------------------------------
> >> >> >-- To unsubscribe from this list, please visit:
> >> >> >
> >> >> >    http://xircles.codehaus.org/manage_email
> >> >>
> >> >> ---------------------------------------------------------------------
> >> >> To unsubscribe from this list, please visit:
> >> >>
> >> >>     http://xircles.codehaus.org/manage_email
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe from this list, please visit:
> >> >
> >> >     http://xircles.codehaus.org/manage_email
> >
> > ---------------------------------------------------------------------
> > To unsubscribe from this list, please visit:
> >
> >    http://xircles.codehaus.org/manage_email



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by Burt Beckwith :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Sorry, I missed the part about running 'grails compile' in your previous
email. It's working fine now - cool stuff.

Here's a reworked version of buildApplication that discovers files:

   private static void buildApplication() {
      def groovyFiles = new
PathMatchingResourcePatternResolver().getResources(
            'classpath*:**grails-app/**/*.groovy')
      def domainClasses = []
      for (file in groovyFiles) {
         String className = GrailsResourceUtils.getClassName(file)
         domainClasses << GormHelper.classLoader.loadClass(className)
      }

      application = new DefaultGrailsApplication(
            domainClasses as Class[],
            new GroovyClassLoader(GormHelper.classLoader))
      application.initialise()
   }

Burt

On Sunday 07 September 2008 12:22:01 am Burt Beckwith wrote:

> Interesting progress. I couldn't get it to run - are you running from the
> commandline using Ant? I'm not seeing how the classloader will find the
> classes if they're not under src/groovy.
>
> Btw - the array problem is due to Groovy thinking you're defining a
> closure, but this will work:
>
>    def domainClasses = [bookClass, carClass, personClass, songClass]
>    application = new DefaultGrailsApplication(domainClasses as Class[],
>          new GroovyClassLoader(GormHelper.classLoader))
>
> Burt
>
> On Saturday 06 September 2008 11:37:17 pm Gregory Bond wrote:
> > playing around some more i've managed to get burt's entire example to
> > run in a jar file without any groovy scripts in the jar (!) -
> > unfortunately it's not a general solution but perhaps what i've done
> > will help achieve one
> >
> > the major change i made is to explicitly load the domain classes into
> > the application - i've attached a zip with the updated code but here's
> > a quick overview of what i've done (it's not much really):
> >
> > 1) i moved Main.groovy from the scripts dir to src/groovy in order to
> > get it to be compiled
> >
> > 2) i've replaced occurrences of classLoader.getResource(...groovy
> > files...) with appropriate variations on classLoader.loadClass()
> >
> > 3) instead of creating the application this way:
> >
> > application = new DefaultGrailsApplication(groovyFiles)
> >
> > i'm using this (cumbersome, non-general, but working) approach:
> >
> >        Class bookClass =
> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Book")
> >        Class carClass =
> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Car")
> >        Class personClass =
> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Person")
> >        Class songClass =
> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Song")
> >        Class[] domainClasses = new Class[4]
> >        domainClasses[0] = bookClass
> >        domainClasses[1] = carClass
> >        domainClasses[2] = personClass
> >        domainClasses[3] = songClass
> >                application = new DefaultGrailsApplication(domainClasses,
> > new GroovyClassLoader(GormHelper.classLoader))
> >
> > (as a sidenote that probably highlights my ignorance of grails and
> > groovy: i kept getting compilation errors when i tried to initialize
> > the domain class array when i declared it e.g. using syntax 'Class[]
> > domainClasses = new Class[] { bookClass, .... }')
> >
> > greg
> >
> > On Tue, Sep 2, 2008 at 12:05 PM, Burt Beckwith <burt@...>
>
> wrote:
> > > Right, I mentioned the problem with the metaclass methods in the blog
> > > post. I won't have time today to look at this but I'll take a look this
> > > evening.
> > >
> > > Burt
> > >
> > > On Tuesday 02 September 2008 11:03:52 am Gregory W. Bond wrote:
> > >> i've been playing around with this code for a couple of days now
> > >> trying to get it to work in a self-contained jar file (since i
> > >> eventually want to use the code to access gorm from java) - the
> > >> problem i run into is that the dynamic gorm 'save()' method isn't
> > >> found at runtime (see stack trace below) - the problem disappears if i
> > >> include the 'grails-app' directory containing the domain class
> > >> definitions in the same directory as the jar file containing the
> > >> compiled class files
> > >>
> > >> my jar file ('beckwith.jar') includes all the class files generated by
> > >> 'grails compile' as well as the 'grails-app' directory contents and
> > >> the 'application.properties' file - at the moment i have to include
> > >> the file 'scripts/Main.groovy' in the same directory as the jar file
> > >> until i figure out how to load it as a resource from the jar file
> > >>
> > >> here's the command i'm using to run the program
> > >>
> > >> java -classpath
> > >> beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/sp
> > >>ri ng-
> > >> 2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/g
> > >>ra ils-
> > >> core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-sp
> > >>ri ng-1
> > >> .0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibe
> > >>rn ate-
> > >> annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j
> > >>-1 .6.1
> > >> .jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME
> > >>/l ib/c
> > >> ommons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/m
> > >>ys ql-c
> > >> onnector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar
> > >> Tester
> > >>
> > >> here's the exception i get - any idea how to get around this?
> > >>
> > >> Exception in thread "main" groovy.lang.MissingMethodException: No
> > >> signature of method: com.burtbeckwith.gorm.domain.Book.save() is
> > >> applicable for argument types: () values: {}
> > >>         at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecod
> > >>eA dap ter.java:55) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecod
> > >>eA dap ter.java:60) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
> > >>By tec odeAdapter.java:172) at
> > >> com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelp
> > >>er .ja va:784) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
> > >>av a:7 58) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
> > >>By tec odeAdapter.java:170) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(Script
> > >>By tec odeAdapter.java:198) at Main.run(Main.groovy:7)
> > >>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
> > >>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
> > >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > >>         at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > >>av a:3 9) at
> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
> > >> at
> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> > >>         at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelp
> > >>er .ja va:778) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
> > >>av a:7 58) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
> > >>By tec odeAdapter.java:170) at
> > >> Tester$_main_closure1.doCall(Tester.groovy:12) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > >>av a:3 9) at
> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
> > >> at
> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> > >>         at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> > >> groovy.lang.Closure.call(Closure.java:292)
> > >>         at groovy.lang.Closure.call(Closure.java:305)
> > >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > >>         at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > >>av a:3 9) at
> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
> > >> at
> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> > >>         at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelp
> > >>er .ja va:778) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
> > >>av a:7 58) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
> > >>By tec odeAdapter.java:170) at
> > >> com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(Gorm
> > >>He lpe r.groovy:133) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > >>av a:3 9) at
> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
> > >> at
> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> > >>         at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> > >> groovy.lang.Closure.call(Closure.java:292)
> > >>         at
> > >> org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClo
> > >>su re. java:48) at
> > >> org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler
> > >>.j ava
> > >>
> > >>:72) at $Proxy0.doInTransaction(Unknown Source)
> > >>
> > >>         at
> > >> org.springframework.transaction.support.TransactionTemplate.execute(Tr
> > >>an sac tionTemplate.java:128) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > >>av a:3 9) at
> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
> > >> at
> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
> > >>         at
> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelp
> > >>er .ja va:766) at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
> > >>av a:7 54) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
> > >>By tec odeAdapter.java:170) at
> > >> com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132
> > >>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
> > >>av a:3 9) at
> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
> > >> at
> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
> > >> groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
> > >>         at
> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
> > >>av a:7 49) at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
> > >>By tec odeAdapter.java:170) at Tester.main(Tester.groovy:10)
> > >>
> > >> burtbeckwith wrote:
> > >> > I spent some time on this and got it working. I've posted a writeup
> > >> > and a zip
> > >> > file here: http://burtbeckwith.com/blog/?p=66
> > >> >
> > >> > Burt
> > >> >
> > >> > On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
> > >> >> Clarifying:
> > >> >>
> > >> >> So there are two projects that purport to allow one to use grails
> > >> >> without having a web server around:
> > >> >>
> > >> >> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
> > >> >> which is based on:
> > >> >> http://jweldin.com/blog/?p=6
> > >> >>
> > >> >> However, both are over a year old and don't compile.  Both use this
> > >> >> constructor:
> > >> >>
> > >> >>        application =
> > >> >>           new DefaultGrailsApplication( groovyFiles, new
> > >> >> GormInjectionOperation() )
> > >> >>
> > >> >> which, it seems, no longer exists.
> > >> >>
> > >> >> My suspicion is that this configuration is all done now via Spring.
> > >> >> Is this true?
> > >> >>
> > >> >> I'm trying to read through the grails Gant scripts source to figure
> > >> >> out how grails starts up, but it's not clear yet.  I've tried
> > >> >> various methods on GrailsUtil like:
> > >> >>
> > >> >>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
> > >> >> or
> > >> >>    ApplicationContext appContext = GrailsUtil
> > >> >>    .bootstrapGrailsFromClassPath()
> > >> >>    DefaultGrailsApplication grailsApplication =
> > >> >>         (DefaultGrailsApplication)appContext
> > >> >>            .getBean("grailsApplication", D
> > >> >>              efaultGrailsApplication.class);
> > >> >>
> > >> >> but this seems to result in class not found errors, I assume
> > >> >> because the Gant scripts are responsible for classpathy stuff that
> > >> >> I'm not yet doing (eg Init.groovy:setClasspath()). Am I headed in
> > >> >> the right direction?
> > >> >>
> > >> >> If I simply omit the GormInjectionOperation from the code posted
> > >> >> above, obviously, none of the GORM methods are available on doman
> > >> >> objects.
> > >> >>
> > >> >> Any hints would be most appreciated.  My goal is something I can
> > >> >> run via java -jar that will execute a groovy script using GORM
> > >> >> domain classes.
> > >> >>
> > >> >> I offer beer to anyone who can help me get this working!  And I
> > >> >> promise to post it somewhere for all to read!
> > >> >>
> > >> >> -c
> > >> >>
> > >> >> Christopher Mason wrote:
> > >> >> > Can anyone help update this code for grails 1.0.3?
> > >> >> >
> > >> >> > http://jweldin.com/blog/?p=6
> > >> >> >
> > >> >> > Does anyone have this working?  (I see several posts but none of
> > >> >> > them seem to have successful resolutions.)
> > >> >> >
> > >> >> > Thanks so much!
> > >> >> >
> > >> >> > -c
> > >> >> >
> > >> >> >
> > >> >> > import groovy.lang.GroovyClassLoader;
> > >> >> > import groovy.lang.GroovyObject;
> > >> >> > import org.codehaus.groovy.grails.commons.*;
> > >> >> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
> > >> >> > import org.hibernate.SessionFactory;
> > >> >> > import org.springframework.core.io.*;
> > >> >> > import org.springframework.core.io.support.*
> > >> >> > import
> > >> >> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoa
> > >> >> >de r import
> > >> >> > org.codehaus.groovy.grails.compiler.injection.ClassInjector;
> > >> >> >
> > >> >> > class RunScript
> > >> >> > {
> > >> >> >     public static void main(String[] args)
> > >> >> >     {
> > >> >> >
> > >> >> >         if (args.length < 2) {
> > >> >> >             println "Usage: java -jar profiler-script.jar
> > >> >> > <db.props> <script name> <script args>"
> > >> >> >         }
> > >> >> >
> > >> >> >         GrailsApplication grailsApplication = null;
> > >> >> >         SessionFactory sessionFactory = null;
> > >> >> >
> > >> >> >         PathMatchingResourcePatternResolver resolver = new
> > >> >> > PathMatchingResourcePatternResolver();
> > >> >> >
> > >> >> >         Resource[] groovyFiles =
> > >> >> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
> > >> >> >
> > >> >> >         grailsApplication = new
> > >> >> > DefaultGrailsApplication(groovyFiles);
> > >> >> >
> > >> >> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
> > >> >> >         gcl.setClassInjectors([ new
> > >> >> > DefaultGrailsDomainClassInjector()
> > >> >>
> > >> >> ]
> > >> >>
> > >> >> > as ClassInjector[])
> > >> >> >
> > >> >> >         DefaultGrailsDomainConfiguration config = new
> > >> >> > DefaultGrailsDomainConfiguration();
> > >> >> >         config.setGrailsApplication(grailsApplication);
> > >> >> >
> > >> >> >         Properties props = new Properties();
> > >> >> >         props.load(new FileInputStream(args[0]));
> > >> >> >         config.setProperties(props);
> > >> >> >
> > >> >> >         sessionFactory = config.buildSessionFactory();
> > >> >> >
> > >> >> >        
> > >> >> > GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
> > >> >> > grailsApplication);
> > >> >> >
> > >> >> >         GroovyClassLoader cl = gcl
> > >> >> > //grailsApplication.getClassLoader()
> > >> >> >
> > >> >> >         println "\n-----------\nBefore Main\n-----------\n"
> > >> >> >
> > >> >> >         Binding b = new Binding(args[3..args.length-1] as
> > >> >> > String[]) def TestDomainScript =
> > >> >> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
> > >> >> >         TestDomainScript.run()
> > >> >> >
> > >> >> >         println "\n-----------\nAfter Main\n-----------\n"
> > >> >> >         println "\nDone";
> > >> >> >
> > >> >> >     }
> > >> >> > }
> > >> >> >
> > >> >> >
> > >> >> > import
> > >> >> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOper
> > >> >> >at ion ; import org.codehaus.groovy.grails.compiler.injection.*;
> > >> >> > import org.apache.commons.logging.Log;
> > >> >> > import org.apache.commons.logging.LogFactory;
> > >> >> > import org.codehaus.groovy.ast.ClassNode;
> > >> >> > import org.codehaus.groovy.classgen.GeneratorContext;
> > >> >> > import org.codehaus.groovy.control.CompilationFailedException;
> > >> >> > import org.codehaus.groovy.control.CompilationUnit;
> > >> >> > import org.codehaus.groovy.control.Phases;
> > >> >> > import org.codehaus.groovy.control.SourceUnit;
> > >> >> > import
> > >> >>
> > >> >> org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
> > >> >>
> > >> >> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
> > >> >> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
> > >> >> >
> > >> >> > public class MyInjectionOperation extends
> > >> >> > GrailsInjectionOperation {
> > >> >> >
> > >> >> >         private static GrailsDomainClassInjector injector = new
> > >> >> > DefaultGrailsDomainClassInjector();;
> > >> >> >     private GrailsResourceLoader resourceLoader;
> > >> >> >
> > >> >> >     public void call(SourceUnit source, GeneratorContext context,
> > >> >> > ClassNode classNode) throws CompilationFailedException
> > >> >> >         {
> > >> >> >
> > >> >> >                 if(resourceLoader != null)
> > >> >> >                 {
> > >> >> >             try {
> > >> >> >                 URL url;
> > >> >> >
> > >> >> > if(GrailsResourceUtils.isGrailsPath(source.getName())) {
> > >> >> >                     url =
> > >> >>
> > >> >> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(so
> > >> >>ur ce. g
> > >> >>
> > >> >> >etName()));
> > >> >> >
> > >> >> >                 }
> > >> >> >                 else
> > >> >> >                                 {
> > >> >> >                     url =
> > >> >> > resourceLoader.loadGroovySource(source.getName());
> > >> >> >                 }
> > >> >> >                 if(GrailsResourceUtils.isDomainClass(url))
> > >> >> >                                 {
> > >> >> >
> > >> >> > this.injector.performInjection(source,context,classNode);
> > >> >> >                 }
> > >> >> >
> > >> >> >             }
> > >> >> >                         catch (MalformedURLException e)
> > >> >> >                         {
> > >> >> >                 println("Error loading URL during addition of
> > >> >> > compile time properties: " + e.getMessage(),e);
> > >> >> >                 throw new
> > >> >> > CompilationFailedException(Phases.CONVERSION,source,e);
> > >> >> >             }
> > >> >> >         }
> > >> >> >     }
> > >> >> >
> > >> >> >     public void setResourceLoader(GrailsResourceLoader
> > >> >> > resourceLoader) {
> > >> >> >         this.resourceLoader = resourceLoader;
> > >> >> >     }
> > >> >> > }
> > >> >> >
> > >> >> >
> > >> >> >
> > >> >> >
> > >> >> > -----------------------------------------------------------------
> > >> >> >-- -- To unsubscribe from this list, please visit:
> > >> >> >
> > >> >> >    http://xircles.codehaus.org/manage_email
> > >> >>
> > >> >> -------------------------------------------------------------------
> > >> >>-- To unsubscribe from this list, please visit:
> > >> >>
> > >> >>     http://xircles.codehaus.org/manage_email
> > >> >
> > >> > --------------------------------------------------------------------
> > >> >- To unsubscribe from this list, please visit:
> > >> >
> > >> >     http://xircles.codehaus.org/manage_email
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe from this list, please visit:
> > >
> > >    http://xircles.codehaus.org/manage_email



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by Gregory W. Bond :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

i can't get your approach to work unless the grails-app directory (and
the underlying domain class groovy files) are present in the same
directory i invoke java from - i tried to add the grails-app dir and
underlying groovy files to the jar file but that didn't work

greg

On Sun, Sep 7, 2008 at 2:12 AM, Burt Beckwith <burt@...> wrote:

> Sorry, I missed the part about running 'grails compile' in your previous
> email. It's working fine now - cool stuff.
>
> Here's a reworked version of buildApplication that discovers files:
>
>   private static void buildApplication() {
>      def groovyFiles = new
> PathMatchingResourcePatternResolver().getResources(
>            'classpath*:**grails-app/**/*.groovy')
>      def domainClasses = []
>      for (file in groovyFiles) {
>         String className = GrailsResourceUtils.getClassName(file)
>         domainClasses << GormHelper.classLoader.loadClass(className)
>      }
>
>      application = new DefaultGrailsApplication(
>            domainClasses as Class[],
>            new GroovyClassLoader(GormHelper.classLoader))
>      application.initialise()
>   }
>
> Burt
>
> On Sunday 07 September 2008 12:22:01 am Burt Beckwith wrote:
>> Interesting progress. I couldn't get it to run - are you running from the
>> commandline using Ant? I'm not seeing how the classloader will find the
>> classes if they're not under src/groovy.
>>
>> Btw - the array problem is due to Groovy thinking you're defining a
>> closure, but this will work:
>>
>>    def domainClasses = [bookClass, carClass, personClass, songClass]
>>    application = new DefaultGrailsApplication(domainClasses as Class[],
>>          new GroovyClassLoader(GormHelper.classLoader))
>>
>> Burt
>>
>> On Saturday 06 September 2008 11:37:17 pm Gregory Bond wrote:
>> > playing around some more i've managed to get burt's entire example to
>> > run in a jar file without any groovy scripts in the jar (!) -
>> > unfortunately it's not a general solution but perhaps what i've done
>> > will help achieve one
>> >
>> > the major change i made is to explicitly load the domain classes into
>> > the application - i've attached a zip with the updated code but here's
>> > a quick overview of what i've done (it's not much really):
>> >
>> > 1) i moved Main.groovy from the scripts dir to src/groovy in order to
>> > get it to be compiled
>> >
>> > 2) i've replaced occurrences of classLoader.getResource(...groovy
>> > files...) with appropriate variations on classLoader.loadClass()
>> >
>> > 3) instead of creating the application this way:
>> >
>> > application = new DefaultGrailsApplication(groovyFiles)
>> >
>> > i'm using this (cumbersome, non-general, but working) approach:
>> >
>> >        Class bookClass =
>> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Book")
>> >        Class carClass =
>> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Car")
>> >        Class personClass =
>> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Person")
>> >        Class songClass =
>> > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Song")
>> >        Class[] domainClasses = new Class[4]
>> >        domainClasses[0] = bookClass
>> >        domainClasses[1] = carClass
>> >        domainClasses[2] = personClass
>> >        domainClasses[3] = songClass
>> >                application = new DefaultGrailsApplication(domainClasses,
>> > new GroovyClassLoader(GormHelper.classLoader))
>> >
>> > (as a sidenote that probably highlights my ignorance of grails and
>> > groovy: i kept getting compilation errors when i tried to initialize
>> > the domain class array when i declared it e.g. using syntax 'Class[]
>> > domainClasses = new Class[] { bookClass, .... }')
>> >
>> > greg
>> >
>> > On Tue, Sep 2, 2008 at 12:05 PM, Burt Beckwith <burt@...>
>>
>> wrote:
>> > > Right, I mentioned the problem with the metaclass methods in the blog
>> > > post. I won't have time today to look at this but I'll take a look this
>> > > evening.
>> > >
>> > > Burt
>> > >
>> > > On Tuesday 02 September 2008 11:03:52 am Gregory W. Bond wrote:
>> > >> i've been playing around with this code for a couple of days now
>> > >> trying to get it to work in a self-contained jar file (since i
>> > >> eventually want to use the code to access gorm from java) - the
>> > >> problem i run into is that the dynamic gorm 'save()' method isn't
>> > >> found at runtime (see stack trace below) - the problem disappears if i
>> > >> include the 'grails-app' directory containing the domain class
>> > >> definitions in the same directory as the jar file containing the
>> > >> compiled class files
>> > >>
>> > >> my jar file ('beckwith.jar') includes all the class files generated by
>> > >> 'grails compile' as well as the 'grails-app' directory contents and
>> > >> the 'application.properties' file - at the moment i have to include
>> > >> the file 'scripts/Main.groovy' in the same directory as the jar file
>> > >> until i figure out how to load it as a resource from the jar file
>> > >>
>> > >> here's the command i'm using to run the program
>> > >>
>> > >> java -classpath
>> > >> beckwith.jar:$GRAILS_HOME/lib/groovy-all-1.5.6.jar:$GRAILS_HOME/lib/sp
>> > >>ri ng-
>> > >> 2.5.4.jar:$GRAILS_HOME/lib/commons-logging-1.1.jar:$GRAILS_HOME/dist/g
>> > >>ra ils-
>> > >> core-1.0.3.jar:$GRAILS_HOME/lib/javaee.jar:$GRAILS_HOME/dist/grails-sp
>> > >>ri ng-1
>> > >> .0.3.jar:$GRAILS_HOME/dist/grails-gorm-1.0.3.jar:$GRAILS_HOME/lib/hibe
>> > >>rn ate-
>> > >> annotations.jar:$GRAILS_HOME/lib/hibernate3.jar:$GRAILS_HOME/lib/dom4j
>> > >>-1 .6.1
>> > >> .jar:$GRAILS_HOME/lib/hibernate-commons-annotations.jar:.:$GRAILS_HOME
>> > >>/l ib/c
>> > >> ommons-lang-2.1.jar:$GRAILS_HOME/lib/commons-collections-3.2.jar:lib/m
>> > >>ys ql-c
>> > >> onnector-java-5.0.8-bin.jar:$GRAILS_HOME/lib/cglib-nodep-2.1_3.jar
>> > >> Tester
>> > >>
>> > >> here's the exception i get - any idea how to get around this?
>> > >>
>> > >> Exception in thread "main" groovy.lang.MissingMethodException: No
>> > >> signature of method: com.burtbeckwith.gorm.domain.Book.save() is
>> > >> applicable for argument types: () values: {}
>> > >>         at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecod
>> > >>eA dap ter.java:55) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecod
>> > >>eA dap ter.java:60) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
>> > >>By tec odeAdapter.java:172) at
>> > >> com.burtbeckwith.gorm.domain.Book.invokeMethod(Book.groovy) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelp
>> > >>er .ja va:784) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
>> > >>av a:7 58) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
>> > >>By tec odeAdapter.java:170) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(Script
>> > >>By tec odeAdapter.java:198) at Main.run(Main.groovy:7)
>> > >>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:473)
>> > >>         at groovy.lang.GroovyShell.evaluate(GroovyShell.java:508)
>> > >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> > >>         at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
>> > >>av a:3 9) at
>> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
>> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> > >> at
>> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
>> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
>> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> > >>         at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelp
>> > >>er .ja va:778) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
>> > >>av a:7 58) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
>> > >>By tec odeAdapter.java:170) at
>> > >> Tester$_main_closure1.doCall(Tester.groovy:12) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
>> > >>av a:3 9) at
>> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
>> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> > >> at
>> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
>> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
>> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> > >>         at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
>> > >> groovy.lang.Closure.call(Closure.java:292)
>> > >>         at groovy.lang.Closure.call(Closure.java:305)
>> > >>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> > >>         at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
>> > >>av a:3 9) at
>> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
>> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> > >> at
>> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
>> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
>> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> > >>         at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelp
>> > >>er .ja va:778) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
>> > >>av a:7 58) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
>> > >>By tec odeAdapter.java:170) at
>> > >> com.burtbeckwith.gorm.GormHelper$_withTransaction_closure1.doCall(Gorm
>> > >>He lpe r.groovy:133) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
>> > >>av a:3 9) at
>> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
>> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> > >> at
>> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
>> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
>> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> > >>         at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
>> > >> groovy.lang.Closure.call(Closure.java:292)
>> > >>         at
>> > >> org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClo
>> > >>su re. java:48) at
>> > >> org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler
>> > >>.j ava
>> > >>
>> > >>:72) at $Proxy0.doInTransaction(Unknown Source)
>> > >>
>> > >>         at
>> > >> org.springframework.transaction.support.TransactionTemplate.execute(Tr
>> > >>an sac tionTemplate.java:128) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
>> > >>av a:3 9) at
>> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
>> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> > >> at
>> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
>> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) at
>> > >> groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:946)
>> > >>         at
>> > >> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelp
>> > >>er .ja va:766) at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
>> > >>av a:7 54) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
>> > >>By tec odeAdapter.java:170) at
>> > >> com.burtbeckwith.gorm.GormHelper.withTransaction(GormHelper.groovy:132
>> > >>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
>> > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.j
>> > >>av a:3 9) at
>> > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccess
>> > >>or Imp l.java:25) at java.lang.reflect.Method.invoke(Method.java:585)
>> > >> at
>> > >> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:8
>> > >>6) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) at
>> > >> groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
>> > >>         at
>> > >> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.j
>> > >>av a:7 49) at
>> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(Script
>> > >>By tec odeAdapter.java:170) at Tester.main(Tester.groovy:10)
>> > >>
>> > >> burtbeckwith wrote:
>> > >> > I spent some time on this and got it working. I've posted a writeup
>> > >> > and a zip
>> > >> > file here: http://burtbeckwith.com/blog/?p=66
>> > >> >
>> > >> > Burt
>> > >> >
>> > >> > On Saturday 23 August 2008 3:59:22 pm Christopher Mason wrote:
>> > >> >> Clarifying:
>> > >> >>
>> > >> >> So there are two projects that purport to allow one to use grails
>> > >> >> without having a web server around:
>> > >> >>
>> > >> >> http://docs.codehaus.org/display/GRAILS/GORM+-+StandAlone+Gorm
>> > >> >> which is based on:
>> > >> >> http://jweldin.com/blog/?p=6
>> > >> >>
>> > >> >> However, both are over a year old and don't compile.  Both use this
>> > >> >> constructor:
>> > >> >>
>> > >> >>        application =
>> > >> >>           new DefaultGrailsApplication( groovyFiles, new
>> > >> >> GormInjectionOperation() )
>> > >> >>
>> > >> >> which, it seems, no longer exists.
>> > >> >>
>> > >> >> My suspicion is that this configuration is all done now via Spring.
>> > >> >> Is this true?
>> > >> >>
>> > >> >> I'm trying to read through the grails Gant scripts source to figure
>> > >> >> out how grails starts up, but it's not clear yet.  I've tried
>> > >> >> various methods on GrailsUtil like:
>> > >> >>
>> > >> >>    GrailsUtil.bootstrapGrailsFromApplication(grailsApplication)
>> > >> >> or
>> > >> >>    ApplicationContext appContext = GrailsUtil
>> > >> >>    .bootstrapGrailsFromClassPath()
>> > >> >>    DefaultGrailsApplication grailsApplication =
>> > >> >>         (DefaultGrailsApplication)appContext
>> > >> >>            .getBean("grailsApplication", D
>> > >> >>              efaultGrailsApplication.class);
>> > >> >>
>> > >> >> but this seems to result in class not found errors, I assume
>> > >> >> because the Gant scripts are responsible for classpathy stuff that
>> > >> >> I'm not yet doing (eg Init.groovy:setClasspath()). Am I headed in
>> > >> >> the right direction?
>> > >> >>
>> > >> >> If I simply omit the GormInjectionOperation from the code posted
>> > >> >> above, obviously, none of the GORM methods are available on doman
>> > >> >> objects.
>> > >> >>
>> > >> >> Any hints would be most appreciated.  My goal is something I can
>> > >> >> run via java -jar that will execute a groovy script using GORM
>> > >> >> domain classes.
>> > >> >>
>> > >> >> I offer beer to anyone who can help me get this working!  And I
>> > >> >> promise to post it somewhere for all to read!
>> > >> >>
>> > >> >> -c
>> > >> >>
>> > >> >> Christopher Mason wrote:
>> > >> >> > Can anyone help update this code for grails 1.0.3?
>> > >> >> >
>> > >> >> > http://jweldin.com/blog/?p=6
>> > >> >> >
>> > >> >> > Does anyone have this working?  (I see several posts but none of
>> > >> >> > them seem to have successful resolutions.)
>> > >> >> >
>> > >> >> > Thanks so much!
>> > >> >> >
>> > >> >> > -c
>> > >> >> >
>> > >> >> >
>> > >> >> > import groovy.lang.GroovyClassLoader;
>> > >> >> > import groovy.lang.GroovyObject;
>> > >> >> > import org.codehaus.groovy.grails.commons.*;
>> > >> >> > import org.codehaus.groovy.grails.orm.hibernate.cfg.*;
>> > >> >> > import org.hibernate.SessionFactory;
>> > >> >> > import org.springframework.core.io.*;
>> > >> >> > import org.springframework.core.io.support.*
>> > >> >> > import
>> > >> >> > org.codehaus.groovy.grails.compiler.injection.GrailsAwareClassLoa
>> > >> >> >de r import
>> > >> >> > org.codehaus.groovy.grails.compiler.injection.ClassInjector;
>> > >> >> >
>> > >> >> > class RunScript
>> > >> >> > {
>> > >> >> >     public static void main(String[] args)
>> > >> >> >     {
>> > >> >> >
>> > >> >> >         if (args.length < 2) {
>> > >> >> >             println "Usage: java -jar profiler-script.jar
>> > >> >> > <db.props> <script name> <script args>"
>> > >> >> >         }
>> > >> >> >
>> > >> >> >         GrailsApplication grailsApplication = null;
>> > >> >> >         SessionFactory sessionFactory = null;
>> > >> >> >
>> > >> >> >         PathMatchingResourcePatternResolver resolver = new
>> > >> >> > PathMatchingResourcePatternResolver();
>> > >> >> >
>> > >> >> >         Resource[] groovyFiles =
>> > >> >> > resolver.getResources("classpath*:**grails-app/**/*.groovy");
>> > >> >> >
>> > >> >> >         grailsApplication = new
>> > >> >> > DefaultGrailsApplication(groovyFiles);
>> > >> >> >
>> > >> >> >         GrailsAwareClassLoader gcl = new GrailsAwareClassLoader()
>> > >> >> >         gcl.setClassInjectors([ new
>> > >> >> > DefaultGrailsDomainClassInjector()
>> > >> >>
>> > >> >> ]
>> > >> >>
>> > >> >> > as ClassInjector[])
>> > >> >> >
>> > >> >> >         DefaultGrailsDomainConfiguration config = new
>> > >> >> > DefaultGrailsDomainConfiguration();
>> > >> >> >         config.setGrailsApplication(grailsApplication);
>> > >> >> >
>> > >> >> >         Properties props = new Properties();
>> > >> >> >         props.load(new FileInputStream(args[0]));
>> > >> >> >         config.setProperties(props);
>> > >> >> >
>> > >> >> >         sessionFactory = config.buildSessionFactory();
>> > >> >> >
>> > >> >> >
>> > >> >> > GrailsHibernateUtil.configureDynamicMethods(sessionFactory,
>> > >> >> > grailsApplication);
>> > >> >> >
>> > >> >> >         GroovyClassLoader cl = gcl
>> > >> >> > //grailsApplication.getClassLoader()
>> > >> >> >
>> > >> >> >         println "\n-----------\nBefore Main\n-----------\n"
>> > >> >> >
>> > >> >> >         Binding b = new Binding(args[3..args.length-1] as
>> > >> >> > String[]) def TestDomainScript =
>> > >> >> > (Script)cl.loadClass(args[1],false,true).newInstance(b)
>> > >> >> >         TestDomainScript.run()
>> > >> >> >
>> > >> >> >         println "\n-----------\nAfter Main\n-----------\n"
>> > >> >> >         println "\nDone";
>> > >> >> >
>> > >> >> >     }
>> > >> >> > }
>> > >> >> >
>> > >> >> >
>> > >> >> > import
>> > >> >> > org.codehaus.groovy.grails.compiler.injection.GrailsInjectionOper
>> > >> >> >at ion ; import org.codehaus.groovy.grails.compiler.injection.*;
>> > >> >> > import org.apache.commons.logging.Log;
>> > >> >> > import org.apache.commons.logging.LogFactory;
>> > >> >> > import org.codehaus.groovy.ast.ClassNode;
>> > >> >> > import org.codehaus.groovy.classgen.GeneratorContext;
>> > >> >> > import org.codehaus.groovy.control.CompilationFailedException;
>> > >> >> > import org.codehaus.groovy.control.CompilationUnit;
>> > >> >> > import org.codehaus.groovy.control.Phases;
>> > >> >> > import org.codehaus.groovy.control.SourceUnit;
>> > >> >> > import
>> > >> >>
>> > >> >> org.codehaus.groovy.grails.compiler.support.GrailsResourceLoader;
>> > >> >>
>> > >> >> > import org.codehaus.groovy.grails.commons.GrailsResourceUtils
>> > >> >> > import org.codehaus.groovy.grails.compiler.GrailsClassLoader;
>> > >> >> >
>> > >> >> > public class MyInjectionOperation extends
>> > >> >> > GrailsInjectionOperation {
>> > >> >> >
>> > >> >> >         private static GrailsDomainClassInjector injector = new
>> > >> >> > DefaultGrailsDomainClassInjector();;
>> > >> >> >     private GrailsResourceLoader resourceLoader;
>> > >> >> >
>> > >> >> >     public void call(SourceUnit source, GeneratorContext context,
>> > >> >> > ClassNode classNode) throws CompilationFailedException
>> > >> >> >         {
>> > >> >> >
>> > >> >> >                 if(resourceLoader != null)
>> > >> >> >                 {
>> > >> >> >             try {
>> > >> >> >                 URL url;
>> > >> >> >
>> > >> >> > if(GrailsResourceUtils.isGrailsPath(source.getName())) {
>> > >> >> >                     url =
>> > >> >>
>> > >> >> resourceLoader.loadGroovySource(GrailsResourceUtils.getClassName(so
>> > >> >>ur ce. g
>> > >> >>
>> > >> >> >etName()));
>> > >> >> >
>> > >> >> >                 }
>> > >> >> >                 else
>> > >> >> >                                 {
>> > >> >> >                     url =
>> > >> >> > resourceLoader.loadGroovySource(source.getName());
>> > >> >> >                 }
>> > >> >> >                 if(GrailsResourceUtils.isDomainClass(url))
>> > >> >> >                                 {
>> > >> >> >
>> > >> >> > this.injector.performInjection(source,context,classNode);
>> > >> >> >                 }
>> > >> >> >
>> > >> >> >             }
>> > >> >> >                         catch (MalformedURLException e)
>> > >> >> >                         {
>> > >> >> >                 println("Error loading URL during addition of
>> > >> >> > compile time properties: " + e.getMessage(),e);
>> > >> >> >                 throw new
>> > >> >> > CompilationFailedException(Phases.CONVERSION,source,e);
>> > >> >> >             }
>> > >> >> >         }
>> > >> >> >     }
>> > >> >> >
>> > >> >> >     public void setResourceLoader(GrailsResourceLoader
>> > >> >> > resourceLoader) {
>> > >> >> >         this.resourceLoader = resourceLoader;
>> > >> >> >     }
>> > >> >> > }
>> > >> >> >
>> > >> >> >
>> > >> >> >
>> > >> >> >
>> > >> >> > -----------------------------------------------------------------
>> > >> >> >-- -- To unsubscribe from this list, please visit:
>> > >> >> >
>> > >> >> >    http://xircles.codehaus.org/manage_email
>> > >> >>
>> > >> >> -------------------------------------------------------------------
>> > >> >>-- To unsubscribe from this list, please visit:
>> > >> >>
>> > >> >>     http://xircles.codehaus.org/manage_email
>> > >> >
>> > >> > --------------------------------------------------------------------
>> > >> >- To unsubscribe from this list, please visit:
>> > >> >
>> > >> >     http://xircles.codehaus.org/manage_email
>> > >
>> > > ---------------------------------------------------------------------
>> > > To unsubscribe from this list, please visit:
>> > >
>> > >    http://xircles.codehaus.org/manage_email
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>    http://xircles.codehaus.org/manage_email
>
>
>

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email



Re: GORM outside Grails

by Burt Beckwith :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Oops, turns out that code depends on the grails-app classes being in the
current directory. I reworked things so when it builds the domain class jar
it creates a text file listing domain classes, so GormHelper knows what
classes to add to the application.

It's working great, and I even wrote a Swing app to test it. I wrote it up
here: http://burtbeckwith.com/blog/?p=72

Burt

On Sunday 07 September 2008 2:12:03 am Burt Beckwith wrote:

> Sorry, I missed the part about running 'grails compile' in your previous
> email. It's working fine now - cool stuff.
>
> Here's a reworked version of buildApplication that discovers files:
>
>    private static void buildApplication() {
>       def groovyFiles = new
> PathMatchingResourcePatternResolver().getResources(
>             'classpath*:**grails-app/**/*.groovy')
>       def domainClasses = []
>       for (file in groovyFiles) {
>          String className = GrailsResourceUtils.getClassName(file)
>          domainClasses << GormHelper.classLoader.loadClass(className)
>       }
>
>       application = new DefaultGrailsApplication(
>             domainClasses as Class[],
>             new GroovyClassLoader(GormHelper.classLoader))
>       application.initialise()
>    }
>
> Burt
>
> On Sunday 07 September 2008 12:22:01 am Burt Beckwith wrote:
> > Interesting progress. I couldn't get it to run - are you running from the
> > commandline using Ant? I'm not seeing how the classloader will find the
> > classes if they're not under src/groovy.
> >
> > Btw - the array problem is due to Groovy thinking you're defining a
> > closure, but this will work:
> >
> >    def domainClasses = [bookClass, carClass, personClass, songClass]
> >    application = new DefaultGrailsApplication(domainClasses as Class[],
> >          new GroovyClassLoader(GormHelper.classLoader))
> >
> > Burt
> >
> > On Saturday 06 September 2008 11:37:17 pm Gregory Bond wrote:
> > > playing around some more i've managed to get burt's entire example to
> > > run in a jar file without any groovy scripts in the jar (!) -
> > > unfortunately it's not a general solution but perhaps what i've done
> > > will help achieve one
> > >
> > > the major change i made is to explicitly load the domain classes into
> > > the application - i've attached a zip with the updated code but here's
> > > a quick overview of what i've done (it's not much really):
> > >
> > > 1) i moved Main.groovy from the scripts dir to src/groovy in order to
> > > get it to be compiled
> > >
> > > 2) i've replaced occurrences of classLoader.getResource(...groovy
> > > files...) with appropriate variations on classLoader.loadClass()
> > >
> > > 3) instead of creating the application this way:
> > >
> > > application = new DefaultGrailsApplication(groovyFiles)
> > >
> > > i'm using this (cumbersome, non-general, but working) approach:
> > >
> > >        Class bookClass =
> > > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Book")
> > >        Class carClass =
> > > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Car")
> > >        Class personClass =
> > > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Person")
> > >        Class songClass =
> > > GormHelper.classLoader.loadClass("com.burtbeckwith.gorm.domain.Song")
> > >        Class[] domainClasses = new Class[4]
> > >        domainClasses[0] = bookClass
> > >        domainClasses[1] = carClass
> > >        domainClasses[2] = personClass
> > >        domainClasses[3] = songClass
> > >                application = new
> > > DefaultGrailsApplication(domainClasses, new
> > > GroovyClassLoader(GormHelper.classLoader))
> > >
> > > (as a sidenote that probably highlights my ignorance of grails and
> > > groovy: i kept getting compilation errors when i tried to initialize
> > > the domain class array when i declared it e.g. using syntax 'Class[]
> > > domainClasses = new Class[] { bookClass, .... }')
> > >
> > > greg

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email