TimeAttrEntryTools.java

package eu.javaexperience.generic;

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import eu.javaexperience.file.AbstractFile;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.interfaces.simple.getBy.GetBy2;
import eu.javaexperience.io.IOTools;
import eu.javaexperience.reflect.Mirror;

public class TimeAttrEntryTools
{
	public static TimeAttrEntry[] emptyTimeAttrEntryArray = new TimeAttrEntry[0];

	public static <R> TimeAttrEntry<R> fromFileWithExaminer(final AbstractFile f, final GetBy1<R, AbstractFile> examiner)
	{
		return new TimeAttrEntry<R>()
		{
			@Override
			public R getSubject()
			{
				return examiner.getBy(f);
			}
			
			@Override
			public long getLastModifiedTime()
			{
				return f.lastModified();
			}

			@Override
			public Object getOrigin()
			{
				return f;
			}
		};
	}

	
	public static <R> TimeAttrEntry<R> fromFileWithExaminer(final File f, final GetBy1<R, File> examiner)
	{
		return new TimeAttrEntry<R>()
		{
			@Override
			public R getSubject()
			{
				return examiner.getBy(f);
			}
			
			@Override
			public long getLastModifiedTime()
			{
				return f.lastModified();
			}

			@Override
			public Object getOrigin()
			{
				return f;
			}
		};
	}
	
	public static TimeAttrEntry<File> fromFile(final File file)
	{
		return new TimeAttrEntry<File>()
		{
			@Override
			public File getSubject()
			{
				return file;
			}
			
			@Override
			public long getLastModifiedTime()
			{
				return file.lastModified();
			}
			
			@Override
			public Object getOrigin()
			{
				return file;
			}
		};
	}

	public static TimeAttrEntry<byte[]> constant(final byte[] data, final int time)
	{
		return new TimeAttrEntry<byte[]>()
		{
			@Override
			public long getLastModifiedTime()
			{
				return time;
			}

			@Override
			public byte[] getSubject()
			{
				return data;
			}

			@Override
			public Object getOrigin()
			{
				return data;
			}
		};
	}

	public static long getLastModification(TimeAttrEntry<?>... entries)
	{
		long ret = 0;
		
		for(TimeAttrEntry<?> ent:entries)
		{
			long t = ent.getLastModifiedTime();
			if(t > ret)
			{
				ret = t;
			}
		}
		
		return ret;
	}
	
	public static long getLastModification(Collection<? extends TimeAttrEntry<?>> entries)
	{
		long ret = 0;
		
		for(TimeAttrEntry<?> ent:entries)
		{
			long t = ent.getLastModifiedTime();
			if(t > ret)
			{
				ret = t;
			}
		}
		
		return ret;
	}

	public static <P> TimeAttrEntry<byte[]> multiEntryBinaryGenerator
	(
		final File dst,
		final GetBy2<byte[], File, TimeAttrEntry<P>[]> processor,
		final TimeAttrEntry<P>... entries
	)
	{
		return new TimeAttrEntry<byte[]>()
		{
			protected long calcLastMod()
			{
				return TimeAttrEntryTools.getLastModification(entries);
			}
			
			@Override
			public byte[] getSubject()
			{
				long t = calcLastMod();
				if(dst.lastModified() < t)
				{
					try
					{
						byte[] data = processor.getBy(dst, entries);
						IOTools.putFileContent(dst.toString(), data);
						dst.setLastModified(t);
						return data;
					}
					catch(Exception e)
					{
						Mirror.propagateAnyway(e);
					}
				}
				
				try
				{
					return IOTools.loadFileContent(dst.toString());
				}
				catch (IOException e)
				{
					Mirror.propagateAnyway(e);
					return null;
				}
			}
			
			@Override
			public Object getOrigin()
			{
				return entries;
			}
			
			@Override
			public long getLastModifiedTime()
			{
				if(calcLastMod() > dst.lastModified())
				{
					getSubject();
				}
				
				return calcLastMod();
			}
		};
	}
}