/*
* Copyright (c) 2005-2013, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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.wso2.carbon.registry.extensions.handlers;
import org.wso2.carbon.registry.api.Resource;
import org.wso2.carbon.registry.core.Collection;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.jdbc.handlers.Handler;
import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext;
/**
* This handler is use to delete the resource collections recursively.
* This will delete resources individually, not collectively which help
* registry indexer to remove the resources from its index.
*
*/
public class RecursiveDeleteHandler extends Handler {
@Override
public void delete(RequestContext requestContext) throws RegistryException {
Resource resource = requestContext.getResource();
if (resource instanceof Collection) {
if(!isDeleteLockAvailable()){
return;
}
acquireDeleteLock();
try {
deleteRecursively(requestContext.getRegistry(), resource);
requestContext.setProcessingComplete(true);
} finally {
releaseDeleteLock();
}
}
}
private void deleteRecursively (Registry registry, Resource resource) throws RegistryException {
if (resource instanceof Collection) {
for(String childResource : ((Collection) resource).getChildren()){
deleteRecursively(registry, registry.get(childResource));
}
}
registry.delete(resource.getPath());
}
/**
* This lock is shared with DeleteHierarchyHandler in
* order to prevent delete same resource multiple times.
*/
private static ThreadLocal<Boolean> deleteInProgress = new ThreadLocal<Boolean>() {
protected Boolean initialValue() {
return false;
}
};
public static boolean isDeleteLockAvailable() {
return !deleteInProgress.get();
}
public static void acquireDeleteLock() {
deleteInProgress.set(true);
}
public static void releaseDeleteLock() {
deleteInProgress.set(false);
}
}