/*
* ====================================================================
* 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.fs;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntryPath;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class FSPathChange extends SVNLogEntryPath {
private static final long serialVersionUID = 4845L;
private static final String FLAG_TRUE = "true";
private static final String FLAG_FALSE = "false";
private String myPath;
private FSID myRevNodeId;
private FSPathChangeKind myChangeKind;
boolean isTextModified;
boolean arePropertiesModified;
public FSPathChange(String path, FSID id, FSPathChangeKind kind, boolean textModified, boolean propsModified, String copyfromPath, long copyfromRevision,
SVNNodeKind pathKind) {
super(path, FSPathChangeKind.getType(kind), copyfromPath, copyfromRevision, pathKind);
myPath = path;
myRevNodeId = id;
myChangeKind = kind;
isTextModified = textModified;
arePropertiesModified = propsModified;
}
public String getPath(){
return myPath;
}
public boolean arePropertiesModified() {
return arePropertiesModified;
}
public void setPropertiesModified(boolean propertiesModified) {
arePropertiesModified = propertiesModified;
}
public boolean isTextModified() {
return isTextModified;
}
public void setTextModified(boolean textModified) {
isTextModified = textModified;
}
public FSPathChangeKind getChangeKind() {
return myChangeKind;
}
public void setChangeKind(FSPathChangeKind changeKind) {
myChangeKind = changeKind;
super.setChangeType(FSPathChangeKind.getType(changeKind));
}
public FSID getRevNodeId() {
return myRevNodeId;
}
public void setRevNodeId(FSID revNodeId) {
myRevNodeId = revNodeId;
}
public void setCopyRevision(long revision) {
super.setCopyRevision(revision);
}
public void setCopyPath(String path) {
super.setCopyPath(path);
}
public void setNodeKind(SVNNodeKind nodeKind) {
super.setNodeKind(nodeKind);
}
public static FSPathChange fromString(String changeLine, String copyfromLine) throws SVNException {
int delimiterInd = changeLine.indexOf(' ');
//String[] piecesOfChangeLine = changeLine.split(" ", 5);
if (delimiterInd == -1) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid changes line in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
String id = changeLine.substring(0, delimiterInd);
FSID nodeRevID = FSID.fromString(id);
changeLine = changeLine.substring(delimiterInd + 1);
delimiterInd = changeLine.indexOf(' ');
if (delimiterInd == -1) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid changes line in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
String changesKindStr = changeLine.substring(0, delimiterInd);
int dashIndex = changesKindStr.indexOf("-");
SVNNodeKind nodeKind = SVNNodeKind.UNKNOWN;
if (dashIndex >=0) {
String nodeKindStr = changesKindStr.substring(dashIndex + 1);
changesKindStr = changesKindStr.substring(0, dashIndex);
if (SVNNodeKind.FILE.toString().equals(nodeKindStr)) {
nodeKind = SVNNodeKind.FILE;
} else if (SVNNodeKind.DIR.toString().equals(nodeKindStr)) {
nodeKind = SVNNodeKind.DIR;
} else {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid changes line in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
}
FSPathChangeKind changesKind = FSPathChangeKind.fromString(changesKindStr);
if (changesKind == null) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid change kind in rev file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
changeLine = changeLine.substring(delimiterInd + 1);
delimiterInd = changeLine.indexOf(' ');
if (delimiterInd == -1) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid changes line in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
String textModeStr = changeLine.substring(0, delimiterInd);
boolean textModeBool = false;
if (FSPathChange.FLAG_TRUE.equals(textModeStr)) {
textModeBool = true;
} else if (FSPathChange.FLAG_FALSE.equals(textModeStr)) {
textModeBool = false;
} else {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid text-mod flag in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
changeLine = changeLine.substring(delimiterInd + 1);
delimiterInd = changeLine.indexOf(' ');
if (delimiterInd == -1) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid changes line in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
String propModeStr = changeLine.substring(0, delimiterInd);
boolean propModeBool = false;
if (FSPathChange.FLAG_TRUE.equals(propModeStr)) {
propModeBool = true;
} else if (FSPathChange.FLAG_FALSE.equals(propModeStr)) {
propModeBool = false;
} else {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid prop-mod flag in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
String pathStr = changeLine.substring(delimiterInd + 1);
String copyfromPath = null;
long copyfromRevision = SVNRepository.INVALID_REVISION;
if (copyfromLine != null && copyfromLine.length() != 0) {
delimiterInd = copyfromLine.indexOf(' ');
if (delimiterInd == -1) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, "Invalid changes line in rev-file");
SVNErrorManager.error(err, SVNLogType.FSFS);
}
try {
copyfromRevision = Long.parseLong(copyfromLine.substring(0, delimiterInd));
} catch (NumberFormatException nfe) {
SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.FS_CORRUPT, nfe), SVNLogType.FSFS);
}
copyfromPath = copyfromLine.substring(delimiterInd + 1);
}
return new FSPathChange(pathStr, nodeRevID, changesKind, textModeBool, propModeBool, copyfromPath, copyfromRevision, nodeKind);
}
}