view src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/network/bbs/NetworkJungleBulletinBoard.java @ 9:2890ae6b1aef

network browsing
author tatsuki
date Fri, 03 Feb 2017 02:16:51 +0900
parents 766f7668521f
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.bbs.network.bbs;


import jp.ac.u_ryukyu.ie.cr.bbs.local.browsing.JungleBrowsingBulletinBoard;
import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList;
import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListReader;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Error.Error;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.core.NetworkDefaultJungle;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.AliceJournal;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.NetworkJournal;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.persistent.PersistentJournal;
import jp.ac.u_ryukyu.ie.cr.jungleNetwork.transaction.JungleUpdater;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

public class NetworkJungleBulletinBoard extends JungleBrowsingBulletinBoard implements NetworkBulletinBoard {
    private final Jungle jungle;
    private final NetworkJournal journal;
    private final String LOG_DIR;
    private Boolean persistentFlag;
    private AtomicInteger requestCounter; //使われてない?
    private long renewTime;

    private NetworkJungleBulletinBoard(String _uuid, NetworkJournal journal) {
        this(new NetworkDefaultJungle(journal, _uuid), journal);
    }

    private NetworkJungleBulletinBoard(Jungle jungle, NetworkJournal journal) {
        super(jungle);
        this.jungle = jungle;
        this.journal = journal;
        BulletinBoardJungleManager.setJungle(jungle);
        this.persistentFlag = false;
        this.requestCounter = BulletinBoardJungleManager.getRequestCounter();
        this.LOG_DIR = "./log";
        this.renewTime = 0;
    }

    public NetworkJungleBulletinBoard(String _uuid) {
        this(_uuid, new AliceJournal());
        this.jungle.createNewTree("boards");
    }

    public static NetworkBulletinBoard NewPersistentJungle(String _uuid) {
        NetworkJungleBulletinBoard board = new NetworkJungleBulletinBoard(_uuid, new PersistentJournal());
        board.persistentFlag = true;
        return board;
    }

    public void init() {
        if (!persistentFlag) {
            return;
        }
        checkAndCreateLogDirectory();
        try {
            commitLogRecover();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void checkAndCreateLogDirectory() {
        File logFile = new File(LOG_DIR);
        if (!logFile.exists()) {
            logFile.mkdir();
            return;
        }
        if (logFile.isFile()) {
            logFile.delete();
            logFile.mkdir();
        }
    }

    public void commitLogRecover() throws IOException {
        File[] logFiles = new File(LOG_DIR).listFiles();
        for (File logFile : logFiles) {
            commitLogRecover(logFile);
            logFile.delete();
        }
        if (jungle.getTreeByName("boards") == null) {
            jungle.createNewTree("boards");
        }
    }

    private void commitLogRecover(File logFile) throws IOException {
        journal.setInputFile(logFile);
        ChangeListReader reader = journal.getReader();
        if (reader == null)
            return;
        for (ChangeList chList : reader) {
            String treeName = chList.getTreeName();
            JungleTree tree = jungle.getTreeByName(treeName);
            if (tree == null) {
                tree = jungle.createNewTree(treeName);
            }
            JungleTreeEditor editor = tree.getLocalJungleTreeEditor();
            Either<Error, JungleTreeEditor> either = JungleUpdater.edit(editor, chList);
            editor = either.b();
            if (either.isA()) {
                throw new IOException("Failed commit log recovery");
            }
            editor.success();
        }
    }

    public long getRenewTime(String _boardName) {
        return renewTime;
    }

    public int getRequestNum() {
        return requestCounter.get();
    }


}