package org.limewire.promotion.containers; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.limewire.io.BadGGEPBlockException; import org.limewire.io.GGEP; public class MessageContainerParser { private static Set<MessageContainer> parsers = new HashSet<MessageContainer>(); static { addParser(new SignedMessageContainer()); addParser(new MultiMessageContainer()); addParser(new PromotionMessageContainer()); addParser(new BucketMessageContainer()); } /** * Pass an instance of a message container, and it will be added to the * static list of parsers. This should only be needed when you are creating * mock containers for unit tests. Otherwise your container should be * officially added to this class's static constructor. */ public static void addParser(MessageContainer containerType) { parsers.add(containerType); } /** * @return a message container parsed from the given GGEP, or an exception * if there is a problem parsing the container. */ public MessageContainer parse(GGEP ggepMessage) throws BadGGEPBlockException { byte[] type = ggepMessage.get(MessageContainer.TYPE_KEY); for (MessageContainer container : parsers) { if (Arrays.equals(container.getType(), type)) { // Found a parser type that should handle this GGEP! try { MessageContainer instance = container.getClass().newInstance(); instance.decode(ggepMessage); return instance; } catch (InstantiationException ex) { throw new BadGGEPBlockException("InstantiationException caught." + ex.getMessage()); } catch (IllegalAccessException ex) { throw new BadGGEPBlockException("IllegalAccessException caught." + ex.getMessage()); } } } throw new BadGGEPBlockException("No parsers understood passed in type."); } /** * @return a message container parsed from the given bytes (which should be * a raw GGEP), or an exception if there is a problem parsing the * container */ public MessageContainer parse(byte[] rawMessage) throws BadGGEPBlockException { return parse(new GGEP(rawMessage, 0)); } }