Java tutorial
/************************************************************************* * (c) Copyright 2016 Hewlett Packard Enterprise Development Company LP * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program 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 for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. ************************************************************************/ package com.eucalyptus.ws.handlers; import java.util.UUID; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPHeader; import org.apache.axiom.soap.SOAPHeaderBlock; import com.eucalyptus.binding.HoldMe; import com.eucalyptus.ws.IoMessage; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; import io.netty.handler.codec.http.HttpRequest; /** * */ @ChannelHandler.Sharable public class IoAddressingHandler extends ChannelOutboundHandlerAdapter { private static final String WSA_NAMESPACE = "http://www.w3.org/2005/08/addressing"; private static final String WSA_NAMESPACE_PREFIX = "wsa"; private static final String WSA_MESSAGE_ID = "MessageID"; private static final String WSA_TO = "To"; private static final String WSA_ACTION = "Action"; private final String prefix; public IoAddressingHandler() { this(""); } public IoAddressingHandler(final String prefix) { this.prefix = prefix; } @Override public void write(final ChannelHandlerContext ctx, final Object msg, final ChannelPromise promise) throws Exception { if (msg instanceof IoMessage && ((IoMessage) msg).isRequest()) { final IoMessage ioMessage = (IoMessage) msg; final HttpRequest httpRequest = (HttpRequest) ioMessage.getHttpMessage(); final String action = addAddressing(prefix, ioMessage.getSoapEnvelope(), ioMessage.getOmMessage(), httpRequest.getUri()); httpRequest.headers().add("SOAPAction", action); } super.write(ctx, msg, promise); } static String addAddressing(final String prefix, final SOAPEnvelope soapEnvelope, final OMElement omMessage, final String uri) { // :: set action ::// final String action = prefix + omMessage.getLocalName(); final SOAPHeader header = soapEnvelope.getHeader(); // :: set soap addressing info ::// final OMNamespace wsaNs = HoldMe.getOMFactory().createOMNamespace(WSA_NAMESPACE, WSA_NAMESPACE_PREFIX); if (header != null) { final SOAPHeaderBlock wsaToHeader = header.addHeaderBlock(WSA_TO, wsaNs); wsaToHeader.setText(uri); final SOAPHeaderBlock wsaActionHeader = header.addHeaderBlock(WSA_ACTION, wsaNs); wsaActionHeader.setText(action); final SOAPHeaderBlock wsaMsgId = header.addHeaderBlock(WSA_MESSAGE_ID, wsaNs); wsaMsgId.setText("urn:uuid:" + UUID.randomUUID().toString().replaceAll("-", "").toUpperCase()); } return action; } }