Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/DefaultGrailsPluginManager.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/DefaultGrailsPluginManager.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/DefaultGrailsPluginManager.java (working copy) @@ -662,4 +662,12 @@ public ServletContext getServletContext() { return servletContext; } + + public void doArtefactConfiguration() { + checkInitialised(); + for (Iterator i = pluginList.iterator(); i.hasNext();) { + GrailsPlugin plugin = (GrailsPlugin) i.next(); + plugin.doArtefactConfiguration(); + } + } } Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPlugin.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPlugin.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPlugin.java (working copy) @@ -106,9 +106,11 @@ */ String DEPENDS_ON = "dependsOn"; + /** + * Define the list of ArtefactHandlers supporting by the plugin + */ + String ARTEFACTS = "artefacts"; - - /** *

This method is called to allow the plugin to add {@link org.springframework.beans.factory.config.BeanDefinition}s * to the {@link org.springframework.beans.factory.support.BeanDefinitionRegistry}.

@@ -240,4 +242,6 @@ * @param event The event to listen for */ void notifyOfEvent(Map event); + + void doArtefactConfiguration(); } Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/AbstractGrailsPlugin.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/AbstractGrailsPlugin.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/AbstractGrailsPlugin.java (working copy) @@ -72,11 +72,13 @@ this.application = application; this.pluginClass = pluginClass; } + public abstract void doWithApplicationContext(ApplicationContext applicationContext); public abstract void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig); + public abstract void doArtefactConfiguration(); public void checkForChanges() { // do nothing Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/DefaultGrailsPlugin.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/DefaultGrailsPlugin.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/DefaultGrailsPlugin.java (working copy) @@ -36,6 +36,7 @@ import org.apache.commons.lang.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.codehaus.groovy.grails.commons.ArtefactHandler; import org.codehaus.groovy.grails.commons.GrailsApplication; import org.codehaus.groovy.grails.commons.GrailsClassUtils; import org.codehaus.groovy.grails.commons.GrailsMetaClassUtils; @@ -581,4 +582,34 @@ onChangeListener.setDelegate(this); onChangeListener.call(new Object[]{event}); } + + public void doArtefactConfiguration() { + if(this.pluginBean.isReadableProperty(ARTEFACTS)) { + List l = (List)this.plugin.getProperty(ARTEFACTS); + for (Iterator iter = l.iterator(); iter.hasNext();) { + Object artefact = iter.next(); + if(artefact instanceof Class) { + Class artefactClass = (Class)artefact; + if(ArtefactHandler.class.isAssignableFrom(artefactClass)) { + try { + this.application.registerArtefactHandler((ArtefactHandler)artefactClass.newInstance()); + } catch (InstantiationException e) { + LOG.error("Cannot instantiate an Artefact Handler:" + e.getMessage(),e); + } catch (IllegalAccessException e) { + LOG.error("The constructor of the Artefact Handler is not accessible:" + e.getMessage(),e); + } + } else { + LOG.error("This class is not an ArtefactHandler:" + artefactClass.getName()); + } + } else { + if(artefact instanceof ArtefactHandler) { + this.application.registerArtefactHandler((ArtefactHandler)artefact); + } else { + LOG.error("This object is not an ArtefactHandler:" + artefact + "[" + artefact.getClass().getName()+"]"); + } + } + } + } + } + } \ No newline at end of file Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPluginManagerFactoryBean.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPluginManagerFactoryBean.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPluginManagerFactoryBean.java (working copy) @@ -15,6 +15,7 @@ */ package org.codehaus.groovy.grails.plugins; +import org.codehaus.groovy.grails.commons.DefaultGrailsApplication; import org.codehaus.groovy.grails.commons.GrailsApplication; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; @@ -68,6 +69,8 @@ PluginManagerHolder.setPluginManager(pluginManager); } this.pluginManager.setApplication(application); + this.pluginManager.doArtefactConfiguration(); + this.application.initialise(); } } Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPluginManager.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPluginManager.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/GrailsPluginManager.java (working copy) @@ -185,4 +185,7 @@ * @param event The event */ public void informObservers(String pluginName, Map event); + + public void doArtefactConfiguration(); + } \ No newline at end of file Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/support/aware/AwarePlugin.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/support/aware/AwarePlugin.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/plugins/support/aware/AwarePlugin.java (working copy) @@ -68,4 +68,8 @@ // do nothing } + public void doArtefactConfiguration() { + // do nothing + } + } Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/GrailsApplication.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/GrailsApplication.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/GrailsApplication.java (working copy) @@ -222,5 +222,6 @@ */ public ArtefactHandler[] getArtefactHandlers(); + public void initialise(); } Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/DefaultGrailsApplication.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/DefaultGrailsApplication.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/DefaultGrailsApplication.java (working copy) @@ -86,6 +86,7 @@ private Map artefactInfo = new HashMap(); private boolean suspectArtefactInit; private Class[] allArtefactClassesArray; + private boolean neverInitialised = true; /** * Creates a new empty Grails application @@ -190,16 +191,8 @@ } } - // get all the classes that were loaded - if (log.isDebugEnabled()) { - log.debug("loaded classes: [" + loadedClasses + "]"); - } - - Class[] classes = populateAllClasses(); - - configureLoadedClasses(classes); } - + /** * Initialises the default set of ArtefactHandler instances * @@ -589,6 +582,9 @@ * @see org.codehaus.groovy.grails.commons.ArtefactHandler */ public GrailsClass addArtefact(String artefactType, Class artefactClass) { + + checkInitialised(); + // @todo should we filter abstracts here? if (Modifier.isAbstract(artefactClass.getModifiers())) { return null; @@ -630,6 +626,9 @@ * @see org.codehaus.groovy.grails.commons.ArtefactHandler */ public GrailsClass addArtefact(String artefactType, GrailsClass artefactGrailsClass) { + + checkInitialised(); + // @todo should we filter abstracts here? if (Modifier.isAbstract(artefactGrailsClass.getClazz().getModifiers())) { return null; @@ -794,4 +793,21 @@ } return super.getProperty(propertyName); } + + public void initialise() { + this.neverInitialised = false; + // get all the classes that were loaded + if (log.isDebugEnabled()) { + log.debug("loaded classes: [" + loadedClasses + "]"); + } + Class[] classes = populateAllClasses(); + configureLoadedClasses(classes); + } + + private void checkInitialised() { + if(this.neverInitialised) { + initialise(); + } + } + } Index: F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/GrailsApplicationFactoryBean.java =================================================================== --- F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/GrailsApplicationFactoryBean.java (revision 3299) +++ F:/src/grails-trunk/src/commons/org/codehaus/groovy/grails/commons/GrailsApplicationFactoryBean.java (working copy) @@ -66,7 +66,6 @@ else { this.grailsApplication = new DefaultGrailsApplication(this.groovyFiles); } - ApplicationHolder.setApplication(this.grailsApplication); }