/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.cache.persistence.query.mock;
import java.util.Comparator;
import java.util.Iterator;
import java.util.concurrent.ConcurrentSkipListMap;
import org.apache.geode.internal.cache.CachedDeserializable;
import org.apache.geode.internal.cache.PreferBytesCachedDeserializable;
import org.apache.geode.internal.cache.persistence.query.CloseableIterator;
import org.apache.geode.internal.cache.persistence.query.ResultMap;
public class SortedResultMapImpl implements ResultMap {
// This should be <CachedDeserializable, CachedDeserializable>, except
// that we support retrievals using non CachedDeserializable objects.
private final ConcurrentSkipListMap<Object, Object> map;
public SortedResultMapImpl(boolean reverse) {
Comparator comparator = new CachedDeserializableComparator(new NaturalComparator());
if (reverse) {
comparator = new ReverseComparator(comparator);
}
map = new ConcurrentSkipListMap(comparator);
}
@Override
public void put(Object key, Object value) {
map.put(toDeserializable(key), toDeserializable(value));
}
@Override
public void remove(Object key) {
map.remove(key);
}
@Override
public Entry getEntry(Object key) {
if (map.containsKey(key)) {
return new EntryImpl(toDeserializable(key), (CachedDeserializable) map.get(key));
} else {
return null;
}
}
@Override
public CachedDeserializable get(Object key) {
return (CachedDeserializable) map.get(key);
}
@Override
public CloseableIterator<Entry> iterator(Object start, boolean startInclusive, Object end,
boolean endInclusive) {
return new IterImpl(map.subMap(start, startInclusive, end, endInclusive).entrySet().iterator());
}
@Override
public CloseableIterator<Entry> iterator(Object start, boolean startInclusive) {
// TODO Auto-generated method stub
return new IterImpl(map.subMap(start, startInclusive).entrySet().iterator());
}
@Override
public CloseableIterator<Entry> iterator() {
// TODO Auto-generated method stub
return new IterImpl(map.entrySet().iterator());
}
@Override
public CloseableIterator<CachedDeserializable> keyIterator(Object start, boolean startInclusive,
Object end, boolean endInclusive) {
return new ItrAdapter(map.subMap(start, startInclusive, end, endInclusive).keySet().iterator());
}
@Override
public CloseableIterator<CachedDeserializable> keyIterator(Object start, boolean startInclusive) {
return new ItrAdapter(map.subMap(start, startInclusive).keySet().iterator());
}
@Override
public CloseableIterator<CachedDeserializable> keyIterator() {
return new ItrAdapter(map.keySet().iterator());
}
public CloseableIterator<CachedDeserializable> valueIterator() {
return new ItrAdapter(map.values().iterator());
}
public CloseableIterator<CachedDeserializable> valueIterator(Object start,
boolean startInclusive) {
return new ItrAdapter(map.tailMap(start, startInclusive).values().iterator());
}
@Override
public void close() {
// do nothing
}
private static class EntryImpl implements Entry {
private CachedDeserializable key;
private CachedDeserializable value;
public EntryImpl(CachedDeserializable key, CachedDeserializable value) {
this.key = key;
this.value = value;
}
@Override
public CachedDeserializable getKey() {
return key;
}
@Override
public CachedDeserializable getValue() {
return value;
}
}
private CachedDeserializable toDeserializable(Object value) {
if (value instanceof CachedDeserializable) {
return (CachedDeserializable) value;
}
return new PreferBytesCachedDeserializable(value);
}
private static class IterImpl implements CloseableIterator<Entry> {
private Iterator<java.util.Map.Entry<Object, Object>> iterator;
public IterImpl(Iterator<java.util.Map.Entry<Object, Object>> iterator) {
this.iterator = iterator;
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Entry next() {
java.util.Map.Entry<Object, Object> next = iterator.next();
return new EntryImpl((CachedDeserializable) next.getKey(),
(CachedDeserializable) next.getValue());
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public void close() {
// do nothing
}
}
public boolean containsKey(Object e) {
return map.containsKey(e);
}
}