package net.jhorstmann.i18n.xgettext.web; import java.util.List; import org.apache.el.parser.AstFunction; import org.apache.el.parser.AstString; import org.apache.el.parser.Node; import org.apache.el.parser.NodeVisitor; import javax.el.ELException; import net.jhorstmann.i18n.tools.xgettext.MessageFunction; import org.fedorahosted.tennera.jgettext.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class GettextNodeVisitor implements NodeVisitor, Constants { private static final Logger log = LoggerFactory.getLogger(GettextNodeVisitor.class); private WebMessageExtractor extractor; private List<MessageFunction> functions; public GettextNodeVisitor(WebMessageExtractor extractor) { this.extractor = extractor; this.functions = extractor.getFunctions(); } @Override public void visit(Node node) throws ELException { if (node instanceof AstFunction) { AstFunction fun = (AstFunction) node; String prefix = fun.getPrefix(); String uri = extractor.getNamespaceURI(prefix); String name = fun.getLocalName(); int count = fun.jjtGetNumChildren(); log.debug("Visiting function call to {}:{} ({})", new Object[]{prefix, name, uri}); for (MessageFunction mfn : functions) { log.debug("Trying to match parameters for {} ({})", mfn.getName(), mfn.getNamespace()); if (mfn.getNamespace().equals(uri) && mfn.getName().equals(name) && count >= mfn.getParameterCount()) { int contextIdx = mfn.getContextIndex(); int messageIdx = mfn.getMessageIndex(); int pluralIdx = mfn.getPluralIndex(); String message = null; String context = null; String plural = null; if (messageIdx >= 0 && messageIdx < count) { Node messageNode = fun.jjtGetChild(messageIdx); if (messageNode instanceof AstString) { message = ((AstString)messageNode).getString(); } else { log.warn("Message for {} is not constant", new Object[]{name}); return; } } if (contextIdx >= 0 && contextIdx < count) { Node contextNode = fun.jjtGetChild(contextIdx); if (contextNode instanceof AstString) { context = ((AstString)contextNode).getString(); } else { log.warn("Message context for {} is not constant", new Object[]{name}); return; } } if (pluralIdx >= 0 && pluralIdx < count) { Node pluralNode = fun.jjtGetChild(pluralIdx); if (pluralNode instanceof AstString) { plural = ((AstString)pluralNode).getString(); } else { log.warn("Message context for {} is not constant", new Object[]{name}); return; } } if (message != null) { Message msg = new Message(); msg.setMsgid(message); if (context != null) { msg.setMsgctxt(context); } if (plural != null) { msg.setMsgidPlural(plural); } log.debug("Found message {}", msg); extractor.addMessage(context, message, plural, null); } } } } } }