Perhaps I'm just missing something simple. I've tried using individual listener 
configurations, and they don't work either. 

Here is a sample entry:
                <entity-listener class="com.apple.mqm.db.PDCAListener">
                        <pre-persist method-name="onPrePersist"/>
                        <pre-update method-name="onPreUpdate"/>
                </entity-listener>


And here is my listener class:
package com.apple.mqm.db;

import java.util.Date;

import org.apache.cayenne.CayenneDataObject;

public class PDCAListener {

        void onPrePersist (Object object) {
                CayenneDataObject dataObject = (CayenneDataObject) object;
                if (dataObject.readProperty(Product.CREATION_DATE_PROPERTY) == 
null) {
                        
dataObject.writeProperty(Product.CREATION_DATE_PROPERTY, new Date());
                }
                if (dataObject.readProperty(Product.LAST_MOD_DATE_PROPERTY) == 
null) {
                        
dataObject.writeProperty(Product.LAST_MOD_DATE_PROPERTY, new Date());
                }
                dataObject.writeProperty(Product.MOD_COUNT_PROPERTY, 1);
        }

        void onPreUpdate (Object object) {
                CayenneDataObject dataObject = (CayenneDataObject) object;
                dataObject.writeProperty(Product.LAST_MOD_DATE_PROPERTY, new 
Date());
                dataObject.writeProperty(Product.MOD_COUNT_PROPERTY, 
((Integer)dataObject.readProperty(Product.LAST_MOD_DATE_PROPERTY))+1);
        }
}


I don't have any code to activate the listeners. When testing I'm getting a 
validation error that for a field that this listener sets onPrePersist. And I 
never reach a breakpoint in the listener code.

Joe


On Aug 3, 2011, at 11:12 AM, Andrus Adamchik wrote:

> Ok, we'll need to re-test this case, and implement the missing registration 
> API. 
> 
> On Aug 3, 2011, at 9:09 PM, Joseph Senecal wrote:
>> Andrus,
>> 
>> Yes, I was using a per DataMap listener.
>> 
>> I'll try using individual class listeners for the prototype and see how that 
>> works.
>> 
>> These listeners are really part of the basic operation of the DB interface, 
>> so they are common to all programs using the database. Currently I'm 
>> considering having the template generate the listener methods in each class, 
>> along with code that will install the listener for that class the first time 
>> the class is referenced (probably using a static initializer). This will 
>> allow the listener methods to be customized for each class instead of having 
>> to check the model. Annotations will help there.
>> 
>> Joe
>> 
>> On Aug 3, 2011, at 10:50 AM, Andrus Adamchik wrote:
>> 
>>> Hi Joe,
>>> 
>>> On Aug 3, 2011, at 10:29 AM, Joseph Senecal wrote:
>>> 
>>>> I'm trying to configure a single listener object to listen to a couple of 
>>>> events for all objects. This is to update modCounts and lastModTimes just 
>>>> before the commit.
>>>> 
>>>> The documentation says this is configured in the Cayenne modeler, but 
>>>> doesn't explain how. I found how to specify a class and methods, but it 
>>>> doesn't seem to be getting called.
>>> 
>>> This is odd. This certainly works for me. Here is an example from one of my 
>>> map.xml files (created by the Modeler) :
>>> 
>>> This part is a listener within <obj-enntity> tags:
>>> 
>>>     <entity-listener class="com.foo.listener.MyListener">
>>>             <post-persist method-name="objectPostPersistCallback"/>
>>>     </entity-listener>
>>> 
>>> This part is callbacks on persistent objects themselves:
>>> 
>>>     <post-add method-name="onPostAdd"/>
>>>     <pre-update method-name="onPreUpdate"/>
>>> 
>>> These are per-entity callbacks/listeners. Are you setting a listener per 
>>> DataMap? (I personally haven't used "global" listeners, but those should 
>>> work too). Could you confirm - we'll re-test this case then.
>>> 
>>>> I can see how to do it programmatically, but is there a cleaner solution 
>>>> that I'm missing?
>>> 
>>> Personally I am moving to setting everything programmatically, as it allows 
>>> me to have different listeners for the same shared entities in different 
>>> Java projects. So my preferred method is the latest 3.1M2 API based on 
>>> annotations:
>>> 
>>> runtime.getChannel().getEntityResolver().getCallbackRegistry().addListener(listener)
>>> 
>>> But again - this is for per-entity listeners. Not per-DataMap. (Which 
>>> reminds me - we need to support this flavor in per-DataMap case).
>>> 
>>> Cheers,
>>> Andrus
>> 
>> 
> 

Reply via email to