/** * Copyright 2005-2012 Akiban Technologies, Inc. * * Licensed 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 com.persistit.unit; import static org.junit.Assert.assertEquals; import java.lang.reflect.Array; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.junit.Test; import com.persistit.Exchange; import com.persistit.PersistitUnitTestCase; import com.persistit.Value; import com.persistit.encoding.CoderContext; import com.persistit.encoding.ValueCoder; import com.persistit.encoding.ValueDisplayer; import com.persistit.encoding.ValueRenderer; import com.persistit.exception.ConversionException; import com.persistit.exception.PersistitException; public class ValueCoderTest1 extends PersistitUnitTestCase { Exchange _exchange; @Override public void setUp() throws Exception { super.setUp(); _exchange = _persistit.getExchange("persistit", getClass().getSimpleName(), true); } @Override public void tearDown() throws Exception { _persistit.releaseExchange(_exchange); _exchange = null; super.tearDown(); } @Test public void test1() throws PersistitException { System.out.print("test1 "); final Value value = _exchange.getValue(); final TreeMap map1 = new TreeMap(); for (int i = 0; i < 10; i++) { map1.put(new Integer(i), Integer.toString(i)); } value.put(map1); final TreeMap map2 = (TreeMap) value.get(); assertEquals(map1, map2); final String toString = value.toString(); assertEquals("(java.util.TreeMap)[" + "(Integer)0->\"0\",(Integer)1->\"1\",(Integer)2->\"2\"," + "(Integer)3->\"3\",(Integer)4->\"4\",(Integer)5->\"5\"," + "(Integer)6->\"6\",(Integer)7->\"7\",(Integer)8->\"8\"," + "(Integer)9->\"9\"]", toString); System.out.println("- done"); } @Test public void test2() { System.out.print("test2 "); final Value value = _exchange.getValue(); final HashMap map1 = new HashMap(); for (int i = 0; i < 10; i++) { map1.put(new Integer(i), Integer.toString(i)); } value.put(map1); final HashMap map2 = (HashMap) value.get(); assertEquals(map1, map2); System.out.println("- done"); } @Test public void test3() { System.out.print("test3 "); final Value value = _exchange.getValue(); final HashMap map1 = new HashMap(); for (int i = 0; i < 10; i++) { map1.put(new Integer(i), Integer.toString(i)); } value.put(map1); final TreeMap map2 = new TreeMap(); value.get(map2); final HashMap map3 = new HashMap(map2); assertEquals(map1, map3); System.out.println("- done"); } @Test public void test4() { System.out.print("test4 "); final Value value = _exchange.getValue(); final Set set1 = new TreeSet(); for (int i = 0; i < 10; i++) { set1.add(new Integer(i)); } value.put(set1); final Set set2 = (Set) value.get(); assertEquals(set1, set2); final String toString = value.toString(); assertEquals("(java.util.TreeSet)[(Integer)0,(Integer)1,(Integer)2,(Integer)3,(Integer)4," + "(Integer)5,(Integer)6,(Integer)7,(Integer)8,(Integer)9]", toString); System.out.println("- done"); } public boolean equals(final Object a, final Object b) { if ((a == null) || (b == null)) { return a == b; } if (a.getClass().isArray()) { if (!b.getClass().isArray()) { return false; } if (a.getClass().getComponentType() != b.getClass().getComponentType()) { return false; } if (Array.getLength(a) != Array.getLength(b)) { return false; } for (int index = Array.getLength(a); --index >= 0;) { if (!equals(Array.get(a, index), Array.get(b, index))) { return false; } } return true; } else if (a.getClass().isPrimitive()) { return a == b; } else { return a.equals(b); } } private void debug(final boolean condition) { if (!condition) { return; } return; // <-- breakpoint here } private static class MapValueRenderer implements ValueRenderer, ValueDisplayer { Class _clazz; MapValueRenderer(final Class clazz) { _clazz = clazz; } @Override public void put(final Value value, final Object object, final CoderContext context) throws ConversionException { final Map map = (Map) object; value.put(map.size()); for (final Iterator iter = map.entrySet().iterator(); iter.hasNext();) { final Map.Entry entry = (Map.Entry) iter.next(); value.put(entry.getKey()); value.put(entry.getValue()); } } @Override public Object get(final Value value, final Class clazz, final CoderContext context) throws ConversionException { Map map = null; try { map = (Map) _clazz.newInstance(); final int size = value.getInt(); for (int index = 0; index < size; index++) { final Object k = value.get(); final Object v = value.get(); map.put(k, v); } } catch (final Exception e) { throw new ConversionException(e); } return map; } @Override public void render(final Value value, final Object target, final Class clazz, final CoderContext context) throws ConversionException { final Map map = (Map) target; final int size = value.getInt(); for (int index = 0; index < size; index++) { final Object k = value.get(); final Object v = value.get(); map.put(k, v); } } @Override public void display(final Value value, final StringBuilder sb, final Class clazz, final CoderContext context) { final int size = value.getInt(); sb.append("["); for (int index = 0; index < size; index++) { if (index > 0) { sb.append(","); } value.decodeDisplayable(true, sb, context); sb.append("->"); value.decodeDisplayable(true, sb, context); } sb.append("]"); } } static class TreeSetValueCoder implements ValueCoder { public TreeSetValueCoder() { } @Override public Object get(final Value value, final Class clazz, final CoderContext context) throws ConversionException { Set set = null; try { set = (Set) clazz.newInstance(); } catch (final InstantiationException ex) { throw new ConversionException(ex); } catch (final IllegalAccessException ex) { throw new ConversionException(ex); } // value.setStreamMode(true); final int size = value.getInt(); for (int i = 0; i < size; i++) { set.add(value.get()); } return set; } @Override public void put(final Value value, final Object object, final CoderContext context) { final Set set = (Set) object; // value.setStreamMode(true); value.put(set.size()); for (final Iterator iterObject = set.iterator(); iterObject.hasNext();) { final Object curObject = iterObject.next(); value.put(curObject); } } } public static void main(final String[] args) throws Exception { new ValueCoderTest1().initAndRunTest(); } @Override public void runAllTests() throws Exception { try { _persistit.getCoderManager().registerValueCoder(TreeMap.class, new MapValueRenderer(TreeMap.class)); _persistit.getCoderManager().registerValueCoder(HashMap.class, new MapValueRenderer(HashMap.class)); _persistit.getCoderManager().registerValueCoder(TreeSet.class, new TreeSetValueCoder()); _persistit.getCoderManager().registerValueCoder(Set.class, new TreeSetValueCoder()); _exchange = _persistit.getExchange("persistit", "ValueCoderTest1", true); test1(); test2(); test3(); test4(); } finally { _persistit.getCoderManager().unregisterValueCoder(TreeMap.class); _persistit.getCoderManager().unregisterValueCoder(HashMap.class); } } }