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/xwik…
Thanks
-Vincent
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