On Mon, 2011-07-25 at 18:18 -0700, Alex Cruise wrote:
> On Mon, Jul 25, 2011 at 6:03 PM, Alex Cruise <[email protected]>
> wrote:
>         On Mon, Jul 25, 2011 at 4:32 PM, David Lutterkort
>         <[email protected]> wrote:
>                 On Mon, 2011-07-25 at 16:00 -0700, Alex Cruise wrote:
>                 > I'm using the Java API successfully, but I note that
>                 the `span` command
>                 > isn't supported there.  Would it be extremely
>                 difficult to add it?
> 
> Also
> https://github.com/acruise/java-augeas/commit/59821001faa8635b61f680eb405efaaca6b430d6


Thanks very much for this addon. I took a look to it and it seems good.
I just changed few things

* Adding flag AUG_ENABLE_SPAN to enable span on load
* Checking for null filename to avoid null pointer exception
* Adding NO_SPAN error code matching the API
* Adding tests for all this 

As a side note, I had to add junit4.jar on the classpath for tests
because this is the default archive name on deb distros. 

Here are the patches. I also did a merge of all those patches and your
own work. Let me know if you find additional issues. Maybe it should be
a good idea to bump augeas-java binding version number for this?

Have a nice day, 

Francis

>From 382187a390e144c1ecd94fb1695bdacca3e14c1c Mon Sep 17 00:00:00 2001
From: Francis Giraldeau <[email protected]>
Date: Tue, 26 Jul 2011 19:41:36 -0400
Subject: [PATCH 1/5] Add correct jar name under debian

Under debian, junit is shipped in /usr/share/java/junit4.jar. Adding another
path fixes a class not found error.
---
 build.xml |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/build.xml b/build.xml
index dc0f51b..3791f10 100644
--- a/build.xml
+++ b/build.xml
@@ -18,6 +18,7 @@
 		<fileset dir="/usr/share/java">
 			<include name="jna.jar"/>
             <include name="junit.jar"/>			
+            <include name="junit4.jar"/>			
 		</fileset>		
 		<pathelement location="target/classes"/> 		
 	</path> 	
@@ -57,6 +58,7 @@
 	        <fileset dir="/usr/share/java">
 	            <include name="jna.jar"/>
 	            <include name="junit.jar"/>         
+	            <include name="junit4.jar"/>         
 	        </fileset>      
 	        <pathelement location="target/classes"/>
 	        <pathelement location="target/testclasses"/>            
-- 
1.7.4.1

>From e26f4b85e847fab062e3885f0af302f6faa451ec Mon Sep 17 00:00:00 2001
From: Francis Giraldeau <[email protected]>
Date: Tue, 26 Jul 2011 19:46:42 -0400
Subject: [PATCH 2/5] Adding span enable flag

Span can be enabled at load time with AUG_ENABLE_SPAN. This patch adds the
option to the java interface.
---
 src/main/java/net/augeas/Augeas.java |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/src/main/java/net/augeas/Augeas.java b/src/main/java/net/augeas/Augeas.java
index 091650b..1be175d 100644
--- a/src/main/java/net/augeas/Augeas.java
+++ b/src/main/java/net/augeas/Augeas.java
@@ -78,6 +78,11 @@ public class Augeas {
     public static int NO_MODL_AUTOLOAD = (1 << 6);
 
     /**
+     * Enable span on load
+     */
+    public static int AUG_ENABLE_SPAN = (1 << 7);
+
+    /**
      * Pointert to he active augeas instance.
      */
     protected AugPointer aug;
-- 
1.7.4.1

>From 48c03f58866e262a9f447b79cca8d3b847099b32 Mon Sep 17 00:00:00 2001
From: Francis Giraldeau <[email protected]>
Date: Tue, 26 Jul 2011 20:26:44 -0400
Subject: [PATCH 3/5] Adding span error code

---
 src/main/java/net/augeas/AugeasErrorCode.java |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/main/java/net/augeas/AugeasErrorCode.java b/src/main/java/net/augeas/AugeasErrorCode.java
index b534995..95c8302 100644
--- a/src/main/java/net/augeas/AugeasErrorCode.java
+++ b/src/main/java/net/augeas/AugeasErrorCode.java
@@ -30,7 +30,8 @@ public enum AugeasErrorCode {
     MANY_MATCHES(5), /* Too many matches for path expression */
     LENS_SYNTAX_ERROR(6), /* Syntax error in lens file */
     LENS_LOOKUP_ERROR(7), /* Lens lookup failed */
-    MULTIPLE_TRANSFORMS_ERROR(8); /* Multiple Transforms */
+    MULTIPLE_TRANSFORMS_ERROR(8), /* Multiple Transforms */
+    NO_SPAN(9); /* No span for this node */
 
     private int intValue;
     private static java.util.HashMap<Integer, AugeasErrorCode> mappings;
-- 
1.7.4.1

>From a775939804ea0044eee08511f96797b80cf92d9f Mon Sep 17 00:00:00 2001
From: Francis Giraldeau <[email protected]>
Date: Tue, 26 Jul 2011 20:27:12 -0400
Subject: [PATCH 4/5] Avoid null pointer exception when string is null

---
 src/main/java/net/augeas/Augeas.java |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/main/java/net/augeas/Augeas.java b/src/main/java/net/augeas/Augeas.java
index 1be175d..d3c711b 100644
--- a/src/main/java/net/augeas/Augeas.java
+++ b/src/main/java/net/augeas/Augeas.java
@@ -425,7 +425,7 @@ public class Augeas {
         processLastCall("span failed");
 
         return new SpanResult(
-                filename.getValue().getString(0),
+                filename.getValue() != null ? filename.getValue().getString(0) : "",
                 labelStart.getValue(),
                 labelEnd.getValue(),
                 valueStart.getValue(),
-- 
1.7.4.1

>From cd0b7c75768b8296e2d89b23386432b84b21dbbd Mon Sep 17 00:00:00 2001
From: Francis Giraldeau <[email protected]>
Date: Tue, 26 Jul 2011 20:28:31 -0400
Subject: [PATCH 5/5] Test span on load and span error code

---
 src/test/java/net/augeas/AugeasTest.java |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/src/test/java/net/augeas/AugeasTest.java b/src/test/java/net/augeas/AugeasTest.java
index 76791e6..8e4520e 100644
--- a/src/test/java/net/augeas/AugeasTest.java
+++ b/src/test/java/net/augeas/AugeasTest.java
@@ -75,7 +75,7 @@ public class AugeasTest extends TestCase {
     // TODO find some way to make this test more portable!!
     public void testSpan() {
         Augeas aug = new Augeas();
-        aug.set("/augeas/span","enable"); // TODO consider an alternate constructor that does this for us
+        aug.set("/augeas/span","enable");
         aug.rm("/files");
         aug.load();
 
@@ -89,4 +89,20 @@ public class AugeasTest extends TestCase {
         assertEquals(0, got.getLabelEnd());
     }
 
+    /* test enable span on load */
+    public void testSpanLoad() {
+        Augeas aug = new Augeas(Augeas.AUG_ENABLE_SPAN);
+        SpanResult got = aug.span("/files/etc/passwd[1]");
+        assertEquals("/etc/passwd", got.getFilename());
+    }
+
+    /* test error code in the case span is disabled */
+    public void testSpanError() {
+    	Augeas aug = new Augeas();
+    	aug.setRaiseExceptions(false);
+    	SpanResult span = aug.span("/files/etc/passwd");
+    	AugeasErrorCode lastError = aug.lastError();
+    	assertEquals(AugeasErrorCode.NO_SPAN, lastError);
+    }
+
 }
-- 
1.7.4.1

>From b90485bb7a22362603039100ee508e61895c9420 Mon Sep 17 00:00:00 2001
From: Alex Cruise <[email protected]>
Date: Mon, 25 Jul 2011 18:12:10 -0700
Subject: [PATCH] Span support in Java bindings

 * Add correct jar name under debian
 * Adding span enable flag
 * Adding span error code
 * Avoid null pointer exception when string is null
 * Test span on load and span error code
---
 build.xml                                     |    2 +
 src/main/java/net/augeas/Augeas.java          |   37 +++++++++-
 src/main/java/net/augeas/AugeasErrorCode.java |    3 +-
 src/main/java/net/augeas/SpanResult.java      |   92 +++++++++++++++++++++++++
 src/main/java/net/augeas/jna/Aug.java         |    5 ++
 src/test/java/net/augeas/AugeasTest.java      |   38 ++++++++++-
 6 files changed, 172 insertions(+), 5 deletions(-)
 create mode 100644 src/main/java/net/augeas/SpanResult.java

diff --git a/build.xml b/build.xml
index dc0f51b..3791f10 100644
--- a/build.xml
+++ b/build.xml
@@ -18,6 +18,7 @@
 		<fileset dir="/usr/share/java">
 			<include name="jna.jar"/>
             <include name="junit.jar"/>			
+            <include name="junit4.jar"/>			
 		</fileset>		
 		<pathelement location="target/classes"/> 		
 	</path> 	
@@ -57,6 +58,7 @@
 	        <fileset dir="/usr/share/java">
 	            <include name="jna.jar"/>
 	            <include name="junit.jar"/>         
+	            <include name="junit4.jar"/>         
 	        </fileset>      
 	        <pathelement location="target/classes"/>
 	        <pathelement location="target/testclasses"/>            
diff --git a/src/main/java/net/augeas/Augeas.java b/src/main/java/net/augeas/Augeas.java
index 818a374..d3c711b 100644
--- a/src/main/java/net/augeas/Augeas.java
+++ b/src/main/java/net/augeas/Augeas.java
@@ -78,6 +78,11 @@ public class Augeas {
     public static int NO_MODL_AUTOLOAD = (1 << 6);
 
     /**
+     * Enable span on load
+     */
+    public static int AUG_ENABLE_SPAN = (1 << 7);
+
+    /**
      * Pointert to he active augeas instance.
      */
     protected AugPointer aug;
@@ -338,7 +343,9 @@ public class Augeas {
      */
     protected void processLastCall(String message) {
         if (raiseExceptions && lastReturn == -1) {
-            throw new AugeasException(message);
+            final String err = lastErrorMessage() != null ? (": " + lastErrorMessage()) : "";
+            final String details = lastErrorDetails() != null ? (": " + lastErrorDetails()) : "";
+            throw new AugeasException(message + err + details);
         }
     }
 
@@ -402,6 +409,32 @@ public class Augeas {
         return lastReturn;
     }
 
+    public SpanResult span(String path) {
+        check();
+
+        final PointerByReference filename = new PointerByReference();
+        final IntByReference labelStart = new IntByReference();
+        final IntByReference labelEnd   = new IntByReference();
+        final IntByReference valueStart = new IntByReference();
+        final IntByReference valueEnd   = new IntByReference();
+        final IntByReference spanStart  = new IntByReference();
+        final IntByReference spanEnd    = new IntByReference();
+
+        lastReturn = AugLib.aug_span(aug, path, filename, labelStart, labelEnd, valueStart, valueEnd, spanStart, spanEnd);
+
+        processLastCall("span failed");
+
+        return new SpanResult(
+                filename.getValue() != null ? filename.getValue().getString(0) : "",
+                labelStart.getValue(),
+                labelEnd.getValue(),
+                valueStart.getValue(),
+                valueEnd.getValue(),
+                spanStart.getValue(),
+                spanEnd.getValue()
+        );
+    }
+
     /**
      * sets if exceptions should be raised
      */
@@ -411,7 +444,7 @@ public class Augeas {
 
     /**
      * Add a transform under <tt>/augeas/load</tt>
-     * 
+     *
      * @param lens
      *            the lens to use
      * @param name
diff --git a/src/main/java/net/augeas/AugeasErrorCode.java b/src/main/java/net/augeas/AugeasErrorCode.java
index b534995..95c8302 100644
--- a/src/main/java/net/augeas/AugeasErrorCode.java
+++ b/src/main/java/net/augeas/AugeasErrorCode.java
@@ -30,7 +30,8 @@ public enum AugeasErrorCode {
     MANY_MATCHES(5), /* Too many matches for path expression */
     LENS_SYNTAX_ERROR(6), /* Syntax error in lens file */
     LENS_LOOKUP_ERROR(7), /* Lens lookup failed */
-    MULTIPLE_TRANSFORMS_ERROR(8); /* Multiple Transforms */
+    MULTIPLE_TRANSFORMS_ERROR(8), /* Multiple Transforms */
+    NO_SPAN(9); /* No span for this node */
 
     private int intValue;
     private static java.util.HashMap<Integer, AugeasErrorCode> mappings;
diff --git a/src/main/java/net/augeas/SpanResult.java b/src/main/java/net/augeas/SpanResult.java
new file mode 100644
index 0000000..b1f29bb
--- /dev/null
+++ b/src/main/java/net/augeas/SpanResult.java
@@ -0,0 +1,92 @@
+package net.augeas;
+
+public final class SpanResult {
+    private final String filename;
+    private final int labelStart;
+    private final int labelEnd;
+    private final int valueStart;
+    private final int valueEnd;
+    private final int spanStart;
+    private final int spanEnd;
+
+    public SpanResult(String filename, int labelStart, int labelEnd, int valueStart, int valueEnd, int spanStart, int spanEnd) {
+        this.filename = filename;
+        this.labelStart = labelStart;
+        this.labelEnd = labelEnd;
+        this.valueStart = valueStart;
+        this.valueEnd = valueEnd;
+        this.spanStart = spanStart;
+        this.spanEnd = spanEnd;
+    }
+
+    public String getFilename() {
+        return filename;
+    }
+
+    public int getLabelStart() {
+        return labelStart;
+    }
+
+    public int getLabelEnd() {
+        return labelEnd;
+    }
+
+    public int getValueStart() {
+        return valueStart;
+    }
+
+    public int getValueEnd() {
+        return valueEnd;
+    }
+
+    public int getSpanStart() {
+        return spanStart;
+    }
+
+    public int getSpanEnd() {
+        return spanEnd;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        SpanResult that = (SpanResult) o;
+
+        if (labelEnd != that.labelEnd) return false;
+        if (labelStart != that.labelStart) return false;
+        if (spanEnd != that.spanEnd) return false;
+        if (spanStart != that.spanStart) return false;
+        if (valueEnd != that.valueEnd) return false;
+        if (valueStart != that.valueStart) return false;
+        if (filename != null ? !filename.equals(that.filename) : that.filename != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = filename != null ? filename.hashCode() : 0;
+        result = 31 * result + labelStart;
+        result = 31 * result + labelEnd;
+        result = 31 * result + valueStart;
+        result = 31 * result + valueEnd;
+        result = 31 * result + spanStart;
+        result = 31 * result + spanEnd;
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "SpanResult{" +
+                "filename='" + filename + '\'' +
+                ", labelStart=" + labelStart +
+                ", labelEnd=" + labelEnd +
+                ", valueStart=" + valueStart +
+                ", valueEnd=" + valueEnd +
+                ", spanStart=" + spanStart +
+                ", spanEnd=" + spanEnd +
+                '}';
+    }
+}
diff --git a/src/main/java/net/augeas/jna/Aug.java b/src/main/java/net/augeas/jna/Aug.java
index 86ef708..197b14d 100644
--- a/src/main/java/net/augeas/jna/Aug.java
+++ b/src/main/java/net/augeas/jna/Aug.java
@@ -67,4 +67,9 @@ public interface Aug extends Library {
     int aug_set(AugPointer aug, String path, String value);
 
     int aug_setm(AugPointer aug, String base, String sub, String value);
+
+    int aug_span(AugPointer aug, String path, PointerByReference filename,
+                 IntByReference labelStart, IntByReference labelEnd,
+                 IntByReference valueStart, IntByReference valueEnd,
+                 IntByReference spanStart, IntByReference spanEnd);
 }
\ No newline at end of file
diff --git a/src/test/java/net/augeas/AugeasTest.java b/src/test/java/net/augeas/AugeasTest.java
index 45a3b68..8e4520e 100644
--- a/src/test/java/net/augeas/AugeasTest.java
+++ b/src/test/java/net/augeas/AugeasTest.java
@@ -1,9 +1,9 @@
 package net.augeas;
 
-import java.util.List;
-
 import junit.framework.TestCase;
 
+import java.util.List;
+
 public class AugeasTest extends TestCase {
 
     public void testBasics() {
@@ -71,4 +71,38 @@ public class AugeasTest extends TestCase {
             // Good.
         }
     }
+
+    // TODO find some way to make this test more portable!!
+    public void testSpan() {
+        Augeas aug = new Augeas();
+        aug.set("/augeas/span","enable");
+        aug.rm("/files");
+        aug.load();
+
+        SpanResult got = aug.span("/files/etc/passwd[1]");
+        assertEquals("/etc/passwd", got.getFilename());
+        assertEquals(0, got.getValueStart());
+        assertEquals(0, got.getValueEnd());
+        assertEquals(0, got.getSpanStart());
+        assertTrue(got.getSpanEnd() > 0);
+        assertEquals(0, got.getLabelStart());
+        assertEquals(0, got.getLabelEnd());
+    }
+
+    /* test enable span on load */
+    public void testSpanLoad() {
+        Augeas aug = new Augeas(Augeas.AUG_ENABLE_SPAN);
+        SpanResult got = aug.span("/files/etc/passwd[1]");
+        assertEquals("/etc/passwd", got.getFilename());
+    }
+
+    /* test error code in the case span is disabled */
+    public void testSpanError() {
+    	Augeas aug = new Augeas();
+    	aug.setRaiseExceptions(false);
+    	SpanResult span = aug.span("/files/etc/passwd");
+    	AugeasErrorCode lastError = aug.lastError();
+    	assertEquals(AugeasErrorCode.NO_SPAN, lastError);
+    }
+
 }
-- 
1.7.4.1

_______________________________________________
augeas-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/augeas-devel

Reply via email to