Actually... seems like
componentDescriptor.addComponentDependency()
doesn't
add the dependency either :-( Just ends up being null when
retrieving it.
Is there something that needs to be done before injection happens on
these
objects?
Nothing to do. It just works normally. We're using that in some tests
so it should work fine.
Basically you register your component with deps and next time you do a
lookup() it'll get instantiated and its dependencies too.
-Vincent
On Fri, Dec 4, 2009 at 12:34 AM, Lewis Denizen <orangerd(a)gmail.com>
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
> //...
> }
>
> Thanks again for a great wiki!
>
>
> On Wed, Dec 2, 2009 at 3:56 AM, Vincent Massol <vincent(a)massol.net>
> 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…
>> (search for registerComponent).
>>
>> Hope it helps,
>> -Vincent