blob: b72637e7c06a3935c975a24441a2fd679bef7248 [file] [log] [blame]
/*
* 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.oak.jcr.delegate;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.jcr.InvalidItemStateException;
import javax.jcr.RepositoryException;
import org.apache.jackrabbit.oak.api.Tree.Status;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Abstract base class for {@link NodeDelegate} and {@link PropertyDelegate}
*/
public abstract class ItemDelegate {
protected final SessionDelegate sessionDelegate;
/**
* The session update count. Used to avoid the overhead of extra
* {@link #exists()} calls every time this item is accessed.
*
* @see #checkAlive()
*/
private long updateCount;
ItemDelegate(SessionDelegate sessionDelegate) {
this.sessionDelegate = checkNotNull(sessionDelegate);
this.updateCount = sessionDelegate.getUpdateCount();
}
/**
* Checks whether the session has changed since this delegate instance
* was last accessed, thus triggering an {@link #update() update} of the
* internal state of this delegate.
*
* @return {@code true} if the session was recently updated,
* {@code false} if not
*/
protected boolean checkUpdate() {
long sessionCount = sessionDelegate.getUpdateCount();
if (updateCount != sessionCount) {
updateCount = sessionCount;
update();
return true;
} else {
return false;
}
}
/**
* Called by {@link #checkUpdate()} to update the internal state of this
* delegate.
*/
protected void update() {
}
/**
* Performs a sanity check on this item and the associated session.
*
* @throws RepositoryException if this item has been rendered invalid
* for some reason or the associated session
* has been logged out
*/
public synchronized void checkAlive() throws RepositoryException {
sessionDelegate.checkAlive();
if (checkUpdate() && !exists()) {
throw new InvalidItemStateException(
"This item [" + getPath() + "] does not exist anymore");
}
}
/**
* Get the name of this item
* @return oak name of this item
*/
@NotNull
public abstract String getName();
/**
* Get the path of this item
* @return oak path of this item
*/
@NotNull
public abstract String getPath();
/**
* Get the parent of this item or {@code null}.
* @return parent of this item or {@code null} for root or if the parent
* is not accessible.
*/
@Nullable
public abstract NodeDelegate getParent();
/**
* Get the status of this item.
* @return {@link Status} of this item or {@code null} if not available.
*/
@Nullable
public abstract Status getStatus();
public abstract boolean isProtected() throws InvalidItemStateException;
/**
* Determine whether the underlying item exists
* @return {@code true} the underlying tree exists, {@code false} otherwise.
*/
public abstract boolean exists();
/**
* Removes this item.
*
* @return {@code true} if this item was removed;
* or {@code false} if this is the root node that can't be removed
*/
public abstract boolean remove() throws InvalidItemStateException;
/**
* Save the subtree rooted at this item.
*
* @throws RepositoryException
*/
public void save() throws RepositoryException {
sessionDelegate.save(getPath());
}
}