/*******************************************************************************
* 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);
}
}
}