Repository: incubator-juneau
Updated Branches:
  refs/heads/master dba656f35 -> 22b24ff57


JUNEAU-33 - HTML5 DOM objects.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/22b24ff5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/22b24ff5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/22b24ff5

Branch: refs/heads/master
Commit: 22b24ff57f395fc939e70a0a335471811c24edb2
Parents: dba656f
Author: JamesBognar <[email protected]>
Authored: Thu Feb 2 21:04:16 2017 -0500
Committer: JamesBognar <[email protected]>
Committed: Thu Feb 2 21:04:16 2017 -0500

----------------------------------------------------------------------
 .../juneau/dto/html5/HtmlTemplatesTest.java     | 173 +++++++++++++++++++
 .../main/java/org/apache/juneau/Swappable.java  |  44 -----
 .../apache/juneau/dto/html5/HtmlElement.java    |  13 ++
 .../org/apache/juneau/transform/PojoSwap.java   |   4 +-
 .../org/apache/juneau/xml/XmlSerializer.java    |   5 +
 5 files changed, 193 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/22b24ff5/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/HtmlTemplatesTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/HtmlTemplatesTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/HtmlTemplatesTest.java
new file mode 100644
index 0000000..93073bc
--- /dev/null
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/HtmlTemplatesTest.java
@@ -0,0 +1,173 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.dto.html5;
+
+import static org.junit.Assert.*;
+import static org.apache.juneau.dto.html5.HtmlBuilder.*;
+
+import java.util.*;
+
+import org.apache.juneau.BeanSession;
+import org.apache.juneau.annotation.Bean;
+import org.apache.juneau.html.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.xml.*;
+import org.junit.*;
+import org.junit.runner.*;
+import org.junit.runners.*;
+
+
+@RunWith(Parameterized.class)
+@SuppressWarnings({"javadoc"})
+public class HtmlTemplatesTest {
+
+       private static final WriterSerializer
+               sXmlSq = XmlSerializer.DEFAULT_SQ,
+               sXmlNsSq = XmlSerializer.DEFAULT_NS_SQ,
+               sXmlSqReadable = XmlSerializer.DEFAULT_SQ_READABLE,
+               sHtmlSq = HtmlSerializer.DEFAULT_SQ,
+               sHtmlSqReadable = HtmlSerializer.DEFAULT_SQ_READABLE;
+
+       private static final ReaderParser
+               pXml = XmlParser.DEFAULT,
+               pHtml = HtmlParser.DEFAULT;
+
+       @Parameterized.Parameters
+       public static Collection<Object[]> getParameters() {
+               return Arrays.asList(new Object[][] {
+                       {
+                               "FormTemplate-1",
+                               new FormTemplate("myaction", "foo", "bar"),
+                               "<form action='myaction'><input type='text' 
name='v1' value='foo'/><input type='text' name='v2' value='bar'/></form>",
+                               "<form action='myaction'><input type='text' 
name='v1' value='foo'/><input type='text' name='v2' value='bar'/></form>\n",
+                               "<form action='myaction'><input type='text' 
name='v1' value='foo'/><input type='text' name='v2' value='bar'/></form>",
+                               "<form action='myaction'><input type='text' 
name='v1' value='foo'/><input type='text' name='v2' value='bar'/></form>\n",
+                       },
+               });
+       }
+
+       
+       @Bean(beanDictionary=HtmlBeanDictionary.class)
+       public static class FormTemplate {
+               
+               private String action;
+               private String value1, value2;
+               
+               public FormTemplate(Form f) {
+                       this.action = f.getAttr("action");
+                       this.value1 = 
((Input)f.getChildren().get(0)).getAttr("value");
+                       this.value2 = 
((Input)f.getChildren().get(1)).getAttr("value");
+               }
+               
+               public FormTemplate(String action, String value1, String 
value2) {
+                       this.action = action;
+                       this.value1 = value1;
+                       this.value2 = value2;
+               }
+               
+               public Form swap(BeanSession session) {
+                       return form(action,
+                               input("text").name("v1").value(value1),
+                               input("text").name("v2").value(value2)
+                       );
+               }
+       }
+       
+
+       private String label, xml, xmlr, html, htmlr;
+       private Object in;
+
+       public HtmlTemplatesTest(String label, Object in, String xml, String 
xmlr, String html, String htmlr) throws Exception {
+               this.label = label;
+               this.in = in;
+               this.xml = xml;
+               this.xmlr = xmlr;
+               this.html = html;
+               this.htmlr = htmlr;
+       }
+
+       private void testSerialize(WriterSerializer s, String expected) throws 
Exception {
+               try {
+                       String r = s.serialize(in);
+                       assertEquals(label + " serialize-normal failed", 
expected, r);
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new AssertionError(label + " test failed", e);
+               }
+       }
+
+       private void testParse(WriterSerializer s, ReaderParser p, String 
expected) throws Exception {
+               try {
+                       String r = s.serialize(in);
+                       Object o = p.parse(r, in == null ? Object.class : 
in.getClass());
+                       r = s.serialize(o);
+                       assertEquals(label + " parse-normal failed", expected, 
r);
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new AssertionError(label + " test failed", e);
+               }
+       }
+
+       @Test
+       public void serializeXmlDefaultSq() throws Exception {
+               testSerialize(sXmlSq, xml);
+       }
+
+       @Test
+       public void parseXmlDefaultSq() throws Exception {
+               testParse(sXmlSq, pXml, xml);
+       }
+
+       @Test
+       public void serializeXmlDefaultNsSq() throws Exception {
+               testSerialize(sXmlNsSq, xml);
+       }
+
+       @Test
+       public void parseXmlDefaultNsSq() throws Exception {
+               testParse(sXmlNsSq, pXml, xml);
+       }
+
+       @Test
+       public void serializeHtmlDefaultSq() throws Exception {
+               testSerialize(sHtmlSq, html);
+       }
+
+       @Test
+       public void parseHtmlDefaultSq() throws Exception {
+               testParse(sHtmlSq, pHtml, html);
+       }
+
+       @Test
+       public void serializeXmlDefaultSqReadable() throws Exception {
+               testSerialize(sXmlSqReadable, xmlr);
+       }
+
+       @Test
+       public void parseXmlDefaultSqReadable() throws Exception {
+               testParse(sXmlSqReadable, pXml, xmlr);
+       }
+
+       @Test
+       public void serializeHtmlDefaultSqReadable() throws Exception {
+               testSerialize(sHtmlSqReadable, htmlr);
+       }
+
+       @Test
+       public void parseHtmlDefaultSqReadable() throws Exception {
+               testParse(sHtmlSqReadable, pHtml, htmlr);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/22b24ff5/juneau-core/src/main/java/org/apache/juneau/Swappable.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/Swappable.java 
b/juneau-core/src/main/java/org/apache/juneau/Swappable.java
deleted file mode 100644
index 46a15a1..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/Swappable.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau;
-
-/**
- * Identifies a class that gets swapped out for another class during 
serialization.
- * <p>
- * *** This feature has not yet been implemented ***
- * <p>
- * Allows fine-tuned controlling of serialization of classes by allowing you 
to create a surrogate
- * form of the class that then gets serialized instead of the original class.
- * <p>
- * During serialization, the {@link #swap(BeanSession)} method is used to 
convert this object into a serialized
- * form.
- * <p>
- * Serialized form can be any object that can be serialized by this framework.
- * <p>
- * Parsing back into the original object can be accomplished by specifying a 
public constructor that takes in
- * a single parameter of type T.
- *
- * @param <T> The class of the serialized form of this class.
- */
-public interface Swappable<T> {
-
-       /**
-        * Method to implement that converts this object to a surrogate 
serialized form.
-        *
-        * @param session The current bean session.
-        *      For example, you can use this to access the media type (e.g. 
<js>"application/json"</js>) and return
-        *      different values for different media types.
-        * @return The surrogate object.
-        */
-       public T swap(BeanSession session);
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/22b24ff5/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
index cdbdfed..69a2023 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.xml.annotation.XmlFormat.*;
 import java.util.*;
 
 import org.apache.juneau.html.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.xml.annotation.*;
 
 /**
@@ -62,6 +63,18 @@ public abstract class HtmlElement {
                return this;
        }
 
+       /**
+        * Returns the attribute with the specified name.
+        *
+        * @param key The attribute name.
+        * @return The attribute value, or <jk>null</jk> if the named attribute 
does not exist.
+        */
+       public String getAttr(String key) {
+               if (attrs == null)
+                       return null;
+               return StringUtils.toString(attrs.get(key));
+       }
+
        /**
         * <a class='doclink' 
href='https://www.w3.org/TR/html5/editing.html#the-accesskey-attribute'>accesskey</a>
 attribute.
         * @param accesskey - The new value for this attribute.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/22b24ff5/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
index f9027ec..ec97dd8 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
@@ -107,8 +107,8 @@ public abstract class PojoSwap<T,S> {
         */
        @SuppressWarnings("unchecked")
        protected PojoSwap() {
-               normalClass = 
(Class<T>)ClassUtils.resolveParameterType(PojoSwap.class, 0, this);
-               swapClass = ClassUtils.resolveParameterType(PojoSwap.class, 1, 
this);
+               normalClass = 
(Class<T>)ClassUtils.resolveParameterType(PojoSwap.class, 0, this.getClass());
+               swapClass = ClassUtils.resolveParameterType(PojoSwap.class, 1, 
this.getClass());
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/22b24ff5/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
index fc8385f..006b32d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
@@ -351,7 +351,12 @@ public class XmlSerializer extends WriterSerializer {
                }
 
                String resolvedDictionaryName = isExpectedType ? null : 
aType.getResolvedDictionaryName();
+
+               // Note that the dictionary name may be specified on the actual 
type or the serialized type.
+               // HTML templates will have them defined on the serialized type.
                String dictionaryName = aType.getDictionaryName();
+               if (dictionaryName == null)
+                       dictionaryName = sType.getDictionaryName();
 
                // char '\0' is interpreted as null.
                if (o != null && sType.isChar() && ((Character)o).charValue() 
== 0)

Reply via email to