📄 filerepository.java
字号:
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();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -