src/share/jaxws_classes/com/sun/xml/internal/ws/server/sei/EndpointResponseMessageBuilder.java

changeset 368
0989ad8c0860
parent 286
f50545b5e2f1
child 637
9c07ef4934dd
     1.1 --- a/src/share/jaxws_classes/com/sun/xml/internal/ws/server/sei/EndpointResponseMessageBuilder.java	Thu Apr 04 19:05:24 2013 -0700
     1.2 +++ b/src/share/jaxws_classes/com/sun/xml/internal/ws/server/sei/EndpointResponseMessageBuilder.java	Tue Apr 09 14:51:13 2013 +0100
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -143,10 +143,20 @@
    1.11           */
    1.12          protected final ValueGetter[] getters;
    1.13  
    1.14 +        /**
    1.15 +         * How does each wrapped parameter binds to XML?
    1.16 +         */
    1.17 +        protected XMLBridge[] parameterBridges;
    1.18 +
    1.19 +        /**
    1.20 +         * Used for error diagnostics.
    1.21 +         */
    1.22 +        protected List<ParameterImpl> children;
    1.23 +
    1.24          protected Wrapped(WrapperParameter wp, SOAPVersion soapVersion) {
    1.25              super(wp.getXMLBridge(), soapVersion);
    1.26  
    1.27 -            List<ParameterImpl> children = wp.getWrapperChildren();
    1.28 +            children = wp.getWrapperChildren();
    1.29  
    1.30              indices = new int[children.size()];
    1.31              getters = new ValueGetter[children.size()];
    1.32 @@ -156,6 +166,32 @@
    1.33                  getters[i] = ValueGetter.get(p);
    1.34              }
    1.35          }
    1.36 +
    1.37 +        /**
    1.38 +         * Packs a bunch of arguments intoa {@link WrapperComposite}.
    1.39 +         */
    1.40 +        WrapperComposite buildWrapperComposite(Object[] methodArgs, Object returnValue) {
    1.41 +            WrapperComposite cs = new WrapperComposite();
    1.42 +            cs.bridges = parameterBridges;
    1.43 +            cs.values = new Object[parameterBridges.length];
    1.44 +
    1.45 +            // fill in wrapped parameters from methodArgs
    1.46 +            for( int i=indices.length-1; i>=0; i-- ) {
    1.47 +                Object v;
    1.48 +                if (indices[i] == -1) {
    1.49 +                    v = getters[i].get(returnValue);
    1.50 +                } else {
    1.51 +                    v = getters[i].get(methodArgs[indices[i]]);
    1.52 +                }
    1.53 +                if(v==null) {
    1.54 +                    throw new WebServiceException("Method Parameter: "+
    1.55 +                        children.get(i).getName() +" cannot be null. This is BP 1.1 R2211 violation.");
    1.56 +                }
    1.57 +                cs.values[i] = v;
    1.58 +            }
    1.59 +
    1.60 +            return cs;
    1.61 +        }
    1.62      }
    1.63  
    1.64      /**
    1.65 @@ -174,6 +210,7 @@
    1.66           * Wrapper bean.
    1.67           */
    1.68          private final Class wrapper;
    1.69 +        private boolean dynamicWrapper;
    1.70  
    1.71          /**
    1.72           * Needed to get wrapper instantiation method.
    1.73 @@ -186,21 +223,26 @@
    1.74          public DocLit(WrapperParameter wp, SOAPVersion soapVersion) {
    1.75              super(wp, soapVersion);
    1.76              bindingContext = wp.getOwner().getBindingContext();
    1.77 -
    1.78              wrapper = (Class)wp.getXMLBridge().getTypeInfo().type;
    1.79 -
    1.80 -            List<ParameterImpl> children = wp.getWrapperChildren();
    1.81 -
    1.82 +            dynamicWrapper = WrapperComposite.class.equals(wrapper);
    1.83 +            children = wp.getWrapperChildren();
    1.84 +            parameterBridges = new XMLBridge[children.size()];
    1.85              accessors = new PropertyAccessor[children.size()];
    1.86              for( int i=0; i<accessors.length; i++ ) {
    1.87                  ParameterImpl p = children.get(i);
    1.88                  QName name = p.getName();
    1.89 -                try {
    1.90 -                    accessors[i] = p.getOwner().getBindingContext().getElementPropertyAccessor(
    1.91 -                        wrapper, name.getNamespaceURI(), name.getLocalPart() );
    1.92 -                } catch (JAXBException e) {
    1.93 -                    throw new WebServiceException(  // TODO: i18n
    1.94 -                        wrapper+" do not have a property of the name "+name,e);
    1.95 +                if (dynamicWrapper) {
    1.96 +                    parameterBridges[i] = children.get(i).getInlinedRepeatedElementBridge();
    1.97 +                    if (parameterBridges[i] == null) parameterBridges[i] = children.get(i).getXMLBridge();
    1.98 +                } else {
    1.99 +                    try {
   1.100 +                        accessors[i] = (dynamicWrapper) ? null :
   1.101 +                            p.getOwner().getBindingContext().getElementPropertyAccessor(
   1.102 +                            wrapper, name.getNamespaceURI(), name.getLocalPart() );
   1.103 +                    } catch (JAXBException e) {
   1.104 +                        throw new WebServiceException(  // TODO: i18n
   1.105 +                            wrapper+" do not have a property of the name "+name,e);
   1.106 +                    }
   1.107                  }
   1.108              }
   1.109  
   1.110 @@ -210,6 +252,7 @@
   1.111           * Packs a bunch of arguments into a {@link WrapperComposite}.
   1.112           */
   1.113          Object build(Object[] methodArgs, Object returnValue) {
   1.114 +            if (dynamicWrapper) return buildWrapperComposite(methodArgs, returnValue);
   1.115              try {
   1.116                  //Object bean = wrapper.newInstance();
   1.117                  Object bean = bindingContext.newWrapperInstace(wrapper);
   1.118 @@ -251,15 +294,6 @@
   1.119       * (TODO: Why don't we have a wrapper bean for this, when doc/lit does!?)
   1.120       */
   1.121      public final static class RpcLit extends Wrapped {
   1.122 -        /**
   1.123 -         * How does each wrapped parameter binds to XML?
   1.124 -         */
   1.125 -        private final XMLBridge[] parameterBridges;
   1.126 -
   1.127 -        /**
   1.128 -         * Used for error diagnostics.
   1.129 -         */
   1.130 -        private final List<ParameterImpl> children;
   1.131  
   1.132          /**
   1.133           * Creates a {@link EndpointResponseMessageBuilder} from a {@link WrapperParameter}.
   1.134 @@ -269,8 +303,6 @@
   1.135              // we'll use CompositeStructure to pack requests
   1.136              assert wp.getTypeInfo().type==WrapperComposite.class;
   1.137  
   1.138 -            this.children = wp.getWrapperChildren();
   1.139 -
   1.140              parameterBridges = new XMLBridge[children.size()];
   1.141              for( int i=0; i<parameterBridges.length; i++ )
   1.142                  parameterBridges[i] = children.get(i).getXMLBridge();
   1.143 @@ -279,27 +311,8 @@
   1.144          /**
   1.145           * Packs a bunch of arguments intoa {@link WrapperComposite}.
   1.146           */
   1.147 -        WrapperComposite build(Object[] methodArgs, Object returnValue) {
   1.148 -            WrapperComposite cs = new WrapperComposite();
   1.149 -            cs.bridges = parameterBridges;
   1.150 -            cs.values = new Object[parameterBridges.length];
   1.151 -
   1.152 -            // fill in wrapped parameters from methodArgs
   1.153 -            for( int i=indices.length-1; i>=0; i-- ) {
   1.154 -                Object v;
   1.155 -                if (indices[i] == -1) {
   1.156 -                    v = getters[i].get(returnValue);
   1.157 -                } else {
   1.158 -                    v = getters[i].get(methodArgs[indices[i]]);
   1.159 -                }
   1.160 -                if(v==null) {
   1.161 -                    throw new WebServiceException("Method Parameter: "+
   1.162 -                        children.get(i).getName() +" cannot be null. This is BP 1.1 R2211 violation.");
   1.163 -                }
   1.164 -                cs.values[i] = v;
   1.165 -            }
   1.166 -
   1.167 -            return cs;
   1.168 +        Object build(Object[] methodArgs, Object returnValue) {
   1.169 +            return buildWrapperComposite(methodArgs, returnValue);
   1.170          }
   1.171      }
   1.172  }

mercurial