Ranides Atterwim vor 10 Jahren
Ursprung
Commit
02b41b0a01

+ 2 - 4
assira/src/main/java/net/ranides/assira/xml/XMLElement.java

@@ -6,10 +6,6 @@
  */
 package net.ranides.assira.xml;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
 import java.util.function.Predicate;
 import javax.xml.transform.Result;
 import javax.xml.transform.Transformer;
@@ -40,6 +36,8 @@ public interface XMLElement extends Wrapper<String> {
     
     XMLElements attrs();
     
+    XMLElement attr(String name);
+    
     XMLNamespace ns();
     
     

+ 38 - 20
assira/src/main/java/net/ranides/assira/xml/XMLElements.java

@@ -6,9 +6,9 @@
  */
 package net.ranides.assira.xml;
 
-import java.io.IOException;
-import java.io.Writer;
+import java.util.List;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import net.ranides.assira.collection.maps.MultiMap;
 import net.ranides.assira.collection.query.CQuery;
@@ -20,31 +20,25 @@ import org.w3c.dom.Node;
  */
 public interface XMLElements extends Iterable<XMLElement> {
     
-    MultiMap<String, String> map();
-    
-    CQuery<String> values();
-    
+    List<Node> nodes();
     
+    List<String> names();
     
-    CQuery<Node> nodes();
-    
-    CQuery<String> names();
-    
-    CQuery<String> xpaths();
+    List<String> xpaths();
     
     String content();
     
-    void content(Writer target) throws IOException;
+    List<String> contents();
     
     String text();
     
-    void text(Writer target) throws IOException;
+    List<String> texts();
     
     XMLElements attrs();
     
     XMLElements attrs(String name);
     
-    XMLNamespace ns();
+    CQuery<XMLNamespace> ns();
     
 
     
@@ -52,6 +46,8 @@ public interface XMLElements extends Iterable<XMLElement> {
     
     CQuery<XMLElement> stream();
     
+    <T> CQuery<T> stream(Function<? super XMLElement, ? extends T> function);
+    
     XMLElements each(Consumer<? super XMLElement> consumer);
     
     XMLElement first();
@@ -80,14 +76,12 @@ public interface XMLElements extends Iterable<XMLElement> {
     
     boolean matches();
     
-    boolean matches(String selector);
-    
-    boolean matches(XMLSelector selector);
-
-    
+    MultiMap<String, String> map();
     
     XMLElements map(XMLSelector function);
     
+    XMLElements map(Function<? super XMLElement, ? extends XMLElement> function);
+    
     XMLElements find(String selector);
     
     XMLElements find(XMLSelector selector);
@@ -128,6 +122,30 @@ public interface XMLElements extends Iterable<XMLElement> {
     
     XMLElements parent(Predicate<XMLContext> selector);
     
-    // @todo (assira #0) xml: XMLElements should support "bulk version" of most methods from XMLElement
+
+
+    XMLElements normalize();
+    
+    XMLElements before(XMLElement element);
+    
+    XMLElements after(XMLElement element);
+    
+    XMLElements prepend(XMLElement element);
+    
+    XMLElements append(XMLElement element);
+    
+    XMLElements replace(XMLElement element);
+    
+    XMLElements rename(String tagname);
+    
+    XMLElements remove();
+    
+    XMLElements wrap(String tagname);
+    
+    XMLElements unwrap();
+    
+    XMLElements content(String value);
+    
+    XMLElements text(String value);
         
 }

+ 0 - 3
assira/src/main/java/net/ranides/assira/xml/XMLWriter.java

@@ -7,8 +7,6 @@
 
 package net.ranides.assira.xml;
 
-import com.sun.org.apache.xml.internal.serialize.OutputFormat;
-import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -24,7 +22,6 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.TransformerFactoryConfigurationError;
 import javax.xml.transform.stream.StreamResult;
 import net.ranides.assira.text.Charsets;
-import org.w3c.dom.Node;
 
 /**
  *

+ 102 - 36
assira/src/main/java/net/ranides/assira/xml/impl/CElements.java

@@ -10,6 +10,7 @@ import java.io.IOException;
 import java.io.Writer;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -50,52 +51,58 @@ public class CElements implements XMLElements {
     }
 
     @Override
-    public CQuery<Node> nodes() {
-        return stream.map(XMLElement::node);
+    public List<Node> nodes() {
+        return stream.map(XMLElement::node).list();
     }
 
     @Override
-    public CQuery<String> names() {
-        return stream.map(XMLElement::name);
+    public List<String> names() {
+        return stream.map(XMLElement::name).list();
     }
 
     @Override
-    public CQuery<String> xpaths() {
-        return stream.map(XMLElement::xpath);
+    public List<String> xpaths() {
+        return stream.map(XMLElement::xpath).list();
     }
     
     @Override
     public MultiMap<String, String> map() {
         return stream.collect(MapCollectors.multimap(XMLElement::name, XMLElement::content));
     }
+//
+//    @Override
+//    public String value() {
+//        return StringUtils.join(values(), "");
+//    }
+//    
+//    @Override
+//    public CQuery<String> values() {
+//        return stream.map(XMLElement::content);
+//    }
+//
+//    @Override
+//    public <T> CQuery<T> values(Function<? super String, T> function) {
+//        return stream.map(n -> function.apply(n.content()));
+//    }
     
-    @Override
-    public CQuery<String> values() {
-        return stream.map(XMLElement::content);
-    }
-
     @Override
     public String content() {
-        return StringUtils.join(stream, "", XMLElement::content);
+        return StringUtils.join(contents(), "");
     }
 
     @Override
-    public void content(Writer target) throws IOException {
-        for(XMLElement node : stream) {
-            target.append(node.content());
-        }
+    public List<String> contents() {
+        return stream.map(XMLElement::content).list();
     }
-
+    
     @Override
     public String text() {
-        return StringUtils.join(stream, "", XMLElement::text);
+        return StringUtils.join(texts(), "");
     }
 
     @Override
-    public void text(Writer target) throws IOException {
-        for(XMLElement node : stream) {
-            target.append(node.text());
-        }
+    public List<String> texts() {
+        return stream.map(XMLElement::text).list();
     }
 
     @Override
@@ -108,14 +115,13 @@ public class CElements implements XMLElements {
         return new CElements(stream
             .map(n -> n.attrs())
             .filter(n -> n.has(name))
-            .unfold(a -> a. children(name).stream())
+            .map(a -> a.first(name))
         );
-        
     }
 
     @Override
-    public XMLNamespace ns() {
-        return first().ns();
+    public CQuery<XMLNamespace> ns() {
+        return stream(XMLElement::ns);
     }
 
     @Override
@@ -128,6 +134,11 @@ public class CElements implements XMLElements {
         return stream;
     }
 
+    @Override
+    public <T> CQuery<T> stream(Function<? super XMLElement, ? extends T> function) {
+        return stream.map(function);
+    }
+
     @Override
     public XMLElements each(Consumer<? super XMLElement> consumer) {
         stream.each(consumer);
@@ -195,16 +206,6 @@ public class CElements implements XMLElements {
     public boolean matches() {
         return !stream.isEmpty();
     }
-
-    @Override
-    public boolean matches(String selector) {
-        return filter(selector).matches();
-    }
-
-    @Override
-    public boolean matches(XMLSelector selector) {
-        return filter(selector).matches();
-    }
     
     XMLElements unfold(Function<XMLElement, XMLElements> function) {
         return new CElements(stream.unfold(n -> function.apply(n).stream()));
@@ -215,6 +216,11 @@ public class CElements implements XMLElements {
         CContext c = new CContext();
         return unfold(n -> c.select(n, function));
     }
+    
+    @Override
+    public XMLElements map(Function<? super XMLElement, ? extends XMLElement> function) {
+        return new CElements(stream(function));
+    }
 
     @Override
     public XMLElements find(String selector) {
@@ -317,5 +323,65 @@ public class CElements implements XMLElements {
     public XMLElements parent(Predicate<XMLContext> selector) {
         return unfold(n -> n.parents(selector));
     }
+
+    @Override
+    public XMLElements normalize() {
+        return each(n -> n.normalize());
+    }
+    
+    @Override
+    public XMLElements content(String value) {
+        return each(n -> n.content(value));
+    }
+
+    @Override
+    public XMLElements text(String value) {
+        return each(n -> n.text(value));
+    }
+    
+    @Override
+    public XMLElements before(XMLElement element) {
+        return each(n -> n.before(element));
+    }
+
+    @Override
+    public XMLElements after(XMLElement element) {
+        return each(n -> n.after(element));
+    }
+
+    @Override
+    public XMLElements prepend(XMLElement element) {
+        return each(n -> n.prepend(element));
+    }
+
+    @Override
+    public XMLElements append(XMLElement element) {
+        return each(n -> n.append(element));
+    }
+
+    @Override
+    public XMLElements replace(XMLElement element) {
+        return each(n -> n.after(element));
+    }
+
+    @Override
+    public XMLElements rename(String tagname) {
+        return each(n -> n.rename(tagname));
+    }
+
+    @Override
+    public XMLElements remove() {
+        return each(n -> n.remove());
+    }
+
+    @Override
+    public XMLElements wrap(String tagname) {
+        return each(n -> n.wrap(tagname));
+    }
+
+    @Override
+    public XMLElements unwrap() {
+        return each(n -> n.unwrap());
+    }
     
 }

+ 13 - 8
assira/src/main/java/net/ranides/assira/xml/impl/W3Attributes.java

@@ -6,15 +6,15 @@
  */
 package net.ranides.assira.xml.impl;
 
+import java.util.List;
 import java.util.function.Predicate;
+import net.ranides.assira.collection.lists.ListUtils;
 import net.ranides.assira.collection.maps.MapUtils;
 import net.ranides.assira.collection.maps.MultiMap;
-import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.query.CQueryBuilder;
 import net.ranides.assira.xml.XMLContext;
 import net.ranides.assira.xml.XMLElement;
 import net.ranides.assira.xml.XMLElements;
-import net.ranides.assira.xml.XMLSelector;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -42,18 +42,23 @@ public class W3Attributes extends CElements {
     }
 
     @Override
-    public CQuery<Node> nodes() {
-        return CQueryBuilder.fromCollection(map.values());
+    public List<Node> nodes() {
+        return map.values();
     }
     
     @Override
-    public CQuery<String> names() {
-        return CQueryBuilder.fromCollection(map.keySet());
+    public List<String> names() {
+        return map.keySet();
     }
 
     @Override
-    public CQuery<String> values() {
-        return CQueryBuilder.fromCollection(map.values()).map(Node::getNodeValue);
+    public List<String> texts() {
+        return ListUtils.map(map.values(), n -> n.getTextContent());
+    }
+
+    @Override
+    public List<String> contents() {
+        return ListUtils.map(map.values(), n -> n.getNodeValue());
     }
     
     @Override

+ 10 - 0
assira/src/main/java/net/ranides/assira/xml/impl/W3Element.java

@@ -43,6 +43,8 @@ public class W3Element extends CElement implements XMLElement {
     
     private static final IClass TYPE = IClass.typeinfo(String.class);
     
+    private static final XMLSelector NORMALIZE = XMLSelector.compile("? //text()[normalize-space(.) = '']");
+    
     protected W3Element(Node node) {
         super(node);
     }
@@ -114,6 +116,11 @@ public class W3Element extends CElement implements XMLElement {
         return null == nnmap ? CElements.EMPTY : new W3Attributes(node.getOwnerDocument(), nnmap);
     }
 
+    @Override
+    public XMLElement attr(String name) {
+        return attrs().first(name);
+    }
+
     @Override
     public XMLNamespace ns() {
         // @todo (assira #2.5) xml: W3Element.ns
@@ -328,9 +335,12 @@ public class W3Element extends CElement implements XMLElement {
         return this;
     }
 
+    
     @Override
     public XMLElement normalize() {
         node.normalize();
+        
+        find(NORMALIZE).remove();
         return this;
     }
 

+ 16 - 17
assira/src/test/java/net/ranides/assira/xml/XMLQueryTest.java

@@ -8,14 +8,9 @@ package net.ranides.assira.xml;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.StringWriter;
 import java.util.Arrays;
 import java.util.List;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
 import net.ranides.assira.collection.maps.MultiMap;
 import static net.ranides.assira.junit.NewAssert.*;
 import org.junit.Test;
@@ -35,12 +30,12 @@ public class XMLQueryTest {
         List<String> body = Arrays.asList("#text", "properties", "#text", "mappings", "#text", "artifacts", "#text");
         List<String> items = Arrays.asList("properties", "mappings", "artifacts");
         
-        assertEquals(root.subList(0, 3), doc.children().names().list());
-        assertEquals(root.subList(0, 2), doc.children(XMLType.PROCESSING).names().list());
-        assertEquals(root.subList(2, 3), doc.children(XMLType.ELEMENT).names().list());
+        assertEquals(root.subList(0, 3), doc.children().names());
+        assertEquals(root.subList(0, 2), doc.children(XMLType.PROCESSING).names());
+        assertEquals(root.subList(2, 3), doc.children(XMLType.ELEMENT).names());
         
-        assertEquals(body, doc.root().children().names().list());
-        assertEquals(items, doc.root().children(XMLType.ELEMENT).names().list());
+        assertEquals(body, doc.root().children().names());
+        assertEquals(items, doc.root().children(XMLType.ELEMENT).names());
         
         assertEquals("repository", doc.root().name());
     }
@@ -63,8 +58,8 @@ public class XMLQueryTest {
         
         List<String> exp1 = Arrays.asList("plugins.jar", "binary.jar", "features.jar");
         
-        assertEquals(exp1, doc.find("? //mappings/rule/@output").values().list());
-        assertEquals(exp1, doc.find("? /repository/mappings/rule/@output").values().list());
+        assertEquals(exp1, doc.find("? //mappings/rule/@output").texts());
+        assertEquals(exp1, doc.find("? /repository/mappings/rule/@output").texts());
     }
     
     @Test
@@ -77,7 +72,11 @@ public class XMLQueryTest {
         
         List<Integer> numbers = Arrays.asList(26817, 159306, 48552, 48832, 731290, 12166, 18032, 150535);
         
-        assertEquals(numbers, css.values().map(Integer::valueOf).filter(v -> 0 == v%7).limit(8).list());
+        assertEquals(numbers, css.stream(this::$int).filter(v -> 0 == v%7).limit(8).list());
+    }
+
+    private int $int(XMLElement n) throws NumberFormatException {
+        return Integer.parseInt(n.content());
     }
     
     @Test
@@ -125,10 +124,10 @@ public class XMLQueryTest {
         assertEquals("plugins.jar", attr1.text());
         assertEquals("plugins.jar", attr1.get());
         assertEquals("rule", attr1.parent().name());
-        assertEquals(Arrays.asList(), attr1.attrs().names().list());
-        assertEquals(Arrays.asList(), attr1.parent().children().names().list());
-        assertEquals(Arrays.asList("filter","output"), attr1.parent().attrs().names().list());
-        assertEquals(Arrays.asList("output", "rule", "mappings", "repository", "#document"), attr1.parents().names().list());
+        assertEquals(Arrays.asList(), attr1.attrs().names());
+        assertEquals(Arrays.asList(), attr1.parent().children().names());
+        assertEquals(Arrays.asList("filter","output"), attr1.parent().attrs().names());
+        assertEquals(Arrays.asList("output", "rule", "mappings", "repository", "#document"), attr1.parents().names());
     }
     
 }

+ 1 - 7
assira/src/test/java/net/ranides/assira/xml/XMLWriterTest.java

@@ -24,7 +24,7 @@ public class XMLWriterTest {
 
     @Test
     public void testWriter() throws IOException {
-        XMLElement doc = load(INPUT).find("? //repository/mappings").first();
+        XMLElement doc = $(INPUT).normalize().find("? //repository/mappings").first();
         doc.find("? //rule[2]/@output").first().content("under");
         
         String out1 = new XMLWriter().toString(doc);
@@ -54,10 +54,4 @@ public class XMLWriterTest {
         assertTrue(true);
     }
     
-
-    private XMLElement load(File file) {
-        return $(file).normalize().find("? //text()[normalize-space(.) = '']").each(n->n.remove()).first().root();
-    }
-    
-    
 }