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"); + } }