/* * This file is part of aion-unique <aion-unique.org>. * * aion-unique 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-unique 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-unique. If not, see <http://www.gnu.org/licenses/>. */ package admincommands; import static org.apache.commons.io.filefilter.FileFilterUtils.andFileFilter; import static org.apache.commons.io.filefilter.FileFilterUtils.makeSVNAware; import static org.apache.commons.io.filefilter.FileFilterUtils.notFileFilter; import static org.apache.commons.io.filefilter.FileFilterUtils.prefixFileFilter; import static org.apache.commons.io.filefilter.FileFilterUtils.suffixFileFilter; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.HiddenFileFilter; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.log4j.Logger; import org.xml.sax.SAXException; import com.aionemu.gameserver.configs.administration.AdminConfig; import com.aionemu.gameserver.dataholders.PortalData; import com.aionemu.gameserver.dataholders.QuestScriptsData; import com.aionemu.gameserver.dataholders.QuestsData; import com.aionemu.gameserver.dataholders.SkillData; import com.aionemu.gameserver.dataholders.SpawnsData; import com.aionemu.gameserver.dataholders.StaticData; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.templates.portal.PortalTemplate; import com.aionemu.gameserver.model.templates.spawn.SpawnGroup; import com.aionemu.gameserver.questEngine.QuestEngine; import com.aionemu.gameserver.skillengine.model.SkillTemplate; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.chathandlers.AdminCommand; import com.google.inject.Inject; /** * @author MrPoke * */ public class Reload extends AdminCommand { private static final Logger log = Logger.getLogger(Reload.class); @Inject QuestEngine questEngine; @Inject QuestsData questsData; @Inject QuestScriptsData questScriptsData; @Inject SkillData skillData; @Inject PortalData portalData; @Inject SpawnsData spawnsData; public Reload() { super("reload"); } @Override public void executeCommand(Player admin, String[] params) { if(admin.getAccessLevel() < AdminConfig.COMMAND_RELOAD) { PacketSendUtility.sendMessage(admin, "You dont have enough rights to execute this command"); return; } if(params == null || params.length != 1) { PacketSendUtility.sendMessage(admin, "syntax //reload <quest | skill | portal | spawn>"); return; } if(params[0].equals("quest")) { File xml = new File("./data/static_data/quest_data/quest_data.xml"); File dir = new File("./data/static_data/quest_script_data"); try { questEngine.shutdown(); JAXBContext jc = JAXBContext.newInstance(StaticData.class); Unmarshaller un = jc.createUnmarshaller(); un.setSchema(getSchema("./data/static_data/static_data.xsd")); QuestsData newQuestData = (QuestsData) un.unmarshal(xml); questsData.setQuestsData(newQuestData.getQuestsData()); questScriptsData.getData().clear(); for(File file : listFiles(dir, true)) { QuestScriptsData data = ((QuestScriptsData)un.unmarshal(file)); if (data != null) if (data.getData() != null) questScriptsData.getData().addAll(data.getData()); } questEngine.load(); } catch(Exception e) { PacketSendUtility.sendMessage(admin, "Quest reload failed!"); log.error(e); } finally { PacketSendUtility.sendMessage(admin, "Quest reload Success!"); } } else if(params[0].equals("skill")) { File dir = new File("./data/static_data/skills"); try { JAXBContext jc = JAXBContext.newInstance(StaticData.class); Unmarshaller un = jc.createUnmarshaller(); un.setSchema(getSchema("./data/static_data/static_data.xsd")); List<SkillTemplate> newTemplates = new ArrayList<SkillTemplate>(); for(File file : listFiles(dir, true)) { SkillData data = (SkillData)un.unmarshal(file); if(data != null) newTemplates.addAll(data.getSkillTemplates()); } skillData.setSkillTemplates(newTemplates); } catch(Exception e) { PacketSendUtility.sendMessage(admin, "Skill reload failed!"); log.error(e); } finally { PacketSendUtility.sendMessage(admin, "Skill reload Success!"); } } else if(params[0].equals("portal")) { File dir = new File("./data/static_data/portals"); try { JAXBContext jc = JAXBContext.newInstance(StaticData.class); Unmarshaller un = jc.createUnmarshaller(); un.setSchema(getSchema("./data/static_data/static_data.xsd")); List<PortalTemplate> newTemplates = new ArrayList<PortalTemplate>(); for(File file : listFiles(dir, true)) { PortalData data = (PortalData)un.unmarshal(file); if(data != null && data.getPortals() != null) newTemplates.addAll(data.getPortals()); } portalData.setPortals(newTemplates); } catch(Exception e) { PacketSendUtility.sendMessage(admin, "Portal reload failed!"); log.error(e); } finally { PacketSendUtility.sendMessage(admin, "Portal reload Success!"); } } else if(params[0].equals("spawn")) { File dir = new File("./data/static_data/spawns"); try { JAXBContext jc = JAXBContext.newInstance(StaticData.class); Unmarshaller un = jc.createUnmarshaller(); un.setSchema(getSchema("./data/static_data/static_data.xsd")); List<SpawnGroup> newTemplates = new ArrayList<SpawnGroup>(); for(File file : listFiles(dir, true)) { SpawnsData data = (SpawnsData)un.unmarshal(file); if(data != null && data.getSpawnGroups() != null) newTemplates.addAll(data.getSpawnGroups()); } spawnsData.setSpawns(newTemplates); } catch(Exception e) { PacketSendUtility.sendMessage(admin, "Spawn reload failed!"); log.error(e); } finally { PacketSendUtility.sendMessage(admin, "Spawn reload finished"); } } else PacketSendUtility.sendMessage(admin, "syntax //reload <quest | skill | portal | spawn>"); } private Schema getSchema(String xml_schema) { Schema schema = null; SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); try { schema = sf.newSchema(new File(xml_schema)); } catch(SAXException saxe) { throw new Error("Error while getting schema", saxe); } return schema; } @SuppressWarnings("unchecked") private Collection<File> listFiles(File root, boolean recursive) { IOFileFilter dirFilter = recursive ? makeSVNAware(HiddenFileFilter.VISIBLE) : null; return FileUtils.listFiles(root, andFileFilter(andFileFilter(notFileFilter(prefixFileFilter("new")), suffixFileFilter(".xml")), HiddenFileFilter.VISIBLE), dirFilter); } }