001/*
002 * Stallion Core: A Modern Web Framework
003 *
004 * Copyright (C) 2015 - 2016 Stallion Software LLC.
005 *
006 * This program is free software: you can redistribute it and/or modify it under the terms of the
007 * GNU General Public License as published by the Free Software Foundation, either version 2 of
008 * the License, or (at your option) any later version. This program is distributed in the hope that
009 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
011 * License for more details. You should have received a copy of the GNU General Public License
012 * along with this program.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
013 *
014 *
015 *
016 */
017
018package io.stallion.fileSystem;
019
020import io.stallion.exceptions.UsageException;
021import io.stallion.services.Log;
022
023import static io.stallion.utils.Literals.*;
024import static io.stallion.Context.*;
025
026/**
027 * Starts and stops a separate thread that watches the file system
028 * for changes.
029 */
030public class FileSystemWatcherService {
031
032
033    private static Thread watchingThread;
034    private static FileSystemWatcherRunner _runner;
035
036    public static FileSystemWatcherRunner instance() {
037        if (_runner == null) {
038            if (_runner == null) {
039                throw new UsageException("FileSystemWatcherRunner.load() must be called before can access instance.");
040            }
041        }
042        return _runner;
043    }
044
045    public static FileSystemWatcherRunner load() {
046        _runner = new FileSystemWatcherRunner();
047        return _runner;
048    }
049
050    public static FileSystemWatcherRunner start() {
051        if (watchingThread != null) {
052            return _runner;
053        }
054        watchingThread = new Thread(instance());
055        watchingThread.setName("stallion-file-system-watcher");
056        watchingThread.start();
057        return _runner;
058    }
059
060    public static void shutdown() {
061        if (_runner == null) {
062            return;
063        }
064        _runner.setShouldRun(false);
065        if (watchingThread != null) {
066            watchingThread.interrupt();
067            try {
068                watchingThread.join();
069            } catch (InterruptedException e) {
070                Log.exception(e, "Exception joining watcher thread to shutdown");
071            }
072        }
073        _runner.shutdown();
074        _runner = null;
075        watchingThread = null;
076        Log.finer("File system watcher service is shut down");
077    }
078
079}