diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPageTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPageTest.java index 355a0dcf09..d55b7500d7 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPageTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPageTest.java @@ -18,13 +18,20 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesInput; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesWizardUi; import com.google.cloud.tools.eclipse.test.util.ui.CompositeUtil; import com.google.cloud.tools.eclipse.test.util.ui.ShellTestResource; -import org.eclipse.jface.wizard.WizardPage; +import com.google.common.base.Predicate; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Text; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -34,6 +41,7 @@ public class AppEngineWizardPageTest { @Rule public ShellTestResource shellResource = new ShellTestResource(); private AppEngineWizardPage page; + private MavenCoordinatesInput mavenCoordinatesInput; @Before public void setUp() { @@ -42,6 +50,12 @@ public void setUp() { public void setHelp(Composite container) { // Do nothing in tests. } + + @Override + protected MavenCoordinatesInput createMavenCoordinatesInput(Composite container) { + mavenCoordinatesInput = new MavenCoordinatesWizardUi(container, SWT.NONE); + return mavenCoordinatesInput; + } }; page.createControl(shellResource.getShell()); } @@ -58,8 +72,8 @@ public void testSuggestPackageName() { @Test public void testAutoPackageNameSetterOnGroupIdChange_whitespaceInGroupId() { - Text groupIdField = getFieldWithLabel(page, "Group ID:"); - Text javaPackageField = getFieldWithLabel(page, "Java package:"); + Text groupIdField = getFieldWithLabel("Group ID:"); + Text javaPackageField = getFieldWithLabel("Java package:"); groupIdField.setText(" "); // setText() triggers VerifyEvent. assertEquals("", javaPackageField.getText()); @@ -87,8 +101,8 @@ public void testAutoPackageNameSetterOnGroupIdChange_whitespaceInGroupId() { public void testAutoPackageNameSetterOnGroupIdChange_disbledOnUserChange() { assertTrue(page.autoGeneratePackageName); - Text groupIdField = getFieldWithLabel(page, "Group ID:"); - Text javaPackageField = getFieldWithLabel(page, "Java package:"); + Text groupIdField = getFieldWithLabel("Group ID:"); + Text javaPackageField = getFieldWithLabel("Java package:"); groupIdField.setText("abc"); assertEquals("abc", javaPackageField.getText()); @@ -108,8 +122,82 @@ public void testAutoPackageNameSetterOnGroupIdChange_disbledOnUserChange() { assertEquals("", javaPackageField.getText()); } - private static Text getFieldWithLabel(WizardPage page, String label) { - return CompositeUtil.findControlAfterLabel((Composite) page.getControl(), Text.class, label); + @Test + public void testSetMavenValidationMessage_okWhenDisabled() { + assertFalse(mavenCoordinatesInput.uiEnabled()); + assertTrue(page.setMavenValidationMessage()); + } + + @Test + public void testSetMavenValidationMessage_emptyGroupId() { + enableMavenCoordinatesInput(); + + assertFalse(page.setMavenValidationMessage()); + assertEquals("Provide Maven Group ID.", page.getMessage()); + assertNull(page.getErrorMessage()); + } + + @Test + public void testSetMavenValidationMessage_emptyArtifactId() { + enableMavenCoordinatesInput(); + getFieldWithLabel("Group ID:").setText("com.example"); + + assertFalse(page.setMavenValidationMessage()); + assertEquals("Provide Maven Artifact ID.", page.getMessage()); + assertNull(page.getErrorMessage()); + } + + @Test + public void testSetMavenValidationMessage_emptyVersion() { + enableMavenCoordinatesInput(); + getFieldWithLabel("Group ID:").setText("com.example"); + getFieldWithLabel("Artifact ID:").setText("some-artifact-id"); + getFieldWithLabel("Version:").setText(""); + + assertFalse(page.setMavenValidationMessage()); + assertEquals("Provide Maven artifact version.", page.getMessage()); + assertNull(page.getErrorMessage()); + } + + @Test + public void testSetMavenValidationMessage_illegalGroupId() { + enableMavenCoordinatesInput(); + getFieldWithLabel("Artifact ID:").setText("some-artifact-id"); + + getFieldWithLabel("Group ID:").setText("<:#= Illegal ID =#:>"); + assertFalse(page.setMavenValidationMessage()); + assertEquals("Illegal Maven Group ID: <:#= Illegal ID =#:>", page.getErrorMessage()); + } + + @Test + public void testSetMavenValidationMessage_illegalArtifactId() { + enableMavenCoordinatesInput(); + getFieldWithLabel("Group ID:").setText("com.example"); + + getFieldWithLabel("Artifact ID:").setText("<:#= Illegal ID =#:>"); + assertFalse(page.setMavenValidationMessage()); + assertEquals("Illegal Maven Artifact ID: <:#= Illegal ID =#:>", page.getErrorMessage()); + } + + @Test + public void testMavenValidateMavenSettings_noValidationIfUiDisabled() { + getFieldWithLabel("Group ID:").setText("<:#= Illegal ID =#:>"); + assertTrue(page.setMavenValidationMessage()); + } + + private void enableMavenCoordinatesInput() { + Predicate isMavenCheckbox = new Predicate() { + @Override + public boolean apply(Control control) { + return control instanceof Button + && "Create as Maven project".equals(((Button) control).getText()); + } + }; + Button asMaven = (Button) CompositeUtil.findControl(shellResource.getShell(), isMavenCheckbox); + new SWTBotCheckBox(asMaven).click(); } + private Text getFieldWithLabel(String label) { + return CompositeUtil.findControlAfterLabel(shellResource.getShell(), Text.class, label); + } } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplatesTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplatesTest.java index 3c74de8304..c8deafd16d 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplatesTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplatesTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.assertFalse; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig.Template; import com.google.cloud.tools.eclipse.appengine.ui.AppEngineRuntime; import com.google.cloud.tools.eclipse.test.util.project.TestProjectCreator; import com.google.cloud.tools.eclipse.util.Templates; @@ -132,7 +133,7 @@ public void testMaterializeAppEngineFlexJarFiles() config.setUseMaven("my.project.group.id", "my-project-artifact-id", "98.76.54"); config.setServiceName("database-service"); - IFile mostImportant = CodeTemplates.materializeFlexJar(project, config, monitor); + IFile mostImportant = CodeTemplates.materializeAppEngineFlexJarFiles(project, config, monitor); validateFlexJarNonConfigFiles(mostImportant); validateAppYaml(); @@ -145,8 +146,9 @@ public void testMaterializeFlexSpringBoot() AppEngineProjectConfig config = new AppEngineProjectConfig(); config.setUseMaven("my.project.group.id", "my-project-artifact-id", "98.76.54"); config.setServiceName("database-service"); + config.setTemplate(Template.SPRING_BOOT); - IFile mostImportant = CodeTemplates.materializeFlexSpringBoot(project, config, monitor); + IFile mostImportant = CodeTemplates.materializeAppEngineFlexJarFiles(project, config, monitor); validateFlexSpringBootNonConfigFiles(mostImportant); validateAppYaml(); @@ -160,7 +162,7 @@ public void testMaterializeAppEngineFlexJarFiles_mainClassSet() config.setUseMaven("my.project.group.id", "my-project-artifact-id", "98.76.54"); config.setPackageName("com.example"); - IFile mostImportant = CodeTemplates.materializeFlexJar(project, config, monitor); + IFile mostImportant = CodeTemplates.materializeAppEngineFlexJarFiles(project, config, monitor); validateMainClassInPomXml("com.example", mostImportant); } @@ -170,7 +172,7 @@ public void testMaterializeAppEngineFlexJarFiles_defaultPackageMainClassSet() AppEngineProjectConfig config = new AppEngineProjectConfig(); config.setUseMaven("my.project.group.id", "my-project-artifact-id", "98.76.54"); - IFile mostImportant = CodeTemplates.materializeFlexJar(project, config, monitor); + IFile mostImportant = CodeTemplates.materializeAppEngineFlexJarFiles(project, config, monitor); validateMainClassInPomXml(null /* expectedPackage */, mostImportant); } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineJarProjectTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineJarProjectTest.java new file mode 100644 index 0000000000..43336325c0 --- /dev/null +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineJarProjectTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.tools.eclipse.appengine.newproject; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.google.cloud.tools.eclipse.test.util.project.ProjectUtils; +import com.google.cloud.tools.eclipse.util.MavenUtils; +import java.lang.reflect.InvocationTargetException; +import org.eclipse.core.runtime.CoreException; +import org.junit.Test; + +public abstract class CreateAppEngineJarProjectTest extends CreateAppEngineProjectTest { + + @Override + protected String getMostImportantFilename() { + return "HelloAppEngineMain.java"; + } + + @Test + public void testMavenNatureEnabled() throws InvocationTargetException, CoreException { + config.setUseMaven("my.group.id", "my-artifact-id", "12.34.56"); + + CreateAppEngineProject creator = newCreateAppEngineProject(); + creator.execute(monitor); + ProjectUtils.waitForProjects(project); + + assertTrue(project.hasNature(MavenUtils.MAVEN2_NATURE_ID)); + assertFalse(project.getFolder("build").exists()); + assertOutputDirectory("target/classes"); + } +} diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineProjectTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineProjectTest.java new file mode 100644 index 0000000000..e2d5f4d07b --- /dev/null +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineProjectTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.tools.eclipse.appengine.newproject; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.google.cloud.tools.eclipse.appengine.libraries.model.LibraryFile; +import com.google.cloud.tools.eclipse.appengine.libraries.model.MavenCoordinates; +import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; +import com.google.cloud.tools.eclipse.test.util.ThreadDumpingWatchdog; +import com.google.cloud.tools.eclipse.test.util.project.ProjectUtils; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import org.apache.maven.artifact.Artifact; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.junit.JUnitCore; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.stubbing.Answer; + +@RunWith(MockitoJUnitRunner.class) +public abstract class CreateAppEngineProjectTest { + + @Rule public ThreadDumpingWatchdog timer = new ThreadDumpingWatchdog(2, TimeUnit.MINUTES); + + @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); + + @Mock protected ILibraryRepositoryService repositoryService; + + protected final IProgressMonitor monitor = new NullProgressMonitor(); + protected final AppEngineProjectConfig config = new AppEngineProjectConfig(); + protected IProject project; + + protected abstract String getMostImportantFilename(); + protected abstract CreateAppEngineProject newCreateAppEngineProject(); + + @Before + public void setUp() throws CoreException { + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + project = workspace.getRoot().getProject("testproject" + Math.random()); + config.setProject(project); + + mockRepositoryService(); + } + + @After + public void tearDown() throws CoreException { + if (project.exists()) { + // https://github.com/GoogleCloudPlatform/google-cloud-eclipse/issues/1945 + ProjectUtils.waitForProjects(project); + project.delete(true, monitor); + } + } + + private void mockRepositoryService() throws CoreException { + final LoadingCache fakeArtifactStore = CacheBuilder.newBuilder().build( + new CacheLoader() { + @Override + public Artifact load(String artifactKey) throws Exception { + Artifact artifact = mock(Artifact.class); + File jar = tempFolder.newFile("fake-" + artifactKey + ".jar"); + when(artifact.getFile()).thenReturn(jar); + return artifact; + } + }); + + Answer answerFakeArtifact = new Answer() { + @Override + public Artifact answer(InvocationOnMock invocation) throws Throwable { + LibraryFile libraryFile = invocation.getArgumentAt(0, LibraryFile.class); + MavenCoordinates coordinates = libraryFile.getMavenCoordinates(); + String artifactKey = coordinates.getGroupId() + "-" + coordinates.getArtifactId() + + "-" + coordinates.getVersion(); + return fakeArtifactStore.get(artifactKey); + } + }; + when(repositoryService.resolveArtifact(any(LibraryFile.class), any(IProgressMonitor.class))) + .thenAnswer(answerFakeArtifact); + } + + @Test + public void testMostImportantFile() throws InvocationTargetException, CoreException { + CreateAppEngineProject creator = newCreateAppEngineProject(); + creator.execute(monitor); + + String expectedName = getMostImportantFilename(); + assertEquals(expectedName, creator.getMostImportant().getName()); + } + + @Test + public void testUnitTestCreated() throws InvocationTargetException, CoreException { + CreateAppEngineProject creator = newCreateAppEngineProject(); + creator.execute(monitor); + ProjectUtils.waitForProjects(project); + + assertJunitAndHamcrestAreOnClasspath(); + } + + private void assertJunitAndHamcrestAreOnClasspath() throws CoreException { + assertTrue(project.hasNature(JavaCore.NATURE_ID)); + IJavaProject javaProject = JavaCore.create(project); + IType junit = javaProject.findType("org.junit.Assert"); + + // Is findType doing what we think it's doing? + // Locally where it passes it finds JUnit in + // class Assert [in Assert.class [in org.junit [in /Users/elharo/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.junit_4.12.0.v201504281640/junit.jar]]] + + assertNotNull("Did not find junit", junit); + assertTrue(junit.exists()); + IType hamcrest = javaProject.findType("org.hamcrest.CoreMatchers"); + assertNotNull("Did not find hamcrest", hamcrest); + assertTrue(hamcrest.exists()); + } + + @Test + public void testJavaTestSourceOutput() throws InvocationTargetException, CoreException { + CreateAppEngineProject creator = newCreateAppEngineProject(); + creator.execute(monitor); + + assertCorrectOutputPathForJavaTestSource(); + } + + private void assertCorrectOutputPathForJavaTestSource() throws JavaModelException { + IJavaProject javaProject = JavaCore.create(project); + for (IClasspathEntry entry : javaProject.getRawClasspath()) { + if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE + && containsSegment(entry.getPath(), "test")) { + assertNotNull(entry.getOutputLocation()); + assertEquals("test-classes", entry.getOutputLocation().lastSegment()); + return; + } + } + fail(); + } + + private boolean containsSegment(IPath path, String segment) { + return Arrays.asList(path.segments()).contains(segment); + } + + @Test + public void testNoTestClassesInDeploymentAssembly() throws InvocationTargetException, + CoreException, OperationCanceledException, InterruptedException { + CreateAppEngineProject creator = newCreateAppEngineProject(); + creator.execute(monitor); + creator.deployAssemblyEntryRemoveJob.join(180000 /* 3 minutes */, monitor); + + assertFalse(DeployAssemblyEntryRemoveJobTest.hasSourcePathInDeployAssembly(project, + new Path("src/test/java"))); + assertTrue(DeployAssemblyEntryRemoveJobTest.hasSourcePathInDeployAssembly(project, + new Path("src/main/java"))); + } + + protected void assertOutputDirectory(String expected) throws JavaModelException { + assertTrue(project.getFolder(expected).exists()); + IJavaProject javaProject = JavaCore.create(project); + assertEquals(new Path(expected), javaProject.getOutputLocation().removeFirstSegments(1)); + } + + @Test + public void testNoJUnit4ClasspathIfUsingMaven() throws InvocationTargetException, CoreException { + config.setUseMaven("my.group.id", "my-other-artifact-id", "12.34.56"); + + CreateAppEngineProject creator = newCreateAppEngineProject(); + creator.execute(monitor); + assertFalse(hasJUnit4Classpath(project)); + } + + protected static boolean hasJUnit4Classpath(IProject project) throws JavaModelException { + IJavaProject javaProject = JavaCore.create(project); + for (IClasspathEntry entry : javaProject.getRawClasspath()) { + if (entry.getPath().equals(JUnitCore.JUNIT4_CONTAINER_PATH)) { + return true; + } + } + return false; + } +} diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProjectTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProjectTest.java index b93bd81d56..52f92bc88e 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProjectTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProjectTest.java @@ -16,196 +16,33 @@ package com.google.cloud.tools.eclipse.appengine.newproject; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import com.google.cloud.tools.eclipse.appengine.libraries.model.LibraryFile; -import com.google.cloud.tools.eclipse.appengine.libraries.model.MavenCoordinates; -import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; -import com.google.cloud.tools.eclipse.test.util.ThreadDumpingWatchdog; import com.google.cloud.tools.eclipse.test.util.project.ProjectUtils; import com.google.cloud.tools.eclipse.util.MavenUtils; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import java.io.File; import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; -import java.util.concurrent.TimeUnit; -import org.apache.maven.artifact.Artifact; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Path; -import org.eclipse.jdt.core.IClasspathEntry; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.IType; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.junit.JUnitCore; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.runners.MockitoJUnitRunner; -import org.mockito.stubbing.Answer; -@RunWith(MockitoJUnitRunner.class) -public abstract class CreateAppEngineWtpProjectTest { +public abstract class CreateAppEngineWtpProjectTest extends CreateAppEngineProjectTest { - @Rule public ThreadDumpingWatchdog timer = new ThreadDumpingWatchdog(2, TimeUnit.MINUTES); - - @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); - - @Mock protected ILibraryRepositoryService repositoryService; - - protected final IProgressMonitor monitor = new NullProgressMonitor(); - protected final AppEngineProjectConfig config = new AppEngineProjectConfig(); - protected IProject project; - - protected abstract CreateAppEngineWtpProject newCreateAppEngineWtpProject(); - - @Before - public void setUp() throws CoreException { - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - project = workspace.getRoot().getProject("testproject" + Math.random()); - config.setProject(project); - - mockRepositoryService(); - } - - @After - public void tearDown() throws CoreException { - if (project.exists()) { - // https://github.com/GoogleCloudPlatform/google-cloud-eclipse/issues/1945 - ProjectUtils.waitForProjects(project); - project.delete(true, monitor); - } - } - - private void mockRepositoryService() throws CoreException { - final LoadingCache fakeArtifactStore = CacheBuilder.newBuilder().build( - new CacheLoader() { - @Override - public Artifact load(String artifactKey) throws Exception { - Artifact artifact = mock(Artifact.class); - File jar = tempFolder.newFile("fake-" + artifactKey + ".jar"); - when(artifact.getFile()).thenReturn(jar); - return artifact; - } - }); - - Answer answerFakeArtifact = new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) throws Throwable { - LibraryFile libraryFile = invocation.getArgumentAt(0, LibraryFile.class); - MavenCoordinates coordinates = libraryFile.getMavenCoordinates(); - String artifactKey = coordinates.getGroupId() + "-" + coordinates.getArtifactId() - + "-" + coordinates.getVersion(); - return fakeArtifactStore.get(artifactKey); - } - }; - when(repositoryService.resolveArtifact(any(LibraryFile.class), any(IProgressMonitor.class))) - .thenAnswer(answerFakeArtifact); + @Override + protected String getMostImportantFilename() { + return "HelloAppEngine.java"; } @Test public void testFaviconAdded() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertTrue("favicon.ico not found", project.getFile("src/main/webapp/favicon.ico").exists()); } - @Test - public void testMostImportantFile() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); - creator.execute(monitor); - - assertEquals("HelloAppEngine.java", creator.getMostImportant().getName()); - } - - @Test - public void testUnitTestCreated() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); - creator.execute(monitor); - ProjectUtils.waitForProjects(project); - - assertJunitAndHamcrestAreOnClasspath(); - } - - private void assertJunitAndHamcrestAreOnClasspath() throws CoreException { - assertTrue(project.hasNature(JavaCore.NATURE_ID)); - IJavaProject javaProject = JavaCore.create(project); - IType junit = javaProject.findType("org.junit.Assert"); - - // Is findType doing what we think it's doing? - // Locally where it passes it finds JUnit in - // class Assert [in Assert.class [in org.junit [in /Users/elharo/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.junit_4.12.0.v201504281640/junit.jar]]] - - assertNotNull("Did not find junit", junit); - assertTrue(junit.exists()); - IType hamcrest = javaProject.findType("org.hamcrest.CoreMatchers"); - assertNotNull("Did not find hamcrest", hamcrest); - assertTrue(hamcrest.exists()); - } - - @Test - public void testJavaTestSourceOutput() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); - creator.execute(monitor); - - assertCorrectOutputPathForJavaTestSource(); - } - - private void assertCorrectOutputPathForJavaTestSource() throws JavaModelException { - IJavaProject javaProject = JavaCore.create(project); - for (IClasspathEntry entry : javaProject.getRawClasspath()) { - if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE - && containsSegment(entry.getPath(), "test")) { - assertNotNull(entry.getOutputLocation()); - assertEquals("test-classes", entry.getOutputLocation().lastSegment()); - return; - } - } - fail(); - } - - private boolean containsSegment(IPath path, String segment) { - return Arrays.asList(path.segments()).contains(segment); - } - - @Test - public void testNoTestClassesInDeploymentAssembly() throws InvocationTargetException, - CoreException, OperationCanceledException, InterruptedException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); - creator.execute(monitor); - creator.deployAssemblyEntryRemoveJob.join(180000 /* 3 minutes */, monitor); - - assertFalse(DeployAssemblyEntryRemoveJobTest.hasSourcePathInDeployAssembly(project, - new Path("src/test/java"))); - assertTrue(DeployAssemblyEntryRemoveJobTest.hasSourcePathInDeployAssembly(project, - new Path("src/main/java"))); - } - @Test public void testNoMavenNatureByDefault() throws InvocationTargetException, CoreException { assertFalse(config.getUseMaven()); - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertFalse(project.hasNature(MavenUtils.MAVEN2_NATURE_ID)); @@ -217,7 +54,7 @@ public void testNoMavenNatureByDefault() throws InvocationTargetException, CoreE public void testMavenNatureEnabled() throws InvocationTargetException, CoreException { config.setUseMaven("my.group.id", "my-artifact-id", "12.34.56"); - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); ProjectUtils.waitForProjects(project); @@ -226,41 +63,16 @@ public void testMavenNatureEnabled() throws InvocationTargetException, CoreExcep assertOutputDirectory("target/my-artifact-id-12.34.56/WEB-INF/classes"); } - protected void assertOutputDirectory(String expected) throws JavaModelException { - assertTrue(project.getFolder(expected).exists()); - IJavaProject javaProject = JavaCore.create(project); - assertEquals(new Path(expected), javaProject.getOutputLocation().removeFirstSegments(1)); - } - @Test public void testJUnit4ClasspathIfNotUsingMaven() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertTrue(hasJUnit4Classpath(project)); } - @Test - public void testNoJUnit4ClasspathIfUsingMaven() throws InvocationTargetException, CoreException { - config.setUseMaven("my.group.id", "my-other-artifact-id", "12.34.56"); - - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); - creator.execute(monitor); - assertFalse(hasJUnit4Classpath(project)); - } - - private static boolean hasJUnit4Classpath(IProject project) throws JavaModelException { - IJavaProject javaProject = JavaCore.create(project); - for (IClasspathEntry entry : javaProject.getRawClasspath()) { - if (entry.getPath().equals(JUnitCore.JUNIT4_CONTAINER_PATH)) { - return true; - } - } - return false; - } - @Test public void testJstl12JarIfNonMavenProject() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertTrue(project.getFile("src/main/webapp/WEB-INF/lib/fake-jstl-jstl-1.2.jar").exists()); @@ -269,7 +81,7 @@ public void testJstl12JarIfNonMavenProject() throws InvocationTargetException, C @Test public void testNoJstl12JarIfMavenProject() throws InvocationTargetException, CoreException { config.setUseMaven("my.group.id", "my-other-artifact-id", "12.34.56"); - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertFalse(project.getFile("src/main/webapp/WEB-INF/lib/fake-jstl-jstl-1.2.jar").exists()); diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexProjectWizardTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarProjectWizardTest.java similarity index 83% rename from plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexProjectWizardTest.java rename to plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarProjectWizardTest.java index 98580697cf..bd0920433f 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexProjectWizardTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarProjectWizardTest.java @@ -19,13 +19,13 @@ import org.junit.Assert; import org.junit.Test; -public class AppEngineFlexProjectWizardTest { +public class AppEngineFlexJarProjectWizardTest { - private AppEngineFlexProjectWizard wizard = new AppEngineFlexProjectWizard(); + private AppEngineFlexJarProjectWizard wizard = new AppEngineFlexJarProjectWizard(); @Test public void testWindowTitle() { - Assert.assertEquals("New App Engine Flexible Project", wizard.getWindowTitle()); + Assert.assertEquals("New App Engine Flexible JAR Project", wizard.getWindowTitle()); } @Test diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarProjectWizardTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarProjectWizardTest.java new file mode 100644 index 0000000000..dc186c42f7 --- /dev/null +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarProjectWizardTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.tools.eclipse.appengine.newproject.flex; + +import org.junit.Assert; +import org.junit.Test; + +public class AppEngineFlexWarProjectWizardTest { + + private AppEngineFlexWarProjectWizard wizard = new AppEngineFlexWarProjectWizard(); + + @Test + public void testWindowTitle() { + Assert.assertEquals("New App Engine Flexible WAR Project", wizard.getWindowTitle()); + } + + @Test + public void testValidateDependencies() { + Assert.assertTrue(wizard.validateDependencies().isOK()); + } + + @Test + public void testAddPages() { + wizard.addPages(); + Assert.assertFalse(wizard.canFinish()); + Assert.assertEquals(1, wizard.getPageCount()); + Assert.assertNotNull(wizard.getPage("basicNewProjectPage")); + } + +} diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProjectTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProjectTest.java index 3004687a6f..5516ec22af 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProjectTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProjectTest.java @@ -19,7 +19,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProjectTest; import java.io.File; import java.lang.reflect.InvocationTargetException; @@ -39,13 +39,13 @@ public class CreateAppEngineFlexWtpProjectTest extends CreateAppEngineWtpProjectTest { @Override - protected CreateAppEngineWtpProject newCreateAppEngineWtpProject() { + protected CreateAppEngineProject newCreateAppEngineProject() { return new CreateAppEngineFlexWtpProject(config, mock(IAdaptable.class), repositoryService); } @Test public void testServletApi31Added() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertTrue(project.getFile("lib/fake-javax.servlet-javax.servlet-api-3.1.0.jar").exists()); @@ -53,7 +53,7 @@ public void testServletApi31Added() throws InvocationTargetException, CoreExcept @Test public void testJspApi231Added() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertTrue(project.getFile("lib/fake-javax.servlet.jsp-javax.servlet.jsp-api-2.3.1.jar") @@ -63,7 +63,7 @@ public void testJspApi231Added() throws InvocationTargetException, CoreException @Test public void testNonDependencyAttributeOnJarsInLib() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = + CreateAppEngineProject creator = new CreateAppEngineFlexWtpProject(config, mock(IAdaptable.class), repositoryService); creator.execute(monitor); @@ -94,7 +94,7 @@ private static boolean isNonDependencyAttribute(IClasspathAttribute attribute) { @Test public void testDynamicWebModuleFacet31Added() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); IFacetedProject facetedProject = ProjectFacetsManager.create(project); diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUiTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUiTest.java index 9d75df2915..28b960c169 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUiTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUiTest.java @@ -19,12 +19,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.verify; import com.google.cloud.tools.eclipse.test.util.ui.CompositeUtil; import com.google.cloud.tools.eclipse.test.util.ui.ShellTestResource; import org.eclipse.jface.dialogs.DialogPage; -import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Shell; @@ -91,72 +89,6 @@ public void testValidateMavenSettings_okWhenDisabled() { assertTrue(ui.validateMavenSettings().isOK()); } - @Test - public void testSetValidationMessage_okWhenDisabled() { - assertFalse(ui.uiEnabled()); - assertTrue(ui.setValidationMessage(dialogPage)); - } - - @Test - public void testSetValidationMessage_emptyGroupId() { - enableUi(); - - assertFalse(ui.setValidationMessage(dialogPage)); - verify(dialogPage).setMessage("Provide Maven Group ID.", IMessageProvider.INFORMATION); - } - - @Test - public void testSetValidationMessage_emptyArtifactId() { - enableUi(); - getGroupIdField().setText("com.example"); - - assertFalse(ui.setValidationMessage(dialogPage)); - verify(dialogPage).setMessage("Provide Maven Artifact ID.", IMessageProvider.INFORMATION); - } - - @Test - public void testSetValidationMessage_emptyVersion() { - enableUi(); - getGroupIdField().setText("com.example"); - getArtifactIdField().setText("some-artifact-id"); - getVersionField().setText(""); - - assertFalse(ui.setValidationMessage(dialogPage)); - verify(dialogPage).setMessage("Provide Maven artifact version.", IMessageProvider.INFORMATION); - } - - @Test - public void testSetValidationMessage_illegalGroupId() { - enableUi(); - - getArtifactIdField().setText("some-artifact-id"); - - getGroupIdField().setText("<:#= Illegal ID =#:>"); - assertFalse(ui.setValidationMessage(dialogPage)); - verify(dialogPage).setErrorMessage("Illegal Maven Group ID: <:#= Illegal ID =#:>"); - } - - @Test - public void testSetValidationMessage_illegalArtifactId() { - enableUi(); - getGroupIdField().setText("com.example"); - - getArtifactIdField().setText("<:#= Illegal ID =#:>"); - assertFalse(ui.setValidationMessage(dialogPage)); - verify(dialogPage).setErrorMessage("Illegal Maven Artifact ID: <:#= Illegal ID =#:>"); - } - - @Test - public void testValidateMavenSettings_noValidationIfUiDisabled() { - getGroupIdField().setText("<:#= Illegal ID =#:>"); - assertTrue(ui.setValidationMessage(dialogPage)); - } - - private void enableUi() { - Button asMavenProject = CompositeUtil.findControl(shell, Button.class); - new SWTBotCheckBox(asMavenProject).click(); - } - private Text getGroupIdField() { return CompositeUtil.findControlAfterLabel(shell, Text.class, "Group ID:"); } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProjectTest.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProjectTest.java index e0d77befdd..c3f9ac0a7c 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProjectTest.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject.test/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProjectTest.java @@ -25,7 +25,7 @@ import com.google.cloud.tools.eclipse.appengine.libraries.model.CloudLibraries; import com.google.cloud.tools.eclipse.appengine.libraries.model.Library; import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProjectTest; import com.google.cloud.tools.eclipse.test.util.project.ProjectUtils; import java.lang.reflect.InvocationTargetException; @@ -48,18 +48,18 @@ public class CreateAppEngineStandardWtpProjectTest extends CreateAppEngineWtpProjectTest { @Override - protected CreateAppEngineWtpProject newCreateAppEngineWtpProject() { + protected CreateAppEngineProject newCreateAppEngineProject() { return new CreateAppEngineStandardWtpProject(config, mock(IAdaptable.class), repositoryService); } @Test public void testConstructor() { - newCreateAppEngineWtpProject(); + newCreateAppEngineProject(); } @Test public void testAppEngineRuntimeAdded() throws InvocationTargetException, CoreException { - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); ProjectUtils.waitForProjects(project); // App Engine runtime is added via a Job, so wait. @@ -74,7 +74,7 @@ public void testAppEngineLibrariesAdded() throws InvocationTargetException, Core List libraries = new ArrayList<>(); libraries.add(library); config.setAppEngineLibraries(libraries); - CreateAppEngineWtpProject creator = newCreateAppEngineWtpProject(); + CreateAppEngineProject creator = newCreateAppEngineProject(); creator.execute(monitor); assertTrue(project.hasNature(JavaCore.NATURE_ID)); diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.properties b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.properties index 79df35f002..6122a5c181 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.properties +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.properties @@ -7,5 +7,9 @@ gcp.category = Google Cloud Platform standard.wizard.name = Google App Engine Standard Java Project standard.wizard.description = Creates an App Engine Standard Java project. -flex.wizard.name=Google App Engine Flexible Java Project -flex.wizard.description=Creates an App Engine Flexible Java project. +flex.war.wizard.name=Google App Engine Flexible Java WAR Project +flex.war.wizard.description=Creates an App Engine Flexible Java project for the Jetty or Tomcat \ + runtime. + +flex.jar.wizard.name=Google App Engine Flexible Java JAR Project +flex.jar.wizard.description=Creates an App Engine Flexible Java project for the Java runtime. diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.xml b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.xml index 0f984f7f9a..0834e2cf24 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.xml +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/plugin.xml @@ -16,81 +16,89 @@ - - + + - - - - + + + - - - + + - - - + + - + - %flex.wizard.description + %flex.war.wizard.description - - + + - - - - + + + + + + + + + + + + + + + + + %flex.jar.wizard.description + + + + + + + + + + + + - - - + + - - - + + - + diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectConfig.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectConfig.java index b18b7746d7..7b263a77e5 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectConfig.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectConfig.java @@ -29,6 +29,9 @@ * Collects all data needed to create and configure an App Engine Eclipse Project. */ public class AppEngineProjectConfig { + + public enum Template { DEFAULT, SPRING_BOOT }; + private File cloudSdkLocation = null; private URI eclipseProjectLocationUri = null; private String packageName = ""; @@ -36,6 +39,7 @@ public class AppEngineProjectConfig { private List appEngineLibraries = Collections.emptyList(); private String serviceName; private String runtimeId; + private Template template = Template.DEFAULT; private boolean useMaven; private String mavenGroupId; @@ -51,11 +55,11 @@ void setCloudSdkLocation(File cloudSdkLocation) { } void setPackageName(String name) { - this.packageName = name; + packageName = name; } String getPackageName() { - return this.packageName; + return packageName; } /** @@ -66,15 +70,15 @@ void setProject(IProject project) { } IProject getProject() { - return this.project; + return project; } URI getEclipseProjectLocationUri() { - return this.eclipseProjectLocationUri; + return eclipseProjectLocationUri; } void setEclipseProjectLocationUri(URI uri) { - this.eclipseProjectLocationUri = uri; + eclipseProjectLocationUri = uri; } List getAppEngineLibraries() { @@ -82,7 +86,7 @@ List getAppEngineLibraries() { } public void setAppEngineLibraries(Collection libraries) { - this.appEngineLibraries = new ArrayList<>(libraries); + appEngineLibraries = new ArrayList<>(libraries); } String getServiceName() { @@ -101,8 +105,16 @@ void setRuntimeId(String runtimeId) { this.runtimeId = runtimeId; } + Template getTemplate() { + return template; + } + + void setTemplate(Template template) { + this.template = template; + } + void setUseMaven(String mavenGroupId, String mavenArtifactId, String mavenVersion) { - this.useMaven = true; + useMaven = true; this.mavenGroupId = mavenGroupId; this.mavenArtifactId = mavenArtifactId; this.mavenVersion = mavenVersion; diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectWizard.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectWizard.java index a6c72420af..6546614917 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectWizard.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineProjectWizard.java @@ -40,19 +40,19 @@ public abstract class AppEngineProjectWizard extends Wizard implements INewWizard { - protected AppEngineWizardPage page = null; - protected final AppEngineProjectConfig config = new AppEngineProjectConfig(); + private AppEngineWizardPage page = null; + private final AppEngineProjectConfig config = new AppEngineProjectConfig(); private IWorkbench workbench; public AppEngineProjectWizard() { setNeedsProgressMonitor(true); } - public abstract AppEngineWizardPage createWizardPage(); + protected abstract AppEngineWizardPage createWizardPage(); - public abstract IStatus validateDependencies(); + protected abstract IStatus validateDependencies(); - public abstract CreateAppEngineWtpProject getAppEngineProjectCreationOperation( + protected abstract CreateAppEngineProject getAppEngineProjectCreationOperation( AppEngineProjectConfig config, IAdaptable uiInfoAdapter); @Override @@ -89,8 +89,7 @@ public boolean performFinish() { // todo set up IAdaptable uiInfoAdapter = WorkspaceUndoUtil.getUIInfoAdapter(getShell()); - CreateAppEngineWtpProject runnable = - getAppEngineProjectCreationOperation(config, uiInfoAdapter); + CreateAppEngineProject runnable = getAppEngineProjectCreationOperation(config, uiInfoAdapter); try { boolean fork = true; @@ -114,6 +113,7 @@ protected void retrieveConfigurationValues() { config.setServiceName(page.getServiceName()); config.setPackageName(page.getPackageName()); config.setRuntimeId(page.getRuntimeId()); + config.setTemplate(page.getTemplate()); config.setProject(page.getProjectHandle()); if (!page.useDefaults()) { config.setEclipseProjectLocationUri(page.getLocationURI()); diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPage.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPage.java index b4cfb8de9c..b152d58d3a 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPage.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/AppEngineWizardPage.java @@ -19,7 +19,8 @@ import com.google.cloud.tools.eclipse.appengine.libraries.model.CloudLibraries; import com.google.cloud.tools.eclipse.appengine.libraries.model.Library; import com.google.cloud.tools.eclipse.appengine.libraries.ui.LibrarySelectorGroup; -import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesWizardUi; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig.Template; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesInput; import com.google.cloud.tools.eclipse.appengine.ui.AppEngineImages; import com.google.cloud.tools.eclipse.util.JavaPackageValidator; import com.google.cloud.tools.eclipse.util.MavenCoordinatesValidator; @@ -31,6 +32,8 @@ import java.util.HashSet; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.DialogPage; +import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; @@ -52,7 +55,7 @@ public abstract class AppEngineWizardPage extends WizardNewProjectCreationPage { private LibrarySelectorGroup appEngineLibrariesSelectorGroup; private Text javaPackageField; private Text serviceNameField; - private MavenCoordinatesWizardUi mavenCoordinatesUi; + private MavenCoordinatesInput mavenCoordinatesUi; private final boolean showLibrariesSelectorGroup; /** True if we should auto-generate the javaPackageField from the provided groupId */ @@ -68,7 +71,9 @@ public AppEngineWizardPage(boolean showLibrariesSelectorGroup) { this.showLibrariesSelectorGroup = showLibrariesSelectorGroup; } - public abstract void setHelp(Composite container); + protected abstract void setHelp(Composite container); + + protected abstract MavenCoordinatesInput createMavenCoordinatesInput(Composite container); @Override public void createControl(Composite parent) { @@ -77,9 +82,10 @@ public void createControl(Composite parent) { Composite container = (Composite) getControl(); setHelp(container); - createCustomFields(container); + Composite customFieldsArea = new Composite(container, SWT.NONE); + createCustomFields(customFieldsArea); - mavenCoordinatesUi = new MavenCoordinatesWizardUi(container, SWT.NONE); + mavenCoordinatesUi = createMavenCoordinatesInput(container); mavenCoordinatesUi.addChangeListener(new Listener() { @Override public void handleEvent(Event event) { @@ -100,17 +106,18 @@ public void handleEvent(Event event) { setErrorMessage(null); setMessage(Messages.getString("enter.project.name")); + GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(customFieldsArea); GridLayoutFactory.swtDefaults().generateLayout(container); Dialog.applyDialogFont(container); } - private void createCustomFields(Composite container) { - Composite composite = new Composite(container, SWT.NONE); - createRuntimeField(composite); - createPackageField(composite); - createServiceField(composite); - - GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(composite); + /** + * Creates a custom-field section. Composite is laid out with 2 columns. + */ + protected void createCustomFields(Composite container) { + createRuntimeField(container); + createPackageField(container); + createServiceField(container); } protected void revalidate() { @@ -124,10 +131,14 @@ protected void createRuntimeField(@SuppressWarnings("unused") Composite composit // default: do nothing; used by subclasses } - public String getRuntimeId() { + protected String getRuntimeId() { return null; } + protected AppEngineProjectConfig.Template getTemplate() { + return Template.DEFAULT; + } + // Java package name; Composite is laid out with 2 columns. private void createPackageField(Composite parent) { Label packageNameLabel = new Label(parent, SWT.LEAD); @@ -203,7 +214,32 @@ private boolean validateLocalFields() { return false; } - return mavenCoordinatesUi.setValidationMessage(this); + return setMavenValidationMessage(); + } + + /** + * Convenience method to set a validation message on {@link DialogPage} from the result of calling + * {@link MavenCoordinatesInput#validateMavenSettings()}. + * + * @return {@code true} if no validation message was set; {@code false} otherwise + * + * @see MavenCoordinatesInput#validateMavenSettings() + */ + @VisibleForTesting + boolean setMavenValidationMessage() { + IStatus status = mavenCoordinatesUi.validateMavenSettings(); + if (status.isOK()) { + return true; + } + + if (IStatus.ERROR == status.getSeverity()) { + setErrorMessage(status.getMessage()); + } else if (IStatus.WARNING == status.getSeverity()) { + setMessage(status.getMessage(), IMessageProvider.WARNING); + } else if (IStatus.INFO == status.getSeverity()) { + setMessage(status.getMessage(), IMessageProvider.INFORMATION); + } + return false; } public String getPackageName() { diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplates.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplates.java index 6f04f1d110..c962122b5b 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplates.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CodeTemplates.java @@ -16,6 +16,7 @@ package com.google.cloud.tools.eclipse.appengine.newproject; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig.Template; import com.google.cloud.tools.eclipse.appengine.ui.AppEngineRuntime; import com.google.cloud.tools.eclipse.util.Templates; import com.google.cloud.tools.eclipse.util.io.ResourceUtils; @@ -63,6 +64,14 @@ public static IFile materializeAppEngineFlexFiles(IProject project, AppEnginePro return materialize(project, config, false /* isStandardProject */, monitor); } + public static IFile materializeAppEngineFlexJarFiles(IProject project, + AppEngineProjectConfig config, IProgressMonitor monitor) throws CoreException { + if (Template.SPRING_BOOT.equals(config.getTemplate())) { + return materializeFlexSpringBoot(project, config, monitor); + } + return materializeFlexJar(project, config, monitor); + } + /** * Creates files for a sample App Engine project in the supplied Eclipse project. * @@ -96,7 +105,7 @@ private static IFile materialize(IProject project, AppEngineProjectConfig config return hello; } - public static IFile materializeFlexJar(IProject project, AppEngineProjectConfig config, + private static IFile materializeFlexJar(IProject project, AppEngineProjectConfig config, IProgressMonitor monitor) throws CoreException { SubMonitor subMonitor = SubMonitor.convert(monitor, "Generating code", 30); @@ -110,7 +119,7 @@ public static IFile materializeFlexJar(IProject project, AppEngineProjectConfig return hello; } - public static IFile materializeFlexSpringBoot(IProject project, AppEngineProjectConfig config, + private static IFile materializeFlexSpringBoot(IProject project, AppEngineProjectConfig config, IProgressMonitor monitor) throws CoreException { SubMonitor subMonitor = SubMonitor.convert(monitor, "Generating code", 10); diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProject.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineProject.java similarity index 98% rename from plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProject.java rename to plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineProject.java index 1a2cf7bd88..7166eea42d 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineWtpProject.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/CreateAppEngineProject.java @@ -68,9 +68,9 @@ /** * Utility to make a new Eclipse App Engine project in the workspace. */ -public abstract class CreateAppEngineWtpProject extends WorkspaceModifyOperation { +public abstract class CreateAppEngineProject extends WorkspaceModifyOperation { - private static final Logger logger = Logger.getLogger(CreateAppEngineWtpProject.class.getName()); + private static final Logger logger = Logger.getLogger(CreateAppEngineProject.class.getName()); protected final ILibraryRepositoryService repositoryService; @@ -104,7 +104,7 @@ public IFile getMostImportant() { return mostImportant; } - protected CreateAppEngineWtpProject(AppEngineProjectConfig config, + protected CreateAppEngineProject(AppEngineProjectConfig config, IAdaptable uiInfoAdapter, ILibraryRepositoryService repositoryService) { if (config == null) { throw new NullPointerException("Null App Engine configuration"); //$NON-NLS-1$ diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarProjectWizard.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarProjectWizard.java new file mode 100644 index 0000000000..52443e8645 --- /dev/null +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarProjectWizard.java @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.tools.eclipse.appengine.newproject.flex; + +import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectWizard; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineWizardPage; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; +import com.google.cloud.tools.eclipse.appengine.newproject.Messages; +import com.google.cloud.tools.eclipse.usagetracker.AnalyticsEvents; +import com.google.cloud.tools.eclipse.usagetracker.AnalyticsPingManager; +import javax.inject.Inject; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; + +public class AppEngineFlexJarProjectWizard extends AppEngineProjectWizard { + @Inject + private ILibraryRepositoryService repositoryService; + + AppEngineFlexJarProjectWizard() { + setWindowTitle(Messages.getString("new.app.engine.flex.jar.project")); + } + + @Override + protected AppEngineWizardPage createWizardPage() { + AnalyticsPingManager.getInstance().sendPing( + AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD, + AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE, + AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE_FLEX, getShell()); + + return new AppEngineFlexJarWizardPage(); + } + + @Override + protected IStatus validateDependencies() { + return Status.OK_STATUS; + } + + @Override + protected CreateAppEngineProject getAppEngineProjectCreationOperation( + AppEngineProjectConfig config, IAdaptable uiInfoAdapter) { + return new CreateAppEngineFlexJarProject(config, uiInfoAdapter, repositoryService); + } + + @Override + public boolean performFinish() { + boolean accepted = super.performFinish(); + if (accepted) { + AnalyticsPingManager.getInstance().sendPing( + AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_COMPLETE, + AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE, + AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE_FLEX); + } + return accepted; + } +} diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarWizardPage.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarWizardPage.java new file mode 100644 index 0000000000..eaef04f4c8 --- /dev/null +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexJarWizardPage.java @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.tools.eclipse.appengine.newproject.flex; + +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig.Template; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineWizardPage; +import com.google.cloud.tools.eclipse.appengine.newproject.Messages; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesInput; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesUi; +import com.google.common.base.Preconditions; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.PlatformUI; + +public class AppEngineFlexJarWizardPage extends AppEngineWizardPage { + + private Combo combo; + + AppEngineFlexJarWizardPage() { + super(false); + setTitle(Messages.getString("app.engine.flex.project")); //$NON-NLS-1$ + setDescription(Messages.getString("create.app.engine.flex.project")); //$NON-NLS-1$ + } + + @Override + protected void setHelp(Composite container) { + PlatformUI.getWorkbench().getHelpSystem().setHelp(container, + "com.google.cloud.tools.eclipse.appengine.newproject.NewFlexProjectContext"); //$NON-NLS-1$ + } + + @Override + protected MavenCoordinatesInput createMavenCoordinatesInput(Composite container) { + MavenCoordinatesUi ui = new MavenCoordinatesUi(container, SWT.NONE); + ui.setText(Messages.getString("MAVEN_PROJECT_COORDINATES")); + return ui; + } + + @Override + protected void createCustomFields(Composite container) { + super.createCustomFields(container); + + Label label = new Label(container, SWT.LEAD); + label.setText(Messages.getString("FLEX_JAR_SAMPLE_TEMPLATE")); //$NON-NLS-1$ + combo = new Combo(container, SWT.READ_ONLY); + combo.add(Messages.getString("FLEX_JAR_NO_WEB_FRAMEWORK_TEMPLATE")); + combo.setData(Messages.getString("FLEX_JAR_NO_WEB_FRAMEWORK_TEMPLATE"), Template.DEFAULT); + combo.add(Messages.getString("FLEX_SPRING_BOOT_TEMPLATE")); + combo.setData(Messages.getString("FLEX_SPRING_BOOT_TEMPLATE"), Template.SPRING_BOOT); + combo.select(0); + } + + @Override + protected Template getTemplate() { + Preconditions.checkState(combo.getSelectionIndex() != -1); + return (Template) combo.getData(combo.getText()); + } +} diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexProjectWizard.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarProjectWizard.java similarity index 82% rename from plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexProjectWizard.java rename to plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarProjectWizard.java index d35c410d53..b9e5959731 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexProjectWizard.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarProjectWizard.java @@ -19,7 +19,8 @@ import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectWizard; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineWizardPage; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; import com.google.cloud.tools.eclipse.usagetracker.AnalyticsEvents; import com.google.cloud.tools.eclipse.usagetracker.AnalyticsPingManager; @@ -28,31 +29,31 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -public class AppEngineFlexProjectWizard extends AppEngineProjectWizard { +public class AppEngineFlexWarProjectWizard extends AppEngineProjectWizard { @Inject private ILibraryRepositoryService repositoryService; - public AppEngineFlexProjectWizard() { - setWindowTitle(Messages.getString("new.app.engine.flex.project")); + AppEngineFlexWarProjectWizard() { + setWindowTitle(Messages.getString("new.app.engine.flex.war.project")); } @Override - public AppEngineFlexWizardPage createWizardPage() { + protected AppEngineWizardPage createWizardPage() { AnalyticsPingManager.getInstance().sendPing( AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD, AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE, AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE_FLEX, getShell()); - return new AppEngineFlexWizardPage(); + return new AppEngineFlexWarWizardPage(); } @Override - public IStatus validateDependencies() { + protected IStatus validateDependencies() { return Status.OK_STATUS; } @Override - public CreateAppEngineWtpProject getAppEngineProjectCreationOperation( + protected CreateAppEngineProject getAppEngineProjectCreationOperation( AppEngineProjectConfig config, IAdaptable uiInfoAdapter) { return new CreateAppEngineFlexWtpProject(config, uiInfoAdapter, repositoryService); } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWizardPage.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarWizardPage.java similarity index 74% rename from plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWizardPage.java rename to plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarWizardPage.java index 2ec069474b..f810eb0e5c 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWizardPage.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/AppEngineFlexWarWizardPage.java @@ -18,21 +18,27 @@ import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineWizardPage; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesWizardUi; +import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; -public class AppEngineFlexWizardPage extends AppEngineWizardPage { +public class AppEngineFlexWarWizardPage extends AppEngineWizardPage { - public AppEngineFlexWizardPage() { + AppEngineFlexWarWizardPage() { super(false); setTitle(Messages.getString("app.engine.flex.project")); //$NON-NLS-1$ setDescription(Messages.getString("create.app.engine.flex.project")); //$NON-NLS-1$ } @Override - public void setHelp(Composite container) { + protected void setHelp(Composite container) { PlatformUI.getWorkbench().getHelpSystem().setHelp(container, "com.google.cloud.tools.eclipse.appengine.newproject.NewFlexProjectContext"); //$NON-NLS-1$ } + @Override + protected MavenCoordinatesWizardUi createMavenCoordinatesInput(Composite container) { + return new MavenCoordinatesWizardUi(container, SWT.NONE); + } } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexJarProject.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexJarProject.java index db89159782..f711f9f855 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexJarProject.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexJarProject.java @@ -20,7 +20,7 @@ import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig; import com.google.cloud.tools.eclipse.appengine.newproject.CodeTemplates; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -30,7 +30,7 @@ import org.eclipse.core.runtime.SubMonitor; import org.eclipse.wst.common.project.facet.core.IFacetedProject; -public class CreateAppEngineFlexJarProject extends CreateAppEngineWtpProject { +public class CreateAppEngineFlexJarProject extends CreateAppEngineProject { CreateAppEngineFlexJarProject(AppEngineProjectConfig config, IAdaptable uiInfoAdapter, ILibraryRepositoryService repositoryService) { @@ -55,7 +55,8 @@ public String getDescription() { @Override public IFile createAndConfigureProjectContent(IProject newProject, AppEngineProjectConfig config, IProgressMonitor monitor) throws CoreException { - IFile mostImportantFile = CodeTemplates.materializeFlexJar(newProject, config, monitor); + IFile mostImportantFile = + CodeTemplates.materializeAppEngineFlexJarFiles(newProject, config, monitor); return mostImportantFile; } } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProject.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProject.java index cf4e21dfee..2386c3f990 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProject.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/flex/CreateAppEngineFlexWtpProject.java @@ -21,7 +21,7 @@ import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig; import com.google.cloud.tools.eclipse.appengine.newproject.CodeTemplates; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; import com.google.cloud.tools.eclipse.util.ClasspathUtil; import com.google.common.collect.ImmutableList; @@ -47,7 +47,7 @@ /** * Utility to create a new App Engine Flexible Eclipse project. */ -public class CreateAppEngineFlexWtpProject extends CreateAppEngineWtpProject { +public class CreateAppEngineFlexWtpProject extends CreateAppEngineProject { private static final List SERVLET_DEPENDENCIES; diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesInput.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesInput.java new file mode 100644 index 0000000000..f54bcb2bc3 --- /dev/null +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesInput.java @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.tools.eclipse.appengine.newproject.maven; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.widgets.Listener; + +public interface MavenCoordinatesInput { + + void addChangeListener(Listener listener); + + void addGroupIdModifyListener(ModifyListener listener); + + String getArtifactId(); + + boolean uiEnabled(); + + String getGroupId(); + + String getVersion(); + + IStatus validateMavenSettings(); + +} diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesUi.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesUi.java index bd52bbc825..13fccc4c8c 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesUi.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesUi.java @@ -30,7 +30,7 @@ import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; -public class MavenCoordinatesUi extends Group { +public class MavenCoordinatesUi extends Group implements MavenCoordinatesInput { private static final String DEFAULT_VERSION = "0.1.0-SNAPSHOT"; //$NON-NLS-1$ @@ -67,24 +67,29 @@ protected void checkSubclass () { // Allow subclassing by not calling super(). } + @Override public String getGroupId() { return groupIdField.getText().trim(); } + @Override public String getArtifactId() { return artifactIdField.getText().trim(); } + @Override public String getVersion() { return versionField.getText().trim(); } + @Override public void addChangeListener(Listener listener) { groupIdField.addListener(SWT.Modify, listener); artifactIdField.addListener(SWT.Modify, listener); versionField.addListener(SWT.Modify, listener); } + @Override public void addGroupIdModifyListener(ModifyListener listener) { groupIdField.addModifyListener(listener); } @@ -104,6 +109,7 @@ public void setEnabled(boolean enabled) { * @return {@link IStatus#OK} if there was no validation problem; otherwise a status describing a * validation problem (with a non-OK status) */ + @Override public IStatus validateMavenSettings() { if (getGroupId().isEmpty()) { return StatusUtil.info(this, Messages.getString("PROVIDE_GROUP_ID")); //$NON-NLS-1$ @@ -123,4 +129,9 @@ public IStatus validateMavenSettings() { } return Status.OK_STATUS; } + + @Override + public boolean uiEnabled() { + return true; + } } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUi.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUi.java index ceebd7bf8a..a59c2d207f 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUi.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/maven/MavenCoordinatesWizardUi.java @@ -19,8 +19,6 @@ import com.google.cloud.tools.eclipse.appengine.newproject.Messages; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -import org.eclipse.jface.dialogs.DialogPage; -import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyListener; @@ -30,7 +28,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Listener; -public class MavenCoordinatesWizardUi extends Composite { +public class MavenCoordinatesWizardUi extends Composite implements MavenCoordinatesInput { private final Button asMavenProjectButton; @@ -56,29 +54,33 @@ public void widgetSelected(SelectionEvent event) { GridLayoutFactory.swtDefaults().generateLayout(this); } + @Override public boolean uiEnabled() { return asMavenProjectButton.getSelection(); } + @Override public String getGroupId() { return mavenCoordinatesUi.getGroupId(); } + @Override public String getArtifactId() { return mavenCoordinatesUi.getArtifactId(); } + @Override public String getVersion() { return mavenCoordinatesUi.getVersion(); } + @Override public void addChangeListener(Listener listener) { mavenCoordinatesUi.addChangeListener(listener); - if (asMavenProjectButton != null) { - asMavenProjectButton.addListener(SWT.Selection, listener); - } + asMavenProjectButton.addListener(SWT.Selection, listener); } + @Override public void addGroupIdModifyListener(ModifyListener listener) { mavenCoordinatesUi.addGroupIdModifyListener(listener); } @@ -99,28 +101,4 @@ public IStatus validateMavenSettings() { return mavenCoordinatesUi.validateMavenSettings(); } } - - /** - * Convenience method to set a validation message on {@link DialogPage} from the result of calling - * {@link #validateMavenSettings()}. - * - * @return {@code true} if no validation message was set; {@code false} otherwise - * - * @see #validateMavenSettings() - */ - public boolean setValidationMessage(DialogPage page) { - IStatus status = validateMavenSettings(); - if (status.isOK()) { - return true; - } - - if (IStatus.ERROR == status.getSeverity()) { - page.setErrorMessage(status.getMessage()); - } else if (IStatus.WARNING == status.getSeverity()) { - page.setMessage(status.getMessage(), IMessageProvider.WARNING); - } else if (IStatus.INFO == status.getSeverity()) { - page.setMessage(status.getMessage(), IMessageProvider.INFORMATION); - } - return false; - } } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/messages.properties b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/messages.properties index 139305b08b..4cb02dc4cb 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/messages.properties +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/messages.properties @@ -1,5 +1,6 @@ new.app.engine.standard.project=New App Engine Standard Project -new.app.engine.flex.project=New App Engine Flexible Project +new.app.engine.flex.war.project=New App Engine Flexible WAR Project +new.app.engine.flex.jar.project=New App Engine Flexible JAR Project creating.app.engine.standard.project=Creating App Engine Standard Project app.engine.standard.project=App Engine Standard Project create.app.engine.standard.project=Create a new Eclipse project for App Engine standard environment development. @@ -26,6 +27,9 @@ deploy.assembly.test.source.remove.job=Removing test Java source folder from web CREATE_AS_MAVEN_PROJECT=Create as Maven project MAVEN_PROJECT_COORDINATES=Maven project coordinates GROUP_ID=Group ID: +FLEX_JAR_SAMPLE_TEMPLATE=Sample template: +FLEX_JAR_NO_WEB_FRAMEWORK_TEMPLATE=No Web Framework +FLEX_SPRING_BOOT_TEMPLATE=Spring Boot ARTIFACT_ID=Artifact ID: ARTIFACT_VERSION=Version: GROUP_ID_TOOLTIP=The Maven Group ID. Should Be an Alphanumeric Path Separated by Periods diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardProjectWizard.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardProjectWizard.java index fc519f10f7..656c17daea 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardProjectWizard.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardProjectWizard.java @@ -20,7 +20,8 @@ import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectWizard; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineWizardPage; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; import com.google.cloud.tools.eclipse.appengine.ui.AppEngineRuntime; import com.google.cloud.tools.eclipse.usagetracker.AnalyticsEvents; @@ -42,12 +43,12 @@ public class AppEngineStandardProjectWizard extends AppEngineProjectWizard { @Inject private ILibraryRepositoryService repositoryService; - public AppEngineStandardProjectWizard() { + AppEngineStandardProjectWizard() { setWindowTitle(Messages.getString("new.app.engine.standard.project")); } @Override - public AppEngineStandardWizardPage createWizardPage() { + protected AppEngineWizardPage createWizardPage() { AnalyticsPingManager.getInstance().sendPing( AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD, AnalyticsEvents.APP_ENGINE_NEW_PROJECT_WIZARD_TYPE, @@ -57,7 +58,7 @@ public AppEngineStandardWizardPage createWizardPage() { } @Override - public IStatus validateDependencies() { + protected IStatus validateDependencies() { try { boolean fork = true; boolean cancelable = true; @@ -78,7 +79,7 @@ public IStatus validateDependencies() { } @Override - public CreateAppEngineWtpProject getAppEngineProjectCreationOperation( + protected CreateAppEngineProject getAppEngineProjectCreationOperation( AppEngineProjectConfig config, IAdaptable uiInfoAdapter) { return new CreateAppEngineStandardWtpProject(config, uiInfoAdapter, repositoryService); } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardWizardPage.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardWizardPage.java index a00c3d5d47..6ae65a9fb0 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardWizardPage.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/AppEngineStandardWizardPage.java @@ -18,6 +18,7 @@ import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineWizardPage; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; +import com.google.cloud.tools.eclipse.appengine.newproject.maven.MavenCoordinatesWizardUi; import com.google.cloud.tools.eclipse.appengine.ui.AppEngineRuntime; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -40,14 +41,14 @@ public class AppEngineStandardWizardPage extends AppEngineWizardPage { private ComboViewer runtimeField; - public AppEngineStandardWizardPage() { + AppEngineStandardWizardPage() { super(true); setTitle(Messages.getString("app.engine.standard.project")); //$NON-NLS-1$ setDescription(Messages.getString("create.app.engine.standard.project")); //$NON-NLS-1$ } @Override - public void setHelp(Composite container) { + protected void setHelp(Composite container) { PlatformUI.getWorkbench().getHelpSystem().setHelp(container, "com.google.cloud.tools.eclipse.appengine.newproject.NewStandardProjectContext"); //$NON-NLS-1$ } @@ -75,7 +76,7 @@ public void selectionChanged(SelectionChangedEvent event) { } @Override - public String getRuntimeId() { + protected String getRuntimeId() { AppEngineRuntime selected = DEFAULT_RUNTIME; if (runtimeField != null && !runtimeField.getSelection().isEmpty()) { Preconditions.checkState(runtimeField.getSelection() instanceof IStructuredSelection, @@ -85,4 +86,9 @@ public String getRuntimeId() { } return selected.getId(); } + + @Override + protected MavenCoordinatesWizardUi createMavenCoordinatesInput(Composite container) { + return new MavenCoordinatesWizardUi(container, SWT.NONE); + } } diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProject.java b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProject.java index cc04dafd04..ad3ddaf836 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProject.java +++ b/plugins/com.google.cloud.tools.eclipse.appengine.newproject/src/com/google/cloud/tools/eclipse/appengine/newproject/standard/CreateAppEngineStandardWtpProject.java @@ -20,7 +20,7 @@ import com.google.cloud.tools.eclipse.appengine.libraries.repository.ILibraryRepositoryService; import com.google.cloud.tools.eclipse.appengine.newproject.AppEngineProjectConfig; import com.google.cloud.tools.eclipse.appengine.newproject.CodeTemplates; -import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineWtpProject; +import com.google.cloud.tools.eclipse.appengine.newproject.CreateAppEngineProject; import com.google.cloud.tools.eclipse.appengine.newproject.Messages; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -33,7 +33,7 @@ /** * Utility to make a new Eclipse project with the App Engine Standard facets in the workspace. */ -public class CreateAppEngineStandardWtpProject extends CreateAppEngineWtpProject { +public class CreateAppEngineStandardWtpProject extends CreateAppEngineProject { public CreateAppEngineStandardWtpProject(AppEngineProjectConfig config, IAdaptable uiInfoAdapter, ILibraryRepositoryService repositoryService) { diff --git a/plugins/com.google.cloud.tools.eclipse.appengine.ui/plugin.xml b/plugins/com.google.cloud.tools.eclipse.appengine.ui/plugin.xml index 41b2064e9f..5ff65d874f 100644 --- a/plugins/com.google.cloud.tools.eclipse.appengine.ui/plugin.xml +++ b/plugins/com.google.cloud.tools.eclipse.appengine.ui/plugin.xml @@ -61,6 +61,14 @@ value="com.google.cloud.tools.eclipse.appengine.newproject.AppEngineFlex"> + + + +