eclipse plugin: Move the tree creation logic in a new dedicated class
This commit is contained in:
parent
95a4b69a5e
commit
1302915c83
3 changed files with 236 additions and 195 deletions
|
@ -0,0 +1,143 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2011 by Timotei Dolean <timotei21@gmail.com>
|
||||
*
|
||||
* 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
|
||||
*******************************************************************************/
|
||||
package org.wesnoth.builder;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.LinkedBlockingDeque;
|
||||
|
||||
import org.eclipse.core.resources.IContainer;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.wesnoth.Logger;
|
||||
import org.wesnoth.builder.WesnothProjectBuilder.WMLFilesComparator;
|
||||
import org.wesnoth.projects.ProjectDependencyNode;
|
||||
|
||||
public class DependencyTreeBuilder
|
||||
{
|
||||
protected IProject project_;
|
||||
protected int currentIndex_ = 0;
|
||||
|
||||
protected Map< String, ProjectDependencyNode > tree_;
|
||||
|
||||
public DependencyTreeBuilder( IProject project )
|
||||
{
|
||||
tree_ = new HashMap<String, ProjectDependencyNode>();
|
||||
project_ = project;
|
||||
}
|
||||
|
||||
public void createDependencyTree()
|
||||
{
|
||||
// start creating the PDT (project dependency tree)
|
||||
Queue<IContainer> toProcess = new LinkedBlockingDeque<IContainer>( );
|
||||
|
||||
ProjectDependencyNode parent = null;
|
||||
|
||||
toProcess.add( project_ );
|
||||
|
||||
while( toProcess.isEmpty( ) == false ) {
|
||||
IContainer container = toProcess.poll( );
|
||||
|
||||
IResource main_cfg = container.findMember( "_main.cfg" );
|
||||
if ( main_cfg != null ) {
|
||||
// add main.cfg to tree
|
||||
|
||||
//TODO process the other children depending on the contents
|
||||
// of the file
|
||||
}else {
|
||||
List<IResource> members = null;
|
||||
try {
|
||||
members = Arrays.asList( container.members( ) );
|
||||
}
|
||||
catch ( CoreException e ) {
|
||||
Logger.getInstance( ).logException( e );
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
Collections.sort( members, new WMLFilesComparator( ) );
|
||||
|
||||
if ( members.isEmpty( ) )
|
||||
continue;
|
||||
|
||||
ProjectDependencyNode previous = null;
|
||||
|
||||
for ( IResource resource : members ) {
|
||||
System.out.println( resource.toString( ) );
|
||||
if ( resource instanceof IContainer )
|
||||
toProcess.add( (IContainer)resource );
|
||||
else {
|
||||
String fileName = resource.getName( );
|
||||
|
||||
// just config files.
|
||||
if ( ! fileName.endsWith( ".cfg" ) ||
|
||||
! ( resource instanceof IFile ))
|
||||
continue;
|
||||
|
||||
addNode( ( IFile ) resource, previous, parent );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("tree:");
|
||||
if ( !tree_.isEmpty( ) ) {
|
||||
ProjectDependencyNode node = tree_.get( "_ROOT_" ); // $NON-NLS-1$
|
||||
|
||||
do {
|
||||
ProjectDependencyNode leaf = node;
|
||||
|
||||
do {
|
||||
System.out.print( leaf + "; " );
|
||||
leaf = leaf.getNext( );
|
||||
} while ( leaf != null );
|
||||
|
||||
node = node.getSon( );
|
||||
System.out.print("\n");
|
||||
}while ( node != null );
|
||||
}
|
||||
else {
|
||||
System.out.println("Empty");
|
||||
}
|
||||
}
|
||||
|
||||
private void addNode( IFile file, ProjectDependencyNode previous,
|
||||
ProjectDependencyNode parent )
|
||||
{
|
||||
|
||||
ProjectDependencyNode newNode = new ProjectDependencyNode( file, currentIndex_ );
|
||||
currentIndex_ += ProjectDependencyNode.INDEX_STEP;
|
||||
|
||||
if ( previous != null ){
|
||||
previous.setNext( newNode );
|
||||
newNode.setPrevious( previous );
|
||||
} else {
|
||||
// first node in the current directory -> make it son of parent
|
||||
if ( parent != null ) {
|
||||
parent.setSon( newNode );
|
||||
newNode.setParent( parent );
|
||||
} else {
|
||||
// no parent yet (== null)
|
||||
// so we're making this the root node for this tree
|
||||
tree_.put( "_ROOT_", newNode );
|
||||
}
|
||||
|
||||
parent = newNode;
|
||||
}
|
||||
|
||||
tree_.put( file.getProjectRelativePath( ).toString( ), newNode );
|
||||
previous = newNode;
|
||||
}
|
||||
}
|
|
@ -8,17 +8,11 @@
|
|||
*******************************************************************************/
|
||||
package org.wesnoth.builder;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.LinkedBlockingDeque;
|
||||
|
||||
import org.eclipse.core.resources.IContainer;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
|
@ -33,14 +27,9 @@ import org.eclipse.core.runtime.IProgressMonitor;
|
|||
import org.eclipse.core.runtime.Path;
|
||||
import org.wesnoth.Logger;
|
||||
import org.wesnoth.Messages;
|
||||
import org.wesnoth.installs.WesnothInstallsUtils;
|
||||
import org.wesnoth.preferences.Preferences;
|
||||
import org.wesnoth.preferences.Preferences.Paths;
|
||||
import org.wesnoth.preprocessor.PreprocessorUtils;
|
||||
import org.wesnoth.projects.ProjectCache;
|
||||
import org.wesnoth.projects.ProjectDependencyNode;
|
||||
import org.wesnoth.projects.ProjectUtils;
|
||||
import org.wesnoth.utils.AntUtils;
|
||||
import org.wesnoth.utils.ResourceUtils;
|
||||
import org.wesnoth.utils.StringUtils;
|
||||
import org.wesnoth.utils.WMLSaxHandler;
|
||||
|
@ -56,15 +45,10 @@ public class WesnothProjectBuilder extends IncrementalProjectBuilder
|
|||
|
||||
protected void fullBuild(final IProgressMonitor monitor) throws CoreException
|
||||
{
|
||||
try
|
||||
{
|
||||
createDependencyTree( );
|
||||
DependencyTreeBuilder treeBuilder = new DependencyTreeBuilder( getProject( ) );
|
||||
treeBuilder.createDependencyTree( );
|
||||
|
||||
getProject().accept(new ResourceVisitor(monitor));
|
||||
} catch (CoreException e)
|
||||
{
|
||||
Logger.getInstance().logException(e);
|
||||
}
|
||||
// getProject().accept(new ResourceVisitor(monitor));
|
||||
}
|
||||
|
||||
protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor)
|
||||
|
@ -74,185 +58,102 @@ public class WesnothProjectBuilder extends IncrementalProjectBuilder
|
|||
delta.accept(new ResourceDeltaVisitor(monitor));
|
||||
}
|
||||
|
||||
private void createDependencyTree() throws CoreException
|
||||
{
|
||||
// start creating the PDT (project dependency tree)
|
||||
Queue<IContainer> toProcess = new LinkedBlockingDeque<IContainer>( );
|
||||
|
||||
List<ProjectDependencyNode> tree = new ArrayList<ProjectDependencyNode>();
|
||||
ProjectDependencyNode parent = null;
|
||||
int currentIndex = 0;
|
||||
|
||||
toProcess.add( getProject() );
|
||||
|
||||
while( toProcess.isEmpty( ) == false ) {
|
||||
IContainer container = toProcess.poll( );
|
||||
|
||||
IResource main_cfg = container.findMember( "_main.cfg" );
|
||||
if ( main_cfg != null ) {
|
||||
//TODO process the other children depending on the contents
|
||||
// of the file
|
||||
}else {
|
||||
List<IResource> members = Arrays.asList( container.members( ) ) ;
|
||||
|
||||
Collections.sort( members, new WMLFilesComparator( ) );
|
||||
|
||||
if ( members.isEmpty( ) )
|
||||
continue;
|
||||
|
||||
ProjectDependencyNode previous = null;
|
||||
|
||||
for ( IResource resource : members ) {
|
||||
System.out.println( resource.toString( ) );
|
||||
if ( resource instanceof IContainer )
|
||||
toProcess.add( (IContainer)resource );
|
||||
else {
|
||||
String fileName = resource.getName( );
|
||||
|
||||
// just config files.
|
||||
if ( ! fileName.endsWith( ".cfg" ) ||
|
||||
! ( resource instanceof IFile ))
|
||||
continue;
|
||||
|
||||
ProjectDependencyNode newNode =
|
||||
new ProjectDependencyNode( (IFile) resource, currentIndex );
|
||||
currentIndex += ProjectDependencyNode.INDEX_STEP;
|
||||
|
||||
if ( previous != null ){
|
||||
previous.setNext( newNode );
|
||||
newNode.setPrevious( previous );
|
||||
} else {
|
||||
// first node in the current directory -> make it son of parent
|
||||
if ( parent != null ) {
|
||||
parent.setSon( newNode );
|
||||
newNode.setParent( parent );
|
||||
}
|
||||
|
||||
parent = newNode;
|
||||
}
|
||||
|
||||
tree.add( newNode );
|
||||
previous = newNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("tree:");
|
||||
if ( !tree.isEmpty( ) ) {
|
||||
ProjectDependencyNode node = tree.get( 0 );
|
||||
|
||||
do {
|
||||
ProjectDependencyNode leaf = node;
|
||||
|
||||
do {
|
||||
System.out.print( leaf + "; " );
|
||||
leaf = leaf.getNext( );
|
||||
} while ( leaf != null );
|
||||
|
||||
node = node.getSon( );
|
||||
System.out.print("\n");
|
||||
}while ( node != null );
|
||||
}
|
||||
else {
|
||||
System.out.println("Empty");
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
|
||||
throws CoreException
|
||||
{
|
||||
if ( WesnothInstallsUtils.setupInstallForResource( getProject() ) == false )
|
||||
return null;
|
||||
|
||||
String installName = WesnothInstallsUtils.getInstallNameForResource( getProject() );
|
||||
|
||||
Logger.getInstance().log(Messages.WesnothProjectBuilder_0);
|
||||
monitor.beginTask(String.format(Messages.WesnothProjectBuilder_1, getProject().getName()), 100);
|
||||
|
||||
Paths paths = Preferences.getPaths( installName );
|
||||
|
||||
monitor.subTask(Messages.WesnothProjectBuilder_3);
|
||||
if ( paths.getUserDir( ).isEmpty( ) )
|
||||
{
|
||||
Logger.getInstance().log(Messages.WesnothProjectBuilder_4,
|
||||
Messages.WesnothProjectBuilder_5);
|
||||
return null;
|
||||
}
|
||||
monitor.worked(5);
|
||||
|
||||
// create the temporary directory used by the plugin if not created
|
||||
monitor.subTask(Messages.WesnothProjectBuilder_6);
|
||||
WorkspaceUtils.getTemporaryFolder();
|
||||
monitor.worked(2);
|
||||
|
||||
// check for 'build.xml' existance
|
||||
if (new File(getProject().getLocation().toOSString() + "/build.xml").exists() == true) //$NON-NLS-1$
|
||||
{
|
||||
// run the ant job to copy the whole project
|
||||
// in the user add-ons directory (incremental)
|
||||
monitor.subTask(Messages.WesnothProjectBuilder_8);
|
||||
Map<String, String> properties = new HashMap<String, String>();
|
||||
properties.put("wesnoth.user.dir", paths.getUserDir( )); //$NON-NLS-1$
|
||||
Logger.getInstance().log(Messages.WesnothProjectBuilder_10);
|
||||
|
||||
String result = AntUtils.runAnt(
|
||||
getProject().getLocation().toOSString() + "/build.xml", //$NON-NLS-1$
|
||||
properties, true);
|
||||
Logger.getInstance().log(result);
|
||||
monitor.worked(10);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
Logger.getInstance().log(Messages.WesnothProjectBuilder_12,
|
||||
Messages.WesnothProjectBuilder_13);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
monitor.worked(2);
|
||||
|
||||
boolean readDefines = true;
|
||||
if (kind == FULL_BUILD)
|
||||
{
|
||||
fullBuild(monitor);
|
||||
}
|
||||
else
|
||||
{
|
||||
IResourceDelta delta = getDelta(getProject());
|
||||
if (delta == null)
|
||||
{
|
||||
fullBuild(monitor);
|
||||
}
|
||||
else
|
||||
{
|
||||
readDefines = false;
|
||||
IResourceDelta[] affected = delta.getAffectedChildren();
|
||||
|
||||
for(IResourceDelta tmp : affected)
|
||||
{
|
||||
if (tmp.getResource().getName().toLowerCase(Locale.ENGLISH).endsWith(".cfg")) //$NON-NLS-1$
|
||||
{
|
||||
readDefines = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
incrementalBuild(delta, monitor);
|
||||
}
|
||||
}
|
||||
|
||||
if (readDefines)
|
||||
{
|
||||
// we read the defines at the end of the build
|
||||
// to speed up things (and only if we had any .cfg files processed)
|
||||
ProjectCache cache = ProjectUtils.getCacheForProject( getProject() );
|
||||
cache.readDefines( true );
|
||||
cache.saveCache( );
|
||||
|
||||
monitor.worked(10);
|
||||
}
|
||||
monitor.done();
|
||||
fullBuild( monitor );
|
||||
// if ( WesnothInstallsUtils.setupInstallForResource( getProject() ) == false )
|
||||
// return null;
|
||||
//
|
||||
// String installName = WesnothInstallsUtils.getInstallNameForResource( getProject() );
|
||||
//
|
||||
// Logger.getInstance().log(Messages.WesnothProjectBuilder_0);
|
||||
// monitor.beginTask(String.format(Messages.WesnothProjectBuilder_1, getProject().getName()), 100);
|
||||
//
|
||||
// Paths paths = Preferences.getPaths( installName );
|
||||
//
|
||||
// monitor.subTask(Messages.WesnothProjectBuilder_3);
|
||||
// if ( paths.getUserDir( ).isEmpty( ) )
|
||||
// {
|
||||
// Logger.getInstance().log(Messages.WesnothProjectBuilder_4,
|
||||
// Messages.WesnothProjectBuilder_5);
|
||||
// return null;
|
||||
// }
|
||||
// monitor.worked(5);
|
||||
//
|
||||
// // create the temporary directory used by the plugin if not created
|
||||
// monitor.subTask(Messages.WesnothProjectBuilder_6);
|
||||
// WorkspaceUtils.getTemporaryFolder();
|
||||
// monitor.worked(2);
|
||||
//
|
||||
// // check for 'build.xml' existance
|
||||
// if (new File(getProject().getLocation().toOSString() + "/build.xml").exists() == true) //$NON-NLS-1$
|
||||
// {
|
||||
// // run the ant job to copy the whole project
|
||||
// // in the user add-ons directory (incremental)
|
||||
// monitor.subTask(Messages.WesnothProjectBuilder_8);
|
||||
// Map<String, String> properties = new HashMap<String, String>();
|
||||
// properties.put("wesnoth.user.dir", paths.getUserDir( )); //$NON-NLS-1$
|
||||
// Logger.getInstance().log(Messages.WesnothProjectBuilder_10);
|
||||
//
|
||||
// String result = AntUtils.runAnt(
|
||||
// getProject().getLocation().toOSString() + "/build.xml", //$NON-NLS-1$
|
||||
// properties, true);
|
||||
// Logger.getInstance().log(result);
|
||||
// monitor.worked(10);
|
||||
//
|
||||
// if (result == null)
|
||||
// {
|
||||
// Logger.getInstance().log(Messages.WesnothProjectBuilder_12,
|
||||
// Messages.WesnothProjectBuilder_13);
|
||||
// return null;
|
||||
// }
|
||||
// }
|
||||
// monitor.worked(2);
|
||||
//
|
||||
// boolean readDefines = true;
|
||||
// if (kind == FULL_BUILD)
|
||||
// {
|
||||
// fullBuild(monitor);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// IResourceDelta delta = getDelta(getProject());
|
||||
// if (delta == null)
|
||||
// {
|
||||
// fullBuild(monitor);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// readDefines = false;
|
||||
// IResourceDelta[] affected = delta.getAffectedChildren();
|
||||
//
|
||||
// for(IResourceDelta tmp : affected)
|
||||
// {
|
||||
// if (tmp.getResource().getName().toLowerCase(Locale.ENGLISH).endsWith(".cfg")) //$NON-NLS-1$
|
||||
// {
|
||||
// readDefines = true;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// incrementalBuild(delta, monitor);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (readDefines)
|
||||
// {
|
||||
// // we read the defines at the end of the build
|
||||
// // to speed up things (and only if we had any .cfg files processed)
|
||||
// ProjectCache cache = ProjectUtils.getCacheForProject( getProject() );
|
||||
// cache.readDefines( true );
|
||||
// cache.saveCache( );
|
||||
//
|
||||
// monitor.worked(10);
|
||||
// }
|
||||
// monitor.done();
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,8 +43,6 @@ public class ProjectCache
|
|||
private Map< String, ConfigFile > configFiles_;
|
||||
private Map< String, Define > defines_;
|
||||
|
||||
private Map< String, ProjectDependencyNode > depedencyTree_;
|
||||
|
||||
private IProject project_;
|
||||
|
||||
public ProjectCache(IProject project)
|
||||
|
@ -53,7 +51,6 @@ public class ProjectCache
|
|||
|
||||
configFiles_ = new HashMap<String, ConfigFile>();
|
||||
defines_ = new HashMap<String, Define>(0);
|
||||
depedencyTree_ = new HashMap<String, ProjectDependencyNode>();
|
||||
|
||||
propertiesTimetamp_ = 0;
|
||||
properties_ = new DialogSettings("project"); //$NON-NLS-1$
|
||||
|
|
Loading…
Add table
Reference in a new issue