Package org.apache.axis2.wsdl.codegen.extension

Source Code of org.apache.axis2.wsdl.codegen.extension.TypeMapperExtension

/*
* 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.axis2.wsdl.codegen.extension;

import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;
import org.apache.axis2.wsdl.codegen.CodeGenerationException;
import org.apache.axis2.wsdl.databinding.DefaultTypeMapper;
import org.apache.axis2.wsdl.databinding.TypeMapper;
import org.apache.axis2.wsdl.databinding.CTypeMapper;
import org.apache.axis2.wsdl.i18n.CodegenMessages;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

/**
* The purpose of this extension is to populate the type mapper from the type mapping file. The
* format of the type mapping file is as follows <mappings dbf="adb"> <mapping> <qname
* namespace="ns" prefix="p1">localName</qname> <value>type</value> </mapping> </mappings>
* <p/>
* In any case it is best that the type mapper extension be after all the databinding extensions
*/

public class TypeMapperExtension implements CodeGenExtension {


    private static final String MAPPING_ELEMENT_NAME = "mapping";
    private static final String NAMESPACE_ATTRIBUTE_NAME = "namespace";
    private static final String QNAME_ELEMENT_NAME = "qname";
    private static final String VALUE_ELEMENT_NAME = "value";
    private static final String DB_FRAMEWORK_ATTRIBUTE_NAME = "dbf";


    /** @throws CodeGenerationException  */
    public void engage(CodeGenConfiguration configuration) throws CodeGenerationException {
        if (configuration.getTypeMappingFile() != null) {
            //a type mapping is present. try building the
            //mapping from it

            // if the configuration already has a mapping then take it
            // the external mappings will override the currently available
            // mappings
            TypeMapper mapper = configuration.getTypeMapper();
            // there is no mapper present - so just create a new one
            if (mapper == null) {
                if (configuration.getOutputLanguage() != null &&
                    !configuration.getOutputLanguage().trim().equals("") &&
                    configuration.getOutputLanguage().toLowerCase().equals("c")) {
                    mapper = new CTypeMapper();
   
                else {
                    mapper = new DefaultTypeMapper();
                }
            }

            //read the file as a DOM
            Document mappingDocument = buildDocument(configuration);
            Element rootMappingsElement = mappingDocument.getDocumentElement();

            //override the databinding framework name. If a mapping file is
            //present then the databinding framework name will be overridden
            //if present. If a user wants to mix types then it must be
            //from the same databinding framework!

            //first do a sanity check to see whether the user is trying to
            //mix databinding types!

            String databindingName = rootMappingsElement.
                    getAttribute(DB_FRAMEWORK_ATTRIBUTE_NAME);
            if (!databindingName.equals(configuration.getDatabindingType())) {
                throw new CodeGenerationException(
                        CodegenMessages.
                                getMessage("extension.databindingMismatch")
                );
            }
            configuration.
                    setDatabindingType(
                            databindingName);


            NodeList mappingList = rootMappingsElement.
                    getElementsByTagName(MAPPING_ELEMENT_NAME);
            int length = mappingList.getLength();
            for (int i = 0; i < length; i++) {
                Element mappingNode = (Element)mappingList.item(i);
                //we know this is only one - if there are multiple then
                //it is invalid
                Element qNameChild =
                        (Element)mappingNode.
                                getElementsByTagName(QNAME_ELEMENT_NAME).item(0);
                Element valueChild =
                        (Element)mappingNode.
                                getElementsByTagName(VALUE_ELEMENT_NAME).item(0);
                //generate a Qname and add to the type mapping
                mapper.addTypeMappingName(new QName(
                        qNameChild.getAttribute(NAMESPACE_ATTRIBUTE_NAME),
                        getTextFromElement(qNameChild)),
                                          getTextFromElement(valueChild));

            }

            //set the type mapper to the configurtion
            configuration.setTypeMapper(mapper);
        }
    }

    /**
     * Build a dom document from the mapping file
     *
     * @throws CodeGenerationException
     */
    private Document buildDocument(CodeGenConfiguration configuration)
            throws CodeGenerationException {
        try {
            DocumentBuilderFactory documentBuilderFactory
                    = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setNamespaceAware(true);
            DocumentBuilder documentBuilder =
                    documentBuilderFactory.newDocumentBuilder();
            return documentBuilder.parse(configuration.getTypeMappingFile());
        } catch (Exception e) {
            throw new CodeGenerationException(e);
        }
    }

    /**
     * Gets the string content from an element. returns null if there are no test nodes found
     *
     * @param elt
     * @return text cotent of the element
     */
    private String getTextFromElement(Element elt) {
        NodeList children = elt.getChildNodes();
        String returnString = null;
        int length = children.getLength();
        for (int i = 0; i < length; i++) {
            Node node = children.item(i);
            if (Node.TEXT_NODE == node.getNodeType()) {
                returnString = (returnString == null ? "" : returnString) + node.getNodeValue();
            }

        }

        return returnString;
    }
}
TOP

Related Classes of org.apache.axis2.wsdl.codegen.extension.TypeMapperExtension

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.