Programa Scheduler.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.Map;

/*
 * El objetivo de este programa es hacer una planificador (scheduler)
 * que haga tareas rutinarias ya sea a petición o por horario 
 *  
 * Realizado por José Corona Alcántara 
 */

public class p001_Scheduler {
	
	/*
	 * Se crean variables privadas para los nombres de los archivos
	 * Y se crean sus métodos setters y getters para manipular sus
	 * valores. A esto se le llama encapsulamiento	 
	 */
	
	private String mFAmbiente;
	private String mFProgramada;
	private String mfInmediata;
	private String MfDirTrabajo;
	private List arrPeticiones=new ArrayList();
	
	public String getmFAmbiente() {
		return mFAmbiente;
	}

	public String getMfDirTrabajo() {
		if (MfDirTrabajo==null) MfDirTrabajo="";
		return MfDirTrabajo;
	}

	public void setMfDirTrabajo(String mfDirTrabajo) {
		MfDirTrabajo = mfDirTrabajo;
	}

	public void setmFAmbiente(String mFAmbiente) {
		this.mFAmbiente = mFAmbiente;
	}

	public String getmFProgramada() {
		return mFProgramada;
	}

	public void setmFProgramada(String mFProgramada) {
		this.mFProgramada = mFProgramada;
	}

	public String getMfInmediata() {
		return mfInmediata;
	}

	public void setMfInmediata(String mfInmediata) {
		this.mfInmediata = mfInmediata;
	}	
	
	
	
	private void PeticionesProgramadas(Long ll_fhinicio, Long ll_fhfin){
		
		String lsNbFile=this.getMfDirTrabajo()+File.separator+this.getmFProgramada();
		File f=new File(lsNbFile);	
		BufferedReader br;
		String ls_linea;
		String[] arrPet;
		int liEncontradas=0;
		String ls_fhactual;
		long ll_fhactual=0;
		   
		if (!f.exists()) {
			System.out.println("No existe el archivo de peticiones programadas: "+lsNbFile);
			return;
		}
		
		try {
			   
			   br=new BufferedReader(new FileReader(new File(lsNbFile)));
			   
			   ls_fhactual=(new SimpleDateFormat("yyyyMMdd").format(new Date()));
			   
			   
			   while ((ls_linea=br.readLine())!=null){
				   arrPet=ls_linea.split("\\|");
				   if (arrPet[0].length()!=5){
					   System.out.println("Formato de hora erróneo (hh:mm): "+arrPet[0]);
					   continue; //Se sigue a la siguiente iteracción del ciclo que está					   
				   }
				   
				   ll_fhactual=Long.valueOf(
                                 ls_fhactual.concat(arrPet[0].substring(0,2)+
                                                    arrPet[0].substring(3,5)));
				   
				   //Empieza a cargar peticiones después de la hora siempre que este en el rango
				   if (ll_fhinicio<=ll_fhactual && ll_fhactual<=ll_fhfin)
				   for (int i=1;i<arrPet.length;i++){
					   liEncontradas++;
					   arrPeticiones.add(arrPet[i]);
				   }				   
			   }
			   
			   if (liEncontradas>0)
			      System.out.println("Peticiones programadas encontradas: "+
                                     liEncontradas+
                                     " peticiones en el archivo "+
                                     lsNbFile
                                     );   
		   } catch(Exception e){
			   System.out.println(e.getMessage());
		   }		   
		   
		   
	}
	
	private void PeticionesInmediatas(Calendar lfh){
	   Boolean lbRes;
	   String lsNbFile="";
	   File f=new File(this.getMfDirTrabajo()+File.separator+this.getMfInmediata());
	   BufferedReader br;
	   String ls_linea;
	   String[] arrPet;
	   int liEncontradas=0;
	   
	   
	   if (!f.exists()) {
		   System.out.println("No existe el archivo de peticiones Inmediatas: "+
                               this.getMfDirTrabajo()+File.separator+this.getMfInmediata());
		   return;
	   }
	   
	   lsNbFile=(this.getMfDirTrabajo()+
                 File.separator+
                 (new SimpleDateFormat("yyyyMMddHHmmss")).format(lfh.getTime())).toString()+
                 "_"+
                 this.getMfInmediata();
	   
	   if (!f.renameTo(new File(lsNbFile))) {
		   System.out.println("No se pudo renombrar el archivo: "+
                              this.getMfDirTrabajo()+
                              File.separator+this.getMfInmediata());
		   return;
	   }
	   
	   try {
	   
		   br=new BufferedReader(new FileReader(new File(lsNbFile)));
		   
		   while ((ls_linea=br.readLine())!=null){
			   arrPet=ls_linea.split("\\|");
			   for (int i=0;i<arrPet.length;i++){
				   liEncontradas++;
				   arrPeticiones.add(arrPet[i]);
			   }				   
		   }
		   
		   if (liEncontradas>0)
		      System.out.println("Peticiones inmediatas encontradas: "+
                                  liEncontradas+
                                  " peticiones en el archivo "+
                                  lsNbFile);   
	   } catch(Exception e){
		   System.out.println(e.getMessage());
	   }
	   
	   
	}
	
	private void PausandoAplicacion() {
		System.out.println("Tarea 002 Pausand 5 minutos el aplicativo");
		//La cláse Thread pide que se cache la excepción
		try {
			Thread.sleep(5*60*1000);
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("Tarea 002 terminada con éxito");
	}
	
	private Boolean EjecutaPeticiones(){
		boolean lbEncontrada;
		for (int i=0;i<arrPeticiones.size();i++) {
			lbEncontrada=false;
			if ("001".equals(arrPeticiones.get(i))) {
			   ImprimeAmbiente();
			   lbEncontrada=true;
			}
			if ("002".equals(arrPeticiones.get(i))) {
				PausandoAplicacion();
				lbEncontrada=true;
			}
			if ("003".equals(arrPeticiones.get(i))) {
				System.out.println("Tarea 003 Finalizar Scheduler");
				return false;
			}		
			
			if (!lbEncontrada) {
				System.out.println("Tarea "+arrPeticiones.get(i)+" no encontrada");
			}
			
		}
			
			
			
		return true;
	}
	
	private void ImprimeAmbiente(){
		FileWriter fw;
		
		System.out.println("Tarea 001, generando archivo con variables de ambiente");
		try {
		   fw= new FileWriter(this.getMfDirTrabajo()+File.separator+this.getmFAmbiente());
		
		
		   Map<String, String> env = System.getenv();
		   for (String envName : env.keySet()) {
			   fw.write(envName);
			   fw.write("=");
			   fw.write(env.get(envName));
			   fw.write("\r\n");
        	}
        	fw.write("Directorio Trabajo: "+this.getMfDirTrabajo());
        	fw.write("\r\n");
        	fw.close();
		} catch (Exception e) {
			System.out.println(e.getStackTrace());
		}
		System.out.println("Tarea 001 completada con éxito");
	}
	
	/*
	 * Se declara el método ejecuta con acceso publico  
	 * que no regresa ningún valor pero que a partir de este
	 * se empieza a ejecutar el programa de la clase p001_inicio
	 */
	public void ejecuta(){
		//Uso de Calendar para hacer un planificador
		//Cada Calendar debe crear su propia instancia, si se igualan
		// son los mismos objetos
		Calendar lfh_actual=Calendar.getInstance();
		Calendar lfh_tope=Calendar.getInstance();
		Calendar lfh_r1=Calendar.getInstance();
		Calendar lfh_r2=Calendar.getInstance();
		boolean lbEjecuta=true;
		
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy HH:mm");
		lfh_actual.setTimeZone(TimeZone.getTimeZone("America/Mexico_City"));
		lfh_tope.setTimeZone(TimeZone.getTimeZone("America/Mexico_City"));
		sdf.setTimeZone(TimeZone.getTimeZone("America/Mexico_City"));
		
		//Se igual la fecha tope a la actual
		lfh_tope.setTime(lfh_actual.getTime());		
		
	    if (this.getMfDirTrabajo().equals("")) this.setMfDirTrabajo(Paths.get("").toAbsolutePath().toString());
		
		System.out.println("Iniciando proceso: "+lfh_actual.getTime());		
		while (lbEjecuta){
			
			/*
			 *Con el método before de la clase Calendar vemos si
			 *la fecha tope es menor que la actual y como la fecha actual
			 *no puede rebasar a la fecha tope pues las igualamos 
			 */			
			if (lfh_tope.before(lfh_actual)) 
				lfh_tope.setTime(lfh_actual.getTime());
			
			/*
			 * Si la fecha tope es igual a la actual vemos si hay
			 * actividades planeadas para ese lapso 
			 */			
			if (lfh_actual.equals(lfh_tope)) {
			   lfh_tope.add(Calendar.MINUTE, 1);
			   lfh_r1.setTime(lfh_actual.getTime());
			   lfh_r2.setTime(lfh_tope.getTime());
			   lfh_r2.add(Calendar.MINUTE, -1);
			   System.out.println("Buscando peticiones del día: "+
                                  sdf.format(lfh_r1.getTime())+
                                  " al día: "+
                                  sdf.format(lfh_r2.getTime())
                                  );
			   System.out.println("Directorio de trabajo: "+this.getMfDirTrabajo());			   
			   arrPeticiones.clear();
			   PeticionesInmediatas(lfh_actual);
			   PeticionesProgramadas(
                     Long.valueOf((new SimpleDateFormat("yyyyMMddHHmm")).format(lfh_r1.getTime())), 
                     Long.valueOf((new SimpleDateFormat("yyyyMMddHHmm")).format(lfh_r2.getTime())));
			   lbEjecuta=EjecutaPeticiones();
			}
			/*
			 * Actualizamos la fecha actual a una nueva instancia de la
			 * clase Date
			 */
			lfh_actual.setTime(new Date());
		} //while
		System.out.println("Fin del programa: "+sdf.format(lfh_actual.getTime()));
	}
	
	public static void main(String args[]){
		/*
		 * Se declara la variable local luo que es de tipo igual a
		 * la clase p001_inicio y se instancia para poder utlizarla
		 * con new p001_inicio();
		 * 
		 * La palabra reservada new es para instanciar las clases
		 * luego le mandamos los nombres de los archivos de nuestro}
		 * scheduler.
		 * 
		 * Ya instanciada llamamos al método público ejecuta()
		 */
		p001_Scheduler luo=new p001_Scheduler();
		//En este archivo se almacena un reporte del ambiente
		luo.setmFAmbiente("Ambiente.txt");
		//En este archivo se almcenan peticiones a ejecutar de inmediato
		luo.setMfInmediata("Ejecuta.txt");
		//En este archivo se almacenan peticiones a ejecutar a cierta hora
		luo.setmFProgramada("Scheduler.txt");
		//Se manda a ejecutar nuestra clase
		luo.ejecuta();

	}

}