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/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.