322 lines
8.2 KiB
Java
322 lines
8.2 KiB
Java
/*
|
|
* This program is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package com.l2jserver.gameserver.cache;
|
|
|
|
import java.io.File;
|
|
import java.io.FileFilter;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.RandomAccessFile;
|
|
import java.sql.Connection;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.SQLException;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import javolution.util.FastMap;
|
|
|
|
import com.l2jserver.Config;
|
|
import com.l2jserver.L2DatabaseFactory;
|
|
import com.l2jserver.gameserver.datatables.ClanTable;
|
|
import com.l2jserver.gameserver.idfactory.IdFactory;
|
|
import com.l2jserver.gameserver.model.L2Clan;
|
|
|
|
/**
|
|
* @author Layane
|
|
*/
|
|
public class CrestCache
|
|
{
|
|
private static Logger _log = Logger.getLogger(CrestCache.class.getName());
|
|
|
|
private final FastMRUCache<Integer, byte[]> _cachePledge = new FastMRUCache<>();
|
|
|
|
private final FastMRUCache<Integer, byte[]> _cachePledgeLarge = new FastMRUCache<>();
|
|
|
|
private final FastMRUCache<Integer, byte[]> _cacheAlly = new FastMRUCache<>();
|
|
|
|
private int _loadedFiles;
|
|
|
|
private long _bytesBuffLen;
|
|
|
|
public static CrestCache getInstance()
|
|
{
|
|
return SingletonHolder._instance;
|
|
}
|
|
|
|
private CrestCache()
|
|
{
|
|
convertOldPedgeFiles();
|
|
reload();
|
|
}
|
|
|
|
public void reload()
|
|
{
|
|
FileFilter filter = new BmpFilter();
|
|
|
|
File dir = new File(Config.DATAPACK_ROOT, "data/crests/");
|
|
|
|
File[] files = dir.listFiles(filter);
|
|
byte[] content;
|
|
synchronized (this)
|
|
{
|
|
_loadedFiles = 0;
|
|
_bytesBuffLen = 0;
|
|
|
|
_cachePledge.clear();
|
|
_cachePledgeLarge.clear();
|
|
_cacheAlly.clear();
|
|
}
|
|
|
|
FastMap<Integer, byte[]> _mapPledge = _cachePledge.getContentMap();
|
|
FastMap<Integer, byte[]> _mapPledgeLarge = _cachePledgeLarge.getContentMap();
|
|
FastMap<Integer, byte[]> _mapAlly = _cacheAlly.getContentMap();
|
|
|
|
for (File file : files)
|
|
{
|
|
|
|
synchronized (this)
|
|
{
|
|
try (RandomAccessFile f = new RandomAccessFile(file, "r"))
|
|
{
|
|
content = new byte[(int) f.length()];
|
|
f.readFully(content);
|
|
|
|
if (file.getName().startsWith("Crest_Large_"))
|
|
{
|
|
_mapPledgeLarge.put(Integer.valueOf(file.getName().substring(12, file.getName().length() - 4)), content);
|
|
}
|
|
else if (file.getName().startsWith("Crest_"))
|
|
{
|
|
_mapPledge.put(Integer.valueOf(file.getName().substring(6, file.getName().length() - 4)), content);
|
|
}
|
|
else if (file.getName().startsWith("AllyCrest_"))
|
|
{
|
|
_mapAlly.put(Integer.valueOf(file.getName().substring(10, file.getName().length() - 4)), content);
|
|
}
|
|
_loadedFiles++;
|
|
_bytesBuffLen += content.length;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_log.log(Level.WARNING, "Problem with crest bmp file " + e.getMessage(), e);
|
|
}
|
|
}
|
|
}
|
|
|
|
_log.info("Cache[Crest]: " + String.format("%.3f", getMemoryUsage()) + "MB on " + getLoadedFiles() + " files loaded. (Forget Time: " + (_cachePledge.getForgetTime() / 1000) + "s , Capacity: " + _cachePledge.capacity() + ")");
|
|
}
|
|
|
|
public void convertOldPedgeFiles()
|
|
{
|
|
File dir = new File(Config.DATAPACK_ROOT, "data/crests/");
|
|
|
|
File[] files = dir.listFiles(new OldPledgeFilter());
|
|
|
|
for (File file : files)
|
|
{
|
|
int clanId = Integer.parseInt(file.getName().substring(7, file.getName().length() - 4));
|
|
|
|
_log.info("Found old crest file \"" + file.getName() + "\" for clanId " + clanId);
|
|
|
|
int newId = IdFactory.getInstance().getNextId();
|
|
|
|
L2Clan clan = ClanTable.getInstance().getClan(clanId);
|
|
|
|
if (clan != null)
|
|
{
|
|
removeOldPledgeCrest(clan.getCrestId());
|
|
|
|
file.renameTo(new File(Config.DATAPACK_ROOT, "data/crests/Crest_" + newId + ".bmp"));
|
|
_log.info("Renamed Clan crest to new format: Crest_" + newId + ".bmp");
|
|
|
|
Connection con = null;
|
|
|
|
try
|
|
{
|
|
con = L2DatabaseFactory.getInstance().getConnection();
|
|
PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET crest_id = ? WHERE clan_id = ?");
|
|
statement.setInt(1, newId);
|
|
statement.setInt(2, clan.getClanId());
|
|
statement.executeUpdate();
|
|
statement.close();
|
|
}
|
|
catch (SQLException e)
|
|
{
|
|
_log.log(Level.WARNING, "Could not update the crest id:" + e.getMessage(), e);
|
|
}
|
|
finally
|
|
{
|
|
L2DatabaseFactory.close(con);
|
|
}
|
|
|
|
clan.setCrestId(newId);
|
|
}
|
|
else
|
|
{
|
|
_log.info("Clan Id: " + clanId + " does not exist in table.. deleting.");
|
|
file.delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
public float getMemoryUsage()
|
|
{
|
|
return ((float) _bytesBuffLen / 1048576);
|
|
}
|
|
|
|
public int getLoadedFiles()
|
|
{
|
|
return _loadedFiles;
|
|
}
|
|
|
|
public byte[] getPledgeCrest(int id)
|
|
{
|
|
return _cachePledge.get(id);
|
|
}
|
|
|
|
public byte[] getPledgeCrestLarge(int id)
|
|
{
|
|
return _cachePledgeLarge.get(id);
|
|
}
|
|
|
|
public byte[] getAllyCrest(int id)
|
|
{
|
|
return _cacheAlly.get(id);
|
|
}
|
|
|
|
public void removePledgeCrest(int id)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_" + id + ".bmp");
|
|
_cachePledge.remove(id);
|
|
try
|
|
{
|
|
crestFile.delete();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
}
|
|
}
|
|
|
|
public void removePledgeCrestLarge(int id)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_Large_" + id + ".bmp");
|
|
_cachePledgeLarge.remove(id);
|
|
try
|
|
{
|
|
crestFile.delete();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
}
|
|
}
|
|
|
|
public void removeOldPledgeCrest(int id)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Pledge_" + id + ".bmp");
|
|
try
|
|
{
|
|
crestFile.delete();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
}
|
|
}
|
|
|
|
public void removeAllyCrest(int id)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/AllyCrest_" + id + ".bmp");
|
|
_cacheAlly.remove(id);
|
|
try
|
|
{
|
|
crestFile.delete();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
}
|
|
}
|
|
|
|
public boolean savePledgeCrest(int newId, byte[] data)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_" + newId + ".bmp");
|
|
try (FileOutputStream out = new FileOutputStream(crestFile))
|
|
{
|
|
out.write(data);
|
|
_cachePledge.getContentMap().put(newId, data);
|
|
return true;
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
_log.log(Level.INFO, "Error saving pledge crest" + crestFile + ":", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public boolean savePledgeCrestLarge(int newId, byte[] data)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_Large_" + newId + ".bmp");
|
|
try (FileOutputStream out = new FileOutputStream(crestFile))
|
|
{
|
|
out.write(data);
|
|
_cachePledgeLarge.getContentMap().put(newId, data);
|
|
return true;
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
_log.log(Level.INFO, "Error saving Large pledge crest" + crestFile + ":", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public boolean saveAllyCrest(int newId, byte[] data)
|
|
{
|
|
File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/AllyCrest_" + newId + ".bmp");
|
|
try (FileOutputStream out = new FileOutputStream(crestFile))
|
|
{
|
|
out.write(data);
|
|
_cacheAlly.getContentMap().put(newId, data);
|
|
return true;
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
_log.log(Level.INFO, "Error saving ally crest" + crestFile + ":", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
protected static class BmpFilter implements FileFilter
|
|
{
|
|
@Override
|
|
public boolean accept(File file)
|
|
{
|
|
return (file.getName().endsWith(".bmp"));
|
|
}
|
|
}
|
|
|
|
protected static class OldPledgeFilter implements FileFilter
|
|
{
|
|
@Override
|
|
public boolean accept(File file)
|
|
{
|
|
return (file.getName().startsWith("Pledge_"));
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("synthetic-access")
|
|
private static class SingletonHolder
|
|
{
|
|
protected static final CrestCache _instance = new CrestCache();
|
|
}
|
|
}
|