Pārlūkot izejas kodu

fix: XML attributes map

Ranides Atterwim 10 gadi atpakaļ
vecāks
revīzija
8560933673

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

@@ -44,27 +44,27 @@ public class CElements implements XMLElements {
     
     @Override
     public Iterator<XMLElement> iterator() {
-        return stream.iterator();
+        return stream().iterator();
     }
 
     @Override
     public List<Node> nodes() {
-        return stream.map(XMLElement::node).list();
+        return stream().map(XMLElement::node).list();
     }
 
     @Override
     public List<String> names() {
-        return stream.map(XMLElement::name).list();
+        return stream().map(XMLElement::name).list();
     }
 
     @Override
     public List<String> xpaths() {
-        return stream.map(XMLElement::xpath).list();
+        return stream().map(XMLElement::xpath).list();
     }
     
     @Override
     public MultiMap<String, String> map() {
-        return stream.collect(MapCollectors.multimap(XMLElement::name, XMLElement::content));
+        return stream().collect(MapCollectors.multimap(XMLElement::name, XMLElement::content));
     }
     
     @Override
@@ -74,7 +74,7 @@ public class CElements implements XMLElements {
 
     @Override
     public List<String> contents() {
-        return stream.map(XMLElement::content).list();
+        return stream().map(XMLElement::content).list();
     }
     
     @Override
@@ -89,23 +89,23 @@ public class CElements implements XMLElements {
 
     @Override
     public List<String> texts() {
-        return stream.map(XMLElement::text).list();
+        return stream().map(XMLElement::text).list();
     }
     
     @Override
     public List<String> texts(Function<String, String> function) {
-        return stream.map(n -> function.apply(n.text())).list();
+        return stream().map(n -> function.apply(n.text())).list();
     }
     
 
     @Override
     public XMLElements attrs() {
-        return new CElements(stream.unfold(n -> n.attrs().stream()));
+        return new W3FlatAttributes(stream());
     }
 
     @Override
     public XMLElements attrs(String name) {
-        return new CElements(stream
+        return new CElements(stream()
             .map(n -> n.attrs())
             .filter(n -> n.has(name))
             .map(a -> a.first(name))
@@ -119,7 +119,7 @@ public class CElements implements XMLElements {
 
     @Override
     public int size() {
-        return stream.size();
+        return stream().size();
     }
 
     @Override
@@ -129,18 +129,18 @@ public class CElements implements XMLElements {
 
     @Override
     public <T> CQuery<T> stream(Function<? super XMLElement, ? extends T> function) {
-        return stream.map(function);
+        return stream().map(function);
     }
 
     @Override
     public XMLElements each(Consumer<? super XMLElement> consumer) {
-        stream.each(consumer);
+        stream().each(consumer);
         return this;
     }
 
     @Override
     public XMLElement first() {
-        return stream.first();
+        return stream().first();
     }
 
     @Override
@@ -151,12 +151,12 @@ public class CElements implements XMLElements {
     @Override
     public XMLElement first(Predicate<XMLContext> selector) {
         CContext c = new CContext();
-        return stream.filter(n -> c.test(n, selector)).first();
+        return stream().filter(n -> c.test(n, selector)).first();
     }
     
     @Override
     public XMLElement last() {
-        return stream.last();
+        return stream().last();
     }
 
     @Override
@@ -167,13 +167,13 @@ public class CElements implements XMLElements {
     @Override
     public XMLElement last(Predicate<XMLContext> selector) {
         CContext c = new CContext();
-        return stream.filter(n -> c.test(n, selector)).last();
+        return stream().filter(n -> c.test(n, selector)).last();
     }
 
     @Override
     public XMLElements concat(XMLElements elements) {
         return new CElements(new CQueryBuilder<XMLElement>()
-            .addQuery(stream)
+            .addQuery(stream())
             .addQuery(elements.stream()).result()
         );
     }
@@ -186,7 +186,7 @@ public class CElements implements XMLElements {
     @Override
     public XMLElements filter(Predicate<XMLContext> selector) {
         CContext c = new CContext();
-        return new CElements(stream.filter(n -> c.test(n, selector)));
+        return new CElements(stream().filter(n -> c.test(n, selector)));
     }
 
     @Override
@@ -197,7 +197,7 @@ public class CElements implements XMLElements {
     @Override
     public XMLElements discard(Predicate<XMLContext> selector) {
         CContext c = new CContext();
-        return new CElements(stream.filter(n -> !c.test(n, selector)));
+        return new CElements(stream().filter(n -> !c.test(n, selector)));
     }
 
     @Override
@@ -208,16 +208,16 @@ public class CElements implements XMLElements {
     @Override
     public XMLElements limit(Predicate<XMLContext> selector) {
         CContext c = new CContext();
-        return new CElements(stream.limit(n -> c.test(n, selector)));
+        return new CElements(stream().limit(n -> c.test(n, selector)));
     }
 
     @Override
     public boolean matches() {
-        return !stream.isEmpty();
+        return !stream().isEmpty();
     }
     
     XMLElements unfold(Function<XMLElement, XMLElements> function) {
-        return new CElements(stream.unfold(n -> function.apply(n).stream()));
+        return new CElements(stream().unfold(n -> function.apply(n).stream()));
     }
 
     @Override
@@ -259,7 +259,7 @@ public class CElements implements XMLElements {
 
     @Override
     public boolean has() {
-        return stream.matchAny(n -> n.has());
+        return stream().matchAny(n -> n.has());
     }
 
     @Override
@@ -269,13 +269,13 @@ public class CElements implements XMLElements {
 
     @Override
     public boolean has(Predicate<XMLContext> selector) {
-        return stream.matchAny(n -> n.has(selector));
+        return stream().matchAny(n -> n.has(selector));
     }
     
 
     @Override
     public XMLElements next() {
-        return new CElements(stream.map(n -> n.next()));
+        return new CElements(stream().map(n -> n.next()));
     }
 
     @Override
@@ -290,7 +290,7 @@ public class CElements implements XMLElements {
 
     @Override
     public XMLElements prev() {
-        return new CElements(stream.map(n -> n.prev()));
+        return new CElements(stream().map(n -> n.prev()));
     }
 
     @Override
@@ -320,7 +320,7 @@ public class CElements implements XMLElements {
 
     @Override
     public XMLElements parent() {
-        return new CElements(stream.map(n -> n.parent()));
+        return new CElements(stream().map(n -> n.parent()));
     }
 
     @Override

+ 111 - 0
assira/src/main/java/net/ranides/assira/xml/impl/W3FlatAttributes.java

@@ -0,0 +1,111 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+
+package net.ranides.assira.xml.impl;
+
+import java.util.AbstractMap;
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.Set;
+import net.ranides.assira.collection.maps.MultiMap;
+import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.xml.XMLElement;
+import net.ranides.assira.xml.XMLElements;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class W3FlatAttributes extends CElements {
+    
+    public W3FlatAttributes(CQuery<XMLElement> nodes) {
+        super(nodes);
+    }
+    
+    @Override
+    public CQuery<XMLElement> stream() {
+        return super.stream().unfold(n -> n.attrs().stream());
+    }
+
+    @Override
+    public XMLElements attrs() {
+        return EMPTY;
+    }
+
+    @Override
+    public XMLElements attrs(String name) {
+        return EMPTY;
+    }
+    
+    @Override
+    public MultiMap<String, String> map() {
+        return new AttrMap();
+    }
+
+    private final class AttrMap extends AbstractMap<String, String> implements MultiMap<String, String> {
+
+        @Override
+        public Set<Entry<String, String>> entrySet() {
+            return new AttrSet();
+        }
+
+        @Override
+        public Collection<String> getAll(Object key) {
+            return W3FlatAttributes.this.stream().filter(n -> n.name().equals(key)).map(n->n.content()).list();
+        }
+
+        @Override
+        public String put(String key, String value) {
+            W3FlatAttributes.super.stream().each(node -> {
+                node.attrs().append(node.document().attr(key).content(value));
+            });
+            return null;
+            
+        }
+        
+    }
+    
+    private final class AttrSet extends AbstractSet<Entry<String,String>> {
+        @Override
+        public Iterator<Entry<String, String>> iterator() {
+            return W3FlatAttributes.this.stream().<Entry<String,String>>map(n -> new AttrEntry(n)).iterator();
+        }
+        @Override
+        public int size() {
+            return W3FlatAttributes.this.stream().size();
+        }
+    }
+    
+    private static final class AttrEntry implements Entry<String,String> {
+
+        private final XMLElement element;
+
+        public AttrEntry(XMLElement element) {
+            this.element = element;
+        }
+
+        @Override
+        public String getKey() {
+            return element.name();
+        }
+
+        @Override
+        public String getValue() {
+            return element.content();
+        }
+
+        @Override
+        public String setValue(String value) {
+            String prev = element.content();
+            element.content(value);
+            return prev;
+        }
+        
+    }
+}

+ 7 - 10
assira/src/test/java/net/ranides/assira/xml/impl/W3AttributesTest.java

@@ -124,18 +124,15 @@ public class W3AttributesTest {
         assertTrue(attrs.containsValue("777"));
         assertFalse(attrs.containsValue("101"));
         
-        // @todo (assira #3.4) xml: attributes
-        // tu powinno być 777/FALSE, a siedzi stare 101/NULL
-        // bo "allmap" już wcześniej zrobiła unfold i teraz olewa DOM!
-        System.out.printf("get = %s%n", allmap.get("id"));
-        System.out.printf("get = %s%n", allmap.get("ban"));
+        assertEquals("777", allmap.get("id"));
+        assertEquals("false", allmap.get("ban"));
         
-        // tu powinno być 777,101,102,103,104,105
-        System.out.printf("all = %s%n", allmap.getAll("id"));
-        
-        System.out.printf("all = %s%n", allmap.getAll("hash"));
-        System.out.printf("all = %s%n", allmap.getAll(888));
+        allmap.put("extra", "19");
         
+        assertEquivalent(Arrays.asList("777","102","103","104","105"), allmap.getAll("id"));
+        assertEquivalent(Arrays.asList("false"), allmap.getAll("ban"));
+        assertEquivalent(Arrays.asList(), allmap.getAll("hash"));
+        assertEquivalent(Arrays.asList(), allmap.getAll(888));
         
         String out = new XMLWriter().indent(4).toString(doc.find("users").first());
         String exp = IOStrings.read(TestFiles.XML_ATTR, Charsets.UTF_8);

+ 0 - 11
assira/src/test/java/net/ranides/assira/xml/impl/W3DocumentTest.java

@@ -92,19 +92,8 @@ public class W3DocumentTest {
         String exp = IOStrings.read(TestFiles.XML_DOC, Charsets.UTF8);
         String out = new XMLWriter().indent(4).toString(doc);
         
-        
-//        System.out.printf("%s%n", out);
         assertEquals(exp, out);
         
-        // @todo (assira #3.4) xml: attributes
-        // ogólnie to po prostu powinniśmy mieć W3Attributes oraz CFlatAttributes
-        // CFlatAttributes zamiast CElements, które do bani to traktuje nam
-        // teraz w zasadzie nie można niczego sensownego zrobić w takiej sytuacji:
-        //      doc.find("tag") ... attrs() ... ACTION
-        // bo zawsze action zostanie przekazane co CElements, które źle traktuje atrybutu (unfoldnęło je)
-        
-//        doc.find("head meta").attrs().append(doc.document().attr("name"));
-        
         // @todo (assira #3.5) xml: namespaces
         // nie umiemy wstawiać elementów z namespace'ami
         // w ogóle nie umiemy konfigurować dokumentu w kwestii NS

+ 5 - 5
assira/src/test/resources/xml/attr.xml

@@ -1,24 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <users>
-    <user active="true" ban="false" id="777" public="true">
+    <user active="true" ban="false" extra="19" id="777" public="true">
         <login>ranides</login>
         <password>C2A7B5</password>
         <name>Ranides Atterwim</name>
         <mail>ranides@ccms.net</mail>
         <mail type="private">contact@ranides.net</mail>
     </user>
-    <user active="true" id="102" uid="8721">
+    <user active="true" extra="19" id="102" uid="8721">
         <login>admin</login>
         <password>F76A33</password>
         <name>undefined</name>
         <mail>admin@ccms.net</mail>
     </user>
-    <user active="false" id="103" uid="7542">
+    <user active="false" extra="19" id="103" uid="7542">
         <login>guest</login>
         <password>E4C156</password>
         <name>undefined</name>
     </user>
-    <user active="false" id="104" uid="1952">
+    <user active="false" extra="19" id="104" uid="1952">
         <login>owner</login>
         <password>AC3750</password>
         <name>Tom</name>
@@ -26,7 +26,7 @@
         <mail type="private">tom@domain.com</mail>
         <mail type="office">office@ccms.net</mail>
     </user>
-    <user active="true" id="105" public="true" uid="3773">
+    <user active="true" extra="19" id="105" public="true" uid="3773">
         <login>saren</login>
         <password>D046A3</password>
         <name>Sarenka</name>