package net.zuckerfrei.jcfd; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.oro.text.regex.MalformedPatternException; import org.apache.oro.text.regex.MatchResult; import org.apache.oro.text.regex.Pattern; import org.apache.oro.text.regex.PatternCompiler; import org.apache.oro.text.regex.PatternMatcher; import org.apache.oro.text.regex.PatternMatcherInput; import org.apache.oro.text.regex.Perl5Compiler; import org.apache.oro.text.regex.Perl5Matcher; /** * Abstract <code>Definition</code> implementing the most common * functionalities. * * @author Davor Cengija * @version $Revision: 1.1.1.1 $ */ public abstract class AbstractDefinition implements Definition { //~ Static variables/initializers ========================================= /** Logger. */ static Log log = LogFactory.getLog(AbstractDefinition.class); /** * DOCUMENT ME! */ protected static String linkRegexp = "{[\\w\\s-]+}"; /** * DOCUMENT ME! */ static final PatternCompiler regexpCompiler = new Perl5Compiler(); /** * DOCUMENT ME! */ // TODO // Each instance has its own matcher. Can we have static matchers? PatternMatcher matcher = new Perl5Matcher(); static Pattern pattern; static { try { pattern = regexpCompiler.compile(linkRegexp); } catch (MalformedPatternException mpe) { throw new RuntimeException(mpe.getMessage()); } } //~ Instance variables ==================================================== /** Defined word. */ private String word; /** The database thw word is found in. */ private Database database; /** The content returned from the server. */ private Object content; /** * DOCUMENT ME! */ List links = new ArrayList(); //~ Constructors ========================================================== /** * Consturctor. * * @param word DOCUMENT ME! * @param database DOCUMENT ME! * @param content DOCUMENT ME! */ public AbstractDefinition(String word, Database database, Object content) { this.word = word; this.database = database; this.content = content; } //~ Methods =============================================================== /** * @see net.zuckerfrei.jcfd.Definition#getContent() */ public Object getContent() { return content; } /** * @see net.zuckerfrei.jcfd.Definition#getDatabase() */ public Database getDatabase() { return database; } /** * @see net.zuckerfrei.jcfd.Definition#getLinks() */ public String[] getLinks() { discoverLinks(); return (String[]) links.toArray(new String[]{}); } /** * @see net.zuckerfrei.jcfd.Definition#getWord() */ public String getWord() { return word; } /** * DOCUMENT ME! */ protected void discoverLinks() { PatternMatcherInput input = new PatternMatcherInput(content.toString()); String term; while (matcher.contains(input, pattern)) { term = normalizeString(matcher.getMatch().toString()); links.add(StringUtils.stripStart(StringUtils.stripEnd(term, "}"), "{")); } } private String normalizeString(String str) { String[] tmp = StringUtils.split(str); StringBuffer buff = new StringBuffer(); String tmp2; for (int i = 0; i < tmp.length; i++) { tmp2 = tmp[i].trim(); if (tmp2.length() > 0) { buff.append(tmp2).append(" "); } } return buff.toString().trim(); } }