package org.limewire.net.address; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; import org.limewire.io.Address; import org.limewire.logging.Log; import org.limewire.logging.LogFactory; import com.google.inject.Singleton; @Singleton public class AddressFactoryImpl implements AddressFactory { private static final Log LOG = LogFactory.getLog(AddressFactoryImpl.class); private final ConcurrentHashMap<String, AddressSerializer> serializerTypeMap = new ConcurrentHashMap<String, AddressSerializer>(); public void registerSerializer(AddressSerializer serializer) { LOG.debugf("adding serializer: {0}", serializer); serializerTypeMap.put(serializer.getAddressType(), serializer); } @Override public AddressSerializer getSerializer(Address address) { for (AddressSerializer serializer : serializerTypeMap.values()) { if (serializer.canSerialize(address)) { return serializer; } } throw new IllegalArgumentException("no serializer available for: " + address); } @Override public AddressSerializer getSerializer(String addressType) { return serializerTypeMap.get(addressType); } @Override public Address deserialize(String type, byte[] serializedAddress) throws IOException { AddressSerializer serializer = serializerTypeMap.get(type); if(serializer != null) { return serializer.deserialize(serializedAddress); } throw new IOException("unknown message type: " + type); } @Override public Address deserialize(String address) throws IOException { for(AddressSerializer serializer : serializerTypeMap.values()) { try { return serializer.deserialize(address); } catch (IOException ioe) { } } throw new IOException(); } }