Re: [xwiki-users] groovy notification

2008-11-22 Thread Daniel Svoboda
Yes. The problem is that no mail gets sent, which is the purpose of  
the notification. I reread my initial post, and now I understand your  
confusion. I didn't explicitly state that the class wasn't working.

I'm using XWiki Enterprise manager 1.3 with platform version 1.5.2.

Dan


> Do you actually encounter a problem, besides the error in the logs ?
> I believe those logs are generated when you call getRenderedContent on
> your blog article, so I maintain they have nothing to do with your
> notification class.
> Which version of XWiki Enterprise are you using ?
>
> Jerome.
>
> Dan Svoboda wrote:
>> Hi,
>>
>> See below
>>
>> Dan Svoboda wrote:
 Hi,

 I'm trying to use the notification system to trigger the sending of
 email whenever a comment is added to a blog article. I'm  
 patterning my
 groovy class after the pircbot example on the xwiki snippets site.

 My system is xwiki workspaces as a virtual xwiki under xem. The
 platform version is 1.5.2.

 Here's my groovy class (XWSNotify.BlogMailNotificationGroovyClass):

 /* Groovy Class #* */

 import com.xpn.xwiki.api.XWiki;
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface;
 import com.xpn.xwiki.notify.DocObjectChangedRule;
 import com.xpn.xwiki.notify.XWikiNotificationRule;
 import com.xpn.xwiki.doc.XWikiDocument;

 public class BlogMailNotificationGroovyClass implements \

 XWikiDocChangeNotificationInterface

 {
def xwiki;
def rule;
def name;

public void initClasses(XWikiContext context)
{
this.xwiki = context.getWiki();
// listen to notifications
this.rule = DocObjectChangedRule(this);

 context.getWiki().getNotificationManager().addGeneralRule(rule);
}

public void notify(XWikiNotificationRule rule, XWikiDocument
 newdoc, \
   XWikiDocument olddoc, int event, XWikiContext
 context)
{
def length = newdoc.getSpace().length();
def lastFour = length - 4;
if(newdoc.getSpace().substring(lastFour) == "Blog") {

def ms = xwiki.getPlugin("mailsender");
def nb = ms.sendHtmlMessage(context.getUser(),
 "[EMAIL PROTECTED] 
 ", \
   context.get("ccrecipients"),
 context.get("bccrecipients"), \
   context.get("subject"),
 newdoc.getRenderedContent(), \
   newdoc.getContent(),
 newdoc.getAttachments());
}
}
 }

 /* *# */

 Here's a velocity script I'm using to initialize/test:

 #set($sc =  
 $context.getContext().getEngineContext().getServletContext())
 $sc.getAttribute("blgmailnotif")
 #set($blgmlnotif =
 $ 
 xwiki 
 .parseGroovyFromPage("XWSNotify.BlogMailNotificationGroovyClass"))
 #set($ok = $sc.setAttribute("blgmailnotif", $blgmlnotif))
 #set($blgmailnotif = $sc.getAttribute("blgmailnotif"))
 $sc.getAttribute("blgmailnotif")
 #set($ok = $blgmlnotif.initClasses($context))
 #set($ok = $blgmlnotif.notify($blgmlnotif.rule,$newdoc,$newdoc,
 3,$context))

 Here's the output from the velocity script:

 [EMAIL PROTECTED]
 [EMAIL PROTECTED]

 So, the groovy class gets initialized to a new reference  
 successfully
 each time parseGroovyFromPage is called.

 Here's what appears in the log after running the velocity script:

 [ERROR] Left side ($request.title) of '!=' operation has null  
 value.
 Operation not possible.  [line 53, column 43]
 [WARNING] Cannot retrieve method notify from object of class
 BlogMailNotificationGroovyClass due to security restrictions.

 If I alter the velocity script to:

 #set($sc =  
 $context.getContext().getEngineContext().getServletContext())
 $sc.getAttribute("blgmailnotif")

 Here's what appears in the log:

 [ERROR] Left side ($request.title) of '!=' operation has null  
 value.
 Operation not possible.  [line 53, column 43]

 So, the [WARNING] is the only log entry pertaining to the groovy  
 class.

 If I add a comment to a Blog article (with or without the
 BlogMailNotificationGroovyClass initialized), the following  
 appears in
 the log:

 [ERROR] Left side ($index) of addition operation has null value.
 Operation not possible.  [line 20, column 25]
 [ERROR] Left side ($index) of addition operation has null value.
 Operation not possible.  [line 20, column 25]
 [ERROR] Left side ($index) of addition operation has null value.
 Operation not possible.  [line 20, column 25]
 [ERROR] Left side ($index) of addition operation has null value.
 Operation not possible. 

Re: [xwiki-users] groovy notification

2008-11-22 Thread Jerome Velociter
It is probably due to the following :

"if(newdoc.getSpace().substring(lastFour) == "Blog") {"

in Java, if you have the following :

String st1 = "Blog";
String st2 = new String("Blog");

then st1 == st2 will always return false, as the objects are not the 
same. What you want is to compare their values, using st1.equals(st2), 
which will return true.
You can read here to find out more 
http://www.unix.com.ua/orelly/java/langref/ch04_09.htm (especially this 
sentence : "Because the == operator determines if two objects are the 
same object, it is not appropriate for comparisons that need to 
determine if two objects have the same contents. For example, if you 
need to know whether two String objects contain the same sequences of 
characters, the == operator is inappropriate. You should use the 
equals() method")

Anyway, their is even simpler for you. What you want to do is check if 
the space name finishes by "Blog". For this the appropriate method is 
String#endsWith 
(http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#endsWith(java.lang.String))
 
As in :

"if(newdoc.getSpace().endsWith("Blog")) {"

Hope this helps and fixes your issue,

Regards,
Jerome

Daniel Svoboda wrote:
> Yes. The problem is that no mail gets sent, which is the purpose of  
> the notification. I reread my initial post, and now I understand your  
> confusion. I didn't explicitly state that the class wasn't working.
>
> I'm using XWiki Enterprise manager 1.3 with platform version 1.5.2.
>
> Dan
>
>
>> Do you actually encounter a problem, besides the error in the logs ?
>> I believe those logs are generated when you call getRenderedContent on
>> your blog article, so I maintain they have nothing to do with your
>> notification class.
>> Which version of XWiki Enterprise are you using ?
>>
>> Jerome.
>>
>> Dan Svoboda wrote:
>>> Hi,
>>>
>>> See below
>>>
>>> Dan Svoboda wrote:
> Hi,
>
> I'm trying to use the notification system to trigger the sending of
> email whenever a comment is added to a blog article. I'm  
> patterning my
> groovy class after the pircbot example on the xwiki snippets site.
>
> My system is xwiki workspaces as a virtual xwiki under xem. The
> platform version is 1.5.2.
>
> Here's my groovy class (XWSNotify.BlogMailNotificationGroovyClass):
>
> /* Groovy Class #* */
>
> import com.xpn.xwiki.api.XWiki;
> import com.xpn.xwiki.XWikiContext;
> import com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface;
> import com.xpn.xwiki.notify.DocObjectChangedRule;
> import com.xpn.xwiki.notify.XWikiNotificationRule;
> import com.xpn.xwiki.doc.XWikiDocument;
>
> public class BlogMailNotificationGroovyClass implements \
>
> XWikiDocChangeNotificationInterface
>
> {
>def xwiki;
>def rule;
>def name;
>
>public void initClasses(XWikiContext context)
>{
>this.xwiki = context.getWiki();
>// listen to notifications
>this.rule = DocObjectChangedRule(this);
>
> context.getWiki().getNotificationManager().addGeneralRule(rule);
>}
>
>public void notify(XWikiNotificationRule rule, XWikiDocument
> newdoc, \
>   XWikiDocument olddoc, int event, XWikiContext
> context)
>{
>def length = newdoc.getSpace().length();
>def lastFour = length - 4;
>if(newdoc.getSpace().substring(lastFour) == "Blog") {
>
>def ms = xwiki.getPlugin("mailsender");
>def nb = ms.sendHtmlMessage(context.getUser(),
> "[EMAIL PROTECTED] 
> ", \
>   context.get("ccrecipients"),
> context.get("bccrecipients"), \
>   context.get("subject"),
> newdoc.getRenderedContent(), \
>   newdoc.getContent(),
> newdoc.getAttachments());
>}
>}
> }
>
> /* *# */
>
> Here's a velocity script I'm using to initialize/test:
>
> #set($sc =  
> $context.getContext().getEngineContext().getServletContext())
> $sc.getAttribute("blgmailnotif")
> #set($blgmlnotif =
> $ 
> xwiki 
> .parseGroovyFromPage("XWSNotify.BlogMailNotificationGroovyClass"))
> #set($ok = $sc.setAttribute("blgmailnotif", $blgmlnotif))
> #set($blgmailnotif = $sc.getAttribute("blgmailnotif"))
> $sc.getAttribute("blgmailnotif")
> #set($ok = $blgmlnotif.initClasses($context))
> #set($ok = $blgmlnotif.notify($blgmlnotif.rule,$newdoc,$newdoc,
> 3,$context))
>
> Here's the output from the velocity script:
>
> [EMAIL PROTECTED]
> [EMAIL PROTECTED]
>
> So, the groovy class gets initialized to a new reference  
> successfully
> each time parseGroovyFromPage is called.
>
> Here's what appears in the log after running the velocity script:
>
> [ER

Re: [xwiki-users] groovy notification

2008-11-22 Thread Vincent Massol

On Nov 22, 2008, at 4:30 PM, Jerome Velociter wrote:

> It is probably due to the following :
>
> "if(newdoc.getSpace().substring(lastFour) == "Blog") {"
>
> in Java, if you have the following :
>
> String st1 = "Blog";
> String st2 = new String("Blog");
>
> then st1 == st2 will always return false


This statement is not quite correct... In order for JVM to be  
performant there's a pool of reusable string objects and if the string  
created as the same content as one of the strings in the pool that  
string object will be returned (and thus both of your strings will  
point to the same object in memory).

There's even an intern() method to force your string content to be  
interned in that pool.

Try this to convince yourself:

 String st1 = "Blog".intern();
 String st2 = new String("Blog").intern();
 assertSame(st1, st2);

This is AFAIR. You can google for "Java String intern".


Of course what Jerome says is correct, you should always check for  
equality use equals() and not ==

Thanks
-Vincent

> , as the objects are not the
> same. What you want is to compare their values, using st1.equals(st2),
> which will return true.
> You can read here to find out more
> http://www.unix.com.ua/orelly/java/langref/ch04_09.htm (especially  
> this
> sentence : "Because the == operator determines if two objects are the
> same object, it is not appropriate for comparisons that need to
> determine if two objects have the same contents. For example, if you
> need to know whether two String objects contain the same sequences of
> characters, the == operator is inappropriate. You should use the
> equals() method")
>
> Anyway, their is even simpler for you. What you want to do is check if
> the space name finishes by "Blog". For this the appropriate method is
> String#endsWith
> (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#endsWith(java.lang.String)
>  
> )
> As in :
>
> "if(newdoc.getSpace().endsWith("Blog")) {"
>
> Hope this helps and fixes your issue,
>
> Regards,
> Jerome
>
> Daniel Svoboda wrote:
>> Yes. The problem is that no mail gets sent, which is the purpose of
>> the notification. I reread my initial post, and now I understand your
>> confusion. I didn't explicitly state that the class wasn't working.
>>
>> I'm using XWiki Enterprise manager 1.3 with platform version 1.5.2.
>>
>> Dan
>>
>>
>>> Do you actually encounter a problem, besides the error in the logs ?
>>> I believe those logs are generated when you call  
>>> getRenderedContent on
>>> your blog article, so I maintain they have nothing to do with your
>>> notification class.
>>> Which version of XWiki Enterprise are you using ?
>>>
>>> Jerome.
>>>
>>> Dan Svoboda wrote:
 Hi,

 See below

 Dan Svoboda wrote:
>> Hi,
>>
>> I'm trying to use the notification system to trigger the  
>> sending of
>> email whenever a comment is added to a blog article. I'm
>> patterning my
>> groovy class after the pircbot example on the xwiki snippets  
>> site.
>>
>> My system is xwiki workspaces as a virtual xwiki under xem. The
>> platform version is 1.5.2.
>>
>> Here's my groovy class  
>> (XWSNotify.BlogMailNotificationGroovyClass):
>>
>> /* Groovy Class #* */
>>
>> import com.xpn.xwiki.api.XWiki;
>> import com.xpn.xwiki.XWikiContext;
>> import com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface;
>> import com.xpn.xwiki.notify.DocObjectChangedRule;
>> import com.xpn.xwiki.notify.XWikiNotificationRule;
>> import com.xpn.xwiki.doc.XWikiDocument;
>>
>> public class BlogMailNotificationGroovyClass implements \
>>
>> XWikiDocChangeNotificationInterface
>>
>> {
>>   def xwiki;
>>   def rule;
>>   def name;
>>
>>   public void initClasses(XWikiContext context)
>>   {
>>   this.xwiki = context.getWiki();
>>   // listen to notifications
>>   this.rule = DocObjectChangedRule(this);
>>
>> context.getWiki().getNotificationManager().addGeneralRule(rule);
>>   }
>>
>>   public void notify(XWikiNotificationRule rule, XWikiDocument
>> newdoc, \
>>  XWikiDocument olddoc, int event,  
>> XWikiContext
>> context)
>>   {
>>   def length = newdoc.getSpace().length();
>>   def lastFour = length - 4;
>>   if(newdoc.getSpace().substring(lastFour) == "Blog") {
>>
>>   def ms = xwiki.getPlugin("mailsender");
>>   def nb = ms.sendHtmlMessage(context.getUser(),
>> "[EMAIL PROTECTED] 
>> ", \
>>  context.get("ccrecipients"),
>> context.get("bccrecipients"), \
>>  context.get("subject"),
>> newdoc.getRenderedContent(), \
>>  newdoc.getContent(),
>> newdoc.getAttachments());
>>   }
>>   }
>> }
>>
>> /* *# */
>>
>

Re: [xwiki-users] groovy notification

2008-11-22 Thread Jerome Velociter
Vincent Massol wrote:
> On Nov 22, 2008, at 4:30 PM, Jerome Velociter wrote:
>
>> It is probably due to the following :
>>
>> "if(newdoc.getSpace().substring(lastFour) == "Blog") {"
>>
>> in Java, if you have the following :
>>
>> String st1 = "Blog";
>> String st2 = new String("Blog");
>>
>> then st1 == st2 will always return false
>
> 
> This statement is not quite correct... In order for JVM to be  
> performant there's a pool of reusable string objects and if the string  
> created as the same content as one of the strings in the pool that  
> string object will be returned (and thus both of your strings will  
> point to the same object in memory).

 From what I understand, when using "new" we deliberately state that the 
String should not be interned, thus the object are not going to be the 
same any case.

Strings can be automatically interned by the JVM (without calling 
.intern()) only when initialized not using "new" :

String st1 = "Blog";
String st2 = "Blog";

and then can potentially be considered as same.

Anyway, I'm discovering this :) I read that from 
http://mindprod.com/jgloss/interned.html#NEW

Jerome.


>
> There's even an intern() method to force your string content to be  
> interned in that pool.
>
> Try this to convince yourself:
>
>  String st1 = "Blog".intern();
>  String st2 = new String("Blog").intern();
>  assertSame(st1, st2);
>
> This is AFAIR. You can google for "Java String intern".
> 
>
> Of course what Jerome says is correct, you should always check for  
> equality use equals() and not ==
>
> Thanks
> -Vincent
>
>> , as the objects are not the
>> same. What you want is to compare their values, using st1.equals(st2),
>> which will return true.
>> You can read here to find out more
>> http://www.unix.com.ua/orelly/java/langref/ch04_09.htm (especially  
>> this
>> sentence : "Because the == operator determines if two objects are the
>> same object, it is not appropriate for comparisons that need to
>> determine if two objects have the same contents. For example, if you
>> need to know whether two String objects contain the same sequences of
>> characters, the == operator is inappropriate. You should use the
>> equals() method")
>>
>> Anyway, their is even simpler for you. What you want to do is check if
>> the space name finishes by "Blog". For this the appropriate method is
>> String#endsWith
>> (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#endsWith(java.lang.String)
>>  
>> )
>> As in :
>>
>> "if(newdoc.getSpace().endsWith("Blog")) {"
>>
>> Hope this helps and fixes your issue,
>>
>> Regards,
>> Jerome
>>
>> Daniel Svoboda wrote:
>>> Yes. The problem is that no mail gets sent, which is the purpose of
>>> the notification. I reread my initial post, and now I understand your
>>> confusion. I didn't explicitly state that the class wasn't working.
>>>
>>> I'm using XWiki Enterprise manager 1.3 with platform version 1.5.2.
>>>
>>> Dan
>>>
>>>
 Do you actually encounter a problem, besides the error in the logs ?
 I believe those logs are generated when you call  
 getRenderedContent on
 your blog article, so I maintain they have nothing to do with your
 notification class.
 Which version of XWiki Enterprise are you using ?

 Jerome.

 Dan Svoboda wrote:
> Hi,
>
> See below
>
> Dan Svoboda wrote:
>>> Hi,
>>>
>>> I'm trying to use the notification system to trigger the  
>>> sending of
>>> email whenever a comment is added to a blog article. I'm
>>> patterning my
>>> groovy class after the pircbot example on the xwiki snippets  
>>> site.
>>>
>>> My system is xwiki workspaces as a virtual xwiki under xem. The
>>> platform version is 1.5.2.
>>>
>>> Here's my groovy class  
>>> (XWSNotify.BlogMailNotificationGroovyClass):
>>>
>>> /* Groovy Class #* */
>>>
>>> import com.xpn.xwiki.api.XWiki;
>>> import com.xpn.xwiki.XWikiContext;
>>> import com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface;
>>> import com.xpn.xwiki.notify.DocObjectChangedRule;
>>> import com.xpn.xwiki.notify.XWikiNotificationRule;
>>> import com.xpn.xwiki.doc.XWikiDocument;
>>>
>>> public class BlogMailNotificationGroovyClass implements \
>>>
>>> XWikiDocChangeNotificationInterface
>>>
>>> {
>>>   def xwiki;
>>>   def rule;
>>>   def name;
>>>
>>>   public void initClasses(XWikiContext context)
>>>   {
>>>   this.xwiki = context.getWiki();
>>>   // listen to notifications
>>>   this.rule = DocObjectChangedRule(this);
>>>
>>> context.getWiki().getNotificationManager().addGeneralRule(rule);
>>>   }
>>>
>>>   public void notify(XWikiNotificationRule rule, XWikiDocument
>>> newdoc, \
>>>  XWikiDocument olddoc, int event,  
>>> XWikiContext
>>> context)
>>>   {
>>>   def length = newdoc

Re: [xwiki-users] groovy notification

2008-11-22 Thread Daniel Svoboda
Thanks for the replies.

I had already found that bug. If I take the conditional completely out  
of the class, it still doesn't send an email.

Dan

> It is probably due to the following :
>
> "if(newdoc.getSpace().substring(lastFour) == "Blog") {"
>
> in Java, if you have the following :
>
> String st1 = "Blog";
> String st2 = new String("Blog");
>
> then st1 == st2 will always return false, as the objects are not the
> same. What you want is to compare their values, using st1.equals(st2),
> which will return true.
> You can read here to find out more
> http://www.unix.com.ua/orelly/java/langref/ch04_09.htm (especially  
> this
> sentence : "Because the == operator determines if two objects are the
> same object, it is not appropriate for comparisons that need to
> determine if two objects have the same contents. For example, if you
> need to know whether two String objects contain the same sequences of
> characters, the == operator is inappropriate. You should use the
> equals() method")
>
> Anyway, their is even simpler for you. What you want to do is check if
> the space name finishes by "Blog". For this the appropriate method is
> String#endsWith
> (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#endsWith(java.lang.String)
>  
> )
> As in :
>
> "if(newdoc.getSpace().endsWith("Blog")) {"
>
> Hope this helps and fixes your issue,
>
> Regards,
> Jerome
>
> Daniel Svoboda wrote:
>> Yes. The problem is that no mail gets sent, which is the purpose of
>> the notification. I reread my initial post, and now I understand your
>> confusion. I didn't explicitly state that the class wasn't working.
>>
>> I'm using XWiki Enterprise manager 1.3 with platform version 1.5.2.
>>
>> Dan
>>
>>
>>> Do you actually encounter a problem, besides the error in the logs ?
>>> I believe those logs are generated when you call  
>>> getRenderedContent on
>>> your blog article, so I maintain they have nothing to do with your
>>> notification class.
>>> Which version of XWiki Enterprise are you using ?
>>>
>>> Jerome.
>>>
>>> Dan Svoboda wrote:
 Hi,

 See below

 Dan Svoboda wrote:
>> Hi,
>>
>> I'm trying to use the notification system to trigger the  
>> sending of
>> email whenever a comment is added to a blog article. I'm
>> patterning my
>> groovy class after the pircbot example on the xwiki snippets  
>> site.
>>
>> My system is xwiki workspaces as a virtual xwiki under xem. The
>> platform version is 1.5.2.
>>
>> Here's my groovy class  
>> (XWSNotify.BlogMailNotificationGroovyClass):
>>
>> /* Groovy Class #* */
>>
>> import com.xpn.xwiki.api.XWiki;
>> import com.xpn.xwiki.XWikiContext;
>> import com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface;
>> import com.xpn.xwiki.notify.DocObjectChangedRule;
>> import com.xpn.xwiki.notify.XWikiNotificationRule;
>> import com.xpn.xwiki.doc.XWikiDocument;
>>
>> public class BlogMailNotificationGroovyClass implements \
>>
>> XWikiDocChangeNotificationInterface
>>
>> {
>>   def xwiki;
>>   def rule;
>>   def name;
>>
>>   public void initClasses(XWikiContext context)
>>   {
>>   this.xwiki = context.getWiki();
>>   // listen to notifications
>>   this.rule = DocObjectChangedRule(this);
>>
>> context.getWiki().getNotificationManager().addGeneralRule(rule);
>>   }
>>
>>   public void notify(XWikiNotificationRule rule, XWikiDocument
>> newdoc, \
>>  XWikiDocument olddoc, int event,  
>> XWikiContext
>> context)
>>   {
>>   def length = newdoc.getSpace().length();
>>   def lastFour = length - 4;
>>   if(newdoc.getSpace().substring(lastFour) == "Blog") {
>>
>>   def ms = xwiki.getPlugin("mailsender");
>>   def nb = ms.sendHtmlMessage(context.getUser(),
>> "[EMAIL PROTECTED] 
>> ", \
>>  context.get("ccrecipients"),
>> context.get("bccrecipients"), \
>>  context.get("subject"),
>> newdoc.getRenderedContent(), \
>>  newdoc.getContent(),
>> newdoc.getAttachments());
>>   }
>>   }
>> }
>>
>> /* *# */
>>
>> Here's a velocity script I'm using to initialize/test:
>>
>> #set($sc =
>> $context.getContext().getEngineContext().getServletContext())
>> $sc.getAttribute("blgmailnotif")
>> #set($blgmlnotif =
>> $
>> xwiki
>> .parseGroovyFromPage 
>> ("XWSNotify.BlogMailNotificationGroovyClass"))
>> #set($ok = $sc.setAttribute("blgmailnotif", $blgmlnotif))
>> #set($blgmailnotif = $sc.getAttribute("blgmailnotif"))
>> $sc.getAttribute("blgmailnotif")
>> #set($ok = $blgmlnotif.initClasses($context))
>> #set($ok = $blgmlnotif.notify($blgmlnotif.rule,$newdoc,$newdoc,
>> 3,$context))
>>