devdaily home | apple | java | perl | unix | directory | blog

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

package com.efsol.friki;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.io.File;
import java.io.FilenameFilter;
import java.io.Writer;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.stringtree.util.tract.FileTractReader;
import org.stringtree.util.tract.FileTractWriter;
import org.stringtree.util.tract.Tract;

public class FileRepository
	extends BasicDriver
	implements FilenameFilter
{
	private static final DateFormat suffixFormat = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss");
	
	private String backupDirName;
	private File dir;
	private File backup;
	private boolean backupChanges;
	
	private Map cache = new HashMap();

	public FileRepository(Policy policy)
	{
		this.dir = policy.getFile("repository-location");
		System.out.println("Friki: Created File Page Repository at '" + dir + "'");
		this.backupChanges = policy.getBoolean("backupChanges");
		this.backupDirName = policy.get("backupDir");
		
    	if (backupChanges && backupDirName != null)
    	{
			backup = new File(dir, backupDirName);
			backup.mkdirs();
		}
		
		cache.put("old/EmptyPage", 
			new Page("old/EmptyPage", "There was no page version before this!"));
	}
	
	public String escape(String name)
	{
		return NamePreserver.escape(name);
	}
	
	public String unescape(String name)
	{
		return NamePreserver.unescape(name);
	}

	private File pageFile(String name)
	{
		return new File(dir, escape(name));
	}

	private File backupFile(String name)
	{
		int prefix = backupDirName.length() + 1;
		String filename = name.substring(prefix);
		return new File(backup, escape(filename));
	}
	
	public boolean validName(String name)
	{
		return (name.indexOf('.')==-1 || name.startsWith(backupDirName)) && !backupDirName.equals(name);
	}

	public boolean isReadable(String name)
	{
		return validName(name) && name.indexOf(':')==-1
			&& !name.startsWith("/") && !name.startsWith("\\");
	}

	public boolean isWritable(String name)
	{
		return isReadable(name) && name.indexOf("/")==-1 && name.indexOf("\\") == -1;
	}

	protected void get(File file, Tract ret)
	{
		if (file.canRead())
		{
			try
			{
				FileTractReader.load(ret, file, true);
			}
			catch(IOException ioe)
			{
				ioe.printStackTrace();
			}
		}
	}

	public Tract get(String name)
	{
		if (cache.containsKey(name)) 
		{
			return (Tract)cache.get(name);
		}
			 
		Tract ret = new Page(name); 
		File file = (name.startsWith(backupDirName))
			? backupFile(name)
			: pageFile(name);
		
		get(file, ret);
		
		return ret;
	}

	public void put(File file, Tract page)
	{
		try
		{
			FileTractWriter.store(page, file);
		}
		catch(IOException ioe)
		{
			ioe.printStackTrace();
		}
	}

	public void put(String name, Tract page)
	{
		page.put("page.name", name);
		put(pageFile(name), page);
	}

	public String backup(String name)
	{
		if (backupChanges && backup != null)
		{
			Tract page = get(name);
			String dated =  "." + suffixFormat.format(new Date());
			File file = new File(backup, escape(name) + dated);
			put(file, page);
			name = backupDirName + "/" + name + dated;
		}
		return name;
	}

	public boolean contains(String name)
	{
		return validName(name) && (cache.containsKey(name) || pageFile(name).canRead());
	}

	public boolean accept(File dir, String name)
	{
		return validName(name);
	}

	public Iterator allPageNames() 
	{
		List names = Arrays.asList(dir.list(this));
		List converted = new ArrayList(names.size());

		Iterator allFiles = names.iterator();
		while (allFiles.hasNext())
		{
			converted.add(unescape((String)allFiles.next()));
		} 
		
		Collections.sort(converted);
		return converted.iterator();
	}

	public void append(String name, String text)
	{
		File page = pageFile(name);
		if (page.canWrite())
		{
			try
			{
				Writer writer = new FileWriter(page.getAbsolutePath(), true);
				writer.write(text);
				writer.flush();
				writer.close();
			}
			catch(IOException ioe)
			{
				ioe.printStackTrace();
			}
		}
	}
}




Copyright 1998-2008 Alvin Alexander
All Rights Reserved.
 
devdaily.com is based in louisville, kentucky, and this web site is hosted by godaddy.com