/*
* Copyright 1999,2004 The Apache Software Foundation.
*
* 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.modeshape.webdav.methods;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.modeshape.common.i18n.TextI18n;
import org.modeshape.webdav.ITransaction;
import org.modeshape.webdav.IWebdavStore;
import org.modeshape.webdav.StoredObject;
import org.modeshape.webdav.WebdavStatus;
import org.modeshape.webdav.exceptions.LockFailedException;
import org.modeshape.webdav.locking.IResourceLocks;
import org.modeshape.webdav.locking.LockedObject;
public class DoUnlock extends DeterminableMethod {
private final IWebdavStore store;
private final IResourceLocks resourceLocks;
private final boolean readOnly;
public DoUnlock( IWebdavStore store,
IResourceLocks resourceLocks,
boolean readOnly ) {
this.store = store;
this.resourceLocks = resourceLocks;
this.readOnly = readOnly;
}
@Override
public void execute( ITransaction transaction,
HttpServletRequest req,
HttpServletResponse resp ) throws IOException, LockFailedException {
logger.trace("-- " + this.getClass().getName());
if (readOnly) {
resp.sendError(WebdavStatus.SC_FORBIDDEN);
} else {
String path = getRelativePath(req);
String tempLockOwner = "doUnlock" + System.currentTimeMillis() + req.toString();
try {
if (resourceLocks.lock(transaction, path, tempLockOwner, false, 0, TEMP_TIMEOUT, TEMPORARY)) {
String lockId = getLockIdFromLockTokenHeader(req);
LockedObject lo;
if (lockId != null && ((lo = resourceLocks.getLockedObjectByID(transaction, lockId)) != null)) {
String[] owners = lo.getOwner();
String owner = null;
if (lo.isShared()) {
// more than one owner is possible
if (owners != null) {
for (int i = 0; i < owners.length; i++) {
// remove owner from LockedObject
lo.removeLockedObjectOwner(owners[i]);
}
}
} else {
// exclusive, only one lock owner
if (owners != null) {
owner = owners[0];
}
}
if (resourceLocks.unlock(transaction, lockId, owner)) {
StoredObject so = store.getStoredObject(transaction, path);
if (so == null) {
resp.setStatus(WebdavStatus.SC_NOT_FOUND);
} else {
if (so.isNullResource()) {
store.removeObject(transaction, path);
}
resp.setStatus(WebdavStatus.SC_NO_CONTENT);
}
} else {
logger.trace("DoUnlock failure at " + lo.getPath());
resp.sendError(WebdavStatus.SC_METHOD_FAILURE);
}
} else {
resp.sendError(WebdavStatus.SC_BAD_REQUEST);
}
}
} catch (LockFailedException e) {
logger.warn(e, new TextI18n("Cannot unlock resource"));
} finally {
resourceLocks.unlockTemporaryLockedObjects(transaction, path, tempLockOwner);
}
}
}
}