Example #1
0
  public void visitDeclaredUnion(AST identifierNode) {

    Scope unionScope = new Scope(getScope(), identifierNode);
    AST discriminatorNode = identifierNode.getNextSibling();
    AST caseNode = discriminatorNode.getNextSibling();
    // xmlschema:union
    XmlSchemaComplexType unionSchemaComplexType = new XmlSchemaComplexType(schema);
    unionSchemaComplexType.setName(mapper.mapToQName(unionScope));

    // REVISIT
    // TEMPORARILY
    // using TypesVisitor to visit <const_type>
    // it should be visited by a SwitchTypeSpecVisitor
    TypesVisitor visitor = new TypesVisitor(getScope(), definition, schema, wsdlVisitor, null);
    visitor.visit(discriminatorNode);
    CorbaTypeImpl ctype = visitor.getCorbaType();
    Scope fullyQualifiedName = visitor.getFullyQualifiedName();

    XmlSchemaChoice choice = new XmlSchemaChoice();
    choice.setMinOccurs(1);
    choice.setMaxOccurs(1);
    unionSchemaComplexType.setParticle(choice);

    // corba:union
    Union corbaUnion = new Union();
    corbaUnion.setQName(new QName(typeMap.getTargetNamespace(), unionScope.toString()));
    corbaUnion.setRepositoryID(unionScope.toIDLRepositoryID());
    corbaUnion.setType(unionSchemaComplexType.getQName());
    if (ctype != null) {
      corbaUnion.setDiscriminator(ctype.getQName());
    } else {
      // Discriminator type is forward declared.
      UnionDeferredAction unionDiscriminatorAction = new UnionDeferredAction(corbaUnion);
      wsdlVisitor.getDeferredActions().add(fullyQualifiedName, unionDiscriminatorAction);
    }

    boolean recursiveAdd = addRecursiveScopedName(identifierNode);

    processCaseNodes(caseNode, unionScope, choice, corbaUnion);

    if (recursiveAdd) {
      removeRecursiveScopedName(identifierNode);
    }

    // add schemaType
    schema.getItems().add(unionSchemaComplexType);
    schema.addType(unionSchemaComplexType);

    // add corbaType
    typeMap.getStructOrExceptionOrUnion().add(corbaUnion);

    // REVISIT: are these assignments needed?
    setSchemaType(unionSchemaComplexType);
    setCorbaType(corbaUnion);

    // Need to check if the union was forward declared
    processForwardUnionActions(unionScope);

    // Once we've finished declaring the union, we should make sure it has been removed from
    // the list of scopedNames so that we indicate that is no longer simply forward declared.
    scopedNames.remove(unionScope);
  }
Example #2
0
  private void processCaseNodes(
      AST caseNode, Scope scope, XmlSchemaChoice choice, Union corbaUnion) {
    while (caseNode != null) {
      AST typeNode = null;
      AST nameNode = null;
      AST labelNode = null;

      // xmlschema:element
      XmlSchemaElement element = new XmlSchemaElement();

      // corba:unionbranch
      Unionbranch unionBranch = new Unionbranch();

      if (caseNode.getType() == IDLTokenTypes.LITERAL_default) {
        // default:
        unionBranch.setDefault(true);

        typeNode = caseNode.getFirstChild();
        nameNode = typeNode.getNextSibling();
      } else {
        // case:
        createCase(caseNode, unionBranch);

        labelNode = caseNode.getFirstChild();
        if (labelNode.getType() == IDLTokenTypes.LITERAL_case) {
          labelNode = labelNode.getNextSibling();
        }

        typeNode = labelNode.getNextSibling();
        nameNode = typeNode.getNextSibling();
      }

      TypesVisitor visitor = new TypesVisitor(scope, definition, schema, wsdlVisitor, null);
      visitor.visit(typeNode);
      XmlSchemaType stype = visitor.getSchemaType();
      CorbaTypeImpl ctype = visitor.getCorbaType();
      Scope fullyQualifiedName = visitor.getFullyQualifiedName();

      // needed for anonymous arrays in unions
      if (ArrayVisitor.accept(nameNode)) {
        Scope anonScope = new Scope(scope, TypesUtils.getCorbaTypeNameNode(nameNode));
        ArrayVisitor arrayVisitor =
            new ArrayVisitor(anonScope, definition, schema, wsdlVisitor, null, fullyQualifiedName);
        arrayVisitor.setSchemaType(stype);
        arrayVisitor.setCorbaType(ctype);
        arrayVisitor.visit(nameNode);
        stype = arrayVisitor.getSchemaType();
        ctype = arrayVisitor.getCorbaType();
        fullyQualifiedName = visitor.getFullyQualifiedName();
      }

      // xmlschema:element
      element.setName(nameNode.toString());
      if (stype != null) {
        element.setSchemaTypeName(stype.getQName());
        if (stype.getQName().equals(ReferenceConstants.WSADDRESSING_TYPE)) {
          element.setNillable(true);
        }
      } else {
        UnionDeferredAction elementAction = new UnionDeferredAction(element);
        wsdlVisitor.getDeferredActions().add(fullyQualifiedName, elementAction);
      }
      choice.getItems().add(element);

      // corba:unionbranch
      unionBranch.setName(nameNode.toString());
      if (ctype != null) {
        unionBranch.setIdltype(ctype.getQName());
      } else {
        // its type is forward declared.
        UnionDeferredAction unionBranchAction = new UnionDeferredAction(unionBranch);
        wsdlVisitor.getDeferredActions().add(fullyQualifiedName, unionBranchAction);
      }
      corbaUnion.getUnionbranch().add(unionBranch);

      caseNode = caseNode.getNextSibling();
    }
  }