/* * Copyright (c) 2008-2012, Hazel Bilisim Ltd. All Rights Reserved. * * 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.hazelcast.nio; import com.hazelcast.core.HazelcastInstanceAware; import com.hazelcast.core.PartitionAware; import com.hazelcast.impl.ThreadContext; import java.io.IOException; public final class Serializer extends AbstractSerializer { private static final byte SERIALIZER_TYPE_DATA = 0; public Serializer() { super(new DataSerializer(), new DefaultSerializer()); } public static Object newInstance(final Class klass) throws Exception { return AbstractSerializer.newInstance(klass); } public static Class<?> loadClass(final String className) throws ClassNotFoundException { return AbstractSerializer.loadClass(className); } public static Class<?> loadClass(final ClassLoader classLoader, final String className) throws ClassNotFoundException { return AbstractSerializer.loadClass(classLoader, className); } public Data writeObject(final Object obj) { if (obj == null) { return null; } if (obj instanceof Data) { return (Data) obj; } byte[] bytes = toByteArray(obj); if (bytes == null) { return null; } else { Data data = new Data(bytes); if (obj instanceof PartitionAware) { Data partitionKey = writeObject(((PartitionAware) obj).getPartitionKey()); int partitionHash = (partitionKey == null) ? -1 : partitionKey.getPartitionHash(); data.setPartitionHash(partitionHash); } return data; } } public Object readObject(final Data data) { if ((data == null) || (data.buffer == null) || (data.buffer.length == 0)) { return null; } byte[] byteArray = data.buffer; final Object obj = toObject(byteArray); if (obj instanceof HazelcastInstanceAware) { ((HazelcastInstanceAware) obj).setHazelcastInstance(ThreadContext.get().getCurrentFactory()); } return obj; } public static class DataSerializer implements TypeSerializer<DataSerializable> { public final int priority() { return 0; } public final boolean isSuitable(final Object obj) { return obj instanceof DataSerializable; } public final byte getTypeId() { return SERIALIZER_TYPE_DATA; } protected Class loadClass(final String className) throws ClassNotFoundException { return AbstractSerializer.loadClass(className); } protected String toClassName(final Object obj) throws ClassNotFoundException { return obj.getClass().getName(); } public final DataSerializable read(final FastByteArrayInputStream bbis) throws Exception { final String className = bbis.readUTF(); try { final DataSerializable ds = (DataSerializable) newInstance(loadClass(className)); ds.readData(bbis); return ds; } catch (final Exception e) { throw new IOException("Problem reading DataSerializable class : " + className + ", exception: " + e); } } public final void write(final FastByteArrayOutputStream bbos, final DataSerializable obj) throws Exception { bbos.writeUTF(toClassName(obj)); obj.writeData(bbos); } } }