package org.reunionemu.jreunion.proxy.parser;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.reunionemu.jreunion.server.packets.Packet;
import org.reunionemu.jreunion.server.parser.Parseable;
public class Parser {
private HashMap<Pattern, Parseable<?>> handlers = new HashMap<Pattern, Parseable<?>>();
public Parser() {
}
public HashMap<Pattern, Parseable<?>> getHandlers(){
return handlers;
}
public void register(Parseable<?> handler){
synchronized(handlers){
unregister(handler);
for(Pattern pattern: handler.getPatterns()){
handlers.put(pattern, handler);
}
}
}
public void unregister(Parseable<?> handler){
synchronized(handlers){
while (handlers.values().remove(handler));
}
}
public List<Packet> parse(String line) {
List<Packet> results = new LinkedList<Packet>();
synchronized(handlers){
for(Entry<Pattern, Parseable<?>> entry : handlers.entrySet()){
Pattern pattern = entry.getKey();
Matcher matcher = pattern.matcher(line);
if(matcher.matches()){
Parseable<?> handler = entry.getValue();
Packet packet = handler.parse(matcher);
if(packet!=null){
results.add(packet);
}
}
}
}
return results;
}
}