/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * James Blackburn (Broadcom Corp.) Bug306824 add call-backs for getRule/build *******************************************************************************/ package org.eclipse.core.tests.internal.builders; import java.util.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.junit.Assert; /** * An abstract builder that is designed to be extended for testing purposes. */ public abstract class TestBuilder extends IncrementalProjectBuilder { /** * A test specific call-back which can be ticked on #getRule(...) & #build(...) */ public static class BuilderRuleCallback { IncrementalProjectBuilder builder; public BuilderRuleCallback() { } /** * Fetch the scheduling rule for the build */ public ISchedulingRule getRule(String name, IncrementalProjectBuilder builder, int trigger, Map<String, String> args) { return ResourcesPlugin.getWorkspace().getRoot(); } /** * Build call-back */ public IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException { return new IProject[0]; } public IResourceDelta getDelta(IProject project) { return builder.getDelta(project); } } /** * Build rule getter */ volatile BuilderRuleCallback ruleCallBack; /** * Build command parameters. */ public static final String BUILD_ID = "BuildID"; public static final String INTERESTING_PROJECT = "InterestingProject"; /** * Lifecycle event identifiers */ public static final String STARTUP_ON_INITIALIZE = "StartupOnInitialize"; public static final String SET_INITIALIZATION_DATA = "SetInitializationData"; public static final String DEFAULT_BUILD_ID = "Build0"; /** * The arguments for one run of the builder. */ protected Map<String, String> arguments; private IConfigurationElement config = null; private String name = null; private Object data = null; /** * These are static because we want one event set for all builder instances. */ private static final ArrayList<String> expectedEvents = new ArrayList<>(); private static final ArrayList<String> actualEvents = new ArrayList<>(); /** * Logs the given plug-in lifecycle event for this builder's plugin. */ public void addExpectedLifecycleEvent(String event) { expectedEvents.add(event); } /** * Verifies that the given lifecycle events occurred. Throws an assertion * failure if expectations are not met. If successful, clears the list of * expected and actual events in preparation for the next test. */ public void assertLifecycleEvents(String text) { Assert.assertEquals(text, expectedEvents, actualEvents); reset(); } /** * Implements the inherited abstract method in * <code>InternalBuilder</code>. * * @see InternalBuilder#build(IResourceDelta,int,IProgressMonitor) */ @Override protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException { arguments = args == null ? new HashMap<>(1) : args; logPluginLifecycleEvent(getBuildId()); if (ruleCallBack == null) { return new IProject[0]; } ruleCallBack.builder = this; return ruleCallBack.build(kind, args, monitor); } /** * Allow overriding the default scheduling rule * @see IncrementalProjectBuilder#getRule(int, Map) */ @Override public ISchedulingRule getRule(int trigger, Map<String, String> args) { if (ruleCallBack == null) { return super.getRule(trigger, args); } ruleCallBack.builder = this; return ruleCallBack.getRule(name, this, trigger, args); } /** * @param callback callback to be used for fetching rules */ public void setRuleCallback(BuilderRuleCallback callback) { ruleCallBack = callback; } /** * Returns an ID that identifies the current build. */ private String getBuildId() { String buildId = arguments.get(BUILD_ID); if (buildId == null) { buildId = DEFAULT_BUILD_ID; } return buildId; } /** * Return the configuration element that created this builder. * * @see setInitializationData(IConfigurationElement, String, Object) */ public IConfigurationElement getConfigurationElement() { return config; } /** * Return the data, always a <code>Hashtable</code> or <code>String</code>, * that was set when this builder was initialized. * * @see setInitializationData(IConfigurationElement, String, Object) */ public Object getData() { return data; } /** * Return the name of the child configuration element that named this * builder in its class attribute. * * @see setInitializationData(IConfigurationElement, String, Object) */ public String getName() { return name; } /** * Logs the given plug-in lifecycle event for this builder's plugin. */ private void logPluginLifecycleEvent(String event) { actualEvents.add(event); } /** * Resets expected and actual lifecycle events for this builder. */ public void reset() { expectedEvents.clear(); actualEvents.clear(); ruleCallBack = null; } /** * Part of <code>IExecutableExtensionAdaptor</code> interface. * * @see IExecutableExtensionAdaptor * @see IConfigurationElement#createExecutableExtension(String) */ @Override public void setInitializationData(IConfigurationElement config, String name, Object data) { logPluginLifecycleEvent(SET_INITIALIZATION_DATA); this.config = config; this.name = name; this.data = data; } /** * Implemented inherited method from <code>BaseBuilder</code>. * * @see BaseBuilder#startupOnInitialize */ @Override protected void startupOnInitialize() { logPluginLifecycleEvent(STARTUP_ON_INITIALIZE); } }