/*
* ====================================================================
* 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.Writer;
import java.util.HashMap;
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.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.internal.wc.SVNAdminUtil;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.internal.wc.SVNTreeConflictUtil;
import org.tmatesoft.svn.core.internal.util.SVNHashMap;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNTreeConflictDescription;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class SVNAdminArea16 extends SVNAdminArea15 {
public static final int WC_FORMAT = SVNAdminArea16Factory.WC_FORMAT;
public SVNAdminArea16(File dir) {
super(dir);
}
public boolean hasTreeConflict(String victimName) throws SVNException {
return getTreeConflict(victimName) != null;
}
public SVNTreeConflictDescription getTreeConflict(String victimName) throws SVNException {
SVNEntry dirEntry = getEntry(getThisDirName(), false);
if (dirEntry == null) {
return null;
}
Map conflicts = dirEntry.getTreeConflicts();
return (SVNTreeConflictDescription) conflicts.get(getFile(victimName));
}
public void addTreeConflict(SVNTreeConflictDescription conflict) throws SVNException {
SVNTreeConflictDescription existingDescription = getTreeConflict(conflict.getPath().getName());
if (existingDescription != null) {
SVNErrorMessage error = SVNErrorMessage.create(SVNErrorCode.WC_CORRUPT, "Attempt to add tree conflict that already exists at ''{0}''",
conflict.getPath());
SVNErrorManager.error(error, SVNLogType.WC);
}
Map conflicts = new SVNHashMap();
conflicts.put(conflict.getPath(), conflict);
String conflictData = SVNTreeConflictUtil.getTreeConflictData(conflicts);
SVNProperties command = new SVNProperties();
command.put(SVNLog.NAME_ATTR, getThisDirName());
command.put(SVNLog.DATA_ATTR, conflictData);
SVNLog log = getLog();
log.addCommand(SVNLog.ADD_TREE_CONFLICT, command, false);
log.save();
runLogs();
}
public SVNTreeConflictDescription deleteTreeConflict(String victimName) throws SVNException {
SVNEntry dirEntry = getEntry(getThisDirName(), false);
Map conflicts = dirEntry.getTreeConflicts();
File victimPath = getFile(victimName);
if (conflicts.containsKey(victimPath)) {
SVNTreeConflictDescription conflict = (SVNTreeConflictDescription) conflicts.remove(victimPath);
String conflictData = SVNTreeConflictUtil.getTreeConflictData(conflicts);
Map attributes = new SVNHashMap();
attributes.put(SVNProperty.TREE_CONFLICT_DATA, conflictData);
modifyEntry(getThisDirName(), attributes, true, false);
return conflict;
}
return null;
}
public void setFileExternalLocation(String name, SVNURL url, SVNRevision pegRevision, SVNRevision revision, SVNURL reposRootURL) throws SVNException {
Map attributes = new HashMap();
if (url != null) {
String strURL = url.toDecodedString();
String reposRootStrURL = reposRootURL.toDecodedString();
String path = strURL.substring(reposRootStrURL.length());
if (!path.startsWith("/")) {
path = "/" + path;
}
attributes.put(SVNProperty.FILE_EXTERNAL_PEG_REVISION, pegRevision);
attributes.put(SVNProperty.FILE_EXTERNAL_REVISION, revision);
attributes.put(SVNProperty.FILE_EXTERNAL_PATH, path);
} else {
attributes.put(SVNProperty.FILE_EXTERNAL_PEG_REVISION, SVNRevision.UNDEFINED);
attributes.put(SVNProperty.FILE_EXTERNAL_REVISION, SVNRevision.UNDEFINED);
attributes.put(SVNProperty.FILE_EXTERNAL_PATH, null);
}
modifyEntry(name, attributes, true, false);
}
public int getFormatVersion() {
return SVNAdminArea16Factory.WC_FORMAT;
}
public void postUpgradeFormat(int format) throws SVNException {
super.postUpgradeFormat(format);
try {
SVNFileUtil.deleteFile(getAdminFile("format"));
} catch (SVNException svne) {
}
}
protected void createFormatFile(File formatFile, boolean createMyself) throws SVNException {
//does nothing since the working copy format v10
}
protected boolean readExtraOptions(BufferedReader reader, SVNEntry entry) throws SVNException, IOException {
if (super.readExtraOptions(reader, entry)) {
return true;
}
String line = reader.readLine();
if (isEntryFinished(line)) {
return true;
}
String treeConflictData = parseString(line);
if (treeConflictData != null) {
entry.setTreeConflictData(treeConflictData);
}
line = reader.readLine();
if (isEntryFinished(line)) {
return true;
}
String fileExternalData = parseString(line);
if (fileExternalData != null) {
SVNAdminUtil.unserializeExternalFileData(entry, fileExternalData);
}
return false;
}
protected int writeExtraOptions(Writer writer, String entryName, SVNEntry entry, int emptyFields) throws SVNException, IOException {
emptyFields = super.writeExtraOptions(writer, entryName, entry, emptyFields);
String treeConflictData = entry.getTreeConflictData();
if (writeString(writer, treeConflictData, emptyFields)) {
emptyFields = 0;
} else {
++emptyFields;
}
String serializedFileExternalData = SVNAdminUtil.serializeExternalFileData(entry);
if (writeString(writer, serializedFileExternalData, emptyFields)) {
emptyFields = 0;
} else {
++emptyFields;
}
return emptyFields;
}
protected boolean isEntryPropertyApplicable(String propName) {
return propName != null;
}
}