alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | 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:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.