Package org.w3c.tools.resources.serialization.xml

Source Code of org.w3c.tools.resources.serialization.xml.XMLReader

// XMLReader.java
// $Id: XMLReader.java,v 1.10 2007/04/04 12:22:30 ylafon Exp $
// (c) COPYRIGHT MIT, INRIA and Keio, 1999.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.tools.resources.serialization.xml;

import java.io.IOException;
import java.io.Reader;

import java.util.Vector;
import java.util.Hashtable;
import java.util.Stack;

import org.xml.sax.AttributeList;
import org.xml.sax.HandlerBase;
import org.xml.sax.InputSource;
import org.xml.sax.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import org.w3c.tools.resources.Resource;
import org.w3c.tools.resources.AttributeHolder;
import org.w3c.tools.resources.UnknownResource;
import org.w3c.tools.resources.ResourceFrame;
import org.w3c.tools.resources.Attribute;
import org.w3c.tools.resources.SimpleAttribute;
import org.w3c.tools.resources.ArrayAttribute;
import org.w3c.tools.resources.serialization.SerializationException;

/**
* @version $Revision: 1.10 $
* @author  Beno�t Mah� (bmahe@w3.org)
*/
public class XMLReader extends HandlerBase implements JigXML{

    Parser          parser           = null;
    AttributeHolder holders[]        = null;
    Reader          reader           = null;
    Stack           resourceSetStack = null;
    Stack           resourceStack    = null;
    Stack           defsStack        = null;
    SimpleAttribute currentS         = null;
    ArrayAttribute  currentA         = null;
    Stack           faNameStack      = null;
    int             length           = -1;
    boolean         isavalue         = false;
    String          array[]          = null;
    int             arrayidx         = -1;
    StringBuffer    characters       = null;
    String          charvalue        = null;

    public void startElement(String name, AttributeList attributes)
  throws SAXException
    {
  endCharacters();
  String iname = name.intern();
  if (iname == iRESOURCE_TAG) {
      String resourceclass = attributes.getValue(CLASS_ATTR);
      try {
    Class c = Class.forName(resourceclass);
    resourceStack.push(c.newInstance());
      } catch (Exception ex) {
    UnknownResource unknown = new UnknownResource();
    resourceStack.push(unknown);
      }
      Hashtable defs = new Hashtable(5);
      defsStack.push(defs);
  } else if (iname == iATTRIBUTE_TAG) {
      String attrclass = attributes.getValue(CLASS_ATTR);
      try {
    Class c = Class.forName(attrclass);
    currentS = (SimpleAttribute) c.newInstance();
    currentS.setName(attributes.getValue(NAME_ATTR));
    currentS.setFlag(attributes.getValue(FLAG_ATTR));
      } catch (Exception ex) {
    ex.printStackTrace();
    currentS = null;
      }
  } else if (iname == iARRAY_TAG) {
      String attrclass = attributes.getValue(CLASS_ATTR);
      try {
    Class c  = Class.forName(attrclass);
    currentA = (ArrayAttribute) c.newInstance();
    currentA.setName(attributes.getValue(NAME_ATTR));
    currentA.setFlag(attributes.getValue(FLAG_ATTR));
    length   = Integer.parseInt(attributes.getValue(LENGTH_ATTR));
    array    = new String[length];
    arrayidx = 0;
      } catch (Exception ex) {
    ex.printStackTrace();
    currentA = null;
      }
  } else if (iname == iRESARRAY_TAG) {
      resourceSetStack.push(new Vector(10));
      faNameStack.push(attributes.getValue(NAME_ATTR));
  } else if (iname == iVALUE_TAG) {
      isavalue = true;
  }
    }

    public void endElement(String name)
  throws SAXException
    {
  endCharacters();
  String iname = name.intern();
  if (iname == iRESOURCE_TAG) {
      AttributeHolder res = (AttributeHolder)resourceStack.pop();
      res.pickleValues((Hashtable)defsStack.pop());
      Vector vresources = (Vector)resourceSetStack.peek();
      vresources.addElement(res);
  } else if (iname == iATTRIBUTE_TAG) {
      currentS = null;
  } else if (iname == iARRAY_TAG) {
      Hashtable defs = (Hashtable)defsStack.peek();
      Object value = currentA.unpickle(array);
      if (value != null)
    defs.put(currentA.getName(), value);
      currentA = null;
  } else if (iname == iRESARRAY_TAG) {
      Hashtable defs = (Hashtable)defsStack.peek();
      Vector vframes = (Vector) resourceSetStack.pop();
      ResourceFrame frames[] = new ResourceFrame[vframes.size()];
      vframes.copyInto(frames);
      defs.put((String)faNameStack.pop(), frames);
  } else if (iname == iVALUE_TAG) {
      isavalue = false;
  }
    }

    public void startDocument()
  throws SAXException
    {
  defsStack        = new Stack();
  faNameStack      = new Stack();
  resourceStack    = new Stack();
  resourceSetStack = new Stack();
  resourceSetStack.push(new Vector(10));
    }

    public void endDocument()
  throws SAXException
    {
  Vector vresources = (Vector) resourceSetStack.pop();
  holders = new AttributeHolder[vresources.size()];
  vresources.copyInto(holders);
  try {
      reader.close();
  } catch (IOException ex) {
      ex.printStackTrace();
  }
    }
  
    public void characters(char ch[],
         int start,
         int length)
  throws SAXException
    {
  if (charvalue == null) {
      charvalue = new String(ch, start, length);
  } else if (length > 0) {
      if (characters == null) {
    characters = new StringBuffer(charvalue);
      }
      characters.append(ch, start, length);
  }
    }

    private void endCharacters() {
  String value;
  if (charvalue == null) {
      return;
  }
  if (characters == null) {
      value = charvalue;
  } else {
      value = characters.toString();
  }
  characters = null;
  charvalue  = null;
  if (currentS != null) {
      Hashtable defs = (Hashtable)defsStack.peek();
      if (! value.equals(NULL)) {
    defs.put(currentS.getName(), currentS.unpickle(value));
      }
  } else if ((currentA != null) && (isavalue)) {
      array[arrayidx++] = value;
  }
    }

    public void warning(SAXParseException e)
  throws SAXException
    {
  System.out.println("WARNING in element "+e.getPublicId());
  System.out.println("Sys  : "+e.getSystemId());
  System.out.println("Line : "+e.getLineNumber());
  System.out.println("Col  : "+e.getColumnNumber());
  e.printStackTrace();
    }

    public void error(SAXParseException e)
  throws SAXException
    {
  System.out.println("ERROR in element "+e.getPublicId());
  System.out.println("Sys  : "+e.getSystemId());
  System.out.println("Line : "+e.getLineNumber());
  System.out.println("Col  : "+e.getColumnNumber());
  e.printStackTrace();
    }

    public void fatalError(SAXParseException e)
  throws SAXException
    {
  System.out.println("FATAL ERROR in element "+e.getPublicId());
  System.out.println("Sys  : "+e.getSystemId());
  System.out.println("Line : "+e.getLineNumber());
  System.out.println("Col  : "+e.getColumnNumber());
  e.printStackTrace();
    }

    protected void parse()
  throws SAXException, IOException
    {
  try {
      parser.setDocumentHandler(this);
      parser.setErrorHandler(this);
      parser.parse(new InputSource(reader));
//  } catch (IOException ex) {
//      try { reader.close(); } catch (IOException ioex) {}
//      throw ex;
//  } catch (SAXException sex) {
//      try { reader.close(); } catch (IOException ioex) {}
//      throw sex;
  } finally {
      try { reader.close(); } catch (IOException ioex) {}
  }
    }

    public Resource[] readResources()
  throws IOException, SerializationException
    {
  try {
      parse();
  } catch (SAXException ex) {
      ex.printStackTrace();
      return new Resource[0];
  }
 
  int      len   = holders.length;
  Resource crs[] = new Resource[len];
  for (int i = 0 ; i < len ; i++)
      crs[i] = (Resource) holders[i];
  return crs;
    }

    public AttributeHolder[] readAttributeHolders()
  throws IOException, SerializationException
    {
  try {
      parse();
  } catch (SAXException ex) {
      ex.printStackTrace();
      return new AttributeHolder[0];
  }

  return holders;
    }

    public XMLReader(Reader reader, Parser parser) {
  this.reader = reader;
  this.parser = parser;
    }

}
TOP

Related Classes of org.w3c.tools.resources.serialization.xml.XMLReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.