blob: 0666137eba28c8e13cd197fce2cc93c95d03f4e0 [file] [log] [blame]
/*
* Portions Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.xml.internal.ws.encoding.soap.server;
import java.util.HashSet;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPFault;
import javax.xml.stream.XMLStreamReader;
import com.sun.xml.internal.ws.encoding.soap.internal.HeaderBlock;
import com.sun.xml.internal.ws.encoding.soap.internal.SOAP12NotUnderstoodHeaderBlock;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.ws.soap.SOAPFaultException;
import static javax.xml.stream.XMLStreamReader.*;
import com.sun.xml.internal.ws.pept.ept.MessageInfo;
import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants;
import com.sun.xml.internal.ws.encoding.soap.internal.InternalMessage;
import com.sun.xml.internal.ws.streaming.XMLReader;
import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil;
import com.sun.xml.internal.ws.server.*;
import com.sun.xml.internal.ws.util.MessageInfoUtil;
import com.sun.xml.internal.ws.util.SOAPUtil;
/**
* @author WS Development Team
*/
public class SOAP12XMLDecoder extends SOAPXMLDecoder {
private static final Set<String> requiredRoles = new HashSet<String>();
public SOAP12XMLDecoder() {
requiredRoles.add("http://www.w3.org/2003/05/soap-envelope/role/next");
requiredRoles.add("http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver");
}
/* (non-Javadoc)
* @see com.sun.xml.internal.ws.rt.encoding.soap.SOAPDecoder#decodeHeader(com.sun.xml.internal.ws.streaming.XMLReader, com.sun.pept.ept.MessageInfo, com.sun.xml.internal.ws.soap.internal.InternalMessage)
*/
@Override
protected void decodeHeader(XMLStreamReader reader, MessageInfo messageInfo, InternalMessage request) {
// TODO Auto-generated method stub
super.decodeHeader(reader, messageInfo, request);
}
/* (non-Javadoc)
* @see com.sun.xml.internal.ws.rt.encoding.soap.SOAPDecoder#getBodyTag()
*/
@Override
protected QName getBodyTag() {
return SOAP12Constants.QNAME_SOAP_BODY;
}
/* (non-Javadoc)
* @see com.sun.xml.internal.ws.rt.encoding.soap.SOAPDecoder#getEnvelopeTag()
*/
@Override
protected QName getEnvelopeTag() {
return SOAP12Constants.QNAME_SOAP_ENVELOPE;
}
/* (non-Javadoc)
* @see com.sun.xml.internal.ws.rt.encoding.soap.SOAPDecoder#getHeaderTag()
*/
@Override
protected QName getHeaderTag() {
return SOAP12Constants.QNAME_SOAP_HEADER;
}
@Override
protected QName getMUAttrQName(){
return SOAP12Constants.QNAME_MUSTUNDERSTAND;
}
@Override
protected QName getRoleAttrQName(){
return SOAP12Constants.QNAME_ROLE;
}
public Set<String> getRequiredRoles() {
return requiredRoles;
}
/*
* Keep track of all not-understood headers to return
* with fault to client. In soap 1.1, the check fails
* on the first not-understood header.
*/
@Override
protected void checkHeadersAgainstKnown(XMLStreamReader reader,
Set<String> roles, Set<QName> understoodHeaders, MessageInfo mi) {
Set<QName> notUnderstoodHeaders = new HashSet<QName>();
while (true) {
if (reader.getEventType() == START_ELEMENT) {
// check MU header for each role
QName qName = reader.getName();
String mu = reader.getAttributeValue(
getMUAttrQName().getNamespaceURI(),
getMUAttrQName().getLocalPart());
if (mu != null && (mu.equals("1") ||
mu.equalsIgnoreCase("true"))) {
String role = reader.getAttributeValue(
getRoleAttrQName().getNamespaceURI(),
getRoleAttrQName().getLocalPart());
if (role != null && roles.contains(role)) {
logger.finest("Element=" + qName +
" targeted at=" + role);
if (understoodHeaders == null ||
!understoodHeaders.contains(qName)) {
logger.finest("Element not understood=" + qName);
notUnderstoodHeaders.add(qName);
}
}
}
XMLStreamReaderUtil.skipElement(reader); // Moves to END state
XMLStreamReaderUtil.nextElementContent(reader);
} else {
break;
}
}
if (notUnderstoodHeaders.isEmpty()) {
return;
}
// need to add headers to fault
SOAPFault sf = SOAPUtil.createSOAPFault(
MUST_UNDERSTAND_FAULT_MESSAGE_STRING,
SOAP12Constants.FAULT_CODE_MUST_UNDERSTAND,
null, null, SOAPBinding.SOAP12HTTP_BINDING);
Set<HeaderBlock> nuHeaderBlocks = new HashSet<HeaderBlock>();
for (QName headerName : notUnderstoodHeaders) {
nuHeaderBlocks.add(new SOAP12NotUnderstoodHeaderBlock(headerName));
}
MessageInfoUtil.setNotUnderstoodHeaders(mi, nuHeaderBlocks);
throw new SOAPFaultException(sf);
}
@Override
public String getBindingId() {
return SOAPBinding.SOAP12HTTP_BINDING;
}
@Override
protected QName getSenderFaultCode() {
return SOAP12Constants.FAULT_CODE_CLIENT;
}
@Override
protected QName getReceiverFaultCode() {
return SOAP12Constants.FAULT_CODE_SERVER;
}
@Override
protected QName getVersionMismatchFaultCode() {
return SOAP12Constants.FAULT_CODE_VERSION_MISMATCH;
}
}