[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