[Practicalxml-commits] SF.net SVN: practicalxml:[120] branches/dev-1.1/src
Brought to you by:
kdgregory
From: Auto-Generated S. C. M. <pra...@li...> - 2009-08-18 20:25:55
|
Revision: 120 http://practicalxml.svn.sourceforge.net/practicalxml/?rev=120&view=rev Author: kdgregory Date: 2009-08-18 20:25:47 +0000 (Tue, 18 Aug 2009) Log Message: ----------- refactoring - introduce ConversionStrings Modified Paths: -------------- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlDriver.java branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Xml2BeanDriver.java branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/DomUtilToo.java branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/TestXml2BeanDriver.java Added Paths: ----------- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/ConversionStrings.java Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java 2009-08-18 19:54:24 UTC (rev 119) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlAppenders.java 2009-08-18 20:25:47 UTC (rev 120) @@ -19,6 +19,7 @@ import net.sf.practicalxml.DomUtil; import net.sf.practicalxml.converter.ConversionException; +import net.sf.practicalxml.converter.internal.ConversionStrings; import net.sf.practicalxml.converter.internal.DomUtilToo; @@ -168,7 +169,7 @@ { Element child = super.appendValue(name, type, value); if (child != null) - child.setAttribute("index", String.valueOf(_index++)); + child.setAttribute(ConversionStrings.AT_ARRAY_INDEX, String.valueOf(_index++)); return child; } } @@ -198,9 +199,9 @@ } else { - child = super.appendValue("data", type, value); + child = super.appendValue(ConversionStrings.EL_COLLECTION_ITEM, type, value); if (child != null) - child.setAttribute("key", name); + child.setAttribute(ConversionStrings.AT_MAP_KEY, name); } return child; } Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlDriver.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlDriver.java 2009-08-18 19:54:24 UTC (rev 119) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Bean2XmlDriver.java 2009-08-18 20:25:47 UTC (rev 120) @@ -29,6 +29,7 @@ import net.sf.practicalxml.DomUtil; import net.sf.practicalxml.converter.ConversionException; import net.sf.practicalxml.converter.bean.Bean2XmlAppenders.*; +import net.sf.practicalxml.converter.internal.ConversionStrings; import net.sf.practicalxml.converter.internal.DomUtilToo; import net.sf.practicalxml.converter.internal.PrimitiveConversionHelper; @@ -117,12 +118,6 @@ } - private String getJavaXsiType(Object obj) - { - return "java:" + obj.getClass().getName(); - } - - /** * Introduces the XML Schema Instance namespace into the DOM tree using a * meaningless attribute. The Xerces serializer does not attempt to promote @@ -171,13 +166,13 @@ if (!array.getClass().isArray()) return false; - Element parent = appender.appendContainer(name, getJavaXsiType(array)); + Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(array)); Appender childAppender = new IndexedAppender(parent, _options); int length = Array.getLength(array); for (int idx = 0 ; idx < length ; idx++) { Object value = Array.get(array, idx); - convert(value, "data", childAppender); + convert(value, ConversionStrings.EL_COLLECTION_ITEM, childAppender); } return true; } @@ -188,7 +183,7 @@ if (!(obj instanceof Map)) return false; - Element parent = appender.appendContainer(name, getJavaXsiType(obj)); + Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(obj)); Appender childAppender = new MapAppender(parent, _options); for (Map.Entry<?,?> entry : ((Map<?,?>)obj).entrySet()) { @@ -203,11 +198,11 @@ if (!(obj instanceof Collection)) return false; - Element parent = appender.appendContainer(name, getJavaXsiType(obj)); + Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(obj)); Appender childAppender = new IndexedAppender(parent, _options); for (Object value : (Collection<?>)obj) { - convert(value, "data", childAppender); + convert(value, ConversionStrings.EL_COLLECTION_ITEM, childAppender); } return true; } @@ -215,7 +210,7 @@ private boolean tryToConvertAsBean(Object bean, String name, Appender appender) { - Element parent = appender.appendContainer(name, getJavaXsiType(bean)); + Element parent = appender.appendContainer(name, DomUtilToo.getXsiTypeForJavaObject(bean)); Appender childAppender = new BasicAppender(parent, _options); try { Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Xml2BeanDriver.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Xml2BeanDriver.java 2009-08-18 19:54:24 UTC (rev 119) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/bean/Xml2BeanDriver.java 2009-08-18 20:25:47 UTC (rev 120) @@ -35,6 +35,7 @@ import net.sf.practicalxml.DomUtil; import net.sf.practicalxml.converter.ConversionException; +import net.sf.practicalxml.converter.internal.ConversionStrings; import net.sf.practicalxml.converter.internal.DomUtilToo; import net.sf.practicalxml.converter.internal.PrimitiveConversionHelper; import net.sf.practicalxml.internal.StringUtils; @@ -84,8 +85,6 @@ // Internal Conversion Methods //---------------------------------------------------------------------------- - - /** * Attempts to convert the passed DOM subtree into an object of the * specified class. Note that this version does not use generics, @@ -184,7 +183,7 @@ List<Element> children = DomUtil.getChildren(elem); for (Element child : children) { - String key = child.getAttribute("key"); + String key = child.getAttribute(ConversionStrings.AT_MAP_KEY); if (StringUtils.isEmpty(key)) key = DomUtil.getLocalName(child); Class<?> childClass = getClassFromXsiType(child); @@ -244,9 +243,9 @@ if (xsiType == null) return null; - if (xsiType.startsWith("java:")) + String javaType = DomUtilToo.getJavaClassFromXsiType(xsiType); + if (javaType != null) { - String javaType = xsiType.substring(5); try { return Class.forName(javaType); @@ -257,6 +256,7 @@ "invalid Java type specification: " + javaType, elem, ee); } } + return _helper.getJavaType(xsiType); } Added: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/ConversionStrings.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/ConversionStrings.java (rev 0) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/ConversionStrings.java 2009-08-18 20:25:47 UTC (rev 120) @@ -0,0 +1,47 @@ +// Copyright 2008-2009 severally by the contributors +// +// Licensed 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 net.sf.practicalxml.converter.internal; + + +/** + * Contains constants for various string values used by the conversion + * routines. The goal is to have all converters use the same strings + * (without typos) in the same location. + */ +public class ConversionStrings +{ + /** + * Element name used to hold unnamed items from collections and arrays. + */ + public final static String EL_COLLECTION_ITEM = "data"; + + + /** + * Attribute used to hold the element index number for collections and arrays. + */ + public final static String AT_ARRAY_INDEX = "index"; + + + /** + * Attribute used to hold the item key value for maps. + */ + public final static String AT_MAP_KEY = "key"; + + + /** + * Used to prefix Java type names in an <code>xsi:type</code> attribute. + */ + public final static String JAVA_TYPE_PREFIX = "java:"; +} Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/DomUtilToo.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/DomUtilToo.java 2009-08-18 19:54:24 UTC (rev 119) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/internal/DomUtilToo.java 2009-08-18 20:25:47 UTC (rev 120) @@ -27,7 +27,7 @@ * are not generally useful to anyone who isn't writing a converter. But if you * are writing a converter, you'll probably use them a lot ... * <p> - * Note: where methods in this class reference a namespaced element or attribute + * Note: where methods in this class reference a namespaced element or attribute * (eg, <code>xsi:type</code>), they do not use a prefix unless explicitly noted. * This prevents the possibility of collisions, where the same prefix is used * elsewhere in the DOM for elements not managed by the converter. A serializer @@ -36,44 +36,80 @@ public class DomUtilToo { /** + * Sets the <code>xsi:nil</code> attribute to the passed value. + */ + public static void setXsiNil(Element elem, boolean isNil) + { + String value = isNil ? "true" : "false"; + elem.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil", value); + } + + + /** + * Returns the value of the <code>xsi:nil</code> attribute on the passed + * element, <code>false</code> if the attribute is not set. + */ + public static boolean getXsiNil(Element elem) + { + String attr = elem.getAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil"); + return attr.equals("true"); + } + + + /** * Sets the <code>xsi:type</code> attribute to the passed value. */ public static void setXsiType(Element elem, String xsiType) { elem.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "type", xsiType); } - - + + /** * Returns the value of the <code>xsi:type</code> attribute on the passed * element, <code>null</code> if the attribute is not set. */ public static String getXsiType(Element elem) - { + { String xsiType = elem.getAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "type"); return StringUtils.isEmpty(xsiType) ? null : xsiType; } - - + + /** - * Sets the <code>xsi:nil</code> attribute to the passed value. + * Returns the Java classname corresponding to an <code>xsi:type</code> + * value, <code>null</code> if the attribute is missing or doesn't follow + * the pattern for Java type names. */ - public static void setXsiNil(Element elem, boolean isNil) + public static String getJavaClassFromXsiType(String xsiType) { - String value = isNil ? "true" : "false"; - elem.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil", value); + if (!xsiType.startsWith(ConversionStrings.JAVA_TYPE_PREFIX)) + return null; + return xsiType.substring(ConversionStrings.JAVA_TYPE_PREFIX.length()); } - - + + /** - * Returns the value of the <code>xsi:nil</code> attribute on the passed - * element, <code>false</code> if the attribute is not set. + * Returns the type name to be stored in <code>xsi:type</code> for a Java + * class (this is a companion to {@link #getJavaClassFromXsiType}). */ - public static boolean getXsiNil(Element elem) + public static String getXsiTypeForJavaObject(Class<?> klass) { - String attr = elem.getAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil"); - return attr.equals("true"); + return ConversionStrings.JAVA_TYPE_PREFIX + klass.getName(); } + + + /** + * Returns the type name to be stored in <code>xsi:type</code> for a Java + * object (this is actually used more than the alternate version). Will + * return empty string if passed <code>null</code>. + */ + public static String getXsiTypeForJavaObject(Object obj) + { + return (obj == null) + ? "" + : getXsiTypeForJavaObject(obj.getClass()); + } } Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/TestXml2BeanDriver.java =================================================================== --- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/TestXml2BeanDriver.java 2009-08-18 19:54:24 UTC (rev 119) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/TestXml2BeanDriver.java 2009-08-18 20:25:47 UTC (rev 120) @@ -700,10 +700,9 @@ public void testReadOnlyBean() throws Exception { - Xml2BeanDriver driver = new Xml2BeanDriver(); Element data = createTestData( element("sval", text("foo"))); - + Xml2BeanDriver driver = new Xml2BeanDriver(); assertConversionFailure("converted bean without setter", driver, data, ReadOnlyBean.class); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |