package com.ejie.ad74a.util.comun;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;
import javax.xml.transform.TransformerException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import com.ejie.ad74a.constantes.Constantes;
import com.ejie.ad74a.exceptions.ErrorField;
import com.ejie.ad74a.exceptions.ValidatorException;
import com.ejie.ad74a.model.Usuarios;
import com.ejie.ad74a.util.constantes.PropertiesConstantes;
import com.ejie.ad74a.utilProperties.config.Config;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNiaType;
import com.ejie.x38.security.UserCredentials;
import com.sun.org.apache.xpath.internal.XPathAPI;

import n38c.exe.N38API;

/**
 * Clase con las utilidades de seguridad
 * 
 * @author GFI
 */
@Component(value = "seguridadProperties")
public class UtilSeguridad extends PropertyPlaceholderConfigurer {

	private static UtilSeguridad instance;

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

	private static final String N38_ITEM_SEGURIDAD_EXPRESION = "//elementos/elemento/elemento/parametro[@id='n38uidperfil']";

	public static enum Props {
		PERFIL_SEGURIDAD_ACCESO_APLICACION("perfil.seguridad.acceso.aplicacion"), //
		PERFIL_SEGURIDAD_ACCESO_BBDD("perfil.seguridad.acceso.bbdd"), //
		PERFIL_SEGURIDAD_PRESTADOR_SERVICIO("perfil.seguridad.televida"), //
		PERFIL_SEGURIDAD_ADMINISTRATIVO_LAKUA("perfil.seguridad.administrativo.lakua"), //
		PERFIL_SEGURIDAD_CONTABILIDAD("perfil.seguridad.contabilidad"), //
		PERFIL_SEGURIDAD_TECNICO_DSS("perfil.seguridad.dss"), //
		PERFIL_SEGURIDAD_OSAKIDETZA("perfil.seguridad.osakidetza"), //
		PERFIL_SEGURIDAD_DIRECTOR_DSS("perfil.seguridad.director"), //
		PERFIL_SEGURIDAD_ADMINISTRADOR("perfil.seguridad.administrador"), //
		PERFIL_SEGURIDAD_ACCESO_DOCUMENTOS("perfil.seguridad.acceso.documentos"), //
		PERFIL_SEGURIDAD_PFACCESO_FICHEROS("perfil.seguridad.pfacceso.ficheros"), //
		PERFIL_SEGURIDAD_PFACCESO_PID("perfil.seguridad.pfacceso.pid"), //
		PERFIL_SEGURIDAD_SSB("perfil.seguridad.ssb"), //

		GRUPPO_SEGURIDAD_SSB("grupo.seguridad.ssb"), //

		INSTANCIA_SEGURIDAD_ACCESO("instancia.seguridad.acceso"), //
		INSTANCIA_SEGURIDAD_TECNICO_LAKUA("instancia.seguridad.tecnico.lakua"), //
		INSTANCIA_SEGURIDAD_TELEVIDA("instancia.seguridad.televida"), //
		INSTANCIA_SEGURIDAD_ADMINISTRATIVO_LAKUA("instancia.seguridad.administrativo.lakua"), //
		INSTANCIA_SEGURIDAD_CONTABILIDAD("instancia.seguridad.contabilidad"), //
		INSTANCIA_SEGURIDAD_SSB("instancia.seguridad.ssb"), //
		INSTANCIA_SEGURIDAD_OSAKIDETZA("instancia.seguridad.osakidetza"), //
		INSTANCIA_SEGURIDAD_DIRECTOR("instancia.seguridad.director"), //
		INSTANCIA_SEGURIDAD_ADMINISTRADOR("instancia.seguridad.administrador") //
		;//

		private String name;

		/**
		 * Constructor del enumerado
		 * 
		 * @param name String
		 */
		private Props(String name) {
			this.name = name;
		}

		/**
		 * Obtiene el valor de la propiedad
		 * 
		 * @return String
		 */
		public String getValue() {
			UtilSeguridad.logger.trace("getProperty {}", name);
			Properties prop = Config.loadProperties(Constantes.CONFIG_SECURITY_PATH);
			return (String) prop.getProperty(this.name);
		}
	}

	/**
	 * Devuelve 'true' si la aplicacion está desplegada en la oficina.
	 * 
	 * @return boolean boolean
	 */
	public static boolean esEntornoLocal() {
		try {
			String esLocal = PropertiesConstantes.Props.ES_LOCAL.getValue();
			UtilSeguridad.logger.debug("Es entorno local: " + esLocal);
			if ("S".equalsIgnoreCase(esLocal)) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			return true;
		}
	}

	/**
	 * Recupera el usuario conectado
	 * 
	 * @return UsuarioConectado
	 */
	public static UserCredentials getUsuarioConectado() {

		return (UserCredentials) SecurityContextHolder.getContext().getAuthentication().getCredentials();

	}

	/**
	 * Recupera el usuario conectado
	 * 
	 * @return UsuarioConectado
	 */
	public static String getNameUsuarioConectado() {
		String name = "";
		try {
			UserCredentials credential = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
					.getCredentials();

			name = credential.getUserName();
		} catch (Exception e) {
			name = Constantes.COD_APLICACION;
		}
		return name;
	}

	/**
	 * Recupera el puesto del usuario conectado
	 * 
	 * @return UsuarioConectado
	 */
	public static String getPuestoUsuarioConectado() {
		String position = "";
		try {
			UserCredentials credential = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
					.getCredentials();

			position = credential.getPosition();
		} catch (Exception e) {
			position = Constantes.COD_APLICACION;
		}
		return position;
	}

	/**
	 * tiene Item Seguridad
	 * 
	 * @param request       HttpServletRequest request
	 * @param itemSeguridad String itemSeguridad
	 * @return boolean boolean
	 */
	public static boolean tieneItemSeguridad(HttpServletRequest request, String itemSeguridad) {
		UtilSeguridad.logger.trace("tieneItemSeguridad INI");
		boolean resultado = false;
		try {

			N38API n38api = new N38API(request);

			Document respuesta = n38api.n38ItemSeguridad(itemSeguridad);
			// Tiene elemento del subtipo 'n38itemSeguridad'?
			return XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0;

		} catch (Exception e) {
			UtilSeguridad.logger.error("tieneItemSeguridad", e);
		}
		UtilSeguridad.logger.trace("tieneItemSeguridad FIN");
		return resultado;
	}

	/**
	 * tiene Item Seguridad
	 * 
	 * @param request       HttpServletRequest request
	 * @param itemSeguridad String itemSeguridad
	 * @return boolean boolean
	 */
	public static boolean perteneceGrupoSeguridad(HttpServletRequest request, ArrayList<String> itemSeguridad) {
		UtilSeguridad.logger.trace("tieneItemSeguridad INI");
		boolean resultado = false;
		try {
			/*
			 * if (UtilSeguridad.enOficina()) { return true; } else {
			 */
			N38API n38api = new N38API(request);
			NodeList respuesta = n38api.n38ItemPuestoGrupos(UtilSeguridad.getUsuarioConectado().getPosition())
					.getChildNodes().item(0).getChildNodes().item(0).getChildNodes();
			for (int i = 0; i < respuesta.getLength(); i++) {
				String nodeList = respuesta.item(i).getChildNodes().item(0).getTextContent();
				if (itemSeguridad.contains(nodeList)) {
					return true;
				}

			}
			return true;
			// }
		} catch (Exception e) {
			UtilSeguridad.logger.error("tieneItemSeguridad", e);
		}
		UtilSeguridad.logger.trace("tieneItemSeguridad FIN");
		return resultado;
	}

	/**
	 * Se recupera el usuario conectado de XLNETS, y se consulta con XLNETS si las
	 * instancias recuperadas del usuario tiene el perfil facilitado como parametro
	 * 
	 * @param request
	 * @param perfilSeguridad String[] con los perfiles de seguridad a comprobar
	 * @return True si lo contiene alguno de los perfiles, false si no.
	 */
	public static boolean tienePerfilSeguridad(HttpServletRequest request, String[] perfilSeguridad) {

		try {
			N38API n38api = new N38API(request);

			UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
					.getCredentials();
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						if (Boolean.TRUE
								.equals(XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
										.item(0).getTextContent().contains(perfil))) {
							return true;
						}
					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}

		return false;
	}

	/**
	 * Se recupera el usuario conectado de XLNETS, y se consulta con XLNETS si las
	 * instancias recuperadas del usuario tiene el perfil facilitado como parametro
	 * 
	 * @param request
	 * @param perfilSeguridad String[] con los perfiles de seguridad a comprobar
	 * @return True si lo contiene alguno de los perfiles, false si no.
	 */
	public static boolean tienePerfilSeguridad(String[] perfilSeguridad) {
		HttpServletRequest request;
		try {
			request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		} catch (NullPointerException e) {
			// Cuando llega la tramitación desde la cola de tramitación no existe
			// RequestContextHolder, por lo que da un null pointer exception al tramtiar.
			// Devolvemos True para el filtrado de entidades.
			return true;
		}

		return tienePerfilSeguridad(request, perfilSeguridad);
	}

	/**
	 * 
	 * 
	 * @param roleName String
	 * @return boolean
	 * @throws TransformerException
	 * @throws DOMException
	 */
	public static boolean isDSSorAdmin(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_DIRECTOR_DSS.getValue() };

		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isDSSorAdminorSSBorPS(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_DIRECTOR_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_SSB.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_PRESTADOR_SERVICIO.getValue(),
				// UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_LAKUA.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRATIVO_LAKUA.getValue() };

		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isDSSorAdminorPS(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_DIRECTOR_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue(),
				UtilSeguridad.Props.PERFIL_SEGURIDAD_PRESTADOR_SERVICIO.getValue() };
		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isDSS(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue() };

		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isAdmin(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue() };

		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isSSB(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_SSB.getValue(),

		};

		try {
			UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
					.getCredentials();

			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isTecnicoDSS(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue(),

		};

		try {
			UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
					.getCredentials();

			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isPS(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_PRESTADOR_SERVICIO.getValue() };

		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	public static boolean isDirector(HttpServletRequest request) {
		UtilSeguridad.logger.trace("hasRole INI");
		N38API n38api = new N38API(request);
		String[] perfilSeguridad = { UtilSeguridad.Props.PERFIL_SEGURIDAD_DIRECTOR_DSS.getValue() };

		UserCredentials usuario = (UserCredentials) SecurityContextHolder.getContext().getAuthentication()
				.getCredentials();
		try {
			for (String instancia : usuario.getUserProfiles()) {
				Document respuesta = n38api.n38ItemSeguridad(instancia);
				// Tiene elemento del subtipo 'n38itemSeguridad'?
				if (XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION).getLength() > 0) {
					for (String perfil : perfilSeguridad) {
						for (int i = 0; i < XPathAPI
								.selectNodeList(respuesta,
										"//elementos/elemento/elemento/parametro[@id='n38uidperfil']")
								.getLength(); i++) {
							if (Boolean.TRUE.equals(
									XPathAPI.selectNodeList(respuesta, UtilSeguridad.N38_ITEM_SEGURIDAD_EXPRESION)
											.item(i).getTextContent().contains(perfil))) {
								return true;
							}
						}

					}

				}
			}

		} catch (Exception e) {
			UtilSeguridad.logger.error("Excepcion al recuperar las credenciales: ");
			UtilSeguridad.logger.error(e.getMessage());
			return false;
		}
		return false;
	}

	/**
	 * Obtiene el usuario a auditar.
	 * 
	 * @return String String
	 */
	public static String getAuditUser() {
		UtilSeguridad.logger.trace("getAuditUser INI");
		StringBuilder sbUser = new StringBuilder(Constantes.STRING_BUILDER_INIT);

		if (SecurityContextHolder.getContext().getAuthentication() != null) {
			if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof String) {
				sbUser.append(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).append("#");
				sbUser.append(Constantes.COD_APLICACION);
			} else {
				sbUser.append(Constantes.COD_APLICACION).append("#");
				sbUser.append(Constantes.COD_APLICACION).append("#");
				sbUser.append(Constantes.COD_APLICACION);
			}
		} else {
			// se agrega esto ya que se llama desde un MDB y no tenemos
			// SecurityContext
			sbUser.append(Constantes.COD_APLICACION).append("#");
			sbUser.append(Constantes.COD_APLICACION).append("#");
			sbUser.append(Constantes.COD_APLICACION);

		}
		UtilSeguridad.logger.trace("getAuditUser FIN Resultado {}", sbUser.toString());
		return sbUser.toString();
	}

	/**
	 * Devuelve un String con el token de aplicación
	 * 
	 * @param idAplic String
	 * @return String
	 */
	public String getTokenXLNetsRequest(HttpServletRequest request) {
		String token = "";
		N38API n38api = new N38API(request);
		token = UtilidadesXML.parseDocument2String(n38api.n38ItemSesion());
		token = token.replace(this.getNif(), "X43V");
		token = token.replace("'", "\"");

		return token;
	}

	/**
	 * Devuelve el NIF del usuario conectado
	 * 
	 * @return String
	 */
	public String getNif() {
		UserCredentials credentials = getUsuarioConectado();
		if (credentials != null) {
			return credentials.getNif();
		}
		return "";
	}

	/**
	 * Devuelve la instancia de tipo UtilSeguridad
	 * 
	 * @return Devuelve la instancia de tipo UtilSeguridad
	 */
	public static final UtilSeguridad getInstance() {
		if (UtilSeguridad.instance == null) {
			UtilSeguridad.instance = new UtilSeguridad();
		}
		return UtilSeguridad.instance;
	}

	public static String getNombreTecnico(String dni) throws Exception {
		Document sesionToken = UtilTokenXlnets.getTokenDocumentXLNets(Constantes.COD_APLICACION);
		N38API n38API = new N38API(sesionToken);
		String nombre = "";
		Document docPersona = n38API.n38ItemObtenerPersonas("dni=" + dni);
		try {
			String[] resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
					"//elemento[@subtipo='n38persona']/parametro[@id='displayname']/valor/text()");
			if (resultado != null && resultado.length > 0) {
				return resultado[0];
			}
		} catch (Exception e) {
			logger.error("getNombreTecnico: ERROR: " + e.getMessage(), e);
		}

		if (nombre.equalsIgnoreCase("")) {
			nombre = dni;
		}
		return nombre;
	}

	public static com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName getSenderTramitador() {
		com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName senderID = new com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName();
		senderID.setType(TNiaType.NIF);
		senderID.setName(UtilSeguridad.getUsuarioConectado().getName());
		senderID.setID(UtilSeguridad.getUsuarioConectado().getNif());

		return senderID;
	}

	public static com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName getSenderTramitadorAplic() {
		com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName senderID = new com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName();
		senderID.setName(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
		senderID.setID(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
		return senderID;
	}

	/**
	 * Comprueba que el dni sea del perfil SSB y devuelve su info de XLNETS
	 * 
	 * @param dni
	 * @return
	 * @throws Exception
	 */
	public static Usuarios existeUserXlnetTecnicoSSB(String dni) throws Exception {
		Document sesionToken = UtilTokenXlnets.getTokenDocumentXLNets(Constantes.COD_APLICACION);

		// hay que quitar la letra del dni, en XLNETS se guarda así
		if (!dni.equalsIgnoreCase(Constantes.XLNETS_USER_SSB_AD74A)) {
			dni = quitarCaracteres(dni);
		}

		N38API n38API = new N38API(sesionToken);
		Document docPersona = n38API.n38ItemObtenerPersonas("dni=" + dni);
		Usuarios usuario = null;
		boolean esSSB = false;
		String grupoSSB = UtilSeguridad.Props.GRUPPO_SEGURIDAD_SSB.getValue();
		logger.info("COMPROBAR: " + UtilSeguridad.Props.GRUPPO_SEGURIDAD_SSB.getValue());

		if (null != docPersona) {

//			String[] gruposUID = UtilidadesXML.obtenerValorNodosXPath(docPersona,
//					"//elemento[@subtipo='n38grupoUsuarios']/parametro[@id='n38uidgrupousuarios']/valor/text()");
//			logger.info("COMPROBAR - GRUPOS: ");
//			for (String g : gruposUID) {
//				logger.info("  - " + g);
//			}

			String[] resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
					"//elemento[@subtipo='n38persona']/parametro[@id='uid']/valor/text()");

			if (resultado != null && resultado.length > 0) {

				// recuperamos el puesto
				String[] puestos = UtilidadesXML.obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='n38puestouid']/valor/text()");

				Document p = n38API.n38ItemPuestoGrupos(puestos[0]);
				String[] gruposUID = UtilidadesXML.obtenerValorNodosXPath(p,
						"//elemento[@subtipo='n38grupoUsuarios']/parametro[@id='n38uidgrupousuarios']/valor/text()");
				logger.info("GRUPOS: ");
				for (String grupo : gruposUID) {
					logger.info("  - " + grupo);
					if (grupo.equalsIgnoreCase(grupoSSB)) {
						logger.error("existeUserXlnetTecnico: Si ");
						esSSB = true;
						break;
					}
				}
			} else {
				List<ErrorField> errores = new ArrayList<ErrorField>();
				errores.add(new ErrorField(Utilidades.getLabelFromResource(
						com.ejie.ad74a.util.constantes.Constantes.BASENAME_RESOURCE_AD74A_I18N, "error.userXlnets",
						LocaleContextHolder.getLocale())));

				throw new ValidatorException(errores);
			}

			if (esSSB) {
				usuario = new Usuarios();
				usuario.setUsuXlnets80(resultado[0]);
				usuario.setIdentificador80(dni);

				resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='givenname']/valor/text()");
				if (resultado != null && resultado.length > 0) {
					usuario.setNombre80(resultado[0]);
				}
				resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='sn']/valor/text()");
				if (resultado != null && resultado.length > 0) {
					usuario.setApellidos80(resultado[0]);
				}
				resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='mail']/valor/text()");
				if (resultado != null && resultado.length > 0) {
					usuario.setEmail80(resultado[0]);
				}
				resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='telephonenumber']/valor/text()");
				if (resultado != null && resultado.length > 0) {
					usuario.setTlfno80(resultado[0]);
				}
				resultado = UtilidadesXML.obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='n38puestouid']/valor/text()");
				if (resultado != null && resultado.length > 0) {
					usuario.setPuesto80(resultado[0]);
				}
			} else {
				List<ErrorField> errores = new ArrayList<ErrorField>();
				errores.add(new ErrorField(Utilidades.getLabelFromResource(
						com.ejie.ad74a.util.constantes.Constantes.BASENAME_RESOURCE_AD74A_I18N, "error.user.grupoSSB",
						LocaleContextHolder.getLocale())));

				throw new ValidatorException(errores);
			}
		}

		return usuario;
	}

	private static String quitarCaracteres(String dni) {
		String resultado = "";
		char[] ca = dni.toCharArray();
		for (int i = 0; i < dni.length(); i++) {
			if (!Character.isLetter(ca[i])) {// Si es letra
				resultado += ca[i];
			}
		}
		return resultado;
	}

	/**
	 * Devuelve el usuario conectado (corto)
	 * 
	 * @return String
	 */
	public String getAuditUserShort() {
		return getAuditUser().toLowerCase().split("#")[0];
	}

}