Package com.sun.tahiti.compiler.generator

Source Code of com.sun.tahiti.compiler.generator.XMLGenerator

/*
* @(#)$Id: XMLGenerator.java 1087 2001-08-18 01:37:50Z Bear $
*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of Sun Microsystems, Inc. 
* Use is subject to license terms.
*
*/
package com.sun.tahiti.compiler.generator;

import com.sun.msv.grammar.*;
import com.sun.tahiti.compiler.Symbolizer;
import com.sun.tahiti.compiler.Controller;
import com.sun.tahiti.compiler.XMLWriter;
import com.sun.tahiti.compiler.sm.MarshallerGenerator;
import com.sun.tahiti.grammar.*;
import org.xml.sax.DocumentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.LocatorImpl;
import org.apache.xml.serialize.XMLSerializer;
import org.apache.xml.serialize.OutputFormat;
import java.util.Iterator;
import java.io.IOException;

/**
* produces XML representation of the object model.
*
* @author
*  <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a>
*/
class XMLGenerator
{
  XMLGenerator( AnnotatedGrammar grammar, Symbolizer symbolizer, Controller controller ) {
    this.grammar = grammar;
    this.symbolizer = symbolizer;
    this.controller = controller;
  }
 
  private final AnnotatedGrammar grammar;
  private final Symbolizer symbolizer;
  private final Controller controller;
   
  void generate() throws SAXException, IOException {
    try {
      ClassItem[] types = grammar.getClasses();
      for( int i=0; i<types.length; i++ )
        write( types[i] );
   
      InterfaceItem[] itfs = grammar.getInterfaces();
      for( int i=0; i<itfs.length; i++ )
        write( itfs[i] );
   
    } catch( XMLWriter.SAXWrapper w ) {
      throw w.e;
    }
  }

  /** writes TypeItem to an XML file. */
  private void write( TypeItem type ) throws SAXException, IOException {
       
    DocumentHandler outHandler = new XMLSerializer(
      controller.getOutput(type),
      new OutputFormat("xml",null,true) );
    XMLWriter out = new XMLWriter(outHandler);
       
    outHandler.setDocumentLocator( new LocatorImpl() );
    outHandler.startDocument();
    outHandler.processingInstruction("xml-stylesheet",
      "type='text/xsl' href='classFileDebug.xsl'");
    writeClass( type, out );
    outHandler.endDocument();
  }
 
  /**
   * writes body of TypeItem.
   */
  private void writeClass( TypeItem type, XMLWriter out ) {
   
    out.start(
      (type instanceof ClassItem)?"class":"interface",
      new String[]{"name",type.name});
   
    if( type.getSuperType()!=null )
      out.element("extends",
        new String[]{"name",type.getSuperType().getTypeName()});
   
    writeType( type, out );

   
    // output miscellaneous information which may be useful.
    out.start("info");
    out.start("derivedTypes");
    writeDerivedTypes("class",type,grammar.iterateClasses(),out);
    writeDerivedTypes("interface",type,grammar.iterateInterfaces(),out);
    out.end("derivedTypes");
    out.end("info");
   
   
    out.end("class");
  }

  /** writes derived types of the specified type. */
  private void writeDerivedTypes( String tagName, TypeItem current, Iterator itr, XMLWriter out ) {
    while( itr.hasNext() ) {
      TypeItem type = (TypeItem)itr.next();
     
      boolean isDerived = false;
     
      if(type.getSuperType()==current)
        isDerived = true;
     
      Type[] itfs = type.getInterfaces();
      for( int i=0; i<itfs.length; i++ )
        if( itfs[i]==current )
          isDerived = true;
     
      if(isDerived)
        out.element(tagName, new String[]{"name",type.getTypeName()});
    }
  }
 
  /**
   * writes body of TypeItem.
   */
  private void writeType( TypeItem t, XMLWriter out ) {
    Type[] is = (Type[])t.interfaces.toArray(new Type[0]);
    for( int i=0; i<is.length; i++ )
      out.element("implements",
        new String[]{"name",is[i].getTypeName()});
   
    String[] fnames = (String[])t.fields.keySet().toArray(new String[0]);
    for( int i=0; i<fnames.length; i++ ) {
      final FieldUse fu = (FieldUse)t.fields.get(fnames[i]);
      out.start("field",
        new String[]{
          "name",fu.name,
          "itemType",fu.type.getTypeName(),
          "minOccurs",Integer.toString(fu.multiplicity.min),
          "maxOccurs",
            (fu.multiplicity.max==null)?"unbounded":fu.multiplicity.max.toString()} );
     
      Iterator itr = fu.items.iterator();
      while( itr.hasNext() ) {
        final FieldItem fi = (FieldItem)itr.next();
        out.element("symbol",
          new String[]{"name",symbolizer.getId(fi)});
      }
     
      out.end("field");
    }
  }
}
TOP

Related Classes of com.sun.tahiti.compiler.generator.XMLGenerator

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.