Java tutorial
/* * Copyright 2010 Martin Grotzke * * 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 de.javakaffee.kryoserializers; import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Currency; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.lang.mutable.MutableInt; import de.javakaffee.kryoserializers.TestClasses.Person.Gender; /** * Test for {@link JavolutionTranscoder} * * @author <a href="mailto:martin.grotzke@javakaffee.de">Martin Grotzke</a> */ public class TestClasses { static Person createPerson(final String name, final Gender gender, final String... emailAddresses) { final Person person = new Person(); person.setName(name); person.setGender(gender); if (emailAddresses != null) { final HashMap<String, Object> props = new HashMap<String, Object>(); for (int i = 0; i < emailAddresses.length; i++) { final String emailAddress = emailAddresses[i]; props.put("email" + i, new Email(name, emailAddress)); } person.setProps(props); } return person; } static Person createPerson(final String name, final Gender gender, final Integer age, final String... emailAddresses) { final Person person = new Person(); person.setName(name); person.setGender(gender); person.setAge(age); final HashMap<String, Object> props = new HashMap<String, Object>(); for (int i = 0; i < emailAddresses.length; i++) { final String emailAddress = emailAddresses[i]; props.put("email" + i, new Email(name, emailAddress)); } person.setProps(props); return person; } static ClassWithoutDefaultConstructor createClassWithoutDefaultConstructor(final String string) { return new ClassWithoutDefaultConstructor(string); } static PrivateClass createPrivateClass(final String string) { final PrivateClass result = new PrivateClass(); result.foo = string; return result; } static Container createContainer() { return new Container(); } static SomeInterface createProxy() { return (SomeInterface) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[] { SomeInterface.class, Serializable.class }, new MyInvocationHandler(SomeInterfaceImpl.class)); } static class MyInvocationHandler implements InvocationHandler { private final Class<?> _targetClazz; private transient Object _target; public MyInvocationHandler(final Class<?> targetClazz) { _targetClazz = targetClazz; } public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { if (_target == null) { _target = _targetClazz.newInstance(); } return method.invoke(_target, args); } } static interface SomeInterface { String hello(); } static class SomeInterfaceImpl implements SomeInterface { /** * {@inheritDoc} */ public String hello() { return "hi"; } } public static class Container { @SuppressWarnings("unused") private final Body _body; public Container() { _body = new Body(); } class Body { } } public static class Person implements Serializable { private static final long serialVersionUID = 1L; static enum Gender { MALE, FEMALE } private String _name; private Gender _gender; private Integer _age; private Map<String, Object> _props; private final Collection<Person> _friends = new ArrayList<Person>(); public String getName() { return _name; } public void addFriend(final Person p) { _friends.add(p); } public void setName(final String name) { _name = name; } public Map<String, Object> getProps() { return _props; } public void setProps(final Map<String, Object> props) { _props = props; } public Gender getGender() { return _gender; } public void setGender(final Gender gender) { _gender = gender; } public Integer getAge() { return _age; } public void setAge(final Integer age) { _age = age; } public Collection<Person> getFriends() { return _friends; } /** * @param friends * @param friends2 * @return */ private boolean flatEquals(final Collection<?> c1, final Collection<?> c2) { return c1 == c2 || c1 != null && c2 != null && c1.size() == c2.size(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_age == null) ? 0 : _age.hashCode()); result = prime * result + ((_friends == null) ? 0 : _friends.size()); result = prime * result + ((_gender == null) ? 0 : _gender.hashCode()); result = prime * result + ((_name == null) ? 0 : _name.hashCode()); result = prime * result + ((_props == null) ? 0 : _props.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Person other = (Person) obj; if (_age == null) { if (other._age != null) { return false; } } else if (!_age.equals(other._age)) { return false; } if (_friends == null) { if (other._friends != null) { return false; } } else if (!flatEquals(_friends, other._friends)) { return false; } if (_gender == null) { if (other._gender != null) { return false; } } else if (!_gender.equals(other._gender)) { return false; } if (_name == null) { if (other._name != null) { return false; } } else if (!_name.equals(other._name)) { return false; } if (_props == null) { if (other._props != null) { return false; } } else if (!_props.equals(other._props)) { return false; } return true; } @Override public String toString() { return "Person [_age=" + _age + ", _friends.size=" + _friends.size() + ", _gender=" + _gender + ", _name=" + _name + ", _props=" + _props + "]"; } } public static class Email implements Serializable { private static final long serialVersionUID = 1L; private String _name; private String _email; public Email() { } public Email(final String name, final String email) { super(); _name = name; _email = email; } public String getName() { return _name; } public void setName(final String name) { _name = name; } public String getEmail() { return _email; } public void setEmail(final String email) { _email = email; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_email == null) ? 0 : _email.hashCode()); result = prime * result + ((_name == null) ? 0 : _name.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Email other = (Email) obj; if (_email == null) { if (other._email != null) { return false; } } else if (!_email.equals(other._email)) { return false; } if (_name == null) { if (other._name != null) { return false; } } else if (!_name.equals(other._name)) { return false; } return true; } @Override public String toString() { return "Email [_email=" + _email + ", _name=" + _name + "]"; } } public static class PublicClass { PrivateClass privateClass; public PublicClass() { } public PublicClass(final PrivateClass protectedClass) { this.privateClass = protectedClass; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((privateClass == null) ? 0 : privateClass.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final PublicClass other = (PublicClass) obj; if (privateClass == null) { if (other.privateClass != null) { return false; } } else if (!privateClass.equals(other.privateClass)) { return false; } return true; } } private static class PrivateClass { String foo; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((foo == null) ? 0 : foo.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final PrivateClass other = (PrivateClass) obj; if (foo == null) { if (other.foo != null) { return false; } } else if (!foo.equals(other.foo)) { return false; } return true; } } public static class ClassWithoutDefaultConstructor { final String value; public ClassWithoutDefaultConstructor(final String value) { this.value = value; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((value == null) ? 0 : value.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final ClassWithoutDefaultConstructor other = (ClassWithoutDefaultConstructor) obj; if (value == null) { if (other.value != null) { return false; } } else if (!value.equals(other.value)) { return false; } return true; } @Override public String toString() { return "ClassWithoutDefaultConstructor [value=" + value + "]"; } } @SuppressWarnings("unused") public static class MyContainer { private int _int; private long _long; private final boolean _boolean; private final Boolean _Boolean; private final Class<?> _Class; private String _String; private final StringBuilder _StringBuilder; private final StringBuffer _StringBuffer; private Long _Long; private Integer _Integer; private Character _Character; private Byte _Byte; private Double _Double; private Float _Float; private Short _Short; private BigDecimal _BigDecimal; private AtomicInteger _AtomicInteger; private AtomicLong _AtomicLong; private MutableInt _MutableInt; private Integer[] _IntegerArray; private Date _Date; private Calendar _Calendar; private final Currency _Currency; private List<String> _ArrayList; private final Set<String> _HashSet; private final Map<String, Integer> _HashMap; private int[] _intArray; private long[] _longArray; private short[] _shortArray; private float[] _floatArray; private double[] _doubleArray; private byte[] _byteArray; private char[] _charArray; private String[] _StringArray; private Person[] _PersonArray; public MyContainer() { _int = 1; _long = 2; _boolean = true; _Boolean = Boolean.TRUE; _Class = String.class; _String = "3"; _StringBuffer = new StringBuffer("foo"); _StringBuilder = new StringBuilder("foo"); _Long = new Long(4); _Integer = new Integer(5); _Character = new Character('c'); _Byte = new Byte("b".getBytes()[0]); _Double = new Double(6d); _Float = new Float(7f); _Short = new Short((short) 8); _BigDecimal = new BigDecimal(9); _AtomicInteger = new AtomicInteger(10); _AtomicLong = new AtomicLong(11); _MutableInt = new MutableInt(12); _IntegerArray = new Integer[] { 13 }; _Date = new Date(System.currentTimeMillis() - 10000); _Calendar = Calendar.getInstance(); _Currency = Currency.getInstance("EUR"); _ArrayList = new ArrayList<String>(Arrays.asList("foo")); _HashSet = new HashSet<String>(); _HashSet.add("14"); _HashMap = new HashMap<String, Integer>(); _HashMap.put("foo", 23); _HashMap.put("bar", 42); _intArray = new int[] { 1, 2 }; _longArray = new long[] { 1, 2 }; _shortArray = new short[] { 1, 2 }; _floatArray = new float[] { 1, 2 }; _doubleArray = new double[] { 1, 2 }; _byteArray = "42".getBytes(); _charArray = "42".toCharArray(); _StringArray = new String[] { "23", "42" }; _PersonArray = new Person[] { createPerson("foo bar", Gender.MALE, 42) }; } public int getInt() { return _int; } public void setInt(final int i) { _int = i; } public long getLong() { return _long; } public void setLong(final long l) { _long = l; } public String getString() { return _String; } public void setString(final String string) { _String = string; } public Long getLongWrapper() { return _Long; } public void setLongWrapper(final Long l) { _Long = l; } public Integer getInteger() { return _Integer; } public void setInteger(final Integer integer) { _Integer = integer; } public Character getCharacter() { return _Character; } public void setCharacter(final Character character) { _Character = character; } public Byte getByte() { return _Byte; } public void setByte(final Byte b) { _Byte = b; } public Double getDouble() { return _Double; } public void setDouble(final Double d) { _Double = d; } public Float getFloat() { return _Float; } public void setFloat(final Float f) { _Float = f; } public Short getShort() { return _Short; } public void setShort(final Short s) { _Short = s; } public BigDecimal getBigDecimal() { return _BigDecimal; } public void setBigDecimal(final BigDecimal bigDecimal) { _BigDecimal = bigDecimal; } public AtomicInteger getAtomicInteger() { return _AtomicInteger; } public void setAtomicInteger(final AtomicInteger atomicInteger) { _AtomicInteger = atomicInteger; } public AtomicLong getAtomicLong() { return _AtomicLong; } public void setAtomicLong(final AtomicLong atomicLong) { _AtomicLong = atomicLong; } public MutableInt getMutableInt() { return _MutableInt; } public void setMutableInt(final MutableInt mutableInt) { _MutableInt = mutableInt; } public Integer[] getIntegerArray() { return _IntegerArray; } public void setIntegerArray(final Integer[] integerArray) { _IntegerArray = integerArray; } public Date getDate() { return _Date; } public void setDate(final Date date) { _Date = date; } public Calendar getCalendar() { return _Calendar; } public void setCalendar(final Calendar calendar) { _Calendar = calendar; } public List<String> getArrayList() { return _ArrayList; } public void setArrayList(final List<String> arrayList) { _ArrayList = arrayList; } public int[] getIntArray() { return _intArray; } public void setIntArray(final int[] intArray) { _intArray = intArray; } public long[] getLongArray() { return _longArray; } public void setLongArray(final long[] longArray) { _longArray = longArray; } public short[] getShortArray() { return _shortArray; } public void setShortArray(final short[] shortArray) { _shortArray = shortArray; } public float[] getFloatArray() { return _floatArray; } public void setFloatArray(final float[] floatArray) { _floatArray = floatArray; } public double[] getDoubleArray() { return _doubleArray; } public void setDoubleArray(final double[] doubleArray) { _doubleArray = doubleArray; } public byte[] getByteArray() { return _byteArray; } public void setByteArray(final byte[] byteArray) { _byteArray = byteArray; } public char[] getCharArray() { return _charArray; } public void setCharArray(final char[] charArray) { _charArray = charArray; } public String[] getStringArray() { return _StringArray; } public void setStringArray(final String[] stringArray) { _StringArray = stringArray; } public Person[] getPersonArray() { return _PersonArray; } public void setPersonArray(final Person[] personArray) { _PersonArray = personArray; } public Set<String> getHashSet() { return _HashSet; } public Map<String, Integer> getHashMap() { return _HashMap; } } static class Holder<T> { T item; /** * Default constructor, added for kryo... */ public Holder() { } public Holder(final T item) { this.item = item; } } static class HolderList<T> { List<Holder<T>> holders; public HolderList(final List<Holder<T>> holders) { this.holders = holders; } } static class CounterHolder { AtomicInteger item; public CounterHolder(final AtomicInteger item) { this.item = item; } } static class CounterHolderArray { CounterHolder[] holders; public CounterHolderArray(final CounterHolder... holders) { this.holders = holders; } } static class HolderArray<T> { Holder<T>[] holders; public HolderArray(final Holder<T>... holders) { this.holders = holders; } } public static class HashMapWithIntConstructorOnly extends HashMap<Object, Object> { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") private HashMapWithIntConstructorOnly() { } public HashMapWithIntConstructorOnly(final int size) { super(size); } } }