package marubinotto.piggydb.ui.wiki;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Stack;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import marubinotto.piggydb.model.FragmentRepository;
import marubinotto.piggydb.model.TagRepository;
import marubinotto.piggydb.model.auth.User;
import marubinotto.piggydb.ui.page.common.WebResourcePaths;
import marubinotto.util.Assert;
public abstract class WikiParser {
private static Log logger = LogFactory.getLog(WikiParser.class);
private FragmentRepository fragmentRepository;
private TagRepository tagRepository;
public WikiParser() {
}
public void setFragmentRepository(FragmentRepository fragmentRepository) {
this.fragmentRepository = fragmentRepository;
}
public void setTagRepository(TagRepository tagRepository) {
this.tagRepository = tagRepository;
}
public String parse(
String wikiText,
Long targetFragment,
User user,
WebResourcePaths webResources)
throws Exception {
Stack<Long> fragmentStack = new Stack<Long>();
if (targetFragment != null) {
fragmentStack.push(targetFragment);
}
return parseNestedly(wikiText, fragmentStack, user, webResources);
}
public String parseNestedly(
String wikiText,
Stack<Long> fragmentStack,
User user,
WebResourcePaths webResources)
throws Exception {
StringWriter output = new StringWriter();
invokeParse(wikiText, output, fragmentStack, user, webResources);
return output.toString();
}
public void parse(
String wikiText,
Writer output,
Long targetFragment,
User user,
WebResourcePaths webResources)
throws Exception {
Stack<Long> fragmentStack = new Stack<Long>();
if (targetFragment != null) {
fragmentStack.push(targetFragment);
}
invokeParse(wikiText, output, fragmentStack, user, webResources);
}
private void invokeParse(
String wikiText,
Writer output,
Stack<Long> fragmentStack,
User user,
WebResourcePaths webResources)
throws Exception {
Assert.Arg.notNull(output, "output");
Assert.Arg.notNull(fragmentStack, "fragmentStack");
Assert.Arg.notNull(webResources, "webResources");
if (wikiText == null) return;
if (logger.isDebugEnabled()) logger.debug("invokeParse by: " + user + " " + fragmentStack);
ParseContext context = createContext(output, fragmentStack, user, webResources);
doParse(wikiText, context);
}
protected abstract void doParse(String wikiText, ParseContext context)
throws Exception;
protected ParseContext createContext(
Writer output,
Stack<Long> fragmentStack,
User user,
WebResourcePaths webResources) {
Assert.Property.requireNotNull(fragmentRepository, "fragmentRepository");
Assert.Property.requireNotNull(tagRepository, "tagRepository");
return new ParseContext(
output,
this,
fragmentStack,
user,
webResources,
this.fragmentRepository,
this.tagRepository);
}
public String parsePreformattedText(
String preformattedText,
User user,
WebResourcePaths webResources)
throws Exception {
StringWriter output = new StringWriter();
if (preformattedText != null) {
ParseContext context = createContext(output, null, user, webResources);
doParsePreformattedText(preformattedText, context);
}
return output.toString();
}
protected abstract void doParsePreformattedText(String preformattedText, ParseContext context)
throws Exception;
}