8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.xml.internal.messaging.saaj.soap.impl; 27 28 import java.util.*; 29 import java.util.logging.Level; 30 31 import javax.xml.namespace.QName; 32 import javax.xml.soap.*; 33 34 import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; 35 import org.w3c.dom.Element; 36 37 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; 38 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; 39 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; 40 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; 41 42 public abstract class HeaderImpl extends ElementImpl implements SOAPHeader { 43 protected static final boolean MUST_UNDERSTAND_ONLY = false; 44 45 protected HeaderImpl(SOAPDocumentImpl ownerDoc, NameImpl name) { 46 super(ownerDoc, name); 47 } 48 49 public HeaderImpl(SOAPDocumentImpl ownerDoc, Element domElement) { 50 super(ownerDoc, domElement); 51 } 52 53 protected abstract SOAPHeaderElement createHeaderElement(Name name) 54 throws SOAPException; 55 protected abstract SOAPHeaderElement createHeaderElement(QName name) 56 throws SOAPException; 57 protected abstract NameImpl getNotUnderstoodName(); 58 protected abstract NameImpl getUpgradeName(); 59 protected abstract NameImpl getSupportedEnvelopeName(); 60 61 public SOAPHeaderElement addHeaderElement(Name name) throws SOAPException { 62 SOAPElement newHeaderElement = 63 ElementFactory.createNamedElement( 64 ((SOAPDocument) getOwnerDocument()).getDocument(), 65 name.getLocalName(), 66 name.getPrefix(), 67 name.getURI()); 68 if (newHeaderElement == null 69 || !(newHeaderElement instanceof SOAPHeaderElement)) { 70 newHeaderElement = createHeaderElement(name); 71 } 72 73 // header elements must be namespace qualified 74 // check that URI is not empty, ensuring that the element is NS qualified. 75 String uri = newHeaderElement.getElementQName().getNamespaceURI(); 76 if ((uri == null) || ("").equals(uri)) { 77 log.severe("SAAJ0131.impl.header.elems.ns.qualified"); 78 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified"); 79 } 80 addNode(newHeaderElement); 81 return (SOAPHeaderElement) newHeaderElement; 82 } 83 84 public SOAPHeaderElement addHeaderElement(QName name) throws SOAPException { 85 SOAPElement newHeaderElement = 86 ElementFactory.createNamedElement( 87 ((SOAPDocument) getOwnerDocument()).getDocument(), 88 name.getLocalPart(), 89 name.getPrefix(), 90 name.getNamespaceURI()); 91 if (newHeaderElement == null 92 || !(newHeaderElement instanceof SOAPHeaderElement)) { 93 newHeaderElement = createHeaderElement(name); 94 } 95 96 // header elements must be namespace qualified 97 // check that URI is not empty, ensuring that the element is NS qualified. 98 String uri = newHeaderElement.getElementQName().getNamespaceURI(); 99 if ((uri == null) || ("").equals(uri)) { 100 log.severe("SAAJ0131.impl.header.elems.ns.qualified"); 101 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified"); 102 } 103 addNode(newHeaderElement); 104 return (SOAPHeaderElement) newHeaderElement; 105 } 106 107 protected SOAPElement addElement(Name name) throws SOAPException { 108 return addHeaderElement(name); 109 } 110 111 protected SOAPElement addElement(QName name) throws SOAPException { 112 return addHeaderElement(name); 113 } 114 115 public Iterator examineHeaderElements(String actor) { 116 return getHeaderElementsForActor(actor, false, false); 117 } 118 119 public Iterator extractHeaderElements(String actor) { 120 return getHeaderElementsForActor(actor, true, false); 121 } 122 123 protected Iterator<SOAPHeaderElement> getHeaderElementsForActor( 124 String actor, 125 boolean detach, 126 boolean mustUnderstand) { 127 if (actor == null || actor.equals("")) { 128 log.severe("SAAJ0132.impl.invalid.value.for.actor.or.role"); 129 throw new IllegalArgumentException("Invalid value for actor or role"); 130 } 131 return getHeaderElements(actor, detach, mustUnderstand); 132 } 133 134 protected Iterator<SOAPHeaderElement> getHeaderElements( 135 String actor, 136 boolean detach, 137 boolean mustUnderstand) { 138 List<SOAPHeaderElement> elementList = new ArrayList<SOAPHeaderElement>(); 139 140 Iterator<org.w3c.dom.Node> eachChild = getChildElements(); 141 142 org.w3c.dom.Node currentChild = iterate(eachChild); 143 while (currentChild != null) { 144 if (!(currentChild instanceof SOAPHeaderElement)) { 145 currentChild = iterate(eachChild); 146 } else { 147 HeaderElementImpl currentElement = 148 (HeaderElementImpl) currentChild; 149 currentChild = iterate(eachChild); 150 151 boolean isMustUnderstandMatching = 152 (!mustUnderstand || currentElement.getMustUnderstand()); 153 boolean doAdd = false; 154 if (actor == null && isMustUnderstandMatching) { 155 doAdd = true; 156 } else { 157 String currentActor = currentElement.getActorOrRole(); 158 if (currentActor == null) { 159 currentActor = ""; 160 } 164 doAdd = true; 165 } 166 } 167 168 if (doAdd) { 169 elementList.add(currentElement); 170 if (detach) { 171 currentElement.detachNode(); 172 } 173 } 174 } 175 } 176 177 return elementList.listIterator(); 178 } 179 180 private <T> T iterate(Iterator<T> each) { 181 return each.hasNext() ? each.next() : null; 182 } 183 184 public void setParentElement(SOAPElement element) throws SOAPException { 185 if (!(element instanceof SOAPEnvelope)) { 186 log.severe("SAAJ0133.impl.header.parent.mustbe.envelope"); 187 throw new SOAPException("Parent of SOAPHeader has to be a SOAPEnvelope"); 188 } 189 super.setParentElement(element); 190 } 191 192 // overriding ElementImpl's method to ensure that HeaderElements are 193 // namespace qualified. Holds for both SOAP versions. 194 // TODO - This check needs to be made for other addChildElement() methods 195 // as well. 196 public SOAPElement addChildElement(String localName) throws SOAPException { 197 198 SOAPElement element = super.addChildElement(localName); 199 // check that URI is not empty, ensuring that the element is NS qualified. 200 String uri = element.getElementName().getURI(); 201 if ((uri == null) || ("").equals(uri)) { 202 log.severe("SAAJ0134.impl.header.elems.ns.qualified"); 203 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified"); 204 } 205 return element; 206 } 207 208 public Iterator examineAllHeaderElements() { 209 return getHeaderElements(null, false, MUST_UNDERSTAND_ONLY); 210 } 211 212 public Iterator examineMustUnderstandHeaderElements(String actor) { 213 return getHeaderElements(actor, false, true); 214 215 } 216 217 public Iterator extractAllHeaderElements() { 218 return getHeaderElements(null, true, false); 219 } 220 221 public SOAPHeaderElement addUpgradeHeaderElement(Iterator supportedSoapUris) 222 throws SOAPException { 223 if (supportedSoapUris == null) { 224 log.severe("SAAJ0411.ver1_2.no.null.supportedURIs"); 225 throw new SOAPException("Argument cannot be null; iterator of supportedURIs cannot be null"); 226 } 227 if (!supportedSoapUris.hasNext()) { 228 log.severe("SAAJ0412.ver1_2.no.empty.list.of.supportedURIs"); 229 throw new SOAPException("List of supported URIs cannot be empty"); 230 } 231 Name upgradeName = getUpgradeName(); 232 SOAPHeaderElement upgradeHeaderElement = 233 (SOAPHeaderElement) addChildElement(upgradeName); 234 Name supportedEnvelopeName = getSupportedEnvelopeName(); 235 int i = 0; 236 while (supportedSoapUris.hasNext()) { 237 SOAPElement subElement = 238 upgradeHeaderElement.addChildElement(supportedEnvelopeName); 239 String ns = "ns" + Integer.toString(i); 240 subElement.addAttribute( 241 NameImpl.createFromUnqualifiedName("qname"), 242 ns + ":Envelope"); 243 subElement.addNamespaceDeclaration( 244 ns, 245 (String) supportedSoapUris.next()); 246 i ++; 247 } 248 return upgradeHeaderElement; 249 } 250 251 public SOAPHeaderElement addUpgradeHeaderElement(String supportedSoapUri) 252 throws SOAPException { 253 return addUpgradeHeaderElement(new String[] {supportedSoapUri}); 254 } 255 256 public SOAPHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris) 257 throws SOAPException { 258 259 if (supportedSoapUris == null) { 260 log.severe("SAAJ0411.ver1_2.no.null.supportedURIs"); 261 throw new SOAPException("Argument cannot be null; array of supportedURIs cannot be null"); 262 } 263 if (supportedSoapUris.length == 0) { 264 log.severe("SAAJ0412.ver1_2.no.empty.list.of.supportedURIs"); 265 throw new SOAPException("List of supported URIs cannot be empty"); 266 } 267 Name upgradeName = getUpgradeName(); 268 SOAPHeaderElement upgradeHeaderElement = 269 (SOAPHeaderElement) addChildElement(upgradeName); 270 Name supportedEnvelopeName = getSupportedEnvelopeName(); 271 for (int i = 0; i < supportedSoapUris.length; i ++) { 272 SOAPElement subElement = 273 upgradeHeaderElement.addChildElement(supportedEnvelopeName); 274 String ns = "ns" + Integer.toString(i); 275 subElement.addAttribute( 276 NameImpl.createFromUnqualifiedName("qname"), 277 ns + ":Envelope"); 278 subElement.addNamespaceDeclaration(ns, supportedSoapUris[i]); 279 } 280 return upgradeHeaderElement; 281 } 282 283 protected SOAPElement convertToSoapElement(Element element) { 284 final org.w3c.dom.Node soapNode = getSoapDocument().findIfPresent(element); 285 if (soapNode instanceof SOAPHeaderElement) { 286 return (SOAPElement) soapNode; 287 } else { 288 SOAPHeaderElement headerElement; 289 try { 290 headerElement = 291 createHeaderElement(NameImpl.copyElementName(element)); 292 } catch (SOAPException e) { 293 throw new ClassCastException("Could not convert Element to SOAPHeaderElement: " + e.getMessage()); 294 } 295 return replaceElementWithSOAPElement( 296 element, 297 (ElementImpl) headerElement); 298 } 299 } 300 301 public SOAPElement setElementQName(QName newName) throws SOAPException { 302 log.log(Level.SEVERE, 303 "SAAJ0146.impl.invalid.name.change.requested", 304 new Object[] {elementQName.getLocalPart(), 305 newName.getLocalPart()}); 306 throw new SOAPException("Cannot change name for " 307 + elementQName.getLocalPart() + " to " 308 + newName.getLocalPart()); 309 } 310 311 } | 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.xml.internal.messaging.saaj.soap.impl; 27 28 import java.util.logging.Level; 29 30 import javax.xml.namespace.QName; 31 32 import org.w3c.dom.Element; 33 34 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; 35 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; 36 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; 37 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; 38 import java.util.ArrayList; 39 import java.util.Iterator; 40 import java.util.List; 41 import javax.xml.soap.Name; 42 import javax.xml.soap.SOAPElement; 43 import javax.xml.soap.SOAPEnvelope; 44 import javax.xml.soap.SOAPException; 45 import javax.xml.soap.SOAPHeader; 46 import javax.xml.soap.SOAPHeaderElement; 47 48 public abstract class HeaderImpl extends ElementImpl implements SOAPHeader { 49 protected static final boolean MUST_UNDERSTAND_ONLY = false; 50 51 protected HeaderImpl(SOAPDocumentImpl ownerDoc, NameImpl name) { 52 super(ownerDoc, name); 53 } 54 55 public HeaderImpl(SOAPDocumentImpl ownerDoc, Element domElement) { 56 super(ownerDoc, domElement); 57 } 58 59 protected abstract SOAPHeaderElement createHeaderElement(Name name) 60 throws SOAPException; 61 protected abstract SOAPHeaderElement createHeaderElement(QName name) 62 throws SOAPException; 63 protected abstract NameImpl getNotUnderstoodName(); 64 protected abstract NameImpl getUpgradeName(); 65 protected abstract NameImpl getSupportedEnvelopeName(); 66 67 @Override 68 public SOAPHeaderElement addHeaderElement(Name name) throws SOAPException { 69 SOAPElement newHeaderElement = 70 ElementFactory.createNamedElement( 71 ((SOAPDocument) getOwnerDocument()).getDocument(), 72 name.getLocalName(), 73 name.getPrefix(), 74 name.getURI()); 75 if (newHeaderElement == null 76 || !(newHeaderElement instanceof SOAPHeaderElement)) { 77 newHeaderElement = createHeaderElement(name); 78 } 79 80 // header elements must be namespace qualified 81 // check that URI is not empty, ensuring that the element is NS qualified. 82 String uri = newHeaderElement.getElementQName().getNamespaceURI(); 83 if ((uri == null) || ("").equals(uri)) { 84 log.severe("SAAJ0131.impl.header.elems.ns.qualified"); 85 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified"); 86 } 87 addNode(newHeaderElement); 88 return (SOAPHeaderElement) newHeaderElement; 89 } 90 91 @Override 92 public SOAPHeaderElement addHeaderElement(QName name) throws SOAPException { 93 SOAPElement newHeaderElement = 94 ElementFactory.createNamedElement( 95 ((SOAPDocument) getOwnerDocument()).getDocument(), 96 name.getLocalPart(), 97 name.getPrefix(), 98 name.getNamespaceURI()); 99 if (newHeaderElement == null 100 || !(newHeaderElement instanceof SOAPHeaderElement)) { 101 newHeaderElement = createHeaderElement(name); 102 } 103 104 // header elements must be namespace qualified 105 // check that URI is not empty, ensuring that the element is NS qualified. 106 String uri = newHeaderElement.getElementQName().getNamespaceURI(); 107 if ((uri == null) || ("").equals(uri)) { 108 log.severe("SAAJ0131.impl.header.elems.ns.qualified"); 109 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified"); 110 } 111 addNode(newHeaderElement); 112 return (SOAPHeaderElement) newHeaderElement; 113 } 114 115 @Override 116 protected SOAPElement addElement(Name name) throws SOAPException { 117 return addHeaderElement(name); 118 } 119 120 @Override 121 protected SOAPElement addElement(QName name) throws SOAPException { 122 return addHeaderElement(name); 123 } 124 125 @Override 126 public Iterator<SOAPHeaderElement> examineHeaderElements(String actor) { 127 return getHeaderElementsForActor(actor, false, false); 128 } 129 130 @Override 131 public Iterator<SOAPHeaderElement> extractHeaderElements(String actor) { 132 return getHeaderElementsForActor(actor, true, false); 133 } 134 135 protected Iterator<SOAPHeaderElement> getHeaderElementsForActor( 136 String actor, 137 boolean detach, 138 boolean mustUnderstand) { 139 if (actor == null || actor.equals("")) { 140 log.severe("SAAJ0132.impl.invalid.value.for.actor.or.role"); 141 throw new IllegalArgumentException("Invalid value for actor or role"); 142 } 143 return getHeaderElements(actor, detach, mustUnderstand); 144 } 145 146 protected Iterator<SOAPHeaderElement> getHeaderElements( 147 String actor, 148 boolean detach, 149 boolean mustUnderstand) { 150 List<SOAPHeaderElement> elementList = new ArrayList<>(); 151 152 Iterator<javax.xml.soap.Node> eachChild = getChildElements(); 153 154 org.w3c.dom.Node currentChild = iterate(eachChild); 155 while (currentChild != null) { 156 if (!(currentChild instanceof SOAPHeaderElement)) { 157 currentChild = iterate(eachChild); 158 } else { 159 HeaderElementImpl currentElement = 160 (HeaderElementImpl) currentChild; 161 currentChild = iterate(eachChild); 162 163 boolean isMustUnderstandMatching = 164 (!mustUnderstand || currentElement.getMustUnderstand()); 165 boolean doAdd = false; 166 if (actor == null && isMustUnderstandMatching) { 167 doAdd = true; 168 } else { 169 String currentActor = currentElement.getActorOrRole(); 170 if (currentActor == null) { 171 currentActor = ""; 172 } 176 doAdd = true; 177 } 178 } 179 180 if (doAdd) { 181 elementList.add(currentElement); 182 if (detach) { 183 currentElement.detachNode(); 184 } 185 } 186 } 187 } 188 189 return elementList.listIterator(); 190 } 191 192 private <T> T iterate(Iterator<T> each) { 193 return each.hasNext() ? each.next() : null; 194 } 195 196 @Override 197 public void setParentElement(SOAPElement element) throws SOAPException { 198 if (!(element instanceof SOAPEnvelope)) { 199 log.severe("SAAJ0133.impl.header.parent.mustbe.envelope"); 200 throw new SOAPException("Parent of SOAPHeader has to be a SOAPEnvelope"); 201 } 202 super.setParentElement(element); 203 } 204 205 // overriding ElementImpl's method to ensure that HeaderElements are 206 // namespace qualified. Holds for both SOAP versions. 207 // TODO - This check needs to be made for other addChildElement() methods 208 // as well. 209 @Override 210 public SOAPElement addChildElement(String localName) throws SOAPException { 211 212 SOAPElement element = super.addChildElement(localName); 213 // check that URI is not empty, ensuring that the element is NS qualified. 214 String uri = element.getElementName().getURI(); 215 if ((uri == null) || ("").equals(uri)) { 216 log.severe("SAAJ0134.impl.header.elems.ns.qualified"); 217 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified"); 218 } 219 return element; 220 } 221 222 @Override 223 public Iterator<SOAPHeaderElement> examineAllHeaderElements() { 224 return getHeaderElements(null, false, MUST_UNDERSTAND_ONLY); 225 } 226 227 @Override 228 public Iterator<SOAPHeaderElement> examineMustUnderstandHeaderElements(String actor) { 229 return getHeaderElements(actor, false, true); 230 231 } 232 233 @Override 234 public Iterator<SOAPHeaderElement> extractAllHeaderElements() { 235 return getHeaderElements(null, true, false); 236 } 237 238 @Override 239 public SOAPHeaderElement addUpgradeHeaderElement(Iterator supportedSoapUris) 240 throws SOAPException { 241 if (supportedSoapUris == null) { 242 log.severe("SAAJ0411.ver1_2.no.null.supportedURIs"); 243 throw new SOAPException("Argument cannot be null; iterator of supportedURIs cannot be null"); 244 } 245 if (!supportedSoapUris.hasNext()) { 246 log.severe("SAAJ0412.ver1_2.no.empty.list.of.supportedURIs"); 247 throw new SOAPException("List of supported URIs cannot be empty"); 248 } 249 Name upgradeName = getUpgradeName(); 250 SOAPHeaderElement upgradeHeaderElement = 251 (SOAPHeaderElement) addChildElement(upgradeName); 252 Name supportedEnvelopeName = getSupportedEnvelopeName(); 253 int i = 0; 254 while (supportedSoapUris.hasNext()) { 255 SOAPElement subElement = 256 upgradeHeaderElement.addChildElement(supportedEnvelopeName); 257 String ns = "ns" + Integer.toString(i); 258 subElement.addAttribute( 259 NameImpl.createFromUnqualifiedName("qname"), 260 ns + ":Envelope"); 261 subElement.addNamespaceDeclaration( 262 ns, (String) supportedSoapUris.next()); 263 i ++; 264 } 265 return upgradeHeaderElement; 266 } 267 268 @Override 269 public SOAPHeaderElement addUpgradeHeaderElement(String supportedSoapUri) 270 throws SOAPException { 271 return addUpgradeHeaderElement(new String[] {supportedSoapUri}); 272 } 273 274 @Override 275 public SOAPHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris) 276 throws SOAPException { 277 278 if (supportedSoapUris == null) { 279 log.severe("SAAJ0411.ver1_2.no.null.supportedURIs"); 280 throw new SOAPException("Argument cannot be null; array of supportedURIs cannot be null"); 281 } 282 if (supportedSoapUris.length == 0) { 283 log.severe("SAAJ0412.ver1_2.no.empty.list.of.supportedURIs"); 284 throw new SOAPException("List of supported URIs cannot be empty"); 285 } 286 Name upgradeName = getUpgradeName(); 287 SOAPHeaderElement upgradeHeaderElement = 288 (SOAPHeaderElement) addChildElement(upgradeName); 289 Name supportedEnvelopeName = getSupportedEnvelopeName(); 290 for (int i = 0; i < supportedSoapUris.length; i ++) { 291 SOAPElement subElement = 292 upgradeHeaderElement.addChildElement(supportedEnvelopeName); 293 String ns = "ns" + Integer.toString(i); 294 subElement.addAttribute( 295 NameImpl.createFromUnqualifiedName("qname"), 296 ns + ":Envelope"); 297 subElement.addNamespaceDeclaration(ns, supportedSoapUris[i]); 298 } 299 return upgradeHeaderElement; 300 } 301 302 @Override 303 protected SOAPElement convertToSoapElement(Element element) { 304 final org.w3c.dom.Node soapNode = getSoapDocument().findIfPresent(element); 305 if (soapNode instanceof SOAPHeaderElement) { 306 return (SOAPElement) soapNode; 307 } else { 308 SOAPHeaderElement headerElement; 309 try { 310 headerElement = 311 createHeaderElement(NameImpl.copyElementName(element)); 312 } catch (SOAPException e) { 313 throw new ClassCastException("Could not convert Element to SOAPHeaderElement: " + e.getMessage()); 314 } 315 return replaceElementWithSOAPElement( 316 element, 317 (ElementImpl) headerElement); 318 } 319 } 320 321 @Override 322 public SOAPElement setElementQName(QName newName) throws SOAPException { 323 log.log(Level.SEVERE, 324 "SAAJ0146.impl.invalid.name.change.requested", 325 new Object[] {elementQName.getLocalPart(), 326 newName.getLocalPart()}); 327 throw new SOAPException("Cannot change name for " 328 + elementQName.getLocalPart() + " to " 329 + newName.getLocalPart()); 330 } 331 332 } |