[[[
JavaHL: New Java classes exposing the Ra layer to java
[ in subversion/bindings/javahl/src/org/tigris/subversion/javahl/ ]
* JNIObject.java
[ in subversion/bindings/javahl/src/org/tigris/subversion/javahl/ra ]
* ISVNDirectory.java, ISVNEditor.java, ISVNFile.java, ISVNNode.java,
ISVNRa.java, ISVNRaConfig.java, RaContext.java,
SVNCommitEditorBuilder.java, SVNDirectory.java, SVNEditor.java,
SVNFile.java, SVNRa.java, SVNRaConfigDefault.java, SVNRaFactory.java
]]]
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java
===================================================================
--- subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java
(revision 0)
+++ subversion/bindings/javahl/src/org/apache/subversion/javahl/JNIObject.java
(working copy)
@@ -0,0 +1,16 @@
+package org.apache.subversion.javahl;
+
+public abstract class JNIObject
+{
+ /**
+ * slot for the address of the native peer.
+ * The JNI code controls this field. If it is set to 0 then
+ * underlying JNI object has been freed
+ */
+ protected long cppAddr;
+
+ protected JNIObject(long cppAddr)
+ {
+ this.cppAddr = cppAddr;
+ }
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNRa.java
===================================================================
--- subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNRa.java
(revision 0)
+++ subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNRa.java
(working copy)
@@ -0,0 +1,57 @@
+package org.apache.subversion.javahl.ra;
+
+import java.util.Map;
+
+import org.apache.subversion.javahl.callback.CommitCallback;
+import org.apache.subversion.javahl.callback.ProgressCallback;
+
+/**
+ * Represent an instance of RA session
+ */
+public interface ISVNRa
+{
+ /**
+ * Release native resources use by this Ra session.
+ * Once called this object is no longer usable
+ */
+ public void dispose();
+
+ /**
+ * @return repository root path
+ */
+ public String getRoot();
+
+ /**
+ * @return latest revision
+ */
+ public long getLatestRevision();
+
+ /**
+ * @return repository UUID
+ */
+ public String getUUID();
+
+ /**
+ * @return parent url for this session
+ */
+ public String getUrl();
+
+ /**
+ * Set parent url for this session
+ * @param url
+ */
+ public void reparent(String url);
+
+ /**
+ * Retrieve commit editor the parent url
+ * @param revProps
+ * @param commitCallback
+ * @param lockTokens
+ * @param keepLocks
+ * @return
+ */
+ public ISVNEditor getCommitEditor(Map<String, String> revProps,
CommitCallback commitCallback,
+ Map<String, String> lockTokens, boolean keepLocks);
+
+ public void setProgressCallback(ProgressCallback listener);
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNDirectory.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNDirectory.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNDirectory.java
(working copy)
@@ -0,0 +1,19 @@
+package org.apache.subversion.javahl.ra;
+
+public interface ISVNDirectory extends ISVNNode
+{
+ public void deleteEntry(String path, long baseRevision);
+
+ public ISVNDirectory addDirectory(String path, String parentPath, long
copyFromRevision);
+ public ISVNDirectory addDirectory(String path);
+
+ public ISVNDirectory openDirectory(String path, long baseRevision);
+ //public void absentDirectory(String path, long baseRevision);
+
+ public ISVNFile addFile(String path, String parentPath, long
copyFromRevision);
+ public ISVNFile addFile(String path);
+ public ISVNFile openFile(String path, long baseRevision);
+ //public void absentFile(String path, long baseRevision);
+
+ public void close();
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNFile.java
===================================================================
--- subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNFile.java
(revision 0)
+++ subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNFile.java
(working copy)
@@ -0,0 +1,29 @@
+package org.apache.subversion.javahl.ra;
+
+import java.io.InputStream;
+
+import org.apache.subversion.javahl.JNIObject;
+
+
+public class SVNFile extends JNIObject implements ISVNFile
+{
+ public SVNFile(long cppAddr)
+ {
+ super(cppAddr);
+ }
+
+ @Override
+ public native void sendStream(InputStream targetStream, String
baseMd5CheckSum);
+
+ @Override
+ public native void sendDeltaStream(InputStream sourceStream,
InputStream targetStream, String baseMd5CheckSum);
+
+ @Override
+ public native void close(String md5HexChecksum);
+
+ @Override
+ public native void changeProperty(String propertyName, byte[]
propertyValue);
+
+ @Override
+ public native void finalize() throws Throwable;
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/RaContext.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/RaContext.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/RaContext.java
(working copy)
@@ -0,0 +1,8 @@
+package org.apache.subversion.javahl.ra;
+
+import org.apache.subversion.javahl.CommonContext;
+
+public class RaContext extends CommonContext
+{
+
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNEditor.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNEditor.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNEditor.java
(working copy)
@@ -0,0 +1,23 @@
+package org.apache.subversion.javahl.ra;
+
+import org.apache.subversion.javahl.JNIObject;
+
+public class SVNEditor extends JNIObject implements ISVNEditor
+{
+ protected SVNEditor(long cppAddr)
+ {
+ super(cppAddr);
+ }
+
+ @Override
+ public native ISVNDirectory openRoot(long baseRevision);
+
+ @Override
+ public native void closeEdit();
+
+ @Override
+ public native void abortEdit();
+
+ @Override
+ public native void finalize() throws Throwable;
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNFile.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNFile.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNFile.java
(working copy)
@@ -0,0 +1,22 @@
+package org.apache.subversion.javahl.ra;
+
+import java.io.InputStream;
+
+public interface ISVNFile extends ISVNNode
+{
+ /**
+ * Set the file content to that of the dataStream
+ */
+ public void sendStream(InputStream targetStream, String
baseMd5CheckSum);
+
+ /**
+ * Set the file content to that of the dataStream
+ * by sending it as delta to the baseStream.
+ * @param sourceStream
+ * @param targetStream
+ */
+ public void sendDeltaStream(InputStream sourceStream, InputStream
targetStream, String baseMd5CheckSum);
+
+ public void close(String md5HexChecksum);
+
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRaFactory.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRaFactory.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRaFactory.java
(working copy)
@@ -0,0 +1,33 @@
+package org.apache.subversion.javahl.ra;
+
+import org.apache.subversion.javahl.NativeResources;
+import org.apache.subversion.javahl.types.Version;
+
+
+public class SVNRaFactory
+{
+ /**
+ * Load the required native library.
+ */
+ static
+ {
+ NativeResources.loadNativeLibrary();
+
+ //TODO: Remove below, once NativeResources version check catches up to
Ra check
+ Version version = NativeResources.getVersion();
+ if (!version.isAtLeast(1, 7, 5))
+ {
+ throw new LinkageError("Native library version must be at least " +
+ "1.7.5, but is only " + version);
+ }
+ }
+
+ /**
+ * Crates RA session for a given url with provided context
+ * @param url to connect to
+ * @param uuid of the remote repository, can be null if uuid check is
not desired
+ * @param config configuration to use for the session.
+ * @return RA session
+ */
+ public static native ISVNRa createRaSession(String url, String uuid,
ISVNRaConfig config);
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRaConfigDefault.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRaConfigDefault.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRaConfigDefault.java
(working copy)
@@ -0,0 +1,56 @@
+package org.apache.subversion.javahl.ra;
+
+import org.apache.subversion.javahl.callback.UserPasswordCallback;
+
+public class SVNRaConfigDefault implements ISVNRaConfig
+{
+ private String username;
+ private String password;
+ private UserPasswordCallback prompt;
+ private String configDirectory;
+
+ @Override
+ public String getUsername()
+ {
+ return username;
+ }
+
+ public void setUsername(String username)
+ {
+ this.username = username;
+ }
+
+ @Override
+ public String getPassword()
+ {
+ return password;
+ }
+
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ @Override
+ public UserPasswordCallback getPrompt()
+ {
+ return prompt;
+ }
+
+
+ public void setPrompt(UserPasswordCallback prompt)
+ {
+ this.prompt = prompt;
+ }
+
+ @Override
+ public String getConfigDirectory()
+ {
+ return configDirectory;
+ }
+
+ public void setConfigDirectory(String configDirectory)
+ {
+ this.configDirectory = configDirectory;
+ }
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNNode.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNNode.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNNode.java
(working copy)
@@ -0,0 +1,6 @@
+package org.apache.subversion.javahl.ra;
+
+public interface ISVNNode
+{
+ public void changeProperty(String propertyName, byte[] propertyValue);
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNEditor.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNEditor.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNEditor.java
(working copy)
@@ -0,0 +1,21 @@
+package org.apache.subversion.javahl.ra;
+
+
+public interface ISVNEditor
+{
+ /**
+ * Open root directory of the RA session
+ * @param baseRevision - base revision that updates are against
+ */
+ public ISVNDirectory openRoot(long baseRevision);
+
+ /**
+ * Finish and complete edit
+ */
+ public void closeEdit();
+
+ /**
+ * Abort edit
+ */
+ public void abortEdit();
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNRaConfig.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNRaConfig.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/ISVNRaConfig.java
(working copy)
@@ -0,0 +1,14 @@
+package org.apache.subversion.javahl.ra;
+
+import org.apache.subversion.javahl.callback.UserPasswordCallback;
+
+/**
+ * Interface providing necessary configuration details for creation of ISVNRa
instance
+ */
+public interface ISVNRaConfig
+{
+ public String getUsername();
+ public String getPassword();
+ public UserPasswordCallback getPrompt();
+ public String getConfigDirectory();
+}
Index: subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRa.java
===================================================================
--- subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRa.java
(revision 0)
+++ subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNRa.java
(working copy)
@@ -0,0 +1,57 @@
+package org.apache.subversion.javahl.ra;
+
+import java.util.Map;
+
+import org.apache.subversion.javahl.JNIObject;
+import org.apache.subversion.javahl.callback.CommitCallback;
+import org.apache.subversion.javahl.callback.ProgressCallback;
+
+public class SVNRa extends JNIObject implements ISVNRa
+{
+ @Override
+ public native String getRoot();
+
+ @Override
+ public native long getLatestRevision();
+
+ @Override
+ public native String getUUID();
+
+ @Override
+ public native void reparent(String url);
+
+ @Override
+ public native String getUrl();
+
+ @Override
+ public native ISVNEditor getCommitEditor(Map<String, String> revProps,
CommitCallback commitCallback,
+ Map<String, String> lockTokens, boolean keepLock);
+
+
+ public void setProgressCallback(ProgressCallback listener)
+ {
+ sessionContext.setListener(listener);
+ }
+
+ @Override
+ public native void finalize() throws Throwable;
+
+ @Override
+ public native void dispose();
+
+
+ /*
+ * NOTE: This field is accessed from native code for callbacks.
+ */
+ private RaContext sessionContext = new RaContext();
+
+ /**
+ * This constructor is called from JNI
+ * to get an instance call getRaSession method of ISVNClient
+ * @param cppAddr
+ */
+ protected SVNRa(long cppAddr)
+ {
+ super(cppAddr);
+ }
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNDirectory.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNDirectory.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNDirectory.java
(working copy)
@@ -0,0 +1,51 @@
+package org.apache.subversion.javahl.ra;
+
+import org.apache.subversion.javahl.JNIObject;
+import org.apache.subversion.javahl.types.Revision;
+
+
+public class SVNDirectory extends JNIObject implements ISVNDirectory
+{
+ protected SVNDirectory(long cppAddr)
+ {
+ super(cppAddr);
+ }
+
+ @Override
+ public native void close();
+
+ @Override
+ public native void changeProperty(String propertyName, byte[]
propertyValue);
+
+ @Override
+ public native void deleteEntry(String path, long baseRevision);
+
+ @Override
+ public native ISVNDirectory addDirectory(String path, String parentPath,
+ long copyFromRevision);
+
+ @Override
+ public native ISVNDirectory openDirectory(String path, long
baseRevision);
+
+ @Override
+ public native ISVNFile addFile(String path, String parentPath,
+ long copyFromRevision);
+
+ @Override
+ public native ISVNFile openFile(String path, long baseRevision);
+
+ @Override
+ public ISVNDirectory addDirectory(String path)
+ {
+ return addDirectory(path, null, Revision.SVN_INVALID_REVNUM);
+ }
+
+ @Override
+ public ISVNFile addFile(String path)
+ {
+ return addFile(path, null, Revision.SVN_INVALID_REVNUM);
+ }
+
+ @Override
+ public native void finalize() throws Throwable;
+}
Index:
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNCommitEditorBuilder.java
===================================================================
---
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNCommitEditorBuilder.java
(revision 0)
+++
subversion/bindings/javahl/src/org/apache/subversion/javahl/ra/SVNCommitEditorBuilder.java
(working copy)
@@ -0,0 +1,148 @@
+package org.apache.subversion.javahl.ra;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.subversion.javahl.callback.CommitCallback;
+import org.apache.subversion.javahl.types.Property;
+
+/**
+ * This is a builder class to assist with calling of getCommitEditor method on
ISVNRa.
+ *
+ * Example use to get editor with commit message "test"
+ * ISVNEditor editor = new
SVNCommitEditorBuilder().setCommitMessage("test").create(ra);
+ */
+public class SVNCommitEditorBuilder
+{
+ private Map<String, String> revProps = new HashMap<String, String>();
+ private CommitCallback commitCallback;
+ private Map<String, String> lockTokens;
+ private boolean keepLocks;
+
+ /**
+ * @param ra session to use
+ * @return Commit editor creating using the state of the builder
+ */
+ public ISVNEditor create(ISVNRa ra)
+ {
+ return ra.getCommitEditor(revProps, commitCallback, lockTokens,
keepLocks);
+ }
+
+ /**
+ * Same as setKeepLocks(true)
+ */
+ public SVNCommitEditorBuilder keepLocks()
+ {
+ setKeepLocks(true);
+ return this;
+ }
+
+ /**
+ * @param keepLocks set to true to keep locks after edit and false
otherwise
+ */
+ public SVNCommitEditorBuilder setKeepLocks(boolean keepLocks)
+ {
+ this.keepLocks = keepLocks;
+ return this;
+ }
+
+ /**
+ * @param commitMessage to use when committing the edit
+ */
+ public SVNCommitEditorBuilder setCommitMessage(String commitMessage)
+ {
+ revProps.put(Property.REV_LOG, commitMessage);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder setLockToken(String path, String token)
+ {
+ getLockTokensInternal().put(path, token);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder setLockTokens(Map<String, String>
tokenMap)
+ {
+ getLockTokensInternal().putAll(tokenMap);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder deleteLockToken(String path)
+ {
+ getLockTokensInternal().remove(path);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder clearLockTokens()
+ {
+ getLockTokensInternal().clear();
+ return this;
+ }
+
+ public SVNCommitEditorBuilder setRevProperty(String propertyName,
String propertyValue)
+ {
+ revProps.put(propertyName, propertyValue);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder setRevProperties(Map<String, String>
propertyMap)
+ {
+ revProps.putAll(propertyMap);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder deleteRevProperty(String propertyName)
+ {
+ revProps.remove(propertyName);
+ return this;
+ }
+
+ public SVNCommitEditorBuilder clearRevProperties()
+ {
+ revProps.clear();
+ return this;
+ }
+
+ public SVNCommitEditorBuilder setCommitCallback(CommitCallback
commitCallback)
+ {
+ this.commitCallback = commitCallback;
+ return this;
+ }
+
+
+ public boolean isKeepLocks()
+ {
+ return keepLocks;
+ }
+
+ public CommitCallback getCommitCallback()
+ {
+ return commitCallback;
+ }
+
+ public Map<String, String> getRevProps()
+ {
+ return Collections.unmodifiableMap(revProps);
+ }
+
+ public Map<String, String> getLockTokens()
+ {
+ if(lockTokens == null)
+ {
+ return Collections.emptyMap();
+ }
+
+ return Collections.unmodifiableMap(lockTokens);
+ }
+
+ private Map<String, String> getLockTokensInternal()
+ {
+ if(lockTokens == null)
+ {
+ lockTokens = new HashMap<String, String>();
+ }
+
+ return lockTokens;
+ }
+}