package com.nortal.jroad.client.exception;
import java.io.IOException;
import org.springframework.ws.client.WebServiceIOException;
import org.springframework.ws.soap.SoapFaultDetail;
import org.springframework.ws.soap.client.SoapFaultClientException;
/**
* An exception thrown to indicate that a transport error has occured during X-tee service invocation or that X-tee
* service has returned a fault result.
*
* @author Roman Tekhov
*/
public class XRoadServiceConsumptionException extends IOException {
private static final long serialVersionUID = 1L;
private static final String SERVER_PREFIX = "Server";
private static final String CLIENT_PREFIX = "Client";
private SoapFaultClientException soapFaultClientException;
private WebServiceIOException webServiceIOException;
private NonTechnicalFaultException nonTechnicalFaultException;
private String database;
private String method;
private String version;
public XRoadServiceConsumptionException(SoapFaultClientException soapFaultClientException,
String database,
String method,
String version) {
this((Exception) soapFaultClientException, database, method, version);
this.soapFaultClientException = soapFaultClientException;
}
public XRoadServiceConsumptionException(WebServiceIOException webServiceIOException,
String database,
String method,
String version) {
this((Exception) webServiceIOException, database, method, version);
this.webServiceIOException = webServiceIOException;
}
public XRoadServiceConsumptionException(NonTechnicalFaultException nonTechnicalFaultException,
String database,
String method,
String version) {
this((Exception) nonTechnicalFaultException, database, method, version);
this.nonTechnicalFaultException = nonTechnicalFaultException;
}
private XRoadServiceConsumptionException(Exception cause, String database, String method, String version) {
if (cause == null) {
throw new IllegalArgumentException("Cause can not be null!");
}
initCause(cause);
this.database = database;
this.method = method;
this.version = version;
}
public SoapFaultClientException getSoapFaultClientException() {
return soapFaultClientException;
}
public WebServiceIOException getWebServiceIOException() {
return webServiceIOException;
}
public boolean isFault() {
return getSoapFaultClientException() != null;
}
public boolean isIOError() {
return getWebServiceIOException() != null;
}
public String getFaultCode() {
return isFault() ? getSoapFaultClientException().getFaultCode().getLocalPart() : null;
}
public String getFaultString() {
return isFault() ? getSoapFaultClientException().getFaultStringOrReason() : null;
}
public String getFaultActor() {
return isFault() ? getSoapFaultClientException().getSoapFault().getFaultActorOrRole() : null;
}
public SoapFaultDetail getFaultDetail() {
return isFault() ? getSoapFaultClientException().getSoapFault().getFaultDetail() : null;
}
public boolean isServerFault() {
return isFaultOfType(SERVER_PREFIX);
}
public boolean isClientFault() {
return isFaultOfType(CLIENT_PREFIX);
}
private boolean isFaultOfType(String type) {
String faultCode = getFaultCode();
return faultCode != null && faultCode.startsWith(type);
}
public boolean isNonTechnicalFault() {
return nonTechnicalFaultException != null;
}
public String getNonTechnicalFaultCode() {
return isNonTechnicalFault() ? nonTechnicalFaultException.getFaultCode() : null;
}
public String getNonTechnicalFaultString() {
return isNonTechnicalFault() ? nonTechnicalFaultException.getFaultString() : null;
}
public String getDatabase() {
return database;
}
public String getMethod() {
return method;
}
public String getVersion() {
return version;
}
public String getFullServiceName() {
return getDatabase() + "." + getMethod() + "." + getVersion();
}
}