Java tutorial
/******************************************************************************* * Copyright 2011 Google Inc. All Rights Reserved. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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.gdt.eclipse.designer.core; import com.google.gdt.eclipse.designer.builders.participant.MyCompilationParticipant; import com.google.gdt.eclipse.designer.common.Constants; import com.google.gdt.eclipse.designer.model.web.WebUtils; import com.google.gdt.eclipse.designer.util.Utils; import static org.eclipse.wb.tests.designer.core.AbstractJavaProjectTest.getFile; import static org.eclipse.wb.tests.designer.core.AbstractJavaProjectTest.getFolder; import static org.eclipse.wb.tests.designer.core.AbstractJavaProjectTest.setFileContent; import static org.eclipse.wb.tests.designer.core.AbstractJavaProjectTest.waitForAutoBuild; import org.eclipse.wb.internal.core.utils.check.Assert; import org.eclipse.wb.internal.core.utils.jdt.core.ProjectUtils; import org.eclipse.wb.tests.designer.Expectations; import org.eclipse.wb.tests.designer.Expectations.StrValue; import org.eclipse.wb.tests.designer.TestUtils; import org.eclipse.wb.tests.designer.core.AbstractJavaProjectTest; import org.eclipse.wb.tests.designer.core.AbstractJavaTest; import org.eclipse.wb.tests.designer.core.TestProject; import org.eclipse.wb.tests.designer.tests.DesignerTestCase; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IType; import org.apache.commons.lang.StringUtils; /** * Utilities for GWT testing. * * @author scheglov_ke */ public final class GTestUtils { //////////////////////////////////////////////////////////////////////////// // // GWT locations // //////////////////////////////////////////////////////////////////////////// /** * @return the location of default GWT. */ public static String getLocation() { return getLocation_25(); // return getLocation_trunk(); } /** * @return the location of GWT 2.0 */ public static String getLocation_20() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.0.4"); StrValue kosta = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.0.4"); StrValue kosta_linux = new StrValue("scheglov Linux", "/home/scheglov/Work/GWT/gwt-2.0.4"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.0.4"); return Expectations.get("C:/Work/GWT/gwt-2.0.4", new StrValue[] { kosta, kosta_linux, mitin, flanker_linux }); } /** * @return the location of GWT 2.1.0 */ public static String getLocation_2_1_0() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.1.0"); StrValue kosta = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.1.0"); StrValue kosta_linux = new StrValue("scheglov Linux", "/home/scheglov/Work/GWT/gwt-2.1.0"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.1.0"); return Expectations.get("C:/Work/GWT/gwt-2.1.0", new StrValue[] { mitin, kosta, kosta_linux, flanker_linux }); } /** * @return the location of GWT 2.1.1 */ public static String getLocation_21() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.1.1"); StrValue kosta = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.1.1"); StrValue kosta_linux = new StrValue("scheglov Linux", "/home/scheglov/Work/GWT/gwt-2.1.1"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.1.1"); return Expectations.get("C:/Work/GWT/gwt-2.1.1", new StrValue[] { mitin, kosta, kosta_linux, flanker_linux }); } /** * @return the location of GWT 2.2 */ public static String getLocation_22() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.2-trunk"); StrValue kosta_mac = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.2.0"); StrValue kosta_win = new StrValue("scheglov-win", "C:/Work/GWT/gwt-2.2.0"); StrValue kosta_linux = new StrValue("scheglov Linux", "/home/scheglov/Dropbox/Work/gwt-0.0.0"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.2.0"); return Expectations.get("C:/Work/GWT/gwt-2.2.0", new StrValue[] { mitin, kosta_mac, kosta_win, kosta_linux, flanker_linux }); } /** * @return the location of GWT 2.3 */ public static String getLocation_23() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.3-trunk"); StrValue kosta_mac = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.3.0"); StrValue kosta_win = new StrValue("scheglov-win", "C:/Work/GWT/gwt-2.3.0"); StrValue kosta_linux = new StrValue("raziel Linux", "/home/scheglov/Work/GWT/gwt-2.3.0"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.3.0"); return Expectations.get("C:/Work/GWT/gwt-2.3.0", new StrValue[] { mitin, kosta_mac, kosta_win, kosta_linux, flanker_linux }); } /** * @return the location of GWT 2.4 */ public static String getLocation_24() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.4-trunk"); StrValue kosta_mac = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.4.0"); StrValue kosta_win = new StrValue("scheglov-win", "C:/Work/GWT/gwt-2.4.0"); StrValue kosta_linux = new StrValue("raziel Linux", "/home/scheglov/Work/GWT/gwt-2.4.0"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.4.0"); return Expectations.get("C:/Work/GWT/gwt-2.4.0", new StrValue[] { mitin, kosta_mac, kosta_win, kosta_linux, flanker_linux }); } /** * @return the location of GWT 2.5 */ public static String getLocation_25() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-2.5"); StrValue kosta_mac = new StrValue("scheglov-macpro", "/Users/scheglov/GWT/gwt-2.5.0"); StrValue kosta_win = new StrValue("scheglov-win", "C:/Work/GWT/gwt-2.5.0"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-2.5.0"); return Expectations.get("C:/Work/GWT/gwt-2.5.0", new StrValue[] { mitin, kosta_mac, kosta_win, flanker_linux }); } /** * @return the location of the GWT from trunk. */ public static String getLocation_trunk() { StrValue mitin = new StrValue("mitin-aa", "/Users/mitin_aa/gwt/gwt-trunk"); StrValue kosta = new StrValue("scheglov-win", "C:/eclipseGWT/workspace/trunk/build/staging/gwt-0.0.0"); StrValue flanker_linux = new StrValue("flanker-desktop", "/home/flanker/Work/GWT/gwt-trunk"); return Expectations.get("C:/Work/GWT/gwt-trunk", new StrValue[] { mitin, kosta, flanker_linux }); } //////////////////////////////////////////////////////////////////////////// // // Project // //////////////////////////////////////////////////////////////////////////// /** * Configures given {@link TestProject} for using GWT. */ public static void configure(TestProject testProject) throws Exception { configure(getLocation(), testProject); } /** * Configures given {@link TestProject} for using specified GWT location. */ public static void configure(String gwtLocation, TestProject testProject) throws Exception { IProject project = testProject.getProject(); // add jars testProject.addExternalJar(gwtLocation + "/gwt-user.jar"); if (Utils.getVersion(project).isHigherOrSame(Utils.GWT_2_2)) { testProject.addExternalJar(gwtLocation + "/validation-api-1.0.0.GA.jar"); testProject.addExternalJar(gwtLocation + "/validation-api-1.0.0.GA-sources.jar"); } ProjectUtils.addNature(project, Constants.NATURE_ID); MyCompilationParticipant.ENABLED = false; // web folder { String webFolderName = WebUtils.getWebFolderName(project); project.getFolder(new Path(webFolderName)).create(true, true, null); project.getFolder(new Path(webFolderName + "/WEB-INF")).create(true, true, null); } } /** * Creates new GWT module. * * @param moduleId * the id of module, such as <code>com.mycompany.project.ImageViewer</code>. * * @return the module {@link IFile}. */ public static IFile createModule(TestProject testProject, String moduleId) throws Exception { IProject project = testProject.getProject(); Assert.isTrue(moduleId.contains("."), "Given module name '%s' is not fully qualifed.", moduleId); String packageName = StringUtils.substringBeforeLast(moduleId, "."); String shortModuleName = StringUtils.substringAfterLast(moduleId, "."); String publicFolderPath = WebUtils.getWebFolderName(project) + "/"; IPackageFragment modulePackage = testProject.getPackage(packageName); // *.gwt.xml IFile moduleFile; { String entryPointTypeName = packageName + ".client." + shortModuleName; String source = DesignerTestCase .getDoubleQuotes2(new String[] { "<module>", " <inherits name='com.google.gwt.user.User'/>", //" <inherits name='com.google.gwt.user.theme.standard.Standard'/>", " <entry-point class='" + entryPointTypeName + "'/>", "</module>" }); moduleFile = testProject.createFile(modulePackage, shortModuleName + ".gwt.xml", source); } // "client" package { IPackageFragment clientPackage = testProject.getPackage(packageName + ".client"); testProject.createUnit(clientPackage, shortModuleName + ".java", DesignerTestCase.getSourceDQ("package " + clientPackage.getElementName() + ";", "import com.google.gwt.core.client.EntryPoint;", "import com.google.gwt.user.client.ui.RootPanel;", "public class " + shortModuleName + " implements EntryPoint {", " public void onModuleLoad() {", " RootPanel rootPanel = RootPanel.get();", " }", "}")); } // "public" resources { // HTML { String docType = ""; if (Utils.getVersion(project).isHigherOrSame(Utils.GWT_2_0)) { docType += "<!doctype html>"; } // String html = DesignerTestCase.getSourceDQ(docType, "<html>", " <head>", " <title>Wrapper HTML for GWT module</title>", " <meta name='gwt:module' content='" + moduleId + "'/>", " <link type='text/css' rel='stylesheet' href='" + shortModuleName + ".css'/>", " </head>", " <body>", " <script language='javascript' src='" + moduleId + ".nocache.js'></script>", " <iframe id='__gwt_historyFrame' style='width:0;height:0;border:0'></iframe>", " </body>", "</html>"); setFileContent(project, publicFolderPath + "/" + shortModuleName + ".html", html); } // CSS { String css = DesignerTestCase.getSourceDQ("body {", " background-color: white;", " font: 18px Arial;", "}", ".gwt-Button {", " overflow: visible;", "}", "td {", " font: 18px Arial;", " padding: 0px;", "}", "a {", " color: darkblue;", "}", ".gwt-TabLayoutPanelTab {", " float: left;", " border: 1px solid #87b3ff;", " padding: 2px;", " cursor: hand;", "}", ".gwt-TabLayoutPanelTab-selected {", " font-weight: bold;", " background-color: #e8eef7;", " cursor: default;", "}"); setFileContent(project, publicFolderPath + "/" + shortModuleName + ".css", css); } // images { TestUtils.createImagePNG(testProject, publicFolderPath + "/1.png", 16, 16); TestUtils.createImagePNG(testProject, publicFolderPath + "/2.png", 16, 16); } } // web.xml { String content = DesignerTestCase.getSourceDQ(new String[] { "<?xml version='1.0' encoding='UTF-8'?>", "<!DOCTYPE web-app", " PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'", " 'http://java.sun.com/dtd/web-app_2_3.dtd'>", "", "<web-app>", "", " <!-- Default page to serve -->", " <welcome-file-list>", " <welcome-file>" + shortModuleName + ".html</welcome-file>", " </welcome-file-list>", "", "</web-app>" }); setFileContent(project, publicFolderPath + "/WEB-INF/web.xml", content); } // "server" package testProject.getPackage(packageName + ".server"); // done return moduleFile; } /** * Configures project as Maven-like with GWT module. */ public static void configureMavenProject() throws Exception { TestProject testProject = AbstractJavaProjectTest.m_testProject; // prepare Maven-like project getFolder("src").delete(true, null); getFolder("src/main/java"); getFolder("src/main/resources"); testProject.removeSourceFolder("/TestProject/src"); testProject.addSourceFolder("/TestProject/src/main/java"); testProject.addSourceFolder("/TestProject/src/main/resources"); waitForAutoBuild(); // create GWT module createModule(testProject, "test.Module"); // move module file into "resources" { IFile moduleFile = getFile("src/main/java/test/Module.gwt.xml"); getFolder("src/main/resources/test"); moduleFile.move(new Path("/TestProject/src/main/resources/test/Module.gwt.xml"), true, null); } } //////////////////////////////////////////////////////////////////////////// // // Special GWT classes // //////////////////////////////////////////////////////////////////////////// /** * Creates types for <code>RemoteService</code> interface and implementation, in * <code>"test"</code> package, with name <code>"MyService"</code>. * * @return the created {@link IType}'s for interface and implementation. */ public static IType[] createTestService(AbstractJavaTest javaTest) throws Exception { return createTestService(javaTest, "MyService"); } /** * Creates types for <code>RemoteService</code> interface and implementation, in * <code>"test"</code> package. * * @return the created {@link IType}'s for interface and implementation. */ public static IType[] createTestService(AbstractJavaTest javaTest, String serviceName) throws Exception { return createService(javaTest, "test", serviceName); } /** * Creates types for <code>RemoteService</code> interface and implementation. * * @return the created {@link IType}'s for interface and implementation. */ public static IType[] createService(AbstractJavaTest javaTest, String modulePackageName, String serviceName) throws Exception { String asyncName = serviceName + "Async"; String interfacePackageName = modulePackageName + ".client"; String implementationPackageName = modulePackageName + ".server"; IType interfaceType = javaTest.createModelType(interfacePackageName, serviceName + ".java", DesignerTestCase.getSourceDQ("package " + interfacePackageName + ";", "import com.google.gwt.core.client.GWT;", "import com.google.gwt.user.client.rpc.RemoteService;", "import com.google.gwt.user.client.rpc.ServiceDefTarget;", "public interface " + serviceName + " extends RemoteService {", " public static class Util {", " private static " + asyncName + " instance;", " public static " + asyncName + " getInstance() {", " if (instance == null) {", " instance = (" + asyncName + ") GWT.create(" + serviceName + ".class);", " ServiceDefTarget target = (ServiceDefTarget) instance;", " target.setServiceEntryPoint(GWT.getModuleBaseURL() + '" + serviceName + "');", " }", " return instance;", " }", " }", "}")); IType implementationType = javaTest.createModelType(implementationPackageName, serviceName + "Impl.java", DesignerTestCase.getSourceDQ("package " + implementationPackageName + ";", "import com.google.gwt.user.server.rpc.RemoteServiceServlet;", "import " + interfacePackageName + "." + serviceName + ";", "public class " + serviceName + "Impl extends RemoteServiceServlet implements " + serviceName + " {", "}")); return new IType[] { interfaceType, implementationType }; } //////////////////////////////////////////////////////////////////////////// // // Markers // //////////////////////////////////////////////////////////////////////////// /** * @return markers set by {@link MyCompilationParticipant}. */ public static IMarker[] getMyMarkers(IFile file) throws CoreException { return file.findMarkers(MyCompilationParticipant.MARKER_ID, false, IResource.DEPTH_ZERO); } }