Package org.apache.ws.jaxme.generator.sg.impl.ccsg

Source Code of org.apache.ws.jaxme.generator.sg.impl.ccsg.MarshalChildsMethodGeneratingVisitor

/**
*
*/
package org.apache.ws.jaxme.generator.sg.impl.ccsg;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.ws.jaxme.generator.sg.ComplexTypeSG;
import org.apache.ws.jaxme.generator.sg.Context;
import org.apache.ws.jaxme.generator.sg.GroupSG;
import org.apache.ws.jaxme.generator.sg.ObjectSG;
import org.apache.ws.jaxme.generator.sg.ParticleSG;
import org.apache.ws.jaxme.generator.sg.SGlet;
import org.apache.ws.jaxme.generator.sg.SimpleContentSG;
import org.apache.ws.jaxme.impl.JMSAXDriver;
import org.apache.ws.jaxme.impl.JMSAXDriverController;
import org.apache.ws.jaxme.js.DirectAccessible;
import org.apache.ws.jaxme.js.JavaMethod;
import org.apache.ws.jaxme.js.JavaQName;
import org.apache.ws.jaxme.js.JavaSource;
import org.apache.ws.jaxme.js.LocalJavaField;
import org.apache.ws.jaxme.js.Parameter;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;


class MarshalChildsMethodGeneratingVisitor extends ParticleVisitorImpl {
  private final Parameter element, controller, handler;
  private ComplexTypeSG ctSG;
  private LocalJavaField castedElement;
  private final JavaMethod jm;
  private boolean isMixed;
  private Set mixedTypesMap;
  private LocalJavaField object;

  MarshalChildsMethodGeneratingVisitor(JavaSource pJs) {
    jm = pJs.newJavaMethod("marshalChilds", void.class, JavaSource.PUBLIC);
      jm.addThrows(SAXException.class);
    controller = jm.addParam(JMSAXDriverController.class, "pController");
    handler = jm.addParam(ContentHandler.class, "pHandler");
    element = jm.addParam(Object.class, "pObject");
  }

  public void simpleContent(ComplexTypeSG pType) throws SAXException {
    JavaQName elementInterface = pType.getClassContext().getXMLInterfaceName();
    castedElement = jm.newJavaField(elementInterface);
      castedElement.addLine("(", elementInterface, ") ", element);
      LocalJavaField chars = jm.newJavaField(String.class);
      SimpleContentSG simpleContent = pType.getSimpleContentSG();
      Object value = simpleContent.getPropertySG().getValue(castedElement);
      chars.addLine(simpleContent.getContentTypeSG().getSimpleTypeSG().getCastToString(jm, value, controller));
      jm.addIf(chars, " != null  &&  ", chars, ".length() > 0");
      LocalJavaField charArray = jm.newJavaField(char[].class);
      charArray.addLine(chars, ".toCharArray()");
      jm.addLine(handler, ".characters(", charArray, ", 0, ", charArray, ".length);");
      jm.addEndIf();
  }

  public void startComplexContent(ComplexTypeSG pType) throws SAXException {
    ctSG = pType;
    JavaQName elementInterface = pType.getClassContext().getXMLInterfaceName();
    castedElement = jm.newJavaField(elementInterface);
    castedElement.addLine("(", elementInterface, ") ", element);
    isMixed = pType.getComplexContentSG().isMixed();
    if (isMixed) {
      LocalJavaField list = jm.newJavaField(List.class);
      list.addLine(castedElement, ".getContent()");
      DirectAccessible i = jm.addForList(list);
      object = jm.newJavaField(Object.class);
      object.addLine(list, ".get(", i, ")");
      mixedTypesMap = new HashSet();
      jm.addIf(object, " instanceof ", String.class);
      LocalJavaField s = jm.newJavaField(String.class);
      s.addLine("(", String.class, ") ", object);
      jm.addLine(handler, ".characters(", s,
             ".toCharArray(), 0, ", s, ".length());");
    }
  }

  public void endComplexContent(ComplexTypeSG pType) throws SAXException {
    if (isMixed) {
      jm.addElse();
      jm.addThrowNew(IllegalStateException.class,
               JavaSource.getQuoted("Invalid type: "),
               " + ", object, ".getClass().getName()");
      jm.addEndIf();
      jm.addEndFor();
    }
  }

  private void marshalSimpleValue(ObjectSG pObjectSG, JavaMethod pMethod, Object pValue) throws SAXException {
    Object value = pObjectSG.getTypeSG().getSimpleTypeSG().getCastToString(pMethod, pValue, controller);
    pMethod.addLine(controller, ".marshalSimpleChild(this, ",
        JavaSource.getQuoted(pObjectSG.getName().getNamespaceURI()), ", ",
        JavaSource.getQuoted(pObjectSG.getName().getLocalName()), ", ",
        value, ");");
  }

  public void simpleElementParticle(GroupSG pGroup, ParticleSG pParticle) throws SAXException {
    final ObjectSG oSG = pParticle.getObjectSG();
    if (isMixed) {
      JavaQName interfaceName = ctSG.getClassContext().getXMLInterfaceName();
      JavaQName qName = GroupUtil.getContentClass(pGroup, pParticle, interfaceName);
      if (mixedTypesMap.contains(qName)) {
        return;
      }
      mixedTypesMap.add(qName);
      jm.addElseIf(object, " instanceof ", qName);
      Object value = new Object[]{"((", qName, ") ", object, ").getValue()"};
      marshalSimpleValue(oSG, jm, value);
    } else {
      SGlet sgLet = new SGlet(){
        public void generate(JavaMethod pMethod, Object pValue) throws SAXException {
          marshalSimpleValue(oSG, pMethod, pValue);
        }
      };
      pParticle.getPropertySG().forAllNonNullValues(jm, castedElement, sgLet);
    }
  }

  private void marshalComplexValue(ObjectSG pObjectSG, JavaMethod pMethod,
                   Object pValue) throws SAXException {
    Context cc = pObjectSG.getTypeSG().getComplexTypeSG().getClassContext();
    JavaQName serializerClass = cc.getXMLSerializerName();
    LocalJavaField driver = pMethod.newJavaField(JMSAXDriver.class);
    if (pObjectSG.getTypeSG().isGlobalClass()) {
      JavaQName elementInterface;
      if (pObjectSG.isGlobal()) {
        elementInterface = pObjectSG.getClassContext().getXMLInterfaceName();
      } else {
        elementInterface = cc.getXMLInterfaceName();
      }
      driver.addLine(controller,
          ".getJMMarshaller().getJAXBContextImpl().getManagerS(",
          elementInterface, ".class).getDriver()");
    } else {
      driver.addLine("new ", serializerClass, "();");
    }
    pMethod.addLine(controller, ".marshal(", driver,
        ", ", JavaSource.getQuoted(pObjectSG.getName().getNamespaceURI()),
        ", ", JavaSource.getQuoted(pObjectSG.getName().getLocalName()),
        ", ", pValue, ");");
  }

  public void complexElementParticle(GroupSG pGroup, ParticleSG pParticle) throws SAXException {
    final ObjectSG oSG = pParticle.getObjectSG();
    if (isMixed) {
      JavaQName qName = oSG.getTypeSG().getComplexTypeSG().getClassContext().getXMLInterfaceName();
      if (mixedTypesMap.contains(qName)) {
        return;
      }
      mixedTypesMap.add(qName);
      jm.addElseIf(object, " instanceof ", qName);
      Object value = new Object[]{"((", qName, ") ", object, ")"};
      marshalComplexValue(oSG, jm, value);
    } else {
      SGlet sgLet = new SGlet(){
        public void generate(JavaMethod pMethod, Object pValue) throws SAXException {
          marshalComplexValue(oSG, pMethod, pValue);
        }
      };
      pParticle.getPropertySG().forAllNonNullValues(jm, castedElement, sgLet);
    }
  }

  JavaMethod getMethod() { return jm; }
}
TOP

Related Classes of org.apache.ws.jaxme.generator.sg.impl.ccsg.MarshalChildsMethodGeneratingVisitor

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.