Skip to content
Snippets Groups Projects
Commit 46e7a52c authored by akwizgran's avatar akwizgran
Browse files

Merge branch 'bdf-type-conversion' into 'master'

Convert BDF types in lists and dictionaries



See merge request !111
parents 8c8b2a53 5045b58e
No related branches found
No related tags found
No related merge requests found
package org.briarproject.api.data;
import org.briarproject.api.Bytes;
import org.briarproject.api.FormatException;
import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;
public class BdfDictionary extends Hashtable<String, Object> {
public static final Object NULL_VALUE = new Object();
/**
* Factory method for constructing dictionaries inline.
* <pre>
* BdfDictionary.of(
* new BdfEntry("foo", foo),
* new BdfEntry("bar", bar)
* );
* </pre>
*/
public static BdfDictionary of(Entry<String, Object>... entries) {
BdfDictionary d = new BdfDictionary();
for (Entry<String, Object> e : entries) d.put(e.getKey(), e.getValue());
return d;
}
public BdfDictionary() {
super();
}
public BdfDictionary(Map<String, Object> m) {
super(m);
}
public Boolean getBoolean(String key) throws FormatException {
Object o = get(key);
if (o instanceof Boolean) return (Boolean) o;
......@@ -23,24 +49,32 @@ public class BdfDictionary extends Hashtable<String, Object> {
public Long getInteger(String key) throws FormatException {
Object o = get(key);
if (o instanceof Long) return (Long) o;
if (o instanceof Integer) return ((Integer) o).longValue();
if (o instanceof Short) return ((Short) o).longValue();
if (o instanceof Byte) return ((Byte) o).longValue();
throw new FormatException();
}
public Long getInteger(String key, Long defaultValue) {
Object o = get(key);
if (o instanceof Long) return (Long) o;
if (o instanceof Integer) return ((Integer) o).longValue();
if (o instanceof Short) return ((Short) o).longValue();
if (o instanceof Byte) return ((Byte) o).longValue();
return defaultValue;
}
public Double getFloat(String key) throws FormatException {
Object o = get(key);
if (o instanceof Double) return (Double) o;
if (o instanceof Float) return ((Float) o).doubleValue();
throw new FormatException();
}
public Double getFloat(String key, Double defaultValue) {
Object o = get(key);
if (o instanceof Double) return (Double) o;
if (o instanceof Float) return ((Float) o).doubleValue();
return defaultValue;
}
......@@ -59,12 +93,14 @@ public class BdfDictionary extends Hashtable<String, Object> {
public byte[] getRaw(String key) throws FormatException {
Object o = get(key);
if (o instanceof byte[]) return (byte[]) o;
if (o instanceof Bytes) return ((Bytes) o).getBytes();
throw new FormatException();
}
public byte[] getRaw(String key, byte[] defaultValue) {
Object o = get(key);
if (o instanceof byte[]) return (byte[]) o;
if (o instanceof Bytes) return ((Bytes) o).getBytes();
return defaultValue;
}
......
package org.briarproject.api.data;
import java.util.Map.Entry;
// This class is not thread-safe
public class BdfEntry implements Entry<String, Object> {
private final String key;
private Object value;
public BdfEntry(String key, Object value) {
this.key = key;
this.value = value;
}
@Override
public String getKey() {
return key;
}
@Override
public Object getValue() {
return value;
}
@Override
public Object setValue(Object value) {
Object oldValue = this.value;
this.value = value;
return oldValue;
}
}
package org.briarproject.api.data;
import org.briarproject.api.Bytes;
import org.briarproject.api.FormatException;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
public class BdfList extends Vector<Object> {
/**
* Factory method for constructing lists inline.
* <pre>
* BdfList.of(1, 2, 3);
* </pre>
*/
public static BdfList of(Object... items) {
return new BdfList(Arrays.asList(items));
}
public BdfList() {
super();
}
public BdfList(List<Object> items) {
super(items);
}
public Boolean getBoolean(int index) throws FormatException {
Object o = get(index);
if (o instanceof Boolean) return (Boolean) o;
......@@ -21,24 +42,32 @@ public class BdfList extends Vector<Object> {
public Long getInteger(int index) throws FormatException {
Object o = get(index);
if (o instanceof Long) return (Long) o;
if (o instanceof Integer) return ((Integer) o).longValue();
if (o instanceof Short) return ((Short) o).longValue();
if (o instanceof Byte) return ((Byte) o).longValue();
throw new FormatException();
}
public Long getInteger(int index, Long defaultValue) {
Object o = get(index);
if (o instanceof Long) return (Long) o;
if (o instanceof Integer) return ((Integer) o).longValue();
if (o instanceof Short) return ((Short) o).longValue();
if (o instanceof Byte) return ((Byte) o).longValue();
return defaultValue;
}
public Double getFloat(int index) throws FormatException {
Object o = get(index);
if (o instanceof Double) return (Double) o;
if (o instanceof Float) return ((Float) o).doubleValue();
throw new FormatException();
}
public Double getFloat(int index, Double defaultValue) {
Object o = get(index);
if (o instanceof Double) return (Double) o;
if (o instanceof Float) return ((Float) o).doubleValue();
return defaultValue;
}
......@@ -57,12 +86,14 @@ public class BdfList extends Vector<Object> {
public byte[] getRaw(int index) throws FormatException {
Object o = get(index);
if (o instanceof byte[]) return (byte[]) o;
if (o instanceof Bytes) return ((Bytes) o).getBytes();
throw new FormatException();
}
public byte[] getRaw(int index, byte[] defaultValue) {
Object o = get(index);
if (o instanceof byte[]) return (byte[]) o;
if (o instanceof Bytes) return ((Bytes) o).getBytes();
return defaultValue;
}
......
package org.briarproject.data;
import org.briarproject.api.Bytes;
import org.briarproject.api.FormatException;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.data.MetadataEncoder;
......@@ -62,6 +63,7 @@ class MetadataEncoderImpl implements MetadataEncoder {
else if (o instanceof Double) encodeFloat(out, (Double) o);
else if (o instanceof String) encodeString(out, (String) o);
else if (o instanceof byte[]) encodeRaw(out, (byte[]) o);
else if (o instanceof Bytes) encodeRaw(out, ((Bytes) o).getBytes());
else if (o instanceof List) encodeList(out, (List) o);
else if (o instanceof Map) encodeDictionary(out, (Map) o);
else throw new FormatException();
......
package org.briarproject.data;
import org.briarproject.BriarTestCase;
import org.briarproject.api.Bytes;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.data.BdfEntry;
import org.junit.Test;
import java.util.Collections;
import static org.briarproject.api.data.BdfDictionary.NULL_VALUE;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
public class BdfDictionaryTest extends BriarTestCase {
@Test
public void testConstructors() {
assertEquals(Collections.emptyMap(), new BdfDictionary());
assertEquals(Collections.singletonMap("foo", NULL_VALUE),
new BdfDictionary(Collections.singletonMap("foo", NULL_VALUE)));
}
@Test
public void testFactoryMethod() {
assertEquals(Collections.emptyMap(), BdfDictionary.of());
assertEquals(Collections.singletonMap("foo", NULL_VALUE),
BdfDictionary.of(new BdfEntry("foo", NULL_VALUE)));
}
@Test
public void testIntegerPromotion() throws Exception {
BdfDictionary d = new BdfDictionary();
d.put("foo", (byte) 1);
d.put("bar", (short) 2);
d.put("baz", 3);
d.put("bam", 4L);
assertEquals(Long.valueOf(1), d.getInteger("foo"));
assertEquals(Long.valueOf(2), d.getInteger("bar"));
assertEquals(Long.valueOf(3), d.getInteger("baz"));
assertEquals(Long.valueOf(4), d.getInteger("bam"));
}
@Test
public void testFloatPromotion() throws Exception {
BdfDictionary d = new BdfDictionary();
d.put("foo", 1F);
d.put("bar", 2D);
assertEquals(Double.valueOf(1), d.getFloat("foo"));
assertEquals(Double.valueOf(2), d.getFloat("bar"));
}
@Test
public void testByteArrayUnwrapping() throws Exception {
BdfDictionary d = new BdfDictionary();
d.put("foo", new byte[123]);
d.put("bar", new Bytes(new byte[123]));
byte[] foo = d.getRaw("foo");
assertEquals(123, foo.length);
assertArrayEquals(new byte[123], foo);
byte[] bar = d.getRaw("bar");
assertEquals(123, bar.length);
assertArrayEquals(new byte[123], bar);
}
}
package org.briarproject.data;
import org.briarproject.BriarTestCase;
import org.briarproject.api.Bytes;
import org.briarproject.api.data.BdfList;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import static org.briarproject.api.data.BdfDictionary.NULL_VALUE;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
public class BdfListTest extends BriarTestCase {
@Test
public void testConstructors() {
assertEquals(Collections.emptyList(), new BdfList());
assertEquals(Arrays.asList(1, 2, NULL_VALUE),
new BdfList(Arrays.asList(1, 2, NULL_VALUE)));
}
@Test
public void testFactoryMethod() {
assertEquals(Collections.emptyList(), BdfList.of());
assertEquals(Arrays.asList(1, 2, NULL_VALUE),
BdfList.of(1, 2, NULL_VALUE));
}
@Test
public void testIntegerPromotion() throws Exception {
BdfList list = new BdfList();
list.add((byte) 1);
list.add((short) 2);
list.add(3);
list.add(4L);
assertEquals(Long.valueOf(1), list.getInteger(0));
assertEquals(Long.valueOf(2), list.getInteger(1));
assertEquals(Long.valueOf(3), list.getInteger(2));
assertEquals(Long.valueOf(4), list.getInteger(3));
}
@Test
public void testFloatPromotion() throws Exception {
BdfList list = new BdfList();
list.add(1F);
list.add(2D);
assertEquals(Double.valueOf(1), list.getFloat(0));
assertEquals(Double.valueOf(2), list.getFloat(1));
}
@Test
public void testByteArrayUnwrapping() throws Exception {
BdfList list = new BdfList();
list.add(new byte[123]);
list.add(new Bytes(new byte[123]));
byte[] first = list.getRaw(0);
assertEquals(123, first.length);
assertArrayEquals(new byte[123], first);
byte[] second = list.getRaw(1);
assertEquals(123, second.length);
assertArrayEquals(new byte[123], second);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment