package com.ejie.ab61.service.moduloAdministrativo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.sql.SQLException;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;
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.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlInOutParameter;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.xml.sax.InputSource;

import com.ejie.ab61.adaptadores.T65BDokusiAdaptadorService;
import com.ejie.ab61.adaptadores.X43ExpedienteElectronicoAdaptadorService;
import com.ejie.ab61.adaptadores.X43ToolkitAdaptadorService;
import com.ejie.ab61.clientesWS.X43ExpedienteElectronico.TBoolean;
import com.ejie.ab61.clientesWS.X43Toolkit.Exception_Exception;
import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.comun.utilidades.ClobUtils;
import com.ejie.ab61.comun.utilidades.DBUtils;
import com.ejie.ab61.comun.utilidades.DOMUtilis;
import com.ejie.ab61.comun.utilidades.DateUtils;
import com.ejie.ab61.dao.configuracionEventos.ConfigEventosDao;
import com.ejie.ab61.dao.expedientes.ExpedientesDao;
import com.ejie.ab61.dao.moduloAdministrativo.ModuloAdministracionDao;
import com.ejie.ab61.dao.procedimientos.ProcedimientosDao;
import com.ejie.ab61.dao.solicitudes.SolicitudesDao;
import com.ejie.ab61.model.configuracionEventos.ConfigEventos;
import com.ejie.ab61.model.expedientes.Expedientes;
import com.ejie.ab61.model.moduloAdministrativo.HuecosFolderNumber;
import com.ejie.ab61.model.moduloAdministrativo.ModuloAdministracion;
import com.ejie.ab61.model.procedimientos.Procedimientos;
import com.ejie.ab61.model.solicitudes.Configuracion;
import com.ejie.ab61.model.solicitudes.MensajesSolicitud;
import com.ejie.ab61.model.solicitudes.Solicitudes;
import com.ejie.ab61.model.usuario.Usuario;
import com.ejie.ab61.service.expedientes.ExpedientesService;
import com.ejie.ab61.service.jms.TratamientoJMSServiceImpl;
import com.ejie.ab61.service.solicitudes.ConfiguracionService;
import com.ejie.ab61.service.solicitudes.SolicitudesService;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.TableRowDto;
import com.sun.org.apache.xpath.internal.XPathAPI;

@Service(value = "moduloAdministrativoService")
public class ModuloAdministracionServiceImpl implements ModuloAdministracionService {

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

	@Autowired
	private ModuloAdministracionDao moduloAdministracionDao;

	@Autowired
	private SolicitudesDao solicitudesDao;

	private JdbcTemplate jdbcTemplate;

	@Autowired()
	private SolicitudesService solicitudesService;

	@Autowired()
	private ExpedientesService expedientesService;

	@Autowired()
	private X43ToolkitAdaptadorService x43ToolkitAdaptadorService;

	@Autowired()
	private T65BDokusiAdaptadorService t65BDokusiAdaptadorService;

	@Autowired()
	private ConfiguracionService configuracionService;

	@Autowired()
	private X43ExpedienteElectronicoAdaptadorService x43ExpedienteElectronicoAdaptadorService;

	@Autowired()
	private ExpedientesDao expedientesDao;

	@Autowired()
	private ConfigEventosDao configEventosDao;

	@Autowired
	private ProcedimientosDao procedimientosDao;

	/**
	 * Method use to set the datasource.
	 * 
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	@Resource()
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public JQGridResponseDto<ModuloAdministracion> filter(ModuloAdministracion filterModuloAdministrativo,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<ModuloAdministracion> listaModuloAdministrativo = this.moduloAdministracionDao
				.findAllLike(filterModuloAdministrativo, jqGridRequestDto, false);
		Long recordNum = this.moduloAdministracionDao.findAllLikeCount(
				filterModuloAdministrativo != null ? filterModuloAdministrativo : new ModuloAdministracion(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<ModuloAdministracion>> reorderSelection = this.moduloAdministracionDao
					.reorderSelection(filterModuloAdministrativo, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<ModuloAdministracion>(jqGridRequestDto, recordNum, listaModuloAdministrativo,
					reorderSelection);
		}
		return new JQGridResponseDto<ModuloAdministracion>(jqGridRequestDto, recordNum, listaModuloAdministrativo);
	}

	@Override
	public JQGridResponseDto<ModuloAdministracion> filterTrazasMensajes(ModuloAdministracion filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<ModuloAdministracion> listaModuloAdministrativo = this.moduloAdministracionDao
				.findAllLikeTrazasMensajes(filterTrazas, jqGridRequestDto, false);
		Long recordNum = this.moduloAdministracionDao.findAllLikeCountTrazasMensajes(
				filterTrazas != null ? filterTrazas : new ModuloAdministracion(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<ModuloAdministracion>> reorderSelection = this.moduloAdministracionDao
					.reorderSelectionTrazasMensajes(filterTrazas, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<ModuloAdministracion>(jqGridRequestDto, recordNum, listaModuloAdministrativo,
					reorderSelection);
		}
		return new JQGridResponseDto<ModuloAdministracion>(jqGridRequestDto, recordNum, listaModuloAdministrativo);
	}

	@Override
	public JQGridResponseDto<ModuloAdministracion> filterTrazasSolicitudes(ModuloAdministracion filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<ModuloAdministracion> listaModuloAdministrativo = this.moduloAdministracionDao
				.findAllLikeTrazasSolicitudes(filterTrazas, jqGridRequestDto, false);
		Long recordNum = this.moduloAdministracionDao.findAllLikeCountTrazasSolicitudes(
				filterTrazas != null ? filterTrazas : new ModuloAdministracion(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<ModuloAdministracion>> reorderSelection = this.moduloAdministracionDao
					.reorderSelectionTrazasSolicitudes(filterTrazas, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<ModuloAdministracion>(jqGridRequestDto, recordNum, listaModuloAdministrativo,
					reorderSelection);
		}
		return new JQGridResponseDto<ModuloAdministracion>(jqGridRequestDto, recordNum, listaModuloAdministrativo);
	}

	@Override
	public String obtenerMensaje(String idMensaje) {
		return this.moduloAdministracionDao.obtenerMensaje(idMensaje);
	}

	@Override
	public String obtenerSolicitud(String idMensaje) {
		return this.moduloAdministracionDao.obtenerSolicitud(idMensaje);
	}

	@Override
	public Integer obtenerConfiguracion(String idMensaje) {
		return this.moduloAdministracionDao.obtenerConfiguracion(idMensaje);
	}

	@Override
	public void guardarTextoMensajeLimpiado(Integer id, String textoLimpiado, Usuario usuario) {
		this.moduloAdministracionDao.guardarTextoMensajeLimpiado(id, textoLimpiado, usuario);
	}

	@Override
	public void guardarTextoSolicitudLimpiado(Integer id, String textoLimpiado, Usuario usuario) {
		this.moduloAdministracionDao.guardarTextoSolicitudLimpiado(id, textoLimpiado, usuario);
	}

	@Override
	public String obtenerTarea(String id) {
		return this.moduloAdministracionDao.obtenerTarea(id);
	}

	@Override
	public void corregirMensaje(ModuloAdministracion mensaje) {

		ModuloAdministracionServiceImpl.logger.info("Mensaje: " + mensaje.getFicheroMensaje());

		MensajesSolicitud mensajeSolicitud = new MensajesSolicitud();
		mensajeSolicitud.setIdMensaje(mensaje.getIdMensaje());
		Solicitudes solicitudes = new Solicitudes();
		try {

			HashMap<String, String> resultadoRecogerDatosCola = this.recogerDatosCola(mensaje.getFicheroMensaje());
			if (!resultadoRecogerDatosCola.isEmpty()) {
				mensajeSolicitud.setTipomensaje(resultadoRecogerDatosCola.get(Constantes.EVENT_WHAT));
			}

			ModuloAdministracionServiceImpl.logger
					.info("El tipo de mensaje que llega es = " + mensajeSolicitud.getTipomensaje());

			String plateaType = resultadoRecogerDatosCola.get(Constantes.PLATEA_TYPE);
			String plateaSubType = resultadoRecogerDatosCola.get(Constantes.PLATEA_SUBTYPE);
			String folderID = resultadoRecogerDatosCola.get(Constantes.FOLDER_ID);
			String taskID = resultadoRecogerDatosCola.get(Constantes.TASK_ID);
			String status = resultadoRecogerDatosCola.get(Constantes.STATUS);
			String folderNumber = resultadoRecogerDatosCola.get(Constantes.FOLDER_NUMBER);
			String procedureId = resultadoRecogerDatosCola.get(Constantes.PROCEDURE_ID);
			String fechaRegistro = resultadoRecogerDatosCola.get(Constantes.FECHA_REGISTRO);
			String solicitudId = resultadoRecogerDatosCola.get(Constantes.SOLICITUD_ID);
			String oidDocumento = resultadoRecogerDatosCola.get(Constantes.ACCION_TELEMATICA_OID);

			ModuloAdministracionServiceImpl.logger.info("Empezamos a tratar el mensaje de presentación de solicitud");
			ModuloAdministracionServiceImpl.logger.info("plateaType = " + plateaType);
			ModuloAdministracionServiceImpl.logger.info("plateaType = " + plateaSubType);
			ModuloAdministracionServiceImpl.logger.info("folderID = " + folderID);
			ModuloAdministracionServiceImpl.logger.info("taskID = " + taskID);
			ModuloAdministracionServiceImpl.logger.info("status = " + status);
			ModuloAdministracionServiceImpl.logger.info("procedureId = " + procedureId);
			ModuloAdministracionServiceImpl.logger.info("fechaRegistro = " + fechaRegistro);

			/***********************************************************************
			 * PRIMERO BUSCAMOS LA CONFIGURACION DEL EVENTO EN LA TABLA
			 * (AB6141T00)
			 ***********************************************************************/

			ModuloAdministracionServiceImpl.logger.info("Buscamos la configuración del evetno en la tabla (AB6141T00)");
			ConfigEventos configuracionEvento = new ConfigEventos();
			ConfigEventos filtroConfiguracion = new ConfigEventos();
			if (mensajeSolicitud.getTipomensaje().equalsIgnoreCase(Constantes.R02_REQUEST)) {
				filtroConfiguracion.setTipoEvento(mensajeSolicitud.getTipomensaje());
				filtroConfiguracion.setPlateaType(plateaType);
				filtroConfiguracion.setPlateaSubtype(plateaSubType);
				configuracionEvento = this.configEventosDao.findConfiguracion(filtroConfiguracion);
			} else if (mensajeSolicitud.getTipomensaje().equalsIgnoreCase(Constantes.R02_TASK)
					|| mensajeSolicitud.getTipomensaje().equalsIgnoreCase(Constantes.R02_NOTIFICATION)) {
				filtroConfiguracion.setTipoEvento(mensajeSolicitud.getTipomensaje());
				configuracionEvento = this.configEventosDao.findConfiguracionTareas(filtroConfiguracion);
			}

			if (configuracionEvento != null && configuracionEvento.getConfiguracion() != null) {

				/***********************************************************************
				 * Si la configruacion: 1 = Es una solicituid,obtenemos el
				 * ejgvDocument llamando al servicio getRequestInformation 2 =
				 * Es una accion telemataica, obtenemos el ejgvDocument
				 * recuperando de dokusi a traves 3 = Es un tarea 4 = Inicio de
				 * oficio
				 ***********************************************************************/
				String ejgvDocumentSolicitud = "";

				/*********************
				 * SOLICITUDES - CONFIGURACION 1
				 **********************/
				if (configuracionEvento.getConfiguracion() == Constantes.CONFIG_EVENTO_EJGV_GETREQUESTINFORMATION) {

					if (mensaje.getError() == Constantes.SOLUCION_DOS) {

						try {

							ModuloAdministracionServiceImpl.logger
									.info("Invocamos al servicio x43ToolkitAdaptadorService.getRequestInformation con el parámetro solicitudID = "
											+ solicitudId + "y folderId = " + folderID);

							ejgvDocumentSolicitud = this.x43ToolkitAdaptadorService.getRequestInformation(solicitudId,
									null);

						} catch (Exception_Exception e) {

							ModuloAdministracionServiceImpl.logger.info(
									"Error al invocar al servicio X43Toolkit:getRequestInformation" + e.getMessage());
						}

						/** Guardar la solicitud AB6118T00 */
						this.guardarSolicitud(solicitudes, mensajeSolicitud, ejgvDocumentSolicitud, folderID,
								procedureId, fechaRegistro);

					} else if (mensaje.getError() == Constantes.SOLUCION_UNO) {
						solicitudes = this.solicitudesDao.findSolicitud(mensaje.getIdMensaje());
					}

					if (mensaje.getError() == Constantes.SOLUCION_UNO
							|| mensaje.getError() == Constantes.SOLUCION_DOS) {
						/** Invocar al PL/SQL de carga */
						String tituloExpediente = this.invocarPLCargaSolicitudes(procedureId, mensajeSolicitud,
								plateaType, plateaSubType, solicitudes);

						/** ACTUALIZAR TITULO DE EXPEDIENTE DE PLATEA */
						TBoolean resultadoUpdateTitulo = TBoolean.FALSE;
						try {
							if (tituloExpediente != "" && tituloExpediente != null) {
								resultadoUpdateTitulo = x43ExpedienteElectronicoAdaptadorService
										.updateFolderTitle(folderID, tituloExpediente, null);
							}
						} catch (Exception_Exception e) {
							ModuloAdministracionServiceImpl.logger
									.error("Ha ocurrido un problemas al actualizar el titulo del expediente en platea. Método:updateFolderTitle, folderID = "
											+ folderID + " Titulo = " + tituloExpediente);
						}
						if (resultadoUpdateTitulo.equals(TBoolean.TRUE)) {
							ModuloAdministracionServiceImpl.logger
									.info("EL titulo de expediente en platea se ha actualizado satisfactoriamente");
						} else {
							ModuloAdministracionServiceImpl.logger
									.error("Ha ocurrido un problemas al actualizar el titulo del expediente en platea. Método:updateFolderTitle, folderID = "
											+ folderID + " Titulo = " + tituloExpediente);
						}
					}

					if (mensaje.getError() == Constantes.SOLUCION_UNO || mensaje.getError() == Constantes.SOLUCION_DOS
							|| mensaje.getError() == Constantes.SOLUCION_TRES) {
						/**
						 * Invocar al PL/SQL de ACTUALIZACION DE FECHAS PARA LA
						 * SOLICITUD, JUSTIFICACION Y SUBSANACION
						 */
						this.invocarPLTratarFechasSolJustifSubsanacion(mensajeSolicitud);
					}

					/**************************************************
					 * ACCIONES TELEMATICAS SUBSANACION Y JUSTIFICACION -
					 * CONFIGURACION 2
					 ***************************************************/
				} else if (configuracionEvento.getConfiguracion() == Constantes.CONFIG_EVENTO_EJGV_DOKUSI) {

					if (mensaje.getError() == Constantes.SOLUCION_DOS) {
						try {

							// recuperamos un documento de dokusi a partir del
							// Oid del documento de justificacion
							InputStream bIS = this.recuperarDocumentoDokusi(oidDocumento);
							ejgvDocumentSolicitud = recuperarEjgvDocumentSinHTML(bIS);

						} catch (Exception e) {
							ModuloAdministracionServiceImpl.logger
									.error("error al invocar al recuperarDocumentoDokusi : " + e);
						}
						/**********************************
						 * Guardar la solicitud AB6118T00
						 ********************************/
						solicitudes = this.guardarSolicitud(solicitudes, mensajeSolicitud, ejgvDocumentSolicitud,
								folderID, procedureId, fechaRegistro);
					} else if (mensaje.getError() == Constantes.SOLUCION_UNO) {
						solicitudes = this.solicitudesDao.findSolicitud(mensaje.getIdMensaje());
					}

					if (mensaje.getError() == Constantes.SOLUCION_UNO
							|| mensaje.getError() == Constantes.SOLUCION_DOS) {
						/** Invocar al PL/SQL de carga */
						this.invocarPLCargaAccionesTelematicas(procedureId, mensajeSolicitud, plateaType, plateaSubType,
								solicitudes);
					}

					/** Invocar al PL/SQL de ACTUALIZACION DE FECHAS */
					this.invocarPLTratarFechasSolJustifSubsanacion(mensajeSolicitud);

					/*****************
					 * TAREAS - CONFIGURACION 3
					 *******************/
				} else if (configuracionEvento.getConfiguracion() == Constantes.CONFIG_EVENTO_TAREAS) {

					if (mensaje.getError() == Constantes.SOLUCION_CUATRO) {
						/**
						 * Primero obtenemos de la tabla configuracion el nombre
						 * del pl/sql
						 */

						String nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(),
								plateaType, plateaSubType);
						SqlParameter[] parameters = { new SqlInOutParameter("IN_ID_MENSAJE", Types.NUMERIC) };

						/*
						 * Si no devuelve ningun nombre de PL/SQL volvemos a
						 * repetir la busqueda solo por procedureId y
						 * mensajeSolicitud.getTipomensaje()
						 */
						if (nombrePlSql == null || nombrePlSql.equals("")) {
							nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(), null,
									null);
						}

						MapSqlParameterSource parameterSource = new MapSqlParameterSource();
						parameterSource.addValue("IN_ID_MENSAJE", mensajeSolicitud.getIdMensaje());

						try {
							DBUtils.callPLSQL(this.jdbcTemplate, nombrePlSql, parameters, parameterSource);

						} catch (Exception e) {

							ModuloAdministracionServiceImpl.logger
									.error("Error en la invocación del PL TRATAMIENTO_TAREAS"
											+ solicitudes.getIdSolicitud() + "-" + e.getMessage());
						}

						ModuloAdministracionServiceImpl.logger
								.info("El PL TRATAMIENTO_TAREAS se ha invocado correctamente");

						if (taskID.equalsIgnoreCase(Constantes.TASK_ID_APERTURA)
								&& plateaType.equalsIgnoreCase(Constantes.PLATEA_TYPE_APERTURA)
								&& status.equalsIgnoreCase(Constantes.PLATEA_STATUS_APERTURA_FINALIZADA)) {

							/******************************************************************************************
							 ***************** ACTUALIZAMOS EL TITULO DE EXPEDIENTE/
							 * **********************************
							 *****************************************************************************************/

							List<Expedientes> listaExpedientes = expedientesDao.obtenerTituloExpediente(folderID);
							if (listaExpedientes.size() > 0) {
								/**
								 * Actualizo el titulo del expediente en platea
								 */
								String tituloExpediente = listaExpedientes.get(0).getTitulo();
								TBoolean resultadoUpdateTitulo = TBoolean.FALSE;
								try {
									if (tituloExpediente != "") {
										resultadoUpdateTitulo = x43ExpedienteElectronicoAdaptadorService
												.updateFolderTitle(folderID, tituloExpediente, null);
									}
								} catch (Exception_Exception e) {
									ModuloAdministracionServiceImpl.logger
											.info("Ha ocurrido un problemas al actualizar el titulo del expediente en platea. Método:updateFolderTitle, folderID = "
													+ folderID + " Titulo = " + tituloExpediente);
								}
								if (resultadoUpdateTitulo.equals(TBoolean.TRUE)) {
									ModuloAdministracionServiceImpl.logger.info(
											"EL titulo de expediente en platea se ha actualizado satisfactoriamente");
								} else {
									ModuloAdministracionServiceImpl.logger
											.info("Ha ocurrido un problemas al actualizar el titulo del expediente en platea. Método:updateFolderTitle, folderID = "
													+ folderID + " Titulo = " + tituloExpediente);
								}
							} else {
								logger.info("Para el expediente con FOlderID = " + folderID + " no hay titulo en BD");
							}

							/********************************************************
							 *********** ACTUALIZAMOS EL FOLDERNUMBER****************
							 ********************************************************/
							ModuloAdministracionServiceImpl.logger
									.info("INICIO de actualizar el folderNumber pasando como parametros FOLDERID= "
											+ folderID + " y FOLDERNUMBER = " + folderNumber);
							Expedientes expedientes = new Expedientes();
							expedientes.setFolderNumber(folderNumber);
							expedientes.setFolderId(folderID);
							expedientesService.updateFolderNumber(expedientes);
							ModuloAdministracionServiceImpl.logger.info("FIN de actualizar el folderNumber");
							try {

							} catch (Exception e) {
								ModuloAdministracionServiceImpl.logger
										.error("Error al actualizar el folderNumber en la tarea de apertura = "
												+ e.getMessage());
							}
						}
					}
					/*****************
					 * INICIO DE OFICIO - CONFIGURACION 4
					 *******************/
				} else if (configuracionEvento.getConfiguracion() == Constantes.CONFIG_EVENTO_INICIO_OFICIO) {

					if (mensaje.getError() == Constantes.SOLUCION_UNO) {
						/** Invocar al PL/SQL de carga de inicio de oficio */
						this.invocarPLCargaOficio(procedureId, mensajeSolicitud, plateaType, plateaSubType);
					}

					if (mensaje.getError() == Constantes.SOLUCION_UNO
							|| mensaje.getError() == Constantes.SOLUCION_TRES) {
						/** Invocar al PL/SQL de ACTUALIZACION DE FECHAS */
						this.invocarPLTratarFechasSolJustifSubsanacion(mensajeSolicitud);
					}

					/**************************************************
					 * RESTO DE ACCIONES TELEMATICAS Y R02_NOTIFICATION
					 ***************************************************/

				} else if (configuracionEvento.getConfiguracion() == Constantes.CONFIG_EVENTO_ACCIONES_TELEMATICAS) {
					if (mensaje.getError() == Constantes.SOLUCION_CINCO) {
						/** Invocar al PL/SQL de ACTUALIZACION DE FECHAS */
						this.invocarPLTratarFechas(procedureId, mensajeSolicitud, plateaType, plateaSubType);
					}
				}

			}

			ModuloAdministracionServiceImpl.logger.info("Fin tratarMensaje");

		} catch (SQLException e) {
			ModuloAdministracionServiceImpl.logger.error(e.getMessage());
		} catch (IOException e) {
			ModuloAdministracionServiceImpl.logger.error(e.getMessage());
		}
	}

	@Override
	public void cargarExpediente(String cargaFolderId, String idProcedimiento) {

		String ejgvDocumentSolicitud = "";

		Solicitudes solicitudes = new Solicitudes();

		try {

			ModuloAdministracionServiceImpl.logger
					.info("Invocamos al servicio x43ToolkitAdaptadorService.getRequestInformation con el parámetro folderId = "
							+ cargaFolderId);

			ejgvDocumentSolicitud = this.x43ToolkitAdaptadorService.getRequestInformation(null, cargaFolderId);

		} catch (Exception_Exception e) {

			ModuloAdministracionServiceImpl.logger
					.info("Error al invocar al servicio X43Toolkit:getRequestInformation" + e.getMessage());
		}

		Procedimientos procedimiento = new Procedimientos();
		procedimiento.setIdProcedimiento(Integer.parseInt(idProcedimiento));
		procedimiento = this.procedimientosDao.find(procedimiento);

		MensajesSolicitud mensajeFicticio = new MensajesSolicitud();
		mensajeFicticio.setCodProcedureId(procedimiento.getCodProcedureId());

		mensajeFicticio.setTipomensaje("R02_REQUEST");
		mensajeFicticio.setFicheroMensaje("Mensaje Ficticio");
		mensajeFicticio.setPlateaType("SOLTELEMATICA");
		mensajeFicticio.setPlateaSubtype("1");

		mensajeFicticio = this.moduloAdministracionDao.guardarMensajeFicticio(mensajeFicticio);

		Date fechactual = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		String fechaRegistro = simpleDateFormat.format(fechactual);

		/** Guardar la solicitud AB6118T00 */
		try {
			this.guardarSolicitud(solicitudes, mensajeFicticio, ejgvDocumentSolicitud, cargaFolderId,
					mensajeFicticio.getCodProcedureId(), fechaRegistro);
		} catch (SQLException e) {
			ModuloAdministracionServiceImpl.logger.info("Error al guardar solicitud" + e.getMessage());
		} catch (IOException e) {
			ModuloAdministracionServiceImpl.logger.info("Error al guardar solicitud" + e.getMessage());
		}

		/** Invocar al PL/SQL de carga */
		String tituloExpediente = this.invocarPLCargaSolicitudes(mensajeFicticio.getCodProcedureId(), mensajeFicticio,
				mensajeFicticio.getPlateaType(), mensajeFicticio.getPlateaSubtype(), solicitudes);

		/** ACTUALIZAR TITULO DE EXPEDIENTE DE PLATEA */
		TBoolean resultadoUpdateTitulo = TBoolean.FALSE;
		try {
			if (tituloExpediente != "" && tituloExpediente != null) {
				resultadoUpdateTitulo = x43ExpedienteElectronicoAdaptadorService.updateFolderTitle(cargaFolderId,
						tituloExpediente, null);
			}
		} catch (Exception_Exception e) {
			ModuloAdministracionServiceImpl.logger
					.error("Ha ocurrido un problemas al actualizar el titulo del expediente en platea. Método:updateFolderTitle, folderID = "
							+ cargaFolderId + " Titulo = " + tituloExpediente);
		}
		if (resultadoUpdateTitulo.equals(TBoolean.TRUE)) {
			ModuloAdministracionServiceImpl.logger
					.info("EL titulo de expediente en platea se ha actualizado satisfactoriamente");
		} else {
			ModuloAdministracionServiceImpl.logger
					.error("Ha ocurrido un problemas al actualizar el titulo del expediente en platea. Método:updateFolderTitle, folderID = "
							+ cargaFolderId + " Titulo = " + tituloExpediente);
		}
	}

	/**
	 * 
	 * @param String
	 *            mensajeSolicitud
	 * 
	 * @return String
	 * 
	 * @throws IOException
	 *             IOException
	 */
	public HashMap<String, String> recogerDatosCola(String mensajeSolicitud) throws IOException {

		ModuloAdministracionServiceImpl.logger.info("Inicio recogerTipoMensaje");

		Document datosDocumento = null;

		HashMap<String, String> myHash = new HashMap<String, String>();

		try {
			datosDocumento = DOMUtilis.createDocUTF8(mensajeSolicitud.toString());

		} catch (Exception e) {
			ModuloAdministracionServiceImpl.logger.info("xmlColas error UTF8: " + e.getMessage());
		}

		try {

			NodeList nodosPadre = null;
			if (datosDocumento != null) {
				nodosPadre = datosDocumento.getElementsByTagName("NotificationBody");
			}
			if (nodosPadre != null) {
				int numNodosPadre = nodosPadre.item(Constantes.MAGIC_NUMBER_0).getChildNodes().getLength();

				if (numNodosPadre != Constantes.MAGIC_NUMBER_0) {
					for (int i = 0; i < numNodosPadre; i++) { // Vienen X
						NodeList nodos2 = nodosPadre.item(Constantes.MAGIC_NUMBER_0).getChildNodes().item(i)
								.getChildNodes();

						int numElementos = nodosPadre.item(Constantes.MAGIC_NUMBER_0).getChildNodes().item(i)
								.getChildNodes().getLength();

						String valorName = "";
						String valorDato = "";
						for (int f = 0; f < numElementos; f++) { // me vienen 2
																	// elementos
							Node nodoValorName = nodos2.item(f);

							String strValorName = nodos2.item(f).getNodeName();
							String strValorN = "0";

							if ("Name".equals(strValorName)) {
								if (nodoValorName.getFirstChild() != null && !"returnReceipt"
										.equalsIgnoreCase(nodoValorName.getFirstChild().getNodeValue())) {
									valorName = nodoValorName.getFirstChild().getNodeValue();
								} else {
									valorName = "";
									strValorN = "1";
								}

							}
							if ("Value".equals(strValorName)) {

								if (!"1".equalsIgnoreCase(strValorN)) {
									if (nodoValorName.getFirstChild() != null) {
										if (Constantes.VALUE.equalsIgnoreCase(valorName)
												|| Constantes.DELIVERED_INFO.equalsIgnoreCase(valorName)) {
											if (nodoValorName.getTextContent() != null) {
												valorDato = nodoValorName.getTextContent().toString();

											}
										} else {
											valorDato = nodoValorName.getFirstChild().getNodeValue();

										}
									}
								} else {
									valorDato = "";
								}

							}

						}

						if (!"".equalsIgnoreCase(valorName.trim())) {
							try {
								myHash.put(valorName, valorDato.toString().trim());
							} catch (Exception e) {
								// resultadoCola = "1";
								ModuloAdministracionServiceImpl.logger.info("Error recogerdatos colas " + e);
							}
						}

					} // fin for

				}
			}

		} catch (Exception e) {
			ModuloAdministracionServiceImpl.logger
					.info("Error obteniendo los valores de la solicitud:" + e.getMessage());
		}

		/////
		String tipoMensaje = "";
		if (!myHash.isEmpty()) {
			tipoMensaje = myHash.get(Constantes.EVENT_WHAT);
		}

		ModuloAdministracionServiceImpl.logger.info("El tipo de mensaje que llega es = " + tipoMensaje);

		if (tipoMensaje.equalsIgnoreCase(Constantes.R02_REQUEST)) {
			String xmlTransformado = mensajeSolicitud.toString();
			xmlTransformado = xmlTransformado.replaceAll("&lt;", "<");
			xmlTransformado = xmlTransformado.replaceAll("&gt;", ">");
			Document documentoTrasformado;
			try {
				documentoTrasformado = TratamientoJMSServiceImpl.stringToDocument(xmlTransformado);
				String myFolderID = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/contextSubmissionEvent/folderID/text()");
				ModuloAdministracionServiceImpl.logger.info("FolderID:" + myFolderID);

				String solicitudID = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/contextSubmissionEvent/solicitudID/text()");
				ModuloAdministracionServiceImpl.logger.info("solicitudID:" + solicitudID);

				String fechaEntrada = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/contextSubmissionEvent/registryTimestamp/text()");
				ModuloAdministracionServiceImpl.logger.info("fechaEntrada:" + fechaEntrada);

				String oidSolicitudAccionTelematica = this.obtenerOidSolAccionesTelematicas(documentoTrasformado);

				myHash.put(Constantes.FOLDER_ID, myFolderID);
				myHash.put(Constantes.SOLICITUD_ID, solicitudID);
				myHash.put(Constantes.FECHA_REGISTRO, fechaEntrada);
				myHash.put(Constantes.ACCION_TELEMATICA_OID, oidSolicitudAccionTelematica);

			} catch (Exception e) {
				// TODO Auto-generated catch block
				ModuloAdministracionServiceImpl.logger
						.info("Error transformando el mensaje a document:" + e.getMessage());
			}

		} else if (tipoMensaje.equalsIgnoreCase(Constantes.R02_TASK)) {
			String xmlTransformado = mensajeSolicitud.toString();
			xmlTransformado = xmlTransformado.replaceAll("&lt;", "<");
			xmlTransformado = xmlTransformado.replaceAll("&gt;", ">");
			Document documentoTrasformado;
			try {
				documentoTrasformado = TratamientoJMSServiceImpl.stringToDocument(xmlTransformado);
				String doTimestamp = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/task/doTimestamp/text()");
				ModuloAdministracionServiceImpl.logger.info("task doTimestamp:" + doTimestamp);
				myHash.put(Constantes.DO_TIMESTAMP, doTimestamp);

				String situacionID = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/task/taskInfo/studyTaskData/situacionID/text()");
				ModuloAdministracionServiceImpl.logger.info("task situacionID:" + situacionID);
				myHash.put(Constantes.ESTUDIO_situacionID, situacionID);

				String taskID = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/task/taskID/text()");
				ModuloAdministracionServiceImpl.logger.info("task taskID:" + taskID);
				myHash.put(Constantes.TASK_ID, taskID);

				String myFolderID = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/task/folderID/text()");
				ModuloAdministracionServiceImpl.logger.info("task FolderID:" + myFolderID);
				myHash.put(Constantes.FOLDER_ID, myFolderID);

				String myFolderNumber = TratamientoJMSServiceImpl.buscarDomString(documentoTrasformado,
						"//xmlValue/task/folderNumber/text()");
				ModuloAdministracionServiceImpl.logger.info("task FolderNumber:" + myFolderNumber);
				myHash.put(Constantes.FOLDER_NUMBER, myFolderNumber);

			} catch (Exception e) {
				// TODO Auto-generated catch block
				ModuloAdministracionServiceImpl.logger
						.info("Error transformando el mensaje a document:" + e.getMessage());
			}

		}

		return myHash;

	}

	/**
	 * invocacion a PL-SQL de carga, en algunos Pls se devuelve el titulo de
	 * expedietnes
	 * 
	 * @param procedureId
	 *            String
	 * @param mensajeSolicitud
	 *            MensajesSolicitud
	 * @param plateaType
	 *            String
	 * @param plateaSubType
	 *            String
	 * @param solicitudes
	 *            Solicitudes
	 * @return String
	 */
	private String invocarPLCargaSolicitudes(String procedureId, MensajesSolicitud mensajeSolicitud, String plateaType,
			String plateaSubType, Solicitudes solicitudes) {

		ModuloAdministracionServiceImpl.logger.info("Inicio invocarPLCargaSolicitudes:");
		ModuloAdministracionServiceImpl.logger.info("Parametro procedureId:" + procedureId);
		ModuloAdministracionServiceImpl.logger.info("Parametro mensajeSolicitud:" + mensajeSolicitud);
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaType:" + plateaType);
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaSubType:" + plateaSubType);
		ModuloAdministracionServiceImpl.logger
				.info("Parametro solicitudes.getIdSolicitud:" + solicitudes.getIdSolicitud());

		/**
		 * Primero obtenemos de la tabla configuracion el nombre del pl/sql
		 */

		String nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(), plateaType,
				plateaSubType);

		ModuloAdministracionServiceImpl.logger.info("PL/SQL al que se va a invocar:" + nombrePlSql);

		SqlParameter[] parameters = {

				new SqlInOutParameter("IN_ID_SOLICITUD", Types.VARCHAR),
				new SqlOutParameter("OUT_TITULO", Types.VARCHAR), };

		MapSqlParameterSource parameterSource = new MapSqlParameterSource();
		parameterSource.addValue("IN_ID_SOLICITUD", solicitudes.getIdSolicitud());

		Map<String, Object> m = null;
		String tituloExpediente = "";
		try {
			m = DBUtils.callPLSQL_R02REQUEST(this.jdbcTemplate, nombrePlSql, parameters, parameterSource);
			ModuloAdministracionServiceImpl.logger.info("Titulo que devuelve el expediente:" + m);
			if (m.get("OUT_TITULO") != null) {
				tituloExpediente = m.get("OUT_TITULO").toString();
			}

		} catch (Exception e) {

			ModuloAdministracionServiceImpl.logger.error("Error en el procesamiento del carga de la solicitud:"
					+ solicitudes.getIdSolicitud() + "-" + e.getMessage());
		}

		return tituloExpediente;

	}

	/**
	 * invocacion a PL-SQL de carga de inicio de oficio.
	 * 
	 * @param procedureId
	 *            String
	 * @param mensajeSolicitud
	 *            MensajesSolicitud
	 * @param plateaType
	 *            String
	 * @param plateaSubType
	 *            String
	 * @param solicitudes
	 *            Solicitudes
	 * @return String
	 */
	private void invocarPLCargaOficio(String procedureId, MensajesSolicitud mensajeSolicitud, String plateaType,
			String plateaSubType) {

		ModuloAdministracionServiceImpl.logger.info("Inicio invocarPLCargaOficio:");
		ModuloAdministracionServiceImpl.logger.info("Parametro procedureId:" + procedureId);
		ModuloAdministracionServiceImpl.logger.info("Parametro mensajeSolicitud:" + mensajeSolicitud);
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaType:" + plateaType);
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaSubType:" + plateaSubType);

		/**
		 * Primero obtenemos de la tabla configuracion el nombre del pl/sql
		 */

		String nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(), plateaType,
				plateaSubType);

		ModuloAdministracionServiceImpl.logger.info("PL/SQL al que se va a invocar:" + nombrePlSql);

		SqlParameter[] parameters = { new SqlInOutParameter("IN_ID_MENSAJE", Types.NUMERIC) };

		MapSqlParameterSource parameterSource = new MapSqlParameterSource();
		parameterSource.addValue("IN_ID_MENSAJE", mensajeSolicitud.getIdMensaje());

		try {
			DBUtils.callPLSQL(this.jdbcTemplate, nombrePlSql, parameters, parameterSource);
			ModuloAdministracionServiceImpl.logger.info("Fin invocarPLCargaOficio:");

		} catch (Exception e) {

			ModuloAdministracionServiceImpl.logger.error("Error en la invocación del PL TRATAMIENTO_TAREAS"
					+ mensajeSolicitud.getIdMensaje() + "-" + e.getMessage());
		}

	}

	/**
	 * invocacion a PL-SQL de carga, en algunos Pls se devuelve el titulo de
	 * expedietnes
	 * 
	 * @param procedureId
	 *            String
	 * @param mensajeSolicitud
	 *            MensajesSolicitud
	 * @param plateaType
	 *            String
	 * @param plateaSubType
	 *            String
	 * @param solicitudes
	 *            Solicitudes
	 * @return String
	 */
	private void invocarPLCargaAccionesTelematicas(String procedureId, MensajesSolicitud mensajeSolicitud,
			String plateaType, String plateaSubType, Solicitudes solicitudes) {

		ModuloAdministracionServiceImpl.logger.info("Inicio invocarPLCargaAccionesTelematicas:");
		ModuloAdministracionServiceImpl.logger.info("Parametro procedureId:" + procedureId);
		ModuloAdministracionServiceImpl.logger.info("Parametro tipo mensaje:" + mensajeSolicitud.getTipomensaje());
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaType:" + plateaType);
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaSubType:" + plateaSubType);
		ModuloAdministracionServiceImpl.logger.info("Parametro IdSolicitud:" + solicitudes.getIdSolicitud());

		/**
		 * Primero obtenemos de la tabla configuracion el nombre del pl/sql
		 */

		String nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(), plateaType,
				plateaSubType);

		ModuloAdministracionServiceImpl.logger.info("PL/SQL al que se va a invocar:" + nombrePlSql);

		SqlParameter[] parameters = {

				new SqlInOutParameter("IN_ID_SOLICITUD", Types.VARCHAR) };

		MapSqlParameterSource parameterSource = new MapSqlParameterSource();
		parameterSource.addValue("IN_ID_SOLICITUD", solicitudes.getIdSolicitud());

		try {
			DBUtils.callPLSQL_R02REQUEST(this.jdbcTemplate, nombrePlSql, parameters, parameterSource);
			ModuloAdministracionServiceImpl.logger.info("Fin invocarPLCargaAccionesTelematicas:");

		} catch (Exception e) {

			ModuloAdministracionServiceImpl.logger.error("Error en el procesamiento del carga de la solicitud:"
					+ solicitudes.getIdSolicitud() + "-" + e.getMessage());
		}

	}

	/**
	 * invocacion a PL-SQL de para acciones telematicas, excepto solicitudes,
	 * justificaciones y subsanaciones
	 * 
	 * @param procedureId
	 *            String
	 * @param mensajeSolicitud
	 *            MensajesSolicitud
	 * @param plateaType
	 *            String
	 * @param plateaSubType
	 *            String
	 * @param solicitudes
	 *            Solicitudes
	 * @return String
	 */
	private void invocarPLTratarFechas(String procedureId, MensajesSolicitud mensajeSolicitud, String plateaType,
			String plateaSubType) {

		ModuloAdministracionServiceImpl.logger.info("Inicio invocarPLTratarFechas:");
		ModuloAdministracionServiceImpl.logger.info("Parametro procedureId:" + procedureId);
		ModuloAdministracionServiceImpl.logger.info("Parametro tipo mensaje:" + mensajeSolicitud.getTipomensaje());
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaType:" + plateaType);
		ModuloAdministracionServiceImpl.logger.info("Parametro plateaSubType:" + plateaSubType);

		/**
		 * Primero obtenemos de la tabla configuracion el nombre del pl/sql
		 */

		String nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(), plateaType,
				plateaSubType);

		/*
		 * Si no devuelve ningun nombre de PL/SQL volvemos a repetir la busqueda
		 * solo por procedureId y mensajeSolicitud.getTipomensaje()
		 */
		if (nombrePlSql == null || nombrePlSql.equals("")) {
			nombrePlSql = this.obtenerNombrePLSQL(procedureId, mensajeSolicitud.getTipomensaje(), null, null);
		}
		ModuloAdministracionServiceImpl.logger.info("PL/SQL al que se va a invocar:" + nombrePlSql);

		SqlParameter[] parameters = { new SqlInOutParameter("IN_ID_MENSAJE", Types.NUMERIC) };

		MapSqlParameterSource parameterSource = new MapSqlParameterSource();
		parameterSource.addValue("IN_ID_MENSAJE", mensajeSolicitud.getIdMensaje());

		try {
			DBUtils.callPLSQL(this.jdbcTemplate, nombrePlSql, parameters, parameterSource);
			ModuloAdministracionServiceImpl.logger.info("Fin invocarPLTratarFechas:");

		} catch (Exception e) {

			ModuloAdministracionServiceImpl.logger.error("Error en la invocación del PL = " + nombrePlSql
					+ "con el IDMENSAJE = " + mensajeSolicitud.getIdMensaje() + "-" + e.getMessage());
		}

	}

	/**
	 * invocacion a PL-SQL de tratamiento de fechas para caso de solicitudes,
	 * subsanaciones y justificaciones e inicio de oficio
	 * 
	 * @param procedureId
	 *            String
	 * @param mensajeSolicitud
	 *            MensajesSolicitud
	 * @param plateaType
	 *            String
	 * @param plateaSubType
	 *            String
	 * @param solicitudes
	 *            Solicitudes
	 * @return String
	 */
	private void invocarPLTratarFechasSolJustifSubsanacion(MensajesSolicitud mensajeSolicitud) {

		ModuloAdministracionServiceImpl.logger
				.info("Inicio invocarPLTratarFechasSolJustifSubsanacion: TRATAMIENTO_FECHAS");
		ModuloAdministracionServiceImpl.logger.info("Parametro IdMensaje() = " + mensajeSolicitud.getIdMensaje());

		SqlParameter[] parameters = { new SqlInOutParameter("IN_ID_MENSAJE", Types.NUMERIC) };

		MapSqlParameterSource parameterSource = new MapSqlParameterSource();
		parameterSource.addValue("IN_ID_MENSAJE", mensajeSolicitud.getIdMensaje());

		try {
			DBUtils.callPLSQL(this.jdbcTemplate, "TRATAMIENTO_FECHAS", parameters, parameterSource);
			ModuloAdministracionServiceImpl.logger.info("Fin invocarPLTratarFechasSolJustifSubsanacion");

		} catch (Exception e) {

			ModuloAdministracionServiceImpl.logger.error("Error en la invocación del PL TRATAMIENTO_TAREAS"
					+ mensajeSolicitud.getIdMensaje() + "-" + e.getMessage());
		}

	}

	/**
	 * Formatear el mensae recibido de R02TASK para quitar los esquemas
	 * 
	 * @param strToken
	 *            : token de sesion
	 * @return strValor : el token sin
	 */
	public String formatearMensaje(String mensaje) {

		mensaje = mensaje.replace("&lt;", "<").replace("&gt;", ">");
		mensaje = this.eliminarComienzoToken(mensaje);
		/**
		 * Eliminamos de la etiqueta NotificationBody la propiedad
		 * com/ejie/notification/xml
		 */
		int posicionNB = mensaje.indexOf("NotificationBody");
		if (posicionNB != -1) {
			int posicionCierreNB = mensaje.indexOf(">", posicionNB + 16);
			String cadenaABorrarNB = mensaje.substring(posicionNB + 16, posicionCierreNB);
			mensaje = mensaje.replace(cadenaABorrarNB, "");
		}

		/**
		 * Eliminamos de la etiqueta NotificationBody la propiedad
		 * com/ejie/notification/xml
		 */
		int posicionTASK = mensaje.indexOf("task");
		if (posicionTASK != -1) {
			int posicionCierreTASK = mensaje.indexOf(">", posicionTASK + 4);
			String cadenaABorrarTASK = mensaje.substring(posicionTASK + 4, posicionCierreTASK);
			mensaje = mensaje.replace(cadenaABorrarTASK, "");
		}

		/**
		 * Eliminamos de la etiqueta notificationEvent la propiedad
		 * xmlns="com/ejie/pnt/xml"
		 */
		int posicionNE = mensaje.indexOf("notificationEvent");
		if (posicionNE != -1) {
			int posicionCierreNE = mensaje.indexOf(">", posicionNE + 17);
			String cadenaABorrarNE = mensaje.substring(posicionNE + 17, posicionCierreNE);
			mensaje = mensaje.replace(cadenaABorrarNE, "");
		}

		/**
		 * Eliminamos de la etiqueta contextSubmissionEvent la propiedad
		 * xmlns="com/ejie/folderManagement/xml"
		 */
		int posicionCS = mensaje.indexOf("contextSubmissionEvent");
		if (posicionCS != -1) {
			int posicionCierreCS = mensaje.indexOf(">", posicionCS + 22);
			String cadenaABorrarCS = mensaje.substring(posicionCS + 22, posicionCierreCS);
			mensaje = mensaje.replace(cadenaABorrarCS, "");
		}

		/**
		 * Eliminamos de la etiqueta EventCorrelationId la propiedad
		 * xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 */
		int posicionEC = mensaje.indexOf("<Name>EventCorrelationId</Name><Value");
		if (posicionEC != -1) {
			int posicionCierreEC = mensaje.indexOf(">", posicionEC + 37);
			String cadenaABorrarEC = mensaje.substring(posicionEC + 37, posicionCierreEC);
			mensaje = mensaje.replace(cadenaABorrarEC, "");
		}

		/**
		 * Eliminamos de la etiqueta instanceId la propiedad xsi:nil="true"
		 */
		int posicionIN = mensaje.indexOf("<instanceId xsi:nil=");
		if (posicionIN != -1) {
			int posicionCierreIN = mensaje.indexOf("/>", posicionIN);
			String cadenaABorrarIN = mensaje.substring(posicionIN, posicionCierreIN + 2);
			mensaje = mensaje.replace(cadenaABorrarIN, "");
		}

		return mensaje;
	}

	/**
	 * Quita el texto <?xml version='1.0' encoding='ISO-8859-1'?> del Token de
	 * sesion de la n38
	 * 
	 * @param strToken
	 *            : token de sesion
	 * @return strValor : el token sin
	 */
	public String eliminarComienzoToken(String strToken) {
		String strValor = null;

		int intValor = strToken.indexOf("?>");

		if (intValor != -1) {
			strValor = strToken.substring(intValor + 2);
		} else {
			strValor = strToken;
		}

		return strValor;
	}

	/**
	 * Funcion Convierte String a Document
	 * 
	 * @param textoXML
	 *            String
	 * 
	 * @return Document
	 * 
	 * @throws Exception
	 *             Exception
	 */

	public static Document stringToDocument(String textoXML) throws Exception {

		Document document = null;

		try {

			DocumentBuilderFactory factory = null;
			DocumentBuilder builder = null;

			factory = DocumentBuilderFactory.newInstance();
			factory.setValidating(false);
			factory.setIgnoringElementContentWhitespace(true);
			builder = factory.newDocumentBuilder();
			StringReader stringIn = new StringReader(textoXML);
			document = builder.parse(new InputSource(stringIn));

			// crear y añadir la pi

			ProcessingInstruction pi = document.createProcessingInstruction("xml",
					"version=\"1.0\" encoding=\"ISO-8859-1\"");
			document.appendChild(pi);

		} catch (Exception ex) {
			throw new Exception("Excepcion en stringToDocument:", ex);
		}

		return document;

	}

	/**
	 * Funcion que devuelte un Texto dado un XPath
	 * 
	 * @param docDom
	 *            Document
	 * @param strPath
	 *            String
	 * 
	 * @return String
	 */
	public static String buscarDomString(Document docDom, String strPath) {

		NodeList NodeLiResultado = null;
		String strValor = "";

		try {

			NodeLiResultado = XPathAPI.selectNodeList(docDom, strPath);

			if (NodeLiResultado.getLength() != 0) {
				strValor = (String) NodeLiResultado.item(0).getNodeValue();
			} else {
				strValor = "";
			}

		} catch (Exception ex) {
			ex.printStackTrace(System.out);
		}

		return strValor;
	}

	/**
	 * Metodo que obtiene de la tabla de configuracion (Ab6119T00 el nombre de
	 * BD
	 * 
	 * @param procedureId
	 * @param plateaType
	 * @param plateaSubType
	 * @return
	 */
	private String obtenerNombrePLSQL(String procedureId, String mensajeSolicitud, String plateaType,
			String plateaSubType) {

		Configuracion configuracion = new Configuracion();
		configuracion.setCodProcedureId(procedureId);
		configuracion.setTipoEvento(mensajeSolicitud);
		configuracion.setPlateaType(plateaType);
		configuracion.setPlateaSubType(plateaSubType);
		List<Configuracion> listConfiguracion = configuracionService.findAll(configuracion, null);
		String nombrePlSql = "";
		if (listConfiguracion.size() > 0) {
			nombrePlSql = listConfiguracion.get(0).getPlsqlCarga();
		}
		return nombrePlSql;

	};

	/**
	 * Metodo que recupera un documento de dokusi a partir del Oid del documento
	 * 
	 * @param oidDocument
	 *            string
	 * @return List<Object>
	 * @throws Exception
	 */
	private InputStream recuperarDocumentoDokusi(String documentID) throws Exception {

		ModuloAdministracionServiceImpl.logger.info("recuperarDocumentoDokusi - " + documentID);
		try {

			InputStream datosDokusi = this.t65BDokusiAdaptadorService.retrieveDocument(documentID);

			return datosDokusi;
		} catch (Exception e_obtenerDocDokusi) {
			ModuloAdministracionServiceImpl.logger.error("DokusiAdapterServiceImpl.retrieveDocument",
					e_obtenerDocDokusi);
			throw e_obtenerDocDokusi;
		} finally {
			ModuloAdministracionServiceImpl.logger.info("DokusiAdapterServiceImpl.retrieveDocument - Final");
		}

	}

	/**
	 * Obtener del mensaje el oid de la solicitud de las acciones telematicas
	 * 
	 * @param documentoTrasformado
	 *            Document
	 * @return
	 */
	private String obtenerOidSolAccionesTelematicas(Document documentoTrasformado) {

		String oid = "";
		NodeList datosDocumento2 = documentoTrasformado.getElementsByTagName("documentsEvent");

		if (datosDocumento2 != null) {

			int numeroValores = datosDocumento2.item(0).getChildNodes().getLength();

			for (int contadorDocumentos = 0; contadorDocumentos < numeroValores; contadorDocumentos++) {

				Node nodoDocumento = datosDocumento2.item(0).getChildNodes().item(contadorDocumentos);

				if (nodoDocumento.getNodeName().equalsIgnoreCase("documentEvent")) {
					boolean documentoJustificacion = false;
					for (int contadorPropiedades = 0; contadorPropiedades < numeroValores; contadorPropiedades++) {

						Node nodoPropiedad = nodoDocumento.getChildNodes().item(contadorPropiedades);
						if (nodoPropiedad.getNodeName().equalsIgnoreCase("oid")) {
							if (nodoPropiedad.getChildNodes().getLength() > 0) {
								oid = nodoPropiedad.getChildNodes().item(0).getNodeValue();
							}
						} else if (nodoPropiedad.getNodeName().equalsIgnoreCase("roleId")) {
							if (nodoPropiedad.getChildNodes().getLength() > 0) {
								if (nodoPropiedad.getNodeValue() != null) {

									if (nodoPropiedad.getChildNodes().item(0).getNodeValue()
											.equalsIgnoreCase("ejgv_d_solicitud.0.0")) {
										documentoJustificacion = true;

									}
								}
							}
							break;

						}
					}

					if (documentoJustificacion) {
						break;
					}
				}

			}
		}

		return oid;
	}

	/**
	 * Guardar mensaje en la tabla AB6118T00
	 * 
	 * @param solicitudes
	 *            Solicitudes
	 * @throws IOException
	 * @throws SQLException
	 */
	private Solicitudes guardarSolicitud(Solicitudes solicitudes, MensajesSolicitud mensajeSolicitud,
			String ejgvDocumentSolicitud, String folderID, String procedureId, String fechaRegistro)
			throws SQLException, IOException {
		solicitudes.setMensajesSolicitud(mensajeSolicitud);
		solicitudes.setSolicitud(ClobUtils.stringToClob(ejgvDocumentSolicitud));
		solicitudes.setFechaRegistro(new Date());
		solicitudes.setFolderId(folderID);
		solicitudes.setCodProcedureId(procedureId);
		String fechaEntradaSol = fechaRegistro;
		ModuloAdministracionServiceImpl.logger.info("fechaEntradaSol= " + fechaEntradaSol);
		solicitudes.setFechaEntradaStr(DateUtils.convertirStringEnStringFormateado(fechaEntradaSol));

		ModuloAdministracionServiceImpl.logger
				.info("Iniciando guardar el mensaje en la tabla de solicitudes (AB6118T00) con el paramtero Solictud = "
						+ solicitudes.toString());

		solicitudes = solicitudesService.add(solicitudes);

		ModuloAdministracionServiceImpl.logger.info("Guardardo el mensaje en la tabla de mensajes (AB6118T00)");

		return solicitudes;
	}

	/**
	 * Devuelve todo el html de la aportacion de la
	 * documentacion(justificacion,subsanacion, etc..), solo interesa recuperar
	 * el ejgvDocument
	 * 
	 * @param bIS
	 *            InputStream
	 * @return String
	 * @throws Exception
	 * 
	 */
	private String recuperarEjgvDocumentSinHTML(InputStream bIS) throws Exception {

		String ejgvDocumentSolicitud = "";
		String strFileContents = "";
		int numRead;
		final int bufferSize = 1024;
		byte[] buffer = new byte[bufferSize];
		ByteArrayOutputStream outString = new ByteArrayOutputStream();
		try {
			while ((numRead = bIS.read(buffer)) != -1) {
				outString.write(buffer, 0, numRead);
			}
		} finally {
			bIS.close();
		}
		strFileContents = new String(outString.toByteArray());

		int inicio = strFileContents.indexOf("<ejgvDocument>");
		int fin = strFileContents.indexOf("</ejgvDocument>");

		ejgvDocumentSolicitud = strFileContents.substring(inicio, fin + 15);
		return ejgvDocumentSolicitud;
	}

	@Override
	public JQGridResponseDto<HuecosFolderNumber> huecosFolderNumber(HuecosFolderNumber filterHuecosFolderNumber,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<HuecosFolderNumber> listaHuecosFolderNumber = this.moduloAdministracionDao
				.findAllLike(filterHuecosFolderNumber, jqGridRequestDto, false);
		Long recordNum = this.moduloAdministracionDao.findAllLikeCount(
				filterHuecosFolderNumber != null ? filterHuecosFolderNumber : new HuecosFolderNumber(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<HuecosFolderNumber>> reorderSelection = this.moduloAdministracionDao
					.reorderSelection(filterHuecosFolderNumber, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<HuecosFolderNumber>(jqGridRequestDto, recordNum, listaHuecosFolderNumber,
					reorderSelection);
		}
		return new JQGridResponseDto<HuecosFolderNumber>(jqGridRequestDto, recordNum, listaHuecosFolderNumber);
	}

	@Override
	public JQGridResponseDto<HuecosFolderNumber> folderNull(HuecosFolderNumber filterHuecosFolderNumber,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<HuecosFolderNumber> listaHuecosFolderNumber = this.moduloAdministracionDao
				.findAllLikeNull(filterHuecosFolderNumber, jqGridRequestDto, false);
		Long recordNum = this.moduloAdministracionDao.findAllLikeCountNull(
				filterHuecosFolderNumber != null ? filterHuecosFolderNumber : new HuecosFolderNumber(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<HuecosFolderNumber>> reorderSelection = this.moduloAdministracionDao
					.reorderSelectionNull(filterHuecosFolderNumber, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<HuecosFolderNumber>(jqGridRequestDto, recordNum, listaHuecosFolderNumber,
					reorderSelection);
		}
		return new JQGridResponseDto<HuecosFolderNumber>(jqGridRequestDto, recordNum, listaHuecosFolderNumber);
	}

	@Override
	public Boolean llamadaPlObtenerErroresFolderNumber() {
		Boolean retorno = false;

		try {
			DBUtils.callPLSQLObtenerErrores(this.jdbcTemplate, "OBTENER_ERRORES_FOLDER_NUMBER");
			retorno = true;
		} catch (Exception e) {
			ModuloAdministracionServiceImpl.logger
					.error("Error en el procesamiento del carga de la solicitud:" + e.getMessage());
			retorno = false;
		}
		return retorno;
	}
}
