Bug 529357: Expose the build kind constant values

Adding a new "Build"-Module which exposes the build kind constants and a
method "build" which triggers a build on a project.

Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=529357
Change-Id: I887fb25b0fc6ad9ba40e278d7fa855796dc2633e
Signed-off-by: Martin SCHREIBER <m.schreiber@bachmann.info>
diff --git a/plugins/org.eclipse.ease.modules.platform/plugin.xml b/plugins/org.eclipse.ease.modules.platform/plugin.xml
index d083d6e..df86009 100644
--- a/plugins/org.eclipse.ease.modules.platform/plugin.xml
+++ b/plugins/org.eclipse.ease.modules.platform/plugin.xml
@@ -23,6 +23,13 @@
             name="OSGI"
             visible="true">
       </module>
+      <module
+            category="org.eclipse.ease.category.system"
+            class="org.eclipse.ease.modules.platform.build.BuildModule"
+            id="org.eclipse.ease.modules.platform.build"
+            name="Build"
+            visible="true">
+      </module>
    </extension>
    <extension
          point="org.eclipse.ease.ui.shell">
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/build/BuildModule.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/build/BuildModule.java
new file mode 100644
index 0000000..4e61283
--- /dev/null
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/build/BuildModule.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Bachmann electronic GmbH 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:
+ *     Bachmann electronic GmbH - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ease.modules.platform.build;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.ease.modules.AbstractScriptModule;
+import org.eclipse.ease.modules.ScriptParameter;
+import org.eclipse.ease.modules.WrapToScript;
+
+/**
+ * Provides capabilities to build workspace projects.
+ *
+ * <p>
+ * A simple example of its use is:
+ *
+ * <pre>
+ * loadModule("/System/Build");
+ * build("MyProject", FULL_BUILD);
+ * </pre>
+ *
+ * to trigger a full build of the project "MyProject".
+ * </p>
+ */
+public class BuildModule extends AbstractScriptModule {
+
+	/** Build kind constant indicating a full build request (6) */
+	@WrapToScript
+	public static final int FULL_BUILD = IncrementalProjectBuilder.FULL_BUILD;
+
+	/** Build kind constant indicating a clean build request (15) */
+	@WrapToScript
+	public static final int CLEAN_BUILD = IncrementalProjectBuilder.CLEAN_BUILD;
+
+	/** Build kind constant indicating an incremental build request (10). */
+	@WrapToScript
+	public static final int INCREMENTAL_BUILD = IncrementalProjectBuilder.INCREMENTAL_BUILD;
+
+	private final IWorkspaceRoot fRoot;
+
+	public BuildModule() {
+		this(ResourcesPlugin.getWorkspace().getRoot());
+	}
+
+	protected BuildModule(IWorkspaceRoot root) {
+		fRoot = root;
+	}
+
+	/**
+	 * Builds a project with the given name and build kind.
+	 *
+	 * @scriptExample buildProject("myproject", CLEAN_BUILD); to make a clean build on the project "myproject"
+	 * @param projectName
+	 *            the project name
+	 * @param buildKind
+	 *            one of {@link #FULL_BUILD}, {@link #CLEAN_BUILD}, {@link #INCREMENTAL_BUILD}
+	 * @throws CoreException
+	 *             if the build fails
+	 */
+	@WrapToScript
+	public void build(String projectName, @ScriptParameter(defaultValue = "6") int buildKind) throws CoreException {
+		final IProject project = fRoot.getProject(projectName);
+		if (project.isAccessible()) {
+			project.build(buildKind, new NullProgressMonitor());
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/build/BuildModuleTest.java b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/build/BuildModuleTest.java
new file mode 100644
index 0000000..4ece183
--- /dev/null
+++ b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/build/BuildModuleTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Bachmann electronic GmbH 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:
+ *     Bachmann electronic GmbH - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ease.modules.platform.build;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test Class for the {@link BuildModule}
+ */
+public class BuildModuleTest {
+
+	private BuildModule fModule;
+	private IWorkspaceRoot fRoot;
+	private IProject fProject;
+
+	@Before
+	public void setup() {
+		fProject = mock(IProject.class);
+		fRoot = mock(IWorkspaceRoot.class);
+		fModule = new BuildModule(fRoot);
+		when(fRoot.getProject("MyProject")).thenReturn(fProject);
+	}
+
+	@Test
+	public void buildDoesCallProjectsBuildMethodIfProjectExists() throws CoreException {
+		when(fProject.isAccessible()).thenReturn(true);
+		fModule.build("MyProject", BuildModule.CLEAN_BUILD);
+		verify(fProject, times(1)).build(eq(IncrementalProjectBuilder.CLEAN_BUILD), any(NullProgressMonitor.class));
+	}
+
+	@Test
+	public void buildDoesNotCallProjectsBuildMethodIfProjectNotExists() throws CoreException {
+		when(fProject.isAccessible()).thenReturn(false);
+		fModule.build("MyProject", BuildModule.CLEAN_BUILD);
+		verify(fProject, never()).build(eq(IncrementalProjectBuilder.CLEAN_BUILD), any(NullProgressMonitor.class));
+	}
+
+}