You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/04/28 18:58:31 UTC
svn commit: r1097547 - in /subversion/trunk/subversion/bindings/javahl:
native/ src/org/apache/subversion/javahl/types/
src/org/tigris/subversion/javahl/ tests/org/apache/subversion/javahl/
Author: hwright
Date: Thu Apr 28 16:58:31 2011
New Revision: 1097547
URL: http://svn.apache.org/viewvc?rev=1097547&view=rev
Log:
Fix the JavaHL bindings in light of r1097219.
(Well, "fix" might be a strong word, since this still leaves a few test failures
that need to get mopped up, but at least they are building.)
[ in subversion/bindings/javahl/ ]
* tests/org/apache/subversion/javahl/BasicTests.java
(testTreeConflict): Grab the set of conflicts from the Info object.
* native/CreateJ.h,
native/CreateJ.cpp
(Info): Update for use with an svn_info2_t.
* native/InfoCallback.h,
native/InfoCallback.cpp
(callback ,singleInfo): Use svn_info2_t.
* src/org/apache/subversion/javahl/types/Info.java
(propTime, conflictOld, conflictNew, conflictWrk, prejfile, treeConflict):
Remove.
(getPropTime, getConflictOld, getConflictNew, getConflictWrk,
getPrejfile, getTreeConflict): Remove.
(conflicts, getConflicts): New.
(Info): Update constructor.
* src/org/tigris/subversion/javahl/Info2.java:
Update backward compat wrapper.
* src/org/tigris/subversion/javahl/Info.java:
Same.
Modified:
subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp
subversion/trunk/subversion/bindings/javahl/native/CreateJ.h
subversion/trunk/subversion/bindings/javahl/native/InfoCallback.cpp
subversion/trunk/subversion/bindings/javahl/native/InfoCallback.h
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
Modified: subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp Thu Apr 28 16:58:31 2011
@@ -178,7 +178,7 @@ CreateJ::ConflictVersion(const svn_wc_co
}
jobject
-CreateJ::Info(const char *path, const svn_info_t *info)
+CreateJ::Info(const char *path, const svn_info2_t *info)
{
JNIEnv *env = JNIUtil::getEnv();
@@ -202,12 +202,9 @@ CreateJ::Info(const char *path, const sv
"JJLjava/lang/String;"
"L"JAVA_PACKAGE"/types/Lock;Z"
"L"JAVA_PACKAGE"/types/Info$ScheduleKind;"
- "Ljava/lang/String;JJJ"
- "Ljava/lang/String;Ljava/lang/String;"
- "Ljava/lang/String;Ljava/lang/String;"
- "Ljava/lang/String;Ljava/lang/String;JJ"
- "L"JAVA_PACKAGE"/types/Depth;"
- "L"JAVA_PACKAGE"/ConflictDescriptor;)V");
+ "Ljava/lang/String;JJLjava/lang/String;"
+ "Ljava/lang/String;JJ"
+ "L"JAVA_PACKAGE"/types/Depth;Ljava/util/Set;)V");
if (mid == 0 || JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
}
@@ -216,60 +213,69 @@ CreateJ::Info(const char *path, const sv
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jstring jwcroot = JNIUtil::makeJString(info->wcroot_abspath);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- jstring jurl = JNIUtil::makeJString(info->URL);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jstring jwcroot = NULL;
+ jstring jcopyFromUrl = NULL;
+ jstring jchecksum = NULL;
+ jstring jchangelist = NULL;
+ jobject jconflicts = NULL;
+ jobject jscheduleKind = NULL;
+ jobject jdepth = NULL;
+ jlong jworkingSize = -1;
+ jlong jcopyfrom_rev = -1;
+ jlong jtext_time = -1;
+ if (info->wc_info)
+ {
+ jwcroot = JNIUtil::makeJString(info->wc_info->wcroot_abspath);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jreposRootUrl = JNIUtil::makeJString(info->repos_root_URL);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jcopyFromUrl = JNIUtil::makeJString(info->wc_info->copyfrom_url);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jreportUUID = JNIUtil::makeJString(info->repos_UUID);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jchecksum = JNIUtil::makeJString(info->wc_info->checksum);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jlastChangedAuthor =
- JNIUtil::makeJString(info->last_changed_author);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jchangelist = JNIUtil::makeJString(info->wc_info->changelist);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jobject jlock = CreateJ::Lock(info->lock);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jconflicts = NULL;
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jcopyFromUrl = JNIUtil::makeJString(info->copyfrom_url);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jscheduleKind = EnumMapper::mapScheduleKind(info->wc_info->schedule);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jchecksum = JNIUtil::makeJString(info->checksum);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jdepth = EnumMapper::mapDepth(info->wc_info->depth);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
- jstring jconflictOld = JNIUtil::makeJString(info->conflict_old);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
+ jworkingSize = info->wc_info->working_size;
+ jcopyfrom_rev = info->wc_info->copyfrom_rev;
+ jtext_time = info->wc_info->text_time;
+ }
- jstring jconflictNew = JNIUtil::makeJString(info->conflict_new);
+ jstring jurl = JNIUtil::makeJString(info->URL);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jstring jconflictWrk = JNIUtil::makeJString(info->conflict_wrk);
+ jstring jreposRootUrl = JNIUtil::makeJString(info->repos_root_URL);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jstring jprejfile = JNIUtil::makeJString(info->prejfile);
+ jstring jreportUUID = JNIUtil::makeJString(info->repos_UUID);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jstring jchangelist = JNIUtil::makeJString(info->changelist);
+ jstring jlastChangedAuthor =
+ JNIUtil::makeJString(info->last_changed_author);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jobject jdesc = CreateJ::ConflictDescriptor(info->tree_conflict);
+ jobject jlock = CreateJ::Lock(info->lock);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
@@ -277,30 +283,17 @@ CreateJ::Info(const char *path, const sv
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
- jobject jscheduleKind = EnumMapper::mapScheduleKind(info->schedule);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- jlong jworkingSize = info->working_size == SVN_INFO_SIZE_UNKNOWN
- ? -1 : (jlong) info->working_size;
- jlong jreposSize = info->size == SVN_INFO_SIZE_UNKNOWN
- ? -1 : (jlong) info->size;
-
jobject jinfo2 = env->NewObject(clazz, mid, jpath, jwcroot, jurl,
(jlong) info->rev,
jnodeKind, jreposRootUrl, jreportUUID,
(jlong) info->last_changed_rev,
(jlong) info->last_changed_date,
jlastChangedAuthor, jlock,
- info->has_wc_info ? JNI_TRUE : JNI_FALSE,
+ info->wc_info ? JNI_TRUE : JNI_FALSE,
jscheduleKind, jcopyFromUrl,
- (jlong) info->copyfrom_rev,
- (jlong) info->text_time,
- (jlong) info->prop_time, jchecksum,
- jconflictOld, jconflictNew, jconflictWrk,
- jprejfile, jchangelist,
- jworkingSize, jreposSize,
- EnumMapper::mapDepth(info->depth), jdesc);
+ jcopyfrom_rev, jtext_time, jchecksum,
+ jchangelist, jworkingSize,
+ (jlong) info->size, jdepth, NULL);
return env->PopLocalFrame(jinfo2);
}
Modified: subversion/trunk/subversion/bindings/javahl/native/CreateJ.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CreateJ.h?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CreateJ.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CreateJ.h Thu Apr 28 16:58:31 2011
@@ -46,7 +46,7 @@ class CreateJ
ConflictDescriptor(const svn_wc_conflict_description_t *desc);
static jobject
- Info(const char *path, const svn_info_t *info);
+ Info(const char *path, const svn_info2_t *info);
static jobject
Lock(const svn_lock_t *lock);
Modified: subversion/trunk/subversion/bindings/javahl/native/InfoCallback.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/InfoCallback.cpp?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/InfoCallback.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/InfoCallback.cpp Thu Apr 28 16:58:31 2011
@@ -48,7 +48,7 @@ InfoCallback::~InfoCallback()
svn_error_t *
InfoCallback::callback(void *baton,
const char *path,
- const svn_info_t *info,
+ const svn_info2_t *info,
apr_pool_t *pool)
{
if (baton)
@@ -65,7 +65,7 @@ InfoCallback::callback(void *baton,
*/
svn_error_t *
InfoCallback::singleInfo(const char *path,
- const svn_info_t *info,
+ const svn_info2_t *info,
apr_pool_t *pool)
{
JNIEnv *env = JNIUtil::getEnv();
Modified: subversion/trunk/subversion/bindings/javahl/native/InfoCallback.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/InfoCallback.h?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/InfoCallback.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/InfoCallback.h Thu Apr 28 16:58:31 2011
@@ -44,12 +44,12 @@ class InfoCallback
static svn_error_t *callback(void *baton,
const char *path,
- const svn_info_t *info,
+ const svn_info2_t *info,
apr_pool_t *pool);
protected:
svn_error_t *singleInfo(const char *path,
- const svn_info_t *info,
+ const svn_info2_t *info,
apr_pool_t *pool);
private:
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Info.java Thu Apr 28 16:58:31 2011
@@ -24,6 +24,7 @@
package org.apache.subversion.javahl.types;
import java.util.Date;
+import java.util.Set;
import org.apache.subversion.javahl.ConflictDescriptor;
import org.apache.subversion.javahl.ISVNClient;
@@ -124,38 +125,11 @@ public class Info implements java.io.Ser
private long textTime;
/**
- * the last time the properties of the items were changed in ns
- */
- private long propTime;
-
- /**
* the checksum of the item
*/
private String checksum;
/**
- * if the item is in conflict, the filename of the base version file
- */
- private String conflictOld;
-
- /**
- * if the item is in conflict, the filename of the last repository version
- * file
- */
- private String conflictNew;
-
- /**
- * if the item is in conflict, the filename of the working copy
- * version file
- */
- private String conflictWrk;
-
- /**
- * the property reject file
- */
- private String prejfile;
-
- /**
* The name of the changelist.
*/
private String changelistName;
@@ -183,7 +157,7 @@ public class Info implements java.io.Ser
/**
* Info on any tree conflict of which this node is a victim.
*/
- private ConflictDescriptor treeConflict;
+ private Set<ConflictDescriptor> conflict;
/**
* constructor to build the object by native code. See fields for
@@ -204,12 +178,7 @@ public class Info implements java.io.Ser
* @param copyFromUrl
* @param copyFromRev
* @param textTime
- * @param propTime
* @param checksum
- * @param conflictOld
- * @param conflictNew
- * @param conflictWrk
- * @param prejfile
* @param depth
* @param treeConflict
*/
@@ -217,10 +186,9 @@ public class Info implements java.io.Ser
String reposRootUrl, String reposUUID, long lastChangedRev,
long lastChangedDate, String lastChangedAuthor, Lock lock,
boolean hasWcInfo, ScheduleKind schedule, String copyFromUrl,
- long copyFromRev, long textTime, long propTime, String checksum,
- String conflictOld, String conflictNew, String conflictWrk,
- String prejfile, String changelistName, long workingSize,
- long reposSize, Depth depth, ConflictDescriptor treeConflict)
+ long copyFromRev, long textTime, String checksum,
+ String changelistName, long workingSize, long reposSize, Depth depth,
+ Set<ConflictDescriptor> conflict)
{
this.path = path;
this.wcroot = wcroot;
@@ -238,17 +206,12 @@ public class Info implements java.io.Ser
this.copyFromUrl = copyFromUrl;
this.copyFromRev = copyFromRev;
this.textTime = textTime;
- this.propTime = propTime;
this.checksum = checksum;
- this.conflictOld = conflictOld;
- this.conflictNew = conflictNew;
- this.conflictWrk = conflictWrk;
- this.prejfile = prejfile;
this.changelistName = changelistName;
this.workingSize = workingSize;
this.reposSize = reposSize;
this.depth = depth;
- this.treeConflict = treeConflict;
+ this.conflict = conflict;
}
/**
@@ -386,17 +349,6 @@ public class Info implements java.io.Ser
}
/**
- * return the last time the properties of the items were changed
- */
- public Date getPropTime()
- {
- if (propTime == 0)
- return null;
- else
- return new Date(propTime/1000);
- }
-
- /**
* return the checksum of the item
*/
public String getChecksum()
@@ -405,40 +357,6 @@ public class Info implements java.io.Ser
}
/**
- * return if the item is in conflict, the filename of the base version file
- */
- public String getConflictOld()
- {
- return conflictOld;
- }
-
- /**
- * return if the item is in conflict, the filename of the last repository
- * version file
- */
- public String getConflictNew()
- {
- return conflictNew;
- }
-
- /**
- * return if the item is in conflict, the filename of the working copy
- * version file
- */
- public String getConflictWrk()
- {
- return conflictWrk;
- }
-
- /**
- * return the property reject file
- */
- public String getPrejfile()
- {
- return prejfile;
- }
-
- /**
* @return The name of the changelist.
*/
public String getChangelistName()
@@ -479,9 +397,9 @@ public class Info implements java.io.Ser
/**
* @return the tree conflict of which this node is a victim, or null if none
*/
- public ConflictDescriptor getConflictDescriptor()
+ public Set<ConflictDescriptor> getConflicts()
{
- return treeConflict;
+ return conflict;
}
/**
Modified: subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info.java Thu Apr 28 16:58:31 2011
@@ -152,7 +152,7 @@ public class Info implements java.io.Ser
NodeKind.fromApache(aInfo.getKind()),
aInfo.getLastChangedAuthor(), aInfo.getRev(),
aInfo.getLastChangedRev(), aInfo.getLastChangedDate(),
- aInfo.getTextTime(), aInfo.getPropTime(), aInfo.getCopyFromUrl() != null,
+ aInfo.getTextTime(), null, aInfo.getCopyFromUrl() != null,
aInfo.getSchedule() == org.apache.subversion.javahl.types.Info.ScheduleKind.delete,
checkAbsent(aInfo.getPath()), checkIncomplete(aInfo.getPath()),
aInfo.getCopyFromRev(), aInfo.getCopyFromUrl());
Modified: subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java Thu Apr 28 16:58:31 2011
@@ -24,6 +24,7 @@
package org.tigris.subversion.javahl;
import java.util.Date;
+import java.util.Set;
/**
* this class is returned by SVNClientInterface.info2 and contains information
@@ -247,6 +248,86 @@ public class Info2 implements java.io.Se
this.treeConflict = treeConflict;
}
+ static private String
+ getConflictOld(Set<org.apache.subversion.javahl.ConflictDescriptor>
+ conflicts)
+ {
+ if (conflicts == null)
+ return null;
+
+ for (org.apache.subversion.javahl.ConflictDescriptor conflict : conflicts)
+ {
+ if (conflict.getKind() == org.apache.subversion.javahl.ConflictDescriptor.Kind.text)
+ return conflict.getBasePath();
+ }
+
+ return null;
+ }
+
+ static private String
+ getConflictNew(Set<org.apache.subversion.javahl.ConflictDescriptor>
+ conflicts)
+ {
+ if (conflicts == null)
+ return null;
+
+ for (org.apache.subversion.javahl.ConflictDescriptor conflict : conflicts)
+ {
+ if (conflict.getKind() == org.apache.subversion.javahl.ConflictDescriptor.Kind.text)
+ return conflict.getTheirPath();
+ }
+
+ return null;
+ }
+
+ static private String
+ getConflictWrk(Set<org.apache.subversion.javahl.ConflictDescriptor>
+ conflicts)
+ {
+ if (conflicts == null)
+ return null;
+
+ for (org.apache.subversion.javahl.ConflictDescriptor conflict : conflicts)
+ {
+ if (conflict.getKind() == org.apache.subversion.javahl.ConflictDescriptor.Kind.text)
+ return conflict.getMyPath();
+ }
+
+ return null;
+ }
+
+ static private String
+ getPrejfile(Set<org.apache.subversion.javahl.ConflictDescriptor>
+ conflicts)
+ {
+ if (conflicts == null)
+ return null;
+
+ for (org.apache.subversion.javahl.ConflictDescriptor conflict : conflicts)
+ {
+ if (conflict.getKind() == org.apache.subversion.javahl.ConflictDescriptor.Kind.property)
+ return conflict.getTheirPath();
+ }
+
+ return null;
+ }
+
+ static private ConflictDescriptor
+ getTreeConflict(Set<org.apache.subversion.javahl.ConflictDescriptor>
+ conflicts)
+ {
+ if (conflicts == null)
+ return null;
+
+ for (org.apache.subversion.javahl.ConflictDescriptor conflict : conflicts)
+ {
+ if (conflict.getKind() == org.apache.subversion.javahl.ConflictDescriptor.Kind.tree)
+ return new ConflictDescriptor(conflict);
+ }
+
+ return null;
+ }
+
/**
* A backward-compat constructor.
*/
@@ -264,14 +345,14 @@ public class Info2 implements java.io.Se
aInfo.getCopyFromUrl(), aInfo.getCopyFromRev(),
aInfo.getTextTime() == null ? 0
: aInfo.getTextTime().getTime() * 1000,
- aInfo.getPropTime() == null ? 0
- : aInfo.getPropTime().getTime() * 1000, aInfo.getChecksum(),
- aInfo.getConflictOld(), aInfo.getConflictNew(),
- aInfo.getConflictWrk(), aInfo.getPrejfile(),
+ 0, aInfo.getChecksum(),
+ getConflictOld(aInfo.getConflicts()),
+ getConflictNew(aInfo.getConflicts()),
+ getConflictWrk(aInfo.getConflicts()),
+ getPrejfile(aInfo.getConflicts()),
aInfo.getChangelistName(), aInfo.getWorkingSize(),
aInfo.getReposSize(), Depth.fromADepth(aInfo.getDepth()),
- aInfo.getConflictDescriptor() == null ? null
- : new ConflictDescriptor(aInfo.getConflictDescriptor()));
+ getTreeConflict(aInfo.getConflicts()));
}
/**
Modified: subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=1097547&r1=1097546&r2=1097547&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java (original)
+++ subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java Thu Apr 28 16:58:31 2011
@@ -3061,7 +3061,9 @@ public class BasicTests extends SVNTests
MyInfoCallback callback = new MyInfoCallback();
client.info2(tcTest.getWCPath() + "/A/B/E/alpha", null,
null, Depth.unknown, null, callback);
- ConflictDescriptor conflict = callback.getInfo().getConflictDescriptor();
+ Set<ConflictDescriptor> conflicts = callback.getInfo().getConflicts();
+ assertNotNull("Conflict should not be null", conflicts);
+ ConflictDescriptor conflict = conflicts.iterator().next();
assertNotNull("Conflict should not be null", conflict);