Mark, Excuse me for taking so long before a reply. I've been thinking about your recommendations a bit. There are several issues that come to mind regarding NIO and in terms of general API use cases. I'll try to outline these issues below in context.
<snip/> > >>so in StatefulDecoder you have > >> > >>void decode( Object encoded ) throws DecoderException ; > >> > >> > >>What about something like: > >> > >>void decode( EncodedSource source ) throws DecoderException ; > >> > >> > >>then you can have > >> > >>ByteBufferSource implements EncodedSource { ... > >> > >>and > >> > >>ByteArraySource impements EncodedSource { ... > >> > >> > > > >I like this approach. What would the EncodedSource interface look like > >or is it just a marker interface? > > > > > > > I suspect it would probibly look alot like a limited version of > ByteBuffer in that where ever you called methods in ByteBuffer in the > Implementation, then the interface could supply something similar for > byte[] or whatever was the storage/stream underneath. First the EncodedSource idea would work well if we could get it to work with NIO Channels but I don't think that's possible without subclassing ByteBuffer. SocketChannel for example reads into a ByteBuffer using the read() operations that takes either a ByteBuffer argument or a ByteBuffer[] argument: the same situation exists for the opposite direction with write() operations on channels. I can't seem to think of a clean way around this. We could create our own Channel implementation to wrap other Channels. Such a channel would overload the read() and write() methods to accept a EncodedSouce argument. Note that this would get even more complex once Selectors are considered with non-blocking IO. This approach worries me because it seems to incur more complexity for a tiny reward. It leads me to question whether we should even bother being backwards compatible with JDKs before 1.4 which are rapidly approaching their end of life. > >>The Source Implementations are responsible for those aspects that make > >>them NIO or not, then the Decoder itself stays generic and can even be > >>reused across different Source Implementations (Similar to how JAXP can > >>have a DOMSource, StreamSource or SAXSource). > > > >That's most excellent; this is the goal we are all trying to achieve. > >The use of EncodedSource makes the API more explicit in the fact that it > >operates upon some 'encoded' substrate btw. It will give the API a > >better defined symetry when we confront the Encoder interfaces. > > > >If you'll permit me to play devil's advocate, let me ask what difference > >is there in casting a EncodedSource to a > >ByteArraySource/ByteBufferSource from casting an Object to a > >byte[]/ByteBuffer? > > > > > You can control the API and encapsulate that which makes the substrate > unique behind the interface, then your not implementing the Codec for > every type of Substrate out there, just implementing the EncodedSource > "wrapper". > > >In either case the API user will still have to cast > >a general interface to get at a more specific implementation. > > > > > > > The point is that in the Codec you just use the methods available in > EncodedSource, no casting to a specific implementation. I can't see how this would be possible with ByteBuffer to get them to work with Channels which is the whole point to their existance IMO. However perhaps you might find a way to do this which I'm not seeing at the moment. Do you mind taking a look at the NIO APIs to see if there is some way? What I would like to do right now is start carving out the encode half of these APIs as they are right now. Then I will implement a simple encoder/decoder pair just to look at the use cases for both NIO users and traditional IO users. Then I would like to take a step back to see how we can inject these ideas into the API. I'll probably choose a really simple codec like Hex to binary transformations for the example. You're welcome to join in the pursuit if you like: I have the code up on the directory project's snickers project for now. This way we can have a real example to work with and see how different patterns change the way the API is used. WDYT? Alex --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]