/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.persist.impl;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import com.sleepycat.persist.model.Persistent;
import com.sleepycat.persist.model.PersistentProxy;
/**
* Proxy for a Map.
*
* @author Mark Hayes
*/
@Persistent
abstract class MapProxy<K, V> implements PersistentProxy<Map<K, V>> {
private K[] keys;
private V[] values;
protected MapProxy() {}
public final void initializeProxy(Map<K, V> map) {
int size = map.size();
keys = (K[]) new Object[size];
values = (V[]) new Object[size];
int i = 0;
for (Map.Entry<K, V> entry : map.entrySet()) {
keys[i] = entry.getKey();
values[i] = entry.getValue();
i += 1;
}
}
public final Map<K, V> convertProxy() {
int size = values.length;
Map<K, V> map = newInstance(size);
for (int i = 0; i < size; i += 1) {
map.put(keys[i], values[i]);
}
return map;
}
protected abstract Map<K, V> newInstance(int size);
@Persistent(proxyFor=HashMap.class)
static class HashMapProxy<K, V> extends MapProxy<K, V> {
protected HashMapProxy() {}
protected Map<K, V> newInstance(int size) {
return new HashMap<K, V>(size);
}
}
@Persistent(proxyFor=TreeMap.class)
static class TreeMapProxy<K, V> extends MapProxy<K, V> {
protected TreeMapProxy() {}
protected Map<K, V> newInstance(int size) {
return new TreeMap<K, V>();
}
}
@Persistent(proxyFor=LinkedHashMap.class)
static class LinkedHashMapProxy<K, V> extends MapProxy<K, V> {
protected LinkedHashMapProxy() {}
protected Map<K, V> newInstance(int size) {
return new LinkedHashMap<K, V>();
}
}
}