While I am also a newbie to the avalon world I have implemented a message router before so I am familiar with some of
the issues you will run into. Anyway, one thing you may want to check out for parsing xml in an efficient manner is.
stax http://www.xml.com/pub/a/2003/09/17/stax.html
Hope this is helpful.
On Nov 7, 2003, at 2:24 PM, Jonathan Hawkes wrote:
Hi all,
I'm fairly new to this Component Oriented Programming stuff, and I tend to overuse design principles when I first become aware of them.
I am taking on the task of building a messaging server using the java.nio.* non-blocking API and XML as the underlying communications protocol. I thought that it would be cool to use SAX since it is an event-driven interface. However, although SAX is an event driven API, XMLReader and InputSource define only synchronous operations. This is unfortunate because it means that I will have to use a pool of multiple threads for my SAX parsing (unless I build my own parser implementation). I would like to hide this implementation detail, however, behind a component interface.
This is where I get back to my relevant question. Although I am familiar with interface/implementation programming practices, I am unfamiliar with "best-practice" approaches for defining COP component interfaces. I have included my attempt below. Please comment.
import java.nio.channels.Pipe;
import org.apache.excalibur.xml.sax.XMLConsumer;
public interface AsynchXMLProcessor {
String ROLE = AsynchXMLProcessor.class.getName();
Pipe.Sink getByteSink();
void setSourceConsumer(XMLConsumer consumer); void setSourceErrorHandler(XMLErrorHandler errorHandler); }
public interface XMLErrorHandler extends org.xml.sax.ErrorHandler {
public void fatality(Throwable t); }
One criticism I have for the AsynchXMLProcessor is that is not thread-safe and it does not pool well. I would probably need a factory interface instead of looking up the processor directly from the ServiceManager. Another thought is that I could change the interface as below. However, this seems less flexible to me in terms of adding future features (eg. a DTDHandler).
public interface AsynchXMLProcessor {
String ROLE = AsynchXMLProcessor.class.getName();
Pipe.Sink getByteSink(XMLConsumer consumer, XMLErrorHandler errorHandler);
}
Thanks all! Jonathan Hawkes
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
