CrestCache.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.sf.l2j.gameserver.cache;
  16. import java.io.File;
  17. import java.io.FileFilter;
  18. import java.io.FileOutputStream;
  19. import java.io.IOException;
  20. import java.io.RandomAccessFile;
  21. import java.sql.PreparedStatement;
  22. import java.sql.SQLException;
  23. import java.util.logging.Level;
  24. import java.util.logging.Logger;
  25. import javolution.util.FastMap;
  26. import net.sf.l2j.Config;
  27. import net.sf.l2j.L2DatabaseFactory;
  28. import net.sf.l2j.gameserver.datatables.ClanTable;
  29. import net.sf.l2j.gameserver.idfactory.IdFactory;
  30. import net.sf.l2j.gameserver.model.L2Clan;
  31. /**
  32. * @author Layane
  33. *
  34. */
  35. public class CrestCache
  36. {
  37. private static Logger _log = Logger.getLogger(CrestCache.class.getName());
  38. private static CrestCache _instance;
  39. private FastMRUCache<Integer, byte[]> _cachePledge = new FastMRUCache<Integer, byte[]>();
  40. private FastMRUCache<Integer, byte[]> _cachePledgeLarge = new FastMRUCache<Integer, byte[]>();
  41. private FastMRUCache<Integer, byte[]> _cacheAlly = new FastMRUCache<Integer, byte[]>();
  42. private int _loadedFiles;
  43. private long _bytesBuffLen;
  44. public static CrestCache getInstance()
  45. {
  46. if (_instance == null)
  47. {
  48. _instance = new CrestCache();
  49. }
  50. return _instance;
  51. }
  52. public CrestCache()
  53. {
  54. convertOldPedgeFiles();
  55. reload();
  56. }
  57. public void reload()
  58. {
  59. FileFilter filter = new BmpFilter();
  60. File dir = new File(Config.DATAPACK_ROOT, "data/crests/");
  61. File[] files = dir.listFiles(filter);
  62. byte[] content;
  63. synchronized (this)
  64. {
  65. _loadedFiles = 0;
  66. _bytesBuffLen = 0;
  67. _cachePledge.clear();
  68. _cachePledgeLarge.clear();
  69. _cacheAlly.clear();
  70. }
  71. FastMap<Integer, byte[]> _mapPledge = _cachePledge.getContentMap();
  72. FastMap<Integer, byte[]> _mapPledgeLarge = _cachePledgeLarge.getContentMap();
  73. FastMap<Integer, byte[]> _mapAlly = _cacheAlly.getContentMap();
  74. for (File file : files)
  75. {
  76. RandomAccessFile f = null;
  77. synchronized (this)
  78. {
  79. try
  80. {
  81. f = new RandomAccessFile(file, "r");
  82. content = new byte[(int) f.length()];
  83. f.readFully(content);
  84. if (file.getName().startsWith("Crest_Large_"))
  85. {
  86. _mapPledgeLarge.put(Integer.valueOf(file.getName().substring(12, file.getName().length() - 4)), content);
  87. }
  88. else if (file.getName().startsWith("Crest_"))
  89. {
  90. _mapPledge.put(Integer.valueOf(file.getName().substring(6, file.getName().length() - 4)), content);
  91. }
  92. else if (file.getName().startsWith("AllyCrest_"))
  93. {
  94. _mapAlly.put(Integer.valueOf(file.getName().substring(10, file.getName().length() - 4)), content);
  95. }
  96. _loadedFiles++;
  97. _bytesBuffLen += content.length;
  98. }
  99. catch (Exception e)
  100. {
  101. _log.warning("problem with crest bmp file " + e);
  102. }
  103. finally
  104. {
  105. try
  106. {
  107. f.close();
  108. }
  109. catch (Exception e1)
  110. {
  111. }
  112. }
  113. }
  114. }
  115. _log.info("Cache[Crest]: " + String.format("%.3f", getMemoryUsage()) + "MB on " + getLoadedFiles() + " files loaded. (Forget Time: " + (_cachePledge.getForgetTime() / 1000) + "s , Capacity: " + _cachePledge.capacity() + ")");
  116. }
  117. public void convertOldPedgeFiles()
  118. {
  119. File dir = new File(Config.DATAPACK_ROOT, "data/crests/");
  120. File[] files = dir.listFiles(new OldPledgeFilter());
  121. for (File file : files)
  122. {
  123. int clanId = Integer.parseInt(file.getName().substring(7, file.getName().length() - 4));
  124. _log.info("Found old crest file \"" + file.getName() + "\" for clanId " + clanId);
  125. int newId = IdFactory.getInstance().getNextId();
  126. L2Clan clan = ClanTable.getInstance().getClan(clanId);
  127. if (clan != null)
  128. {
  129. removeOldPledgeCrest(clan.getCrestId());
  130. file.renameTo(new File(Config.DATAPACK_ROOT, "data/crests/Crest_" + newId + ".bmp"));
  131. _log.info("Renamed Clan crest to new format: Crest_" + newId + ".bmp");
  132. java.sql.Connection con = null;
  133. try
  134. {
  135. con = L2DatabaseFactory.getInstance().getConnection();
  136. PreparedStatement statement = con.prepareStatement("UPDATE clan_data SET crest_id = ? WHERE clan_id = ?");
  137. statement.setInt(1, newId);
  138. statement.setInt(2, clan.getClanId());
  139. statement.executeUpdate();
  140. statement.close();
  141. }
  142. catch (SQLException e)
  143. {
  144. _log.warning("could not update the crest id:" + e.getMessage());
  145. }
  146. finally
  147. {
  148. try
  149. {
  150. con.close();
  151. }
  152. catch (Exception e)
  153. {
  154. }
  155. }
  156. clan.setCrestId(newId);
  157. clan.setHasCrest(true);
  158. }
  159. else
  160. {
  161. _log.info("Clan Id: " + clanId + " does not exist in table.. deleting.");
  162. file.delete();
  163. }
  164. }
  165. }
  166. public float getMemoryUsage()
  167. {
  168. return ((float) _bytesBuffLen / 1048576);
  169. }
  170. public int getLoadedFiles()
  171. {
  172. return _loadedFiles;
  173. }
  174. public byte[] getPledgeCrest(int id)
  175. {
  176. return _cachePledge.get(id);
  177. }
  178. public byte[] getPledgeCrestLarge(int id)
  179. {
  180. return _cachePledgeLarge.get(id);
  181. }
  182. public byte[] getAllyCrest(int id)
  183. {
  184. return _cacheAlly.get(id);
  185. }
  186. public void removePledgeCrest(int id)
  187. {
  188. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_" + id + ".bmp");
  189. _cachePledge.remove(id);
  190. try
  191. {
  192. crestFile.delete();
  193. }
  194. catch (Exception e)
  195. {
  196. }
  197. }
  198. public void removePledgeCrestLarge(int id)
  199. {
  200. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_Large_" + id + ".bmp");
  201. _cachePledgeLarge.remove(id);
  202. try
  203. {
  204. crestFile.delete();
  205. }
  206. catch (Exception e)
  207. {
  208. }
  209. }
  210. public void removeOldPledgeCrest(int id)
  211. {
  212. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Pledge_" + id + ".bmp");
  213. try
  214. {
  215. crestFile.delete();
  216. }
  217. catch (Exception e)
  218. {
  219. }
  220. }
  221. public void removeAllyCrest(int id)
  222. {
  223. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/AllyCrest_" + id + ".bmp");
  224. _cacheAlly.remove(id);
  225. try
  226. {
  227. crestFile.delete();
  228. }
  229. catch (Exception e)
  230. {
  231. }
  232. }
  233. public boolean savePledgeCrest(int newId, byte[] data)
  234. {
  235. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_" + newId + ".bmp");
  236. try
  237. {
  238. FileOutputStream out = new FileOutputStream(crestFile);
  239. out.write(data);
  240. out.close();
  241. _cachePledge.getContentMap().put(newId, data);
  242. return true;
  243. }
  244. catch (IOException e)
  245. {
  246. _log.log(Level.INFO, "Error saving pledge crest" + crestFile + ":", e);
  247. return false;
  248. }
  249. }
  250. public boolean savePledgeCrestLarge(int newId, byte[] data)
  251. {
  252. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/Crest_Large_" + newId + ".bmp");
  253. try
  254. {
  255. FileOutputStream out = new FileOutputStream(crestFile);
  256. out.write(data);
  257. out.close();
  258. _cachePledgeLarge.getContentMap().put(newId, data);
  259. return true;
  260. }
  261. catch (IOException e)
  262. {
  263. _log.log(Level.INFO, "Error saving Large pledge crest" + crestFile + ":", e);
  264. return false;
  265. }
  266. }
  267. public boolean saveAllyCrest(int newId, byte[] data)
  268. {
  269. File crestFile = new File(Config.DATAPACK_ROOT, "data/crests/AllyCrest_" + newId + ".bmp");
  270. try
  271. {
  272. FileOutputStream out = new FileOutputStream(crestFile);
  273. out.write(data);
  274. out.close();
  275. _cacheAlly.getContentMap().put(newId, data);
  276. return true;
  277. }
  278. catch (IOException e)
  279. {
  280. _log.log(Level.INFO, "Error saving ally crest" + crestFile + ":", e);
  281. return false;
  282. }
  283. }
  284. class BmpFilter implements FileFilter
  285. {
  286. public boolean accept(File file)
  287. {
  288. return (file.getName().endsWith(".bmp"));
  289. }
  290. }
  291. class OldPledgeFilter implements FileFilter
  292. {
  293. public boolean accept(File file)
  294. {
  295. return (file.getName().startsWith("Pledge_"));
  296. }
  297. }
  298. }