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

Reply via email to