I've just tried programatic configuration, with the same lack of results.
Here's the code I used in the main routine:
PDCAListener listener = new PDCAListener();
DataDomain domain = ContextFactory.getDataDomain();
LifecycleCallbackRegistry registry =
domain.getEntityResolver().getCallbackRegistry();
registry.addDefaultListener(LifecycleEvent.PRE_PERSIST,
listener, "onPrePersist");
registry.addDefaultListener(LifecycleEvent.PRE_UPDATE,
listener, "onPreUpdate");
Joe
On Aug 3, 2011, at 1:04 PM, Joseph Senecal wrote:
> 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
>>>
>>>
>>
>