/*
 * Copyright 2015 the original author or authors.
 *
 * 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 io.atomix.catalyst.serializer;

import io.atomix.catalyst.buffer.Buffer;
import io.atomix.catalyst.serializer.collection.ArrayListSerializer;
import io.atomix.catalyst.serializer.collection.HashMapSerializer;
import io.atomix.catalyst.serializer.collection.HashSetSerializer;
import io.atomix.catalyst.serializer.collection.MapEntrySerializer;
import io.atomix.catalyst.serializer.util.*;

import java.io.Externalizable;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

/**
 * JDK utilities type resolver.
 *
 * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
 */
public class JdkTypeResolver implements SerializableTypeResolver {
  @SuppressWarnings("unchecked")
  private static final Map<Class<?>, Class<? extends TypeSerializer<?>>> SERIALIZERS = new LinkedHashMap() {{
    put(BigInteger.class, BigIntegerSerializer.class);
    put(BigDecimal.class, BigDecimalSerializer.class);
    put(Date.class, DateSerializer.class);
    put(HashMap.class, HashMapSerializer.class);
    put(HashSet.class, HashSetSerializer.class);
    put(ArrayList.class, ArrayListSerializer.class);
    put(Buffer.class, BufferSerializer.class);
  }};

  @SuppressWarnings("unchecked")
  private static final Map<Class<?>, Class<? extends TypeSerializer<?>>> ABSTRACT_SERIALIZERS = new LinkedHashMap() {{
    put(Calendar.class, CalendarSerializer.class);
    put(TimeZone.class, TimeZoneSerializer.class);
    put(Map.Entry.class, MapEntrySerializer.class);
  }};

  @SuppressWarnings("unchecked")
  private static final Map<Class<?>, Class<? extends TypeSerializer<?>>> DEFAULT_SERIALIZERS = new LinkedHashMap() {{
    put(Serializable.class, JavaSerializableSerializer.class);
    put(Externalizable.class, ExternalizableSerializer.class);
    put(CatalystSerializable.class, CatalystSerializableSerializer.class);
  }};

  @Override
  public void resolve(SerializerRegistry registry) {
    int i = 176;
    for (Map.Entry<Class<?>, Class<? extends TypeSerializer<?>>> entry : SERIALIZERS.entrySet()) {
      registry.register(entry.getKey(), i++, entry.getValue());
    }

    i = 190;
    for (Map.Entry<Class<?>, Class<? extends TypeSerializer<?>>> entry : ABSTRACT_SERIALIZERS.entrySet()) {
      registry.registerAbstract(entry.getKey(), i++, entry.getValue());
    }

    for (Map.Entry<Class<?>, Class<? extends TypeSerializer<?>>> entry : DEFAULT_SERIALIZERS.entrySet()) {
      registry.registerDefault(entry.getKey(), entry.getValue());
    }
  }

}

/*
 * Copyright 2015 the original author or authors.
 *
 * 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 io.atomix.catalyst.serializer;

import io.atomix.catalyst.buffer.Buffer;
import io.atomix.catalyst.serializer.collection.ArrayListSerializer;
import io.atomix.catalyst.serializer.collection.HashMapSerializer;
import io.atomix.catalyst.serializer.collection.HashSetSerializer;
import io.atomix.catalyst.serializer.collection.MapEntrySerializer;
import io.atomix.catalyst.serializer.util.*;

import java.io.Externalizable;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

/**
 * JDK utilities type resolver.
 *
 * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
 */
public class JdkTypeResolver implements SerializableTypeResolver {
  @SuppressWarnings("unchecked")
  private static final Map<Class<?>, Class<? extends TypeSerializer<?>>> SERIALIZERS = new LinkedHashMap() {{
    put(BigInteger.class, BigIntegerSerializer.class);
    put(BigDecimal.class, BigDecimalSerializer.class);
    put(Date.class, DateSerializer.class);
    put(HashMap.class, HashMapSerializer.class);
    put(HashSet.class, HashSetSerializer.class);
    put(ArrayList.class, ArrayListSerializer.class);
  }};

  @SuppressWarnings("unchecked")
  private static final Map<Class<?>, Class<? extends TypeSerializer<?>>> ABSTRACT_SERIALIZERS = new LinkedHashMap() {{
    put(Buffer.class, BufferSerializer.class);
    put(Calendar.class, CalendarSerializer.class);
    put(TimeZone.class, TimeZoneSerializer.class);
    put(Map.Entry.class, MapEntrySerializer.class);
  }};

  @SuppressWarnings("unchecked")
  private static final Map<Class<?>, Class<? extends TypeSerializer<?>>> DEFAULT_SERIALIZERS = new LinkedHashMap() {{
    put(Serializable.class, JavaSerializableSerializer.class);
    put(Externalizable.class, ExternalizableSerializer.class);
    put(CatalystSerializable.class, CatalystSerializableSerializer.class);
  }};

  @Override
  public void resolve(SerializerRegistry registry) {
    int i = 176;
    for (Map.Entry<Class<?>, Class<? extends TypeSerializer<?>>> entry : SERIALIZERS.entrySet()) {
      registry.register(entry.getKey(), i++, entry.getValue());
    }

    i = 190;
    for (Map.Entry<Class<?>, Class<? extends TypeSerializer<?>>> entry : ABSTRACT_SERIALIZERS.entrySet()) {
      registry.registerAbstract(entry.getKey(), i++, entry.getValue());
    }

    for (Map.Entry<Class<?>, Class<? extends TypeSerializer<?>>> entry : DEFAULT_SERIALIZERS.entrySet()) {
      registry.registerDefault(entry.getKey(), entry.getValue());
    }
  }

}

Make Buffer serializer abstract.