/** * 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 java.util.ArrayList; import java.util.List; import javax.wsdl.Definition; import javax.xml.namespace.QName; import antlr.collections.AST; import org.apache.cxf.binding.corba.wsdl.CorbaConstants; import org.apache.cxf.binding.corba.wsdl.CorbaType; import org.apache.cxf.tools.corba.common.XmlSchemaPrimitiveMap; import org.apache.ws.commons.schema.XmlSchema; import org.apache.ws.commons.schema.XmlSchemaCollection; import org.apache.ws.commons.schema.XmlSchemaType; public class PrimitiveTypesVisitor implements Visitor { private static XmlSchemaPrimitiveMap xmlSchemaPrimitiveMap = new XmlSchemaPrimitiveMap(); private static final List<Integer> PRIMITIVE_TYPES = new ArrayList<>(); static { PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_float)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_double)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_long)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_short)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_unsigned)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_char)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_wchar)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_boolean)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_any)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_octet)); PRIMITIVE_TYPES.add(Integer.valueOf(IDLTokenTypes.LITERAL_any)); } private XmlSchemaType schemaType; private CorbaType corbaType; private Scope scope; private XmlSchemaCollection schemas; public PrimitiveTypesVisitor(Scope scopeRef, Definition defn, XmlSchema schemaRef, XmlSchemaCollection xmlSchemas) { scope = scopeRef; schemas = xmlSchemas; } public static boolean accept(AST node) { return PRIMITIVE_TYPES.contains(node.getType()); } public void visit(AST node) { // <base_type_spec> ::= <floating_pt_type> // | <integer_type> // | <char_type> // | <wide_char_type> // | <boolean_type> // | <octet_type> // | <any_type> // | <object_type> <= NOT SUPPORTED // | <value_base_type> <= NOT SUPPORTED // <floating_pt_type> ::= "float" // | "double" // | "long" double" // <integer_type> ::= <signed_int> // | <unsigned_int> // <signed_int> ::= <signed_short_int> // | <signed_long_int> // | <signed_longlong_int> // <signed_short_int> ::= "short" // <signed_long_int> ::= "long" // <signed_longlong_int> ::= "long" "long" // <unsigned_int> ::= <unsigned_short_int> // | <unsigned_long_int> // | <unsigned_longlong_int> // <unsigned_short_int> ::= "unsigned" "short" // <unsigned_long_int> ::= "unsigned" "long" // <unsigned_longlong_int> ::= "unsigned" "long" "long" // <char_type> ::= "char" // <wide_char_type> ::= "wchar" // <boolean_type> ::= "boolean" // <octet_type> ::= "octet" // <any_type> ::= "any" XmlSchemaType stype = null; CorbaType ctype = null; QName corbaTypeQName = PrimitiveTypesVisitor.getPrimitiveType(node); if (corbaTypeQName != null) { QName schemaTypeQName = xmlSchemaPrimitiveMap.get(corbaTypeQName); if (schemaTypeQName != null) { //XmlSchemaCollection schemas = new XmlSchemaCollection(); stype = schemas.getTypeByQName(schemaTypeQName); if (stype != null) { ctype = new CorbaType(); ctype.setQName(corbaTypeQName); ctype.setType(stype.getQName()); ctype.setName(stype.getQName().getLocalPart()); } } } schemaType = stype; corbaType = ctype; } public XmlSchemaType getSchemaType() { return schemaType; } public CorbaType getCorbaType() { return corbaType; } public Scope getScope() { return scope; } public Scope getFullyQualifiedName() { return scope; } public static QName getPrimitiveType(AST node) { QName result = null; switch (node.getType()) { case IDLTokenTypes.LITERAL_long: if ((node.getNextSibling() != null) && (node.getNextSibling().getType() == IDLTokenTypes.LITERAL_long)) { // long long result = CorbaConstants.NT_CORBA_LONGLONG; } else if ((node.getFirstChild() != null) && (node.getFirstChild().getType() == IDLTokenTypes.LITERAL_double)) { // "double" node is a child of "long" node - instead of being a sibling // long double result = CorbaConstants.NT_CORBA_LONGDOUBLE; } else { // long result = CorbaConstants.NT_CORBA_LONG; } break; case IDLTokenTypes.LITERAL_unsigned: AST node2 = node.getNextSibling(); if (node2 != null && node2.getType() == IDLTokenTypes.LITERAL_short) { // unsigned short result = CorbaConstants.NT_CORBA_USHORT; } else if (node2 != null && node2.getType() == IDLTokenTypes.LITERAL_long) { AST node3 = node2.getNextSibling(); if (node3 != null && node3.getType() == IDLTokenTypes.LITERAL_long) { // unsigned long long result = CorbaConstants.NT_CORBA_ULONGLONG; } else { // unsigned long result = CorbaConstants.NT_CORBA_ULONG; } } else { // TBD: we should never get here } break; case IDLTokenTypes.LITERAL_short: result = CorbaConstants.NT_CORBA_SHORT; break; case IDLTokenTypes.LITERAL_float: result = CorbaConstants.NT_CORBA_FLOAT; break; case IDLTokenTypes.LITERAL_double: result = CorbaConstants.NT_CORBA_DOUBLE; break; case IDLTokenTypes.LITERAL_char: result = CorbaConstants.NT_CORBA_CHAR; break; case IDLTokenTypes.LITERAL_wchar: result = CorbaConstants.NT_CORBA_WCHAR; break; case IDLTokenTypes.LITERAL_string: result = CorbaConstants.NT_CORBA_STRING; break; case IDLTokenTypes.LITERAL_wstring: result = CorbaConstants.NT_CORBA_WSTRING; break; case IDLTokenTypes.LITERAL_boolean: result = CorbaConstants.NT_CORBA_BOOLEAN; break; case IDLTokenTypes.LITERAL_octet: result = CorbaConstants.NT_CORBA_OCTET; break; case IDLTokenTypes.LITERAL_any: result = CorbaConstants.NT_CORBA_ANY; break; default: // TBD break; } return result; } }