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

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

/*
* Copyright 2005  The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ws.jaxme.generator.sg.impl.ccsg;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.ValidationEvent;

import org.apache.ws.jaxme.ValidationEvents;
import org.apache.ws.jaxme.generator.sg.ComplexTypeSG;
import org.apache.ws.jaxme.generator.sg.GroupSG;
import org.apache.ws.jaxme.generator.sg.ParticleSG;
import org.apache.ws.jaxme.impl.JMUnmarshallerHandlerImpl;
import org.apache.ws.jaxme.js.DirectAccessible;
import org.apache.ws.jaxme.js.JavaComment;
import org.apache.ws.jaxme.js.JavaField;
import org.apache.ws.jaxme.js.JavaMethod;
import org.apache.ws.jaxme.js.JavaSource;
import org.apache.ws.jaxme.js.LocalJavaField;
import org.xml.sax.SAXException;


/** Creates an instance of
* {@link org.apache.ws.jaxme.impl.JMSAXElementParser},
* or {@link org.apache.ws.jaxme.impl.JMSAXGroupParser},
* which parses an "all" group.
*/
public class AllHandlerSG extends GroupHandlerSG {
  private JavaField childNumField;

  /** Creates a new instance, which generates a handler for
   * the complex type <code>pTypeSG</code> by adding methods
   * and fields to the Java class <code>pJs</code>.
   */
  public AllHandlerSG(ComplexTypeSG pType, JavaSource pJs)
      throws SAXException {
    super(pType, pJs);
  }

  AllHandlerSG(ComplexTypeSG pType, GroupSG pGroup, JavaSource pJs)
      throws SAXException {
    super(pType, pGroup, pJs);
  }

  protected int getState(int pParticleNum) { return pParticleNum; }

  private JavaField getChildNumField() {
    if (childNumField == null) {
      childNumField = getJavaSource().newJavaField("__childNum", int.class, JavaSource.PRIVATE);
      JavaComment jc = childNumField.newComment();
      jc.addLine("Index of the particle being currently parsed");
    }
    return childNumField;
  }

  protected DirectAccessible getEndElementState() throws SAXException {
    return getChildNumField();
  }

  protected void acceptParticle(JavaMethod pJm, int pNum) throws SAXException {
    pJm.addIf(getStateField(), "[" + pNum, "]");
    ParticleSG particle = particles[pNum];
    if (particle.isElement()) {
      pJm.addLine("getHandler().validationEvent(", ValidationEvent.class, ".WARNING, ",
            JavaSource.getQuoted("The element " + particle.getObjectSG().getName() +
                         " has already been defined."),
              ", ", ValidationEvents.class, ".EVENT_ALL_GROUP_REUSE, null);");
    } else if (particle.isGroup()) {
      pJm.addLine("getHandler().validationEvent(", ValidationEvent.class, ".WARNING, ",
            JavaSource.getQuoted("The group " + GroupUtil.getGroupName(particle.getGroupSG()) +
                       " has already been defined."),
              ", ", ValidationEvents.class, ".EVENT_ALL_GROUP_REUSE, null);");
    } else if (particle.isWildcard()) {
      throw new IllegalStateException("TODO: Add support for wildcards.");
    } else {
      throw new IllegalStateException("Invalid particle type");
    }
    pJm.addEndIf();
    pJm.addLine(getChildNumField(), " = " + pNum + ";");
    pJm.addLine(getStateField(), "[" + pNum, "] = true;");
  }

  public JavaMethod newStartElementMethod() throws SAXException {
    JavaMethod result = super.newStartElementMethod();
    LocalJavaField unmarshallerHandler = result.newJavaField(JMUnmarshallerHandlerImpl.class);
    unmarshallerHandler.addLine("getHandler()");
    handleStartElementStates(unmarshallerHandler, result, 0, particles.length-1);
    result.addLine("return false;");
    return result;
  }

  public JavaMethod newIsFinishedMethod() throws SAXException {
    JavaMethod result = super.newIsFinishedMethod();
    List requiredParticles = new ArrayList();
    for (int i = 0;  i < particles.length;  i++) {
      if (isRequiredParticle(particles[i])) {
        if (requiredParticles.size() > 0) {
          requiredParticles.add(" && ");
        }
        requiredParticles.add(new Object[]{getStateField(),
                           "[" + i + "]"});
      }
    }
    if (requiredParticles.size() == 0) {
      result.addLine("return true;");
    } else {
      result.addLine("return ", requiredParticles, ";");
    }
    return result;
  }

  protected JavaField newStateField() throws SAXException {
    JavaField jf = getJavaSource().newJavaField("__state", boolean[].class, JavaSource.PRIVATE);
    jf.addLine("new ", boolean.class, "[" + particles.length + "]");
    JavaComment jc = jf.newComment();
    jc.addLine("This array indicates the state of the group. For any");
    jc.addLine("possible child, the corresponding boolean value is set,");
    jc.addLine("if the child is parsed.");
    jc.addLine("If the same child occurs again, and the childs boolean");
    jc.addLine("value is true, then an exception is thrown.");
    jc.addLine("These are the indices, to which the child elements are");
    jc.addLine("mapped:");
    for (int i = 0;  i < particles.length;  i++) {
      ParticleSG particle = particles[i];
      if (particle.isGroup()) {
        GroupSG group = particle.getGroupSG();
        if (group.isGlobal()) {
          jc.addLine(" " + i + " = The nested group " + group.getName());
        } else {
          jc.addLine(" " + i + " = An anonymous nested group.");
        }
      } else if (particle.isElement()) {
        jc.addLine(" " + i + " = The child element " + particle.getObjectSG().getName());
      } else if (particle.isWildcard()) {
        throw new IllegalStateException("TODO: Add support for wildcards.");
      } else {
        throw new IllegalStateException("Invalid particle type.");
      }
    }
    return jf;
  }
}
TOP

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

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.