/* * ==================================================================== * 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.wc.admin; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNProperties; import org.tmatesoft.svn.core.SVNPropertyValue; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.util.SVNLogType; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNLogImpl extends SVNLog { private File myFile; private File myTmpFile; public SVNLogImpl(File logFile, File tmpFile, SVNAdminArea adminArea) { super(adminArea); myFile = logFile; myTmpFile = tmpFile; } public void save() throws SVNException { if (myCache == null) { return; } Writer os = null; File tmpFile = myTmpFile != null ? myTmpFile : SVNFileUtil.createUniqueFile(myAdminArea.getAdminFile("tmp"), "log", ".tmp", false); try { os = new OutputStreamWriter(SVNFileUtil.openFileForWriting(tmpFile), "UTF-8"); for (Iterator commands = myCache.iterator(); commands.hasNext();) { SVNProperties command = (SVNProperties) commands.next(); SVNPropertyValue name = command.remove(""); os.write("<"); os.write(name.getString()); for (Iterator attrs = command.nameSet().iterator(); attrs.hasNext();) { String attr = (String) attrs.next(); SVNPropertyValue value = command.getSVNPropertyValue(attr); String str = null; if (value == null) { str = ""; } else { str = SVNPropertyValue.getPropertyAsString(value); } str = SVNEncodingUtil.xmlEncodeAttr(str); os.write("\n "); os.write(attr); os.write("=\""); os.write(str); os.write("\""); } os.write("/>\n"); } } catch (IOException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, "Cannot write log file ''{0}'': {1}", new Object[] {myFile, e.getLocalizedMessage()}); SVNErrorManager.error(err, e, SVNLogType.WC); } finally { SVNFileUtil.closeFile(os); myCache = null; } SVNFileUtil.rename(tmpFile, myFile); SVNFileUtil.setReadonly(myFile, true); } public Collection readCommands() throws SVNException { if (!myFile.exists()) { return null; } BufferedReader reader = null; Collection commands = new ArrayList(); try { reader = new BufferedReader(new InputStreamReader(SVNFileUtil.openFileForReading(myFile, SVNLogType.WC), "UTF-8")); String line; SVNProperties attrs = new SVNProperties(); String name = null; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.startsWith("<")) { name = line.substring(1); continue; } int index = line.indexOf('='); if (index > 0) { String attrName = line.substring(0, index).trim(); String value = line.substring(index + 1).trim(); if (value.endsWith("/>")) { value = value.substring(0, value.length() - "/>".length()); } if (value.startsWith("\"")) { value = value.substring(1); } if (value.endsWith("\"")) { value = value.substring(0, value.length() - 1); } value = SVNEncodingUtil.xmlDecode(value); if ("".equals(value) && !SVNLog.NAME_ATTR.equals(attrName)) { value = null; } attrs.put(attrName, value); } if (line.endsWith("/>") && name != null) { // run command attrs.put("", name); commands.add(attrs); attrs = new SVNProperties(); name = null; } } } catch (IOException e) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, "Cannot read log file ''{0}'': {1}", new Object[] {myFile, e.getLocalizedMessage()}); SVNErrorManager.error(err, e, SVNLogType.WC); } finally { SVNFileUtil.closeFile(reader); } return commands; } public String toString() { return "Log: " + myFile; } public void delete() throws SVNException { SVNFileUtil.deleteFile(myFile); SVNFileUtil.deleteFile(myTmpFile); } public boolean exists() { return myFile.exists(); } }