package net.jhorstmann.i18n.xgettext.web;
import net.jhorstmann.i18n.tools.xml.DefaultContentHandler;
import javax.xml.XMLConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class ComponentHandler extends DefaultContentHandler implements Constants {
private Logger log = LoggerFactory.getLogger(ComponentHandler.class);
private final WebMessageExtractor extractor;
private final StringBuilder text;
private String message;
private String context;
private String plural;
private String comment;
public ComponentHandler(WebMessageExtractor extractor, Attributes atts) {
this.extractor = extractor;
this.text = new StringBuilder();
this.message = atts.getValue(XMLConstants.NULL_NS_URI, ATTR_MSGID);
this.context = atts.getValue(XMLConstants.NULL_NS_URI, ATTR_MSGCTX);
this.plural = atts.getValue(XMLConstants.NULL_NS_URI, ATTR_MSGPLURAL);
this.comment = atts.getValue(XMLConstants.NULL_NS_URI, ATTR_MSGCOMMENT);
}
@Override
public void setDocumentLocator(Locator locator) {
extractor.setDocumentLocator(locator);
}
private ContentHandler createFacetHandler(String name, Attributes atts) throws SAXException {
if ("context".equals(name)) {
return new ContextFacetHandler(extractor, this, atts);
} else if ("message".equals(name)) {
return new MessageFacetHandler(extractor, this, atts);
} else if ("plural".equals(name)) {
return new PluralFacetHandler(extractor, this, atts);
} else if ("comment".equals(name)) {
return new CommentFacetHandler(extractor, this, atts);
} else {
log.warn("Unknown facet name '{}' in translation component", name);
return new DummyHandler(extractor);
}
}
@Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
if (NS_JSF_CORE.equals(uri) && "facet".equals(localName)) {
String name = atts.getValue(XMLConstants.NULL_NS_URI, "name");
extractor.pushHandler(createFacetHandler(name, atts));
} else if (NS_JSF_CORE.equals(uri) && "param".equals(localName)) {
extractor.pushHandler(new DummyHandler(extractor));
} else if (NS_I18N_COMPONENT.equals(uri)) {
extractor.pushHandler(createFacetHandler(localName, atts));
} else {
log.warn("Unexpected element '{{}}{}' in translation component", new Object[]{uri, localName});
extractor.pushHandler(new DummyHandler(extractor));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
extractor.popHandler();
String content = text.toString().trim();
String msgid = content != null && content.length() > 0 ? content : message;
extractor.addMessage(context, msgid, plural, comment);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
text.append(ch, start, length);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
public String getPlural() {
return plural;
}
public void setPlural(String plural) {
this.plural = plural;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}