418625 - WebSocket / Jsr RemoteEndpoint.sendObject(java.nio.HeapByteBuffer) doesn't find encoder
+ Adding fallback lookup using isAssignable(type) if basic map based lookup fails first. Remembers successful isAssignable(type) match for future lookups via basic map approach.
This commit is contained in:
parent
1620b34a6e
commit
8d5013e15f
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.websocket.jsr356.metadata;
|
package org.eclipse.jetty.websocket.jsr356.metadata;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -144,12 +145,37 @@ public abstract class CoderMetadataSet<T, M extends CoderMetadata<T>> implements
|
||||||
{
|
{
|
||||||
Integer idx = typeMap.get(type);
|
Integer idx = typeMap.get(type);
|
||||||
if (idx == null)
|
if (idx == null)
|
||||||
|
{
|
||||||
|
// Quick lookup failed, try slower lookup via isAssignable instead
|
||||||
|
idx = getMetadataByAssignableType(type);
|
||||||
|
if (idx != null)
|
||||||
|
{
|
||||||
|
// add new entry map
|
||||||
|
typeMap.put(type,idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If idx is STILL null, we've got no match
|
||||||
|
if (idx == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return metadatas.get(idx);
|
return metadatas.get(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Integer getMetadataByAssignableType(Class<?> type)
|
||||||
|
{
|
||||||
|
for (Map.Entry<Class<?>, Integer> entry : typeMap.entrySet())
|
||||||
|
{
|
||||||
|
if (entry.getKey().isAssignableFrom(type))
|
||||||
|
{
|
||||||
|
return entry.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<M> iterator()
|
public Iterator<M> iterator()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue