[jboss-cvs] jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/model/internal ...

Marshall Culpepper mculpepper at jboss.com
Wed Feb 21 14:36:10 EST 2007


  User: mculpepper
  Date: 07/02/21 14:36:10

  Modified:    core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/model/internal 
                        PackageBuildDelegate.java
  Log:
  PackageBuildDelegate is now a singleton, allowing us to track build issues alot easier
  
  Revision  Changes    Path
  1.13      +334 -137  jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/model/internal/PackageBuildDelegate.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PackageBuildDelegate.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/model/internal/PackageBuildDelegate.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -b -r1.12 -r1.13
  --- PackageBuildDelegate.java	20 Feb 2007 07:18:02 -0000	1.12
  +++ PackageBuildDelegate.java	21 Feb 2007 19:36:10 -0000	1.13
  @@ -58,7 +58,6 @@
   import org.jboss.ide.eclipse.packages.core.model.IPackagesBuildListener;
   import org.jboss.ide.eclipse.packages.core.model.IPackagesModelListener;
   import org.jboss.ide.eclipse.packages.core.model.PackagesCore;
  -import org.jboss.ide.eclipse.packages.core.project.PackagesBuilder;
   import org.jboss.ide.eclipse.packages.core.util.PackagesExport;
   
   import de.schlichtherle.io.ArchiveDetector;
  @@ -67,51 +66,99 @@
   import de.schlichtherle.io.FileOutputStream;
   
   public class PackageBuildDelegate implements IPackagesModelListener {
  -	private TreeSet referencedProjects;
  +	private static PackageBuildDelegate _instance;
  +	
  +
   	private Hashtable scannerCache;
  -	private List packages;
  +	private Hashtable oldScanners;
  +	private Object buildLock = new Object();
  +	private boolean building;
   	private ArrayList nodesToUpdate, nodesToRemove;
  +	private NullProgressMonitor nullMonitor = new NullProgressMonitor();
  +	// 
  +	private TreeSet referencedProjects;
  +	private List packages;
   	private IProject project;
   	private IResourceDelta delta;
  -	private static boolean building;
   	
  -	public PackageBuildDelegate (PackagesBuilder builder)
  +	public static PackageBuildDelegate instance ()
   	{
  -		this(builder.getProject(), builder.getDelta(builder.getProject()));
  -	}
  +		if (_instance == null)
  +			_instance = new PackageBuildDelegate();
   	
  -	public PackageBuildDelegate (IProject project)
  -	{
  -		this(project, null);
  +		return _instance;
   	}
   	
  -	public PackageBuildDelegate (IProject project, IResourceDelta delta)
  -	{
  -		this.project = project;
  -		this.delta = delta;
  -		
  +	public PackageBuildDelegate () {
  +		scannerCache = new Hashtable();
  +		oldScanners = new Hashtable();
   		nodesToUpdate = new ArrayList();
   		nodesToRemove = new ArrayList();
   		
   		PackagesModel.instance().addPackagesModelListener(this);
   	}
   	
  -	public void projectRegistered(IProject project) { }
  +	public void projectRegistered(IProject project) {
  +		List packages = PackagesModel.instance().getProjectPackages(project);
  +		fillScannerCache(packages);
  +		
  +		if (packages != null)
  +		{
  +			for (Iterator iter = packages.iterator(); iter.hasNext(); )
  +			{
  +				buildSinglePackage((IPackage)iter.next(), nullMonitor);
  +			}
  +		}
  +	}
   	
   	public void packageNodeAdded(IPackageNode added) {
  +		synchronized (nodesToUpdate)
  +		{
   		nodesToUpdate.add(added);
   	}
   	
  +		if (added.getNodeType() == IPackageNode.TYPE_PACKAGE)
  +		{
  +			fillScannerCache((IPackage) added);
  +		}
  +		
  +		incrementalBuildUnderNode(added, nullMonitor);
  +	}
  +	
   	public void packageNodeChanged(IPackageNode changed) {
  +		synchronized (nodesToUpdate)
  +		{
   		nodesToUpdate.add(changed);
   	}
   	
  +		if (changed.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
  +		{
  +			updateScannerCache((IPackageFileSet) changed);
  +		}
  +		
  +		incrementalBuildUnderNode(changed, nullMonitor);
  +	}
  +	
   	public void packageNodeRemoved(IPackageNode removed) {
  +		synchronized (nodesToRemove)
  +		{
   		nodesToRemove.add(removed);
   	}
   	
  +		if (removed.getNodeType() == IPackageNode.TYPE_PACKAGE
  +			|| removed.getNodeType() == IPackageNode.TYPE_PACKAGE_FOLDER)
  +		{
  +			removeScannerCache(removed);
  +		}
  +		else if (removed.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
  +		{
  +			removeFilesetScannerCache((IPackageFileSet)removed);
  +		}
  +		incrementalBuildUnderNode(removed, nullMonitor);
  +	}
  +	
   	public void packageNodeAttached(IPackageNode attached) {
  -		nodesToUpdate.add(attached);
  +		packageNodeAdded(attached);
   	}
   	
   	private void fireStartedBuild (IProject project)
  @@ -156,12 +203,22 @@
   			((IPackagesBuildListener)iter.next()).buildFailed(pkg, status);
   	}
   	
  -	private void createScannerCache ()
  +	private void fillScannerCache (List packages)
   	{
  -		scannerCache = new Hashtable();
  +		if (packages == null) return;
  +		
   		for (Iterator iter = packages.iterator(); iter.hasNext(); )
   		{
   			final IPackage pkg = (IPackage) iter.next();
  +			
  +			fillScannerCache(pkg);
  +		}
  +		
  +		Trace.trace(PackageBuildDelegate.class, "scannerCache = " + scannerCache);
  +	}
  +	
  +	private void fillScannerCache (IPackage pkg)
  +	{
   			final Hashtable filesetCache = new Hashtable();
   			
   			scannerCache.put(pkg, filesetCache);
  @@ -180,7 +237,66 @@
   			});
   		}
   		
  -		Trace.trace(getClass(), "scannerCache = " + scannerCache);
  +	/**
  +	 * @return The old directory scanner for this fileset (or null if one did not exist)
  +	 */
  +	private void updateScannerCache (IPackageFileSet fileset)
  +	{
  +		IPackage topPackage = PackagesCore.getTopLevelPackage(fileset);
  +		if (topPackage != null && scannerCache.containsKey(topPackage))
  +		{
  +			Hashtable filesetCache = (Hashtable) scannerCache.get(topPackage);
  +			
  +			if (filesetCache != null)
  +			{
  +				DirectoryScanner scanner = null;
  +				if (filesetCache.containsKey(fileset))
  +				{
  +					scanner = (DirectoryScanner) filesetCache.get(fileset);
  +				}
  +				
  +				filesetCache.put(fileset, ((PackageFileSetImpl)fileset).createDirectoryScanner(true));
  +				
  +				if (scanner != null)
  +				{
  +					oldScanners.put(fileset, scanner);
  +				}
  +			}
  +		}
  +	}
  +	
  +	private void removeScannerCache (IPackageNode node)
  +	{
  +		node.accept(new IPackageNodeVisitor() {
  +			public boolean visit(IPackageNode node) {
  +				if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
  +					removeFilesetScannerCache((IPackageFileSet) node);
  +				return true;
  +			}
  +		});	
  +	}
  +	
  +	private void removeFilesetScannerCache (IPackageFileSet fileset) 
  +	{
  +		IPackage topPackage = PackagesCore.getTopLevelPackage(fileset);
  +		if (topPackage != null && scannerCache.containsKey(topPackage))
  +		{
  +			Hashtable filesetCache = (Hashtable) scannerCache.get(topPackage);
  +			
  +			if (filesetCache != null)
  +			{
  +				DirectoryScanner scanner = null;
  +				if (filesetCache.containsKey(fileset))
  +				{
  +					scanner = (DirectoryScanner) filesetCache.remove(fileset);
  +				}
  +				
  +				if (scanner != null)
  +				{
  +					oldScanners.put(fileset, scanner);
  +				}
  +			}
  +		}
   	}
   	
   	private IPackageFileSet[] findMatchingFilesetsForRemovedFile (IFile removedFile)
  @@ -248,11 +364,31 @@
   	{
   		IPackage pkg = PackagesCore.getTopLevelPackage(fileset);
   		DirectoryScanner scanner = (DirectoryScanner) ((Hashtable)scannerCache.get(pkg)).get(fileset);
  +		DirectoryScanner oldScanner = (DirectoryScanner) oldScanners.get(fileset);
  +		PackageFileSetImpl filesetImpl = (PackageFileSetImpl) fileset;
  +		
  +		if (oldScanner != null)
  +		{
  +			if (fileset.isInWorkspace())
  +			{
  +				IFile oldFiles[] = filesetImpl.findMatchingFiles(oldScanner);
  +				for (int i = 0; i < oldFiles.length; i++)
  +				{
  +					removeFile(oldFiles[i], new IPackageFileSet[] { fileset });
  +				}
  +			} else {
  +				IPath oldPaths[] = filesetImpl.findMatchingPaths(oldScanner);
  +				for (int i = 0; i < oldPaths.length; i++)
  +				{
  +					removePath(oldPaths[i], fileset);
  +				}
  +			}
  +		}
   
   		if (fileset.isInWorkspace())
   		{
   			fireStartedCollectingFileSet(fileset);
  -			IFile matchingFiles[] = ((PackageFileSetImpl)fileset).findMatchingFiles(scanner);
  +			IFile matchingFiles[] = filesetImpl.findMatchingFiles(scanner);
   			fireFinishedCollectingFileSet(fileset);
   			for (int i = 0; i < matchingFiles.length; i++)
   			{
  @@ -260,7 +396,7 @@
   			}
   		} else {
   			fireStartedCollectingFileSet(fileset);
  -			IPath matchingPaths[] = ((PackageFileSetImpl)fileset).findMatchingPaths(scanner);
  +			IPath matchingPaths[] = filesetImpl.findMatchingPaths(scanner);
   			fireFinishedCollectingFileSet(fileset);
   			for (int i = 0; i < matchingPaths.length; i++)
   			{
  @@ -270,10 +406,10 @@
   	}
   	
   	private int buildSteps;
  -	private int countBuildSteps (IPackage pkg)
  +	private int countBuildSteps (IPackageNode node)
   	{
   		buildSteps = 0;
  -		pkg.accept(new IPackageNodeVisitor () {
  +		node.accept(new IPackageNodeVisitor () {
   			public boolean visit (IPackageNode node) {
   				if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
   				{
  @@ -355,14 +491,26 @@
   	
   	public void buildSinglePackage (IPackage pkg, IProgressMonitor monitor)
   	{
  +		this.project = pkg.getProject();
  +		
   		packages = new ArrayList();
   		packages.add(pkg);
   		
  -		createScannerCache();
  -		
   		buildPackage(pkg, monitor);
  +	}
  +	
  +	protected void incrementalBuildUnderNode (IPackageNode node, final IProgressMonitor monitor)
  +	{
  +		IPackage topLevelPackage = PackagesCore.getTopLevelPackage(node);
  +		packages = new ArrayList();
  +		packages.add(topLevelPackage);
  +		this.project = topLevelPackage.getProject();
   		
  -		scannerCache = null;
  +		referencedProjects = new TreeSet();
  +		
  +		fireStartedBuildingPackage(topLevelPackage);
  +		incrementalBuild(null, monitor);
  +		fireFinishedBuildingPackage(topLevelPackage);
   	}
   	
   	public IProject[] build(int kind, Map args, IProgressMonitor monitor)
  @@ -389,7 +537,6 @@
   		}
   		monitor.done();
   		
  -		createScannerCache();
   		try {
   			if (kind == IncrementalProjectBuilder.INCREMENTAL_BUILD || kind == IncrementalProjectBuilder.AUTO_BUILD)
   			{
  @@ -415,16 +562,20 @@
   			}
   		}
   		
  -		scannerCache = null;
  -		
  +		synchronized (nodesToUpdate)
  +		{
   		nodesToUpdate.clear();
  +		}
  +		synchronized (nodesToRemove)
  +		{
   		nodesToRemove.clear();
  +		}
   		building = false;
  -		
  +		delta = null;
   		return (IProject[])referencedProjects.toArray(new IProject[referencedProjects.size()]);
   	}
   	
  -	public static boolean isBuilding() {
  +	public boolean isBuilding() {
   		return building;
   	}
   	
  @@ -487,17 +638,23 @@
   			removeFile(file, filesets);
   		}
   		
  +		synchronized (nodesToUpdate)
  +		{
   		for (Iterator iter = nodesToUpdate.iterator(); iter.hasNext(); )
   		{
   			IPackageNode node = (IPackageNode) iter.next();
   			updateNode(node);
   		}
  +		}
   		
  +		synchronized (nodesToRemove)
  +		{
   		for (Iterator iter = nodesToRemove.iterator(); iter.hasNext(); )
   		{
   			IPackageNode node = (IPackageNode) iter.next();
   			removeNode(node);
   		}
  +		}
   
   		filesToCopy.clear();
   		filesToRemove.clear();
  @@ -681,6 +838,8 @@
   	
   	private void updateFile(IFile file, IPackageFileSet[] filesets, boolean checkStamps)
   	{
  +		synchronized (buildLock)
  +		{
   		for (int i = 0; i < filesets.length; i++)
   		{
   			IPath copyTo = getFileDestinationPath(file, filesets[i]);
  @@ -738,9 +897,12 @@
   			}
   		}
   	}
  +	}
   	
   	private void updatePath(IPath path, IPackageFileSet fileset, boolean checkStamps)
   	{
  +		synchronized (buildLock)
  +		{
   		IPath copyTo = getPathDestinationPath(path, fileset);
   		
   		if (checkStamps)
  @@ -791,8 +953,27 @@
   			}
   		}
   	}
  +	}
  +	
  +	private void deleteEmptyFolders (File child)
  +	{
  +		File parent = (File) child.getParentFile();
  +		
  +		while (parent != null && parent.exists())
  +		{
  +			if (parent.isDirectory())
  +			{
  +				if (parent.list().length == 0) {
  +					parent.delete();
  +				}
  +			}
  +			parent = (File) parent.getParentFile();
  +		}
  +	}
   	
  -	private void removeFile(IFile file, IPackageFileSet[] filesets)
  +	private synchronized void removeFile(IFile file, IPackageFileSet[] filesets)
  +	{
  +		synchronized (buildLock)
   	{
   		for (int i = 0; i < filesets.length; i++)
   		{
  @@ -802,14 +983,20 @@
   			{
   				File packagedFile = packagedFiles[j];
   				if (packagedFile.exists()) packagedFile.deleteAll();
  +					deleteEmptyFolders(packagedFile);
  +				}
   			}
   		}
   	}
   	
  -	private void removePath(IPath path, IPackageFileSet fileset)
  +	private synchronized void removePath(IPath path, IPackageFileSet fileset)
  +	{
  +		synchronized (buildLock)
   	{
   		File packagedFile = new File(getPathDestinationPath(path, fileset).toFile());
   		if (packagedFile.exists()) packagedFile.deleteAll();
  +			deleteEmptyFolders(packagedFile);
  +		}
   	}
   	
   	private void updateNode (IPackageNode node)
  @@ -903,5 +1090,15 @@
   
   	public void setProject(IProject project) {
   		this.project = project;
  +
  +		fillScannerCache(PackagesModel.instance().getProjectPackages(project));
  +	}
  +
  +	public IProject getProject() {
  +		return project;
  +	}
  +
  +	public void setDelta(IResourceDelta delta) {
  +		this.delta = delta;
   	}
   }
  
  
  



More information about the jboss-cvs-commits mailing list