diff options
author | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-09-14 13:16:39 +0000 |
---|---|---|
committer | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-09-14 13:16:39 +0000 |
commit | 9d7c57a0e1c12472126c0888ef238c00d93e9001 (patch) | |
tree | be6c90453a62a63174113e3615981e1346a2bc55 /sca-java-2.x/trunk | |
parent | f0581d45620443a18a263018a49432f26c9027e2 (diff) |
TUSCANY-3937 - Further fixes on top of Michael's patch to get the properties itest working. Mainly, builder changes to ignore null types (generated for non-JAXB pojos), update Node2JAXB to report validation errors so things don't go wrong silently, ensure default XMLType doesn't get updated, correct properties test to match OASIS, put properties test in the build.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1170598 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
13 files changed, 152 insertions, 47 deletions
diff --git a/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java b/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java index c32968fd87..c525fd7b28 100644 --- a/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java +++ b/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java @@ -80,6 +80,7 @@ import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; +import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper; import org.apache.tuscany.sca.interfacedef.util.XMLType; import org.apache.tuscany.sca.monitor.Monitor; import org.apache.tuscany.sca.policy.ExtensionType; @@ -97,7 +98,7 @@ import org.xml.sax.InputSource; public class ComponentBuilderImpl { protected static final String SCA11_NS = "http://docs.oasis-open.org/ns/opencsa/sca/200912"; protected static final String BINDING_SCA = "binding.sca"; - protected static final QName BINDING_SCA_QNAME = new QName(SCA11_NS, BINDING_SCA); + protected static final QName BINDING_SCA_QNAME = new QName(SCA11_NS, BINDING_SCA); private CompositeComponentTypeBuilderImpl componentTypeBuilder; protected ComponentPolicyBuilderImpl policyBuilder; @@ -348,6 +349,16 @@ public class ComponentBuilderImpl { // configure the property value based on the @file attribute processPropertyFileAttribute(component, componentProperty, monitor); + // Check that a type or element are specified + if (componentProperty.getXSDElement() == null && componentProperty.getXSDType() == null) { + Monitor.error(monitor, + this, + Messages.ASSEMBLY_VALIDATION, + "NoTypeForComponentProperty", + component.getName(), + componentProperty.getName()); + } + // Check that a value is supplied if (componentProperty.isMustSupply() && !isPropertyValueSet(componentProperty)) { Monitor.error(monitor, @@ -560,6 +571,13 @@ public class ComponentBuilderImpl { if (property != null) { componentProperty.setProperty(property); + // copy the types up if not specified at the component level + if (componentProperty.getXSDElement() == null){ + componentProperty.setXSDElement(property.getXSDElement()); + } + if (componentProperty.getXSDType() == null){ + componentProperty.setXSDType(property.getXSDType()); + } } else { Monitor.error(monitor, this, @@ -640,19 +658,10 @@ public class ComponentBuilderImpl { if (componentProperty.getXSDElement() == null) { componentProperty.setXSDElement(componentTypeProperty.getXSDElement()); } - - // Check that a type or element are specified - if (componentProperty.getXSDElement() == null && componentProperty.getXSDType() == null) { - Monitor.error(monitor, - this, - Messages.ASSEMBLY_VALIDATION, - "NoTypeForComponentProperty", - component.getName(), - componentProperty.getName()); - } // check that the types specified in the component type and component property match if ( componentProperty.getXSDElement() != null && + componentTypeProperty.getXSDElement() != null && !componentProperty.getXSDElement().equals(componentTypeProperty.getXSDElement())){ Monitor.error(monitor, this, @@ -665,7 +674,8 @@ public class ComponentBuilderImpl { } if ( componentProperty.getXSDType() != null && - !componentProperty.getXSDType().equals(componentTypeProperty.getXSDType())){ + componentTypeProperty.getXSDType() != null && + !componentProperty.getXSDType().equals(componentTypeProperty.getXSDType())){ Monitor.error(monitor, this, Messages.ASSEMBLY_VALIDATION, @@ -840,6 +850,12 @@ public class ComponentBuilderImpl { if (node != null) { componentProperty.setValue(node); + if(componentProperty.getXSDElement() == null){ + componentProperty.setXSDElement(sourceProp.getXSDElement()); + } + if(componentProperty.getXSDType() == null){ + componentProperty.setXSDType(sourceProp.getXSDType()); + } } else { Monitor.warning(monitor, this, diff --git a/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/Node2JAXB.java b/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/Node2JAXB.java index 55ed55651d..c191f42c1d 100644 --- a/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/Node2JAXB.java +++ b/sca-java-2.x/trunk/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/Node2JAXB.java @@ -20,6 +20,8 @@ package org.apache.tuscany.sca.databinding.jaxb; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; +import javax.xml.bind.ValidationEvent; +import javax.xml.bind.util.ValidationEventCollector; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.databinding.PullTransformer; @@ -34,12 +36,14 @@ import org.w3c.dom.Node; */ public class Node2JAXB extends BaseTransformer<Node, Object> implements PullTransformer<Node, Object> { private JAXBContextHelper contextHelper; + private ValidationEventCollector validationEventCollector = new ValidationEventCollector(); public Node2JAXB(ExtensionPointRegistry registry) { contextHelper = JAXBContextHelper.getInstance(registry); } public Object transform(Node source, TransformationContext context) { + Object response = null; if (source == null) return null; try { @@ -48,12 +52,27 @@ public class Node2JAXB extends BaseTransformer<Node, Object> implements PullTran Object result; // TUSCANY-3791 synchronized(source){ + /* some debug code + System.setProperty("jaxb.debug", "true"); + unmarshaller.setListener(new DebugListener()); + */ + validationEventCollector.reset(); + unmarshaller.setEventHandler(validationEventCollector); result = unmarshaller.unmarshal(source, JAXBContextHelper.getJavaType(context.getTargetDataType())); } - return JAXBContextHelper.createReturnValue(jaxbContext, context.getTargetDataType(), result); + response = JAXBContextHelper.createReturnValue(jaxbContext, context.getTargetDataType(), result); } catch (Exception e) { throw new TransformationException(e); } + + if (validationEventCollector.hasEvents()){ + String validationErrors = ""; + for(ValidationEvent event : validationEventCollector.getEvents()){ + validationErrors += "Event: " + event.getMessage() + " "; + } + throw new TransformationException(validationErrors); + } + return response; } @Override @@ -75,5 +94,16 @@ public class Node2JAXB extends BaseTransformer<Node, Object> implements PullTran public String getTargetDataBinding() { return JAXBDataBinding.NAME; } - + + /* some debug code + class DebugListener extends Unmarshaller.Listener { + public void beforeUnmarshal(Object target, Object parent) { + + } + + public void afterUnmarshal(Object target, Object parent) { + + } + } + */ } diff --git a/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java b/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java index 16de5bbefb..675ab2498b 100644 --- a/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java +++ b/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/databinding/PropertyDataTypeProcessor.java @@ -19,6 +19,8 @@ package org.apache.tuscany.sca.implementation.java.databinding; +import javax.xml.namespace.QName; + import org.apache.tuscany.sca.assembly.Property; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.UtilityExtensionPoint; @@ -65,13 +67,16 @@ public class PropertyDataTypeProcessor extends BaseJavaClassVisitor { JavaElementImpl element = type.getPropertyMembers().get(name); introspect(property, element); DataType dt = property.getDataType(); - if (dt.getLogical() instanceof XMLType) { - XMLType xmlType = (XMLType)dt.getLogical(); + Object logical = dt.getLogical(); + if (logical instanceof XMLType && + logical != XMLType.UNKNOWN) { + XMLType xmlType = (XMLType)logical; property.setXSDType(xmlType.getTypeName()); property.setXSDElement(xmlType.getElementName()); } else { Class<?> baseType = JavaIntrospectionHelper.getBaseType(element.getType(), element.getGenericType()); - property.setXSDType(JavaXMLMapper.getXMLType(baseType)); + QName typeName = JavaXMLMapper.getXMLType(baseType); + property.setXSDType(typeName); } } super.visitEnd(clazz, type); diff --git a/sca-java-2.x/trunk/testing/itest/pom.xml b/sca-java-2.x/trunk/testing/itest/pom.xml index 5a47c0d350..104ccc2489 100644 --- a/sca-java-2.x/trunk/testing/itest/pom.xml +++ b/sca-java-2.x/trunk/testing/itest/pom.xml @@ -76,9 +76,7 @@ <module>policy</module> <module>policies</module> <module>policy-transaction</module> -<!-- wait until databinding-sdo is in <module>properties</module> ---> <module>recursive-multi-level</module> <module>references</module> <module>scaclient-api</module> diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/java/mysca/test/myservice/impl/MyServiceImpl.java b/sca-java-2.x/trunk/testing/itest/properties/src/main/java/mysca/test/myservice/impl/MyServiceImpl.java index 7b44ef02e4..80e1a0d0ca 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/java/mysca/test/myservice/impl/MyServiceImpl.java +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/java/mysca/test/myservice/impl/MyServiceImpl.java @@ -37,10 +37,10 @@ import org.oasisopen.sca.annotation.Service; @Service(MyService.class) public class MyServiceImpl implements MyService { - @Property(name = "location") + @Property(name = "location", required=false) protected String location = "RTP"; - @Property(name = "year") + @Property(name = "year", required=false) protected String year = "2006"; @ComponentName diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/java/org/apache/tuscany/sca/itest/PropertyComponentImpl.java b/sca-java-2.x/trunk/testing/itest/properties/src/main/java/org/apache/tuscany/sca/itest/PropertyComponentImpl.java index 64ca749e9f..27b686bf14 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/java/org/apache/tuscany/sca/itest/PropertyComponentImpl.java +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/java/org/apache/tuscany/sca/itest/PropertyComponentImpl.java @@ -35,7 +35,6 @@ public class PropertyComponentImpl implements PropertyComponent { @Context protected ComponentContext context; - @Property protected ComplexPropertyBean complexPropertyOne; @Property @@ -78,6 +77,11 @@ public class PropertyComponentImpl implements PropertyComponent { public String getYear() { return year; } + + @Property + public void setComplexPropertyOne(ComplexPropertyBean complexPropertyOne){ + this.complexPropertyOne = complexPropertyOne; + } public ComplexPropertyBean getComplexPropertyOne() { //System.out.println(complexPropertyOne); diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/PropertyTest.composite b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/PropertyTest.composite index 7c834d5e0b..d89c1f82e0 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/PropertyTest.composite +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/PropertyTest.composite @@ -43,13 +43,13 @@ </value> </property> - <property name="moreComplex" type="foo:MyMoreComplexType"> - <value> + <property name="moreComplex" type="MyMoreComplexType"> + <value xmlns=""> <numberSetArray> <integerNumber>1</integerNumber> <floatNumber>11</floatNumber> <doubleNumber>111</doubleNumber> - </numberSetArray> + </numberSetArray> <numberSetArray> <integerNumber>2</integerNumber> <floatNumber>22</floatNumber> @@ -68,12 +68,12 @@ <integerNumber>54</integerNumber> <floatNumber>158.68</floatNumber> <doubleNumber>369.04</doubleNumber> - </numberSet> + </numberSet> </value> </property> - <property name="complexFoo" type="foo:MyMoreComplexType"> - <value> + <property name="complexFoo" type="MyMoreComplexType"> + <value xmlns=""> <stringArray>TestString_3</stringArray> <stringArray>TestString_4</stringArray> <intArray>100</intArray> @@ -114,15 +114,15 @@ <property name="nosource">aValue</property> <property name="fileProperty" file="fileProperty.txt"/> <property name="manyValuesFileProperty" many="true" file="manyValuesFileProperty.txt"/> - <property name="nonFileProperty" file="fileProperty.txt" source="$complex/foo:c"/> + <property name="nonFileProperty" source="$complex/foo:c"/> <property name="two" source="$number">25</property> </component> <component name="PropertyComponent"> <implementation.java class="org.apache.tuscany.sca.itest.PropertyComponentImpl"/> <property name="complexPropertyOne" source="$moreComplex"></property> - <property name="complexPropertyTwo" type="foo:MyMoreComplexType"> - <value> + <property name="complexPropertyTwo" type="MyMoreComplexType"> + <value xmlns=""> <stringArray>TestString_1</stringArray> <stringArray>TestString_2</stringArray> <intArray>10</intArray> @@ -150,7 +150,7 @@ </value> </property> <property name="complexPropertyThree" element="foo:PropertyThreeElement"> - <PropertyThreeElement xmlns="http://foo"> + <PropertyThreeElement xmlns=""> <stringArray>TestElementString_1</stringArray> <stringArray>TestElementString_2</stringArray> <intArray>10</intArray> @@ -177,8 +177,8 @@ </numberSet> </PropertyThreeElement> </property> - <property name="complexPropertyFour" element="foo:PropertyFourElement" many="true"> - <PropertyFourElement xmlns="http://foo"> + <property name="complexPropertyFour" element="PropertyFourElement" many="true"> + <PropertyFourElement xmlns=""> <integerNumber>1</integerNumber> <floatNumber>11.11</floatNumber> <doubleNumber>111.111</doubleNumber> @@ -188,7 +188,7 @@ <doubleNumber>11111.11111</doubleNumber> </numberSet> </PropertyFourElement> - <PropertyFourElement xmlns="http://foo"> + <PropertyFourElement xmlns=""> <integerNumber>2</integerNumber> <floatNumber>22.22</floatNumber> <doubleNumber>222.222</doubleNumber> @@ -198,7 +198,7 @@ <doubleNumber>22222.22222</doubleNumber> </numberSet> </PropertyFourElement> - <PropertyFourElement xmlns="http://foo"> + <PropertyFourElement xmlns=""> <integerNumber>3</integerNumber> <floatNumber>33.33</floatNumber> <doubleNumber>333.333</doubleNumber> diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/fileProperty.txt b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/fileProperty.txt index 7e932622ce..71d0c25730 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/fileProperty.txt +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/fileProperty.txt @@ -17,5 +17,6 @@ * specific language governing permissions and limitations * under the License. --> - -<filePropertyTest>fileValue</filePropertyTest>
\ No newline at end of file +<values xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"> + <value>fileValue</value> +</values>
\ No newline at end of file diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/foo.xsd b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/foo.xsd index 6831f66cec..5bf3e5f52a 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/foo.xsd +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/foo.xsd @@ -37,4 +37,5 @@ </xsd:element>
</xsd:sequence>
</xsd:complexType>
+
</xsd:schema>
\ No newline at end of file diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/manyValuesFileProperty.txt b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/manyValuesFileProperty.txt index e037537d7d..3b58d863df 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/manyValuesFileProperty.txt +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/manyValuesFileProperty.txt @@ -17,9 +17,9 @@ * specific language governing permissions and limitations
* under the License.
-->
-<value>
+<values xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912">
<manyFilePropertyValues>fileValueOne</manyFilePropertyValues>
<manyFilePropertyValues>fileValueTwo</manyFilePropertyValues>
<manyFilePropertyValues>fileValueThree</manyFilePropertyValues>
<manyFilePropertyValues>fileValueFour</manyFilePropertyValues>
-</value>
\ No newline at end of file +</values>
\ No newline at end of file diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/noNamespace.xsd b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/noNamespace.xsd new file mode 100644 index 0000000000..f416ccc241 --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/noNamespace.xsd @@ -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.
+-->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="unqualified">
+
+ <xsd:complexType name="NumberSetType">
+ <xsd:sequence>
+ <xsd:element name="integerNumber" type="xsd:int"/>
+ <xsd:element name="floatNumber" type="xsd:float"/>
+ <xsd:element name="doubleNumber" type="xsd:double"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="MyMoreComplexType">
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="numberSetArray" type="NumberSetType" />
+ <xsd:element name="stringArray" type="xsd:string" />
+ <xsd:element name="intArray" type="xsd:int" />
+ <xsd:element name="integerNumber" type="xsd:int" />
+ <xsd:element name="floatNumber" type="xsd:float" />
+ <xsd:element name="doubleNumber" type="xsd:double" />
+ <xsd:element name="doubleArray" type="xsd:double" />
+ <xsd:element name="numberSet" type="NumberSetType"/>
+ </xsd:choice>
+ </xsd:complexType>
+
+ <xsd:element name="PropertyThreeElement" type="MyMoreComplexType"/>
+
+ <xsd:element name="PropertyFourElement" type="MyMoreComplexType"/>
+
+ </xsd:schema>
\ No newline at end of file diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/rcProps.txt b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/rcProps.txt index 052c291fd0..07f4b4807a 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/rcProps.txt +++ b/sca-java-2.x/trunk/testing/itest/properties/src/main/resources/rcProps.txt @@ -16,7 +16,10 @@ * specific language governing permissions and limitations * under the License. --> -<MyRCProps xmlns="http://test.sca.jaxb/rcprops"> - <AInt>20</AInt> - <BInteger>20</BInteger> -</MyRCProps> + +<values xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"> + <MyRCProps xmlns="http://test.sca.jaxb/rcprops"> + <AInt>20</AInt> + <BInteger>20</BInteger> + </MyRCProps> +</values> diff --git a/sca-java-2.x/trunk/testing/itest/properties/src/test/java/org/apache/tuscany/sca/itest/PropertyTestCase.java b/sca-java-2.x/trunk/testing/itest/properties/src/test/java/org/apache/tuscany/sca/itest/PropertyTestCase.java index eb217600db..0106d8a665 100644 --- a/sca-java-2.x/trunk/testing/itest/properties/src/test/java/org/apache/tuscany/sca/itest/PropertyTestCase.java +++ b/sca-java-2.x/trunk/testing/itest/properties/src/test/java/org/apache/tuscany/sca/itest/PropertyTestCase.java @@ -284,7 +284,7 @@ public class PropertyTestCase { ComplexPropertyBean propBean = propertyService.getComplexPropertyTwo(); assertNotNull(propBean); assertEquals(10, propBean.intArray[0]); - assertEquals((float)22, propBean.numberSetArray[1].floatNumber); + assertEquals((float)22, propBean.numberSetArray[1].floatNumber, 0.1); } /** @@ -299,7 +299,7 @@ public class PropertyTestCase { ComplexPropertyBean propBean = propertyService.getComplexPropertyThree(); assertNotNull(propBean); assertEquals("TestElementString_1", propBean.stringArray[0]); - assertEquals((float)22, propBean.numberSetArray[1].floatNumber); + assertEquals((float)22, propBean.numberSetArray[1].floatNumber, 0.1); } /** @@ -314,7 +314,7 @@ public class PropertyTestCase { Object[] propBeanCollection = propertyService.getComplexPropertyFour().toArray(); assertNotNull(propBeanCollection); assertEquals(1, ((ComplexPropertyBean)propBeanCollection[0]).getIntegerNumber()); - assertEquals(222.222, ((ComplexPropertyBean)propBeanCollection[1]).getDoubleNumber()); + assertEquals(222.222, ((ComplexPropertyBean)propBeanCollection[1]).getDoubleNumber(), 0.1); assertEquals(33, ((ComplexPropertyBean)propBeanCollection[2]).getNumberSet().getIntegerNumber()); } |