/**
*
*/
package net.conselldemallorca.helium.integracio.plugins.custodia;
import java.io.ByteArrayInputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import es.caib.signatura.cliente.custodia.CustodiaRequestBuilder;
import es.caib.signatura.cliente.services.custodia.CustodiaService;
import es.caib.signatura.cliente.services.custodia.CustodiaServiceLocator;
import es.caib.signatura.cliente.services.custodia.CustodiaSoapBindingStub;
import es.caib.signatura.cliente.services.custodia.Custodia_PortType;
/**
* Client per a l'aplicació de custòdia documental de la CAIB
*
* @author Limit Tecnologies <limit@limit.es>
*/
public class ClienteCustodiaCaib {
private String url;
private String usuario;
private String password;
private CustodiaService service = null;
private Custodia_PortType custodiaPort = null;
public ClienteCustodiaCaib(String url, String usuario, String password) {
this.url = url;
this.usuario = usuario;
this.password = password;
}
public byte[] custodiarDocumentoSMIME(
ByteArrayInputStream documento,
String nombreDocumento,
String codigoExterno,
String codigoExternoTipoDocumento) throws RemoteException {
init();
CustodiaRequestBuilder custodiaRequestBuilder = new CustodiaRequestBuilder(
this.usuario,
this.password);
byte[] xml = custodiaRequestBuilder.buildXML(documento, nombreDocumento, codigoExterno, codigoExternoTipoDocumento);
return this.custodiaPort.custodiarDocumentoSMIME_v2(xml);
}
public byte[] custodiarDocumento(
ByteArrayInputStream documento,
String nombreDocumento,
String codigoExterno,
String codigoExternoTipoDocumento) throws RemoteException {
init();
CustodiaRequestBuilder custodiaRequestBuilder = new CustodiaRequestBuilder(
this.usuario,
this.password);
byte[] xml = custodiaRequestBuilder.buildXML(documento, nombreDocumento, codigoExterno, codigoExternoTipoDocumento);
return this.custodiaPort.custodiarDocumento_v2(xml);
}
public byte[] custodiarPDFFirmado(
ByteArrayInputStream documento,
String nombreDocumento,
String codigoExterno,
String codigoExternoTipoDocumento) throws RemoteException {
init();
CustodiaRequestBuilder custodiaRequestBuilder = new CustodiaRequestBuilder(
this.usuario,
this.password);
byte[] xml = custodiaRequestBuilder.buildXML(documento, nombreDocumento, codigoExterno, codigoExternoTipoDocumento);
return this.custodiaPort.custodiarPDFFirmado_v2(xml);
}
public byte[] purgarDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.purgarDocumento_v2(
this.usuario,
this.password,
codigoExterno);
}
public byte[] recuperarDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.recuperarDocumento_v2(
this.usuario,
this.password,
codigoExterno);
}
public byte[] eliminarDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.eliminarDocumento_v2(
this.usuario,
this.password,
codigoExterno);
}
public byte[] verificarDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.verificarDocumento_v2(
this.usuario,
this.password,
codigoExterno);
}
public byte[] obtenerInformeDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.obtenerInformeDocumento_v2(
this.usuario,
this.password,
codigoExterno);
}
public byte[] consultarDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.consultarDocumento_v2(
this.usuario,
this.password,
codigoExterno);
}
public byte[] reservarDocumento(String codigoExterno) throws RemoteException {
init();
return this.custodiaPort.reservarDocumento(
this.usuario,
this.password,
codigoExterno);
}
public byte[] consultarReservaDocumento(String hash) throws RemoteException {
init();
return this.custodiaPort.consultarReservaDocumento(
this.usuario,
this.password,
hash);
}
public CustodiaResponseCaib parseResponse(byte[] response) throws DocumentException {
CustodiaResponseCaib resposta = new CustodiaResponseCaib();
Document document = DocumentHelper.parseText(new String(response));
Element resultMajorElement = null;
Element resultMinorElement = null;
Element resultMessageElement = null;
if ("CustodiaResponse".equals(document.getRootElement().getName())) {
resultMajorElement = document.getRootElement().element("VerifyResponse").element("Result").element("ResultMajor");
resultMinorElement = document.getRootElement().element("VerifyResponse").element("Result").element("ResultMinor");
resultMessageElement = document.getRootElement().element("VerifyResponse").element("Result").element("ResultMessage");
} else if ("EliminacionResponse".equals(document.getRootElement().getName())) {
resultMajorElement = document.getRootElement().element("Result").element("ResultMajor");
resultMinorElement = document.getRootElement().element("Result").element("ResultMinor");
resultMessageElement = document.getRootElement().element("Result").element("ResultMessage");
} else if ("ConsultaResponse".equals(document.getRootElement().getName())) {
resultMajorElement = document.getRootElement().element("Result").element("ResultMajor");
resultMinorElement = document.getRootElement().element("Result").element("ResultMinor");
resultMessageElement = document.getRootElement().element("Result").element("ResultMessage");
} else if ("VerificacionResponse".equals(document.getRootElement().getName())) {
resultMajorElement = document.getRootElement().element("Result").element("ResultMajor");
resultMinorElement = document.getRootElement().element("Result").element("ResultMinor");
resultMessageElement = document.getRootElement().element("Result").element("ResultMessage");
} else if ("ReservaResponse".equals(document.getRootElement().getName())) {
resultMajorElement = document.getRootElement().element("Result").element("ResultMajor");
resultMinorElement = document.getRootElement().element("Result").element("ResultMinor");
resultMessageElement = document.getRootElement().element("Result").element("ResultMessage");
}
if (resultMajorElement == null)
throw new DocumentException("No s'ha trobat el ResultMajor");
boolean hasErrors = hasErrors(resultMajorElement.getText());
resposta.setError(hasErrors);
if (hasErrors) {
resposta.setErrorCodi(resultMinorElement.getText());
resposta.setErrorDescripcio(resultMessageElement.getText());
}
return resposta;
}
private void init() {
try {
if (custodiaPort == null) {
service = new CustodiaServiceLocator();
custodiaPort = service.getCustodia(new URL(url));
((CustodiaSoapBindingStub)custodiaPort).setUsername(usuario);
((CustodiaSoapBindingStub)custodiaPort).setPassword(password);
}
} catch (ServiceException sex) {
sex.printStackTrace();
} catch (MalformedURLException mux) {
mux.printStackTrace();
}
}
private boolean hasErrors(String resultMajor) {
return (resultMajor.contains("error") ||
resultMajor.contains("Error") ||
resultMajor.contains("ERROR"));
}
}