package com.ejie.ab61.service.generarRtf;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

import javax.annotation.Resource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.bea.common.security.xacml.IOException;
import com.ejie.ab61.adaptadores.X43ExpedienteElectronicoAdaptadorService;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TDocument;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TGetTelActionDocumentList;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TTelActionDocument;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TTextI18N;
import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.exceptions.Ab61Exception;
import com.ejie.ab61.exceptions.PifException;
import com.ejie.ab61.comun.utilidades.config.Config;
import com.ejie.ab61.model.expedientes.RelExpPla;
import com.ejie.ab61.model.plantillas.Documentos;
import com.ejie.ab61.model.plantillas.ObjPlantilla;
import com.ejie.ab61.model.plantillas.Plantillas;
import com.ejie.ab61.service.expedientes.RelExpPlaService;
import com.ejie.ab61.service.plantillas.DocumentosService;
import com.ejie.ab61.service.plantillas.PlantillasService;
import com.ejie.ab61.tramita.adapter.PifAdapterService;
import com.ejie.y31.vo.Y31AttachmentBean;

/**
 * ListadosServiceImpl  
 * 
 *  
 */
@SessionAttributes("usuario")
@Service(value = "RtfService")
public class RtfServiceImpl implements RtfService {

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private PifAdapterService pifAdapterService;

	@Autowired
	private X43ExpedienteElectronicoAdaptadorService expedienteElectronicoWS;

	@Autowired
	private PlantillasService plantillasService;

	@Autowired
	private RelExpPlaService relExpPlaService;

	@Autowired
	private DocumentosService documentosService;

	String tokencuerpocData;

	public static final String RTF_SALTO_LINEA = "{\\\\rtlch\\\\fcs1 \\\\af0 \\\\ltrch\\\\fcs0 \\\\insrsid10035868 \\\\par }";

	private static final Logger logger = LoggerFactory.getLogger(RtfServiceImpl.class);

	/**
	 * Inserts a single row in the Listados table.
	 *
	 * @param listados
	 *            Listados
	 * @return Listados
	 * @throws Exception
	 */
	@Transactional(rollbackFor = Throwable.class, timeout = 60)
	public String generarRtf(Plantillas plantillas, String usuario, Document documentoXML, Integer origen,
			Integer idExpediente, int idProcedimiento, String identificador) throws Exception {

		RtfServiceImpl.logger.info("[generarRtf : generarRtf");

		String nombreDocumento = "";
		String pathPiff = "";
		RelExpPla relExpPlaAux = new RelExpPla();
		Y31AttachmentBean retornoPIF = null;

		try {

			if ((plantillas.getDocumento() != null) && (plantillas.getDocumento().getArchivo() != null)) {
				byte[] bdata = plantillas.getDocumento().getArchivo().getBytes(1,
						(int) plantillas.getDocumento().getArchivo().length());

				String plantillaRTF = new String(bdata);

				// mergeamos el xml que contiene la informacion de la plantilla
				// con
				// la plantilla de base de datos

				ObjPlantilla objPlantilla = this.gestionObjetosRTF(documentoXML, plantillaRTF);

				InputStream myInputStream = new ByteArrayInputStream(objPlantilla.getTextRTF().getBytes());

				// El nombre del documento depende del origen, en este caso al
				// ser a
				// nivel de Expediente el nombre del archivo contendrá en
				// FOLDER_NUMBER

				if (origen == Constantes.Plantillas.ORIGEN_EXPEDIENTE) {

					if (!"".equalsIgnoreCase(objPlantilla.getFolderNumber())) {
						objPlantilla.setFolderNumber(objPlantilla.getFolderNumber().replaceAll("-", "_"));
						objPlantilla.setFolderNumber(objPlantilla.getFolderNumber().replaceAll("/", "_"));
						objPlantilla.setFolderNumber(objPlantilla.getFolderNumber() + "_");
					}
				} else {
					objPlantilla.setFolderNumber("");

				}

				String nombrePlantillas = plantillas.getDescripcionCastellano().replaceAll(" ", "-");
				nombreDocumento = objPlantilla.getFolderNumber() + "_" + nombrePlantillas + "_" + new Date().getTime();
				RtfServiceImpl.logger.info("Nombre del documento:" + nombreDocumento);

				retornoPIF = pifAdapterService.putFile(myInputStream, nombreDocumento + ".rtf", "/ab61/apps/", true);

				pathPiff = "/user/" + usuario + Constantes.CARPETA_COPIA_BUZON_PIF + retornoPIF.getFileName();

				retornoPIF = pifAdapterService.copyFile(retornoPIF.getFilePath(), pathPiff, true);

				Date fecha = new Date();
				// Insertamos la ruta en la tabla AB6133T00
				RelExpPla relExpPla = new RelExpPla();
				relExpPla.setIdPlantilla(plantillas.getIdPlantilla());
				if (idExpediente == 0) {
					relExpPla.setIdExpediente(null);
				} else {
					relExpPla.setIdExpediente(idExpediente);
				}
				if (idProcedimiento == 0) {
					relExpPla.setIdProcedimiento(null);
				} else {
					relExpPla.setIdProcedimiento(idProcedimiento);
				}
				if (identificador != null) {
					relExpPla.setIdentificador(identificador);
				}

				relExpPla.setRuta("/ab61/apps/" + retornoPIF.getFileName());
				relExpPla.setFechaRegistro(fecha);
				relExpPla.setUsuarioRegistro(usuario);
				relExpPlaAux = this.relExpPlaService.add(relExpPla);
				RtfServiceImpl.logger.info("Obejto insertado en relExpPla:" + relExpPlaAux.toString());

			} else {
				String sCodigoError = "error.DocumentoNoExistente";

				RtfServiceImpl.logger.error("generarRtf - " + sCodigoError);

				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			}

		} catch (Ab61Exception e_Ab61Exception) {
			throw e_Ab61Exception;
		} catch (PifException e) {

			String sCodigoError = "error.PIF_Exception";

			RtfServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Exception e) {
			RtfServiceImpl.logger.error("Fallo al generar la plantilla");
		}

		Properties prop = Config.loadProperties(Constantes.FICHERO_CONFIGURACION);

		return prop.getProperty("URL_SPIF") + retornoPIF.getFilePath();

	}

	/**
	 * Inserts a single row in the Listados table.
	 *
	 * @param listados
	 *            Listados
	 * @return Listados
	 * @throws Exception
	 */
	public String generarDocParaDescargar(Plantillas plantillas, String codAplic, Document XMLCampos, Integer origen)
			throws Exception {

		RtfServiceImpl.logger.info("[generarDocParaDescargar : generarDocParaDescargar");
		String nombreDocumento = "";
		Y31AttachmentBean retornoPIF = null;

		try {

			if ((plantillas.getDocumento() != null) && (plantillas.getDocumento().getArchivo() != null)) {
				byte[] bdata = plantillas.getDocumento().getArchivo().getBytes(1,
						(int) plantillas.getDocumento().getArchivo().length());

				String plantillaRTF = new String(bdata);

				// mergeamos el xml que contiene la informacion de la plantilla
				// con
				// la plantilla de base de datos
				ObjPlantilla objPlantilla = this.gestionObjetosRTF(XMLCampos, plantillaRTF);

				InputStream myInputStream = new ByteArrayInputStream(objPlantilla.getTextRTF().getBytes());

				// El nombre del documento depende del origen, en este caso al
				// ser a
				// nivel de Expediente el nombre del archivo contendrá en
				// FOLDER_NUMBER

				if (origen == Constantes.Plantillas.ORIGEN_EXPEDIENTE) {

					if (!"".equalsIgnoreCase(objPlantilla.getFolderNumber())) {
						objPlantilla.setFolderNumber(objPlantilla.getFolderNumber().replaceAll("-", "_"));
						objPlantilla.setFolderNumber(objPlantilla.getFolderNumber().replaceAll("/", "_"));
						objPlantilla.setFolderNumber(objPlantilla.getFolderNumber() + "_");
					}
				} else {
					objPlantilla.setFolderNumber("");

				}

				String nombrePlantillas = plantillas.getDescripcionCastellano().replaceAll(" ", "-");

				nombreDocumento = objPlantilla.getFolderNumber() + nombrePlantillas + "_" + new Date().getTime();

				RtfServiceImpl.logger.info("Nombre del documento:" + nombreDocumento);

				retornoPIF = pifAdapterService.putFile(myInputStream, nombreDocumento + ".rtf", "/" + codAplic + "/",
						true);

			} else {
				String sCodigoError = "error.DocumentoNoExistente";

				RtfServiceImpl.logger.error("generarRtf - " + sCodigoError);

				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			}

		} catch (Ab61Exception e_Ab61Exception) {
			throw e_Ab61Exception;
		} catch (PifException e) {

			String sCodigoError = "error.PIF_Exception";

			RtfServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Exception e) {
			RtfServiceImpl.logger.error("Fallo al generar la plantilla");
		}

		return retornoPIF.getFileName();
	}

	/**
	 * Obtiene el path para una fecha
	 * 
	 * @param date
	 *            Calendar
	 * 
	 * @return String
	 * 
	 */
	public String getActaDayPath(Calendar date) {
		StringBuffer dayPath = new StringBuffer("");
		dayPath.append(date.get(Calendar.YEAR)).append("_").append(date.get(Calendar.MONTH) + 1).append("_")
				.append(date.get(Calendar.DAY_OF_MONTH));
		return dayPath.toString();
	}

	/**
	 * 
	 * @param expedienteElectronicoWS
	 * @throws Exception
	 */
	private TGetTelActionDocumentList recuperarInfor(X43ExpedienteElectronicoAdaptadorService expedienteElectronicoWS,
			String folderID, String procedureID) throws Exception {
		String auditUser = Constantes.AUDIT_USER;

		TGetTelActionDocumentList list = null;
		list = expedienteElectronicoWS.GetTelActionDocuments(folderID, procedureID, auditUser, null);
		return list;
	}

	/**
	 * Metodo que mergea la informacion del xml realizado al invocar a generar
	 * plantilla, con la informacion de la plantilla de base de datos
	 * 
	 * @param documentoXML
	 * @param plantilla
	 * @return
	 * @throws Exception
	 */
	public ObjPlantilla gestionObjetosRTF(Document documentoXML, String plantilla) throws Exception {

		String folderID = "";
		String codProcedureId = "";
		String adaptadorWebService = "";
		String camposWebService = "";

		ObjPlantilla objPlantilla = new ObjPlantilla();

		Element rootElement = documentoXML.getDocumentElement();

		// En primer lugar miramos si tenemos un nodo de WebService, recogemos
		// las variables necesarias para llamar al webservice en caso de que sea
		// necesario
		NodeList listaNodosWebService = rootElement.getElementsByTagName("WebService");

		if (null != listaNodosWebService && null != listaNodosWebService.item(0)) {
			for (int contadorNodo = 0; contadorNodo < listaNodosWebService.item(0).getChildNodes()
					.getLength(); contadorNodo++) {

				Node nodo = listaNodosWebService.item(0).getChildNodes().item(contadorNodo);

				if ("folderID".equalsIgnoreCase(nodo.getNodeName())) {
					folderID = nodo.getChildNodes().item(0).getNodeValue();
				} else if ("codProcedureId".equalsIgnoreCase(nodo.getNodeName())) {
					codProcedureId = nodo.getChildNodes().item(0).getNodeValue();
				} else if ("adaptadorWebService".equalsIgnoreCase(nodo.getNodeName())) {
					adaptadorWebService = nodo.getChildNodes().item(0).getNodeValue();
				} else if ("camposWebService".equalsIgnoreCase(nodo.getNodeName())) {
					camposWebService = nodo.getChildNodes().item(0).getNodeValue();
				}

			}

			// eliminamos los nodos que solo son necesarios para las llamadas al
			// webService
			rootElement.removeChild(listaNodosWebService.item(0));

			// Obtenemos la información del Web Service
			if (adaptadorWebService
					.equalsIgnoreCase("com.ejie.ab61.adaptadores.X43ExpedienteElectronicoAdaptadorService")) {
				TGetTelActionDocumentList lista = recuperarInfor(expedienteElectronicoWS, "" + folderID,
						codProcedureId);
				String[] camposWebServiceArray = camposWebService.split("#");
				if (null != lista && null != camposWebServiceArray && camposWebServiceArray.length > 0) {
					// metemos en el xml que contiene la informacion para
					// informar
					// la plantilla, la informacion recuperada del WebService en
					// caso de que sea necesario
					for (int j = 0; j < camposWebServiceArray.length; j++) {
						if ("aclaracionesES".equalsIgnoreCase(camposWebServiceArray[j])) {
							List<String> listaResultadosWebserviceAclaracionesEs = recuperarDatosListaWebservice(lista,
									camposWebServiceArray[j]);
							String aclaracionesEs = "";
							for (String resultadoAclaracionesES : listaResultadosWebserviceAclaracionesEs) {
								aclaracionesEs = aclaracionesEs + "#" + resultadoAclaracionesES;
							}
							Element dato = documentoXML.createElement("defectos_aclaraciones.aclaracionEs");
							dato.appendChild(documentoXML.createTextNode(aclaracionesEs));
							rootElement.appendChild(dato);
						} else if ("aclaracionesEU".equalsIgnoreCase(camposWebServiceArray[j])) {
							List<String> listaResultadosWebserviceAclaracionesEu = recuperarDatosListaWebservice(lista,
									camposWebServiceArray[j]);
							String aclaracionesEu = "";
							for (String resultadoAclaracionesEU : listaResultadosWebserviceAclaracionesEu) {
								aclaracionesEu = aclaracionesEu + "#" + resultadoAclaracionesEU;
							}
							Element dato = documentoXML.createElement("defectos_aclaraciones.aclaracionEu");
							dato.appendChild(documentoXML.createTextNode(aclaracionesEu));
							rootElement.appendChild(dato);
						} else if ("defectosES".equalsIgnoreCase(camposWebServiceArray[j])) {
							List<String> listaResultadosWebserviceDefectosEs = recuperarDatosListaWebservice(lista,
									camposWebServiceArray[j]);
							String defectosEs = "";
							for (String resultadoDefectosEs : listaResultadosWebserviceDefectosEs) {
								defectosEs = defectosEs + "#" + resultadoDefectosEs;
							}
							Element dato = documentoXML.createElement("defectos_aclaraciones.defectosEs");
							dato.appendChild(documentoXML.createTextNode(defectosEs));
							rootElement.appendChild(dato);
						} else if ("defectosEU".equalsIgnoreCase(camposWebServiceArray[j])) {
							List<String> listaResultadosWebserviceDefectosEu = recuperarDatosListaWebservice(lista,
									camposWebServiceArray[j]);
							String defectosEu = "";
							for (String resultadoDefectosEu : listaResultadosWebserviceDefectosEu) {
								defectosEu = defectosEu + "#" + resultadoDefectosEu;
							}
							Element dato = documentoXML.createElement("defectos_aclaraciones.defectosEu");
							dato.appendChild(documentoXML.createTextNode(defectosEu));
							rootElement.appendChild(dato);
						}
					}
				}

			}
		}

		// como hemos anyadido nuevos elementos en el XML (los referentes al
		// webService) tenemos que reiniciar las variables para recorrerlo
		rootElement = documentoXML.getDocumentElement();

		NodeList listaNodosPrincipales = rootElement.getChildNodes();

		// Mergeamos el contenido del xml con la plantilla
		for (int contadorNodo = 0; contadorNodo < listaNodosPrincipales.getLength(); contadorNodo++) {
			Node nodoPrincipal = listaNodosPrincipales.item(contadorNodo);

			if (nodoPrincipal.getNodeName().equalsIgnoreCase("tabla")) {

				if (nodoPrincipal.getChildNodes().getLength() > 0) {

					Node nodoNombreTabla = nodoPrincipal.getChildNodes().item(0);

					NodeList nodosTabla = nodoNombreTabla.getChildNodes();

					String contenido = "";

					for (int contadorNodoElemento = 0; contadorNodoElemento < nodosTabla
							.getLength(); contadorNodoElemento++) {

						Node nodoTabla = nodosTabla.item(contadorNodoElemento);

						for (int contadorNodoCampo = 0; contadorNodoCampo < nodoTabla.getChildNodes()
								.getLength(); contadorNodoCampo++) {
							Node nodoElemento = nodoTabla.getChildNodes().item(contadorNodoCampo);

							try {
								// Convertimos el valor a FECHA ya que si es una
								// fecha CENTRAREMOS el dato en la columna
								Long fecha = Date.parse(nodoElemento.getChildNodes().item(0).getNodeValue());

								contenido = contenido + "\\qc " + nodoElemento.getChildNodes().item(0).getNodeValue()
										+ "\\cell ";

							} catch (Exception e) {

								try {

									// Convertimos el valor a NÚMERO ya que si
									// es un número CENTRAREMOS el dato en la
									// columna
									String numeroString = nodoElemento.getChildNodes().item(0).getNodeValue()
											.replace(".", "");

									if (numeroString.endsWith("%"))
										numeroString = numeroString.substring(0, numeroString.length() - 1);

									double numero = Double.parseDouble(numeroString.replace(",", "."));

									contenido = contenido + "\\qc "
											+ nodoElemento.getChildNodes().item(0).getNodeValue() + "\\cell ";
								} catch (Exception ex) {

									// Si el dato NO es FECHA ni NÚMERO lo
									// alinearemos a la IZQUIERDA
									contenido = contenido + "\\ql "
											+ nodoElemento.getChildNodes().item(0).getNodeValue() + "\\cell ";
								}
							}

						}

						contenido = contenido + "\\row ";

					}

					int posicionEtiqueta = plantilla.indexOf("#" + nodoNombreTabla.getNodeName() + "#");

					if (posicionEtiqueta != -1) {
						String textoPlantillaInicioEtiqueta = plantilla.substring(0, posicionEtiqueta);
						String textoEtiquetaPlantillaFin = plantilla.substring(posicionEtiqueta, plantilla.length());

						int posicionLineaBlanco = textoEtiquetaPlantillaFin.indexOf("\\row");
						int posicionLineaBlancoFinTabla = textoEtiquetaPlantillaFin.indexOf("\\row }");

						if (posicionLineaBlanco == posicionLineaBlancoFinTabla) {
							contenido = contenido + "} ";

							textoEtiquetaPlantillaFin = textoEtiquetaPlantillaFin.substring(posicionLineaBlanco + 6,
									textoEtiquetaPlantillaFin.length());

						} else {
							int posicionPrimeraLLave = textoEtiquetaPlantillaFin.indexOf("}", posicionLineaBlanco);

							String textoEtiquetaPlantillaFinPosicionLineaBlanco = textoEtiquetaPlantillaFin.substring(0,
									posicionLineaBlanco + 4);
							String textoEtiquetaPlantillaFinPosicionPrimeraLLave = textoEtiquetaPlantillaFin
									.substring(posicionPrimeraLLave, textoEtiquetaPlantillaFin.length());

							textoEtiquetaPlantillaFin = textoEtiquetaPlantillaFinPosicionLineaBlanco
									+ textoEtiquetaPlantillaFinPosicionPrimeraLLave;

							textoEtiquetaPlantillaFin = textoEtiquetaPlantillaFin.substring(posicionLineaBlanco + 4,
									textoEtiquetaPlantillaFin.length());
						}

						plantilla = textoPlantillaInicioEtiqueta + contenido + textoEtiquetaPlantillaFin;
					}

				}

			} else if (nodoPrincipal.getNodeName().equalsIgnoreCase("lista")) {
				if (nodoPrincipal.getChildNodes().getLength() > 0) {

					Node nodoNombreLista = nodoPrincipal.getChildNodes().item(0);

					NodeList nodosLista = nodoNombreLista.getChildNodes();

					String contenido = "";

					for (int contadorNodoElemento = 0; contadorNodoElemento < nodosLista
							.getLength(); contadorNodoElemento++) {

						Node nodoTabla = nodosLista.item(contadorNodoElemento);

						for (int contadorNodoCampo = 0; contadorNodoCampo < nodoTabla.getChildNodes()
								.getLength(); contadorNodoCampo++) {
							Node nodoElemento = nodoTabla.getChildNodes().item(contadorNodoCampo);

							contenido = contenido + nodoElemento.getChildNodes().item(0).getNodeValue()
									+ RTF_SALTO_LINEA;

						}
					}

					plantilla = plantilla.replaceAll("#" + nodoNombreLista.getNodeName() + "#", contenido);

				}
			} else if (nodoPrincipal.getNodeName().equalsIgnoreCase("formulario")) {

				if (nodoPrincipal.getChildNodes().getLength() > 0) {

					Node nodoNombreFormulario = nodoPrincipal.getChildNodes().item(0);

					Node nodoIdFormulario = nodoNombreFormulario.getChildNodes().item(0);

					Documentos subDocumento = new Documentos();
					subDocumento
							.setIdDocumento(Integer.parseInt(nodoIdFormulario.getChildNodes().item(0).getNodeValue()));
					subDocumento = this.documentosService.find(subDocumento);

					byte[] bdata = subDocumento.getArchivo().getBytes(1, (int) subDocumento.getArchivo().length());
					String subPlantillaString = new String(bdata);

					List<ObjPlantilla> listaResultadoSubPlantillaString = new ArrayList<ObjPlantilla>();

					String listaEtiquetas = "";

					for (int contadorNodoElemento = 1; contadorNodoElemento < nodoNombreFormulario.getChildNodes()
							.getLength(); contadorNodoElemento++) {

						Node nodoElemento = nodoNombreFormulario.getChildNodes().item(contadorNodoElemento);

						DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
						DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
						Document objetosSubplantilla = docBuilder.newDocument();

						Element FormularioRootElement = objetosSubplantilla
								.createElement(nodoNombreFormulario.getNodeName());
						objetosSubplantilla.appendChild(FormularioRootElement);

						for (int contadorResultados = 0; contadorResultados < nodoElemento.getChildNodes()
								.getLength(); contadorResultados++) {

							Node campo = nodoElemento.getChildNodes().item(contadorResultados);

							Node nuevoNode = objetosSubplantilla.importNode(campo, true);

							FormularioRootElement.appendChild(nuevoNode);

						}

						listaResultadoSubPlantillaString
								.add(gestionObjetosRTF(objetosSubplantilla, subPlantillaString));
						listaEtiquetas = listaEtiquetas + "#etiqueta" + (contadorNodoElemento - 1) + "#";

					}

					plantilla = plantilla.replaceAll("#" + nodoNombreFormulario.getNodeName() + "#", listaEtiquetas);

					for (int contadorEtiquetaSubPlantilla = 0; contadorEtiquetaSubPlantilla < listaResultadoSubPlantillaString
							.size(); contadorEtiquetaSubPlantilla++) {

						plantilla = plantilla.replaceAll("#etiqueta" + contadorEtiquetaSubPlantilla + "#",
								(listaResultadoSubPlantillaString.get(contadorEtiquetaSubPlantilla)).getTextRTF()
										.toString().replaceAll("\\\\", "\\\\\\\\"));
					}

				}

			} else {
				if ("expediente.nExpediente".equalsIgnoreCase(nodoPrincipal.getNodeName())) {
					if (nodoPrincipal.getChildNodes().getLength() > 0) {
						objPlantilla.setFolderNumber(nodoPrincipal.getChildNodes().item(0).getNodeValue());
					}
				}

				if (nodoPrincipal.getChildNodes().getLength() > 0) {

					Node nodo = nodoPrincipal.getChildNodes().item(0);

					if (nodo.getNodeValue() != null) {
						// si no hay # se sustituye en la plantilla en una sola
						// linea
						if (nodo.getNodeValue().indexOf("#") == -1) {
							plantilla = plantilla.replaceAll("#" + nodoPrincipal.getNodeName() + "#",
									nodo.getNodeValue());

						} else {
							// si el valor esta separado por # es porque se
							// necesita
							// poner en varias lineas en la plantilla
							String[] campos = nodo.getNodeValue().split("#");
							String text = "";
							for (int j = 0; j < campos.length; j++) {
								text = text + campos[j] + RTF_SALTO_LINEA;
							}
							plantilla = plantilla.replaceAll("#" + nodoPrincipal.getNodeName() + "#", text);
						}
					}
				}
			}

		}

		// sustituimos por vacio las etiquetas #xxx_xxx.xxxEu# que queden sin
		// valor
		objPlantilla.setTextRTF(plantilla.replaceAll("#([A-Za-z0-9_.]+)#", ""));

		return objPlantilla;

	}

	/**
	 * mMetodo que recupera la informacion necesaria del webservice
	 * 
	 * @param expedienteElectronicoWS
	 * @return List<String> listaResultados lista con los valores
	 */
	private List<String> recuperarDatosListaWebservice(TGetTelActionDocumentList list, String accion) {
		List<String> listaResultados = new ArrayList<String>();

		if (list != null && list.getTelActionList() != null && list.getTelActionList().getTelAction() != null
				&& list.getTelActionList().getTelAction().size() > 0) {
			for (int i = 0; i < list.getTelActionList().getTelAction().size(); i++) {
				TTelActionDocument listaDocs = list.getTelActionList().getTelAction().get(i);
				// DocumentStorage
				if (listaDocs.getDocumentStorageList() != null
						&& listaDocs.getDocumentStorageList().getDocument() != null
						&& !listaDocs.getDocumentStorageList().getDocument().isEmpty()) {
					listaResultados = documentStorage(accion, listaResultados, listaDocs);
				}
				// DocumentNoStorage
				if (listaDocs.getDocumentNoStorageList() != null
						&& listaDocs.getDocumentNoStorageList().getDocument() != null
						&& !listaDocs.getDocumentNoStorageList().getDocument().isEmpty()) {
					listaResultados = documentNoStorage(accion, listaResultados, listaDocs);
				}
				// Authorization
				if (listaDocs.getAuthorizationList() != null && listaDocs.getAuthorizationList().getDocument() != null
						&& !listaDocs.getAuthorizationList().getDocument().isEmpty()) {
					listaResultados = authorization(accion, listaResultados, listaDocs);
				}
			}
		}
		return listaResultados;
	}

	private List<String> authorization(String accion, List<String> listaResultados, TTelActionDocument listaDocs) {
		List<TDocument> documentStorageList = listaDocs.getAuthorizationList().getDocument();
		for (int j = 0; j < documentStorageList.size(); j++) {
			String defectos;
			String aclaraciones;
			String aclaracionesEU;
			String aclaracionesES;
			TDocument doc = documentStorageList.get(j);
			if (doc.getStudy() != null && doc.getStudy().getClassification() != null
					&& Constantes.Plantillas.SUBSANAR.equalsIgnoreCase(doc.getStudy().getClassification().value())) {
				if (Constantes.Plantillas.DEFECTOS_ES.equalsIgnoreCase(accion)) {
					TTextI18N name = doc.getDocumentRoleName();
					defectos = name.getText().get(1).getValue();
					listaResultados.add(defectos);
				} else if (Constantes.Plantillas.DEFECTOS_EU.equalsIgnoreCase(accion)) {
					TTextI18N name = doc.getDocumentRoleName();
					defectos = name.getText().get(0).getValue();
					listaResultados.add(defectos);
				} else if (Constantes.Plantillas.ACLARACIONES_ES.equalsIgnoreCase(accion)) {
					aclaraciones = doc.getStudy().getObservations();
					aclaraciones = aclaraciones.replaceAll("\"", "'");
					aclaraciones = aclaraciones.substring(aclaraciones.indexOf("<description>"), aclaraciones.length());

					aclaraciones = aclaraciones.replaceAll("<description>", "");
					aclaraciones = aclaraciones.replaceAll("</description>", "");
					aclaracionesEU = aclaraciones.substring(0, aclaraciones.indexOf("<language locale='es'>"));
					aclaracionesEU = aclaracionesEU.replaceAll("<language locale='eu'>", "");
					aclaracionesEU = aclaracionesEU.replaceAll("</language>", "");
					aclaracionesES = aclaraciones.substring(aclaraciones.indexOf("<language locale='es'>"),
							aclaraciones.length());
					aclaracionesES = aclaracionesES.replaceAll("<language locale='es'>", "");
					aclaracionesES = aclaracionesES.replaceAll("</language>", "");
					aclaraciones = aclaracionesES;
					listaResultados.add(aclaraciones);
				} else if (Constantes.Plantillas.ACLARACIONES_EU.equalsIgnoreCase(accion)) {
					aclaraciones = doc.getStudy().getObservations();
					aclaraciones = aclaraciones.replaceAll("\"", "'");
					aclaraciones = aclaraciones.substring(aclaraciones.indexOf("<description>"), aclaraciones.length());

					aclaraciones = aclaraciones.replaceAll("<description>", "");
					aclaraciones = aclaraciones.replaceAll("</description>", "");
					aclaracionesEU = aclaraciones.substring(0, aclaraciones.indexOf("<language locale='es'>"));
					aclaracionesEU = aclaracionesEU.replaceAll("<language locale='eu'>", "");
					aclaracionesEU = aclaracionesEU.replaceAll("</language>", "");
					aclaracionesES = aclaraciones.substring(aclaraciones.indexOf("<language locale='es'>"),
							aclaraciones.length());
					aclaracionesES = aclaracionesES.replaceAll("<language locale='es'>", "");
					aclaracionesES = aclaracionesES.replaceAll("</language>", "");
					aclaraciones = aclaracionesEU;
					listaResultados.add(aclaraciones);
				}
			}
		}
		return listaResultados;
	}

	private List<String> documentNoStorage(String accion, List<String> listaResultados, TTelActionDocument listaDocs) {
		List<TDocument> documentStorageList = listaDocs.getDocumentNoStorageList().getDocument();
		for (int j = 0; j < documentStorageList.size(); j++) {
			String defectos;
			String aclaraciones;
			String aclaracionesEU;
			String aclaracionesES;
			TDocument doc = documentStorageList.get(j);
			if (doc.getStudy() != null && doc.getStudy().getClassification() != null
					&& Constantes.Plantillas.SUBSANAR.equalsIgnoreCase(doc.getStudy().getClassification().value())) {
				if (Constantes.Plantillas.DEFECTOS_ES.equalsIgnoreCase(accion)) {
					TTextI18N name = doc.getDocumentRoleName();
					defectos = name.getText().get(1).getValue();
					listaResultados.add(defectos);
				} else if (Constantes.Plantillas.DEFECTOS_EU.equalsIgnoreCase(accion)) {
					TTextI18N name = doc.getDocumentRoleName();
					defectos = name.getText().get(0).getValue();
					listaResultados.add(defectos);
				} else if (Constantes.Plantillas.ACLARACIONES_ES.equalsIgnoreCase(accion)) {
					aclaraciones = doc.getStudy().getObservations();
					aclaraciones = aclaraciones.replaceAll("\"", "'");
					aclaraciones = aclaraciones.substring(aclaraciones.indexOf("<description>"), aclaraciones.length());

					aclaraciones = aclaraciones.replaceAll("<description>", "");
					aclaraciones = aclaraciones.replaceAll("</description>", "");
					aclaracionesEU = aclaraciones.substring(0, aclaraciones.indexOf("<language locale='es'>"));
					aclaracionesEU = aclaracionesEU.replaceAll("<language locale='eu'>", "");
					aclaracionesEU = aclaracionesEU.replaceAll("</language>", "");
					aclaracionesES = aclaraciones.substring(aclaraciones.indexOf("<language locale='es'>"),
							aclaraciones.length());
					aclaracionesES = aclaracionesES.replaceAll("<language locale='es'>", "");
					aclaracionesES = aclaracionesES.replaceAll("</language>", "");
					aclaraciones = aclaracionesES;
					listaResultados.add(aclaraciones);
				} else if (Constantes.Plantillas.ACLARACIONES_EU.equalsIgnoreCase(accion)) {
					aclaraciones = doc.getStudy().getObservations();
					aclaraciones = aclaraciones.replaceAll("\"", "'");
					aclaraciones = aclaraciones.substring(aclaraciones.indexOf("<description>"), aclaraciones.length());

					aclaraciones = aclaraciones.replaceAll("<description>", "");
					aclaraciones = aclaraciones.replaceAll("</description>", "");
					aclaracionesEU = aclaraciones.substring(0, aclaraciones.indexOf("<language locale='es'>"));
					aclaracionesEU = aclaracionesEU.replaceAll("<language locale='eu'>", "");
					aclaracionesEU = aclaracionesEU.replaceAll("</language>", "");
					aclaracionesES = aclaraciones.substring(aclaraciones.indexOf("<language locale='es'>"),
							aclaraciones.length());
					aclaracionesES = aclaracionesES.replaceAll("<language locale='es'>", "");
					aclaracionesES = aclaracionesES.replaceAll("</language>", "");
					aclaraciones = aclaracionesEU;
					listaResultados.add(aclaraciones);
				}
			}
		}
		return listaResultados;
	}

	private List<String> documentStorage(String accion, List<String> listaResultados, TTelActionDocument listaDocs) {
		List<TDocument> documentStorageList = listaDocs.getDocumentStorageList().getDocument();
		for (int j = 0; j < documentStorageList.size(); j++) {
			TDocument doc = documentStorageList.get(j);
			String defectos;
			String aclaraciones;
			String aclaracionesEU;
			String aclaracionesES;
			if (doc.getStudy() != null && doc.getStudy().getClassification() != null
					&& Constantes.Plantillas.SUBSANAR.equalsIgnoreCase(doc.getStudy().getClassification().value())) {
				if (Constantes.Plantillas.DEFECTOS_ES.equalsIgnoreCase(accion)) {
					TTextI18N name = doc.getDocumentRoleName();
					defectos = name.getText().get(1).getValue();
					listaResultados.add(defectos);
				} else if (Constantes.Plantillas.DEFECTOS_EU.equalsIgnoreCase(accion)) {
					TTextI18N name = doc.getDocumentRoleName();
					defectos = name.getText().get(0).getValue();
					listaResultados.add(defectos);
				} else if (Constantes.Plantillas.ACLARACIONES_ES.equalsIgnoreCase(accion)) {
					aclaraciones = doc.getStudy().getObservations();
					aclaraciones = aclaraciones.replaceAll("\"", "'");
					aclaraciones = aclaraciones.substring(aclaraciones.indexOf("<description>"), aclaraciones.length());

					aclaraciones = aclaraciones.replaceAll("<description>", "");
					aclaraciones = aclaraciones.replaceAll("</description>", "");
					aclaracionesEU = aclaraciones.substring(0, aclaraciones.indexOf("<language locale='es'>"));
					aclaracionesEU = aclaracionesEU.replaceAll("<language locale='eu'>", "");
					aclaracionesEU = aclaracionesEU.replaceAll("</language>", "");
					aclaracionesES = aclaraciones.substring(aclaraciones.indexOf("<language locale='es'>"),
							aclaraciones.length());
					aclaracionesES = aclaracionesES.replaceAll("<language locale='es'>", "");
					aclaracionesES = aclaracionesES.replaceAll("</language>", "");
					aclaraciones = aclaracionesES;
					listaResultados.add(aclaraciones);
				} else if (Constantes.Plantillas.ACLARACIONES_EU.equalsIgnoreCase(accion)) {
					aclaraciones = doc.getStudy().getObservations();
					aclaraciones = aclaraciones.replaceAll("\"", "'");
					aclaraciones = aclaraciones.substring(aclaraciones.indexOf("<description>"), aclaraciones.length());

					aclaraciones = aclaraciones.replaceAll("<description>", "");
					aclaraciones = aclaraciones.replaceAll("</description>", "");
					aclaracionesEU = aclaraciones.substring(0, aclaraciones.indexOf("<language locale='es'>"));
					aclaracionesEU = aclaracionesEU.replaceAll("<language locale='eu'>", "");
					aclaracionesEU = aclaracionesEU.replaceAll("</language>", "");
					aclaracionesES = aclaraciones.substring(aclaraciones.indexOf("<language locale='es'>"),
							aclaraciones.length());
					aclaracionesES = aclaracionesES.replaceAll("<language locale='es'>", "");
					aclaracionesES = aclaracionesES.replaceAll("</language>", "");
					aclaraciones = aclaracionesEU;
					listaResultados.add(aclaraciones);
				}
			}
		}
		return listaResultados;
	}

	/**
	 * Configura el Path donde se genera el Webdav
	 * 
	 * @param pathTmp
	 *            String
	 * @param todayFolderTmp
	 *            String
	 * 
	 * @throws IOException
	 *             IOException
	 * 
	 */
	public void configureActaPath(String pathTmp, String todayFolderTmp) throws IOException {
		// 1. Comprobamos si existe la carpeta codigo de webdav
		File tmpPath = new File(pathTmp);

		if (!tmpPath.exists()) {
			// Si no existe, la creamos
			boolean mkdirTmpPath = tmpPath.mkdir();
			if (mkdirTmpPath) {
				RtfServiceImpl.logger.info("La carpeta codigoAplicacion de webdav se ha generado correctamente.");
			} else {
				RtfServiceImpl.logger.info("No se ha podido generar la carpeta codigoAplicacion de webdav.");
			}
		}

		// 2. Comprobamos si existe la carpeta de ese dia
		File folderPath = new File(pathTmp + todayFolderTmp);
		if (!folderPath.exists()) {
			// Si no existe, la creamos
			boolean mkdirFolderPath = folderPath.mkdir();
			if (mkdirFolderPath) {
				RtfServiceImpl.logger.info("La carpeta del día se ha generado correctamente.");
			} else {
				RtfServiceImpl.logger.info("No se ha podido generar la carpeta del día.");
			}
		}

	}
}
