You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by er...@apache.org on 2011/04/06 12:19:19 UTC
svn commit: r1089383 - in
/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba:
deployer/ idl/parser/ idl/types/ idl/values/ receivers/
Author: eranga
Date: Wed Apr 6 10:19:19 2011
New Revision: 1089383
URL: http://svn.apache.org/viewvc?rev=1089383&view=rev
Log:
AXIS2-4779 (Datatype fixed is not supported)
Fixed. Bow this CORBA module supports fixed data type as well
Added:
axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/types/FixedType.java
Modified:
axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/deployer/SchemaGenerator.java
axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java
axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java
axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/values/AbstractValue.java
axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/receivers/CorbaUtil.java
Modified: axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/deployer/SchemaGenerator.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/deployer/SchemaGenerator.java?rev=1089383&r1=1089382&r2=1089383&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/deployer/SchemaGenerator.java (original)
+++ axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/deployer/SchemaGenerator.java Wed Apr 6 10:19:19 2011
@@ -30,6 +30,7 @@ import org.apache.ws.commons.schema.*;
import org.apache.ws.commons.schema.utils.NamespaceMap;
import javax.xml.namespace.QName;
+import java.math.BigDecimal;
import java.net.URI;
import java.util.*;
@@ -343,29 +344,74 @@ public class SchemaGenerator implements
typeTable.addComplexSchema(name, eltOuter.getQName());
} else {
- XmlSchemaComplexType complexType = new XmlSchemaComplexType(xmlSchema);
- XmlSchemaSequence sequence = new XmlSchemaSequence();
- XmlSchemaElement eltOuter = new XmlSchemaElement();
- eltOuter.setName(simpleName);
- eltOuter.setQName(schemaTypeName);
- complexType.setParticle(sequence);
- complexType.setName(simpleName);
-
- xmlSchema.getItems().add(eltOuter);
- xmlSchema.getElements().add(schemaTypeName, eltOuter);
- eltOuter.setSchemaTypeName(complexType.getQName());
-
- xmlSchema.getItems().add(complexType);
- xmlSchema.getSchemaTypes().add(schemaTypeName, complexType);
-
- // adding this type to the table
- typeTable.addComplexSchema(name, eltOuter.getQName());
if (dataType instanceof Typedef) {
Typedef typedef = (Typedef) dataType;
DataType aliasType = typedef.getDataType();
- sequence.getItems().add(generateSchemaforFieldsandProperties(xmlSchema, aliasType, "item", false));
+ if (aliasType instanceof FixedType) {
+ XmlSchemaSimpleType simpleType = new XmlSchemaSimpleType(xmlSchema);
+ XmlSchemaElement eltOuter = new XmlSchemaElement();
+ eltOuter.setName(simpleName);
+ eltOuter.setQName(schemaTypeName);
+ simpleType.setName(simpleName);
+
+ xmlSchema.getItems().add(eltOuter);
+ xmlSchema.getElements().add(schemaTypeName, eltOuter);
+ eltOuter.setSchemaTypeName(simpleType.getQName());
+
+ xmlSchema.getItems().add(simpleType);
+ xmlSchema.getSchemaTypes().add(schemaTypeName, simpleType);
+
+ typeTable.addComplexSchema(name, eltOuter.getQName());
+ XmlSchemaElement elt1 = new XmlSchemaElement();
+ elt1.setName(name);
+
+ XmlSchemaSimpleTypeRestriction restriction = new XmlSchemaSimpleTypeRestriction();
+ restriction.setBaseTypeName(typeTable.getSimpleSchemaTypeName(BigDecimal.class.getName()));
+
+ FixedType fixedType = (FixedType) aliasType;
+ XmlSchemaTotalDigitsFacet totalDigits = new XmlSchemaTotalDigitsFacet(fixedType.getDigits(), false);
+ restriction.getFacets().add(totalDigits);
+ XmlSchemaFractionDigitsFacet fractionDigits = new XmlSchemaFractionDigitsFacet(fixedType.getScale(), true);
+ restriction.getFacets().add(fractionDigits);
+
+ simpleType.setContent(restriction);
+ } else {
+ XmlSchemaComplexType complexType = new XmlSchemaComplexType(xmlSchema);
+ XmlSchemaSequence sequence = new XmlSchemaSequence();
+ XmlSchemaElement eltOuter = new XmlSchemaElement();
+ eltOuter.setName(simpleName);
+ eltOuter.setQName(schemaTypeName);
+ complexType.setParticle(sequence);
+ complexType.setName(simpleName);
+
+ xmlSchema.getItems().add(eltOuter);
+ xmlSchema.getElements().add(schemaTypeName, eltOuter);
+ eltOuter.setSchemaTypeName(complexType.getQName());
+
+ xmlSchema.getItems().add(complexType);
+ xmlSchema.getSchemaTypes().add(schemaTypeName, complexType);
+
+ typeTable.addComplexSchema(name, eltOuter.getQName());
+ sequence.getItems().add(generateSchemaforFieldsandProperties(xmlSchema, aliasType, "item", false));
+ }
} else {
- //Set propertiesNames = new HashSet() ;
+ XmlSchemaComplexType complexType = new XmlSchemaComplexType(xmlSchema);
+ XmlSchemaSequence sequence = new XmlSchemaSequence();
+ XmlSchemaElement eltOuter = new XmlSchemaElement();
+ eltOuter.setName(simpleName);
+ eltOuter.setQName(schemaTypeName);
+ complexType.setParticle(sequence);
+ complexType.setName(simpleName);
+
+ xmlSchema.getItems().add(eltOuter);
+ xmlSchema.getElements().add(schemaTypeName, eltOuter);
+ eltOuter.setSchemaTypeName(complexType.getQName());
+
+ xmlSchema.getItems().add(complexType);
+ xmlSchema.getSchemaTypes().add(schemaTypeName, complexType);
+
+ typeTable.addComplexSchema(name, eltOuter.getQName());
+
Member[] members = dataType.getMembers();
for (int i = 0; i < members.length; i++) {
Member member = members[i];
@@ -378,6 +424,7 @@ public class SchemaGenerator implements
}
}
}
+ schemaToIDLMapping.addSchemaType(dataType, schemaTypeName);
}
return schemaTypeName;
}
Modified: axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java?rev=1089383&r1=1089382&r2=1089383&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java (original)
+++ axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/ExpressionUtil.java Wed Apr 6 10:19:19 2011
@@ -21,11 +21,13 @@ package org.apache.axis2.corba.idl.parse
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.apache.axis2.corba.idl.types.ConstType;
+import org.apache.axis2.corba.idl.types.DataType;
+import org.apache.axis2.corba.idl.types.Typedef;
import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
-import java.util.Map;
+import java.math.BigDecimal;
public class ExpressionUtil {
public static Object eval(AST expressionNode, DataType returnType, IDLVisitor visitor) throws InvalidIDLException {
@@ -164,6 +166,9 @@ public class ExpressionUtil {
case TCKind._tk_octet:
valueObj = new Byte((byte) (((Byte) o1).byteValue() + ((Byte) o2).byteValue()));
break;
+ case TCKind._tk_fixed:
+ valueObj = ((BigDecimal) o1).add((BigDecimal) o2);
+ break;
default:
throw new InvalidIDLException("Unsupported IDL token");
}
@@ -195,6 +200,9 @@ public class ExpressionUtil {
case TCKind._tk_octet:
valueObj = new Byte((byte) (- ((Byte) o).byteValue()));
break;
+ case TCKind._tk_fixed:
+ valueObj = ((BigDecimal) o).multiply(new BigDecimal(-1));
+ break;
default:
throw new InvalidIDLException("Unsupported IDL token");
}
@@ -226,6 +234,9 @@ public class ExpressionUtil {
case TCKind._tk_octet:
valueObj = new Byte((byte) (((Byte) o1).byteValue() - ((Byte) o2).byteValue()));
break;
+ case TCKind._tk_fixed:
+ valueObj = ((BigDecimal) o1).subtract((BigDecimal) o2);
+ break;
default:
throw new InvalidIDLException("Unsupported IDL token");
}
@@ -257,6 +268,9 @@ public class ExpressionUtil {
case TCKind._tk_octet:
valueObj = new Byte((byte) (((Byte) o1).byteValue() * ((Byte) o2).byteValue()));
break;
+ case TCKind._tk_fixed:
+ valueObj = ((BigDecimal) o1).multiply((BigDecimal) o2);
+ break;
default:
throw new InvalidIDLException("Unsupported IDL token");
}
@@ -288,6 +302,9 @@ public class ExpressionUtil {
case TCKind._tk_octet:
valueObj = new Byte((byte) (((Byte) o1).byteValue() / ((Byte) o2).byteValue()));
break;
+ case TCKind._tk_fixed:
+ valueObj = ((BigDecimal) o1).divide((BigDecimal) o2);
+ break;
default:
throw new InvalidIDLException("Unsupported IDL token");
}
@@ -487,6 +504,9 @@ public class ExpressionUtil {
Typedef typedef = (Typedef) type;
valueObj = getValueObject(value, typedef.getDataType());
break;
+ case TCKind._tk_fixed:
+ valueObj = new BigDecimal(value);
+ break;
default:
throw new InvalidIDLException("Unsupported IDL token ");
}
Modified: axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java?rev=1089383&r1=1089382&r2=1089383&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java (original)
+++ axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/parser/IDLVisitor.java Wed Apr 6 10:19:19 2011
@@ -25,6 +25,7 @@ import org.apache.axis2.corba.exceptions
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import java.math.BigDecimal;
import java.util.Map;
/**
@@ -339,11 +340,11 @@ public class IDLVisitor /*implements AST
return findDataType(typeNode, parentName, true, false);
}
- private DataType findDataType(AST typeNode, String parentName, boolean root, boolean noTypeDefForSeqs) throws InvalidIDLException {
+ private DataType findDataType(AST typeNode, String parentName, boolean root, boolean isInsideATypeDef) throws InvalidIDLException {
// Check for sequences
if (typeNode.getType()==IDLTokenTypes.LITERAL_sequence) {
SequenceType sequenceType = visitAnonymousSequence(typeNode, parentName, root);
- if (noTypeDefForSeqs) {
+ if (isInsideATypeDef) {
return sequenceType;
}
Typedef typedef = new Typedef();
@@ -418,6 +419,29 @@ public class IDLVisitor /*implements AST
innerElem.setModule(innerModule);
idl.addType(innerElem);
return innerElem;
+ } else if (typeNode.getType() == IDLTokenTypes.LITERAL_fixed) {
+ AST digitsNode = typeNode.getFirstChild();
+
+ short digits = 0;
+ short scale = 0;
+ if (digitsNode != null) {
+ AST scaleNode = digitsNode.getNextSibling();
+ digits = Short.parseShort(digitsNode.getText());
+ scale = Short.parseShort(scaleNode.getText());
+ }
+
+ FixedType fixedType = new FixedType(digits, scale);
+ if (isInsideATypeDef) {
+ return fixedType;
+ }
+
+ Typedef typedef = new Typedef();
+ typedef.setDataType(fixedType);
+ typedef.setModule(module);
+ String name = typeNode.getNextSibling().getText();
+ typedef.setName(parentName + '_' + name);
+ idl.addType(typedef);
+ return typedef;
} else {
typeName = getTypeName(typeNode);
}
@@ -698,11 +722,27 @@ public class IDLVisitor /*implements AST
ConstType constType = new ConstType();
constType.setModule(module);
constType.setName(constName);
- DataType type = findDataType(constTypeNode, constName);
+ DataType type = findDataType(constTypeNode, constName, true, true);
constType.setDataType(type);
AST constValueNode = constNameNode.getNextSibling();
+
constType.setValue(ExpressionUtil.eval(constValueNode, type, this));
- //System.out.println(constType.getValue());
+
+ if (type instanceof FixedType) {
+ FixedType fixedType = (FixedType) type;
+ if (fixedType.getDigits() == 0 && fixedType.getScale() == 0) {
+ String value = constValueNode.getText().trim();
+ short digits = (short) value.replace(".", "").length();
+ int index = value.indexOf('.');
+ short scale = (short) (index > -1 ? digits - index : 0);
+ fixedType.setDigits(digits);
+ fixedType.setScale(scale);
+ }
+ BigDecimal value = (BigDecimal) constType.getValue();
+ value = value.setScale(fixedType.getDigits(), fixedType.getDigits());
+ constType.setValue(value);
+ }
+
return constType;
}
Added: axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/types/FixedType.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/types/FixedType.java?rev=1089383&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/types/FixedType.java (added)
+++ axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/types/FixedType.java Wed Apr 6 10:19:19 2011
@@ -0,0 +1,54 @@
+/*
+ * 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.ORB;
+import org.omg.CORBA.TypeCode;
+
+public class FixedType extends DataType {
+
+ private short digits;
+ private short scale;
+
+ public FixedType(short digits, short scale) {
+ this.digits = digits;
+ this.scale = scale;
+ }
+
+ protected TypeCode generateTypeCode() {
+ return ORB.init().create_fixed_tc(digits, scale);
+ }
+
+ public short getDigits() {
+ return digits;
+ }
+
+ public void setDigits(short digits) {
+ this.digits = digits;
+ }
+
+ public short getScale() {
+ return scale;
+ }
+
+ public void setScale(short scale) {
+ this.scale = scale;
+ }
+}
Modified: axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/values/AbstractValue.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/values/AbstractValue.java?rev=1089383&r1=1089382&r2=1089383&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/values/AbstractValue.java (original)
+++ axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/idl/values/AbstractValue.java Wed Apr 6 10:19:19 2011
@@ -19,16 +19,7 @@
package org.apache.axis2.corba.idl.values;
-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.Member;
-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.UnionType;
+import org.apache.axis2.corba.idl.types.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.omg.CORBA.Any;
@@ -38,6 +29,7 @@ import org.omg.CORBA_2_3.portable.InputS
import org.omg.CORBA_2_3.portable.OutputStream;
import java.io.Serializable;
+import java.math.BigDecimal;
public abstract class AbstractValue {
protected Object[] memberValues;
@@ -89,6 +81,7 @@ public abstract class AbstractValue {
case TCKind._tk_alias: ((AliasValue) value).write(outputStream); break;
case TCKind._tk_sequence: ((SequenceValue) value).write(outputStream); break;
case TCKind._tk_array: ((ArrayValue) value).write(outputStream); break;
+ case TCKind._tk_fixed: outputStream.write_fixed((BigDecimal) value); break;
default:
log.error("ERROR! Invalid dataType");
break;
@@ -115,7 +108,14 @@ public abstract class AbstractValue {
case TCKind._tk_wstring: ret = inputStream.read_wstring(); break;
case TCKind._tk_any: ret = inputStream.read_any(); break;
case TCKind._tk_value: ret = inputStream.read_value(); break;
- //case TCKind._tk_longdouble :
+ case TCKind._tk_fixed:
+ FixedType fixedType = (FixedType) dataType;
+ BigDecimal value = inputStream.read_fixed();
+ if (value != null) {
+ value = value.movePointLeft(fixedType.getScale());
+ }
+ ret = value;
+ break;
case TCKind._tk_struct:
StructValue structValue = new StructValue((Struct) dataType);
structValue.read(inputStream);
Modified: axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/receivers/CorbaUtil.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/receivers/CorbaUtil.java?rev=1089383&r1=1089382&r2=1089383&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/receivers/CorbaUtil.java (original)
+++ axis/axis2/java/core/trunk/modules/corba/src/org/apache/axis2/corba/receivers/CorbaUtil.java Wed Apr 6 10:19:19 2011
@@ -53,6 +53,7 @@ import org.omg.CosNaming.NamingContextPa
import javax.xml.namespace.QName;
import java.io.*;
+import java.math.BigDecimal;
import java.util.*;
//import java.io.FileInputStream;
@@ -235,7 +236,7 @@ public class CorbaUtil implements CorbaC
return null;
DataType aliasType = typedef.getDataType();
- if (!(aliasType instanceof AbstractCollectionType)) {
+ if (!(aliasType instanceof AbstractCollectionType || aliasType instanceof FixedType)) {
paramElement = paramElement.getFirstElement();
if (paramElement == null || !ARRAY_ITEM.equals(paramElement.getLocalName()))
return null;
@@ -383,6 +384,8 @@ public class CorbaUtil implements CorbaC
return anyValue;
}
}
+ } else if (dataType instanceof FixedType) {
+ return new BigDecimal(((OMElement) param).getText());
}
return null;
}
@@ -449,6 +452,8 @@ public class CorbaUtil implements CorbaC
OMNamespace ns = getNameSpaceForType(fac, service, typedef);
OMElement item = fac.createOMElement(ARRAY_ITEM, ns, child);
processResponse(item, child, aliasValue.getValue(), typedef.getDataType(), fac, ns, qualified, service);
+ } else if (dataType instanceof FixedType) {
+ child.addChild(fac.createOMText(child, resObject.toString()));
} else if (dataType instanceof AbstractCollectionType) {
AbstractCollectionType collectionType = (AbstractCollectionType) dataType;
AbstractCollectionValue collectionValue = (AbstractCollectionValue) resObject;
@@ -643,7 +648,7 @@ public class CorbaUtil implements CorbaC
AliasValue aliasValue = (AliasValue) value;
outputStream = (org.omg.CORBA_2_3.portable.OutputStream) arg.create_output_stream();
arg.type(aliasValue.getTypeCode());
- aliasValue.write(outputStream);
+ aliasValue.write(outputStream);//TODO: returning fixed variables, inside structs, etc.
arg.read_value(outputStream.create_input_stream (), aliasValue.getTypeCode());
break;
case TCKind._tk_sequence: