Mark,

On 11/28/14 12:06 PM, Mark Thomas wrote:
> On 28/11/2014 15:44, Rémy Maucherat wrote:
>> 2014-11-28 16:20 GMT+01:00 Martin Grigorov <mgrigo...@apache.org>:I'm not
>> sure I follow you.
>>
>>> Assuming 'headers' is an instance of CaseInsensitiveKeyMap then:
>>> - headers.get("BLAH") will delegate to innerMap.get(key{"blah"})   //
>>> Perl-ish syntax to express what I mean
>>> - headers.get("bLAh") will also delegate to innerMap.get(key{"blah"})
>>>
>>> so everything should be OK
> 
> Part of the problem here is that this class is trying to meet a
> currently undocumented specification. The WebSocket's TCK appears to be
> testing (I say appears as I don't have access to it - I am just trying
> to fix the associated issue) a requirement that is not documented in the
> WebSocket spec.
> 
> Until the actual requirement is documented I simply don't know what
> requirement this implementation has to meet.
> 
> The current implementation aims to be case insensitive while conserving
> (as far as is possible) the original case of the key. Whether this is
> overkill is TBD.

Maintaining the original case only really apples for the toString() and
keySet() methods (and friends). It's nice to have and doesn't cost much
to maintain.

Another strategy is to keep a map of toLowerCase(key) -> originalKey
which can be used for those methods.

>> I am talking about the impl as is in websockets right now, the case
>> insensitivity is not done right. Besides that, it is possible this new impl
>> could be optimized (or not).
> 
> I am almost certain that there will be scope for optimisation. I was
> aiming for minimal, clear code rather than performance. I doubt - given
> the way that this class will be used - that performance will be an issue
> but we can always come back to it if it is.
> 
> I suspect that much more optimisation will be possible once we know what
> the real requirement is.

I have implemented a CaseInsensitiveKeyMap in the past and was able to
do it by extending AbstractMap and implementing only these methods:

- clear
- clone
- containsKey
- containsValue
- entrySet
- get
- isEmpty
- keySet
- put
- readObject (for java.io.Serializable; I implement an original-case key
cache)
- remove
- size
- values

I wasn't optimizing mine for speed, so I'm not sure if Mark's additional
method implementations improve speed or just increase code. I suspect
that many of the inner classes are not necessary (other than Key, of
course).

-chris

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to