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
