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/07/31 22:55:36 UTC
svn commit: r1509025 - in /subversion/trunk/subversion/bindings/javahl:
native/ src/org/apache/subversion/javahl/types/
Author: brane
Date: Wed Jul 31 20:55:36 2013
New Revision: 1509025
URL: http://svn.apache.org/r1509025
Log:
Expose the svn_rangelist operations in JavaHL.
[in subversion/bindings/javahl/src/org/apache/subversion/javahl]
* types/RevisionRangeList.java: New class; a wrapper for a List<RevisionRange>
that adds methods for manipulating revision ranges.
* types/Mergeinfo.java
(Mergeinfo.addRevisions): New overload for RevisionRangeList.
(Mergeinfo.getRevisionRangeList): Like getRevisionRange, but returns a
RevisionRangeList (effectively saving a bit of typing).
[in subversion/bindings/javahl/native]
* RevisionRangeList.h, RevisionRangeList.cpp: Helper for manipulating lists
of revision ranges.
* RevisionRange.h: Include svn_opt.h for svn_opt_revision_range_t.
(RevisionRange::toMergeRange): New method.
* RevisionRange.cpp (get_range_info): New helper function.
Extracts implementation from RevisionRange::toRange.
(RevisionRange::toRange, RevisionRange::toMergeRange):
Implement using get_range_info.
* CreateJ.h, CreateJ.cpp (CreateJ::RevisionRangeList): Remove.
Implementation moved to RevisionRangeList::toList.
(CreateJ::Mergeinfo): Use RevisionRangeList::toList.
Added:
subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp
subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
Modified:
subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp
subversion/trunk/subversion/bindings/javahl/native/CreateJ.h
subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp
subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.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=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CreateJ.cpp Wed Jul 31 20:55:36 2013
@@ -30,6 +30,7 @@
#include "JNIStringHolder.h"
#include "EnumMapper.h"
#include "RevisionRange.h"
+#include "RevisionRangeList.h"
#include "CreateJ.h"
#include "../include/org_apache_subversion_javahl_types_Revision.h"
#include "../include/org_apache_subversion_javahl_CommitItemStateFlags.h"
@@ -1073,58 +1074,6 @@ CreateJ::CommitInfo(const svn_commit_inf
}
jobject
-CreateJ::RevisionRangeList(svn_rangelist_t *ranges)
-{
- JNIEnv *env = JNIUtil::getEnv();
-
- // Create a local frame for our references
- env->PushLocalFrame(LOCAL_FRAME_SIZE);
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
-
- jclass clazz = env->FindClass("java/util/ArrayList");
- 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 add_mid = 0;
- if (add_mid == 0)
- {
- add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
- }
-
- jobject jranges = env->NewObject(clazz, init_mid);
-
- for (int i = 0; i < ranges->nelts; ++i)
- {
- // Convert svn_merge_range_t *'s to Java RevisionRange objects.
- svn_merge_range_t *range =
- APR_ARRAY_IDX(ranges, i, svn_merge_range_t *);
-
- jobject jrange = RevisionRange::makeJRevisionRange(range);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- env->CallBooleanMethod(jranges, add_mid, jrange);
- if (JNIUtil::isJavaExceptionThrown())
- POP_AND_RETURN_NULL;
-
- env->DeleteLocalRef(jrange);
- }
-
- return env->PopLocalFrame(jranges);
-}
-
-jobject
CreateJ::StringSet(const apr_array_header_t *strings)
{
std::vector<jobject> jstrs;
@@ -1370,7 +1319,7 @@ jobject CreateJ::Mergeinfo(svn_mergeinfo
jstring jpath =
JNIUtil::makeJString(static_cast<const char*>(path));
jobject jranges =
- RevisionRangeList(static_cast<svn_rangelist_t*>(val));
+ RevisionRangeList(static_cast<svn_rangelist_t*>(val)).toList();
env->CallVoidMethod(jmergeinfo, addRevisions, jpath, jranges);
Modified: subversion/trunk/subversion/bindings/javahl/native/CreateJ.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/CreateJ.h?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/CreateJ.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/CreateJ.h Wed Jul 31 20:55:36 2013
@@ -82,9 +82,6 @@ class CreateJ
CommitInfo(const svn_commit_info_t *info);
static jobject
- RevisionRangeList(svn_rangelist_t *ranges);
-
- static jobject
StringSet(const apr_array_header_t *strings);
static jobject
Modified: subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRange.cpp Wed Jul 31 20:55:36 2013
@@ -44,60 +44,117 @@ RevisionRange::~RevisionRange()
// explicitly destroyed.
}
-const svn_opt_revision_range_t *RevisionRange::toRange(SVN::Pool &pool) const
+namespace {
+void get_range_info(jobject jrange,
+ svn_opt_revision_t* range_start,
+ svn_opt_revision_t* range_end,
+ svn_boolean_t* range_inheritable)
{
JNIEnv *env = JNIUtil::getEnv();
jclass clazz = env->FindClass(JAVA_PACKAGE"/types/RevisionRange");
if (JNIUtil::isExceptionThrown())
- return NULL;
+ return;
- static jmethodID fmid = 0;
- if (fmid == 0)
+ if (range_start)
{
- fmid = env->GetMethodID(clazz, "getFromRevision",
- "()L"JAVA_PACKAGE"/types/Revision;");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+
+ static jmethodID fmid = 0;
+ if (fmid == 0)
+ {
+ fmid = env->GetMethodID(clazz, "getFromRevision",
+ "()L"JAVA_PACKAGE"/types/Revision;");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject jstartRevision = env->CallObjectMethod(jrange, fmid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ Revision startRevision(jstartRevision);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ *range_start = *startRevision.revision();
+ if (JNIUtil::isExceptionThrown())
+ return;
}
- static jmethodID tmid = 0;
- if (tmid == 0)
+ if (range_end)
{
- tmid = env->GetMethodID(clazz, "getToRevision",
- "()L"JAVA_PACKAGE"/types/Revision;");
- if (JNIUtil::isJavaExceptionThrown())
- return NULL;
+ static jmethodID tmid = 0;
+ if (tmid == 0)
+ {
+ tmid = env->GetMethodID(clazz, "getToRevision",
+ "()L"JAVA_PACKAGE"/types/Revision;");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jobject jendRevision = env->CallObjectMethod(jrange, tmid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ Revision endRevision(jendRevision);
+ if (JNIUtil::isExceptionThrown())
+ return;
+
+ *range_end = *endRevision.revision();
+ if (JNIUtil::isExceptionThrown())
+ return;
}
- jobject jstartRevision = env->CallObjectMethod(m_range, fmid);
- if (JNIUtil::isExceptionThrown())
- return NULL;
+ if (range_inheritable)
+ {
+ static jmethodID imid = 0;
+ if (imid == 0 && range_inheritable)
+ {
+ imid = env->GetMethodID(clazz, "isInheritable", "()Z");
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+ }
+
+ jboolean inheritable = env->CallBooleanMethod(jrange, imid);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ *range_inheritable = inheritable;
+ }
+}
+} // anonymous namespace
- Revision startRevision(jstartRevision);
+svn_merge_range_t* RevisionRange::toMergeRange(SVN::Pool &pool) const
+{
+ svn_opt_revision_t range_start, range_end;
+ svn_boolean_t range_inheritable;
+ get_range_info(m_range, &range_start, &range_end, &range_inheritable);
if (JNIUtil::isExceptionThrown())
return NULL;
- jobject jendRevision = env->CallObjectMethod(m_range, tmid);
- if (JNIUtil::isExceptionThrown())
- return NULL;
+ if (range_start.kind != svn_opt_revision_number
+ || range_end.kind != svn_opt_revision_number)
+ JNIUtil::raiseThrowable("java.lang.InvalidStateException",
+ "Revsision ranges must contain revision numbers");
- Revision endRevision(jendRevision);
- if (JNIUtil::isExceptionThrown())
- return NULL;
+ svn_merge_range_t* range =
+ static_cast<svn_merge_range_t*>
+ (apr_palloc(pool.getPool(), sizeof(*range)));
+
+ range->start = range_start.value.number;
+ range->end = range_end.value.number;
+ range->inheritable = range_inheritable;
+ return range;
+}
+svn_opt_revision_range_t *RevisionRange::toRange(SVN::Pool &pool) const
+{
svn_opt_revision_range_t *range =
- reinterpret_cast<svn_opt_revision_range_t *>
+ static_cast<svn_opt_revision_range_t *>
(apr_palloc(pool.getPool(), sizeof(*range)));
- range->start = *startRevision.revision();
- if (JNIUtil::isExceptionThrown())
- return NULL;
-
- range->end = *endRevision.revision();
+ get_range_info(m_range, &range->start, &range->end, NULL);
if (JNIUtil::isExceptionThrown())
- return NULL;
-
+ range = NULL;
return range;
}
Modified: subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h (original)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRange.h Wed Jul 31 20:55:36 2013
@@ -29,6 +29,7 @@
#include <jni.h>
#include "svn_types.h"
+#include "svn_opt.h"
#include "Pool.h"
@@ -53,7 +54,12 @@ class RevisionRange
/**
* Return an svn_opt_revision_range_t.
*/
- const svn_opt_revision_range_t *toRange(SVN::Pool &pool) const;
+ svn_opt_revision_range_t *toRange(SVN::Pool &pool) const;
+
+ /**
+ * Return an svn_merge_range_t.
+ */
+ svn_merge_range_t* toMergeRange(SVN::Pool &pool) const;
/**
* Make a (single) RevisionRange Java object.
Added: subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp?rev=1509025&view=auto
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp (added)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.cpp Wed Jul 31 20:55:36 2013
@@ -0,0 +1,100 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file RevisionRangeList.cpp
+ * @brief Implementat of the class RevisionRangeList
+ */
+
+#include "Iterator.h"
+#include "RevisionRange.h"
+#include "RevisionRangeList.h"
+
+RevisionRangeList::RevisionRangeList(jobject jrangelist, SVN::Pool &pool)
+ : m_rangelist(NULL)
+{
+ if (!jrangelist)
+ return;
+
+ Iterator iter(jrangelist);
+ if (JNIUtil::isJavaExceptionThrown())
+ return;
+
+ m_rangelist = apr_array_make(pool.getPool(), 0, sizeof(svn_merge_range_t*));
+ while (iter.hasNext())
+ {
+ svn_merge_range_t* range = RevisionRange(iter.next()).toMergeRange(pool);
+ if (JNIUtil::isExceptionThrown())
+ return;
+ APR_ARRAY_PUSH(m_rangelist, svn_merge_range_t*) = range;
+ }
+}
+
+jobject RevisionRangeList::toList() const
+{
+ JNIEnv *env = JNIUtil::getEnv();
+
+ // Create a local frame for our references
+ env->PushLocalFrame(LOCAL_FRAME_SIZE);
+ if (JNIUtil::isJavaExceptionThrown())
+ return NULL;
+
+ jclass clazz = env->FindClass("java/util/ArrayList");
+ 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 add_mid = 0;
+ if (add_mid == 0)
+ {
+ add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+ }
+
+ jobject jranges = env->NewObject(clazz, init_mid);
+
+ for (int i = 0; i < m_rangelist->nelts; ++i)
+ {
+ // Convert svn_merge_range_t *'s to Java RevisionRange objects.
+ svn_merge_range_t *range =
+ APR_ARRAY_IDX(m_rangelist, i, svn_merge_range_t *);
+
+ jobject jrange = RevisionRange::makeJRevisionRange(range);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->CallBooleanMethod(jranges, add_mid, jrange);
+ if (JNIUtil::isJavaExceptionThrown())
+ POP_AND_RETURN_NULL;
+
+ env->DeleteLocalRef(jrange);
+ }
+
+ return env->PopLocalFrame(jranges);
+}
Added: subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h?rev=1509025&view=auto
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h (added)
+++ subversion/trunk/subversion/bindings/javahl/native/RevisionRangeList.h Wed Jul 31 20:55:36 2013
@@ -0,0 +1,67 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file RevisionRangeList.h
+ * @brief Interface of the class RevisionRangeList
+ */
+
+#ifndef REVISION_RANGE_LIST_H
+#define REVISION_RANGE_LIST_H
+
+#include <jni.h>
+#include "svn_mergeinfo.h"
+
+#include "Pool.h"
+
+/**
+ * A wrapper for svn_rangelist_t
+ */
+class RevisionRangeList
+{
+ public:
+ /**
+ * Create a RevisionRangeList object from a Java list of revision ranges.
+ */
+ RevisionRangeList(jobject jrangelist, SVN::Pool &pool);
+
+ /**
+ * Wrap an svn_rangelist_t.
+ */
+ RevisionRangeList(svn_rangelist_t* ranges)
+ : m_rangelist(ranges)
+ {}
+
+ /**
+ * Return an svn_rangelist_t.
+ */
+ const svn_rangelist_t* get() const { return m_rangelist; }
+
+ /**
+ * Make a Java list of reivison ranges.
+ */
+ jobject toList() const;
+
+ private:
+ svn_rangelist_t* m_rangelist;
+};
+
+#endif // REVISION_RANGE_LIST_H
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java?rev=1509025&r1=1509024&r2=1509025&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/Mergeinfo.java Wed Jul 31 20:55:36 2013
@@ -108,6 +108,11 @@ public class Mergeinfo implements java.i
addRevisionRange(mergeSrc, range);
}
+ public void addRevisions(String mergeSrc, RevisionRangeList ranges)
+ {
+ addRevisions(mergeSrc, ranges.getRanges());
+ }
+
/**
* Add a revision range to the merged revisions for a path. If
* the merge source already has associated revision ranges, add
@@ -156,6 +161,14 @@ public class Mergeinfo implements java.i
}
/**
+ * Like {@link #getReivsionRange}, but returns a {@link RevisionRangeList}.
+ */
+ public RevisionRangeList getRevisionRangeList(String mergeSrc)
+ {
+ return new RevisionRangeList(getRevisionRange(mergeSrc));
+ }
+
+ /**
* Parse the <code>svn:mergeinfo</code> property to populate the
* merge source URLs and revision ranges of this instance.
* @param mergeinfo <code>svn:mergeinfo</code> property value.
Added: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java?rev=1509025&view=auto
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java (added)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/RevisionRangeList.java Wed Jul 31 20:55:36 2013
@@ -0,0 +1,91 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ */
+
+package org.apache.subversion.javahl.types;
+
+import org.apache.subversion.javahl.ClientException;
+
+import java.util.List;
+
+/**
+ * Object that describes a revision range list, including operations on it.
+ * Returned from new accessors in {@link Mergeinfo}.
+ * @since 1.9
+ */
+public class RevisionRangeList implements java.io.Serializable
+{
+ // Update the serialVersionUID when there is a incompatible change
+ // made to this class. See any of the following, depending upon
+ // the Java release.
+ private static final long serialVersionUID = 1L;
+
+ private List<RevisionRange> ranges;
+
+ /**
+ * Wrap a list of revision ranges.
+ */
+ public RevisionRangeList(List<RevisionRange> ranges)
+ {
+ this.ranges = ranges;
+ }
+
+ /**
+ * @return The wrapped list of revision ranges.
+ */
+ public List<RevisionRange> getRanges()
+ {
+ return ranges;
+ }
+
+ /**
+ * Remove revisions in <code>eraser</code> from the current object
+ * and return the resulting difference.
+ * @param eraser The list of revisions to remoove.
+ * @param considerInheritance Determines how to account for the
+ * {@link RevisionRange#isInherited} property when comparing
+ * revision ranges for equality.
+ */
+ public /*native*/ RevisionRangeList remove(List<RevisionRange> eraser,
+ boolean considerInheritance)
+ throws ClientException
+ {
+ throw new RuntimeException("Not implemented: RevisionRangeListl.remove");
+ }
+
+ /**
+ * Remove revisions in <code>eraser</code> from the current object
+ * and return the resulting difference.
+ * @param eraser The list of revisions to remoove.
+ * @param considerInheritance Determines how to account for the
+ * {@link RevisionRange#isInherited} property when comparing
+ * revision ranges for equality.
+ */
+ public RevisionRangeList remove(RevisionRangeList eraser,
+ boolean considerInheritance)
+ throws ClientException
+ {
+ return remove(eraser.ranges, considerInheritance);
+ }
+
+ // TODO: More svn_rangelist_t operations
+}