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 }