devdaily home | career | drupal | java | mac | mysql | perl | php | uml | unix

Friki example source code file (FileRepository.java)

This example Friki source code file (FileRepository.java) 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.

Java - Friki tags/keywords

date, file, file, filenamefilter, filerepository, io, iterator, list, map, page, page, string, string, text, tract, tract, util

The Friki FileRepository.java 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();
			}
		}
	}
}

Other Friki examples (source code examples)

Here is a short list of links related to this Friki FileRepository.java source code file:

new blog posts

 

Other websites by Alvin Alexander:  
Life/living in Alaska (OneMansAlaska.com)
How I Sold My Business (HowISoldMyBusiness.com)

Copyright 1998-2011 Alvin Alexander, devdaily.com
All Rights Reserved.