jvanzyl 02/05/28 08:31:02 Modified: xo project.xml xo/src/java/org/apache/commons/xo Mapper.java xo/src/test/org/apache/commons/xo/datamodel TestDatamodelMapping.java datamodel.xml Log: Some refactoring done on the plane ride home. Doesn't really matter at this point as betwixt will replace xo completely. Revision Changes Path 1.8 +1 -1 jakarta-commons-sandbox/xo/project.xml Index: project.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/xo/project.xml,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- project.xml 11 May 2002 14:39:18 -0000 1.7 +++ project.xml 28 May 2002 15:31:02 -0000 1.8 @@ -4,7 +4,7 @@ <version>2</version> <name>commons-xo</name> <id>commons-xo</id> - <currentVersion>1.0-dev</currentVersion> + <currentVersion>0.8</currentVersion> <organization> <name>Apache Software Foundation</name> <url>http://www.apache.org</url> 1.3 +124 -100 jakarta-commons-sandbox/xo/src/java/org/apache/commons/xo/Mapper.java Index: Mapper.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/xo/src/java/org/apache/commons/xo/Mapper.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Mapper.java 4 May 2002 16:00:36 -0000 1.2 +++ Mapper.java 28 May 2002 15:31:02 -0000 1.3 @@ -82,19 +82,19 @@ * * <p> * <pre> - * <person> - * <firstName>Jason</firstName> - * <lastName>van Zyl</lastName> - * <hobbies> - * <hobby>somnambulism</hobby> - * <hobby>squash</hobby> - * </hobbies> - * <address> - * <street>50 King</street> - * <city>Guelph</city> - * <country>Canada</country> - * </address> - * </person> + * <person> + * <firstName>Jason</firstName> + * <lastName>van Zyl</lastName> + * <hobbies> + * <hobby>somnambulism</hobby> + * <hobby>squash</hobby> + * </hobbies> + * <address> + * <street>50 King</street> + * <city>Guelph</city> + * <country>Canada</country> + * </address> + * </person> * </pre> * <p> * These are some of the assumptions employed to @@ -138,24 +138,14 @@ * Simple String value to attach * </pre> * <p> + * * This class is not thread safe. * * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a> * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> - * @version $Id: Mapper.java,v 1.2 2002/05/04 16:00:36 dion Exp $ + * @version $Id: Mapper.java,v 1.3 2002/05/28 15:31:02 jvanzyl Exp $ */ -// How to use the resources package to pull in the -// XML documents. This will take care of any type specific -// issues and will allow multiple sources. - -// Element name mapping for non conformant XML that you -// want to parse anyway. - -// Jumping stages so that documents like RSS -// that don't have noun plural wrappers can still -// be parsed. Not necessary but would be nice. - public class Mapper { /** @@ -363,6 +353,9 @@ throws Exception { SAXReader xmlReader = new SAXReader(); + xmlReader.setMergeAdjacentText(true); + xmlReader.setStripWhitespaceText(true); + document = xmlReader.read(xmlInput); // Create the parent bean. @@ -388,9 +381,17 @@ // Overloads were not called, assuming classpath loading. basePath = Strings.replace(basePackage, ".", "/"); } - - // Determine the base package to use for object creation. - return treeWalk(rootElement, bean); + + Object o = treeWalk(rootElement, bean); + + if (o == null) + { + throw new Exception("Cannot create instance of " + beanClass); + } + + debug("Created instance of " + beanClass); + + return o; } /** @@ -451,28 +452,21 @@ // object (1) so that the 'street', 'city', // and 'country' properties can be populated. - // We have to check for inclusion rules and build - // and object from an external XML file if that's - // the case. - Object o = inclusion((Element) node); - + Object o = createInstance((Element) node, null); + if (o == null) { - o = createInstance((Element) node, null); - - if (o == null) - { - continue; - } - } + continue; + } // Now we have to attach the newly created object // to its parent object. if (isPlural(node.getParent().getName())) { - // Here we have the case where (A) is enclose by + // Here we have the case where (A) is enclosed by // a parent element <addresses> so we need to add // Address object to a List of Address objects. + debug("addY(): " + bean + " " + name + " " + o); addObject(bean,name,o); } else @@ -492,32 +486,18 @@ else { debug("Node " + node.getName() + " has no children"); - - Object o = null; - // We will check for the special case where a - // class name is being specified as an attribute. - if (((Element)node).attributeValue(CLASS_NAME) != null) - { - debug("Using className metadata to build object"); - - o = createInstance((Element) node, null); - debug("Created new object -> " + - o.getClass().getName()); - } - else + + // Classname mapping may happen here. + Object o = createInstance((Element) node, null); + + // Now we are dealing with elements that refer + // to a noun singular and these elements have + // no children. + + if (o == null) { - // Now we are dealing with elements that refer - // to a noun singular and these elements have - // no children. - - o = inclusion((Element) node); - Class type = null; - - if (o == null) - { - type = PropertyUtils.getPropertyType(bean,name); - o = ConvertUtils.convert(node.getText(), type); - } + Class type = PropertyUtils.getPropertyType(bean,name); + o = ConvertUtils.convert(node.getText(), type); } if (isPlural(node.getParent().getName())) @@ -534,6 +514,7 @@ // and 'squash' are added to a 'hobbies' list. We // assume a List of Strings with the above pattern. addObject(bean, name, o); + debug("addX() " + name); } else { @@ -593,43 +574,87 @@ protected Object createInstance(Element element, String className) throws Exception { - // Should probably use the factory manager. - try - { - if (className == null || className.length() == 0) - { - className = element.attributeValue(CLASS_NAME); - debug(CLASS_NAME + " attribute -> " + className); - } - return Class.forName(className).newInstance(); - } - catch (Exception noAttrib) - { - debug("Using " + className + " unsuccessful: " + noAttrib); - - // We assume here that the object that we are creating is - // in the same package as the parent object. - String nodeName = element.getName(); - if (basePackage == null) - { - throw new Exception("Base package not known and " + CLASS_NAME + - " attribute not specified (or wrong)"); - } + String nodeName = null; + Object o = null; + + if (o != null) + { + return o; + } + + if (className == null) + { + nodeName = element.getName(); + + // We need to look for the attribute 'className' first + // because we always have an element name and we don't + // want to base an object name on the element name if + // the attribute 'className' exists because it explicitly + // specifies the name to use when attempting to + // instantiating the required class. + className = element.attributeValue(CLASS_NAME); - className = (basePackage.length() == 0 ? "" : basePackage + '.') + - nodeName.substring(0, 1).toUpperCase() + nodeName.substring(1); - - // TODO: Check class name validity - try + if (className != null) { - debug("Attempting to load " + className); - return Class.forName(className).newInstance(); + o = newInstance(className); + + if (o == null) + { + debug("ERROR: incorrect className attribute."); + } + + return o; } - catch (Exception unknownClass) + + // We have to check for inclusion rules and build + // and object from an external XML file if that's + // the case. + o = inclusion(element); + + if (hasChildren(element) == false) { return null; + } + + if (className == null) + { + className = (basePackage.length() == 0 ? "" : basePackage + '.') + + nodeName.substring(0, 1).toUpperCase() + nodeName.substring(1); } } + + o = newInstance(className); + + if (o == null) + { + debug("Problem instantiating " + className); + } + + return o; + } + + private Object newInstance(String className) + { + Object instance = null; + + try + { + instance = Class.forName(className).newInstance(); + } + catch (InstantiationException ie) + { + debug("Error " + ie); + } + catch (IllegalAccessException iae) + { + debug("Error " + iae); + } + catch (ClassNotFoundException cnfe) + { + debug("Error " + cnfe); + } + + return instance; } // ------------------------------------------------------------------- @@ -653,9 +678,9 @@ */ private boolean hasChildren(Node node) { - return (((Element) node).nodeCount() > 1); + return !((Element) node).isTextOnly(); } - + /** * Does the node in question have only text? * @@ -719,7 +744,6 @@ try { String methodName = makeMethodName("add", elementName); - //Method m = introspector.getMethod(bean.getClass(), methodName, args); MethodUtils.invokeMethod(bean, methodName, value); } catch (Exception e) @@ -796,7 +820,7 @@ { return true; } - + // None of the tests detected a plural return false; } 1.2 +2 -2 jakarta-commons-sandbox/xo/src/test/org/apache/commons/xo/datamodel/TestDatamodelMapping.java Index: TestDatamodelMapping.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/xo/src/test/org/apache/commons/xo/datamodel/TestDatamodelMapping.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TestDatamodelMapping.java 16 Apr 2002 19:07:56 -0000 1.1 +++ TestDatamodelMapping.java 28 May 2002 15:31:02 -0000 1.2 @@ -42,10 +42,10 @@ m.setDebug(true); Database d = (Database) m.map(new File(TEST_DOCUMENT), TEST_CLASS); - /* // Check database properties assertTrue("bookstore".equals(d.getName())); - assertTrue("idbroker".equals(d.getIdMethod())); + + /* // Check book table assertTrue("book".equals(d.getTable(0).getName())); 1.2 +0 -1 jakarta-commons-sandbox/xo/src/test/org/apache/commons/xo/datamodel/datamodel.xml Index: datamodel.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/xo/src/test/org/apache/commons/xo/datamodel/datamodel.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- datamodel.xml 16 Apr 2002 19:07:56 -0000 1.1 +++ datamodel.xml 28 May 2002 15:31:02 -0000 1.2 @@ -2,7 +2,6 @@ <database> <name>bookstore</name> - <idMethod>idbroker</idMethod> <tables>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>