/**
 * _AppendChunk.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis WSDL2Java emitter.
 */

package com.ejie.p06b.ws;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.Writer;

import javax.activation.FileDataSource;

import com.ejie.p06b.log.P06BLog;
import com.ejie.p06b.util.P06BSignatureF;
import com.ejie.p06b.util.P06BUtil;
import com.ejie.p06b.xml.generator.P06BMediadorXML;

/*
import org.apache.axis.AxisFault;

import com.ejie.p06b.ws.stub.UploadLocator;
import com.ejie.p06b.ws.stub.UploadSoapStub;
import com.ejie.p06b.ws.stub._AppendRequest_x0028_String_x0029_;
import com.ejie.p06b.ws.stub._InitializeFile;
*/
public class P06BTestDGSFP  {
    //Prueba con clases de AXIS
	
	/*public static void main2(String[] args){
		try {
			_AppendRequest_x0028_String_x0029_ param1 = new _AppendRequest_x0028_String_x0029_();
			param1.setMystrResquest("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
			UploadLocator locator = new UploadLocator();
			UploadSoapStub managerWS = new UploadSoapStub(new java.net.URL(locator.getUploadSoapAddress()),null);
			com.ejie.p06b.ws.stub._AppendRequest_x0028_String_x0029_Response respuesta = managerWS.appendRequest(param1);
			_InitializeFile iniFile = new _InitializeFile();
			iniFile.setInstanceId("");
			iniFile.setOverwrite(true);
			iniFile.setFilename("");
			managerWS.initializeFile(iniFile);
			
			managerWS._setProperty(org.apache.axis.client.Call.ATTACHMENT_ENCAPSULATION_FORMAT,
					org.apache.axis.client.Call.ATTACHMENT_ENCAPSULATION_FORMAT_DIME);
			managerWS.addAttachment("cfvxdvxcv");
			managerWS.addAttachmentPart(new String("Test"));

		
			
			System.out.println("Respuesta:::::"+respuesta.getAppendRequest_x0028_String_x0029_Result());
		} catch (AxisFault e) {
			e.printStackTrace();
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
	*/
	
	//Prueba Completa
	public static void main(String[] args){
		//String nombreClase = "P06BTestDGSFP";
		//P06BLog.sendWS(2,nombreClase, "---------------------------------------------------------------------");
		//P06BLog.sendWS(2,nombreClase, "Inicio del envio de informacion sobre los Mediadores de Seguros a traves del Servicio Web");
		//P06BLog.sendWS(2,nombreClase, "---------------------------------------------------------------------");
		//PrintStream pantalla = System.out;
		//PrintStream mensajeExcepcion = null;
//TODO Crear un fichero log para el proceso.		
		try {
			//mensajeExcepcion= new PrintStream(new FileOutputStream(new File("C:\\temp\\pruebaError.txt")));
			
			//PrintStream fichero= new PrintStream(new FileOutputStream(new File("C:\\temp\\salidaEider.txt")));
			//System.setOut(fichero);
			
			String fileName="Mediador_"+new java.util.Date().getTime();
			String xmlEnvio = P06BMediadorXML.getXmlEnvioSimulate();
			//P06BLog.sendWS(2,nombreClase, "xmlEnvio : Inicio");
			//P06BLog.sendWS(2,nombreClase, xmlEnvio);
			//P06BLog.sendWS(2,nombreClase, "xmlEnvio : Fin");
			ByteArrayOutputStream firmaEnvio = P06BSignatureF.createSimpleSignature(xmlEnvio);
			
			String firmaXmlEnvio = firmaEnvio.toString();
			//P06BLog.sendWS(2,nombreClase, "firmaXmlEnvio (la que devuelve Izenpe) : Inicio");
			//P06BLog.sendWS(2,nombreClase, firmaXmlEnvio);
			//P06BLog.sendWS(2,nombreClase, "firmaXmlEnvio (la que devuelve Izenpe) : Fin");
			
			//P06BLog.sendWS(2,nombreClase, "firmaXmlEnvio (en base 64) : Inicio");
			//P06BLog.sendWS(2,nombreClase, P06BUtil.toBase64(firmaXmlEnvio));
			//P06BLog.sendWS(2,nombreClase, "firmaXmlEnvio (en base 64) : Fin");
			//String firmaXmlEnvio = firmaEnvio.toByteArray().toString();
			
			//Creamos el xml contenedor sin firmar
			//TODO Verificar si la firma se manda en base64, sino problemas
			String xmlContenedor = P06BMediadorXML.getXmlContenedorSimulate(fileName,P06BUtil.toBase64(firmaXmlEnvio));
			//P06BLog.sendWS(2,nombreClase, "xmlContenedor (SIN la firma del propio xmlContenedor) : Inicio");
			//P06BLog.sendWS(2,nombreClase, xmlContenedor);
			//P06BLog.sendWS(2,nombreClase, "xmlContenedor (SIN la firma del propio xmlContenedor) : Fin");
			//Firmamos el xml contenedor.
			//TODO CUIDADOOOO !!! Se está firmando junto con la firma del XmlEnvio dentro. Es correcto???
			ByteArrayOutputStream firmaContenedor = P06BSignatureF.createSimpleSignature(xmlContenedor);
			
			String firmaXmlContenedor = firmaContenedor.toString();
			//P06BLog.sendWS(2,nombreClase, "firmaXmlContenedor (la que devuelve Izenpe) : Inicio");
			//P06BLog.sendWS(2,nombreClase, firmaXmlContenedor);
			//P06BLog.sendWS(2,nombreClase, "firmaXmlContenedor (la que devuelve Izenpe) : Fin");
			
			//P06BLog.sendWS(2,nombreClase, "firmaXmlContenedor (en base 64) : Inicio");
			//P06BLog.sendWS(2,nombreClase, P06BUtil.toBase64(firmaXmlContenedor));
			//P06BLog.sendWS(2,nombreClase, "firmaXmlContenedor (en base 64) : Fin");
			//String firmaXmlContenedor = firmaContenedor.toByteArray().toString();
			
			//Añadimos la firma del contenedor al xml contenedor
			String xmlContenedorSub1 = xmlContenedor.substring(0,xmlContenedor.indexOf("</ClientSignature>"));
			String xmlContenedorSub2 = xmlContenedor.substring(xmlContenedor.indexOf("</ClientSignature>"),xmlContenedor.length());
			//TODO Verificar si la firma se manda en base64, sino problemas
			xmlContenedor = xmlContenedorSub1+ "<![CDATA["+P06BUtil.toBase64(firmaXmlContenedor) + "]]>" + xmlContenedorSub2;
			//P06BLog.sendWS(2,nombreClase, "xmlContenedor (CON la firma del propio xmlContenedor) : Inicio");
			//P06BLog.sendWS(2,nombreClase, xmlContenedor);
			//P06BLog.sendWS(2,nombreClase, "xmlContenedor (CON la firma del propio xmlContenedor) : Fin");
			
			//P06BWebServiceCall ws = new P06BWebServiceCall("https://www.dgsfp.meh.es/pruebas/Upload.Asmx");
			//P06BWebServiceCall ws = new P06BWebServiceCall("https://10.34.249.91/pruebas/Upload.Asmx");
			P06BWebServiceCall ws = new P06BWebServiceCall("https://www.dgsfp.mineco.es/pruebas/Upload.Asmx");
			//P06BWebServiceCall ws = new P06BWebServiceCall("http://localhost:8100/p06bMediadoresSegurosNWar/ws");
			
			//P06BLog.sendWS(2,nombreClase, "Metodo AppendRequest del WS : Inicio");
			String instanceId = ws.invokeAppendRequest(xmlContenedor);
			//P06BLog.sendWS(2,nombreClase, "Metodo AppendRequest del WS : Fin");
			//String instanceId = ws.invokeAppendRequest("<as><ander></ander></as>");
			System.out.println("result:"+instanceId);
			//TODO Falta coger de este XML el realmente INSTANCEID
			
			//P06BLog.sendWS(2,nombreClase, "Metodo InitializaFile del WS : Inicio");
			String resultadoInitialize = ws.initializeFileRequest(instanceId, fileName, true);
			//P06BLog.sendWS(2,nombreClase, "Metodo InitializaFile del WS : Fin");
			System.out.println("result - INITIALIZE:"+resultadoInitialize);
			
//TODO Crear un fichero con el xmlContenedor y otro con el xmlEnvio, para que quede registrado
			
			//TODO Leemos el xmlEnvio y en bloques de 128 se lo vamos mandando
			//AppendChunk
			//128 Kb --> 131072 bytes
			
			ByteArrayInputStream input = new ByteArrayInputStream(xmlEnvio.getBytes());
			BufferedInputStream f = new BufferedInputStream(input);
			byte[] tempBytes = null;
			int offset = 0;
			
			while(offset < xmlEnvio.getBytes().length){
				int valRes = 0;
				if(xmlEnvio.getBytes().length<=131072){
					tempBytes = new byte[xmlEnvio.getBytes().length]; 
					valRes = f.read(tempBytes,offset,xmlEnvio.getBytes().length);
				}else{			
					if(offset+131072>=xmlEnvio.getBytes().length){		 
						int quedaLeer =  xmlEnvio.getBytes().length - offset;
						tempBytes = new byte[quedaLeer];
						//Significa que no va a entrar por el bucle más
						//Y además, ojo porque podría dar un problema 
						valRes = f.read(tempBytes,offset,quedaLeer);
					}
					else{
						tempBytes = new byte[131072];
						valRes = f.read(tempBytes,offset,131072);
					}
				}
				//P06BLog.sendWS(2,nombreClase, "Metodo AppendChunk del WS (offset: "+offset+") : Inicio");
				ws.appendChunkRequest(instanceId, new Long(offset), 
										new Integer(valRes), new String(tempBytes));
				//P06BLog.sendWS(2,nombreClase, "Metodo AppendChunk del WS (offset: "+offset+") : Fin");
				//En tempBytes tengo los bytes leidos
				//En offset tengo la posicion del fichero
				offset+=valRes;	
				tempBytes = null;
			}
			//1k - 1024B
			//128k - 131072B
			//P06BLog.sendWS(2,nombreClase, "Metodo RemoveInstance del WS : Inicio");
			String xmlReceipt = ws.removeInstanceRequest(instanceId);
			//P06BLog.sendWS(2,nombreClase, "Metodo RemoveInstance del WS : Fin");
			System.out.println("result - REMOVE:"+xmlReceipt);	
		} catch (Exception e1) {
			//P06BLog.sendWS(2,nombreClase, "EXCEPCION !!!!! : "+e1.getMessage());
			//P06BLog.sendWS(2,nombreClase, "EXCEPCION !!!!! : "+e1);
			//P06BLog.sendWS(2,nombreClase, "EXCEPCION 2 !!!!! : "+e1.getCause().toString());
			//P06BLog.sendWS(2,nombreClase, "EXCEPCION 3 !!!!! : "+e1.fillInStackTrace().toString());
			//P06BLog.sendWS(2,nombreClase, "EXCEPCION 4 !!!!! : "+e1.getStackTrace().toString());
					
			//e1.printStackTrace(mensajeExcepcion);
			//P06BLog.sendWS(2,nombreClase, "EXCEPCION 5 !!!!! : "+mensajeExcepcion.toString());
						
			e1.printStackTrace();
			
		}finally{
			//System.setOut(pantalla);
		}
	}
}
