You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2013/11/12 03:23:16 UTC

svn commit: r1540921 - in /subversion/trunk/subversion/bindings/javahl: native/ src/org/apache/subversion/javahl/ src/org/apache/subversion/javahl/util/ tests/org/apache/subversion/javahl/

Author: brane
Date: Tue Nov 12 02:23:16 2013
New Revision: 1540921

URL: http://svn.apache.org/r1540921
Log:
Expose a utility to resolve relative extrnalls URLs in JavaHL.

[in subversion/bindings/javahl]

* src/org/apache/subversion/javahl/SVNUtil.java
  (SVNUtil.resolveExternalsUrl): New static method.
* src/org/apache/subversion/javahl/util/PropLib.java
  (PropLib.resolveExternalsUrl): New native method.
  (PropLib.canonicalizeSvnProperty, PropLib.unparseExternals):
   Fix references in docstrings.

* native/ExternalItem.hpp, native/ExternalItem.cpp
  (ExternalItem::get_external_item): New public method.
* native/org_apache_subversion_javahl_util_PropLib.cpp
  (Java_org_apache_subversion_javahl_util_PropLib_resolveExternalsUrl):
   New; implementation of PropLib.resolveExternalsUrl.

* tests/org/apache/subversion/javahl/UtilTests.java
  (UtilTests.testResolveExternalsUrl): New testcase.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp
    subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp
    subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
    subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
    subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
    subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java

Modified: subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp Tue Nov 12 02:23:16 2013
@@ -21,8 +21,9 @@
  * @endcopyright
  */
 
+#include "jniwrapper/jni_stack.hpp"
+
 #include "ExternalItem.hpp"
-#include "JNIUtil.h"
 #include "Revision.h"
 
 namespace JavaHL {
@@ -92,6 +93,22 @@ ExternalItem::ExternalItem(::Java::Env e
     m_peg_revision(*peg_revision)
 {}
 
+svn_wc_external_item2_t*
+ExternalItem::get_external_item(SVN::Pool& svnpool) const
+{
+  svn_wc_external_item2_t* item;
+  apr_pool_t* const pool = svnpool.getPool();
+  SVN_JAVAHL_CHECK(svn_wc_external_item2_create(&item, pool));
+
+  item->target_dir = apr_pstrdup(
+      pool, Java::String::Contents(m_target_dir).c_str());
+  item->url = apr_pstrdup(
+      pool, Java::String::Contents(m_url).c_str());
+  item->revision = m_revision;
+  item->peg_revision = m_peg_revision;
+  return item;
+}
+
 } // namespace JavaHL
 
 

Modified: subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp Tue Nov 12 02:23:16 2013
@@ -27,6 +27,9 @@
 #include <string>
 
 #include "svn_opt.h"
+#include "svn_wc.h"
+
+#include "Pool.h"
 
 #include "jniwrapper/jni_object.hpp"
 #include "jniwrapper/jni_string.hpp"
@@ -90,6 +93,12 @@ public:
       return &m_peg_revision;
     }
 
+  /**
+   * Returns an @c svn_wc_external_item2_t allocated from @a pool and
+   * filled in with this object's values.
+   */
+  svn_wc_external_item2_t* get_external_item(SVN::Pool& pool) const;
+
 private:
   static const char* const m_class_name;
 

Modified: subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp Tue Nov 12 02:23:16 2013
@@ -42,6 +42,7 @@
 #include "svn_time.h"
 #include "svn_wc.h"
 
+#include "private/svn_wc_private.h"
 #include "svn_private_config.h"
 
 
@@ -255,6 +256,7 @@ Java_org_apache_subversion_javahl_util_P
   return NULL;
 }
 
+
 JNIEXPORT jbyteArray JNICALL
 Java_org_apache_subversion_javahl_util_PropLib_unparseExternals(
     JNIEnv* jenv, jobject jthis,
@@ -346,3 +348,34 @@ Java_org_apache_subversion_javahl_util_P
   SVN_JAVAHL_JNI_CATCH;
   return NULL;
 }
+
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_resolveExternalsUrl(
+    JNIEnv* jenv, jobject jthis,
+    jobject jitem, jstring jrepos_root_url, jstring jparent_dir_url)
+{
+  SVN_JAVAHL_JNI_TRY(PropLib, unparseExternals)
+    {
+      const Java::Env env(jenv);
+
+      const Java::String repos_root_url(env, jrepos_root_url);
+      const Java::String parent_dir_url(env, jparent_dir_url);
+      const JavaHL::ExternalItem item(env, jitem);
+
+      // Using a "global" request pool since we don't keep a context
+      // with its own pool around for these functions.
+      SVN::Pool pool;
+
+      const char* resolved_url;
+      SVN_JAVAHL_CHECK(svn_wc__resolve_relative_external_url(
+                           &resolved_url,
+                           item.get_external_item(pool),
+                           Java::String::Contents(repos_root_url).c_str(),
+                           Java::String::Contents(parent_dir_url).c_str(),
+                           pool.getPool(), pool.getPool()));
+      return Java::String(env, resolved_url).get();
+    }
+  SVN_JAVAHL_JNI_CATCH;
+  return NULL;
+}

Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java Tue Nov 12 02:23:16 2013
@@ -376,4 +376,41 @@ public class SVNUtil
     {
         return new PropLib().unparseExternals(items, parentDirectory, true);
     }
+
+    /**
+     * If the URL in <code>external</code> is relative, resolve it to
+     * an absolute URL, using <code>reposRootUrl</code> and
+     * <code>parentDirUrl</code> to provide contest.
+     *<p>
+     * Regardless if the URL is absolute or not, if there are no
+     * errors, the returned URL will be canonicalized.
+     *<p>
+     * The following relative URL formats are supported:
+     * <dl>
+     *  <dt><code>../</code></dt>
+     *  <dd>relative to the parent directory of the external</dd>
+     *  <dt><code>^/</code></dt>
+     *  <dd>relative to the repository root</dd>
+     *  <dt><code>//</code></dt>
+     *  <dd>relative to the scheme</dd>
+     *  <dt><code>/</code></dt>
+     *  <dd>relative to the server's hostname</dd>
+     *<p>
+     * The <code>../<code> and ^/ relative URLs may use <code>..<code>
+     * to remove path elements up to the server root.
+     *<p>
+     * The external URL should not be canonicalized before calling
+     * this function, as otherwise the scheme relative URL
+     * '<code>//host/some/path</code>' would have been canonicalized
+     * to '<code>/host/some/path</code>' and we would not be able to
+     * match on the leading '<code>//</code>'.
+    */
+    public static String resolveExternalsUrl(ExternalItem external,
+                                             String reposRootUrl,
+                                             String parentDirUrl)
+        throws ClientException
+    {
+        return new PropLib()
+            .resolveExternalsUrl(external, reposRootUrl, parentDirUrl);
+    }
 }

Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java Tue Nov 12 02:23:16 2013
@@ -48,7 +48,7 @@ public class PropLib
         NativeResources.loadNativeLibrary();
     }
 
-    /** @see SVNUtil.canonicalizeSvnProperty */
+    /** @see SVNUtil#canonicalizeSvnProperty */
     public byte[] canonicalizeNodeProperty(String name, byte[] value,
                                            String path, NodeKind kind,
                                            String mimeType,
@@ -75,9 +75,16 @@ public class PropLib
                                                     boolean canonicalizeUrl)
         throws ClientException;
 
-    /** @see SVNUtil.unparseExternals */
+    /** @see SVNUtil#unparseExternals */
     public native byte[] unparseExternals(List<ExternalItem> items,
                                           String parentDirectory,
                                           boolean old_format)
         throws SubversionException;
+
+
+    /** @see SVNUtil#resolveExternalsUrl */
+    public native String resolveExternalsUrl(ExternalItem external,
+                                             String reposRootUrl,
+                                             String parentDirUrl)
+        throws ClientException;
 }

Modified: subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java (original)
+++ subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java Tue Nov 12 02:23:16 2013
@@ -359,4 +359,32 @@ public class UtilTests extends SVNTests
         }
         assertTrue(caught_exception);
     }
+
+    public void testResolveExternalsUrl() throws Throwable
+    {
+        assertEquals("http://a/b/c",
+                     SVNUtil.resolveExternalsUrl(
+                         new ExternalItem("x", "http://a/b/c/", null, null),
+                         "http://a", "http://a/b"));
+
+        assertEquals("http://a/b/c",
+                     SVNUtil.resolveExternalsUrl(
+                         new ExternalItem("x", "^/b/c", null, null),
+                         "http://a", "http://a/b"));
+
+        assertEquals("http://a/b/c",
+                     SVNUtil.resolveExternalsUrl(
+                         new ExternalItem("x", "../b/c", null, null),
+                         "http://a", "http://a/b"));
+
+        assertEquals("http://a/b/c",
+                     SVNUtil.resolveExternalsUrl(
+                         new ExternalItem("x", "/b/c", null, null),
+                         "http://a", "http://a/b"));
+
+        assertEquals("http://a/b/c",
+                     SVNUtil.resolveExternalsUrl(
+                         new ExternalItem("x", "//a/b/c", null, null),
+                         "http://a", "http://a/b"));
+    }
 }