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
>>
>>
>