I'm eager to use this!
Some comments:
- <tt>code</tt> is used in some places rather than {@code }
- The initial <ul> would perhaps be better as a <dl>. I don't know if
definition lists are allowed in javadoc.
- public OutputStream wrap(OutputStream os) closing the underlying output
stream precludes many potential uses. FilterOutputStreams do not consistently
close the underlying stream.
- spelling error "methold"
- InputStream wrap() it might be nice if the return stream EOF when the padding
character(s) are consumed but not close() or otherwise alter the source
InputStream
- private static byte[] getBytes(ByteBuffer bb) should document, even though
it's a private method, that the bytes returned should be not considered mutable
since they might be shared.
- the "if (ret != dst.length) // TBD: not necessary" is worrisome as it will
generate garbage.
- I'm still wishing String encode(byte[] buf) didn't use an intermediate byte
array. :-)
- "stream after use, in which" -> "stream after use, during which"
On Oct 23 2012, at 19:56 , Xueming Shen wrote:
> Hi Alan,
>
> Thanks for the review. I hope I addressed most of the comments in the
> updated webrev at
>
> http://cr.openjdk.java.net/~sherman/4235519/webrev
>
> mainly
>
> (1) Pulled the base64 "terms" up to the class doc and then be referenced from
> various methods
> (2) Gave up the C style de/encode(byte[], null), just leave the invoker to
> have enough space. I
> remember Paul once suggested to have a convenient method to return the
> estimated length
> of the byte[] needed to en/decode a specified input byte array/buffer. I
> think we can do it
> later when it is really desired. I agreed your argument that if people
> need to get the size and
> prepare a "new" array, they bet off just call de/encode(byte[])
> (3) Gave up the "liberal" decoding design, tight the spec/impl to treat the
> input as "illegal base64"
> if the padding character appears in the middle of input.
> (4) Some clarification of spec for thread safe, null exception and the
> pos/limit of input/output byte
> buffer as suggested.
> (5) Fixed the typos
>
> I still don't have a better name for method "getUrlEn/Decoder()",
> Base64.getBase64UrlEn/Decoder()
> does not feel good for me.
>
> -Sherman
>
>
> On 10/23/12 6:04 AM, Alan Bateman wrote:
>> On 18/10/2012 03:10, Xueming Shen wrote:
>>> :
>>>
>>> webrev:
>>> http://cr.openjdk.java.net/~sherman/4235519/webrev
>> I took another pass over this, focusing on the API as that is what we have
>> to get right. Performance is important too but I think the priority has to
>> be the API first.
>>
>> Overall I think it is quite nice and easy to use.
>>
>> I wonder if the Base64 class description should try to establish the terms
>> "base64" and "base64url" so that they can be referenced from the various
>> methods? That would avoid needing to duplicate references to the RFC 4668
>> and RFC 2045 in so many places.
>>
>> I think it would also be useful if the specification indicated whether
>> Encoders and Decoders are safe for use by concurrent threads. Also make it
>> clear that NPE is thrown if any of the parameters are passed as null (unless
>> otherwise specified of course).
>>
>> I'm not sure that getUrlEncoder is the most suitable name to get a base64url
>> encoder. The reason is that the method name makes it sound like it returns a
>> URLEncoder or or at least an encoder for HTML forms. While more verbose,
>> getBase64UrlEncoder is clear that it returns a base64url encoder.
>>
>> Do you think getEncoder(int,byte[]) will be used much? If not then perhaps
>> it should be left out for the first version (I guess part of this is getting
>> used to providing the line separate as a byte array).
>>
>> For the javadoc then Encoder and Decoder will need @since 1.8. They should
>> probably cross reference each other too.
>>
>> encode(byte[]) should be clearer that it encodes all bytes in the given
>> array. Also I think it needs to be clear that the returned byte array is
>> appropriately sized -- as currently worded it doesn't make it clear that
>> they can't be extra elements at the end (odd as it might be).
>>
>> Typo at line 215, "byter array" -> "byte array"
>>
>> Typo at line 246, "methold" -> "method".
>>
>> Typo at line 247, "arry" -> "array"
>>
>> Type at line 254, "encocde" -> "encode"
>>
>> Typo at line 277, "buffter" -> "buffer". Another one at line 702.
>>
>> Minor comment, but I assume you should move the
>> @SuppressWarnings("deprecation") on encodeToString to after the method
>> comment rather than before. I see the same thing in decode(String).
>>
>> I think encode(ByteBuffer) needs to be clear as to the
>> position/limit/capacity of the returned buffer.
>>
>> I'm not sure so about encode(ba, null) returning the required length, it
>> feels odd and a bit like some of the win32 APIs. If the intention is that
>> the caller allocates the byte[] and then calls encode again then it would be
>> easier to just encode(ba).
>>
>> For the decoder methods then IllegalArgumentException may be thrown
>> mid-flight, meaning that some bytes may have been written into output buffer
>> or array even though an exception is thrown. I think this needs to be made
>> clear in the spec. It also makes me wonder if this is the right exception,
>> it feels like a more specialized malformed input exception.
>>
>> Another point about the decode methods is that they stop at the padding
>> bytes and so this allows for bytes after the padding. I'm curious about this
>> choice and whether you considered this as an error? I see how this
>> influences decode(ByteBuffer,ByteBuffer) to return a boolean and I just
>> wonder if there are other choices to consider.
>>
>> That's mostly it for now. I didn't check in the IDE but there are lot of
>> imports that are don't appear to be used, perhaps left over from previous
>> iterations?
>>
>> -Alan
>