Author: hwright
Date: Mon Mar  1 22:46:45 2010
New Revision: 917772

URL: http://svn.apache.org/viewvc?rev=917772&view=rev
Log:
JavaHL: Return properties as byte[] throughout the callback interfaces.

We use byte[] in place of String because there could be binary data in the
property, and the conversion to String would truncate the property at any
NULL bytes.

[ in subversion/bindings/javahl/ ]
* tests/org/apache/subversion/javahl/BasicTests.java
  (testBasicProperties, getMergeinfoRevisions, testCommitRevprops,
   MyProplistCallback, collectProperties, collectLogMessages,
   BlameCallbackImpl):
    Update for byte[] property values.

* native/ProplistCallback.cpp
  (makeMapFromHash): Put the byte array into the Map.

* src/org/apache/subversion/javahl/callback/LogMessageCallback.java
  (LogMessageCallback): Change the interface to return byte[].

* src/org/apache/subversion/javahl/callback/ProplistCallback.java
  (singlePath): Same.

* src/org/apache/subversion/javahl/callback/BlameCallback.java
  (singleLine): Same.

* src/org/tigris/subversion/javahl/SVNClient.java
  (logMessages, properties, blame): Update wrappers for the byte[] switch.

* src/org/tigris/subversion/javahl/ProplistCallbackImpl.java
  (ProplistCallback): Wrap the byte[] for backward compat.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/ProplistCallback.cpp
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java
    
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java
    
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
    
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java

Modified: 
subversion/trunk/subversion/bindings/javahl/native/ProplistCallback.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ProplistCallback.cpp?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ProplistCallback.cpp 
(original)
+++ subversion/trunk/subversion/bindings/javahl/native/ProplistCallback.cpp Mon 
Mar  1 22:46:45 2010
@@ -158,7 +158,8 @@
       if (JNIUtil::isJavaExceptionThrown())
         return NULL;
 
-      jstring jpropVal = JNIUtil::makeJString(val->data);
+      jbyteArray jpropVal = JNIUtil::makeJByteArray(
+                                    (const signed char *)val->data, val->len);
       if (JNIUtil::isJavaExceptionThrown())
         return NULL;
 

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameCallback.java
 Mon Mar  1 22:46:45 2010
@@ -48,8 +48,8 @@
      * @param localChange       true if the line was locally modified.
      */
     public void singleLine(long lineNum, long revision,
-                           Map<String, String> revProps, long mergedRevision,
-                           Map<String, String> mergedRevProps,
+                           Map<String, byte[]> revProps, long mergedRevision,
+                           Map<String, byte[]> mergedRevProps,
                            String mergedPath, String line, boolean localChange)
         throws ClientException;
 }

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/LogMessageCallback.java
 Mon Mar  1 22:46:45 2010
@@ -59,6 +59,6 @@
      */
     public void singleMessage(ChangePath[] changedPaths,
                               long revision,
-                              Map<String, String> revprops,
+                              Map<String, byte[]> revprops,
                               boolean hasChildren);
 }

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/ProplistCallback.java
 Mon Mar  1 22:46:45 2010
@@ -36,5 +36,5 @@
      * @param path        the path.
      * @param properties  the properties on the path.
      */
-    public void singlePath(String path, Map<String, String> properties);
+    public void singlePath(String path, Map<String, byte[]> properties);
 }

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/ProplistCallbackImpl.java
 Mon Mar  1 22:46:45 2010
@@ -33,16 +33,24 @@
  */
 public class ProplistCallbackImpl implements ProplistCallback
 {
-    Map<String, Map<String, String>> propMap =
-                                new HashMap<String, Map<String, String>>();
+    Map<String, Map<String, byte[]>> propMap =
+                                new HashMap<String, Map<String, byte[]>>();
 
-    public void singlePath(String path, Map<String, String> props)
+    public void singlePath(String path, Map<String, byte[]> props)
     {
         propMap.put(path, props);
     }
 
     public Map<String, String> getProperties(String path)
     {
-        return propMap.get(path);
+        Map<String, String> props = new HashMap<String, String>();
+        Map<String, byte[]> pdata = propMap.get(path);
+
+        for (String key : pdata.keySet())
+        {
+            props.put(key, new String(pdata.get(key)));
+        }
+
+        return props;
     }
 }

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
 Mon Mar  1 22:46:45 2010
@@ -28,6 +28,7 @@
 import java.io.OutputStream;
 
 import java.util.Map;
+import java.util.HashMap;
 import java.util.List;
 import java.util.HashSet;
 import java.util.Arrays;
@@ -504,8 +505,11 @@
 
             public void singleMessage(
                     org.apache.subversion.javahl.ChangePath[] aChangedPaths,
-                    long revision, Map revprops, boolean hasChildren)
+                    long revision, Map<String, byte[]> revprops,
+                    boolean hasChildren)
             {
+                Map<String, String> oldRevprops =
+                                                new HashMap<String, String>();
                 ChangePath[] changedPaths;
                 
                 if (aChangedPaths != null)
@@ -522,7 +526,12 @@
                     changedPaths = null;
                 }
 
-                callback.singleMessage(changedPaths, revision, revprops,
+                for (String key : revprops.keySet())
+                {
+                    oldRevprops.put(key, new String(revprops.get(key)));
+                }
+
+                callback.singleMessage(changedPaths, revision, oldRevprops,
                                        hasChildren);
             }
         }
@@ -1716,7 +1725,7 @@
         int i = 0;
         for (String key : propMap.keySet())
         {
-            props[i] = new PropertyData(path, key, (String) propMap.get(key));
+            props[i] = new PropertyData(path, key, propMap.get(key));
             i++;
         }
 
@@ -2182,15 +2191,16 @@
                 try
                 {
                     oldCallback.singleLine(
-                        df.parse((String) revProps.get("svn:date")),
+                        df.parse(new String((byte[]) 
revProps.get("svn:date"))),
                         revision,
-                        (String) revProps.get("svn:author"),
+                        new String((byte[]) revProps.get("svn:author")),
                         mergedRevProps == null ? null
-                            : df.parse((String)
-                                            mergedRevProps.get("svn:date")),
+                            : df.parse(new String((byte [])
+                                            mergedRevProps.get("svn:date"))),
                         mergedRevision,
                         mergedRevProps == null ? null
-                            : (String) mergedRevProps.get("svn:author"),
+                            : new String((byte[])
+                                mergedRevProps.get("svn:author")),
                         mergedPath, line);
                 }
                 catch (ParseException e)

Modified: 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=917772&r1=917771&r2=917772&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java
 Mon Mar  1 22:46:45 2010
@@ -764,11 +764,11 @@
         MyProplistCallback callback = new MyProplistCallback();
 
         client.properties(itemPath, null, null, Depth.empty, null, callback);
-        Map<String, String> propMap = callback.getProperties(itemPath);
+        Map<String, byte[]> propMap = callback.getProperties(itemPath);
         for (String key : propMap.keySet())
         {
             assertEquals("cqcq", key);
-            assertEquals("qrz", (String) propMap.get(key));
+            assertEquals("qrz", new String(propMap.get(key)));
         }
 
         wc.setItemPropStatus("A/B/E/alpha", Status.Kind.modified);
@@ -2361,7 +2361,7 @@
             List<Long> revList = new ArrayList<Long>();
 
             public void singleMessage(ChangePath[] changedPaths, long revision,
-                    Map<String, String> revprops, boolean hasChildren) {
+                    Map<String, byte[]> revprops, boolean hasChildren) {
                 revList.add(new Long(revision));
             }
 
@@ -3457,17 +3457,17 @@
 
         class RevpropLogCallback implements LogMessageCallback
         {
-            Map<String, String> revprops;
+            Map<String, byte[]> revprops;
 
             public void singleMessage(ChangePath[] changedPaths,
                                       long revision,
-                                      Map<String, String> revprops,
+                                      Map<String, byte[]> revprops,
                                       boolean hasChildren)
             {
                 this.revprops = revprops;
             }
 
-            public Map<String, String> getRevprops()
+            public Map<String, byte[]> getRevprops()
             {
                 return revprops;
             }
@@ -3511,7 +3511,7 @@
                                            Revision.getInstance(2)),
                            false, false, false, revProps, 0,
                            callback);
-        Map<String, String> fetchedProps = callback.getRevprops();
+        Map<String, byte[]> fetchedProps = callback.getRevprops();
 
         assertEquals("wrong number of fetched revprops", revprops.size(),
                      fetchedProps.size());
@@ -3519,7 +3519,7 @@
         for (String key : keys)
           {
             assertEquals("revprops check", revprops.get(key),
-                         fetchedProps.get(key));
+                         new String(fetchedProps.get(key)));
           }
     }
 
@@ -3613,15 +3613,15 @@
 
     private class MyProplistCallback implements ProplistCallback
     {
-        Map<String, Map<String, String>> propMap =
-                                    new HashMap<String, Map<String, String>>();
+        Map<String, Map<String, byte[]>> propMap =
+                                    new HashMap<String, Map<String, byte[]>>();
 
-        public void singlePath(String path, Map<String, String> props)
+        public void singlePath(String path, Map<String, byte[]> props)
         {
             propMap.put(path, props);
         }
 
-        public Map<String, String> getProperties(String path)
+        public Map<String, byte[]> getProperties(String path)
         {
             return propMap.get(path);
         }
@@ -3649,15 +3649,15 @@
     {
         class MyProplistCallback implements ProplistCallback
         {
-            Map<String, Map<String, String>> propMap =
-                                new HashMap<String, Map<String, String>>();
+            Map<String, Map<String, byte[]>> propMap =
+                                new HashMap<String, Map<String, byte[]>>();
 
-            public void singlePath(String path, Map<String, String> props)
+            public void singlePath(String path, Map<String, byte[]> props)
             {
                 propMap.put(path, props);
             }
 
-            public Map<String, String> getProperties(String path)
+            public Map<String, byte[]> getProperties(String path)
             {
                 return propMap.get(path);
             }
@@ -3667,7 +3667,7 @@
         client.properties(path, revision, revision, depth, changelists,
                 callback);
 
-        Map<String, String> propMap = callback.getProperties(path);
+        Map<String, byte[]> propMap = callback.getProperties(path);
         if (propMap == null)
             return new PropertyData[0];
         PropertyData[] props = new PropertyData[propMap.size()];
@@ -3675,7 +3675,8 @@
         int i = 0;
         for (String key : propMap.keySet())
         {
-            props[i] = new PropertyData(path, key, propMap.get(key));
+            props[i] = new PropertyData(path, key,
+                                        new String(propMap.get(key)));
             i++;
         }
 
@@ -3771,16 +3772,16 @@
 
             public void singleMessage(ChangePath[] changedPaths,
                                       long revision,
-                                      Map<String, String> revprops,
+                                      Map<String, byte[]> revprops,
                                       boolean hasChildren)
             {
-                String author = (String) revprops.get("svn:author");
-                String message = (String) revprops.get("svn:log");
+                String author = new String(revprops.get("svn:author"));
+                String message = new String(revprops.get("svn:log"));
                 long timeMicros;
 
                 try {
-                    LogDate date = new LogDate((String)
-                                                    revprops.get("svn:date"));
+                    LogDate date = new LogDate(new String(
+                                                    revprops.get("svn:date")));
                     timeMicros = date.getTimeMicros();
                 } catch (ParseException ex) {
                     timeMicros = 0;
@@ -3862,9 +3863,9 @@
         }
 
         public void singleLine(long lineNum, long rev,
-                               Map<String, String> revProps,
+                               Map<String, byte[]> revProps,
                                long mergedRevision,
-                               Map<String, String> mergedRevProps,
+                               Map<String, byte[]> mergedRevProps,
                                String mergedPath, String line,
                                boolean localChange)
             throws ClientException
@@ -3873,14 +3874,14 @@
 
             try {
                 singleLine(
-                    df.parse((String) revProps.get("svn:date")),
+                    df.parse(new String(revProps.get("svn:date"))),
                     rev,
-                    (String) revProps.get("svn:author"),
+                    new String(revProps.get("svn:author")),
                     mergedRevProps == null ? null
-                        : df.parse((String) mergedRevProps.get("svn:date")),
+                        : df.parse(new String(mergedRevProps.get("svn:date"))),
                     mergedRevision,
                     mergedRevProps == null ? null
-                        : (String) mergedRevProps.get("svn:author"),
+                        : new String(mergedRevProps.get("svn:author")),
                     mergedPath, line);
             } catch (ParseException e) {
                 throw ClientException.fromException(e);


Reply via email to