/*
* ====================================================================
* Copyright (c) 2004-2012 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.io.dav.handlers;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLock;
import org.tmatesoft.svn.core.internal.io.dav.DAVElement;
import org.tmatesoft.svn.core.internal.util.SVNBase64;
import org.tmatesoft.svn.core.internal.util.SVNDate;
import org.tmatesoft.svn.core.internal.util.SVNXMLUtil;
import org.xml.sax.Attributes;
/**
* @author TMate Software Ltd.
* @version 1.3
*/
public class DAVGetLocksHandler extends BasicDAVHandler {
private static final String LOCK_COMMENT_SUFFIX = "</ns0:owner>";
private static final String LOCK_COMMENT_PREFIX = "<ns0:owner xmlns:ns0=\"DAV:\">";
private static final String EMPTY_LOCK_COMMENT = "<ns0:owner xmlns:ns0=\"DAV:\"/>";
public static StringBuffer generateGetLocksRequest(StringBuffer xmlBuffer) {
xmlBuffer = xmlBuffer == null ? new StringBuffer() : xmlBuffer;
SVNXMLUtil.addXMLHeader(xmlBuffer);
SVNXMLUtil.openNamespaceDeclarationTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "get-locks-report",
SVN_DAV_NAMESPACES_LIST, SVNXMLUtil.PREFIX_MAP, xmlBuffer);
SVNXMLUtil.addXMLFooter(SVNXMLUtil.SVN_NAMESPACE_PREFIX, "get-locks-report", xmlBuffer);
return xmlBuffer;
}
private Collection myLocks;
private String myPath;
private String myToken;
private String myComment;
private String myOwner;
private Date myExpirationDate;
private Date myCreationDate;
private boolean myIsBase64;
public DAVGetLocksHandler() {
myLocks = new ArrayList();
init();
}
public SVNLock[] getLocks() {
return (SVNLock[]) myLocks.toArray(new SVNLock[myLocks.size()]);
}
protected void startElement(DAVElement parent, DAVElement element, Attributes attrs) throws SVNException {
myIsBase64 = false;
if (attrs != null) {
myIsBase64 = "base64".equals(attrs.getValue("encoding"));
}
}
protected void endElement(DAVElement parent, DAVElement element, StringBuffer cdata) throws SVNException {
if (element == DAVElement.SVN_LOCK) {
if (myPath != null && myToken != null) {
SVNLock lock = new SVNLock(myPath, myToken, myOwner, myComment, myCreationDate, myExpirationDate);
myLocks.add(lock);
}
myPath = null;
myOwner = null;
myToken = null;
myComment = null;
myCreationDate = null;
myExpirationDate = null;
} else if (element == DAVElement.SVN_LOCK_PATH && cdata != null) {
myPath = cdata.toString();
} else if (element == DAVElement.SVN_LOCK_TOKEN && cdata != null) {
myToken = cdata.toString();
} else if (element == DAVElement.SVN_LOCK_OWNER && cdata != null) {
myOwner = cdata.toString();
if (myIsBase64) {
StringBuffer sb = SVNBase64.normalizeBase64(new StringBuffer(myOwner));
byte[] buffer = allocateBuffer(sb.length());
int length = SVNBase64.base64ToByteArray(sb, buffer);
try {
myOwner = new String(buffer, 0, length, "UTF-8");
} catch (UnsupportedEncodingException e) {
myOwner = new String(buffer, 0, length);
}
}
} else if (element == DAVElement.SVN_LOCK_COMMENT && cdata != null) {
myComment = cdata.toString();
if (myComment != null && myComment.trim().startsWith(LOCK_COMMENT_PREFIX) && myComment.trim().endsWith(LOCK_COMMENT_SUFFIX)) {
myComment = myComment.trim().substring(LOCK_COMMENT_PREFIX.length(), myComment.trim().length() - LOCK_COMMENT_SUFFIX.length());
} else if (myComment.trim().equals(EMPTY_LOCK_COMMENT)) {
myComment = "";
}
if (myIsBase64) {
StringBuffer sb = SVNBase64.normalizeBase64(new StringBuffer(myComment));
byte[] buffer = allocateBuffer(sb.length());
int length = SVNBase64.base64ToByteArray(sb, buffer);
try {
myComment = new String(buffer, 0, length, "UTF-8");
} catch (UnsupportedEncodingException e) {
myComment = new String(buffer, 0, length);
}
}
} else if (element == DAVElement.SVN_LOCK_CREATION_DATE && cdata != null) {
myCreationDate = SVNDate.parseDate(cdata.toString());
} else if (element == DAVElement.SVN_LOCK_EXPIRATION_DATE && cdata != null) {
myExpirationDate = SVNDate.parseDate(cdata.toString());
}
myIsBase64 = false;
}
}