package org.limewire.promotion.containers; import java.util.Arrays; import java.util.Date; import org.limewire.io.BadGGEPBlockException; import org.limewire.io.BadGGEPPropertyException; import org.limewire.io.GGEP; import org.limewire.util.StringUtils; /** * Provides an abstract generic message container to store arbitrary key/value * pairs without the GGEP exception handling overhead. */ public abstract class MapMessageContainer implements MessageContainer { private GGEP payload = new GGEP(); /** * Stores the given key/value pair, overwriting any previous value if * present. Neither key or value may be null. */ protected void put(String key, String value) { if (value == null || key == null) throw new NullPointerException("key and value must not be null."); payload.put(key, StringUtils.toUTF8Bytes(value)); } /** * Stores the given key/value pair, overwriting any previous value if * present. Neither key or value may be null. */ protected void put(String key, Date value) { if (value == null || key == null) throw new NullPointerException("key and value must not be null."); payload.put(key, value.getTime()); } /** * Stores the given key/value pair, overwriting any previous value if * present. Neither key or value may be null. */ protected void put(String key, byte[] value) { if (value == null || key == null) throw new NullPointerException("key and value must not be null."); payload.put(key, value); } /** * Stores the given key/value pair, overwriting any previous value if * present. Key may not be null. */ protected void put(String key, long value) { if (key == null) throw new NullPointerException("key must not be null."); payload.put(key, value); } /** * @return the value corresponding to the given key, or null if the key is * not set or there is a problem parsing. */ protected String getString(String key) { if (key == null) throw new NullPointerException("key must not be null."); if (!payload.hasValueFor(key)) return null; return StringUtils.toUTF8String(payload.get(key)); } /** * @return the value corresponding to the given key, or null if the key is * not set or there is a problem parsing. */ protected byte[] getBytes(String key) { if (key == null) throw new NullPointerException("key must not be null."); if (!payload.hasValueFor(key)) return null; try { return payload.getBytes(key); } catch (BadGGEPPropertyException ex) { return null; } } /** * @return the value corresponding to the given key, or null if the key is * not set or there is a problem parsing. */ protected Long getLong(String key) { if (key == null) throw new NullPointerException("key must not be null."); if (!payload.hasValueFor(key)) return null; try { return payload.getLong(key); } catch (BadGGEPPropertyException ex) { return null; } } /** * @return the value corresponding to the given key, or null if the key is * not set or there is a problem parsing. */ protected Date getDate(String key) { if (key == null) throw new NullPointerException("key must not be null."); if (!payload.hasValueFor(key)) return null; try { return new Date(payload.getLong(key)); } catch (BadGGEPPropertyException ex) { return null; } } public byte[] encode() { payload.put(TYPE_KEY, getType()); return payload.toByteArray(); } public void decode(GGEP rawGGEP) throws BadGGEPBlockException { if (!Arrays.equals(getType(), rawGGEP.get(TYPE_KEY))) throw new BadGGEPBlockException("Incorrect type."); this.payload = rawGGEP; } }