All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.jcr2spi.state.Status Maven / Gradle / Ivy

/*
 * 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;

/**
 * Status...
 */
public final class Status {

    /**
     * Avoid instantiation
     */
    private Status() {}

    public static final int _UNDEFINED_ = -1;

    /**
     * A state once read from persistent storage has been set to invalid. This
     * means that the state needs to be re-fetched from persistent storage when
     * accessed the next time.
     */
    public static final int INVALIDATED = 0;

    /**
     * 'existing', i.e. persistent state
     */
    public static final int EXISTING = 1;
    /**
     * 'existing', i.e. persistent state that has been transiently modified (copy-on-write)
     */
    public static final int EXISTING_MODIFIED = 2;
    /**
     * 'existing', i.e. persistent state that has been transiently removed (copy-on-write)
     */
    public static final int EXISTING_REMOVED = 3;
    /**
     * 'new' state
     */
    public static final int NEW = 4;
    /**
     * 'existing', i.e. persistent state that has been persistently modified by somebody else
     */
    public static final int STALE_MODIFIED = 5;
    /**
     * 'existing', i.e. persistent state that has been destroyed by somebody else
     */
    public static final int STALE_DESTROYED = 6;

    /**
     * Temporary status used to mark a state, this is permanently modified
     * either by saving transient changes, by workspace operations or by
     * external modification.
     */
    public static final int MODIFIED = 7;

    /**
     * a new state was removed and is now 'removed'
     * or an existing item has been removed by a workspace operation or
     * by an external modification.
     */
    public static final int REMOVED = 8;

    private static final String[] STATUS_NAMES = new String[] {
        "INVALIDATED",
        "EXISTING",
        "EXISTING_MODIFIED",
        "EXISTING_REMOVED",
        "NEW",
        "STALE_MODIFIED",
        "STALE_DESTROYED",
        "MODIFIED",
        "REMOVED"
    };

    /**
     * Returns true if the given status is a terminal status, i.e.
     * the given status one of:
     * 
    *
  • {@link #REMOVED}
  • *
  • {@link #STALE_DESTROYED}
  • *
* * @param status * @return true if the given status is terminal. */ public static boolean isTerminal(int status) { return status == REMOVED || status == STALE_DESTROYED; } /** * Returns true if this item state is valid, that is its status * is one of: *
    *
  • {@link #EXISTING}
  • *
  • {@link #EXISTING_MODIFIED}
  • *
  • {@link #NEW}
  • *
* * @param status * @return true if the given status indicates a valid ItemState. */ public static boolean isValid(int status) { return status == EXISTING || status == EXISTING_MODIFIED || status == NEW; } /** * Returns true if status is one of: *
    *
  • {@link #STALE_DESTROYED}
  • *
  • {@link #STALE_MODIFIED}
  • *
* * @param status the status to check. * @return true if status indicates that an item * state is stale. */ public static boolean isStale(int status) { return status == STALE_DESTROYED || status == STALE_MODIFIED; } /** * Returns true if status is one of: *
    *
  • {@link #EXISTING_MODIFIED}
  • *
  • {@link #EXISTING_REMOVED}
  • *
  • {@link #NEW}
  • *
* * @param status the status to check. * @return true if status indicates that an item * state is transiently modified. */ public static boolean isTransient(int status) { return status == EXISTING_MODIFIED || status == EXISTING_REMOVED || status == NEW; } /** * Returns true, if the status of an item state can be changed from * oldStatus to newStatus, and false if the * change is illegal or if any of the given status flags is illegal. * * @param oldStatus * @param newStatus * @return true if a status change from oldStatus to * newStatus is allowed or if the two status are the same. */ public static boolean isValidStatusChange(int oldStatus, int newStatus) { if (oldStatus == newStatus) { return true; } boolean isValid = false; // valid status changes for session-states switch (newStatus) { case INVALIDATED: isValid = (oldStatus == EXISTING); // invalidate break; case EXISTING: switch (oldStatus) { case INVALIDATED: /* refresh */ case NEW: /* save */ case EXISTING_MODIFIED: /* save, revert */ case EXISTING_REMOVED: /* revert */ case STALE_MODIFIED: /* revert */ case MODIFIED: isValid = true; break; /* REMOVED, STALE_DESTROYED -> false */ } break; case EXISTING_MODIFIED: isValid = (oldStatus == EXISTING); break; case EXISTING_REMOVED: isValid = (oldStatus == EXISTING || oldStatus == EXISTING_MODIFIED); break; case STALE_MODIFIED: case STALE_DESTROYED: isValid = (oldStatus == EXISTING_MODIFIED || oldStatus == EXISTING_REMOVED || oldStatus == STALE_MODIFIED); break; case REMOVED: // removal always possible -> getNewStatus(int, int) isValid = true; break; case MODIFIED: // except for NEW states an external modification is always valid if (oldStatus != NEW) { isValid = true; } break; /* default: NEW cannot change state to NEW -> false */ } return isValid; } /** * Returns the given newStatusHint unless the new status * collides with a pending modification or removal which results in a * stale item state. * * @param oldStatus * @param newStatusHint * @return new status that takes transient modification/removal into account. */ public static int getNewStatus(int oldStatus, int newStatusHint) { int newStatus; switch (newStatusHint) { case Status.MODIFIED: // underlying state has been modified by external changes if (oldStatus == Status.EXISTING || oldStatus == Status.INVALIDATED) { // temporarily set the state to MODIFIED in order to inform listeners. newStatus = Status.MODIFIED; } else if (oldStatus == Status.EXISTING_MODIFIED) { newStatus = Status.STALE_MODIFIED; } else { // old status is EXISTING_REMOVED (or any other) => ignore. // a NEW state may never be marked modified. newStatus = oldStatus; } break; case Status.REMOVED: if (oldStatus == Status.EXISTING_MODIFIED || oldStatus == Status.STALE_MODIFIED) { newStatus = Status.STALE_DESTROYED; } else { // applies both to NEW or to any other status newStatus = newStatusHint; } break; default: newStatus = newStatusHint; break; } return newStatus; } /** * @param status A valid status constant. * @return Human readable status name for the given int. */ public static String getName(int status) { if (status == _UNDEFINED_) { return "_UNDEFINED_"; } if (status < 0 || status >= STATUS_NAMES.length) { throw new IllegalArgumentException("Invalid status " + status); } return STATUS_NAMES[status]; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy