/* * 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.core; import static org.apache.jackrabbit.core.ItemValidator.CHECK_CHECKED_OUT; import static org.apache.jackrabbit.core.ItemValidator.CHECK_CONSTRAINTS; import static org.apache.jackrabbit.core.ItemValidator.CHECK_HOLD; import static org.apache.jackrabbit.core.ItemValidator.CHECK_LOCK; import static org.apache.jackrabbit.core.ItemValidator.CHECK_RETENTION; import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.security.authorization.Permission; import org.apache.jackrabbit.core.session.SessionContext; import org.apache.jackrabbit.core.session.SessionWriteOperation; /** * Session operation for removing a given item, optionally with constraint * checks enabled. */ class ItemRemoveOperation implements SessionWriteOperation<Object> { /** * The item to be removed. */ private final ItemImpl item; /** * Flag to enabled constraint checks */ private final boolean checks; public ItemRemoveOperation(ItemImpl item, boolean checks) { this.item = item; this.checks = checks; } public Object perform(SessionContext context) throws RepositoryException { // check if this is the root node if (item.getDepth() == 0) { throw new RepositoryException("Cannot remove the root node"); } NodeImpl parentNode = (NodeImpl) item.getParent(); if (checks) { ItemValidator validator = context.getItemValidator(); validator.checkRemove( item, CHECK_CONSTRAINTS | CHECK_HOLD | CHECK_RETENTION, Permission.NONE); // Make sure the parent node is checked-out and // neither protected nor locked. validator.checkModify( parentNode, CHECK_LOCK | CHECK_CHECKED_OUT | CHECK_CONSTRAINTS, Permission.NONE); } // delegate the removal of the child item to the parent node if (item.isNode()) { parentNode.removeChildNode((NodeId) item.getId()); } else { parentNode.removeChildProperty(item.getPrimaryPath().getName()); } return this; } //--------------------------------------------------------------< Object > /** * Returns a string representation of this operation. */ public String toString() { return "item.remove()"; } }