package org.opennaas.extensions.ofertie.ncl.interceptor;
/*
* #%L
* OpenNaaS :: OFERTIE :: NCL components
* %%
* Copyright (C) 2007 - 2014 FundaciĆ³ Privada i2CAT, Internet i InnovaciĆ³ a Catalunya
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.HttpHeaders;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageContentsList;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.eclipse.jetty.http.HttpStatus;
public class ProviderOutInterceptor extends AbstractPhaseInterceptor<Message> {
private final static Log log = LogFactory.getLog(ProviderOutInterceptor.class);
private final static String FILTER_METHOD = HttpMethod.POST;
private final static String FILTER_PATH = "/opennaas/ofertie/ncl/flows";
private final static int CODE_RESPONSE_201 = HttpStatus.CREATED_201;
public ProviderOutInterceptor() {
super(Phase.SEND);
}
@Override
public void handleMessage(Message message) throws Fault {
log.info("Intercepting Provisioner output message.");
Message inMessage = message.getExchange().getInMessage();
String method = (String) inMessage.get(Message.HTTP_REQUEST_METHOD);
String path = (String) inMessage.get(Message.PATH_INFO);
if (method.equals(FILTER_METHOD) && path.equals(FILTER_PATH)) {
setFlowInHeader(message);
modifyStatusCode(message, CODE_RESPONSE_201);
}
}
private void setFlowInHeader(Message message) {
String flowId = getFlowIdFromBody(message);
String location = buildLocation(message, flowId);
HttpServletResponse response = (HttpServletResponse)
message.getExchange().getInMessage().get(AbstractHTTPDestination.HTTP_RESPONSE);
response.setHeader(HttpHeaders.LOCATION, location);
}
private String buildLocation(Message message, String flowId) {
HttpServletRequest request = (HttpServletRequest)
message.getExchange().getInMessage().get(AbstractHTTPDestination.HTTP_REQUEST);
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String location = "http://" + serverName + ":" + String.valueOf(serverPort) + FILTER_PATH + "/" + flowId;
return location;
}
private void modifyStatusCode(Message message, int status) {
HttpServletResponse response = (HttpServletResponse)
message.get(AbstractHTTPDestination.HTTP_RESPONSE);
response.setStatus(status);
}
private String getFlowIdFromBody(Message message) {
String flowId = null;
MessageContentsList contents = MessageContentsList.getContentsList(message);
if (contents != null && contents.size() == 1)
flowId = (String) contents.get(0);
return flowId;
}
}