com.aionengine.gameserver.dataholders.DataLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.aionengine.gameserver.dataholders.DataLoader.java

Source

/**
 * This file is part of alpha team <alpha-team.com>.
 *
 * alpha team is pryvate 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.
 *
 * alpha team 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 alpha team.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.aionengine.gameserver.dataholders;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;

/**
 * This class is responsible for loading data from static .txt files.<br>
 * It's used as base class of {@link NpcData} and {@link SpawnData}.<br>
 * <br>
 * <p/>
 * <font color="red">NOTICE: </font> This class is used temporarily and later will be removed and npc and spawn data
 * will be loaded with xml loader.<br>
 * <br>
 * <font color="red"><b>Do not use this class for anything else than <tt>NpcData</tt> or <tt>SpawnData</tt></b></font>
 *
 * @author Luno
 */
abstract class DataLoader {
    /**
     * The logger used for <tt>DataLoader</tt> and its subclasses
     */
    protected Logger log = Logger.getLogger(getClass().getName());

    /**
     * Relative path to directory containing .txt files with static data
     */
    private static final String PATH = "./data/static_data/";

    /**
     * File containing data to load ( may be file or directory )
     */
    private File dataFile;

    /**
     * Constructor that is supposed to be called from subclass.
     *
     * @param file file or directory in the static data directory, containing data that will be loaded
     */
    DataLoader(String file) {
        this.dataFile = new File(PATH + file);
    }

    /**
     * This method is supposed to be called from subclass to initialize data loading process.<br>
     * <br>
     * This method is using file given in the constructor to load the data and there are two possibilities:
     * <ul>
     * <li>Given file is file is in deed the <b>file</b> then it's forwarded to {@link #loadFile(File)} method</li>
     * <li>Given file is a <b>directory</b>, then this method is obtaining list of all visible .txt files in this
     * directory and subdirectiores ( except hidden ones and those named "new" ) and call {@link #loadFile(File)} for
     * each of these files.
     * </ul>
     */
    protected void loadData() {
        if (dataFile.isDirectory()) {
            Collection<?> files = FileUtils
                    .listFiles(dataFile,
                            FileFilterUtils
                                    .andFileFilter(
                                            FileFilterUtils.andFileFilter(
                                                    FileFilterUtils
                                                            .notFileFilter(FileFilterUtils.nameFileFilter("new")),
                                                    FileFilterUtils.suffixFileFilter(".txt")),
                                            HiddenFileFilter.VISIBLE),
                            HiddenFileFilter.VISIBLE);

            for (Object file1 : files) {
                File f = (File) file1;
                loadFile(f);
            }
        } else {
            loadFile(dataFile);
        }
    }

    /**
     * This method is loading data from particular .txt file.
     *
     * @param file a file which the data is loaded from.<br>
     *             <p/>
     *             The method is loading the file row by row, omitting those started with "#" sign.<br>
     *             Every read row is then forwarded to {@link #parse(String)} method, which should be overriden in
     *             subclcass.
     */
    private void loadFile(File file) {
        LineIterator it = null;
        try {
            it = FileUtils.lineIterator(file);
            while (it.hasNext()) {
                String line = it.nextLine();
                if (line.isEmpty() || line.startsWith("#")) {
                    continue;
                }
                parse(line);
            }
        } catch (IOException e) {
            log.error("Error while loading " + getClass().getSimpleName() + ", file: " + file.getPath(), e);
        } finally {
            LineIterator.closeQuietly(it);
        }
    }

    /**
     * This method must be overriden in every subclass and is responsible for parsing given <tt>dataEntry</tt> String
     * which represents one row from data file.
     *
     * @param dataEntry A String containing data about a data entry, that is to be parsed by this method.
     */
    protected abstract void parse(String dataEntry);

    /**
     * Saves data to the file. Used only by {@link SpawnData}.
     *
     * @return true if the data was successfully saved, false - if some error occurred.
     */
    public boolean saveData() {
        String desc = PATH + getSaveFile();

        log.info("Saving " + desc);

        FileWriter fr = null;
        try {
            fr = new FileWriter(desc);

            saveEntries(fr);

            fr.flush();

            return true;
        } catch (Exception e) {
            log.fatal("Error while saving " + desc, e);
            return false;
        } finally {
            if (fr != null) {
                try {
                    fr.close();
                } catch (Exception e) {
                    log.fatal("Error while closing save data file", e);
                }
            }
        }
    }

    /**
     * Name of the file which is used to store data in.<br>
     * This method must be overriden in sublass if we want to be able to store its data. It's used only in
     * {@link SpawnData} and should not be used anywhere else.
     *
     * @return name of the file
     */
    protected abstract String getSaveFile();

    /**
     * This method must be overriden in subclass which we want to be able to save data. It's responsibility is basicly
     * to put data into given FileWriter instance.
     *
     * @param fileWriter
     * @throws Exception
     */
    protected void saveEntries(FileWriter fileWriter) throws Exception {
        // TODO Auto-generated method stub

    }
}