Java tutorial
/** * This file is part of Aion-Lightning <aion-lightning.org>. * * Aion-Lightning 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. * * Aion-Lightning 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 Aion-Lightning. * If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.model.gameobjects.player; import com.aionemu.commons.database.dao.DAOManager; import com.aionemu.gameserver.configs.main.HousingConfig; import com.aionemu.gameserver.dao.HouseScriptsDAO; import com.aionemu.gameserver.model.house.PlayerScript; import com.aionemu.gameserver.utils.xml.CompressUtil; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * @author Rolandas */ public class PlayerScripts { private static final Logger logger = LoggerFactory.getLogger(PlayerScripts.class); private final Map<Integer, PlayerScript> scripts; private final int houseObjId; public PlayerScripts(int houseObjectId) { this.scripts = new HashMap<Integer, PlayerScript>(8); for (int index = 0; index < 8; index++) { this.scripts.put(index, new PlayerScript()); } this.houseObjId = houseObjectId; } public Map<Integer, PlayerScript> getScripts() { return Collections.unmodifiableMap(scripts); } public boolean addScript(int position, String scriptXML) { PlayerScript script = scripts.get(position); if (scriptXML == null) { script.setData(null, -1); } else if (StringUtils.EMPTY.equals(scriptXML)) { script.setData(new byte[0], 0); } try { byte[] bytes = CompressUtil.Compress(scriptXML); int oldLength = bytes.length; bytes = Arrays.copyOf(bytes, bytes.length + 8); for (int i = oldLength; i < bytes.length; i++) { bytes[i] = -51; // Add NC shit bytes, without which fails to load :) } script.setData(bytes, scriptXML.length() * 2); } catch (Exception ex) { logger.error("Script compression failed: " + ex); return false; } return script == null; } public String getUncompressedScript(int position) { if (!scripts.containsKey(position)) { return null; } PlayerScript script = scripts.get(position); byte[] bytes = null; script.readLock(); bytes = script.getCompressedBytes(); script.readUnlock(); if (bytes == null) { return null; } if (bytes.length == 0) { return StringUtils.EMPTY; } try { return CompressUtil.Decompress(bytes); } catch (Exception ex) { logger.error("Script decompression failed: " + ex); return null; } } public boolean addScript(int position, byte[] compressedXML, int uncompressedSize) { String content = null; int size = -1; if (compressedXML == null) { // Nothing to do } else if (compressedXML.length == 0) { content = StringUtils.EMPTY; size = 0; } else { try { content = CompressUtil.Decompress(compressedXML); byte[] bytes = content.getBytes("UTF-16LE"); if (bytes.length != uncompressedSize) { return false; } size = uncompressedSize; } catch (Exception ex) { return false; } } PlayerScript script = scripts.get(position); script.readLock(); byte[] bytes = script.getCompressedBytes(); script.readUnlock(); script.setData(compressedXML, size); if (bytes == null) { DAOManager.getDAO(HouseScriptsDAO.class).addScript(houseObjId, position, content); } else { DAOManager.getDAO(HouseScriptsDAO.class).updateScript(houseObjId, position, content); } if (HousingConfig.HOUSE_SCRIPT_DEBUG) { logger.info(content); } return true; } public boolean removeScript(int position) { PlayerScript script = scripts.get(position); script.readLock(); byte[] bytes = script.getCompressedBytes(); script.readUnlock(); if (bytes == null) { return false; } else { script.setData(null, -1); DAOManager.getDAO(HouseScriptsDAO.class).deleteScript(houseObjId, position); } return true; } public int getSize() { return 8; } }