package com.aionemu.packetsamurai.protocol;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import javolution.util.FastMap;
import javolution.util.FastSet;
import com.aionemu.packetsamurai.PacketSamurai;
import com.aionemu.packetsamurai.gui.ChoiceDialog;
public class ProtocolManager
{
private Map<Integer, Set<Protocol>> _protocolsByPort;
private Map<String, Protocol> _protocolsByName;
private String _protocolsDir;
private static class SingletonHolder
{
private final static ProtocolManager singleton = new ProtocolManager(PacketSamurai.getConfigProperty("protocols","./protocols"));
}
public static ProtocolManager getInstance()
{
return SingletonHolder.singleton;
}
private ProtocolManager(String protocolsDir)
{
_protocolsDir = protocolsDir;
_protocolsByPort = new FastMap<Integer, Set<Protocol>>();
_protocolsByName = new FastMap<String, Protocol>();
loadProtocols();
}
public Set<Protocol> getProtocolForPort(int port)
{
if(!_protocolsByPort.containsKey(port))
PacketSamurai.getUserInterface().log("ProtocolManager : Warning : can not find protocol for port "+port);
return _protocolsByPort.get(port);
}
public Protocol getProtocolByName(String name)
{
if(!_protocolsByName.containsKey(name))
PacketSamurai.getUserInterface().log("ProtocolManager : Warning : can not find protocol for name "+name);
return _protocolsByName.get(name);
}
public Map<Integer, Set<Protocol>> getProtocolsByPort()
{
return _protocolsByPort;
}
public Set<Integer> getAvailablePorts()
{
return _protocolsByPort.keySet();
}
public String getProtocolsDirectory()
{
return _protocolsDir;
}
public Collection<Protocol> getProtocols()
{
return _protocolsByName.values();
}
public void loadProtocols()
{
_protocolsByPort.clear();
_protocolsByName.clear();
File dir = new File(_protocolsDir);
if(!dir.isDirectory())
{
PacketSamurai.getUserInterface().log("Invalid Protocols directory ("+_protocolsDir+")");
return;
}
File[] files = dir.listFiles(new FilenameFilter(){
public boolean accept(File dir, String name)
{
if(name.endsWith(".xml"))
return true;
return false;
}
});
for (File f : files)
{
Protocol p = new Protocol(_protocolsDir+"/"+f.getName());
if (p.isLoaded())
{
PacketSamurai.getUserInterface().log("Loaded protocol ["+p.getName()+"] from ("+f.getName()+")");
Set<Protocol> protocols = _protocolsByPort.get(p.getPort());
if(protocols == null)
{
protocols = new FastSet<Protocol>();
_protocolsByPort.put(p.getPort(), protocols);
}
protocols.add(p);
if(_protocolsByName.put(p.getName(),p) != null)
{
PacketSamurai.getUserInterface().log("ProtocolManager : Warning : there is more than one protocol for the name "+p.getName()+" only the last one will be available through getProtocolByName.");
}
}
}
}
public static Protocol promptUserToChoose(String msg)
{
return ProtocolManager.promptUserToChoose(ProtocolManager.getInstance().getProtocols(), msg);
}
public static Protocol promptUserToChoose(Collection<Protocol> protos, String msg)
{
Protocol[] prots = protos.toArray(new Protocol[protos.size()]);
if (!protos.isEmpty())
{
String[][] choices = new String[1][prots.length];
for (int i = 0; i < prots.length; i++)
{
choices[0][i] = prots[i].getName();
}
int[] ret = ChoiceDialog.choiceDialog(msg, new String[]{"Protocol"}, choices);
if (ret != null)
{
return prots[ret[0]];
}
}
return null;
}
}