package es.ejie.frmk.infraestructura.utilidades.general;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.infraestructura.sms.Q70Constantes;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.infraestructura.utilidades.constantes.Q70UtilidadesConstantes;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70GenerarUtilidadesExcepcion;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70UtilidadesErrores;
import es.ejie.frmk.infraestructura.utilidades.excepciones.Q70UtilidadesExcepcion;

/**
 * API interno de utilidades generales para Geremua
 * @author UFRM005
 * @version 1.0
 */
public class Q70UtilidadesGenerales {

/**
 * Función que reemplaza un string por otro en una cadena reiterativamente
 * @param src String cadena de texto fuente
 * @param old String cadena a reemplazar
 * @param newOne String cadena de reemplazo
 * @return strBuffer String cadena resultado
 */

public static String replaceString( String src , String old , String newOne ) {

	StringBuffer sbuf = new StringBuffer( src );
	int oldPos = 0;
	int fromIndex = 0;
	int offset = 0;

	while( true )
	{
	oldPos = src.indexOf( old , fromIndex ) ;
	if( oldPos == -1 )
	break;

	oldPos += offset;
	fromIndex = oldPos + 1;

	sbuf.replace( oldPos , oldPos + old.length() , newOne );
	offset = newOne.length() - 1;
	}

	String strBuffer = sbuf.toString();
	sbuf = null;

return strBuffer;

}


/**
 * Función que lee un archivo y lo convierte a string
 * @param strFile String Path del fichero 
 * @return String Contenido del fichero
 * @exception FileNotFoundException, IOException 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades
 */

public static StringBuffer readFile (String strFile) throws Q70UtilidadesExcepcion{

	StringBuffer bufTexto = new StringBuffer();
	String strlinea = null;
	FileReader reaFile = null;
	BufferedReader bufBuffer = null;

	try{
	
		reaFile = new FileReader(strFile);
		bufBuffer = new BufferedReader(reaFile);
		
		while ( ( strlinea = bufBuffer.readLine()) != null) {
			bufTexto.append(strlinea);
		}
		
	} catch(FileNotFoundException fnf){
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_GENERAL,
												  "Q70UtilidadesGenerales", "readFile()", 
												   Q70UtilidadesErrores.UTILIDADES_GENERALES_FICHERO_EXISTE,fnf );
		
	} catch(IOException ie){
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_GENERAL,
												  "Q70UtilidadesGenerales", "readFile()", 
												   Q70UtilidadesErrores.UTILIDADES_GENERALES_LECTURA_FICHERO ,ie );
	}

return bufTexto;

}

/**
 * Función que lee un fichero de texto en formato ISO-8859-1 y lo convierte a string
 * @param inputStream del fichero de <b>texto</b> 
 * @return String Contenido del fichero
 * @exception Exception 
 * @throws Q70UtilidadesExcepcion Excepción de utilidades
 */
public static String readInputStream (InputStream inputStream) throws Q70UtilidadesExcepcion {

	Q70TrazaInterface traza = Q70Factoria.getTraza();
	BufferedReader bis = null;
	StringBuffer xml= new StringBuffer("");
	
	try {
		bis = new BufferedReader(new InputStreamReader(inputStream,Q70UtilidadesConstantes.ENCODING));

		String buffer = "";

		// Cargamos las lineas recibidas
		while ((buffer = bis.readLine()) != null) {
			xml.append(buffer);
			xml.append("\n");
		}
	} catch (Exception e) {
		if (traza.isTraceActive()) {
			traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "Q70UtilidadesGenerales.readInputStream: Se ha producido un error al leer un fihcero de texto.");
		}
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_GENERAL,
				  "Q70UtilidadesGenerales", "readInputStream()", "Se ha producido un error al leer un fihcero de texto.",e);
	} finally {
		try {
			if (null!= bis) {
				bis.close();
			}
		} catch (IOException e1) { }
	}
	return xml.toString();
}

/**
 * Función que lee un un path de fichero y devuelve un File
 * @param strFile String Path del fichero 
 * @return filFichero File objeto File del fichero
 */

public static File loadFile (String strFile) {

	return new File(strFile);	
}

/**
 * Función extrae una cadena de texto tal como prefijo + cadena + subfijo
 * @param strCadena String Cadena que contiene la expresión
 * @param strPrefijo String Cadena que representa el prefijo
 * @param strSubfijo String Cadena que representa el subfijo
 * @return strCadenaExtraida Cadena sin el prefijo y subfijo 
 */

public static String strExtractString(String strCadena, String strPrefijo, String strSubfijo) throws Q70UtilidadesExcepcion {
	 
	 String strCadenaExtraida = "";
			 
	 if ( (strCadena!=null) && (strPrefijo!=null) && (strSubfijo!=null)  ) {
		
		int intInicio = strPrefijo.length() ;
	 
		if (intInicio < 0 ){
			intInicio = 0;
		}
	 
		int intFin = strCadena.length() - strSubfijo.length();
	
		if (intFin < 0){
			intFin = strCadena.length() ;
		} 	

		strCadenaExtraida = strCadena.substring(intInicio , intFin);
	 
	 } else {
	 	
		throw Q70GenerarUtilidadesExcepcion.createUtilityException(Q70UtilidadesConstantes.UTILIDADES_GENERAL,
												  "Q70UtilidadesGenerales", "extractString()", 
												   Q70UtilidadesErrores.UTILIDADES_GENERALES_ARGUMENTOS);
	 }
	 	 
return strCadenaExtraida;

}

/**
 * Función que determina si una cadena esta rodeada de un prefijo y un subfijo determinados
 * @param strCadena String Cadena que contiene la expresión
 * @param strPrefijo String Cadena que representa el prefijo
 * @param strSubfijo String Cadena que representa el subfijo
 * @return bolIsPreSub    
 */

public static boolean bolIsPreSub(String strCadena, String strPrefijo, String strSubfijo){

	boolean bolIsPreSub = false;
	
	try {
	
		int intPosPre = strCadena.indexOf(strPrefijo);
	
		if ( intPosPre >= 0){
			strCadena = strCadena.substring(strPrefijo.length(), strCadena.length() );
		}
	
		int intPosSub = strCadena.indexOf(strSubfijo);
	
		if ( (intPosPre >= 0) && (intPosSub >= 0)){
			bolIsPreSub = true;
		}
	
	} catch( Exception e) {
		bolIsPreSub = false;
	}

return bolIsPreSub;
}
}