package fitnesse.wikitext.widgets; import fitnesse.html.HtmlUtil; import fitnesse.wikitext.parser.*; import util.Maybe; import java.io.File; import java.util.Collection; import java.util.List; /** * FitNesse SymbolType implementation which enables Maven classpath integration for FitNesse. */ public class MavenClasspathSymbolType extends SymbolType implements Rule, Translation, PathsProvider { private MavenClasspathExtractor mavenClasspathExtractor; public MavenClasspathSymbolType() { super("MavenClasspathSymbolType"); this.mavenClasspathExtractor = new MavenClasspathExtractor(); wikiMatcher(new Matcher().startLineOrCell().string("!pomFile")); wikiRule(this); htmlTranslation(this); } @Override public String toTarget(Translator translator, Symbol symbol) { List<String> classpathElements = getClasspathElements(symbol); String classpathForRender = ""; for (String element : classpathElements) { classpathForRender += HtmlUtil.metaText("classpath: " + element) + HtmlUtil.BRtag; } return classpathForRender; } private List<String> getClasspathElements(Symbol symbol) { String pomFile = symbol.childAt(0).getContent(); String scope = MavenClasspathExtractor.DEFAULT_SCOPE; if (pomFile.contains("@")) { String[] s = pomFile.split("@"); pomFile = s[0]; scope = s[1]; } return mavenClasspathExtractor.extractClasspathEntries(new File(pomFile), scope); } @Override public Maybe<Symbol> parse(Symbol symbol, Parser parser) { Symbol next = parser.moveNext(1); if (!next.isType(SymbolType.Whitespace)) return Symbol.nothing; symbol.add(parser.moveNext(1).getContent()); return new Maybe<Symbol>(symbol); } @Override public boolean matchesFor(SymbolType symbolType) { return symbolType instanceof Path || super.matchesFor(symbolType); } /** * Exposed for testing */ protected void setMavenClasspathExtractor(MavenClasspathExtractor mavenClasspathExtractor) { this.mavenClasspathExtractor = mavenClasspathExtractor; } @Override public Collection<String> providePaths(Translator translator, Symbol symbol) { return getClasspathElements(symbol); } }