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/06/28 21:35:17 UTC
svn commit: r1497898 - in
/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote:
RemoteSession.java UpdateReporter.java
Author: brane
Date: Fri Jun 28 19:35:17 2013
New Revision: 1497898
URL: http://svn.apache.org/r1497898
Log:
Extend the JavaHL reporter infrastructure.
[in subversion/bindings/javahl/src/org/apache/subversion/javahl]
* RemoteSession.java
(RemoteSession.reporterReference): New (weak) reference to active reporter.
(RemoteSession.disposeReporter): Dispose callback for reporter instances.
(RemoteSession.disposeEditor): Make argument more abstract and update docs.
(RemoteSession.dispose): Deactivate any open reporters.
(RemoteSession.check_inactive): Helper for editor/reporter validity check.
(RemoteSession.getCommitEditor): Use check_inactive to validate state.
* remote/UpdateReporter.java (UpdateReporter.nativeDispose): New.
(UpdateReporter.dispose): Notify session and call nativeDispose.
Modified:
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/UpdateReporter.java
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java?rev=1497898&r1=1497897&r2=1497898&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/RemoteSession.java Fri Jun 28 19:35:17 2013
@@ -57,6 +57,17 @@ public class RemoteSession extends JNIOb
}
editorReference = null;
}
+ if (reporterReference != null)
+ {
+ // Deactivate the open reporter
+ ISVNReporter rp = reporterReference.get();
+ if (rp != null)
+ {
+ rp.dispose();
+ reporterReference.clear();
+ }
+ reporterReference = null;
+ }
nativeDispose();
}
@@ -114,13 +125,10 @@ public class RemoteSession extends JNIOb
boolean keepLocks)
throws ClientException
{
- if (editorReference != null && editorReference.get() != null)
- throw new IllegalStateException("An editor is already active");
-
+ check_inactive(editorReference, reporterReference);
ISVNEditor ed =
CommitEditor.createInstance(this, revisionProperties,
commitCallback, lockTokens, keepLocks);
-
if (editorReference != null)
editorReference.clear();
editorReference = new WeakReference<ISVNEditor>(ed);
@@ -235,18 +243,19 @@ public class RemoteSession extends JNIOb
private class RemoteSessionContext extends OperationContext {}
/*
- * A reference to the current open editor. We need this in order
+ * A reference to the current active editor. We need this in order
* to dispose/abort the editor when the session is disposed. And
- * furthermore, there can be only one editor active at any time.
+ * furthermore, there can be only one editor or reporter active at
+ * any time.
*/
private WeakReference<ISVNEditor> editorReference;
/*
- * The commit editor callse this when disposed to clear the
+ * The commit editor calls this when disposed to clear the
* reference. Note that this function will be called during our
* dispose, so make sure they don't step on each others' toes.
*/
- void disposeEditor(CommitEditor editor)
+ void disposeEditor(ISVNEditor editor)
{
if (editorReference == null)
return;
@@ -259,6 +268,31 @@ public class RemoteSession extends JNIOb
}
/*
+ * A reference to the current active reporter. We need this in
+ * order to dispose/abort the report when the session is
+ * disposed. And furthermore, there can be only one reporter or
+ * editor active at any time.
+ */
+ private WeakReference<ISVNReporter> reporterReference;
+
+ /*
+ * The update reporter calls this when disposed to clear the
+ * reference. Note that this function will be called during our
+ * dispose, so make sure they don't step on each others' toes.
+ */
+ void disposeReporter(ISVNReporter reporter)
+ {
+ if (reporterReference == null)
+ return;
+ ISVNReporter rp = reporterReference.get();
+ if (rp == null)
+ return;
+ if (rp != reporter)
+ throw new IllegalStateException("Disposing unknown reporter");
+ reporterReference.clear();
+ }
+
+ /*
* Private helper methods.
*/
private final static void maybe_clear(Map clearable)
@@ -270,4 +304,14 @@ public class RemoteSession extends JNIOb
// ignored
}
}
+
+ private final static
+ void check_inactive(WeakReference<ISVNEditor> editorReference,
+ WeakReference<ISVNReporter> reporterReference)
+ {
+ if (editorReference != null && editorReference.get() != null)
+ throw new IllegalStateException("An editor is already active");
+ if (reporterReference != null && reporterReference.get() != null)
+ throw new IllegalStateException("A reporter is already active");
+ }
}
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/UpdateReporter.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/UpdateReporter.java?rev=1497898&r1=1497897&r2=1497898&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/UpdateReporter.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/UpdateReporter.java Fri Jun 28 19:35:17 2013
@@ -36,7 +36,11 @@ import org.apache.subversion.javahl.Clie
*/
public class UpdateReporter extends JNIObject implements ISVNReporter
{
- public void dispose() {/* TODO: */}
+ public void dispose()
+ {
+ session.disposeReporter(this);
+ nativeDispose();
+ }
public void setPath(String path,
long revision,
@@ -74,6 +78,11 @@ public class UpdateReporter extends JNIO
throw new RuntimeException("Not implemented: abortReport");
}
+ /*
+ * Wrapped private native implementation declarations.
+ */
+ private /*TODO:native*/ void nativeDispose() {;}
+
/**
* This constructor is called from the factory to get an instance.
*/
@@ -86,4 +95,3 @@ public class UpdateReporter extends JNIO
/** Stores a reference to the session that created this reporter. */
protected RemoteSession session;
}
-