Package org.apache.cxf.tools.corba.processors.idl

Source Code of org.apache.cxf.tools.corba.processors.idl.DeclaratorVisitor

/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.cxf.tools.corba.processors.idl;

import javax.wsdl.Definition;
import javax.xml.namespace.QName;

import antlr.collections.AST;

import org.apache.cxf.binding.corba.wsdl.Alias;
import org.apache.cxf.binding.corba.wsdl.CorbaType;
import org.apache.cxf.binding.corba.wsdl.Fixed;
import org.apache.cxf.binding.corba.wsdl.Sequence;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaComplexType;
import org.apache.ws.commons.schema.XmlSchemaSimpleType;
import org.apache.ws.commons.schema.XmlSchemaType;

public class DeclaratorVisitor extends VisitorBase {
    // <declarators> ::= <declarator> {"," <declarator> }*
    // <declarator> ::= <simple_declarator>
    //                | <complex_declarator>
    // <simple_declarator> ::= <identifier>
    // <complex_declarator> ::= <array_declarator>

    public DeclaratorVisitor(Scope scope,
                             Definition defn,
                             XmlSchema schemaRef,
                             WSDLASTVisitor wsdlASTVisitor,
                             XmlSchemaType schemaTypeRef,
                             CorbaType corbaTypeRef,
                             Scope fQName) {
        super(scope, defn, schemaRef, wsdlASTVisitor);
        setSchemaType(schemaTypeRef);
        setCorbaType(corbaTypeRef);
        setFullyQualifiedName(fQName);
    }

    public void visit(AST node) {

        if (ArrayVisitor.accept(node)) {
            ArrayVisitor arrayVisitor = new ArrayVisitor(getScope(),
                                                         definition,
                                                         schema,
                                                         wsdlVisitor,
                                                         node,
                                                         getFullyQualifiedName());
            arrayVisitor.setSchemaType(getSchemaType());
            arrayVisitor.setCorbaType(getCorbaType());
            arrayVisitor.visit(node);

        } else {
            // add corbaType
            typeMap.getStructOrExceptionOrUnion().add(getCorbaType());
        }

        AST nextDecl = node.getNextSibling();
        while (nextDecl != null) {
            Scope newScope = new Scope(getScope().getParent(), nextDecl);

            if (ArrayVisitor.accept(nextDecl)) {
                ArrayVisitor arrayVisitor = new ArrayVisitor(newScope,
                                                             definition,
                                                             schema,
                                                             wsdlVisitor,
                                                             nextDecl,
                                                             getFullyQualifiedName());
                arrayVisitor.setSchemaType(getSchemaType());
                arrayVisitor.setCorbaType(getCorbaType());
                arrayVisitor.visit(nextDecl);
            } else {
                visitNewTypes(newScope);
            }

            nextDecl = nextDecl.getNextSibling();
        }

    }

    private void visitNewTypes(Scope newScope) {
        CorbaType nextCorbaType = null;
        XmlSchemaType nextSchemaType = null;

        CorbaType oldCorbaType = getCorbaType();

        QName newQname = new QName(getCorbaType().getQName().getNamespaceURI(), newScope.toString());

        if (oldCorbaType instanceof Alias) {
            // Alias
            //
            Alias oldAlias = (Alias) oldCorbaType;
            Alias alias = new Alias();

            alias.setQName(newQname);
            alias.setBasetype(oldAlias.getBasetype());
            alias.setType(oldAlias.getType());
            alias.setRepositoryID(newScope.toIDLRepositoryID());

            nextCorbaType = alias;
        } else if (oldCorbaType instanceof Sequence) {
            // Sequence
            //

            nextSchemaType = duplicateXmlSchemaComplexType(newScope);

            Sequence oldSequence = (Sequence) oldCorbaType;
            Sequence newSequence = new Sequence();

            newSequence.setQName(newQname);
            newSequence.setType(nextSchemaType.getQName());
            newSequence.setElemtype(oldSequence.getElemtype());
            newSequence.setElemname(oldSequence.getElemname());
            newSequence.setBound(oldSequence.getBound());
            newSequence.setRepositoryID(newScope.toIDLRepositoryID());

            nextCorbaType = newSequence;
        } else if (oldCorbaType instanceof Fixed) {
            // Fixed
            //

            nextSchemaType = duplicateXmlSchemaSimpleType(newScope);

            Fixed oldFixed = (Fixed) getCorbaType();
            Fixed newFixed = new Fixed();

            newFixed.setQName(newQname);
            newFixed.setDigits(oldFixed.getDigits());
            newFixed.setScale(oldFixed.getScale());
            newFixed.setType(oldFixed.getType());
            newFixed.setRepositoryID(newScope.toIDLRepositoryID());

            nextCorbaType = newFixed;
        } else {
            System.err.println("[DeclaratorVisitor: Unexpected CORBA type error!]");
            System.exit(1);
        }

        if (nextCorbaType != null) {
            typeMap.getStructOrExceptionOrUnion().add(nextCorbaType);
        }
    }


    private XmlSchemaComplexType duplicateXmlSchemaComplexType(Scope newScope) {
        XmlSchemaComplexType oldSchemaType = (XmlSchemaComplexType) getSchemaType();
        XmlSchemaComplexType newSchemaType = new XmlSchemaComplexType(schema, true);

        newSchemaType.setName(newScope.toString());
        newSchemaType.setParticle(oldSchemaType.getParticle());

        return newSchemaType;
    }

    private XmlSchemaSimpleType duplicateXmlSchemaSimpleType(Scope newScope) {
        XmlSchemaSimpleType oldSimpleType = (XmlSchemaSimpleType) getSchemaType();
        XmlSchemaSimpleType simpleType = new XmlSchemaSimpleType(schema, oldSimpleType.isTopLevel());
        simpleType.setContent(oldSimpleType.getContent());
        simpleType.setName(newScope.toString());
        return simpleType;
    }

}
TOP

Related Classes of org.apache.cxf.tools.corba.processors.idl.DeclaratorVisitor

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.