Marcin, it is still worth logging it in Jira like Mike said. Also if there was a downtime of Apache SVN, it was temporary, as I can get to it now.

Andrus



On May 11, 2006, at 1:19 AM, Marcin Skladaniec wrote:

Hello !

On 10/05/2006, at 12:53 PM, Marcin Skladaniec wrote:

Hello

I think someone already asked about that, but I cant find this post.

I have a problem with removing objects from context. I tried :

                CayenneContext context = new CayenneContext(channel, true, 
true);
                CSite site = (CSite) context.newObject(CSite.class);
                context.getGraphManager().unregisterNode(site);

but the object is still in the context (it is still in getContext ().uncommittedObjects() list ).

I was wrong. I shall do context.getGraphManager().unregisterNode (site.getObjectId()); and now it works.
but the second part is still a problem



if I do
                CayenneContext context = new CayenneContext(channel, true, 
true);
                CSite site = (CSite) context.newObject(CSite.class);
                context.deleteObject(site);

there is a null object in context, so I feel like I'm hitting some bug. I started to browse code (Its good to have access to repository again !).

I have noticed that in ObjectContextDeleteAction there is a deleteNew method which makes a call to
        context.getGraphManager().unregisterNode(object.getObjectId());

so I followed it futher to GraphMap and CayenneContextGraphManager and I realized that the latter does not pay attention to unregisterNode(), and therefore stateLog which keeps dirtyIds is not updated.


I have taken a second look at CayenneContextGraphManager and GraphMap. Why there are two locations where nodes are being stored ? One is in GraphMap as nodes, and the second is in CayenneContextGraphManager in stateLog. (It looks like the stateLog is more important) In the ObjectContextDeleteAction there are separate methods for deleting !(NEW) and NEW objects :


    private void deletePersistent(Persistent object) {
        int oldState = object.getPersistenceState();
        object.setPersistenceState(PersistenceState.DELETED);
        processDeleteRules(object, oldState);
        context.getGraphManager().nodeRemoved(object.getObjectId());
    }

    private void deleteNew(Persistent object) {
        object.setPersistenceState(PersistenceState.TRANSIENT);
        processDeleteRules(object, PersistenceState.NEW);
context.getGraphManager().unregisterNode(object.getObjectId ());
    }

I believe that the last line shall in both method should be the same, because now those methods are affecting different lists of nodes. unregisterNode has no impact on list which returned by uncommitedObjects() method, so I believe this is causing the phantom object to be committed. Now I have tried it, the phantom object is committed to the database.

Beside, the anonymous svn access to cayenne repository does not work. Clicking on http://svn.apache.org/repos/asf/incubator/cayenne/ main/trunk/cayenne/ gives ' (111) Connection refused '

Regards
Marcin




-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001   fax +61 2 9550 4001



-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001   fax +61 2 9550 4001




Reply via email to