Index: src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java =================================================================== RCS file: /home/eclipse/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java,v retrieving revision 1.12 diff -u -r1.12 BuilderNatureTest.java --- src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java 17 Apr 2004 17:12:50 -0000 1.12 +++ src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java 13 Aug 2004 19:42:14 -0000 @@ -160,6 +160,8 @@ //now add the snow nature back and ensure snow builder runs builder.reset(); + builder.addExpectedLifecycleEvent(SnowBuilder.SET_INITIALIZATION_DATA); + builder.addExpectedLifecycleEvent(SnowBuilder.STARTUP_ON_INITIALIZE); builder.addExpectedLifecycleEvent(SnowBuilder.SNOW_BUILD_EVENT); try { IProjectDescription desc = project.getDescription(); @@ -197,6 +199,8 @@ //now re-enable the nature and ensure that the delta was null builder.reset(); + builder.addExpectedLifecycleEvent(SnowBuilder.SET_INITIALIZATION_DATA); + builder.addExpectedLifecycleEvent(SnowBuilder.STARTUP_ON_INITIALIZE); builder.addExpectedLifecycleEvent(SnowBuilder.SNOW_BUILD_EVENT); try { IProjectDescription desc = project.getDescription(); Index: src/org/eclipse/core/tests/internal/builders/BuilderTest.java =================================================================== RCS file: /home/eclipse/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderTest.java,v retrieving revision 1.20 diff -u -r1.20 BuilderTest.java --- src/org/eclipse/core/tests/internal/builders/BuilderTest.java 7 May 2004 19:24:15 -0000 1.20 +++ src/org/eclipse/core/tests/internal/builders/BuilderTest.java 13 Aug 2004 19:42:14 -0000 @@ -281,9 +281,13 @@ fail("4.99", e); } // Build the project + // Note that since the arguments have changed, the identity of the build + // command is different so a new builder will be instantiated try { dirty(file1); project1.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor()); + verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); + verifier.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); verifier.addExpectedLifecycleEvent(TestBuilder.DEFAULT_BUILD_ID); verifier.assertLifecycleEvents("5.2"); } catch (CoreException e) { @@ -307,6 +311,8 @@ } // Build try { + verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); + verifier.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); verifier.addExpectedLifecycleEvent("Project1Build1"); //second builder is touched for the first time verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); @@ -413,6 +419,8 @@ verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); verifier.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); verifier.addExpectedLifecycleEvent("Build1"); + verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); + verifier.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); verifier.addExpectedLifecycleEvent("Build2"); verifier.assertLifecycleEvents("4.0 "); } catch (CoreException e) { @@ -552,6 +560,8 @@ verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); verifier.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); verifier.addExpectedLifecycleEvent("Build1"); + verifier.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); + verifier.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); verifier.addExpectedLifecycleEvent("Build2"); verifier.assertLifecycleEvents("4.0 "); } catch (CoreException e) { Index: src/org/eclipse/core/tests/resources/regression/TestMultipleBuildersOfSameType.java =================================================================== RCS file: src/org/eclipse/core/tests/resources/regression/TestMultipleBuildersOfSameType.java diff -N src/org/eclipse/core/tests/resources/regression/TestMultipleBuildersOfSameType.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/tests/resources/regression/TestMultipleBuildersOfSameType.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,107 @@ +/********************************************************************** + * Copyright (c) 2004 IBM Corporation and others. All rights reserved. This + * program and the accompanying materials are made available under the terms of + * the Common Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM - Initial API and implementation + **********************************************************************/ +package org.eclipse.core.tests.resources.regression; + +import java.io.ByteArrayInputStream; +import java.util.Map; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.tests.harness.WorkspaceSessionTest; +import org.eclipse.core.tests.internal.builders.SortBuilder; +import org.eclipse.core.tests.internal.builders.TestBuilder; + +/** + * Tests that multiple builders of the same type can be installed on a single + * project, and that their deltas are correctly serialized and associated with + * the correct builder in the next session. + */ +public class TestMultipleBuildersOfSameType extends WorkspaceSessionTest { + //various resource handles + private IProject project1; + private IFolder sorted1, unsorted1; + private IFile sortedFile1, unsortedFile1; + + public TestMultipleBuildersOfSameType() { + super(); + } + + public TestMultipleBuildersOfSameType(String name) { + super(name); + } + + protected void setUp() throws Exception { + IWorkspaceRoot root = getWorkspace().getRoot(); + project1 = root.getProject("Project1"); + unsorted1 = project1.getFolder(SortBuilder.UNSORTED_FOLDER); + sorted1 = project1.getFolder(SortBuilder.SORTED_FOLDER); + unsortedFile1 = unsorted1.getFile("File1"); + sortedFile1 = sorted1.getFile("File1"); + } + + /** + * Create projects, setup a builder, and do an initial build. + */ + public void test1() { + IResource[] resources = {project1, unsorted1, sorted1, unsortedFile1}; + ensureExistsInWorkspace(resources, true); + + try { + //give unsorted files some initial content + unsortedFile1.setContents(new ByteArrayInputStream(new byte[] {1, 4, 3}), true, true, null); + + //turn off autobuild + IWorkspace workspace = getWorkspace(); + IWorkspaceDescription desc = workspace.getDescription(); + desc.setAutoBuilding(false); + workspace.setDescription(desc); + + //configure builder for project1 + IProjectDescription description = project1.getDescription(); + description.setBuildSpec(new ICommand[] { + createCommand(description, "Project1Build1"), + createCommand(description, "Project1Build2")}); + project1.setDescription(description, getMonitor()); + + //initial build -- created sortedFile1 + workspace.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor()); + + getWorkspace().save(true, getMonitor()); + } catch (CoreException e) { + fail("2.0", e); + } + } + protected ICommand createCommand(IProjectDescription description, String builderId) { + ICommand command = description.newCommand(); + Map args = command.getArguments(); + args.put(TestBuilder.BUILD_ID, builderId); + command.setBuilderName(SortBuilder.BUILDER_NAME); + command.setArguments(args); + return command; + } + + /** + * Do another build immediately after restart. Builder1 should be invoked because it cares + * about changes made by Builder2 during the last build phase. + */ + public void test2() { + try { + getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor()); + } catch (CoreException e) { + fail("1.99", e); + } + //Only builder1 should have been built + SortBuilder[] builders = SortBuilder.allInstances(); + assertEquals("1.0", 2, builders.length); + assertTrue("1.1", builders[0].wasBuilt()); + assertTrue("1.2", builders[0].wasIncrementalBuild()); + assertTrue("1.3", !builders[1].wasBuilt()); + } + +}