Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 16924 invoked from network); 8 Aug 2006 10:03:50 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 8 Aug 2006 10:03:50 -0000 Received: (qmail 8460 invoked by uid 500); 8 Aug 2006 10:03:50 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 8368 invoked by uid 500); 8 Aug 2006 10:03:50 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 8359 invoked by uid 99); 8 Aug 2006 10:03:50 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Aug 2006 03:03:50 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Aug 2006 03:03:49 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 497BE1A981A; Tue, 8 Aug 2006 03:03:29 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r429622 - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state: ItemState.java ItemStateLifeCycleListener.java TransientChangeLog.java Date: Tue, 08 Aug 2006 10:03:28 -0000 To: commits@jackrabbit.apache.org From: mreutegg@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060808100329.497BE1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: mreutegg Date: Tue Aug 8 03:03:27 2006 New Revision: 429622 URL: http://svn.apache.org/viewvc?rev=429622&view=rev Log: - Introduce ItemStateLifeCycleListener to keep track of status changes of an ItemState. Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateLifeCycleListener.java (with props) Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java?rev=429622&r1=429621&r2=429622&view=diff ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java Tue Aug 8 03:03:27 2006 @@ -165,13 +165,13 @@ * LocalItemStateManager when this item state has been disposed. */ void onDisposed() { + disconnect(); + overlayedState = null; + setStatus(STATUS_UNDEFINED); // prepare this instance so it can be gc'ed synchronized (listeners) { listeners.clear(); } - disconnect(); - overlayedState = null; - status = STATUS_UNDEFINED; } /** @@ -314,6 +314,22 @@ } } + /** + * Notify the life cycle listeners that this state has changed its status. + */ + protected void notifyStatusChanged(int oldStatus) { + // copy listeners to array to avoid ConcurrentModificationException + ItemStateListener[] la; + synchronized (listeners) { + la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]); + } + for (int i = 0; i < la.length; i++) { + if (la[i] instanceof ItemStateLifeCycleListener) { + ((ItemStateLifeCycleListener) la[i]).statusChanged(this, oldStatus); + } + } + } + //-------------------------------------------------------< public methods > /** * Determines if this item state represents a node. @@ -374,11 +390,17 @@ } /** + * TODO: this method should be at least protected. the outside should not + * TODO: control the status of an item state * Sets the new status of this item. * * @param newStatus the new status */ public void setStatus(int newStatus) { + if (status == newStatus) { + return; + } + int oldStatus = status; switch (newStatus) { case STATUS_NEW: case STATUS_EXISTING: @@ -388,12 +410,13 @@ case STATUS_STALE_DESTROYED: case STATUS_UNDEFINED: status = newStatus; - return; + break; default: String msg = "illegal status: " + newStatus; log.debug(msg); throw new IllegalArgumentException(msg); } + notifyStatusChanged(oldStatus); } /** @@ -429,7 +452,7 @@ // notify listeners notifyStateDiscarded(); // reset status - status = STATUS_UNDEFINED; + setStatus(STATUS_UNDEFINED); } } @@ -484,7 +507,7 @@ */ public void stateCreated(ItemState created) { // underlying state has been permanently created - status = STATUS_EXISTING; + setStatus(STATUS_EXISTING); // TODO: shouldn't the status change happen after pull? pull(); } @@ -494,9 +517,9 @@ public void stateDestroyed(ItemState destroyed) { // underlying state has been permanently destroyed if (isTransient) { - status = STATUS_STALE_DESTROYED; + setStatus(STATUS_STALE_DESTROYED); } else { - status = STATUS_EXISTING_REMOVED; + setStatus(STATUS_EXISTING_REMOVED); notifyStateDestroyed(); } } @@ -507,7 +530,7 @@ public void stateModified(ItemState modified) { // underlying state has been modified if (isTransient) { - status = STATUS_STALE_MODIFIED; + setStatus(STATUS_STALE_MODIFIED); } else { synchronized (this) { // this instance represents existing state, update it Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateLifeCycleListener.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateLifeCycleListener.java?rev=429622&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateLifeCycleListener.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateLifeCycleListener.java Tue Aug 8 03:03:27 2006 @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.jcr2spi.state; + +/** + * ItemStateLifeCycleListener allows an implementing class to get + * notifications about the life cycle of an item state. + */ +public interface ItemStateLifeCycleListener extends ItemStateListener { + + /** + * Called after an ItemState has changed its status. The new + * status can be retrieved by calling {@link ItemState#getStatus()}. + * + * @param state the item state, which changed its status. + * @param previousStatus the previous status of state. + */ + public void statusChanged(ItemState state, int previousStatus); +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateLifeCycleListener.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java?rev=429622&r1=429621&r2=429622&view=diff ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java Tue Aug 8 03:03:27 2006 @@ -35,7 +35,7 @@ * when added. */ public class TransientChangeLog extends ChangeLog - implements TransientItemStateManager, TransientItemStateFactory, ItemStateListener { + implements TransientItemStateManager, TransientItemStateFactory, ItemStateLifeCycleListener { // TODO: TO-BE-FIXED. Usage of SPI_ItemId requries different handling @@ -474,7 +474,7 @@ return new PropertyState(overlayedState, parentState, ItemState.STATUS_EXISTING, true); } - //---------------------------< ItemStateListener >-------------------------- + //-----------------------< ItemStateLifeCycleListener >--------------------- /** * @inheritDoc @@ -506,6 +506,18 @@ */ public void stateDiscarded(ItemState discarded) { // TODO: remove from modified (and deleted?) set of change log + } + + /** + * @inheritDoc + * @see ItemStateLifeCycleListener#statusChanged(ItemState, int) + */ + public void statusChanged(ItemState state, int previousStatus) { + // TODO: depending on status of state adapt change log + // e.g. a revert on states will reset the status from + // 'existing modified' to 'existing'. + // a state which changes from 'existing' to 'existing modified' will + // go into the modified set of the change log, etc. } //--------------------------------------------------------< inner classes >