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

Marshall Culpepper mculpepper at jboss.com
Wed Feb 28 11:36:43 EST 2007


  User: mculpepper
  Date: 07/02/28 11:36:43

  Modified:    core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/project/build  
                        BuildEvents.java BuildFileOperations.java
  Log:
  moved the scanner cache and changePackage/changeFileset methods over to BuildFileOperations (analagous w/ removePackage/Fileset updatePackage/Fileset).
  
  lots of bug fixes in build file operations, all unit tests should now be 100% again, including a new test for overlapping filesets.
  
  Revision  Changes    Path
  1.3       +174 -255  jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/project/build/BuildEvents.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: BuildEvents.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/project/build/BuildEvents.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- BuildEvents.java	27 Feb 2007 18:49:51 -0000	1.2
  +++ BuildEvents.java	28 Feb 2007 16:36:43 -0000	1.3
  @@ -1,11 +1,8 @@
   package org.jboss.ide.eclipse.packages.core.project.build;
   
  -import java.util.Hashtable;
   import java.util.Iterator;
   import java.util.List;
   
  -import org.apache.tools.ant.DirectoryScanner;
  -import org.eclipse.core.resources.IFile;
   import org.eclipse.core.resources.IProject;
   import org.eclipse.core.runtime.IPath;
   import org.eclipse.core.runtime.IStatus;
  @@ -14,25 +11,18 @@
   import org.jboss.ide.eclipse.packages.core.model.IPackage;
   import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
   import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
  -import org.jboss.ide.eclipse.packages.core.model.IPackageNodeVisitor;
   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.internal.PackageFileSetImpl;
   import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
   
  -import de.schlichtherle.io.ArchiveDetector;
  -import de.schlichtherle.io.File;
  -
   public class BuildEvents implements IPackagesModelListener {
   
   	private PackageBuildDelegate builder;
   	private NullProgressMonitor nullMonitor = new NullProgressMonitor();
  -	private Hashtable scannerCache;
   	
   	public BuildEvents (PackageBuildDelegate builder)
   	{
   		this.builder = builder;
  -		this.scannerCache = new Hashtable();
   		
   		PackagesModel.instance().addPackagesModelListener(this);
   	}
  @@ -142,32 +132,11 @@
   		
   		if (added.getNodeType() == IPackageNode.TYPE_PACKAGE)
   		{
  -			updateScannerCache ((IPackage) added);
  +			builder.getFileOperations().updateScannerCache ((IPackage) added);
   		}
   		else if (added.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
   		{
  -			updateScannerCache ((IPackageFileSet)added);
  -		}
  -	}
  -
  -	public void updateScannerCache (IPackageFileSet fileset)
  -	{
  -		scannerCache.put(fileset, ((PackageFileSetImpl)fileset).createDirectoryScanner(true));
  -	}
  -	
  -	public void updateScannerCache (IPackage pkg)
  -	{
  -		if (pkg.isTopLevel())
  -		{
  -			pkg.accept(new IPackageNodeVisitor () {
  -				public boolean visit(IPackageNode node) {
  -					if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
  -					{
  -						updateScannerCache((IPackageFileSet)node);
  -					}
  -					return true;
  -				}
  -			});
  +			builder.getFileOperations().updateScannerCache ((IPackageFileSet)added);
   		}
   	}
   	
  @@ -179,60 +148,11 @@
   		
   		if (changed.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
   		{
  -			filesetChanged ((IPackageFileSet)changed);
  +			builder.getFileOperations().changeFileset ((IPackageFileSet)changed);
   		}
   		else if (changed.getNodeType() == IPackageNode.TYPE_PACKAGE)
   		{
  -			packageChanged ((IPackage)changed);
  -		}
  -	}
  -
  -	private void filesetChanged (IPackageFileSet fileset)
  -	{
  -		builder.getFileOperations().updateNode(fileset);
  -		IPackageFileSet filesets[] = new IPackageFileSet[] { fileset };
  -		PackageFileSetImpl filesetImpl = (PackageFileSetImpl) fileset;
  -		
  -		DirectoryScanner oldScanner = (DirectoryScanner) scannerCache.get(fileset);
  -		
  -		if (oldScanner != null)
  -		{
  -			if (fileset.isInWorkspace())
  -			{
  -				IFile oldFiles[] = filesetImpl.findMatchingFiles(oldScanner);
  -				for (int i = 0; i < oldFiles.length; i++)
  -				{
  -					builder.getFileOperations().removeFileFromFilesets(oldFiles[i], filesets);
  -				}
  -			} else {
  -				IPath oldPaths[] = filesetImpl.findMatchingPaths(oldScanner);
  -				for (int i = 0; i < oldPaths.length; i++)
  -				{
  -					builder.getFileOperations().removePathFromFilesets(oldPaths[i], filesets);
  -				}
  -			}
  -		}
  -	}
  -	
  -	private void packageChanged (IPackage pkg)
  -	{
  -		File packageFile = TruezipUtil.getPackageFile(pkg);
  -		
  -		if (! packageFile.getName().equals(pkg.getName()))
  -		{
  -			// File name was changed, rename
  -			File newPackageFile = new File(packageFile.getParent(), pkg.getName());
  -			packageFile.renameTo(newPackageFile, packageFile.getArchiveDetector());
  -		}
  -		else if (packageFile.getDelegate().isFile() && pkg.isExploded())
  -		{
  -			// Changed to exploded from compressed
  -			packageFile.renameTo(packageFile, ArchiveDetector.DEFAULT);
  -		}
  -		else if (packageFile.getDelegate().isDirectory() && !pkg.isExploded())
  -		{
  -			//	Changed to compressed from exploded
  -			packageFile.renameTo(packageFile, ArchiveDetector.NULL);
  +			builder.getFileOperations().changePackage((IPackage)changed);
   		}
   	}
   	
  @@ -251,5 +171,4 @@
   			}
   		}
   	}
  -
   }
  
  
  
  1.2       +401 -253  jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/project/build/BuildFileOperations.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: BuildFileOperations.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/project/build/BuildFileOperations.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  --- BuildFileOperations.java	26 Feb 2007 19:17:44 -0000	1.1
  +++ BuildFileOperations.java	28 Feb 2007 16:36:43 -0000	1.2
  @@ -5,7 +5,9 @@
   import java.io.IOException;
   import java.io.InputStream;
   import java.io.OutputStream;
  +import java.util.ArrayList;
   import java.util.Hashtable;
  +import java.util.Iterator;
   
   import org.apache.tools.ant.DirectoryScanner;
   import org.eclipse.core.resources.IFile;
  @@ -21,19 +23,23 @@
   import org.jboss.ide.eclipse.packages.core.model.IPackageFolder;
   import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
   import org.jboss.ide.eclipse.packages.core.model.IPackageNodeVisitor;
  +import org.jboss.ide.eclipse.packages.core.model.PackagesCore;
   import org.jboss.ide.eclipse.packages.core.model.internal.PackageFileSetImpl;
   import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
   
  +import de.schlichtherle.io.ArchiveDetector;
   import de.schlichtherle.io.File;
   
   public class BuildFileOperations {
   
   	private PackageBuildDelegate builder;
  +	private Hashtable scannerCache;
   	private NullProgressMonitor nullMonitor = new NullProgressMonitor();
   	
   	public BuildFileOperations (PackageBuildDelegate builder)
   	{
   		this.builder = builder;
  +		this.scannerCache = new Hashtable();
   	}
   	
   	public void removeFileFromFilesets (IFile file, IPackageFileSet[] filesets)
  @@ -45,7 +51,7 @@
   	{
   		for (int i = 0; i < filesets.length; i++)
   		{
  -			Hashtable pkgsAndPathways = PackagesModel.instance().getTopLevelPackageAndPathway(filesets[i]);
  +			Hashtable pkgsAndPathways = PackagesModel.instance().getTopLevelPackagesAndPathways(filesets[i]);
   			File[] packagedFiles = TruezipUtil.createFiles(filesets[i], getFilesetRelativePath(path, filesets[i]), pkgsAndPathways);
   			IPackage[] topLevelPackages = (IPackage[])
   				pkgsAndPathways.keySet().toArray(new IPackage[pkgsAndPathways.keySet().size()]);
  @@ -153,7 +159,7 @@
   		}
   	}
   
  -	public synchronized void removeFileset (final IPackageFileSet fileset)
  +	public synchronized void removeFileset (IPackageFileSet fileset)
   	{
   		DirectoryScanner scanner = ((PackageFileSetImpl)fileset).createDirectoryScanner(true);
   		IPackageFileSet filesets[] = new IPackageFileSet[] { fileset };
  @@ -164,9 +170,12 @@
   		
   		for (int i = 0; i < matchingPaths.length; i++)
   		{
  +			if (!otherFilesetsMatch(matchingPaths[i], fileset))
  +			{
   			removePathFromFilesets(matchingPaths[i], filesets);
   		}
   	}
  +	}
   
   	public synchronized void removeFolder (IPackageFolder folder)
   		{
  @@ -250,4 +259,143 @@
   			return copyTo;
   		}
   	}
  +	
  +	public IPath getTopLevelPackageRelativePath (IPath absolutePath, ArrayList pathway, IPackageFileSet fileset)
  +	{
  +		IPath filesetRelativePath = getFilesetRelativePath(absolutePath, fileset);
  +		IPath topPath = new Path("");
  +		for (Iterator iter = pathway.iterator(); iter.hasNext(); )
  +		{
  +			IPackageNode pathNode = (IPackageNode) iter.next();
  +			switch (pathNode.getNodeType())
  +			{
  +				case IPackageNode.TYPE_PACKAGE:
  +				case IPackageNode.TYPE_PACKAGE_REFERENCE:
  +				{
  +					topPath = topPath.append(((IPackage)pathNode).getName());
  +				} break;
  +				
  +				case IPackageNode.TYPE_PACKAGE_FOLDER:
  +				{
  +					topPath = topPath.append(((IPackageFolder)pathNode).getName());
  +				}
  +			}
  +		}
  +
  +		topPath = topPath.append(filesetRelativePath);
  +		return topPath;
  +	}
  +	
  +	public void updateScannerCache (IPackageFileSet fileset)
  +	{
  +		scannerCache.put(fileset, ((PackageFileSetImpl)fileset).createDirectoryScanner(true));
  +	}
  +	
  +	public void updateScannerCache (IPackage pkg)
  +	{
  +		if (pkg.isTopLevel())
  +		{
  +			pkg.accept(new IPackageNodeVisitor () {
  +				public boolean visit(IPackageNode node) {
  +					if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
  +					{
  +						updateScannerCache((IPackageFileSet)node);
  +					}
  +					return true;
  +				}
  +			});
  +		}
  +	}
  +	
  +	private boolean otherMatches = false;
  +	private boolean otherFilesetsMatch (final IPath absolutePath, final IPackageFileSet current)
  +	{
  +		otherMatches = false;
  +		Hashtable pkgsAndPathways = PackagesModel.instance().getTopLevelPackagesAndPathways(current);
  +		
  +		for (Iterator pkgIter = pkgsAndPathways.keySet().iterator(); pkgIter.hasNext(); )
  +		{
  +			final IPackage topLevelPackage = (IPackage) pkgIter.next();
  +			final ArrayList pathway = (ArrayList) pkgsAndPathways.get(topLevelPackage);
  +			
  +			final IPath destPath = getTopLevelPackageRelativePath(absolutePath, pathway, current);
  +			
  +			topLevelPackage.accept(new IPackageNodeVisitor () {
  +				public boolean visit(IPackageNode node) {
  +					if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
  +					{
  +						IPackageFileSet fileset = (IPackageFileSet) node;
  +						if (fileset != current)
  +						{
  +							IPath currentDestPath = getTopLevelPackageRelativePath(absolutePath, pathway, fileset);
  +							if (currentDestPath.equals(destPath))
  +							{
  +								otherMatches = true;
  +								return false;
  +							}
  +						}
  +					}
  +					return true;
  +				}
  +			});
  +		}
  +		return otherMatches;
  +	}
  +	
  +	public void changePackage (IPackage pkg)
  +	{
  +		File packageFile = TruezipUtil.getPackageFile(pkg);
  +		
  +		if (! packageFile.getName().equals(pkg.getName()))
  +		{
  +			// File name was changed, rename
  +			File newPackageFile = new File(packageFile.getParent(), pkg.getName());
  +			packageFile.renameTo(newPackageFile, packageFile.getArchiveDetector());
  +		}
  +		else if (packageFile.getDelegate().isFile() && pkg.isExploded())
  +		{
  +			// Changed to exploded from compressed
  +			File tmpFile = new File(packageFile.getParent(), "_tmp_" + pkg.getName(), ArchiveDetector.NULL);
  +			File newPackageFile = new File(packageFile.getParent(), pkg.getName(), ArchiveDetector.NULL);
  +			
  +			packageFile.renameTo(tmpFile, ArchiveDetector.NULL);
  +			tmpFile.renameTo(newPackageFile, ArchiveDetector.NULL);
  +		}
  +		else if (packageFile.getDelegate().isDirectory() && !pkg.isExploded())
  +		{
  +			//	Changed to compressed from exploded
  +			File tmpFile = new File(packageFile.getParent(), "_tmp_" + pkg.getName());
  +			packageFile.renameTo(tmpFile, ArchiveDetector.DEFAULT);
  +			tmpFile.renameTo(packageFile, ArchiveDetector.DEFAULT);
  +		}
  +	}
  +	
  +	public void changeFileset (IPackageFileSet fileset)
  +	{
  +		updateNode(fileset);
  +		IPackageFileSet filesets[] = new IPackageFileSet[] { fileset };
  +		PackageFileSetImpl filesetImpl = (PackageFileSetImpl) fileset;
  +		
  +		DirectoryScanner oldScanner = (DirectoryScanner) scannerCache.get(fileset);
  +		
  +		if (oldScanner != null)
  +		{
  +			IPath oldPaths[] = filesetImpl.findMatchingPaths(oldScanner);
  +			for (int i = 0; i < oldPaths.length; i++)
  +			{
  +				if (!otherFilesetsMatch(oldPaths[i], fileset))
  +				{
  +					removePathFromFilesets(oldPaths[i], filesets);
  +				}
  +			}
  +		}
  +		
  +		IPath newPaths[] = filesetImpl.findMatchingPaths();
  +		for (int i = 0; i < newPaths.length; i++)
  +		{
  +			updatePathInFilesets(newPaths[i], filesets, false);
  +		}
  +		
  +		updateScannerCache(fileset);
  +	}
   }
  
  
  



More information about the jboss-cvs-commits mailing list