You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by er...@apache.org on 2009/08/02 05:58:01 UTC
svn commit: r799977 - in
/webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba:
idl/parser/ idl/types/ receivers/
Author: eranga
Date: Sun Aug 2 03:58:00 2009
New Revision: 799977
URL: http://svn.apache.org/viewvc?rev=799977&view=rev
Log:
const IDL data type support (Fix for AXIS2-4385)
Added:
webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java
webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/ConstType.java
Modified:
webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java
webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/PrimitiveDataType.java
webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java
Added: webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java?rev=799977&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java (added)
+++ webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java Sun Aug 2 03:58:00 2009
@@ -0,0 +1,508 @@
+/*
+ * 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.corba.idl.parser;
+
+import antlr.collections.AST;
+import org.apache.axis2.corba.exceptions.InvalidIDLException;
+import org.apache.axis2.corba.idl.types.*;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.TCKind;
+
+import java.util.Map;
+
+public class ExpressionUtil {
+ public static Object eval(AST expressionNode, DataType returnType, IDLVisitor visitor) throws InvalidIDLException {
+ Object value;
+ AST node1;
+ AST node2;
+ int expressionType = expressionNode.getType();
+ TypeCode typeCode = returnType.getTypeCode();
+ switch (expressionType) {
+
+ case IDLTokenTypes.PLUS:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = node2 == null? eval(node1, returnType, visitor)
+ : add(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.MINUS:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = node2 == null? minus(eval(node1, returnType, visitor), typeCode)
+ : subtract(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.STAR:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = multiply(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.DIV:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = div(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.MOD:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = mod(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.OR:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = or(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.AND:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = and(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.RSHIFT:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = rshift(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.LSHIFT:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = lshift(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.XOR:
+ node1 = expressionNode.getFirstChild();
+ node2 = node1.getNextSibling();
+ value = xor(eval(node1, returnType, visitor), eval(node2, returnType, visitor), typeCode);
+ break;
+
+ case IDLTokenTypes.TILDE:
+ node1 = expressionNode.getFirstChild();
+ Object boolObj = eval(node1, returnType, visitor);
+ if (!(boolObj instanceof Boolean)) {
+ throw new InvalidIDLException("A boolean value is expected after (~) operator");
+ }
+ value = Boolean.valueOf(!((Boolean) boolObj).booleanValue());
+ break;
+
+ case IDLTokenTypes.INT:
+ case IDLTokenTypes.FLOAT:
+ case IDLTokenTypes.STRING_LITERAL:
+ case IDLTokenTypes.WIDE_STRING_LITERAL:
+ case IDLTokenTypes.CHAR_LITERAL:
+ case IDLTokenTypes.WIDE_CHAR_LITERAL:
+ case IDLTokenTypes.FIXED:
+ value = getValueObject(expressionNode.getText(), returnType);
+ break;
+
+ case IDLTokenTypes.LITERAL_TRUE:
+ value = Boolean.valueOf(true);
+ break;
+
+ case IDLTokenTypes.LITERAL_FALSE:
+ value = Boolean.valueOf(true);
+ break;
+
+ case IDLTokenTypes.IDENT:
+ value = getConstant(expressionNode.getText(), visitor);
+ break;
+
+ case IDLTokenTypes.LPAREN:
+ value = eval(expressionNode.getFirstChild(), returnType, visitor);
+ break;
+
+ default:
+ throw new InvalidIDLException("Unsupported IDL token " + expressionNode);
+ }
+ return value;
+ }
+
+ private static Object add(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() + ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() + ((Long) o2).longValue());
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(((Float) o1).floatValue() + ((Float) o2).floatValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() + ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(((Double) o1).doubleValue() + ((Double) o2).doubleValue());
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() + ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object minus(Object o, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(-((Integer) o).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(-((Long) o).longValue());
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(-((Float) o).floatValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (-((Short) o).shortValue()));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(- ((Double) o).doubleValue());
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (- ((Byte) o).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object subtract(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() - ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() - ((Long) o2).longValue());
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(((Float) o1).floatValue() - ((Float) o2).floatValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() - ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(((Double) o1).doubleValue() - ((Double) o2).doubleValue());
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() - ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object multiply(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() * ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() * ((Long) o2).longValue());
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(((Float) o1).floatValue() * ((Float) o2).floatValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() * ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(((Double) o1).doubleValue() * ((Double) o2).doubleValue());
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() * ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object div(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() / ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() / ((Long) o2).longValue());
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(((Float) o1).floatValue() / ((Float) o2).floatValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() / ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(((Double) o1).doubleValue() / ((Double) o2).doubleValue());
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() / ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object rshift(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() >> ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() >> ((Long) o2).longValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() >> ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() >> ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object lshift(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() << ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() << ((Long) o2).longValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() << ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() << ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object xor(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() ^ ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() ^ ((Long) o2).longValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() ^ ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() ^ ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object mod(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() % ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() % ((Long) o2).longValue());
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(((Float) o1).floatValue() % ((Float) o2).floatValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() % ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(((Double) o1).doubleValue() % ((Double) o2).doubleValue());
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() % ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object or(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() | ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() | ((Long) o2).longValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() | ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() | ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object and(Object o1, Object o2, TypeCode returnType) throws InvalidIDLException {
+ TCKind kind = returnType.kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(((Integer) o1).intValue() & ((Integer) o2).intValue());
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(((Long) o1).longValue() & ((Long) o2).longValue());
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short((short) (((Short) o1).shortValue() & ((Short) o2).shortValue()));
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte((byte) (((Byte) o1).byteValue() & ((Byte) o2).byteValue()));
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token");
+ }
+ return valueObj;
+ }
+
+ private static Object getValueObject(String value, DataType type) throws InvalidIDLException {
+ TCKind kind = type.getTypeCode().kind();
+ Object valueObj;
+ switch (kind.value()) {
+ case TCKind._tk_long:
+ case TCKind._tk_ulong:
+ valueObj = new Integer(value);
+ break;
+ case TCKind._tk_longlong:
+ case TCKind._tk_ulonglong:
+ valueObj = new Long(value);
+ break;
+ case TCKind._tk_float:
+ valueObj = new Float(value);
+ break;
+ case TCKind._tk_short:
+ case TCKind._tk_ushort:
+ valueObj = new Short(value);
+ break;
+ case TCKind._tk_char:
+ case TCKind._tk_wchar:
+ valueObj = new Character(value.charAt(0));
+ break;
+ case TCKind._tk_double:
+ valueObj = new Double(value);
+ break;
+ case TCKind._tk_octet:
+ valueObj = new Byte(value);
+ break;
+ case TCKind._tk_string:
+ case TCKind._tk_wstring:
+ valueObj = value;
+ break;
+ case TCKind._tk_alias:
+ Typedef typedef = (Typedef) type;
+ valueObj = getValueObject(value, typedef.getDataType());
+ break;
+ default:
+ throw new InvalidIDLException("Unsupported IDL token ");
+ }
+ return valueObj;
+ }
+
+ private static Object getConstant(String expressionName, IDLVisitor visitor) throws InvalidIDLException {
+ Object value;
+ DataType dataType = visitor.getDataType(expressionName);
+ if (dataType != null && dataType instanceof ConstType) {
+ ConstType constType = (ConstType) dataType;
+ value = constType.getValue();
+ } else {
+ throw new InvalidIDLException("Constant " + expressionName + " not found.");
+ }
+ return value;
+ }
+}
+
Modified: webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java?rev=799977&r1=799976&r2=799977&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java (original)
+++ webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java Sun Aug 2 03:58:00 2009
@@ -20,22 +20,7 @@
package org.apache.axis2.corba.idl.parser;
import antlr.collections.AST;
-import org.apache.axis2.corba.idl.types.ArrayType;
-import org.apache.axis2.corba.idl.types.CompositeDataType;
-import org.apache.axis2.corba.idl.types.DataType;
-import org.apache.axis2.corba.idl.types.EnumType;
-import org.apache.axis2.corba.idl.types.ExceptionType;
-import org.apache.axis2.corba.idl.types.IDL;
-import org.apache.axis2.corba.idl.types.Interface;
-import org.apache.axis2.corba.idl.types.Member;
-import org.apache.axis2.corba.idl.types.Operation;
-import org.apache.axis2.corba.idl.types.PrimitiveDataType;
-import org.apache.axis2.corba.idl.types.SequenceType;
-import org.apache.axis2.corba.idl.types.Struct;
-import org.apache.axis2.corba.idl.types.Typedef;
-import org.apache.axis2.corba.idl.types.UnionMember;
-import org.apache.axis2.corba.idl.types.UnionType;
-import org.apache.axis2.corba.idl.types.ValueType;
+import org.apache.axis2.corba.idl.types.*;
import org.apache.axis2.corba.exceptions.InvalidIDLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -112,6 +97,11 @@
break;
}
+ case IDLTokenTypes.LITERAL_const: {
+ idl.addType(visitConst(node));
+ break;
+ }
+
default: {
throw new InvalidIDLException("Unsupported IDL token " + node);
}
@@ -363,8 +353,7 @@
return typedef;
}
- DataType dataType = null;
- Map compositeDataTypes = idl.getCompositeDataTypes();
+ DataType dataType;
String typeName;
if (typeNode.getType() == IDLTokenTypes.LITERAL_unsigned) {
@@ -377,9 +366,7 @@
typeName = "ushort";
} else if (nextNode.getType() == IDLTokenTypes.LITERAL_long) {
AST nextToLong = nextNode.getNextSibling();
- if (nextToLong == null) {
- throw new InvalidIDLException("an identifier is required after the 'long' keyword");
- } else if (nextToLong.getType() == IDLTokenTypes.LITERAL_long) {
+ if (nextToLong != null && nextToLong.getType() == IDLTokenTypes.LITERAL_long) {
typeNode.setNextSibling(nextToLong.getNextSibling());
typeNode.setFirstChild(nextToLong.getFirstChild());
typeName = "ulonglong";
@@ -393,9 +380,7 @@
}
} else if (typeNode.getType() == IDLTokenTypes.LITERAL_long) {
AST nextToLong = typeNode.getNextSibling();
- if (nextToLong == null) {
- throw new InvalidIDLException("an identifier is required after the 'long' keyword");
- } else if (nextToLong.getType() == IDLTokenTypes.LITERAL_long) {
+ if (nextToLong != null && nextToLong.getType() == IDLTokenTypes.LITERAL_long) {
typeNode.setNextSibling(nextToLong.getNextSibling());
typeNode.setFirstChild(nextToLong.getFirstChild());
typeName = "longlong";
@@ -407,7 +392,8 @@
}
- if (compositeDataTypes!=null) {
+ /* Map compositeDataTypes = idl.getCompositeDataTypes();
+ if (compositeDataTypes!=null) {
if (!module.equals("")) {
if (!typeName.startsWith(module)) {
dataType = (DataType) idl.getCompositeDataTypes().get(module + typeName);
@@ -424,11 +410,59 @@
dataType = (DataType) idl.getCompositeDataTypes().get(typeName);
}
- if (dataType==null)
+
+ if (dataType == null)
dataType = PrimitiveDataType.getPrimitiveDataType(typeName);
if (dataType == null)
throw new InvalidIDLException("Invalid data type: " + typeName);
+ }
+
+ */
+ dataType = getDataType(typeName);
+
+ return dataType;
+ }
+
+ DataType getDataType(String typeName) throws InvalidIDLException {
+ DataType dataType = null;
+ Map compositeDataTypes = idl.getCompositeDataTypes();
+
+ if (compositeDataTypes != null) {
+ if (moduleForInnerTypes!=null) {
+ if (!typeName.startsWith(module)) {
+ dataType = (DataType) compositeDataTypes.get(moduleForInnerTypes + typeName);
+ }
+ }
+
+ String tempModule = module;
+ int modSepLen = CompositeDataType.MODULE_SEPERATOR.length();
+ while (dataType == null) {
+ dataType = (DataType) idl.getCompositeDataTypes().get(tempModule + typeName);
+ if (dataType == null && !tempModule.isEmpty()) {
+ if (tempModule.endsWith(CompositeDataType.MODULE_SEPERATOR)) {
+ tempModule = tempModule.substring(0, tempModule.length() - modSepLen);
+ }
+ int modSepPos = tempModule.lastIndexOf(CompositeDataType.MODULE_SEPERATOR);
+ if (modSepPos < 0) {
+ tempModule = "";
+ } else {
+ tempModule = tempModule.substring(0, modSepPos + modSepLen);
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (dataType == null) {
+ dataType = PrimitiveDataType.getPrimitiveDataType(typeName);
+ }
+
+ if (dataType == null) {
+ throw new InvalidIDLException("Invalid data type: " + typeName);
+ }
+
return dataType;
}
@@ -471,7 +505,8 @@
unionType.setModule(module);
unionType.setName(unName);
AST switchTypeNode = unNode.getNextSibling();
- unionType.setDiscriminatorType(findDataType(switchTypeNode, unName));
+ DataType discrimType = findDataType(switchTypeNode, unName);
+ unionType.setDiscriminatorType(discrimType);
AST caseOrDefaultNode = switchTypeNode.getNextSibling();
while (caseOrDefaultNode != null) {
UnionMember unionMember = new UnionMember();
@@ -482,7 +517,17 @@
} else {
unionMember.setDefault(false);
AST caseValueNode = caseOrDefaultNode.getFirstChild();
- unionMember.setDiscriminatorValue(caseValueNode.getText());
+ String caseNodeText = caseValueNode.getText();
+ if (!(discrimType instanceof EnumType) && IDLTokenTypes.IDENT == caseValueNode.getType()) {
+ //Get const value
+ DataType constType = getDataType(caseNodeText);
+ if (constType instanceof ConstType) {
+ caseNodeText = ((ConstType) constType).getValue().toString();
+ } else {
+ throw new InvalidIDLException(caseNodeText + "is not a constant name");
+ }
+ }
+ unionMember.setDiscriminatorValue(caseNodeText);
typeNode = caseValueNode.getNextSibling();
}
@@ -576,7 +621,25 @@
AST countNode = typeNode.getNextSibling();
if (countNode!=null) {
- sequenceType.setElementCount(Integer.parseInt(countNode.getText()));
+ int count;
+ if (IDLTokenTypes.IDENT == countNode.getType()) {
+ //Get const value
+ String constName = countNode.getText();
+ DataType constType = getDataType(constName);
+ if (constType instanceof ConstType) {
+ Object countValue = ((ConstType) constType).getValue();
+ if (countValue instanceof Integer) {
+ count = ((Integer) countValue).intValue();
+ } else {
+ throw new InvalidIDLException(constName + "is not a long");
+ }
+ } else {
+ throw new InvalidIDLException(constName + "is not a constant name");
+ }
+ } else {
+ count = Integer.parseInt(countNode.getText());
+ }
+ sequenceType.setElementCount(count);
//sequenceType.setBounded(true);
} else {
sequenceType.setElementCount(0);
@@ -585,4 +648,27 @@
return sequenceType;
}
+ private ConstType visitConst(AST node) throws InvalidIDLException {
+ AST constTypeNode = node.getFirstChild();
+ AST constNameNode = constTypeNode.getNextSibling();
+ while (constNameNode != null && IDLTokenTypes.IDENT != constNameNode.getType()) {
+ constNameNode = constNameNode.getNextSibling();
+ }
+
+ if (constNameNode == null) {
+ throw new InvalidIDLException("Constant name not found");
+ }
+
+ String constName = constNameNode.toString();
+ ConstType constType = new ConstType();
+ constType.setModule(module);
+ constType.setName(constName);
+ DataType type = findDataType(constTypeNode, constName);
+ constType.setDataType(type);
+ AST constValueNode = constNameNode.getNextSibling();
+ constType.setValue(ExpressionUtil.eval(constValueNode, type, this));
+ //System.out.println(constType.getValue());
+ return constType;
+ }
+
}
Added: webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/ConstType.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/ConstType.java?rev=799977&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/ConstType.java (added)
+++ webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/ConstType.java Sun Aug 2 03:58:00 2009
@@ -0,0 +1,47 @@
+/*
+ * 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.corba.idl.types;
+
+import org.omg.CORBA.TypeCode;
+
+public class ConstType extends CompositeDataType {
+ private DataType dataType;
+ private Object value;
+
+ protected TypeCode generateTypeCode() {
+ return null;
+ }
+
+ public DataType getDataType() {
+ return dataType;
+ }
+
+ public void setDataType(DataType dataType) {
+ this.dataType = dataType;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void setValue(Object value) {
+ this.value = value;
+ }
+}
Modified: webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/PrimitiveDataType.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/PrimitiveDataType.java?rev=799977&r1=799976&r2=799977&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/PrimitiveDataType.java (original)
+++ webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/idl/types/PrimitiveDataType.java Sun Aug 2 03:58:00 2009
@@ -75,7 +75,11 @@
}
public static PrimitiveDataType getPrimitiveDataType(String typeName) {
- return new PrimitiveDataType(getTypeCode(typeName));
+ TypeCode typeCode = getTypeCode(typeName);
+ if (typeCode == null) {
+ return null;
+ }
+ return new PrimitiveDataType(typeCode);
}
public PrimitiveDataType(TypeCode typeCode){
Modified: webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java?rev=799977&r1=799976&r2=799977&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/corba/src/org/apache/axis2/corba/receivers/CorbaInOutAsyncMessageReceiver.java Sun Aug 2 03:58:00 2009
@@ -42,6 +42,11 @@
import java.util.HashMap;
import java.util.Map;
+/**
+ * This is takes care of the IN-OUT sync MEP in the server side
+ *
+ * @deprecated no longer needed, going away after 1.3
+ */
public class CorbaInOutAsyncMessageReceiver extends AbstractInOutAsyncMessageReceiver implements CorbaConstants {
private static Log log = LogFactory.getLog(CorbaInOutAsyncMessageReceiver.class);