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
_______________________________________________
users mailing list
users(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/users