/** * */ package com.google.gwt.eclipse.testing; import com.google.gdt.eclipse.core.ResourceUtils; import com.google.gdt.eclipse.core.jobs.JobsUtilities; import com.google.gdt.eclipse.core.natures.NatureUtils; import com.google.gwt.eclipse.core.runtime.GWTRuntimeContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.project.IProjectConfigurationManager; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; /** * Maven unit testing utilities. */ public class GwtMavenTestingUtilities { // Copied from Maven2Utils to avoid the extra dependency private static final String MAVEN2_NATURE_ID = "org.eclipse.m2e.core.maven2Nature"; /** * Convert the standard Java project to a Maven project. This will remove the Default GWT sdk and * instead use a GWT Maven sdk distribution. Using the Maven classpath container will allow for * adding a specific GWT version easily. * * TODO Embue the WebAppCreator factory or create a Maven web app factory with Maven creation * options. */ public static void createMavenProject(IProject project, String withGwtSdkVersion) throws Exception { // Remove the default GWT sdk container from classpath, instead use Maven IJavaProject javaProject = JavaCore.create(project); IClasspathEntry[] entriesWithGwtContainer = javaProject.getRawClasspath(); IClasspathEntry[] entriesWithOutGwtContainer = new IClasspathEntry[entriesWithGwtContainer.length - 1]; int b = 0; for (int a = 0; a < entriesWithGwtContainer.length; a++) { String path = entriesWithGwtContainer[a].getPath().toString(); if (!path.contains(GWTRuntimeContainer.CONTAINER_ID)) { entriesWithOutGwtContainer[b] = entriesWithGwtContainer[a]; b++; } } // Removing the GWT SDK classpath entry from project javaProject.setRawClasspath(entriesWithOutGwtContainer, new NullProgressMonitor()); JobsUtilities.waitForIdle(); // Provide a pom.xml for a bare-bones configuration to convert standard project to Maven nature URL url = GwtTestingPlugin.getDefault().getBundle().getResource("resources/pom.xml"); InputStream pomxmlStream = url.openStream(); pomxmlStream = changeGwtSdkVersionInPom(pomxmlStream, withGwtSdkVersion); ResourceUtils.createFile(project.getFullPath().append("pom.xml"), pomxmlStream); // Turn on the Maven nature NatureUtils.addNature(project, MAVEN2_NATURE_ID); JobsUtilities.waitForIdle(); // Maven update project will add the Maven dependencies to the classpath IProjectConfigurationManager projectConfig = MavenPlugin.getProjectConfigurationManager(); projectConfig.updateProjectConfiguration(project, new NullProgressMonitor()); JobsUtilities.waitForIdle(); } /** * Replace the pom.xml GWT version properties with provided GWT version. */ private static InputStream changeGwtSdkVersionInPom(InputStream pomxmlStream, String withGwtSdkVersion) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(pomxmlStream)); StringBuffer modifiedPom = new StringBuffer(); String line; while ((line = reader.readLine()) != null) { String replaceWith = "<gwt.version>" + withGwtSdkVersion + "</gwt.version>"; line = line.replaceFirst("<gwt.version>.*?</gwt.version>", replaceWith); replaceWith = "<gwt.plugin.version>" + withGwtSdkVersion + "</gwt.plugin.version>"; line = line.replaceFirst("<gwt.plugin.version>.*?</gwt.plugin.version>", replaceWith); modifiedPom.append(line + "\n"); } return new ByteArrayInputStream(modifiedPom.toString().getBytes()); } }