/* * ==================================================================== * 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.OutputStream; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNPropertyValue; import org.tmatesoft.svn.core.internal.server.dav.DAVException; import org.tmatesoft.svn.core.internal.server.dav.DAVRepositoryManager; import org.tmatesoft.svn.core.internal.util.SVNHashMap; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.internal.util.SVNXMLUtil; import org.tmatesoft.svn.core.io.ISVNFileRevisionHandler; import org.tmatesoft.svn.core.io.SVNFileRevision; import org.tmatesoft.svn.core.io.diff.SVNDiffWindow; /** * @author TMate Software Ltd. * @version 1.2.0 */ public class DAVFileRevisionsHandler extends DAVReportHandler implements ISVNFileRevisionHandler { private static final String FILE_REVISION_TAG = "file-rev"; private static final String REVISION_PROPERTY_TAG = "rev-prop"; private static final String SET_PROPERTY_TAG = "set-prop"; private static final String REMOVE_PROPERTY_TAG = "remove-prop"; private static final String MERGED_REVISION_TAG = "merged-revision"; private DAVFileRevisionsRequest myDAVRequest; private boolean myWriteHeader; private DAVReportHandler myCommonReportHandler; public DAVFileRevisionsHandler(DAVRepositoryManager repositoryManager, HttpServletRequest request, HttpServletResponse response, DAVReportHandler commonReportHandler) { super(repositoryManager, request, response); myCommonReportHandler = commonReportHandler; } protected DAVRequest getDAVRequest() { return getFileRevsionsRequest(); } private DAVFileRevisionsRequest getFileRevsionsRequest() { if (myDAVRequest == null) { myDAVRequest = new DAVFileRevisionsRequest(); } return myDAVRequest; } public void execute() throws SVNException { myCommonReportHandler.checkSVNNamespace(null); setDAVResource(getRequestedDAVResource(false, false)); myWriteHeader = true; String path = SVNPathUtil.append(getDAVResource().getResourceURI().getPath(), getFileRevsionsRequest().getPath()); try { getDAVResource().getRepository().getFileRevisions(path, getFileRevsionsRequest().getStartRevision(), getFileRevsionsRequest().getEndRevision(), getFileRevsionsRequest().isIncludeMergedRevisions(), this); } catch (SVNException svne) { throw DAVException.convertError(svne.getErrorMessage(), HttpServletResponse.SC_INTERNAL_SERVER_ERROR, svne.getErrorMessage().getMessage(), null); } try { maybeSendHeader(); } catch (SVNException svne) { throw DAVException.convertError(svne.getErrorMessage(), HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error beginning REPORT reponse", null); } try { writeXMLFooter(null); } catch (SVNException svne) { throw DAVException.convertError(svne.getErrorMessage(), HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error ending REPORT reponse", null); } } public void openRevision(SVNFileRevision fileRevision) throws SVNException { maybeSendHeader(); Map attrs = new SVNHashMap(); attrs.put(PATH_ATTR, fileRevision.getPath()); attrs.put(REVISION_ATTR, String.valueOf(fileRevision.getRevision())); StringBuffer xmlBuffer = SVNXMLUtil.openXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, FILE_REVISION_TAG, SVNXMLUtil.XML_STYLE_NORMAL, attrs, null); write(xmlBuffer); for (Iterator iterator = fileRevision.getRevisionProperties().nameSet().iterator(); iterator.hasNext();) { String propertyName = (String) iterator.next(); writePropertyTag(REVISION_PROPERTY_TAG, propertyName, fileRevision.getRevisionProperties().getSVNPropertyValue(propertyName)); } for (Iterator iterator = fileRevision.getPropertiesDelta().nameSet().iterator(); iterator.hasNext();) { String propertyName = (String) iterator.next(); SVNPropertyValue propertyValue = fileRevision.getPropertiesDelta().getSVNPropertyValue(propertyName); if (propertyValue != null) { writePropertyTag(SET_PROPERTY_TAG, propertyName, propertyValue); } else { xmlBuffer = SVNXMLUtil.openXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, REMOVE_PROPERTY_TAG, SVNXMLUtil.XML_STYLE_SELF_CLOSING, "name", propertyName, null); write(xmlBuffer); } } if (fileRevision.isResultOfMerge()) { xmlBuffer = SVNXMLUtil.openXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, MERGED_REVISION_TAG, SVNXMLUtil.XML_STYLE_SELF_CLOSING, null, null); write(xmlBuffer); } } public void closeRevision(String token) throws SVNException { StringBuffer xmlBuffer = SVNXMLUtil.closeXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, FILE_REVISION_TAG, null); write(xmlBuffer); } public void applyTextDelta(String path, String baseChecksum) throws SVNException { StringBuffer xmlBuffer = SVNXMLUtil.openXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, TXDELTA_ATTR, SVNXMLUtil.XML_STYLE_NORMAL, null, null); write(xmlBuffer); } public OutputStream textDeltaChunk(String path, SVNDiffWindow diffWindow) throws SVNException { writeTextDeltaChunk(diffWindow); return null; } public void textDeltaEnd(String path) throws SVNException { textDeltaChunkEnd(); setWriteTextDeltaHeader(true); StringBuffer xmlBuffer = SVNXMLUtil.closeXMLTag(SVNXMLUtil.SVN_NAMESPACE_PREFIX, TXDELTA_ATTR, null); write(xmlBuffer); } private void maybeSendHeader() throws SVNException { if (myWriteHeader) { writeXMLHeader(null); myWriteHeader = false; } } }