cvs commit: spice/sandbox/metaclass/src/java/org/realityforge/metaclass/io DOMMetaClassDeserializer.java
Peter Donald <[email protected]>
| Newsgroups | gmane.comp.java.spice.cvs |
|---|---|
| Message-ID | <[email protected]> |
donaldp 03/10/29 02:27:27
Added: sandbox/metaclass/src/java/org/realityforge/metaclass/io
DOMMetaClassDeserializer.java
Log:
Initial cut at undocumented, un unit tested, unworking deserialization of descriptor from XML file
Revision Changes Path
1.1 spice/sandbox/metaclass/src/java/org/realityforge/metaclass/io/DOMMetaClassDeserializer.java
Index: DOMMetaClassDeserializer.java
===================================================================
/*
* Copyright (C) The Spice Group. All rights reserved.
*
* This software is published under the terms of the Spice
* Software License version 1.1, a copy of which has been included
* with this distribution in the LICENSE.txt file.
*/
package org.realityforge.metaclass.io;
import java.util.ArrayList;
import java.util.Properties;
import org.realityforge.metaclass.model.Attribute;
import org.realityforge.metaclass.model.ClassDescriptor;
import org.realityforge.metaclass.model.FieldDescriptor;
import org.realityforge.metaclass.model.MethodDescriptor;
import org.realityforge.metaclass.model.ParameterDescriptor;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
*
* @author <a href="mailto:peter at realityforge.org">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2003/10/29 10:27:26 $
*/
public class DOMMetaClassDeserializer
{
public ClassDescriptor buildClassDescriptor( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.CLASS_ELEMENT );
final String type =
expectAttribute( element, SAXMetaClassSerializer.TYPE_ATTRIBUTE );
Attribute[] attributes = Attribute.EMPTY_SET;
MethodDescriptor[] methods = MethodDescriptor.EMPTY_SET;
FieldDescriptor[] fields = FieldDescriptor.EMPTY_SET;
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
final String childName = node.getNodeName();
if( childName.equals( SAXMetaClassSerializer.METHODS_ELEMENT ) )
{
methods = buildMethods( (Element)node );
}
else if( childName.equals( SAXMetaClassSerializer.FIELDS_ELEMENT ) )
{
fields = buildFields( (Element)node );
}
else
{
attributes = buildAttributes( element );
}
}
}
return new ClassDescriptor( type,
attributes,
attributes,
fields,
methods );
}
MethodDescriptor[] buildMethods( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.METHODS_ELEMENT );
final ArrayList methods = new ArrayList();
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
final MethodDescriptor field = buildMethod( (Element)node );
methods.add( field );
}
}
return (MethodDescriptor[])methods.
toArray( new MethodDescriptor[ methods.size() ] );
}
MethodDescriptor buildMethod( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.METHOD_ELEMENT );
final String name =
expectAttribute( element, SAXMetaClassSerializer.NAME_ATTRIBUTE );
final String type =
expectAttribute( element, SAXMetaClassSerializer.TYPE_ATTRIBUTE );
Attribute[] attributes = Attribute.EMPTY_SET;
ParameterDescriptor[] parameters = ParameterDescriptor.EMPTY_SET;
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
final String childName = node.getNodeName();
if( childName.equals( SAXMetaClassSerializer.PARAMETERS_ELEMENT ) )
{
parameters = buildParameters( (Element)node );
}
else
{
attributes = buildAttributes( element );
}
}
}
return new MethodDescriptor( name, type, parameters, attributes, attributes );
}
ParameterDescriptor[] buildParameters( Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.PARAMETERS_ELEMENT );
final ArrayList parameters = new ArrayList();
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
final ParameterDescriptor parameter =
buildParameter( (Element)node );
parameters.add( parameter );
}
}
return (ParameterDescriptor[])parameters.
toArray( new ParameterDescriptor[ parameters.size() ] );
}
ParameterDescriptor buildParameter( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.PARAMETER_ELEMENT );
final String name =
expectAttribute( element, SAXMetaClassSerializer.NAME_ATTRIBUTE );
final String type =
expectAttribute( element, SAXMetaClassSerializer.TYPE_ATTRIBUTE );
return new ParameterDescriptor( name, type );
}
FieldDescriptor[] buildFields( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.FIELDS_ELEMENT );
final ArrayList fields = new ArrayList();
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
final FieldDescriptor field = buildField( (Element)node );
fields.add( field );
}
}
return (FieldDescriptor[])fields.
toArray( new FieldDescriptor[ fields.size() ] );
}
FieldDescriptor buildField( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.FIELD_ELEMENT );
final String name =
expectAttribute( element, SAXMetaClassSerializer.NAME_ATTRIBUTE );
final String type =
expectAttribute( element, SAXMetaClassSerializer.TYPE_ATTRIBUTE );
Attribute[] attributes = Attribute.EMPTY_SET;
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
attributes = buildAttributes( element );
}
}
return new FieldDescriptor( name, type, attributes, attributes );
}
Attribute[] buildAttributes( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.ATTRIBUTES_ELEMENT );
final ArrayList attributes = new ArrayList();
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
final Attribute attribute = buildAttribute( (Element)node );
attributes.add( attribute );
}
}
return (Attribute[])attributes.
toArray( new Attribute[ attributes.size() ] );
}
Attribute buildAttribute( final Element element )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.ATTRIBUTE_ELEMENT );
final String name =
expectAttribute( element, SAXMetaClassSerializer.NAME_ATTRIBUTE );
final StringBuffer sb = new StringBuffer();
final Properties parameters = new Properties();
final NodeList nodes = element.getChildNodes();
final int length = nodes.getLength();
for( int i = 0; i < length; i++ )
{
final Node node = nodes.item( i );
final short nodeType = node.getNodeType();
if( nodeType == Node.ELEMENT_NODE )
{
buildParam( (Element)node, parameters );
}
else if( nodeType == Node.TEXT_NODE ||
nodeType == Node.CDATA_SECTION_NODE )
{
final String value = node.getNodeValue();
sb.append( value );
}
}
final String value = sb.toString().trim();
if( 0 != value.length() &&
0 < parameters.size() )
{
final String message =
"Attribute named " + name +
"specified both a value (" + value + ") " +
"and parameters (" + parameters + ").";
throw new Exception( message );
}
if( null == value )
{
return new Attribute( name, parameters );
}
else
{
return new Attribute( name, value );
}
}
void buildParam( final Element element,
final Properties parameters )
throws Exception
{
expectElement( element, SAXMetaClassSerializer.PARAM_ELEMENT );
final String name =
expectAttribute( element, SAXMetaClassSerializer.NAME_ATTRIBUTE );
final String value =
expectAttribute( element, SAXMetaClassSerializer.VALUE_ATTRIBUTE );
parameters.setProperty( name, value );
}
void expectElement( final Element element,
final String expected )
throws Exception
{
final String actual = element.getTagName();
if( !actual.equals( expected ) )
{
final String message = "Unexpected element. " +
"Expected: " + expected + ". Actual: " + actual +
" @ " + getPathDescription( element ) + ".";
throw new Exception( message );
}
}
String expectAttribute( final Element element,
final String expected )
throws Exception
{
final String actual = element.getAttribute( expected );
if( null == actual )
{
final String message =
"Element named " + element.getTagName() +
" missing attribute named " + expected +
" @ " + getPathDescription( element ) + ".";
throw new Exception( message );
}
return actual;
}
String getPathDescription( final Element cause )
{
final StringBuffer sb = new StringBuffer();
Element element = cause;
while( true )
{
sb.insert( 0, element.getNodeName() + "/" );
final Node parentNode = element.getParentNode();
if( parentNode instanceof Element )
{
element = (Element)parentNode;
}
else
{
break;
}
}
return sb.toString();
}
}
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive? Does it
help you create better code? SHARE THE LOVE, and help us help
YOU! Click Here: http://sourceforge.net/donate/