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); }
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(); } }