package com.nabalive.server.jabber.handler; import com.nabalive.server.jabber.Status; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.StringReader; /** * Created by IntelliJ IDEA. * User: Julien Cheype * Date: 11/16/11 */ public abstract class JabberBaseHandler { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final ThreadLocal<DocumentBuilder> builderLocal = new ThreadLocal<DocumentBuilder>() { @Override protected DocumentBuilder initialValue() { try { final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(false); documentBuilderFactory.setValidating(false); documentBuilderFactory.setFeature("http://xml.org/sax/features/namespaces", false); documentBuilderFactory.setFeature("http://xml.org/sax/features/validation", false); documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); return documentBuilderFactory .newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); return null; } } }; final public void onMessage(ChannelHandlerContext ctx, MessageEvent e, Status status, String message) throws IOException, SAXException { Document document = builderLocal.get().parse(new InputSource(new StringReader(message))); builderLocal.get().reset(); onMessage(ctx, e, status, message, document); } public void write(Channel channel, String data) { logger.debug(">>>>>>>>>> " + data); channel.write(ChannelBuffers.copiedBuffer(data.getBytes(CharsetUtil.UTF_8))); } protected abstract void onMessage(ChannelHandlerContext ctx, MessageEvent e, Status status, String message, Document document); }