Thanks again, Vincent! Yup, ComponentDescriptorFactory did the magic :-D
On Dec 4, 2009, at 1:39 AM, Vincent Massol <[email protected]> wrote: > > On Dec 3, 2009, at 4:34 PM, Lewis Denizen wrote: > >> Thanks Vincent! That's exactly what I needed :-) Just one more >> question, >> though.. Is it possible to inject dependencies by using the >> attributes >> defined within the class then? Right now, using the >> DefaultComponentDescriptor, I can inject dependencies using: >> >> componentDescriptor.addComponentDependency(QueryManager.class, >> "default") >> >> but would be nice if it could auto-inject into something like: >> >> class UserXWQLDAO implements UserDAO >> { >> @Requirement >> def QueryManager queryManager >> //... >> } > > You'd need to use the annotation loader to do that. > new ComponentAnnotationLoader().initialize(componentManager, > classloader) > > However note that it'll re-register all components for which it finds > annotations. > > I guess you could also use the ComponentDescriptorFactory class which > would be much simpler since you pass to it the class to configure. > > See > http://svn.xwiki.org/svnroot/xwiki/platform/core/trunk/xwiki-component/xwiki-component-default/src/main/java/org/xwiki/component/annotation/ComponentDescriptorFactory.java > > Thanks > -Vincent > >> Thanks again for a great wiki! >> >> On Wed, Dec 2, 2009 at 3:56 AM, Vincent Massol <[email protected]> >> wrote: >> >>> Hi Lewis, >>> >>> On Dec 1, 2009, at 7:12 PM, Lewis Denizen wrote: >>> >>>> Hi xwiki-users, >>>> >>>> I'm trying to bootstrap a component from the wiki itself (via >>>> Groovy). I >>>> have an interface defined as follows: >>>> >>>> // This is the text inside the User.UserDAO document >>>> {{groovy}} >>>> interface UserDAO >>>> { >>>> def ROLE = UserDAO.class.name >>>> >>>> /** >>>> * Returns the current user name. >>>> */ >>>> def getUserName() >>>> >>>> /** >>>> * Returns the current user's password >>>> */ >>>> def getPassword() >>>> } >>>> {{/groovy}} >>>> >>>> I also have a dummy implementation defined as follows: >>>> >>>> // This is the text inside the User.UserXWQLDAO document >>>> {{include document="User.UserDAO" /}} >>>> {{groovy}} >>>> import org.xwiki.component.annotation.Component >>>> import org.xwiki.component.annotation.Requirement >>>> import org.xwiki.component.descriptor.DefaultComponentDescriptor >>>> import org.xwiki.query.Query >>>> import org.xwiki.query.QueryManager >>>> >>>> import com.xpn.xwiki.web.Utils >>>> >>>> @Component(roles = [ UserDAO.class ]) >>>> class UserXWQLDAO implements UserDAO >>>> { >>>> @Requirement >>>> def QueryManager queryManager >>>> >>>> /** >>>> * Returns the current user name. >>>> */ >>>> def getUserName() { >>>> return "bleh" >>>> } >>>> >>>> /** >>>> * Returns the current user's password >>>> */ >>>> def getPassword() { >>>> return "bleh" >>>> } >>>> } >>>> >>>> if(!Utils.componentManager.hasComponent(UserDAO.class)) >>>> { >>>> def componentDescriptor = new DefaultComponentDescriptor() >>>> componentDescriptor.setImplementation(UserDAO.class) >>>> >>>> Utils.componentManager.registerComponent(componentDescriptor, new >>>> UserXWQLDAO()) >>>> } >>>> {{/groovy}} >>>> >>>> The first problem I ran into was that Groovy 1.6.5 ran into >>>> IncompatibleClassChangeErrors ( >>> http://jira.codehaus.org/browse/GROOVY-3830 >>>> ). >>>> Upgrading to 1.6.6 fixed this issue. But, then I ran into a NPE: >>>> >>>> *exception* >>>> >>>> javax.servlet.ServletException: Failed to initialize Request/ >>>> Response or Session >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .web.XWikiAction.initializeContainerComponent(XWikiAction.java: >>>> 391) >>>> >>>> com >>>> .xpn.xwiki.web.XWikiAction.initializeXWikiContext(XWikiAction.java: >>>> 372) >>>> com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:112) >>>> >>>> org >>>> .apache >>>> .struts >>>> .action.RequestProcessor.processActionPerform >>>> (RequestProcessor.java: >>>> 431) >>>> >>>> org >>>> .apache >>>> .struts.action.RequestProcessor.process(RequestProcessor.java: >>>> 236) >>>> >>>> org.apache.struts.action.ActionServlet.process(ActionServlet.java: >>>> 1196) >>>> >>> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java: >>> 432) >>>> javax.servlet.http.HttpServlet.service(Unknown Source) >>>> javax.servlet.http.HttpServlet.service(Unknown Source) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .wysiwyg >>>> .server.filter.ConversionFilter.doFilter(ConversionFilter.java:152) >>>> com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:119) >>>> >>>> com >>>> .xpn >>>> .xwiki.plugin.webdav.XWikiDavFilter.doFilter(XWikiDavFilter.java: >>>> 68) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .web >>>> .SavedRequestRestorerFilter >>>> .doFilter(SavedRequestRestorerFilter.java: >>>> 295) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .web >>>> .SetCharacterEncodingFilter >>>> .doFilter(SetCharacterEncodingFilter.java: >>>> 112) >>>> >>>> *root cause* >>>> >>>> org.xwiki.container.servlet.ServletContainerException: Failed to >>>> initialize request >>>> >>>> org >>>> .xwiki >>>> .container >>>> .servlet >>>> .internal >>>> .DefaultServletContainerInitializer >>>> .initializeRequest(DefaultServletContainerInitializer.java:98) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .web.XWikiAction.initializeContainerComponent(XWikiAction.java: >>>> 387) >>>> >>>> com >>>> .xpn.xwiki.web.XWikiAction.initializeXWikiContext(XWikiAction.java: >>>> 372) >>>> com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:112) >>>> >>>> org >>>> .apache >>>> .struts >>>> .action.RequestProcessor.processActionPerform >>>> (RequestProcessor.java: >>>> 431) >>>> >>>> org >>>> .apache >>>> .struts.action.RequestProcessor.process(RequestProcessor.java: >>>> 236) >>>> >>>> org.apache.struts.action.ActionServlet.process(ActionServlet.java: >>>> 1196) >>>> >>> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java: >>> 432) >>>> javax.servlet.http.HttpServlet.service(Unknown Source) >>>> javax.servlet.http.HttpServlet.service(Unknown Source) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .wysiwyg >>>> .server.filter.ConversionFilter.doFilter(ConversionFilter.java:152) >>>> com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:119) >>>> >>>> com >>>> .xpn >>>> .xwiki.plugin.webdav.XWikiDavFilter.doFilter(XWikiDavFilter.java: >>>> 68) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .web >>>> .SavedRequestRestorerFilter >>>> .doFilter(SavedRequestRestorerFilter.java: >>>> 295) >>>> >>>> com >>>> .xpn >>>> .xwiki >>>> .web >>>> .SetCharacterEncodingFilter >>>> .doFilter(SetCharacterEncodingFilter.java: >>>> 112) >>>> >>>> *root cause* >>>> >>>> java.lang.NullPointerException >>>> >>>> >>>> Haven't investigated any further than this, but has anyone >>>> successfully >>>> created components completely within a wiki document? That would >>>> just be so >>>> cool! Great work! >>> >>> Yes, I've done that several times. >>> >>> Here's an example: >>> >>> http://svn.xwiki.org/svnroot/xwiki/platform/xwiki-applications/trunk/ircbot/src/main/resources/IRC/JiraBotlet.xml >>> (search for registerComponent). >>> >>> Hope it helps, >>> -Vincent > _______________________________________________ > users mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/users _______________________________________________ users mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/users
