still going round in circles on this, I fear…
I've switched to documentUpdatedEvent and tried to grab the instance method.
The code you wrote in your last email didn't work out of the box - it said the
cached 'this.xwiki' object was null, so I changed to trying to get the xwiki
object from the context (which should be current when it's requested by the
event handler, no?) however the following code works OK when I save it from the
object page, but hangs interminably when I the onEvent method is called:
void onEvent(Event event, Object source, Object data)
{
def mailfrom = '[email protected]'
def mailto = xdoc.getStringValue('assignee')
def subject = 'xwiki done some stuff, yo'
def message = 'document '+xdoc.name+' has been changed'
def mailItem = new Mail(mailfrom, mailto, null, null, subject, message,
null)
def xwcontext =
Utils.getComponent(Execution.class).getContext().getProperty('xwikicontext')
def myXwiki = xwcontext.getWiki()
def sender = myXwiki.getPlugin("mailsender", xwcontext)
sender.sendMail(mailItem, xwcontext);
}
It generally needs the xwiki to be killed so I'm not getting any errors I can
work with. Seems to be something to do with the plugin request, but I'm damned
if I can figure out what. Any sugestions?
-s
On 7 Jul 2012, at 18:48, Sergiu Dumitriu wrote:
> On 07/07/2012 10:03 AM, seth redmond wrote:
>> I seem to be running into an error I can't find my way around when passing
>> the xwiki context to an eventListener. According to the error message itself
>> (below) I appear to be passing the right objects, but I'm still getting an
>> exception thrown.
>>
>> I should point out that I'm new to both xwiki and groovy, so I may have
>> missed something obvious, is the context not instantiated by the time it's
>> been sent to the event handler? or should I be grabbing it anew?
>>
>> thanks
>>
>> -s
>>
>>
>> Error and groovy code below...
>>
>> 2012-07-05 21:19:59,471
>> [http://localhost:8080/xwiki/bin/preview/Task/look+into+CMH+%2F+TDT] ERROR
>> .o.i.DefaultObservationManager - Failed to send event
>> [org.xwiki.observation.event.DocumentUpdateEvent@6b193509] to listener
>> [MailingEventListener@171aa1cb]
>> groovy.lang.MissingMethodException: No signature of method: static
>> com.xpn.xwiki.plugin.mailsender.MailSenderPlugin.sendMail() is applicable
>> for argument types: (com.xpn.xwiki.plugin.mailsender.Mail,
>> com.xpn.xwiki.XWikiContext) values: [From [[email protected]], To [],
>> Subject [xwiki done some stuff, yo], Text [document TaskClass has been
>> changed], ...]
>> Possible solutions: sendMail(com.xpn.xwiki.plugin.mailsender.Mail,
>> com.xpn.xwiki.XWikiContext), sendMail(com.xpn.xwiki.plugin.mailsender.Mail,
>> com.xpn.xwiki.plugin.mailsender.MailConfiguration,
>> com.xpn.xwiki.XWikiContext), sendMails(java.util.Collection,
>> com.xpn.xwiki.XWikiContext), sendMails(java.util.Collection,
>> com.xpn.xwiki.plugin.mailsender.MailConfiguration,
>> com.xpn.xwiki.XWikiContext), findAll()
>>
>>
>> {{groovy}}
>>
>> import org.xwiki.observation.*
>> import org.xwiki.observation.event.*
>> import com.xpn.xwiki.plugin.mailsender.*
>> import com.xpn.xwiki.web.*
>> import com.xpn.xwiki.*
>>
>> class MailingEventListener implements EventListener
>> {
>> def xwiki
>> def xwcontext
>> def context
>> def xdoc
>>
>> MailingEventListener(xwiki, context)
>> {
>
> In general you should not cache the xwiki and context objects that you
> received here, since they're probably going to be wrong at the time when
> events occur. Always get a fresh reference to the context in onEvent, from
> the Execution instance. I know that you got this code from the notification
> tutorial, but that one is a bit deprecated.
>
>> this.xwiki = xwiki
>> this.context = context
>> this.xwcontext = context.getContext()
>> this.xdoc = context.doc
>> }
>>
>> String getName()
>> {
>> // The unique name of this event listener
>> return "mailing"
>> }
>>
>>
>> List<Event> getEvents()
>> {
>> // The list of events this listener listens to
>> return Arrays.asList(new DocumentUpdateEvent())
>
> This event is deprecated, you should use
> org.xwiki.bridge.event.DocumentUpdatedEvent instead
>
>> }
>>
>> // Called by the Observation Manager when an event matches the list of
>> events returned
>> // by getEvents()
>> void onEvent(Event event, Object source, Object data)
>> {
>> def mailfrom = '[email protected]'
>> def mailto = xdoc.getStringValue('assignee')
>> def subject = 'xwiki done some stuff, yo'
>> def message = 'document '+xdoc.name+' has been changed'
>> def mailItem = new Mail(mailfrom, mailto, null, null, subject,
>> message, null)
>> MailSenderPlugin.sendMail(mailItem, xwcontext);
>
> The problem is that you're trying to call a static method, but sendMail is an
> instance method. You should get the right instance of the plugin using:
> this.xwiki.getXWiki().getPlugin("mailsender", xwcontext)
>
>> }
>> }
>>
>> // Register against the Observation Manager
>> def observation = Utils.getComponent(ObservationManager.class)
>> observation.removeListener("mailing")
>> def listener = new MailingEventListener(xwiki, xcontext)
>> observation.addListener(listener)
>>
>> println "{{info}}Listener $listener.name is now registered on
>> $listener.events{{/info}}"
>> println "{{info}}Context = $listener.context{{/info}}"
>> println "{{info}}$listener.context.doc.name{{/info}}"
>>
>> {{/groovy}}
>
>
> --
> Sergiu Dumitriu
> http://purl.org/net/sergiu/
>
>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs