package org.genedb.web.tags.db; import org.genedb.web.mvc.controller.DbXRefListener; import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class HyperlinkDbsInText extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { // different class for internal, external URL JspFragment body = getJspBody(); PageContext pageContext = (PageContext) getJspContext(); JspWriter out = pageContext.getOut(); StringWriter stringWriter = new StringWriter(); body.invoke(stringWriter); String text = stringWriter.getBuffer().toString(); out.write(hyperLinkText(text)); } public String hyperLinkText(String text) throws IOException { Pattern xref = Pattern.compile("\\(\\w+:\\w+\\)"); Matcher matcher = xref.matcher(text); StringBuffer sb = new StringBuffer(); while (matcher.find()) { String dbxref = matcher.group().substring(1, matcher.group().length()-1); //System.err.println(dbxref); String[] parts = dbxref.split(":"); if (parts.length > 1) { // db name should be in parts[0], the accession in parts[1] if (parts[0].equalsIgnoreCase("PUBMED")) { parts[0] = "PMID"; dbxref = parts[0] + ":" + parts[1]; // So PMID gets displayed as well as linked } Map<String, String> dbUrlMap = (Map<String, String>) getJspContext().getAttribute(DbXRefListener.DB_URL_MAP, PageContext.APPLICATION_SCOPE); //Map<String, String> dbUrlMap = new HashMap<String, String>(); //dbUrlMap.put("PMID", "wibble"); if (dbUrlMap.containsKey(parts[0])) { String url = dbUrlMap.get(parts[0]) + parts[1]; String replace = "(<a href=\""+url+"\">"+dbxref+"</a>)"; matcher.appendReplacement(sb, replace); //matcher.appendTail(sb); //} else { //matcher.appendReplacement(sb, dbxref); } } } matcher.appendTail(sb); return sb.toString(); } public static void main(String[] args) throws IOException { String a = "This is a comment (PMID:1234) and more (PMID:3456) but this isn't (FRED:56875)"; HyperlinkDbsInText t = new HyperlinkDbsInText(); System.err.println(t.hyperLinkText(a)); } }