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


Reply via email to