/*************************************************************************
* (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;
import java.net.URI;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.SOAPEnvelope;
import com.eucalyptus.util.Parameters;
import com.google.common.base.MoreObjects;
import edu.ucsb.eucalyptus.msgs.BaseMessage;
import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.FullHttpMessage;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpVersion;
/**
*
*/
public class IoMessage<HT extends FullHttpMessage> {
private String correlationId;
private SOAPEnvelope soapEnvelope;
private OMElement omMessage;
private Object message;
private HT httpMessage;
private IoMessage( ) {
}
/**
* Create a new message for outbound http use.
*
* @param endpoint The http endpoint
* @param message The message to be sent
* @return The new message
*/
@Nonnull
public static IoMessage<FullHttpRequest> httpRequest(
@Nonnull final URI endpoint,
@Nonnull final BaseMessage message
) {
Parameters.checkParamNotNull( "endpoint", endpoint );
Parameters.checkParamNotNull( "message", message );
final FullHttpRequest httpRequest =
new DefaultFullHttpRequest( HttpVersion.HTTP_1_1, HttpMethod.POST, endpoint.getPath() );
httpRequest.headers( ).add( HttpHeaders.Names.HOST, endpoint.getHost( ) + ":" + endpoint.getPort( ) );
final IoMessage<FullHttpRequest> ioMessage = new IoMessage<>( );
ioMessage.setHttpMessage( httpRequest );
ioMessage.setMessage( message );
ioMessage.setCorrelationId( message.getCorrelationId( ) );
return ioMessage;
}
/**
* Create a new message from an existing http message.
*
* @param httpMessage The http message to use
* @param <HT> The type of the http message
* @return The new message
*/
@Nonnull
public static <HT extends FullHttpMessage> IoMessage<HT> http(
@Nonnull HT httpMessage
) {
final IoMessage<HT> ioMessage = new IoMessage<>( );
ioMessage.setHttpMessage( httpMessage );
return ioMessage;
}
@Nonnull
public String getCorrelationId() {
return correlationId;
}
public void setCorrelationId( @Nonnull final String correlationId ) {
this.correlationId = Parameters.checkParamNotNull( "correlationId", correlationId );
}
@Nullable
public Object getMessage() {
return message;
}
public void setMessage( final Object message ) {
this.message = message;
}
@Nonnull
public HT getHttpMessage() {
return httpMessage;
}
public void setHttpMessage( @Nonnull final HT httpMessage ) {
this.httpMessage = Parameters.checkParamNotNull( "httpMessage", httpMessage );
}
@Nullable
public SOAPEnvelope getSoapEnvelope() {
return soapEnvelope;
}
public void setSoapEnvelope( final SOAPEnvelope soapEnvelope ) {
this.soapEnvelope = soapEnvelope;
}
@Nullable
public OMElement getOmMessage() {
return omMessage;
}
public void setOmMessage( final OMElement omMessage ) {
this.omMessage = omMessage;
}
public boolean isRequest( ) {
return getHttpMessage( ) instanceof HttpRequest;
}
@Override
public String toString( ) {
return MoreObjects.toStringHelper( this )
.add( "correlationId", getCorrelationId( ) )
.toString( );
}
}