package org.tmatesoft.svn.core.internal.wc2.remote; import java.io.IOException; import java.io.OutputStream; import java.util.Map; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.SVNProperties; import org.tmatesoft.svn.core.SVNProperty; import org.tmatesoft.svn.core.internal.wc.IOExceptionWrapper; import org.tmatesoft.svn.core.internal.wc.SVNCancellableOutputStream; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.core.internal.wc.admin.SVNTranslator; import org.tmatesoft.svn.core.internal.wc17.db.Structure; import org.tmatesoft.svn.core.internal.wc2.SvnRemoteOperationRunner; import org.tmatesoft.svn.core.internal.wc2.SvnRepositoryAccess.RepositoryInfo; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnCat; import org.tmatesoft.svn.core.wc2.SvnTarget; import org.tmatesoft.svn.util.SVNLogType; public class SvnRemoteCat extends SvnRemoteOperationRunner<Void, SvnCat> { @Override protected Void run() throws SVNException { SVNRevision revision = getOperation().getRevision() == null || !getOperation().getRevision().isValid() ? SVNRevision.HEAD : getOperation().getRevision(); SvnTarget target = getOperation().getFirstTarget(); Structure<RepositoryInfo> repositoryInfo = getRepositoryAccess().createRepositoryFor( target, revision, target.getResolvedPegRevision(), null); SVNRepository repos = repositoryInfo.<SVNRepository>get(RepositoryInfo.repository); repositoryInfo.release(); checkCancelled(); long revNumber = repositoryInfo.lng(RepositoryInfo.revision); checkCancelled(); SVNNodeKind nodeKind = repos.checkPath("", revNumber); checkCancelled(); if (nodeKind == SVNNodeKind.DIR) { SVNErrorMessage err = SVNErrorMessage.create( SVNErrorCode.CLIENT_IS_DIRECTORY, "URL ''{0}'' refers to a directory", getOperation().getFirstTarget().getURL()); SVNErrorManager.error(err, SVNLogType.WC); } checkCancelled(); if (!getOperation().isExpandKeywords()) { repos.getFile("", revNumber, null, new SVNCancellableOutputStream(getOperation().getOutput(), this)); } else { SVNProperties properties = new SVNProperties(); repos.getFile("", revNumber, properties, null); checkCancelled(); String mimeType = properties.getStringValue(SVNProperty.MIME_TYPE); String charset = SVNTranslator.getCharset( properties.getStringValue(SVNProperty.CHARSET), mimeType, repos.getLocation().toString(), getOperation().getOptions()); String keywords = properties.getStringValue(SVNProperty.KEYWORDS); String eol = properties.getStringValue(SVNProperty.EOL_STYLE); if (charset != null || keywords != null || eol != null) { String cmtRev = properties.getStringValue(SVNProperty.COMMITTED_REVISION); String cmtDate = properties.getStringValue(SVNProperty.COMMITTED_DATE); String author = properties.getStringValue(SVNProperty.LAST_AUTHOR); Map<String, byte[]> keywordsMap = SVNTranslator.computeKeywords( keywords, getOperation().isExpandKeywords() ? repos.getLocation().toString() : null, getOperation().isExpandKeywords() ? repos.getRepositoryRoot(true).toString() : null, author, cmtDate, cmtRev, getOperation().getOptions()); OutputStream translatingStream = SVNTranslator.getTranslatingOutputStream( getOperation().getOutput(), charset, SVNTranslator.getEOL(eol, getOperation().getOptions()), false, keywordsMap, getOperation().isExpandKeywords()); repos.getFile("", revNumber, null, new SVNCancellableOutputStream(translatingStream, getOperation().getEventHandler())); try { translatingStream.flush(); } catch (IOExceptionWrapper ioew) { throw ioew.getOriginalException(); } catch (IOException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getMessage()), SVNLogType.WC); } } else { repos.getFile("", revNumber, null, new SVNCancellableOutputStream(getOperation().getOutput(), getOperation().getEventHandler())); } } try { getOperation().getOutput().flush(); } catch (IOException e) { SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getMessage()), SVNLogType.WC); } return null; } }