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 revProps, CommitCallback commitCallback, + Map 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 revProps, CommitCallback commitCallback, + Map 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 revProps = new HashMap(); + private CommitCallback commitCallback; + private Map 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 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 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 getRevProps() + { + return Collections.unmodifiableMap(revProps); + } + + public Map getLockTokens() + { + if(lockTokens == null) + { + return Collections.emptyMap(); + } + + return Collections.unmodifiableMap(lockTokens); + } + + private Map getLockTokensInternal() + { + if(lockTokens == null) + { + lockTokens = new HashMap(); + } + + return lockTokens; + } +}