All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.daioware.processManagement.Process Maven / Gradle / Ivy

package com.daioware.processManagement;

import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Collections;

import com.daioware.dateUtilities.TimeInterval;
import com.daioware.log.ProcessLogger;
import com.daioware.math.Number;
import com.daioware.stream.Printer;

public class Process extends Thread{
	public static final int FORMAT_MILLIS=0;
	public static final int FORMAT_SECONDS=1;

	public static final int FORMAT_MINUTES=2;
	public static final int FORMAT_HOURS=3;
	public static final int FORMAT_DAYS=4;
	public static final DateTimeFormatter defaultFormat
			=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");

	public static final ProcessLogger emptyLogger=new ProcessLogger() {		
		@Override
		public void storeTimeIntervals(Instant startDate, Instant finishDate) {				
		}

		@Override
		public Iterable getTimeIntervalIterator() {
			return Collections.emptyList();
		}

		@Override
		public long getRunningTimes() {
			return 0;
		}
		@Override
		public void emptyLog() {			
		}
	};
	public static final Printer emptyPrinter=new Printer() {		
		@Override
		public void print(Object o) {			
		}
	};

	private Instant startedDate;
	private Instant terminatedDate;
	private Runnable procedure;
	private Printer printer;
	private long sleepingMilis;
	private int formatSleepingDuration=FORMAT_SECONDS;
	private boolean active;
	private boolean sleepBetweenRuns=true;
	private boolean enabled=true;
	private DateTimeFormatter simpleDateFormat=defaultFormat;
	private ProcessLogger threadLogger;
	private int execTimes;
	
	public Process(Runnable procedure) {
		this(procedure,"Unknown thread");
	}
	public Process(Runnable procedure,String name) {
		this(procedure,System.out::print,name,2000);
	}
	public Process(Runnable procedure, Printer printer,String name,long sleepingMillis) {
		setRunnable(procedure);
		setPrinter(printer);
		setName(name);
		setSleepingMillis(sleepingMillis);
		setActive(true);
		setThreadLogger(null);
	}
	public Process shallowCopy() {
		synchronized (this) {
			Process process=new Process(getProcedure());
			return copy(this,process);
		}		
	}
	
	public Runnable getProcedure() {
		return procedure;
	}
	
	public void setProcedure(Runnable procedure) {
		this.procedure = procedure;
	}
	public static Process copy(Process source,Process dest) {
		dest.setName(source.getName()+"_copy");
		dest.setFormatSleepingDuration(source.getFormatSleepingDuration());
		dest.setStartedDate(source.getStartedDate());
		dest.setTerminatedDate(source.getTerminatedDate());
		dest.setProcedure(source.getProcedure());
		dest.setPrinter(source.getPrinter());
		dest.setSleepingMillis(source.getSleepingMillis());
		dest.setFormatSleepingDuration(source.getFormatSleepingDuration());
		dest.setActive(source.isActive());
		dest.setSleepBetweenRuns(source.isSleepBetweenRuns());
		dest.setEnabled(source.isEnabled());
		dest.setSimpleDateFormat(source.getSimpleDateFormat());
		return dest;
	}
	public boolean isEnabled() {
		return enabled;
	}
	public void setEnabled(boolean enabled) {
		this.enabled = enabled;
	}
	public static ProcessLogger getEmptyLogger() {
		return emptyLogger;
	}
	public static Printer getEmptyPrinter() {
		return emptyPrinter;
	}
	public ProcessLogger getThreadLogger() {
		return threadLogger;
	}
	public void setThreadLogger(ProcessLogger t) {
		if(t==null) {
			t=getEmptyLogger();
		}
		threadLogger = t;
	}
	public boolean isSleepBetweenRuns() {
		return sleepBetweenRuns;
	}
	public void setSleepBetweenRuns(boolean sleepBetweenRuns) {
		this.sleepBetweenRuns = sleepBetweenRuns;
	}
	public void println(Object o) {
		printer.println(o);
	}
	public void print(Object o) {
		printer.println(o);
	}
	public long getExecTimes() {
		return execTimes;
	}
	public Instant getTerminatedDate() {
		return terminatedDate;
	}
	protected void setTerminatedDate(Instant terminatedDate) {
		this.terminatedDate = terminatedDate;
	}
	
	public Instant getStartedDate() {
		return startedDate;
	}
	protected void setStartedDate(Instant startedDate) {
		this.startedDate = startedDate;
	}
	public boolean isActive() {
		return active;
	}
	public void setActive(boolean active) {
		this.active = active;
		String threadName=getName();
		println((active)?"Activating thread '"+threadName+"'":"Deactivating thread '"+threadName+"'");
	}
	public void forceSetActive(boolean active) {
		setActive(active);
		interrupt();
	}
	public DateTimeFormatter getSimpleDateFormat() {
		return simpleDateFormat;
	}
	public void setSimpleDateFormat(DateTimeFormatter simpleDateFormat) {
		this.simpleDateFormat = simpleDateFormat;
	}
	public Printer getPrinter() {
		return printer;
	}
	public void setPrinter(Printer p) {
		if(p==null) {
			p=getEmptyPrinter();
		}
		printer = p;
	}
	public Runnable getRunnable() {
		return procedure;
	}
	public void setRunnable(Runnable p) {
		this.procedure = p;
	}
	public Iterable timeIntervalsIterable() {
		return threadLogger.getTimeIntervalIterator();
	}
	public int getFormatSleepingDuration() {
		return formatSleepingDuration;
	}
	public void setFormatSleepingDuration(int formatSleepingDuration) {
		this.formatSleepingDuration = formatSleepingDuration;
	}
	public double getSleepingDuration() {
		switch(getFormatSleepingDuration()) {
			case FORMAT_DAYS:return getSleepingDays();
			case FORMAT_HOURS:return getSleepingHours();
			case FORMAT_SECONDS:return getSleepingSeconds();
			case FORMAT_MINUTES:return getSleepingMinutes();
			case FORMAT_MILLIS:default: return getSleepingMillis();
		}
	}
	public String getSleepingUnit() {
		switch(getFormatSleepingDuration()) {
			case FORMAT_DAYS:return "days";
			case FORMAT_HOURS:return "hours";
			case FORMAT_SECONDS:return "seconds";
			case FORMAT_MINUTES:return "minutes";
			case FORMAT_MILLIS:default: return "miliseconds";
		}
	}
	public String getSleepingSentence() {
		return String.format("%s %s",Number.formatWithoutUnnecessaryZeros(getSleepingDuration()),
				getSleepingUnit());
	}
	public String getFormattedDate(Instant date) {
		return date!=null?getSimpleDateFormat().format(date.atZone(ZoneId.systemDefault())):null;
	}	
	public void pause() {
		setSleepingMillis(0);
	}
	public long getSleepingMillis() {
		return sleepingMilis;
	}
	public double getSleepingSeconds() {
		return ((double)getSleepingMillis())/1000;
	}
	public double getSleepingMinutes() {	
		return getSleepingSeconds()/ 60;
	}
	public double getSleepingHours() {
		return getSleepingMinutes()-60;
	}
	public double getSleepingDays() {
		return getSleepingHours()/24;
	}
	public void setSleepingMillis(long sleepingMillis) {
		this.sleepingMilis = sleepingMillis;
	}
	public void setSleepingSeconds(double value) {
		setSleepingMillis((long) (value*1000));
	}
	public void setSleepingMinutes(double value) {
		setSleepingSeconds(value*60);
	}
	public void setSleepingHours(double value) {
		setSleepingMinutes(value*60);
	}
	public void setSleepingDays(double value) {
		setSleepingHours(value*24);
	}
	public boolean isTimeToRun() {
		return true; 
	}
	public void setRunningFields() {
		
	}
	public void emptyLog() {
		threadLogger.emptyLog();
	}
	@Override
	public int hashCode() {
		return getName().hashCode();
	}
	public boolean equals(Object o) {
		return o instanceof Process?getName().equals(((Process)o).getName()):false;
	}
	public synchronized void run() {
		Instant startDate;
		Instant finishDate;
		boolean isTimeToSleep;
		setStartedDate(Instant.now());
		println("Thread '"+getName()+"' starting life cicle at "+getFormattedDate(getStartedDate())); 
		while(isActive() && isEnabled()) {
			if(isActive() && isTimeToRun()) {
				isTimeToSleep=false;
				startDate=Instant.now();
				println("Thread '"+getName()+"' running at "+getFormattedDate(startDate)); 
				setRunningFields();
				try {
					procedure.run();
				}catch(Exception e) {
					getPrinter().printStackTrace(e);
				}
				finishDate=Instant.now();
				println("Thread '"+getName()+"' finished running "+getFormattedDate(finishDate));
				threadLogger.storeTimeIntervals(startDate, finishDate);
				execTimes++;
			}
			else {
				isTimeToSleep=true;
			}
			if(isActive() && isSleepBetweenRuns() || isTimeToSleep) {
				try {
					println("Thread '"+getName()+"' sleeping for "+getSleepingSentence()); 
					wait(getSleepingMillis());
				} catch (InterruptedException e) {
					println("Thread '"+getName()+"' interrupted while waiting"); 
				}
			}			
		}
		setTerminatedDate(Instant.now());
		println("Thread '"+getName()+"' terminated at "+getFormattedDate(getTerminatedDate())); 
		println("Thread '"+getName()+"' executed "+getExecTimes()+ " times"); 
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy