Author: hwright
Date: Tue Sep 7 19:32:23 2010
New Revision: 993493
URL: http://svn.apache.org/viewvc?rev=993493&view=rev
Log:
On the javahl-ra branch:
Implement the getLocks() ra API in JavaHL.
[ in subversion/bindings/javahl/ ]
* tests/org/apache/subversion/javahl/SVNRATests.java
(setUp): Create a working copy, because it will be useful for out tests.
(testGetLocks): New.
* native/CreateJ.cpp
(LockMap): New.
* native/SVNReposAccess.h
(getLocks): New.
* native/SVNReposAccess.cpp
(getLocks): New.
* native/org_apache_subversion_javahl_SVNReposAccess.cpp
(Java_org_apache_subversion_javahl_SVNReposAccess_getLocks): New.
* native/CreateJ.h
(LockMap): New.
* src/org/apache/subversion/javahl/ISVNReposAccess.java
(getLocks): New.
* src/org/apache/subversion/javahl/SVNReposAccess.java
(getLocks): New.
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.cpp
subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.h
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.cpp
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.h
subversion/branches/javahl-ra/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNReposAccess.cpp
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReposAccess.java
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNReposAccess.java
subversion/branches/javahl-ra/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRATests.java
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.cpp
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.cpp?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
--- subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.cpp
(original)
+++ subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.cpp
Tue Sep 7 19:32:23 2010
@@ -350,6 +350,72 @@ CreateJ::Lock(const svn_lock_t *lock)
}
jobject
+CreateJ::LockMap(const apr_hash_t *locks, apr_pool_t *pool)
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ if (locks == NULL)
+ return NULL;
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ jclass clazz = env->FindClass("java/util/HashMap");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ static jmethodID init_mid = 0;
+ if (init_mid == 0)
+ {
+ init_mid = env->GetMethodID(clazz, "<init>", "()V");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ static jmethodID put_mid = 0;
+ if (put_mid == 0)
+ {
+ put_mid = env->GetMethodID(clazz, "put",
+ "(Ljava/lang/Object;Ljava/lang/Object;)"
+ "Ljava/lang/Object;");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ jobject map = env->NewObject(clazz, init_mid);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ apr_hash_index_t *hi;
+ int i = 0;
+ for (hi = apr_hash_first(pool, (apr_hash_t *) locks); hi;
+ hi = apr_hash_next(hi), ++i)
+ {
+ const char *key = (const char *) svn__apr_hash_index_key(hi);
+ const svn_lock_t *lock = (const svn_lock_t *)
svn__apr_hash_index_val(hi);
+
+ jstring jpath = JNIUtil::makeJString(key);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ jobject jlock = Lock(lock);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->CallObjectMethod(map, put_mid, jpath, jlock);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->DeleteLocalRef(jpath);
+ env->DeleteLocalRef(jlock);
+ }
+
+ return env->PopLocalFrame(map);
+}
+
+jobject
CreateJ::ChangedPath(const char *path, svn_log_changed_path2_t *log_item)
{
JNIEnv *env = JNIUtil::getEnv();
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.h
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.h?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
--- subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.h
(original)
+++ subversion/branches/javahl-ra/subversion/bindings/javahl/native/CreateJ.h
Tue Sep 7 19:32:23 2010
@@ -52,6 +52,9 @@ class CreateJ
Lock(const svn_lock_t *lock);
static jobject
+ LockMap(const apr_hash_t *locks, apr_pool_t *pool);
+
+ static jobject
ChangedPath(const char *path, svn_log_changed_path2_t *log_item);
static jobject
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.cpp
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.cpp?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
---
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.cpp
(original)
+++
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.cpp
Tue Sep 7 19:32:23 2010
@@ -27,6 +27,7 @@
#include "SVNReposAccess.h"
#include "JNIUtil.h"
#include "JNICriticalSection.h"
+#include "CreateJ.h"
#include "svn_ra.h"
#include "svn_private_config.h"
@@ -76,3 +77,16 @@ SVNReposAccess::getDatedRev(apr_time_t t
return rev;
}
+
+jobject
+SVNReposAccess::getLocks(const char *path, svn_depth_t depth)
+{
+ SVN::Pool requestPool;
+ apr_hash_t *locks;
+
+ SVN_JNI_ERR(svn_ra_get_locks2(m_ra_session, &locks, path, depth,
+ requestPool.pool()),
+ NULL);
+
+ return CreateJ::LockMap(locks, requestPool.pool());
+}
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.h
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.h?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
---
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.h
(original)
+++
subversion/branches/javahl-ra/subversion/bindings/javahl/native/SVNReposAccess.h
Tue Sep 7 19:32:23 2010
@@ -35,6 +35,7 @@ class SVNReposAccess : public SVNBase
{
public:
svn_revnum_t getDatedRev(apr_time_t time);
+ jobject getLocks(const char *path, svn_depth_t depth);
SVNReposAccess(const char *repos_url);
virtual ~SVNReposAccess();
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNReposAccess.cpp
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNReposAccess.cpp?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
---
subversion/branches/javahl-ra/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNReposAccess.cpp
(original)
+++
subversion/branches/javahl-ra/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNReposAccess.cpp
Tue Sep 7 19:32:23 2010
@@ -27,6 +27,8 @@
#include "JNIUtil.h"
#include "JNIStackElement.h"
#include "JNIStringHolder.h"
+#include "EnumMapper.h"
+
#include "svn_version.h"
#include "svn_private_config.h"
#include "version.h"
@@ -90,3 +92,22 @@ Java_org_apache_subversion_javahl_SVNRep
return ra->getDatedRev(date);
}
+
+JNIEXPORT jobject JNICALL
+Java_org_apache_subversion_javahl_SVNReposAccess_getLocks
+(JNIEnv *env, jobject jthis, jstring jpath, jobject jdepth)
+{
+ JNIEntry(SVNReposAccess, getLocks);
+ SVNReposAccess *ra = SVNReposAccess::getCppObject(jthis);
+ if (ra == NULL)
+ {
+ JNIUtil::throwError("bad C++ this");
+ return NULL;
+ }
+
+ JNIStringHolder path(jpath);
+ if (JNIUtil::isExceptionThrown())
+ return NULL;
+
+ return ra->getLocks(path, EnumMapper::toDepth(jdepth));
+}
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReposAccess.java
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReposAccess.java?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
---
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReposAccess.java
(original)
+++
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNReposAccess.java
Tue Sep 7 19:32:23 2010
@@ -24,6 +24,7 @@
package org.apache.subversion.javahl;
import java.util.Date;
+import java.util.Map;
/**
* This interface is an interface to interact with a remote Subversion
@@ -47,4 +48,6 @@ public interface ISVNReposAccess
* @return The latest revision at date
*/
public long getDatedRevision(Date date);
+
+ public Map<String, Lock> getLocks(String path, Depth depth);
}
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNReposAccess.java
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNReposAccess.java?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
---
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNReposAccess.java
(original)
+++
subversion/branches/javahl-ra/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNReposAccess.java
Tue Sep 7 19:32:23 2010
@@ -25,6 +25,7 @@ package org.apache.subversion.javahl;
import java.net.URI;
import java.util.Date;
+import java.util.Map;
/**
* This class allows direct access to remote repositories through a
@@ -97,4 +98,6 @@ public class SVNReposAccess implements I
}
public native long getDatedRevision(Date date);
+
+ public native Map<String, Lock> getLocks(String path, Depth depth);
}
Modified:
subversion/branches/javahl-ra/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRATests.java
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRATests.java?rev=993493&r1=993492&r2=993493&view=diff
==============================================================================
---
subversion/branches/javahl-ra/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRATests.java
(original)
+++
subversion/branches/javahl-ra/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRATests.java
Tue Sep 7 19:32:23 2010
@@ -26,6 +26,9 @@ import org.apache.subversion.javahl.call
import java.net.URI;
import java.util.Date;
+import java.util.Set;
+import java.util.Map;
+import java.util.HashSet;
import java.io.IOException;
/**
@@ -52,7 +55,7 @@ public class SVNRATests extends SVNTests
{
super.setUp();
- thisTest = new OneTest(false);
+ thisTest = new OneTest();
ra = new SVNReposAccess(thisTest.getUrl());
}
@@ -72,4 +75,21 @@ public class SVNRATests extends SVNTests
long revision = ra.getDatedRevision(new Date());
assertEquals(revision, 1);
}
+
+ public void testGetLocks()
+ throws SubversionException, IOException
+ {
+ Set<String> iotaPathSet = new HashSet<String>(1);
+ String iotaPath = thisTest.getWCPath() + "/iota";
+ iotaPathSet.add(iotaPath);
+
+ client.lock(iotaPathSet, "foo", false);
+
+ Map<String, Lock> locks = ra.getLocks("iota", Depth.infinity);
+
+ assertEquals(locks.size(), 1);
+ Lock lock = locks.get("/iota");
+ assertNotNull(lock);
+ assertEquals(lock.getOwner(), "jrandom");
+ }
}