package org.apache.synapse.transport.http.conn;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* This class is used to store wirelog information for all the relevant mediators and request wirelog, response wirelog as well
*/
public class SynapseWireLogHolder implements Serializable {
private String proxyName = null;
private String apiName = null;
private String resourceUrlString = null;
private StringBuilder requestWireLog;
private StringBuilder responseWireLog;
//key mediatorID
private Map<String, SynapseBackEndWireLogs> backEndRequestResponse = new HashMap<>(1);
private PHASE phase;
public SynapseWireLogHolder() {
this.phase = PHASE.SOURCE_REQUEST_READY;
requestWireLog = new StringBuilder();
responseWireLog = new StringBuilder();
}
public String getProxyName() {
return proxyName;
}
public void setProxyName(String proxyName) {
this.proxyName = proxyName;
}
public String getApiName() {
return apiName;
}
public void setApiName(String apiName) {
this.apiName = apiName;
}
public String getResourceUrlString() {
return resourceUrlString;
}
public void setResourceUrlString(String resourceUrlString) {
this.resourceUrlString = resourceUrlString;
}
public String getRequestWireLog() {
return requestWireLog.toString();
}
public void appendRequestWireLog(String requestWireLog) {
this.requestWireLog.append(requestWireLog);
}
public String getResponseWireLog() {
return responseWireLog.toString();
}
public void appendResponseWireLog(String responseWireLog) {
this.responseWireLog.append(responseWireLog);
}
public PHASE getPhase() {
return phase;
}
public synchronized void setPhase(PHASE phase) {
this.phase = phase;
}
public synchronized void appendBackEndWireLog(RequestType type, String wireLog, String mediatorId) {
SynapseBackEndWireLogs backEndWireLogs = backEndRequestResponse.get(mediatorId);
if (backEndWireLogs == null) {
backEndWireLogs = new SynapseBackEndWireLogs();
backEndWireLogs.setMediatorID(mediatorId);
}
if (type.equals(RequestType.REQUEST)) {
backEndWireLogs.appendRequestWireLog(wireLog);
} else if (type.equals(RequestType.RESPONSE)) {
backEndWireLogs.appendResponseWireLog(wireLog);
}
backEndRequestResponse.put(mediatorId, backEndWireLogs);
}
public Map<String, SynapseBackEndWireLogs> getBackEndRequestResponse() {
return backEndRequestResponse;
}
public synchronized void clear() {
this.requestWireLog.setLength(0);
this.responseWireLog.setLength(0);
this.backEndRequestResponse.clear();
this.phase = PHASE.SOURCE_REQUEST_READY;
}
/**
* These are the phases to determine request responses in wire level
*/
public enum PHASE {
SOURCE_REQUEST_READY, //source request gets hit the ESB
SOURCE_REQUEST_DONE, //source request read done
TARGET_REQUEST_READY, //back end request ready to be sent to back end
TARGET_REQUEST_DONE, //back end request sent
TARGET_RESPONSE_READY, //back end response received to esb
TARGET_RESPONSE_DONE, //back end response read
SOURCE_RESPONSE_READY, //source response ready to be sent to client
SOURCE_RESPONSE_DONE //source response sent
}
public enum RequestType {
REQUEST,
RESPONSE
}
/**
* This method is to clone wirelog holder object
*
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public SynapseWireLogHolder deepClone() throws IOException, ClassNotFoundException {
ObjectOutputStream wireLogHolderOutputStream = null;
ObjectInputStream wireLogHolderInputStream = null;
try {
ByteArrayOutputStream binaryOutputStream =
new ByteArrayOutputStream();
wireLogHolderOutputStream = new ObjectOutputStream(binaryOutputStream);
wireLogHolderOutputStream.writeObject(this);
wireLogHolderOutputStream.flush();
ByteArrayInputStream binaryInputStream =
new ByteArrayInputStream(binaryOutputStream.toByteArray());
wireLogHolderInputStream = new ObjectInputStream(binaryInputStream);
return (SynapseWireLogHolder) wireLogHolderInputStream.readObject();
} finally {
wireLogHolderOutputStream.close();
wireLogHolderInputStream.close();
}
}
}