[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
Fri Feb 9 14:06:25 EST 2007


  User: mculpepper
  Date: 07/02/09 14:06:25

  Modified:    core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/model/internal 
                        PackageBuildDelegate.java
  Log:
  tons of bug fixes.. incremental building should be working for the most part now, with a few exotic use cases still needing unit tests
  
  Revision  Changes    Path
  1.8       +125 -55   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.7
  retrieving revision 1.8
  diff -u -b -r1.7 -r1.8
  --- PackageBuildDelegate.java	20 Dec 2006 19:56:40 -0000	1.7
  +++ PackageBuildDelegate.java	9 Feb 2007 19:06:25 -0000	1.8
  @@ -29,9 +29,11 @@
   import java.util.ArrayList;
   import java.util.Hashtable;
   import java.util.Iterator;
  +import java.util.List;
   import java.util.Map;
   
   import org.apache.tools.ant.DirectoryScanner;
  +import org.eclipse.core.resources.IContainer;
   import org.eclipse.core.resources.IFile;
   import org.eclipse.core.resources.IProject;
   import org.eclipse.core.resources.IResource;
  @@ -65,11 +67,11 @@
   public class PackageBuildDelegate implements IPackagesModelListener {
   	private ArrayList referencedProjects;
   	private Hashtable scannerCache;
  -	private IPackage packages[];
  +	private List packages;
   	private ArrayList nodesToUpdate, nodesToRemove;
   	private IProject project;
   	private IResourceDelta delta;
  -	
  +	private static boolean building;
   	
   	public PackageBuildDelegate (PackagesBuilder builder)
   	{
  @@ -88,6 +90,7 @@
   		
   		nodesToUpdate = new ArrayList();
   		nodesToRemove = new ArrayList();
  +		
   		PackagesModel.instance().addPackagesModelListener(this);
   	}
   	
  @@ -153,9 +156,9 @@
   	private void createScannerCache ()
   	{
   		scannerCache = new Hashtable();
  -		for (int i = 0; i < packages.length; i++)
  +		for (Iterator iter = packages.iterator(); iter.hasNext(); )
   		{
  -			final IPackage pkg = packages[i];
  +			final IPackage pkg = (IPackage) iter.next();
   			final Hashtable filesetCache = new Hashtable();
   			
   			scannerCache.put(pkg, filesetCache);
  @@ -165,15 +168,54 @@
   					if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
   					{
   						PackageFileSetImpl fileset = (PackageFileSetImpl) node;
  +						
  +						Trace.trace(getClass(), "adding " + fileset + " @" + fileset.hashCode() + " to scanner cache.");
   						filesetCache.put(fileset, fileset.createDirectoryScanner(true));
   					}
   					return true;
   				}
   			});
   		}
  +		
  +		Trace.trace(getClass(), "scannerCache = " + scannerCache);
   	}
   	
  -	private IPackageFileSet[] findMatchingFilesets (IFile file)
  +	private IPackageFileSet[] findMatchingFilesetsForRemovedFile (IFile removedFile)
  +	{
  +		ArrayList filesets = new ArrayList();
  +		
  +		for (Iterator iter = scannerCache.keySet().iterator(); iter.hasNext(); )
  +		{
  +			IPackage pkg = (IPackage) iter.next();
  +			Hashtable scanners = (Hashtable) scannerCache.get(pkg);
  +			
  +			for (Iterator filesetIter = scanners.keySet().iterator(); filesetIter.hasNext(); )
  +			{
  +				PackageFileSetImpl fileset = (PackageFileSetImpl) filesetIter.next();
  +				
  +				IContainer root = fileset.getSourceContainer();
  +				IPath relativePath = removedFile.getFullPath();
  +				IPath rootPath = root.getFullPath();
  +				relativePath = relativePath.removeFirstSegments(rootPath.segmentCount());
  +				
  +				boolean matchesIncludes = DirectoryScanner.match(fileset.getIncludesPattern(), relativePath.toString());
  +				boolean matchesExcludes = false;
  +				if (fileset.getExcludesPattern() != null && fileset.getExcludesPattern().length() > 0)
  +				{
  +					matchesExcludes = DirectoryScanner.match(fileset.getExcludesPattern(), relativePath.toString());
  +				}
  +				
  +				if (matchesIncludes && !matchesExcludes)
  +				{
  +					filesets.add(fileset);
  +				}
  +			}
  +		}
  +		
  +		return (IPackageFileSet[]) filesets.toArray(new IPackageFileSet[filesets.size()]);
  +	}
  +	
  +	private IPackageFileSet[] findMatchingFilesets (IFile file, boolean rescan)
   	{
   		ArrayList filesets = new ArrayList();
   		
  @@ -187,6 +229,8 @@
   				PackageFileSetImpl fileset = (PackageFileSetImpl) filesetIter.next();
   				DirectoryScanner scanner = (DirectoryScanner) scanners.get(fileset);
   				
  +				if (rescan) scanner.scan();
  +				
   				if (fileset.matchesFile(scanner, file))
   				{
   					filesets.add(fileset);
  @@ -266,24 +310,32 @@
   			}
   		}
   		
  +		try {
  +			File.umount();
  +		} catch (ArchiveException e) {
  +			Trace.trace(getClass(), e);
  +		}
  +		
   		monitor.done();
   		fireFinishedBuildingPackage(pkg);
   	}
   	
   	private void fullBuild(Map args,  IProgressMonitor monitor)
   	{
  -		for (int i = 0; i < packages.length; i++)
  +		for (Iterator iter = packages.iterator(); iter.hasNext(); )
   		{
  -			buildPackage(packages[i], monitor);
  +			IPackage pkg = (IPackage) iter.next();
  +			buildPackage(pkg, monitor);
   		}
   	}
   	
   	private void cleanBuild(Map args, IProgressMonitor monitor)
   	{
  -		monitor.beginTask("Cleaning packages...", packages.length);
  -		for (int i = 0; i < packages.length; i++)
  +		monitor.beginTask("Cleaning packages...", packages.size());
  +		for (Iterator iter = packages.iterator(); iter.hasNext(); )
   		{
  -			IFile packageFile = packages[i].getPackageFile();
  +			IPackage pkg = (IPackage) iter.next();
  +			IFile packageFile = pkg.getPackageFile();
   			
   			if (packageFile.exists())
   			{
  @@ -300,7 +352,9 @@
   	
   	public void buildSinglePackage (IPackage pkg, IProgressMonitor monitor)
   	{
  -		packages = new IPackage[] { pkg };
  +		packages = new ArrayList();
  +		packages.add(pkg);
  +		
   		createScannerCache();
   		
   		buildPackage(pkg, monitor);
  @@ -311,13 +365,17 @@
   	public IProject[] build(int kind, Map args, IProgressMonitor monitor)
   		throws CoreException {
   
  +		building = true;
   		referencedProjects = new ArrayList();
   		
  -		packages = PackagesCore.getProjectPackages(project, monitor);
  -		monitor.beginTask("Finding referenced projects...", packages.length);
  -		for (int i = 0; i < packages.length; i++)
  +		if (packages == null) return new IProject[0];
  +		
  +		packages = PackagesModel.instance().getProjectPackages(project);
  +		monitor.beginTask("Finding referenced projects...", packages.size());
  +		for (Iterator iter = packages.iterator(); iter.hasNext(); )
   		{
  -			referencedProjects.addAll(PackagesExport.findReferencedProjects(project, packages[i]));
  +			IPackage pkg = (IPackage) iter.next();
  +			referencedProjects.addAll(PackagesExport.findReferencedProjects(project, pkg));
   			monitor.worked(1);
   		}
   		monitor.done();
  @@ -352,23 +410,17 @@
   		
   		nodesToUpdate.clear();
   		nodesToRemove.clear();
  +		building = false;
  +		
   		return (IProject[])referencedProjects.toArray(new IProject[referencedProjects.size()]);
   	}
   	
  -	private Hashtable filesToCopy, filesToRemove;
  -	/*
  -	 * This method is responsible for throwing the proper events itself
  -	 * as to which packages are going to be changed.
  -	 */
  -	private void incrementalBuild(Map args, final IProgressMonitor monitor)
  -	{
  -		filesToCopy = new Hashtable();
  -		filesToRemove = new Hashtable();
  -		final ArrayList packagesBeingChanged = new ArrayList();
  -		for (Iterator iter = referencedProjects.iterator(); iter.hasNext(); )
  -		{
  -			final IProject project = (IProject) iter.next();
  +	public static boolean isBuilding() {
  +		return building;
  +	}
   			
  +	private void processDelta (final IProject project, final ArrayList packagesBeingChanged, final IProgressMonitor monitor)
  +	{
   			if (delta != null)
   			{
   				try {
  @@ -385,6 +437,24 @@
   			}
   		}
   		
  +	private Hashtable filesToCopy, filesToRemove;
  +	/*
  +	 * This method is responsible for throwing the proper events itself
  +	 * as to which packages are going to be changed.
  +	 */
  +	private void incrementalBuild(Map args, final IProgressMonitor monitor)
  +	{
  +		filesToCopy = new Hashtable();
  +		filesToRemove = new Hashtable();
  +		ArrayList packagesBeingChanged = new ArrayList();
  +		for (Iterator iter = referencedProjects.iterator(); iter.hasNext(); )
  +		{
  +			IProject project = (IProject) iter.next();
  +			processDelta(project, packagesBeingChanged, monitor);
  +		}
  +		
  +		processDelta(this.project, packagesBeingChanged, monitor);
  +		
   		// alert this package is being changed
   		for( int i = 0; i < packagesBeingChanged.size(); i++ ) {
   			IPackage p = (IPackage)packagesBeingChanged.get(i);
  @@ -431,24 +501,22 @@
   
   	}
   	
  -	private IPackage getPackageFromFile (IFile file)
  -	{
  -		for (int i = 0; i < packages.length; i++)
  +	private void processFileDelta (IProject project, IResourceDelta delta, ArrayList packagesBeingChanged, IProgressMonitor monitor)
   		{
  -			if (packages[i].getName().equals(file.getName()) && packages[i].getDestinationContainer().equals(file.getParent()))
  +		IFile file = (IFile) delta.getResource();
  +		
  +		Trace.trace(getClass(), "processing file delta for file \"" + file.getName() + "\"");
  +		
  +		IPackageFileSet[] filesets = new IPackageFileSet[0];
  +		if ((delta.getKind() & IResourceDelta.REMOVED) > 0)
   			{
  -				return packages[i];
  -			}
  -		}
  -		return null;
  +			filesets = findMatchingFilesetsForRemovedFile(file); 
  +		} else {
  +			filesets = findMatchingFilesets(file,true);
   	}
   	
  -	private void processFileDelta (IProject project, IResourceDelta delta, ArrayList packagesBeingChanged, IProgressMonitor monitor)
  -	{
  -		IFile file = (IFile) delta.getResource();
  -		IPackageFileSet[] filesets = findMatchingFilesets(file);
  -		IPackage pkg = getPackageFromFile(file);
  -		if ((delta.getFlags() & IResourceDelta.REMOVED) > 0)
  +		IPackage pkg = PackagesCore.getPackage(file);
  +		if ((delta.getKind() & IResourceDelta.REMOVED) > 0)
   		{
   			if (pkg != null)
   			{
  @@ -461,21 +529,20 @@
   		{
   			// Is this right?? Is the parent guarenteed to be a package?
   			for( int i = 0; i < filesets.length; i++ ) {
  -				IPackageNode n = filesets[i].getParent();
  -				if( n instanceof IPackage ) 
  -					packagesBeingChanged.add(n);
  +				IPackage parentPackage = PackagesCore.getParentPackage(filesets[i]);
  +				packagesBeingChanged.add(parentPackage);
   			}
   			
   			
  -			if ((delta.getFlags() & IResourceDelta.ADDED) > 0)
  +			if ((delta.getKind() & IResourceDelta.ADDED) > 0)
   			{
   				filesToCopy.put(file, filesets);
   			}
  -			else if ((delta.getFlags() & IResourceDelta.CONTENT) > 0 || (delta.getFlags() & IResourceDelta.CHANGED) > 0)
  +			else if ((delta.getKind() & IResourceDelta.CONTENT) > 0 || (delta.getKind() & IResourceDelta.CHANGED) > 0)
   			{
   				filesToCopy.put(file, filesets);
   			}
  -			else if ((delta.getFlags() & IResourceDelta.REMOVED) > 0)
  +			else if ((delta.getKind() & IResourceDelta.REMOVED) > 0)
   			{
   				filesToRemove.put(file, filesets);
   			}
  @@ -691,7 +758,7 @@
   	{
   		for (int i = 0; i < filesets.length; i++)
   		{
  -			File packagedFile = new File(getFileDestinationPath(file, filesets[i]).toFile());
  +			File packagedFile = createFile(filesets[i], getFileDestinationPath(file, filesets[i]));
   			
   			if (packagedFile.exists()) packagedFile.deleteAll();
   		}
  @@ -792,4 +859,7 @@
   //		if (file.exists()) file.deleteAll();
   	}
   
  +	public void setProject(IProject project) {
  +		this.project = project;
  +	}
   }
  
  
  



More information about the jboss-cvs-commits mailing list