package com.aionemu.packetsamurai.logrepo;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import com.aionemu.packetsamurai.PacketSamurai;
import com.aionemu.packetsamurai.logreaders.AbstractLogReader;
import com.aionemu.packetsamurai.session.Session;
/**
*
* @author Gilles Duboscq
*
*/
public class LogFile
{
private String _name;
private long _size;
private String _format;
private boolean _existsLocally;
private boolean _existsRemotely;
private File _file;
private Session _session;
private boolean _headersLoaded = false;
private boolean _fullyLoaded = false;
private AbstractLogReader _reader;
private String _comments;
private long _remoteBitset;
private String _remoteServerType;
private String _remoteProtocolName;
private long _remoteSessionId;
private int _remoteId;
private String _remoteUploader;
private long _uploadedTime;
public LogFile(File file, boolean remote)
{
this(file.getName(), file.length(), true, remote);
_file = file;
}
public LogFile(String name, long size, boolean local, boolean remote)
{
_name = name;
_size = size;
_existsLocally = local;
_existsRemotely = remote;
_format = _name.substring(_name.lastIndexOf('.')+1);
}
public boolean ensureLocal()
{
if(!_existsLocally && _existsRemotely)
{
RemoteLogRepositoryBackend.getInstance().downLoadFile(this);
}
else if(!_existsRemotely && !_existsLocally)
{
throw new IllegalStateException("This LogFile("+_name+") doesnt exist (neither locally or remotely");
}
return _existsLocally;
}
public boolean ensureRemote()
{
if(_existsLocally && !_existsRemotely)
{
RemoteLogRepositoryBackend.getInstance().upLoadFile(this);
}
else if(!_existsRemotely && !_existsLocally)
{
throw new IllegalStateException("This LogFile("+_name+") doesnt exist (neither locally or remotely");
}
return _existsRemotely;
}
public void setFile(File file)
{
_file = file;
}
public void setLocal(boolean val)
{
if (_file == null)
throw new IllegalStateException("In order to make a logFile local one must first associate it with an local file");
_existsLocally = val;
}
public boolean isLocal()
{
return _existsLocally;
}
public void setRemote(boolean val)
{
_existsRemotely = val;
}
public boolean isRemote()
{
return _existsRemotely;
}
public File getFile()
{
if(!_existsLocally)
{
throw new IllegalStateException("This LogFile is not local can not call getFile on it");
}
else if(_file == null)
{
_file = new File(LogRepository.getInstance().getLogsDir(), _name);
}
return _file;
}
public void loadHeaders()
{
if(!this.isLocal())
throw new IllegalStateException("You can not load the headers of a remote-only file");
if(this.areHeadersLoaded())
return;
_reader = AbstractLogReader.getLogReaderForFile(_file.getAbsolutePath());
if(!_reader.supportsHeaderReading())
{
PacketSamurai.getUserInterface().log("We cant read headers from a file that doesnt support header reading");
}
try
{
_reader.parseHeader();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
Iterator<Session> iter = _reader.getSessions().iterator();
_session = iter.hasNext() ? iter.next() : null;
_headersLoaded = true;
}
public void loadFully()
{
if(this.areHeadersLoaded())
loadHeaders(); // this will throw the appropriate exception if the file is only remote
try
{
_reader.parsePackets();
}
catch (IOException e)
{
e.printStackTrace();
return;
}
_fullyLoaded = true;
}
public String getFormat()
{
return _format;
}
public String getName()
{
return _name;
}
public long getSize()
{
return _size;
}
public Session getSession()
{
return _session;
}
public boolean areHeadersLoaded()
{
return _headersLoaded;
}
public boolean isFullyLoaded()
{
return _fullyLoaded;
}
public void unLoadSessionPackets()
{
if(!this.isFullyLoaded())
return;
_fullyLoaded = false;
_session.unloadPackets();
}
public void checkRemote()
{
}
public String getComments()
{
return _comments == null ? "" : _comments;
}
public long getAnalyserBitSet()
{
if(this.isLocal())
{
this.loadHeaders();
return this.getSession().getAnalyserBitSet();
}
else if(this.isRemote()) // we never know...
{
return _remoteBitset;
}
return 0;
}
public String getServerType()
{
if (this.isLocal())
{
this.loadHeaders();
return this.getSession().getServerType();
}
else if (this.isRemote()) // we never know...
{
return _remoteServerType;
}
return null; //ZOMG!
}
public String getProtocolName()
{
if(this.isLocal())
{
this.loadHeaders();
return this.getSession().getProtocol().getName();
}
else if(this.isRemote()) // we never know...
{
return _remoteProtocolName;
}
return null; //ZOMG!
}
public void setRemoteUploader(String remoteUploader)
{
_remoteUploader = remoteUploader;
}
public String getRemoteUploader()
{
if (this.isRemote())
{
return _remoteUploader;
}
return "";
}
public void setUploadedTime(long timestamp)
{
_uploadedTime = timestamp;
}
public long getUploadedTime()
{
return _uploadedTime;
}
public long getSessionId()
{
if(this.isLocal())
{
this.loadHeaders();
return this.getSession().getSessionId();
}
else if(this.isRemote()) // we never know...
{
return _remoteSessionId;
}
return 0;
}
public void setComments(String comments)
{
_comments = comments;
}
public void setRemoteId(int id)
{
_remoteId = id;
}
public int getRemoteId()
{
return _remoteId;
}
public void setRemoteAnalyserBits(long bits)
{
if(!this.isRemote())
PacketSamurai.getUserInterface().log("We are setting a remote property on a non-remote file. Things are going wrong...");
_remoteBitset = bits;
}
public void setRemoteServertype(String type)
{
if(!this.isRemote())
PacketSamurai.getUserInterface().log("We are setting a remote property on a non-remote file. Things are going wrong...");
_remoteServerType = type;
}
public void setRemoteProtocolName(String name)
{
if(!this.isRemote())
PacketSamurai.getUserInterface().log("We are setting a remote property on a non-remote file. Things are going wrong...");
_remoteProtocolName = name;
}
public void setRemoteSessionId(long id)
{
if(!this.isRemote())
PacketSamurai.getUserInterface().log("We are setting a remote property on a non-remote file. Things are going wrong...");
_remoteSessionId = id;
}
}