/*
* ====================================================================
* Copyright (c) 2004-2008 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.internal.server.dav.handlers;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLock;
import org.tmatesoft.svn.core.internal.server.dav.DAVRepositoryManager;
import org.tmatesoft.svn.core.internal.util.SVNBase64;
import org.tmatesoft.svn.core.internal.util.SVNDate;
import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;
import org.tmatesoft.svn.core.internal.util.SVNXMLUtil;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @author TMate Software Ltd.
* @version 1.2.0
*/
public class DAVGetLocksHandler extends DAVReportHandler {
private DAVGetLocksRequest myDAVRequest;
protected DAVGetLocksHandler(DAVRepositoryManager repositoryManager, HttpServletRequest request, HttpServletResponse response) {
super(repositoryManager, request, response);
}
protected DAVRequest getDAVRequest() {
if (myDAVRequest == null) {
myDAVRequest = new DAVGetLocksRequest();
}
return myDAVRequest;
}
public void execute() throws SVNException {
setDAVResource(getRequestedDAVResource(false, false));
String responseBody = generateResponseBody();
try {
setResponseContentLength(responseBody.getBytes(UTF8_ENCODING).length);
} catch (UnsupportedEncodingException e) {
}
write(responseBody);
}
private String generateResponseBody() throws SVNException {
if (getDAVResource().getResourceURI().getPath() == null) {
SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.RA_DAV_REQUEST_FAILED, "get-locks-report run on resource which doesn't represent a path within a repository."), SVNLogType.NETWORK);
}
SVNLock[] locks = getDAVResource().getLocks();
StringBuffer xmlBuffer = new StringBuffer();
addXMLHeader(xmlBuffer, null);
for (int i = 0; i < locks.length; i++) {
addLock(locks[i], xmlBuffer);
}
addXMLFooter(xmlBuffer, null);
return xmlBuffer.toString();
}
private void addLock(SVNLock lock, StringBuffer xmlBuffer) {
SVNXMLUtil.openXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "lock", SVNXMLUtil.XML_STYLE_NORMAL, null, xmlBuffer);
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "path", lock.getPath(), xmlBuffer);
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "token", lock.getID(), xmlBuffer);
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "creationdate", SVNDate.formatDate(lock.getCreationDate()), xmlBuffer);
if (lock.getExpirationDate() != null) {
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "expirationdate", SVNDate.formatDate(lock.getExpirationDate()), xmlBuffer);
}
if (lock.getOwner() != null) {
if (SVNEncodingUtil.isXMLSafe(lock.getOwner())) {
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "owner", lock.getOwner(), xmlBuffer);
} else {
String ownerEncoded = null;
try {
ownerEncoded = SVNBase64.byteArrayToBase64(lock.getOwner().getBytes(UTF8_ENCODING));
} catch (UnsupportedEncodingException e) {
ownerEncoded = SVNBase64.byteArrayToBase64(lock.getOwner().getBytes());
}
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "owner", ownerEncoded, ENCODING_ATTR, BASE64_ENCODING,
false, false, xmlBuffer);
}
}
if (lock.getComment() != null) {
if (SVNEncodingUtil.isXMLSafe(lock.getComment())) {
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "comment", lock.getComment(), xmlBuffer);
} else {
String commentEncoded = null;
try {
commentEncoded = SVNBase64.byteArrayToBase64(lock.getComment().getBytes(UTF8_ENCODING));
} catch (UnsupportedEncodingException e) {
commentEncoded = SVNBase64.byteArrayToBase64(lock.getComment().getBytes());
}
SVNXMLUtil.openCDataTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "comment", commentEncoded, ENCODING_ATTR, BASE64_ENCODING,
false, false, xmlBuffer);
}
}
SVNXMLUtil.closeXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "lock", xmlBuffer);
}
}