/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.pluginmanager; import java.util.HashMap; import java.util.Map; import freenet.node.FSParseException; import freenet.support.Base64; import freenet.support.IllegalBase64Exception; import freenet.support.SimpleFieldSet; /** * This is a PluginStore. Plugins can use that to store all kinds of primary * data types with as many recursion level as needed. * @author Artefact2 */ public class PluginStore { public final HashMap<String, PluginStore> subStores = new HashMap<String, PluginStore>(); public final HashMap<String, Long> longs = new HashMap<String, Long>(); public final HashMap<String, long[]> longsArrays = new HashMap<String, long[]>(); public final HashMap<String, Integer> integers = new HashMap<String, Integer>(); public final HashMap<String, int[]> integersArrays = new HashMap<String, int[]>(); public final HashMap<String, Short> shorts = new HashMap<String, Short>(); public final HashMap<String, short[]> shortsArrays = new HashMap<String, short[]>(); public final HashMap<String, Boolean> booleans = new HashMap<String, Boolean>(); public final HashMap<String, boolean[]> booleansArrays = new HashMap<String, boolean[]>(); public final HashMap<String, Byte> bytes = new HashMap<String, Byte>(); public final HashMap<String, byte[]> bytesArrays = new HashMap<String, byte[]>(); public final HashMap<String, String> strings = new HashMap<String, String>(); public final HashMap<String, String[]> stringsArrays = new HashMap<String, String[]>(); public PluginStore() { // Default constructor. See below for constructor from SFS. } public SimpleFieldSet exportStoreAsSFS() { SimpleFieldSet fs = new SimpleFieldSet(true, true); for(Map.Entry<String, PluginStore> entry : subStores.entrySet()) { fs.put("substore."+encode(entry.getKey()), entry.getValue().exportStoreAsSFS()); } for(Map.Entry<String, Long> entry : longs.entrySet()) { fs.put("long."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, long[]> entry : longsArrays.entrySet()) { fs.put("longs."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, Integer> entry : integers.entrySet()) { fs.put("integer."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, int[]> entry : integersArrays.entrySet()) { fs.put("integers."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, Short> entry : shorts.entrySet()) { fs.put("short."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, short[]> entry : shortsArrays.entrySet()) { fs.put("shorts."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, Byte> entry : bytes.entrySet()) { fs.put("byte."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, byte[]> entry : bytesArrays.entrySet()) { fs.put("bytes."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, Boolean> entry : booleans.entrySet()) { fs.put("boolean."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, boolean[]> entry : booleansArrays.entrySet()) { fs.put("booleans."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, String> entry : strings.entrySet()) { fs.putSingle("string."+encode(entry.getKey()), entry.getValue()); } for(Map.Entry<String, String[]> entry : stringsArrays.entrySet()) { fs.putEncoded("strings."+encode(entry.getKey()), entry.getValue()); } return fs; } public PluginStore(SimpleFieldSet sfs) throws IllegalBase64Exception, FSParseException { SimpleFieldSet group = sfs.subset("substore"); if(group != null) { for(Map.Entry<String, SimpleFieldSet> entry : group.directSubsets().entrySet()) { subStores.put(decode(entry.getKey()), new PluginStore(entry.getValue())); } } group = sfs.subset("long"); if(group != null) { for(String s : group.directKeys()) { longs.put(decode(s), group.getLong(s)); } } group = sfs.subset("longs"); if(group != null) { for(String s : group.directKeys()) { longsArrays.put(decode(s), group.getLongArray(s)); } } group = sfs.subset("integer"); if(group != null) { for(String s : group.directKeys()) { integers.put(decode(s), group.getInt(s)); } } group = sfs.subset("integers"); if(group != null) { for(String s : group.directKeys()) { integersArrays.put(decode(s), group.getIntArray(s)); } } group = sfs.subset("short"); if(group != null) { for(String s : group.directKeys()) { shorts.put(decode(s), group.getShort(s)); } } group = sfs.subset("shorts"); if(group != null) { for(String s : group.directKeys()) { shortsArrays.put(decode(s), group.getShortArray(s)); } } group = sfs.subset("boolean"); if(group != null) { for(String s : group.directKeys()) { booleans.put(decode(s), group.getBoolean(s)); } } group = sfs.subset("booleans"); if(group != null) { for(String s : group.directKeys()) { booleansArrays.put(decode(s), group.getBooleanArray(s)); } } group = sfs.subset("byte"); if(group != null) { for(String s : group.directKeys()) { bytes.put(decode(s), group.getByte(s)); } } group = sfs.subset("bytes"); if(group != null) { for(String s : group.directKeys()) { bytesArrays.put(decode(s), group.getByteArray(s)); } } group = sfs.subset("string"); if(group != null) { for(String s : group.directKeys()) { strings.put(decode(s), group.get(s)); } } group = sfs.subset("strings"); if(group != null) { for(String s : group.directKeys()) { stringsArrays.put(decode(s), group.getAllEncoded(s)); } } } private static final String encode(String s) { return Base64.encodeUTF8(s); } private static final String decode(String s) throws IllegalBase64Exception { return Base64.decodeUTF8(s); } }