/*
* 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 com.aionemu.gameserver.services;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Future;
import org.apache.log4j.Logger;
import com.aionemu.commons.database.dao.DAOManager;
import com.aionemu.gameserver.configs.main.PeriodicSaveConfig;
import com.aionemu.gameserver.dao.AbyssRankDAO;
import com.aionemu.gameserver.dao.InventoryDAO;
import com.aionemu.gameserver.dao.ItemStoneListDAO;
import com.aionemu.gameserver.dao.PlayerDAO;
import com.aionemu.gameserver.dao.PlayerQuestListDAO;
import com.aionemu.gameserver.dao.PlayerSkillListDAO;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.items.GodStone;
import com.aionemu.gameserver.model.items.ManaStone;
import com.aionemu.gameserver.model.legion.Legion;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.World;
import com.google.inject.Inject;
/**
* @author ATracer
*
*/
public class PeriodicSaveService
{
private static final Logger log = Logger.getLogger(PeriodicSaveService.class);
private World world;
private LegionService legionService;
private Future<?> legionWhUpdateTask;
@Inject
public PeriodicSaveService(World world, LegionService legionService)
{
this.world = world;
this.legionService = legionService;
int DELAY_GENERAL = PeriodicSaveConfig.PLAYER_GENERAL * 1000;
int DELAY_ITEM = PeriodicSaveConfig.PLAYER_ITEMS * 1000;
int DELAY_LEGION_ITEM = PeriodicSaveConfig.LEGION_ITEMS * 1000;
ThreadPoolManager.getInstance().scheduleAtFixedRate(new GeneralUpdateTask(), DELAY_GENERAL, DELAY_GENERAL);
ThreadPoolManager.getInstance().scheduleAtFixedRate(new ItemUpdateTask(), DELAY_ITEM, DELAY_ITEM);
legionWhUpdateTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new LegionWhUpdateTask(),
DELAY_LEGION_ITEM, DELAY_LEGION_ITEM);
}
private class GeneralUpdateTask implements Runnable
{
@Override
public void run()
{
log.info("Player update task started.");
long startTime = System.currentTimeMillis();
Iterator<Player> playersIterator = world.getPlayersIterator();
int playersUpdated = 0;
while(playersIterator.hasNext())
{
Player player = playersIterator.next();
try
{
DAOManager.getDAO(AbyssRankDAO.class).storeAbyssRank(player);
DAOManager.getDAO(PlayerSkillListDAO.class).storeSkills(player);
DAOManager.getDAO(PlayerQuestListDAO.class).store(player);
DAOManager.getDAO(PlayerDAO.class).storePlayer(player);
}
catch(Exception ex)
{
log.error("Exception during periodic saving of player " + ex.getCause() != null ? ex.getCause()
.getMessage() : "null");
}
playersUpdated++;
}
long workTime = System.currentTimeMillis() - startTime;
log.info("Player update: " + workTime + " ms, players: " + playersUpdated + ".");
}
}
private class ItemUpdateTask implements Runnable
{
@Override
public void run()
{
log.info("Player item update task started.");
long startTime = System.currentTimeMillis();
Iterator<Player> playersIterator = world.getPlayersIterator();
int playersUpdated = 0;
while(playersIterator.hasNext())
{
Player player = playersIterator.next();
try
{
DAOManager.getDAO(InventoryDAO.class).store(player);
DAOManager.getDAO(ItemStoneListDAO.class).save(player);
}
catch(Exception ex)
{
log.error("Exception during periodic saving of player items " + ex.getCause() != null ? ex.getCause()
.getMessage() : "null");
}
playersUpdated++;
}
long workTime = System.currentTimeMillis() - startTime;
log.info("Player item update: " + workTime + " ms, players: " + playersUpdated + ".");
}
}
private class LegionWhUpdateTask implements Runnable
{
@Override
public void run()
{
log.info("Legion WH update task started.");
long startTime = System.currentTimeMillis();
Iterator<Legion> legionsIterator = legionService.getCachedLegionIterator();
int legionWhUpdated = 0;
while(legionsIterator.hasNext())
{
Legion legion = legionsIterator.next();
List<Item> allItems = legion.getLegionWarehouse().getAllItems();
try
{
/**
* 1. save items first
*/
for(Item item : allItems)
{
DAOManager.getDAO(InventoryDAO.class).store(item, legion.getLegionId());
}
/**
* 2. save item stones
*/
for(Item item : allItems)
{
if(item.hasManaStones())
{
Set<ManaStone> manaStones = item.getItemStones();
DAOManager.getDAO(ItemStoneListDAO.class).store(manaStones);
}
GodStone godStone = item.getGodStone();
if(godStone != null)
{
DAOManager.getDAO(ItemStoneListDAO.class).store(godStone);
}
}
}
catch(Exception ex)
{
log.error("Exception during periodic saving of legion WH " + ex.getCause() != null ? ex.getCause()
.getMessage() : "null");
}
legionWhUpdated++;
}
long workTime = System.currentTimeMillis() - startTime;
log.info("Legion WH update: " + workTime + " ms, legions: " + legionWhUpdated + ".");
}
}
/**
* Save data on shutdown
*/
public void onShutdown()
{
log.info("Starting data save on shutdown.");
legionWhUpdateTask.cancel(false);
new LegionWhUpdateTask().run();
log.info("Data successfully saved.");
}
}