- }\r
- \r
- @Override\r
- public int count(Binding keyBinding, Object from, boolean fromInclusive,\r
- Object end, boolean endInclusive) throws AccessorException {\r
- assert b.isOpen();\r
- readLock();\r
- try {\r
- Object lf = params.adapterScheme.adapt(from, keyBinding, kb);\r
- Object le = params.adapterScheme.adapt(end, keyBinding, kb);\r
- \r
- Entry fromEntry = fromInclusive ? index.ceiling(lf) : index.higher(lf);\r
- Entry endEntry = endInclusive ? index.floor(le) : index.lower(le);\r
- if (endEntry==null || fromEntry == null) return 0;\r
-\r
- if (fromEntry.pos>endEntry.pos) return 0;\r
- if (fromEntry.pos==endEntry.pos) return 1;\r
- \r
- if (constantSize != null) {\r
- return (int) ((endEntry.pos-fromEntry.pos)/constantSize)+1;\r
- }\r
- \r
- int result = 1;\r
- b.position(fromEntry.pos);\r
- while (b.position()<endEntry.pos) {\r
- ks.skip(b);\r
- vs.skip(b);\r
- result++;\r
- }\r
- return result; \r
- } catch (IOException e) {\r
- throw new AccessorException(e);\r
- } catch (AdaptException e) {\r
- throw new AccessorException(e);\r
- } finally {\r
- readUnlock();\r
- }\r
- }\r
- \r
- @Override\r
- public int getEntries(Binding keyBinding, Object from,\r
- boolean fromInclusive, Object end, boolean endInclusive,\r
- ArrayBinding keyArrayBinding, Object keysArray,\r
- ArrayBinding valueArrayBinding, Object valueArray, int limit)\r
- throws AccessorException {\r
- assert b.isOpen();\r
- readLock();\r
- try {\r
- Object lf = params.adapterScheme.adapt(from, keyBinding, kb);\r
- Object le = params.adapterScheme.adapt(end, keyBinding, kb);\r
- \r
- Entry fromEntry = fromInclusive ? index.ceiling(lf) : index.higher(lf);\r
- Entry endEntry = endInclusive ? index.floor(le) : index.lower(le);\r
- if (endEntry==null || fromEntry == null) return 0;\r
- \r
- // Requester's Key & Value Binding\r
- Binding rkb = keyArrayBinding.getComponentBinding();\r
- Binding rvb = valueArrayBinding.getComponentBinding();\r
- \r
- // Local Key & Value type & bindings\r
- Datatype lkt = type().keyType;\r
- Datatype lvt = type().valueType;\r
- \r
- boolean adaptKey = !rkb.type().equals(lkt);\r
- boolean adaptValue = !rvb.type().equals(lvt);\r
- \r
- Serializer ks, vs;\r
- Adapter ka = null, va = null;\r
- \r
- if (adaptKey) {\r
- Binding lkb = params.bindingScheme.getBinding( lkt );\r
- ka = params.adapterScheme.getAdapter( lkb, rkb, true, false);\r
- ks = params.serializerScheme.getSerializer( lkb );\r
- } else {\r
- ks = params.serializerScheme.getSerializer( rkb ); \r
- }\r
- \r
- if (adaptValue) {\r
- Binding lvb = params.bindingScheme.getBinding( lvt );\r
- va = params.adapterScheme.getAdapter( lvb, rvb, true, false);\r
- vs = params.serializerScheme.getSerializer( lvb );\r
- } else {\r
- vs = params.serializerScheme.getSerializer( rvb );\r
- } \r
- \r
- int i = 0;\r
- int kac = keyArrayBinding.size( keysArray );\r
- int vac = valueArrayBinding.size( valueArray ); \r
- b.position(fromEntry.pos);\r
- while (b.position()<=endEntry.pos) {\r
- if (limit>=0 && i>=limit) break;\r
- Object key = ks.deserialize(b);\r
- if (adaptKey) key = ka.adapt(key);\r
- Object value = vs.deserialize(b);\r
- if (adaptValue) value = va.adapt(value);\r
- \r
- if (i<kac) keyArrayBinding.set(keysArray, i, key); else keyArrayBinding.add(keysArray, i, key);\r
- if (i<vac) valueArrayBinding.set(valueArray, i, value); else valueArrayBinding.add(valueArray, i, value);\r
- \r
- i++;\r
- }\r
- return i; \r
- } catch (IOException e) {\r
- throw new AccessorException(e);\r
- } catch (AdaptException e) {\r
- throw new AccessorException(e);\r
- } catch (SerializerConstructionException e) {\r
- throw new AccessorException(e);\r
- } catch (BindingException e) {\r
- throw new AccessorException(e);\r
- } catch (BindingConstructionException e) {\r
- throw new AccessorException(e);\r
- } catch (AdapterConstructionException e) {\r
- throw new AccessorException(e);\r
- } finally {\r
- readUnlock();\r
- }\r
+ }
+
+ @Override
+ public int count(Binding keyBinding, Object from, boolean fromInclusive,
+ Object end, boolean endInclusive) throws AccessorException {
+ assert b.isOpen();
+ readLock();
+ try {
+ Object lf = params.adapterScheme.adapt(from, keyBinding, kb);
+ Object le = params.adapterScheme.adapt(end, keyBinding, kb);
+
+ Entry fromEntry = fromInclusive ? index.ceiling(lf) : index.higher(lf);
+ Entry endEntry = endInclusive ? index.floor(le) : index.lower(le);
+ if (endEntry==null || fromEntry == null) return 0;
+
+ if (fromEntry.pos>endEntry.pos) return 0;
+ if (fromEntry.pos==endEntry.pos) return 1;
+
+ if (constantSize != null) {
+ return (int) ((endEntry.pos-fromEntry.pos)/constantSize)+1;
+ }
+
+ int result = 1;
+ b.position(fromEntry.pos);
+ while (b.position()<endEntry.pos) {
+ ks.skip(b);
+ vs.skip(b);
+ result++;
+ }
+ return result;
+ } catch (IOException e) {
+ throw new AccessorException(e);
+ } catch (AdaptException e) {
+ throw new AccessorException(e);
+ } finally {
+ readUnlock();
+ }
+ }
+
+ @Override
+ public int getEntries(Binding keyBinding, Object from,
+ boolean fromInclusive, Object end, boolean endInclusive,
+ ArrayBinding keyArrayBinding, Object keysArray,
+ ArrayBinding valueArrayBinding, Object valueArray, int limit)
+ throws AccessorException {
+ assert b.isOpen();
+ readLock();
+ try {
+ Object lf = params.adapterScheme.adapt(from, keyBinding, kb);
+ Object le = params.adapterScheme.adapt(end, keyBinding, kb);
+
+ Entry fromEntry = fromInclusive ? index.ceiling(lf) : index.higher(lf);
+ Entry endEntry = endInclusive ? index.floor(le) : index.lower(le);
+ if (endEntry==null || fromEntry == null) return 0;
+
+ // Requester's Key & Value Binding
+ Binding rkb = keyArrayBinding.getComponentBinding();
+ Binding rvb = valueArrayBinding.getComponentBinding();
+
+ // Local Key & Value type & bindings
+ Datatype lkt = type().keyType;
+ Datatype lvt = type().valueType;
+
+ boolean adaptKey = !rkb.type().equals(lkt);
+ boolean adaptValue = !rvb.type().equals(lvt);
+
+ Serializer ks, vs;
+ Adapter ka = null, va = null;
+
+ if (adaptKey) {
+ Binding lkb = params.bindingScheme.getBinding( lkt );
+ ka = params.adapterScheme.getAdapter( lkb, rkb, true, false);
+ ks = params.serializerScheme.getSerializer( lkb );
+ } else {
+ ks = params.serializerScheme.getSerializer( rkb );
+ }
+
+ if (adaptValue) {
+ Binding lvb = params.bindingScheme.getBinding( lvt );
+ va = params.adapterScheme.getAdapter( lvb, rvb, true, false);
+ vs = params.serializerScheme.getSerializer( lvb );
+ } else {
+ vs = params.serializerScheme.getSerializer( rvb );
+ }
+
+ int i = 0;
+ int kac = keyArrayBinding.size( keysArray );
+ int vac = valueArrayBinding.size( valueArray );
+ b.position(fromEntry.pos);
+ while (b.position()<=endEntry.pos) {
+ if (limit>=0 && i>=limit) break;
+ Object key = ks.deserialize(b);
+ if (adaptKey) key = ka.adapt(key);
+ Object value = vs.deserialize(b);
+ if (adaptValue) value = va.adapt(value);
+
+ if (i<kac) keyArrayBinding.set(keysArray, i, key); else keyArrayBinding.add(keysArray, i, key);
+ if (i<vac) valueArrayBinding.set(valueArray, i, value); else valueArrayBinding.add(valueArray, i, value);
+
+ i++;
+ }
+ return i;
+ } catch (IOException e) {
+ throw new AccessorException(e);
+ } catch (AdaptException e) {
+ throw new AccessorException(e);
+ } catch (SerializerConstructionException e) {
+ throw new AccessorException(e);
+ } catch (BindingException e) {
+ throw new AccessorException(e);
+ } catch (BindingConstructionException e) {
+ throw new AccessorException(e);
+ } catch (AdapterConstructionException e) {
+ throw new AccessorException(e);
+ } finally {
+ readUnlock();
+ }