scheu       02/03/11 08:25:32

  Modified:    java/src/org/apache/axis/encoding/ser BeanSerializer.java
                        SimpleSerializer.java
               java/src/org/apache/axis/utils resources.properties
               java/src/org/apache/axis/wsdl/toJava
                        JavaComplexTypeWriter.java SchemaUtils.java
                        SymbolTable.java TypeEntry.java Utils.java
               java/test/wsdl/types ComprehensiveTypes.wsdl
                        VerifyTestCase.java
  Log:
  Added extended support for simpleTypes.  Pretty cool!
  
    1) Added "Derivation of complexType from a simpleType"
       which is an optional support feature in Table 18-1 of
       JSR 101.
  
       Example:
       <complexType name="stringWLength" >
         <simpleContent>
            <extension base="xsd:string" />
            <attribute name="length" type="xsd:int" />
         </simpleContent>
       </complexType>
  
       This allows the creation of a type that can be
       referenced in an attribute or an element.
       When referenced as an attribute type only the value is
       passed.  When referenced as an element type, the
       value is passed plus attributes may be set.
  
    2) Fixed up the isReferenced support for attribute types
       in the symbol table.  This was hard-coded as true...tisk tisk.
       Also changed getNestedTypes to consider the
       nested attributes.
  
    3) Fixed up the setting of the isSimpleType flag on
       the TypeEntry.  Now it is set for any Defined type entry
       which has a simpleType or simpleContent node.  The
       isSimpleType flag is reported in the debug information.
  
    4) Fixed up the way attribute types are added to the symbol table.
       Now a call to createTypeFromRef is called ....synonymous
       with the processing for elements.  This may result in
       a Undefined type.  In such cases the isSimpleType flag is
       set on the Undefined type to indicate that it was ref'd in
       a simpleContext.  Later when the Defined type is encountered
       a check is performed to ensure that it is a simple type.  Thus
       the checking of simple types should now work for forward
       references.
  
    5) Added some wsdl types (from Jeff Lee) to comprehensive tests
       to illustrate the newly supported syntax.
  
    6) Other minor changes.
  
  Revision  Changes    Path
  1.19      +3 -5      
xml-axis/java/src/org/apache/axis/encoding/ser/BeanSerializer.java
  
  Index: BeanSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanSerializer.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- BeanSerializer.java       9 Mar 2002 19:29:48 -0000       1.18
  +++ BeanSerializer.java       11 Mar 2002 16:25:31 -0000      1.19
  @@ -457,15 +457,13 @@
                   if (readMethod != null &&
                       readMethod.getParameterTypes().length == 0) {
                       // add to our attributes
  -                    Object propValue = propertyDescriptor[i].
  -                                        getReadMethod().invoke(value,noArgs);
  +                    Object propValue = readMethod.invoke(value,noArgs);
                       // If the property value does not exist, don't serialize
                       // the attribute.  In the future, the decision to serializer
                       // the attribute may be more sophisticated.  For example, don't
                       // serialize if the attribute matches the default value.
                       if (propValue != null) {
  -                        String propString = propValue != null ? 
propValue.toString() : "";
  -
  +                        String propString = propValue.toString();
                           String namespace = qname.getNamespaceURI();
                           String localName = qname.getLocalPart();
   
  @@ -474,7 +472,7 @@
                                              context.qName2String(qname),
                                              "CDATA",
                                              propString);
  -                    }
  +                    } 
                   }
               }
           } catch (Exception e) {
  
  
  
  1.8       +17 -14    
xml-axis/java/src/org/apache/axis/encoding/ser/SimpleSerializer.java
  
  Index: SimpleSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/SimpleSerializer.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SimpleSerializer.java     11 Mar 2002 05:05:27 -0000      1.7
  +++ SimpleSerializer.java     11 Mar 2002 16:25:31 -0000      1.8
  @@ -195,21 +195,24 @@
                   if (readMethod != null &&
                       readMethod.getParameterTypes().length == 0) {
                       // add to our attributes
  -                    Object propValue = propertyDescriptor[i].
  -                                        getReadMethod().
  +                    Object propValue = readMethod.
                                           invoke(value,BeanSerializer.noArgs);
  -                    // NOTE: we will always set the attribute here to something,
  -                    // which we may not want (i.e. if null, omit it)
  -                    String propString = propValue != null ? propValue.toString() : 
"";
  -
  -                    String namespace = qname.getNamespaceURI();
  -                    String localName = qname.getLocalPart();
  -
  -                    attrs.addAttribute(namespace,
  -                                       localName,
  -                                       context.qName2String(qname),
  -                                       "CDATA",
  -                                       propString);
  +                    // If the property value does not exist, don't serialize
  +                    // the attribute.  In the future, the decision to serializer
  +                    // the attribute may be more sophisticated.  For example, don't 
  +                    // serialize if the attribute matches the default value.
  +                    if (propValue != null) {
  +                        String propString = propValue.toString();
  +                        
  +                        String namespace = qname.getNamespaceURI();
  +                        String localName = qname.getLocalPart();
  +                        
  +                        attrs.addAttribute(namespace,
  +                                           localName,
  +                                           context.qName2String(qname),
  +                                           "CDATA",
  +                                           propString);
  +                    }
                   }
               }
           } catch (Exception e) {
  
  
  
  1.67      +1 -1      xml-axis/java/src/org/apache/axis/utils/resources.properties
  
  Index: resources.properties
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/resources.properties,v
  retrieving revision 1.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- resources.properties      11 Mar 2002 14:51:36 -0000      1.66
  +++ resources.properties      11 Mar 2002 16:25:31 -0000      1.67
  @@ -654,7 +654,7 @@
   literalTypePart00=Error: Message part {0} of operation or fault {1} is specified as 
a type and the soap:body use of binding "{2}" is literal.  This WSDL is not currently 
supported.
   BadServiceName00=Error: Empty or missing service name
   AttrNotSimpleType00=Bean attribute {0} is of type {1}, which is not a simple type
  -AttrNotSimpleType01=Error: attribute is of type {1}, which is not a simple type
  +AttrNotSimpleType01=Error: attribute is of type {0}, which is not a simple type
   NoSerializer00=Unable to find serializer for type {0}
   
   
  
  
  
  1.18      +1 -1      
xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaComplexTypeWriter.java
  
  Index: JavaComplexTypeWriter.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaComplexTypeWriter.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- JavaComplexTypeWriter.java        11 Mar 2002 05:04:59 -0000      1.17
  +++ JavaComplexTypeWriter.java        11 Mar 2002 16:25:32 -0000      1.18
  @@ -105,7 +105,7 @@
   
           // See if this class extends another class
           String extendsText = "";
  -        if (extendType != null) {
  +        if (extendType != null && !type.isSimpleType()) {
               extendsText = " extends " + extendType.getName() + " ";
           }
   
  
  
  
  1.13      +82 -9     xml-axis/java/src/org/apache/axis/wsdl/toJava/SchemaUtils.java
  
  Index: SchemaUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/SchemaUtils.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- SchemaUtils.java  6 Mar 2002 14:49:49 -0000       1.12
  +++ SchemaUtils.java  11 Mar 2002 16:25:32 -0000      1.13
  @@ -338,6 +338,75 @@
       }
   
       /**
  +     * If the specified node is a simple type or contains simpleContent, return true
  +     */
  +    public static boolean isSimpleTypeOrSimpleContent(Node node) {
  +        if (node == null) {
  +            return false;
  +        }
  +
  +        // If the node kind is an element, dive into it.
  +        QName nodeKind = Utils.getNodeQName(node);
  +        if (nodeKind != null &&
  +            nodeKind.getLocalPart().equals("element") &&
  +            Constants.isSchemaXSD(nodeKind.getNamespaceURI())) {
  +            NodeList children = node.getChildNodes();
  +            Node complexNode = null;
  +            for (int j = 0; j < children.getLength() && complexNode == null; j++) {
  +                QName kind = Utils.getNodeQName(children.item(j));
  +                if (kind != null &&
  +                    kind.getLocalPart().equals("complexType") &&
  +                    Constants.isSchemaXSD(kind.getNamespaceURI())) {
  +                    complexNode = children.item(j);
  +                    node = complexNode;
  +                }
  +                if (kind != null &&
  +                    kind.getLocalPart().equals("simpleType") &&
  +                    Constants.isSchemaXSD(kind.getNamespaceURI())) {
  +                    return true;
  +                }
  +            }
  +        }
  +
  +        // Expecting a schema complexType or simpleType
  +        nodeKind = Utils.getNodeQName(node);
  +        if (nodeKind != null &&
  +            nodeKind.getLocalPart().equals("simpleType") &&
  +            Constants.isSchemaXSD(nodeKind.getNamespaceURI())) {
  +            return true;
  +        }
  +
  +        if (nodeKind != null &&
  +            nodeKind.getLocalPart().equals("complexType") &&
  +            Constants.isSchemaXSD(nodeKind.getNamespaceURI())) {
  +
  +            // Under the complexType there could be complexContent/simpleContent
  +            // and extension elements if this is a derived type.  Skip over these.
  +            NodeList children = node.getChildNodes();
  +            Node complexContent = null;
  +            Node simpleContent = null;
  +            Node extension = null;
  +            for (int j = 0; j < children.getLength() && complexContent == null; 
j++) {
  +                QName complexContentKind = Utils.getNodeQName(children.item(j));
  +                if (complexContentKind != null &&
  +                    Constants.isSchemaXSD(complexContentKind.getNamespaceURI())) {
  +                    if (complexContentKind.getLocalPart().equals("complexContent") )
  +                        complexContent = children.item(j);
  +                    else if 
(complexContentKind.getLocalPart().equals("simpleContent"))
  +                        simpleContent = children.item(j);
  +                }
  +            }
  +            if (complexContent != null) {
  +                return false;
  +            }
  +            if (simpleContent != null) {
  +                return true;
  +            }
  +        }
  +        return false;
  +    }
  +
  +    /**
        * If the specified node represents a supported JAX-RPC complexType/element
        * which extends another complexType.  The Type of the base is returned.
        */
  @@ -373,17 +442,21 @@
               // Under the complexType there could be should be a complexContent &
               // extension elements if this is a derived type. 
               NodeList children = node.getChildNodes();
  -            Node complexContent = null;
  +            Node content = null;
               Node extension = null;
  -            for (int j = 0; j < children.getLength() && complexContent == null; 
j++) {
  -                QName complexContentKind = Utils.getNodeQName(children.item(j));
  -                if (complexContentKind != null &&
  -                    complexContentKind.getLocalPart().equals("complexContent") &&
  -                    Constants.isSchemaXSD(complexContentKind.getNamespaceURI()))
  -                    complexContent = children.item(j);
  +            for (int j = 0; j < children.getLength() && content == null; j++) {
  +                QName contentKind = Utils.getNodeQName(children.item(j));
  +                if (contentKind != null &&
  +                    contentKind.getLocalPart().equals("complexContent") &&
  +                    Constants.isSchemaXSD(contentKind.getNamespaceURI()))
  +                    content = children.item(j);
  +                if (contentKind != null &&
  +                    contentKind.getLocalPart().equals("simpleContent") &&
  +                    Constants.isSchemaXSD(contentKind.getNamespaceURI()))
  +                    content = children.item(j);
               }
  -            if (complexContent != null) {
  -                children = complexContent.getChildNodes();
  +            if (content != null) {
  +                children = content.getChildNodes();
                   for (int j = 0; j < children.getLength() && extension == null; j++) 
{
                       QName extensionKind = Utils.getNodeQName(children.item(j));
                       if (extensionKind != null &&
  
  
  
  1.42      +56 -41    xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java
  
  Index: SymbolTable.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- SymbolTable.java  8 Mar 2002 19:29:43 -0000       1.41
  +++ SymbolTable.java  11 Mar 2002 16:25:32 -0000      1.42
  @@ -556,47 +556,38 @@
                   // and element=.
                   createTypeFromDef(node, true, level > SCHEMA_LEVEL);
               }
  -            else if (localPart.equals("part") &&
  -                     Constants.isWSDL(nodeKind.getNamespaceURI())) {
  -
  -                // This is a wsdl part.  Create an TypeEntry representing the 
reference
  -                createTypeFromRef(node);
  -            }
  -            else if (isXSD && localPart.equals("simpleContent")) {
  -                // need to mark parent as a simple type
  -                Node parent = node.getParentNode();
  -                QName parentQName = Utils.getNodeNameQName(parent);
  -                TypeEntry te = getTypeEntry(parentQName, false);
  -                te.setSimpleType(true);
  -            }
               else if (isXSD && localPart.equals("attribute")) {
  -                // Create symbol table entry for attribute type
  +                // If the attribute has a type/ref attribute, create
  +                // a Type representing the referenced type.
  +                if (Utils.getAttribute(node, "type") != null) {
  +                    createTypeFromRef(node);
  +                }
  +
  +                // Get the symbol table entry and make sure it is a simple 
  +                // type
                   QName refQName = Utils.getNodeTypeRefQName(node, "type");
                   if (refQName != null) {
                       TypeEntry refType = getTypeEntry(refQName, false);
  -                    if (refType == null) {
  -                        // Not defined yet, add one
  -                        // TODO: This check is too basic, we need to handle
  -                        //       <simpleType> types also.
  -                        String baseName = btm.getBaseName(refQName);
  -                        if (baseName != null) {
  -                            BaseType bt = new BaseType(refQName);
  -                            symbolTablePut(bt);
  -                        }
  -                        else {
  -                            throw new IOException(
  -                                    JavaUtils.getMessage("AttrNotSimpleType01",
  -                                                         refQName.toString()));
  -                        }
  -                    } else {
  -                        // found a type entry, make sure we mark it referenced
  -                        // XXX This isn't usefull assumming we only support base
  -                        // XXX schema types (int, string), but in the future we
  -                        // XXX need to support <simpleTypes> as attributes.
  -                        refType.setIsReferenced(true);
  +                    if (refType != null &&
  +                        refType instanceof Undefined) {
  +                        // Don't know what the type is.
  +                        // It better be simple so set it as simple
  +                        refType.setSimpleType(true);
  +                    } else if (refType == null ||
  +                               (!(refType instanceof BaseType) &&
  +                                !refType.isSimpleType())) {
  +                        // Problem if not simple
  +                        throw new IOException(
  +                                              
JavaUtils.getMessage("AttrNotSimpleType01",
  +                                                                   
refQName.toString()));
                       }
                   }
  +            }
  +            else if (localPart.equals("part") &&
  +                     Constants.isWSDL(nodeKind.getNamespaceURI())) {
                   
  +                // This is a wsdl part.  Create an TypeEntry representing the 
reference
  +                createTypeFromRef(node);
               }
           }
   
  @@ -697,6 +688,9 @@
                           defType = new DefinedType(qName, refType, node, dims);
                       }
                       if (defType != null) {
  +                        if (simpleQName != null) {
  +                            defType.setSimpleType(true);
  +                        }
                           symbolTablePut(defType);
                       }
                   }
  @@ -707,14 +701,24 @@
                       if (baseName != null) {
                           symbolTablePut(new BaseType(qName));
                       }
  -                    else if (!isElement) {
  -                        symbolTablePut(new DefinedType(qName, node));
  -                    }
                       else {
  -                        // This is an element with an anonymous complex type
  -                        // Create the element if it is a global element
  -                        if (!belowSchemaLevel) {
  -                            symbolTablePut(new DefinedElement(qName, node));
  +
  +                        // Create a type entry, set whether it should
  +                        // be mapped as a simple type, and put it in the 
  +                        // symbol table.
  +                        TypeEntry te = null;
  +                        if (!isElement) {
  +                            te = new DefinedType(qName, node);
  +                        } else {
  +                            if (!belowSchemaLevel) {
  +                                te = new DefinedElement(qName, node);
  +                            }
  +                        }
  +                        if (te != null) {
  +                            if (SchemaUtils.isSimpleTypeOrSimpleContent(node)) {
  +                                te.setSimpleType(true);
  +                            }
  +                            symbolTablePut(te);
                           }
                       }
                   }
  @@ -1589,10 +1593,21 @@
               }
               if (entry instanceof Type && 
                   get(name, UndefinedType.class) != null) {
  +
                   // A undefined type  exists in the symbol table, which means
                   // that the type is used, but we don't yet have a definition for
                   // the type.  Now we DO have a definition for the type, so
                   // replace the existing undefined type with the real type.
  +
  +                if (((TypeEntry)get(name, UndefinedType.class)).isSimpleType() &&
  +                    !((TypeEntry)entry).isSimpleType()) {
  +                    // Problem if the undefined type was used in a 
  +                    // simple type context.
  +                    throw new IOException(
  +                                          
JavaUtils.getMessage("AttrNotSimpleType01",
  +                                                               name.toString()));
  +
  +                }
                   Vector v = (Vector) symbolTable.get(name);
                   for (int i = 0; i < v.size(); ++i) {
                       Object oldEntry = v.elementAt(i);
  
  
  
  1.9       +1 -0      xml-axis/java/src/org/apache/axis/wsdl/toJava/TypeEntry.java
  
  Index: TypeEntry.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/TypeEntry.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TypeEntry.java    27 Feb 2002 13:41:28 -0000      1.8
  +++ TypeEntry.java    11 Mar 2002 16:25:32 -0000      1.9
  @@ -318,6 +318,7 @@
               indent + "Class:         " + this.getClass().getName() + "\n" + 
               indent + "Base?:         " + isBaseType + "\n" + 
               indent + "Undefined?:    " + undefined + "\n" + 
  +            indent + "isSimpleType?  " + isSimpleType + "\n" +
               indent + "Node:          " + getNode() + "\n" +
               indent + "Dims:          " + dims + "\n" +
               refString;
  
  
  
  1.17      +11 -0     xml-axis/java/src/org/apache/axis/wsdl/toJava/Utils.java
  
  Index: Utils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/Utils.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Utils.java        27 Feb 2002 13:41:28 -0000      1.16
  +++ Utils.java        11 Mar 2002 16:25:32 -0000      1.17
  @@ -696,6 +696,17 @@
                   }
               }
           }
  +        // Process attributes declared in this type
  +        v = SchemaUtils.getComplexElementAttributes(type, symbolTable);
  +        if (v != null) {
  +            for (int i = 0; i < v.size(); i+=2) {
  +                if (!types.contains(v.get(i))) {
  +                    types.add(v.get(i));
  +                    getNestedTypes(
  +                            ((TypeEntry) v.get(i)).getNode(), types, symbolTable);
  +                }
  +            }
  +        }
           // Process extended types
           TypeEntry extendType = SchemaUtils.getComplexElementExtensionBase(type, 
symbolTable);
           if (extendType != null) {
  
  
  
  1.19      +33 -0     xml-axis/java/test/wsdl/types/ComprehensiveTypes.wsdl
  
  Index: ComprehensiveTypes.wsdl
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/types/ComprehensiveTypes.wsdl,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ComprehensiveTypes.wsdl   8 Mar 2002 22:26:46 -0000       1.18
  +++ ComprehensiveTypes.wsdl   11 Mar 2002 16:25:32 -0000      1.19
  @@ -78,8 +78,10 @@
               <xsd:element name="nested" type="typens2:b"/>
               <xsd:element name="optArray" minOccurs="0" maxOccurs="1" 
type="typens:array" />
               <xsd:element name="byteArray" type="typens:array_of_base64" />
  +            <xsd:element name="parm" type="typens:StringParameter" />
             </xsd:all>
             <xsd:attribute name="attr" type="typens:enum" />
  +          <xsd:attribute name="parmAttr" type="typens:StringParameter" />
           </xsd:complexType>
         </xsd:element>
   
  @@ -206,6 +208,37 @@
             <xsd:enumeration value="3"/>                    
           </xsd:restriction>
         </xsd:simpleType>
  +
  +
  +      <xsd:simpleType name="flowDirectionType">
  +        <xsd:restriction base="xsd:string">
  +          <xsd:enumeration value="in"/>
  +          <xsd:enumeration value="inOut"/>
  +          <xsd:enumeration value="out"/>
  +        </xsd:restriction>
  +      </xsd:simpleType>
  +
  +<xsd:simpleType name="passModeType">
  +    <xsd:restriction base="xsd:string">
  +        <xsd:enumeration value="passByValue"/>
  +        <xsd:enumeration value="passByReference"/>
  +     </xsd:restriction>
  +</xsd:simpleType>
  +
  +
  +<xsd:element name="StringParameter" type="typens:StringParameter" />
  + <xsd:complexType name="StringParameter">
  +   <xsd:simpleContent>
  +      <xsd:extension base="xsd:string">
  +        <xsd:attribute name="numBytes" type="xsd:int"/>
  +        <xsd:attribute name="storageEncoding" type="xsd:string"/>
  +        <xsd:attribute name="direction" type="typens:flowDirectionType"/>  <!-- in, 
out, or inOut -->
  +        <xsd:attribute name="passMode" type="typens:passModeType"/>  <!-- 
passByValue or passByReference -->
  +        <xsd:attribute name="description" type="xsd:string"/>
  +      </xsd:extension>
  +   </xsd:simpleContent>
  +</xsd:complexType>
  +
       </xsd:schema>
   
   
  
  
  
  1.14      +6 -0      xml-axis/java/test/wsdl/types/VerifyTestCase.java
  
  Index: VerifyTestCase.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/types/VerifyTestCase.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- VerifyTestCase.java       8 Mar 2002 22:26:46 -0000       1.13
  +++ VerifyTestCase.java       11 Mar 2002 16:25:32 -0000      1.14
  @@ -56,6 +56,7 @@
   import test.wsdl.types.comprehensive_types.EnumString;
   import test.wsdl.types.comprehensive_types.StockQuote;
   import test.wsdl.types.comprehensive_types.Time;
  +import test.wsdl.types.comprehensive_types.StringParameter;
   import test.wsdl.types.comprehensive_types2.A;
   import test.wsdl.types.comprehensive_types2.B;
   
  @@ -229,6 +230,8 @@
           a.setC(3);
           b.setD(a);
           ElemWComplex elemWComplex = new ElemWComplex();
  +        StringParameter sp = new StringParameter("sweet!");
  +        sp.setDescription("Pass this as an element and an attribute...wow!");
   
           elemWComplex.setOne( "one");
           elemWComplex.setTwo( new QName[] {new QName("two")});
  @@ -244,6 +247,9 @@
           elemWComplex.setOptArray( optArray );
           elemWComplex.setByteArray( byteArray );
           elemWComplex.setAttr(Enum.two);
  +        elemWComplex.setParm(sp);
  +        elemWComplex.setParmAttr(sp);
  +
           try {
               binding.elemWComplexIn(elemWComplex);
           } catch (java.rmi.RemoteException re) {
  
  
  


Reply via email to