Setting up an event listener

479 katselukertaa
Siirry ensimmäiseen lukemattomaan viestiin

Dev Intern

lukematon,
18.2.2015 klo 15.27.4418.2.2015
vastaanottaja hippo-c...@googlegroups.com
Hi,
I am currently working on setting up an event listener to listen to the hippo event bus, but I am a little confused about how to properly hook the listener up to the rest of the project.

For a general example of how to write a listener I look to this page:


Where the simplest example code for a listener looks like:
package com.example;
 
import org.onehippo.cms7.event.HippoEvent;
import org.onehippo.cms7.services.eventbus.Subscribe;
import org.onehippo.repository.events.HippoWorkflowEvent;
 
public class MyListener {
 
 
@Subscribe
 
public void handleEvent(HippoEvent event) {
   
if (HippoEventConstants.CATEGORY_WORKFLOW.equals(event.category())) {
     
HippoWorkflowEvent workflowEvent = new HippoWorkflowEvent(event);
     
if ("publish".equals(workflowEvent.methodName())) {
       
System.out.println("document " + workflowEvent.handleUuid() +
                                                         
" was published");
     
}
   
}
 
}
 
}

However I don't see any information on best practices for incorporating this code into the project file structure or how to tie it into the project at all on this page. Looking elsewhere in the documentation I found this

http://www.onehippo.org/library/concepts/hst-spring/how-to-add-custom-jcr-event-listener-through-spring-configuration.html

Which gives an XML example of hooking up a listener, however it specifically says 

Your CustomEventListener must implement javax.jcr.observation.EventListener. Which seems to be a different way of writing the event listener than the example above.

So my question is essentially:
What is the best practice method for writing a basic event listener like the one in the example above, and how would I hook that listener into the rest of the project?

As always thanks for any help!

Woonsan Ko

lukematon,
18.2.2015 klo 17.14.2918.2.2015
vastaanottaja hippo-c...@googlegroups.com
Hi,

The page [1] says 'a listener then can be registered as follows'. So,
you should register your event listener instance somehow. (See
MyListener#init() and #destroy())
Now, you will need to have your own 'registration' code invoked while
start up and unregistration code invoked while shutdown.
If you can use spring framework, for example, then it'll be very
straightforward (e.g, init-method, destroy-method in a bean definition).
If you're not using spring framework (e.g, in /cms application by
default), you can implement a repository daemon module [2] only for
(de)registration of your event listener.
Please note that repository daemon module works only in /cms application
(where the repository servlet resides in).
If you don't want to maintain a DeamonModule by yourself or if you want
to take advantage of good enterprise integration patterns and
components, then you might want to simply use the
Camel-HippoEventBusSupport forge module [3] in /cms application without
having to implement a DaemonModule.
By the way, the page [4] you referred is about adding a custom JCR
Observation event listener, not Hippo Repository (Workflow) event
listener (based on HippoEventBus). The former one is JCR node level,
while the latter one is document (as aggregated node collection)
publication event level, for instance. The latter one fits most business
use cases.

Regards,

Woonsan

[1] http://www.onehippo.org/library/concepts/hippo-services/event-bus.html
[2]
http://www.onehippo.org/library/concepts/hippo-services/repository-managed-components.html
[3] http://camel-hippoevt.forge.onehippo.org/
[4]
http://www.onehippo.org/library/concepts/hst-spring/how-to-add-custom-jcr-event-listener-through-spring-configuration.html
> Your *CustomEventListener* must implement
> *javax.jcr.observation.EventListener*. Which seems to be a different way
> of writing the event listener than the example above.
>
> _So my question is essentially:_
> What is the best practice method for writing a basic event listener like
> the one in the example above, and how would I hook that listener into
> the rest of the project?
>
> As always thanks for any help!
>
> --
> Hippo Community Group: The place for all discussions and announcements
> about Hippo CMS (and HST, repository etc. etc.)
>
> To post to this group, send email to hippo-c...@googlegroups.com
> RSS:
> https://groups.google.com/group/hippo-community/feed/rss_v2_0_msgs.xml?num=50
> ---
> You received this message because you are subscribed to the Google
> Groups "Hippo Community" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to hippo-communi...@googlegroups.com
> <mailto:hippo-communi...@googlegroups.com>.
> Visit this group at http://groups.google.com/group/hippo-community.
> For more options, visit https://groups.google.com/d/optout.


--
w....@onehippo.com www.onehippo.com
Boston - 745 Atlantic Ave, 8th Floor, Boston MA 02111
Amsterdam - Oosteinde 11, 1017 WT Amsterdam
US +1 877 414 4776 (toll free)
Europe +31(0)20 522 4466

Minos Chatzidakis

lukematon,
18.2.2015 klo 17.27.5518.2.2015
vastaanottaja hippo-c...@googlegroups.com

To unsubscribe from this group and stop receiving emails from it, send an email to hippo-communi...@googlegroups.com.
Amsterdam - Oosteinde 11, 1017 WT Amsterdam
Boston - 745 Atlantic Ave, Eight Floor, MA 02111

US +1 877 414 4776 (toll free)
Europe +31(0)20 522 4466

Woonsan Ko

lukematon,
18.2.2015 klo 17.33.3118.2.2015
vastaanottaja hippo-c...@googlegroups.com
Ah, that will be helpful.
Please note that PublicationPostProcessingModule in the example there
wears two hats: One as DaemonModule, and the other as event listener.
So, it's registering itself:

HippoServiceRegistry.registerService(this, HippoEventBus.class);

The example in [1] explains the concept with two different classes.

Regards,

Woonsan
> <mailto:hippo-c...@googlegroups.com>
> > RSS:
> > https://groups.google.com/group/hippo-community/feed/rss_v2_0_msgs.xml?num=50
> > ---
> > You received this message because you are subscribed to the Google
> > Groups "Hippo Community" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> > an email to hippo-communi...@googlegroups.com
> <mailto:hippo-community%2Bunsu...@googlegroups.com>
> > <mailto:hippo-communi...@googlegroups.com
> <mailto:hippo-community%2Bunsu...@googlegroups.com>>.
> > Visit this group at http://groups.google.com/group/hippo-community.
> > For more options, visit https://groups.google.com/d/optout.
>
>
> --
> w....@onehippo.com <mailto:w....@onehippo.com> www.onehippo.com
> <http://www.onehippo.com>
> Boston - 745 Atlantic Ave, 8th Floor, Boston MA 02111
> Amsterdam - Oosteinde 11, 1017 WT Amsterdam
> US +1 877 414 4776 <tel:%2B1%20877%20414%204776> (toll free)
> Europe +31(0)20 522 4466 <tel:%2B31%280%2920%20522%204466>
>
> --
> Hippo Community Group: The place for all discussions and
> announcements about Hippo CMS (and HST, repository etc. etc.)
>
> To post to this group, send email to
> hippo-c...@googlegroups.com
> <mailto:hippo-c...@googlegroups.com>
> RSS:
> https://groups.google.com/group/hippo-community/feed/rss_v2_0_msgs.xml?num=50
> ---
> You received this message because you are subscribed to the Google
> Groups "Hippo Community" group.
> To unsubscribe from this group and stop receiving emails from it,
> send an email to hippo-communi...@googlegroups.com
> <mailto:hippo-community%2Bunsu...@googlegroups.com>.
> Visit this group at http://groups.google.com/group/hippo-community.
> For more options, visit https://groups.google.com/d/optout.
>
>
>
>
> --
>
> m.chat...@onehipo.com <mailto:m.chat...@onehipo.com>
> Amsterdam - Oosteinde 11, 1017 WT Amsterdam
> Boston - 745 Atlantic Ave, Eight Floor, MA 02111
>
> US +1 877 414 4776 (toll free)
> Europe +31(0)20 522 4466
> www.onehippo.com <http://www.onehippo.com/>

Dev Intern

lukematon,
19.2.2015 klo 14.15.4919.2.2015
vastaanottaja hippo-c...@googlegroups.com
Thanks for the quick responses, but let me ask a couple of follow up questions for clarification.

It seems like you've suggested a few different options for registering the listener:
1.) Go directly to the spring framework and implement the init and destroy methods
2.) Use a daemon module to register it
3.) Use Apache Camel to register it

I'm very intrigued by the Apache Camel functionality, but it seems to rely on a dependency that isn't part of the base Hippo product and it seems as if Camel is only in a beta phase of implementation.
Is the Apache Camel something that is fully supported by Hippo and will continue to be supported in the future? 
Comparing Camel to the Daemon Module technique, it's clear that a 'repository managed component' seems to be officially supported and documented on the Hippo website where the only stuff about Camel is offsite.
I do not want to implement a 3rd party piece of software like this if it will become deprecated in the near future due to lack of support, but it does seem very useful and I would like to implement it if it is supported.

If Camel doesn't seem to be the best tool to use then it sounds like going straight to the spring framework is the best way. Perhaps this should be obvious, but how would I do this?
Is there a specific xml document I need to edit? Is there an example of the type of changes I need to make? This is really what I was having difficulty finding documentation for as mentioned in my first question.

Thank you again for the assistance, the helpfulness of the hippo engineers never ceases to amaze me and is very appreciated!

Woonsan Ko

lukematon,
19.2.2015 klo 14.59.5219.2.2015
vastaanottaja hippo-c...@googlegroups.com
Hi,

Please see my comments inline.

On 2/19/15 2:15 PM, Dev Intern wrote:
> Thanks for the quick responses, but let me ask a couple of follow up
> questions for clarification.
>
> It seems like you've suggested a few different options for registering
> the listener:
> 1.) Go directly to the spring framework and implement the init and
> destroy methods
> 2.) Use a daemon module to register it
> 3.) Use Apache Camel to register it
>
> I'm very intrigued by the Apache Camel functionality, but it seems to
> rely on a dependency that isn't part of the base Hippo product and it
> seems as if Camel is only in a beta phase of implementation.
> *Is the Apache Camel something that is fully supported by Hippo and will
> continue to be supported in the future?*

Apache Camel is not a part of the base Hippo product, of course. :-)
It's not used by core products, either.
But, the Camel-HippoEventBus-Support forge module is provided as a
community support module. Of course, it's not under the official hippo
product release cycles, but it's voluntarily supported for community
like HST Spring Security Support forge module is supported as community
forge module, for instance.
Apache Camel itself has been widely used by the way especially in
enterprise integration scenarios. Please check out their official
releases and other information on their website: http://camel.apache.org/
The Camel-HippoEventBus-Support forge module is Apache licensed open
source project. I initially started the project, and I'd like to give
warm welcomes to anybody who wants to participate in various ways (e.g,
providing patches, testings, documentation, suggestions, etc.). I'll do
my best for that simple module (actually it's just a simple camel
component implementation) as long as it is useful to others and there's
no other alternative to the same degree..

> Comparing Camel to the Daemon Module technique, it's clear that a
> 'repository managed component' seems to be officially supported and
> documented on the Hippo website where the only stuff about Camel is offsite.
> I do not want to implement a 3rd party piece of software like this if it
> will become deprecated in the near future due to lack of support, but it
> does seem very useful and I would like to implement it if it is supported.

It's up to you. But I'd like to mention that the
Camel-HippoEventBus-Support is not a hack or fork of the core hippo
eventbus module, but it's rather a more value-added module to enable to
use camel without breaking the intention or contract of the core Hippo
Event Bus. Therefore, unless Hippo Event Bus breaks its backward
compatibility, the Camel-HippoEventBus-Support will work consistently.
If someone wants some new features of camel in the future, she or he can
contribute it to improve the module.

Also, I'm not saying you'd better use Camel. It really depends on your
circumstances. Just as an example, some developers do not like the Camel
DSL, but they like Java coding more. In that case, you could choose
implementing everything in a DeamonModule. That's a fine option.

>
> If Camel doesn't seem to be the best tool to use then it sounds like
> going straight to the spring framework is the best way. Perhaps this
> should be obvious, but how would I do this?

Luckily HippoEventBus is based on whiteboard pattern. So, you don't have
to worry about the module loading order. You can simply add spring
application context in cms web application (e.g,
/WEB-INF/applicationContext.xml and servlet listener configuration) for
instance.
Also you may not choose this approach if someone doesn't like adding
spring dependencies in cms application for some reason.. There's no
problem to do that technically though..

> *Is there a specific xml document I need to edit? Is there an example of
> the type of changes I need to make? *This is really what I was having
> difficulty finding documentation for as mentioned in my first question.

If you want to use spring framework, then you'll need to look up their
documentation on how to simply add web application context (e.g,
listener configuration and /WEB-INF/applicationContext.xml) with
necessary dependencies (see how site app includes those).
If you want to use Camel support, then you'll need to look up the Camel
website. You will be able to find spring DSL examples in normal spring
application context xml file, etc.
Of course, you can implement a DaemonModule without depending any other
frameworks. ;-)

Cheers,

Woonsan

>
> Thank you again for the assistance, the helpfulness of the hippo
> engineers never ceases to amaze me and is very appreciated!
>

Dev Intern

lukematon,
10.3.2015 klo 14.00.2510.3.2015
vastaanottaja hippo-c...@googlegroups.com
Hi All,

So first I want to thank you guys for your help, of the strategies suggested I went with using a Daemon Module to register the listener and it's working fantastically!
I will post my code below in case my questions ever come up again, then somebody else in the community could use it as a starting point.
However, I do have some follow up questions about how the event listener actually works:

Is there a time delay in consuming the messages from the event bus? Essentially, does the listener process poll the event bus at certain time intervals or does it instantly de-queue events off the event bus?

I'm seeing some really cool ways I could leverage the event bus in the project, but I'm concerned about using it for anything that would require time sensitive responses.

Thanks again!

Woonsan Ko

lukematon,
10.3.2015 klo 15.27.0410.3.2015
vastaanottaja hippo-c...@googlegroups.com
On 3/10/15 2:00 PM, Dev Intern wrote:
> Hi All,
>
> So first I want to thank you guys for your help, of the strategies
> suggested I went with using a Daemon Module to register the listener and
> it's working fantastically!
> I will post my code below in case my questions ever come up again, then
> somebody else in the community could use it as a starting point.
> However, I do have some follow up questions about how the event listener
> actually works:
>
> *Is there a time delay in consuming the messages from the event bus?
> Essentially, does the listener process poll the event bus at certain
> time intervals or does it instantly de-queue events off the event bus?*

If you use a normal event listener, not one for "Persisted Workflow
Events" [1], then it instantly invoke event listeners on workflow events.
If you use an event listener for "Persisted Workflow Events", then it
will create a client-side thread to poll event nodes periodically. See
"pollingTime", "queryLimit" and "maxEventAge" configuration options
there [1].

"The repository stores the timestamp of the last processed event for
each combination (repository-cluster-id,
persisted-listener-channel-name)." [1]
So, the thread will poll all the events by the cluster id and the
annotated channel name basically.

If you have two cluster nodes having the same persisted event listener
deployed, then each persisted event listener will receive the same event
in parallel. For example, if a document gets published, then each
listener on each cluster node will receive the same publication event,
which is a different behavior from the normal event listener. Normal
(non-persisted event) listener will receive the event only once on one
cluster node, not on both because it is invoked directly by the workflow
engine in single cluster node. In another sense, it's worth mentioning
that if your event listener takes long to finish the event handling, it
might affect the workflow process in repository, which can result in a
long wait in CMS UI.

[1] http://www.onehippo.org/library/concepts/hippo-services/event-bus.html

>
> I'm seeing some really cool ways I could leverage the event bus in the
> project, but I'm concerned about using it for anything that would
> require time sensitive responses.

If it is time-sensitive, then you might want to avoid using the
Persisted Event listener.
Also, when using the normal (non-persisted) event listener, you might
want to avoid taking too long in event handling not to cause delays in
CMS UI. e.g, by using 'store and forward' approach.

Regards,

Woonsan

>
> Thanks again!

Dev Intern

lukematon,
19.3.2015 klo 15.51.5919.3.2015
vastaanottaja hippo-c...@googlegroups.com
Hey all, sharing my code in case anybody else ever needs to use it:
The following files would reside in the cms project folder such as current project, the folder:

\cms\src\main\java\com\myCompany\hippo\cms


Daemon Module to register the Listener:
PublicationListenerModule.java

package com.myCompany.hippo.cms.modules;
 
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.onehippo.cms7.services.HippoServiceRegistry;
import org.onehippo.repository.modules.DaemonModule;
import org.onehippo.repository.modules.ProvidesService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.myCompany.hippo.cms.modules.PublicationEventListener;
import org.onehippo.cms7.services.eventbus.HippoEventBus;

@ProvidesService(types = PublicationEventListener.class)
public class PublicationListenerModule implements DaemonModule {
static final Logger log = LoggerFactory.getLogger(PublicationListenerModule.class);
static Session session = null;
    private PublicationEventListener listener;
    
    @Override
    public void initialize(final Session session) throws RepositoryException {
    listener = new PublicationEventListener();
        HippoServiceRegistry.registerService(listener, HippoEventBus.class);    
    }
 
    @Override
    public void shutdown() {
    HippoServiceRegistry.unregisterService(listener, HippoEventBus.class);
    }
}


Actual Event Listener:
PublicationEventListener.java

package com.myCompany.hippo.cms.modules;

import org.onehippo.cms7.event.HippoEvent;
import org.onehippo.cms7.event.HippoEventConstants;
import org.onehippo.cms7.services.eventbus.Subscribe;
import org.onehippo.repository.events.HippoWorkflowEvent;
import java.util.List;

import com.myCompany.hippo.cms.utils.EmailUtil;

public class PublicationEventListener {

@Subscribe
public void handleEvent(HippoEvent event) {
if (HippoEventConstants.CATEGORY_WORKFLOW.equals(event.category())) {
HippoWorkflowEvent workflowEvent = new HippoWorkflowEvent(event);

List argList = workflowEvent.arguments();
boolean isScheduled = false;
String messageContent = ("");
String messageSubject = ("");

//EVENT: Publication
if ("publish".equals(workflowEvent.methodName())) {

//Determine if published immediately or scheduled for future publication
//Published events will have null in the in arglist, scheduled events will have the date of publication
if (argList!=null){
isScheduled = true;
}

if (isScheduled){
messageSubject = ("--NOTIFICATION OF SCHEDULED PUBLICATION--");
messageContent = ("\n" + "--NOTIFICATION OF SCHEDULED PUBLICATION-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Has been scheduled to be published on: " + argList + " by \"" + workflowEvent.user() + "\"" + "\n");

System.out.println(messageContent);
}
else{
messageSubject = ("--NOTIFICATION OF PUBLICATION--");
messageContent =("\n" + "--NOTIFICATION OF PUBLICATION-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Was published by: \"" + workflowEvent.user() + "\" \n On: " + new java.util.Date() + "\n");
System.out.println(messageContent);
}
}

//EVENT: Depublication
else if ("depublish".equals(workflowEvent.methodName())){
//Determine if depublished immediately or scheduled for future depublication
//Depublished events will have null in the in arglist, scheduled events will have the date of depublication
if (argList!=null){
isScheduled = true;
}

if (isScheduled){
System.out.println("\n" + "--NOTIFICATION OF SCHEDULED DEPUBLICATION-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Has been scheduled to be depublished on: " + argList + " by \"" + workflowEvent.user() + "\"" + "\n");
}
else{
System.out.println("\n" + "--NOTIFICATION OF DEPUBLICATION-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Was depublished by: \"" + workflowEvent.user() + "\" \n On: " + new java.util.Date() + "\n");
}
}

//EVENT: Request for publication   
else if ("requestPublication".equals(workflowEvent.methodName())) {
//Determine if request is for immediate publication or scheduled future publication
if (argList!=null){
isScheduled = true;
}

if (isScheduled){
System.out.println("\n" + "--NOTIFICATION OF SCHEDULED PUBLICATION REQUEST-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Has been requested for scheduled publication on: " + argList + " by \"" + workflowEvent.user() + "\"" + "\n");
}
else{
System.out.println("\n" + "--NOTIFICATION OF PUBLICATION REQUEST-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Has been requested for publication by: \"" + workflowEvent.user() + "\" \n On: " + new java.util.Date() + "\n");
}
}


//EVENT: Request for depublication 
else if ("requestDepublication".equals(workflowEvent.methodName())) {
//Determine if request is for immediate depublication or scheduled future depublication
if (argList!=null){
isScheduled = true;
}

if (isScheduled){
System.out.println("\n" + "--NOTIFICATION OF SCHEDULED DEPUBLICATION REQUEST-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Has been requested for scheduled depublication on: " + argList + " by \"" + workflowEvent.user() + "\"" + "\n");
}
else{
System.out.println("\n" + "--NOTIFICATION OF DEPUBLICATION REQUEST-- \n DOCUMENT: " + workflowEvent.subjectPath()
+ "\n Has been requested for depublication by: \"" + workflowEvent.user() + "\" \n On: " + new java.util.Date() + "\n");
}
}
//EVENT: Publication/depublication request has been accepted    
else if ("acceptRequest".equals(workflowEvent.methodName())) {
System.out.println("\n" + "--NOTIFICATION OF PUBLICATION/DEPUBLICATION REQUEST ACCEPTANCE--" +
"\n The request for the publication/depublication of DOCUMENT: " + workflowEvent.subjectPath() + 
"\n Has been accepted by \"" + workflowEvent.user() + "\"\n On: " + new java.util.Date() + "\n");
}


//EVENT: Publication/depublication request has been rejected
else if ("rejectRequest".equals(workflowEvent.methodName())) {
System.out.println("\n" + "--NOTIFICATION OF PUBLICATION/DEPUBLICATION REQUEST REJECTION--" +
"\n The request for the publication/depublication of DOCUMENT: " + workflowEvent.subjectPath() + 
"\n Has been rejected by \"" + workflowEvent.user() + "\"\n On: " + new java.util.Date() + "\n");
}


//EVENT: Publication/depublication request was cancelled
else if ("cancelRequest".equals(workflowEvent.methodName())) {
System.out.println("\n" + "--NOTIFICATION OF PUBLICATION/DEPUBLICATION REQUEST CANCELLATION--" +
"\n The request for the publication/depublication of DOCUMENT: " + workflowEvent.subjectPath() + 
"\n Has been canceled by \"" + workflowEvent.user() + "\"\n On: " + new java.util.Date() + "\n");
}
else{
System.out.println("EVENT TRIGGERED: " + workflowEvent.methodName());
}
//send email
EmailUtil.SendEmail(messageContent, messageSubject);
}
}


}


EmailUtil.java

package com.myCompany.hippo.cms.utils;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class EmailUtil
{
   public static void SendEmail(String content, String subject)
   {    
      // Recipient's email ID needs to be mentioned.
      String to = "Firstname...@myCompany.com";

      // Sender's email ID needs to be mentioned
      String from = "Firstname...@myCompany.com";

      // Assuming you are sending email from localhost
      String host = "extrelay.myCompany.com";

      // Get system properties
      Properties properties = new Properties();

      // Setup mail server
      properties.setProperty("mail.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties, null);

      try{
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));

         // Set Subject: header field
         message.setSubject(subject);

         // Now set the actual message
         message.setText(content);

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Then you simply configure the listener in the hippo console

Under hippo:configuration -> hippo: modules

Add this node:

<?xml version="1.0" encoding="UTF-8"?>

<sv:node sv:name="eventlistenermodule" xmlns:sv="http://www.jcp.org/jcr/sv/1.0">
 
<sv:property sv:name="jcr:primaryType" sv:type="Name">
   
<sv:value>hipposys:module</sv:value>
 
</sv:property>
 
<sv:property sv:name="hipposys:className" sv:type="String">
   
<sv:value>com.myCompany.hippo.cms.modules.PublicationListenerModule</sv:value>
 
</sv:property>
</sv:node>


Jeroen Reijn

lukematon,
27.3.2015 klo 6.24.3127.3.2015
vastaanottaja hippo-c...@googlegroups.com
thanks so much!

--
Hippo Community Group: The place for all discussions and announcements about Hippo CMS (and HST, repository etc. etc.)
 
To post to this group, send email to hippo-c...@googlegroups.com
RSS: https://groups.google.com/group/hippo-community/feed/rss_v2_0_msgs.xml?num=50
---
You received this message because you are subscribed to the Google Groups "Hippo Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to hippo-communi...@googlegroups.com.



--
Jeroen Reijn
Hippo

Amsterdam office - Oosteinde 11, 1017 WT Amsterdam
Boston office - 745 Atlantic Ave, Eight Floor, Boston MA 02111, United states of America.


US +1 877 414 4776 (toll free)
Europe +31(0)20 522 4466
Vastaa kaikille
Vastaa kirjoittajalle
Välitä
0 uutta viestiä