eclox.ui.BuildManager.java Source code

Java tutorial

Introduction

Here is the source code for eclox.ui.BuildManager.java

Source

/*******************************************************************************
 * Copyright (C) 2003-2008, 2013, Guillaume Brocker
 * Copyright (C) 2015-2016, Andre Bossert
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Guillaume Brocker - Initial API and implementation
 *     Andre Bossert - Add ability to use Doxyfile not in project scope
 *                   - Refactoring of deprecated API usage
 *
 ******************************************************************************/

package eclox.ui;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.PlatformUI;

import eclox.core.doxyfiles.Doxyfile;
import eclox.core.doxygen.BuildJob;
import eclox.core.doxygen.IBuildJobListener;
import eclox.ui.console.Console;

/**
 * This class is responsible to launch the build for the given doxyfile
 * and also manages the build history.
 *
 * @see      Plugin
 *
 * @author   gbrocker
 */
public class BuildManager {

    /**
     * Implements a job listener that will update the job history as jobs get removed.
     */
    private class MyJobListener implements IBuildJobListener {

        public void buildJobLogCleared(BuildJob job) {
        }

        public void buildJobLogUpdated(BuildJob job, String output) {
        }

        public void buildJobRemoved(BuildJob job) {
            jobHistory.remove(job);
            job.removeBuidJobListener(this);
        }

    }

    /**
     * Implements a preference listener that will maintain the length of the job history
     * according to the relevant preference changes.
     */
    private class MyPreferenceListener implements IPropertyChangeListener {

        public void propertyChange(PropertyChangeEvent event) {
            if (event.getProperty() == IPreferences.BUILD_HISTORY_SIZE) {
                int newSize = ((Integer) event.getNewValue()).intValue();
                int curSize = jobHistory.size();

                if (curSize > newSize) {
                    jobHistory = jobHistory.subList(curSize - newSize, curSize);
                }
            }
        }

    }

    private static String STATE_FILE = new String("build-job-history.txt");
    private List<BuildJob> jobHistory = new LinkedList<BuildJob>(); ///< Contains the history the launched build jobs.

    /**
     * Constructor
     */
    public BuildManager() {
        // Attaches a property change listener on the plugin's preference store.
        Plugin.getDefault().getPreferenceStore().addPropertyChangeListener(new MyPreferenceListener());
    }

    /**
     * Launches the build of the given doxyfile.
     *
     * @param   doxyfile   the doxyfile to build
     */
    public void build(Doxyfile doxyfile) {
        // Retrieves the plug-in preferences.
        IPreferenceStore preferences = Plugin.getDefault().getPreferenceStore();

        // Ask the user if he wants to save all opened editors before proceeding to build.
        final String autoSave = preferences.getString(IPreferences.AUTO_SAVE);
        if (autoSave.equals(IPreferences.AUTO_SAVE_ALWAYS)) {
            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().saveAllEditors(false);
        } else if (autoSave.equals(IPreferences.AUTO_SAVE_ASK)) {
            boolean saved;

            saved = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().saveAllEditors(true);
            if (saved == false) {
                return;
            }
        } else if (autoSave.equals(IPreferences.AUTO_SAVE_NEVER)) {
            // Nothing to perform.
        } else {
            // Not supported.
            assert (false);
            Plugin.log(autoSave + ": unsupported auto save state.");
        }

        // Retrieves the build job for the given doxyfile.
        BuildJob job = BuildJob.getJob(doxyfile);

        // Attaches a listener if applicable.
        if (jobHistory.contains(job) == false) {
            job.addBuidJobListener(new MyJobListener());
        }

        // Updates the job history.
        int preferedHistorySize = preferences.getInt(IPreferences.BUILD_HISTORY_SIZE);

        jobHistory.remove(job);
        if (jobHistory.size() >= preferedHistorySize && jobHistory.isEmpty() == false) {
            jobHistory.remove(0);
        }
        jobHistory.add(job);

        // Updates the console.
        Console.show(job);

        // Schedule the job to build.
        job.schedule(1000);
    }

    /**
     * Retrieves the latest build jobs that have been registered in the history.
     *
     * @return   an array containing the most recent build jobs.
     */
    public BuildJob[] getRecentBuildJobs() {
        return (BuildJob[]) jobHistory.toArray(new BuildJob[0]);
    }

    /**
     * Restores the state from a file.
     */
    public void restoreState() {
        try {
            IPath statePath = Plugin.getDefault().getStateLocation().append(STATE_FILE);
            File stateFile = new File(statePath.toOSString());

            if (stateFile.canRead() == true) {
                BufferedReader stateReader = new BufferedReader(new FileReader(stateFile));
                String stateLine = stateReader.readLine();
                while (stateLine != null) {
                    IPath doxyfilePath = new Path(stateLine);
                    IFile doxyIFile = null;
                    File doxyFile = null;
                    IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(doxyfilePath);
                    if (Doxyfile.isDoxyfile(resource)) {
                        doxyIFile = (IFile) resource;
                    } else {
                        doxyFile = new File(stateLine);
                    }
                    Doxyfile doxyfile = new Doxyfile(doxyIFile, doxyFile);
                    BuildJob job = BuildJob.getJob(doxyfile);
                    jobHistory.add(job);
                    stateLine = stateReader.readLine();
                }
                stateReader.close();
            }
        } catch (Throwable t) {
            Plugin.log(t);
        }
    }

    /**
     * Saves the state to a file.
     */
    public void saveState() {
        IPath statePath = Plugin.getDefault().getStateLocation().append(STATE_FILE);
        File stateFile = new File(statePath.toOSString());

        stateFile.delete();

        // Now saves the resource path of the next doxyfile to build.
        try {
            FileWriter stateWriter = new FileWriter(stateFile);
            Iterator<BuildJob> i = jobHistory.iterator();

            while (i.hasNext()) {
                BuildJob job = (BuildJob) i.next();
                Doxyfile doxyfile = job.getDoxyfile();
                stateWriter.write(doxyfile.getFullPath());
                stateWriter.write(String.valueOf('\n'));
            }

            stateWriter.flush();
            stateWriter.close();
        } catch (Throwable t) {
            Plugin.log(t);
        }
    }

}