Skip to content

Commit

Permalink
Extract remaining i18n/webapp creator calls to a new type
Browse files Browse the repository at this point in the history
  • Loading branch information
niloc132 committed Jan 9, 2025
1 parent 103fa6c commit e0ef7b1
Show file tree
Hide file tree
Showing 6 changed files with 232 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
* License for the specific language governing permissions and limitations under
* the License.
*/

package com.google.gwt.core.ext.linker;

import java.io.FileNotFoundException;
Expand Down
8 changes: 1 addition & 7 deletions dev/core/src/com/google/gwt/dev/GWTMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/
package com.google.gwt.dev;

import com.google.gwt.dev.util.Util;
import com.google.gwt.thirdparty.guava.common.base.Strings;

/**
Expand All @@ -25,12 +24,7 @@
public class GWTMain {

public static void main(String args[]) {
String aboutText = Util.getFileFromInstallPath("about.txt");
if (aboutText != null) {
System.err.println(aboutText);
} else {
System.err.println(About.getGwtVersion());
}
System.err.println(About.getGwtVersion());
System.err.println("Available main classes:");
System.err.println(Strings.padEnd(DevMode.class.getName(), 40, ' ') +
"runs the development shell");
Expand Down
1 change: 1 addition & 0 deletions dev/core/src/com/google/gwt/dev/util/Util.java
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ public static String getClassName(String className) {
*
* @param relativePath relative path within the install directory
* @return the contents of the file, or null if an error occurred
* @deprecated Removed without replacement, many usages of GWT have no install path.
*/
public static String getFileFromInstallPath(String relativePath) {
String installPath = Utility.getInstallPath();
Expand Down
28 changes: 14 additions & 14 deletions user/src/com/google/gwt/i18n/tools/I18NCreator.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
import com.google.gwt.i18n.client.ConstantsWithLookup;
import com.google.gwt.i18n.client.Localizable;
import com.google.gwt.i18n.client.Messages;
import com.google.gwt.user.tools.CommandLineCreatorUtils;
import com.google.gwt.user.tools.util.ArgHandlerEclipse;
import com.google.gwt.user.tools.util.ArgHandlerIgnore;
import com.google.gwt.user.tools.util.ArgHandlerOverwrite;
import com.google.gwt.util.tools.ArgHandlerExtra;
import com.google.gwt.util.tools.ArgHandlerOutDir;
import com.google.gwt.util.tools.ToolBase;
import com.google.gwt.util.tools.Utility;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -131,7 +131,7 @@ static void createLocalizable(String fullInterfaceName, File outDir,
Class<? extends Localizable> interfaceToCreate) throws IOException {

// Figure out the installation directory
String installPath = Utility.getInstallPath();
String installPath = CommandLineCreatorUtils.getInstallPath();
String gwtUserPath = installPath + '/' + "gwt-user.jar";
String gwtDevPath = installPath + '/' + "gwt-dev.jar";

Expand Down Expand Up @@ -163,10 +163,10 @@ static void createLocalizable(String fullInterfaceName, File outDir,
// Compute module name and directories
//
pos = clientPackageName.lastIndexOf('.');
File clientDir = Utility.getDirectory(outDir, "src", true);
File clientDir = CommandLineCreatorUtils.getDirectory(outDir, "src", true);
if (pos >= 0) {
String clientPackage = clientPackageName.replace('.', '/');
clientDir = Utility.getDirectory(clientDir, clientPackage, true);
clientDir = CommandLineCreatorUtils.getDirectory(clientDir, clientPackage, true);
}

// Create a map of replacements
Expand All @@ -185,7 +185,7 @@ static void createLocalizable(String fullInterfaceName, File outDir,

if (Messages.class == interfaceToCreate) {
replacements.put("@createMessages", "-createMessages");
templateData = Utility.getFileFromClassPath(PACKAGE_PATH
templateData = CommandLineCreatorUtils.getFileFromClassPath(PACKAGE_PATH
+ "i18nMessages.propertiessrc");
} else {
if (ConstantsWithLookup.class == interfaceToCreate) {
Expand All @@ -199,26 +199,26 @@ static void createLocalizable(String fullInterfaceName, File outDir,
}
// This same template works for both Constants and ConstantsWithLookup
// classes
templateData = Utility.getFileFromClassPath(PACKAGE_PATH
templateData = CommandLineCreatorUtils.getFileFromClassPath(PACKAGE_PATH
+ "i18nConstants.propertiessrc");
}

// Populate the file from the template
File i18nPropertiesFile = Utility.createNormalFile(clientDir, interfaceName
File i18nPropertiesFile = CommandLineCreatorUtils.createNormalFile(clientDir, interfaceName
+ ".properties", overwrite, ignore);
if (i18nPropertiesFile != null && templateData != null) {
Utility.writeTemplateFile(i18nPropertiesFile, templateData, replacements);
CommandLineCreatorUtils.writeTemplateFile(i18nPropertiesFile, templateData, replacements);
}

if (eclipse != null) {
// Create an eclipse localizable creator launch config
replacements.put("@projectName", eclipse);
File updateLaunchConfig = Utility.createNormalFile(outDir, interfaceName
File updateLaunchConfig = CommandLineCreatorUtils.createNormalFile(outDir, interfaceName
+ "-i18n" + ".launch", overwrite, ignore);
if (updateLaunchConfig != null) {
String out = Utility.getFileFromClassPath(PACKAGE_PATH
String out = CommandLineCreatorUtils.getFileFromClassPath(PACKAGE_PATH
+ "I18N-update.launchsrc");
Utility.writeTemplateFile(updateLaunchConfig, out, replacements);
CommandLineCreatorUtils.writeTemplateFile(updateLaunchConfig, out, replacements);
}
}

Expand All @@ -229,12 +229,12 @@ static void createLocalizable(String fullInterfaceName, File outDir,
} else {
extension = "";
}
File gwti18n = Utility.createNormalFile(outDir, interfaceName + "-i18n"
File gwti18n = CommandLineCreatorUtils.createNormalFile(outDir, interfaceName + "-i18n"
+ extension, overwrite, ignore);
if (gwti18n != null) {
String out = Utility.getFileFromClassPath(PACKAGE_PATH + "gwti18n"
String out = CommandLineCreatorUtils.getFileFromClassPath(PACKAGE_PATH + "gwti18n"
+ extension + "src");
Utility.writeTemplateFile(gwti18n, out, replacements);
CommandLineCreatorUtils.writeTemplateFile(gwti18n, out, replacements);
if (extension.length() == 0) {
Runtime.getRuntime().exec("chmod u+x " + gwti18n.getAbsolutePath());
}
Expand Down
210 changes: 210 additions & 0 deletions user/src/com/google/gwt/user/tools/CommandLineCreatorUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
/*
* Copyright 2025 GWT Project Authors
*
* 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.gwt.user.tools;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.io.StringReader;
import java.net.URI;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
* IO and template utility classes for GWT command-line tools.
*/
public class CommandLineCreatorUtils {

/**
* @param parent Parent directory
* @param fileName New file name
* @param overwrite Is overwriting an existing file allowed?
* @return Handle to the file
* @throws IOException If the file cannot be created, or if the file already
* existed and overwrite was false.
*/
public static File createNormalFile(File parent, String fileName,
boolean overwrite, boolean ignore) throws IOException {
File file = new File(parent, fileName);
if (file.createNewFile()) {
System.out.println("Created file " + file);
return file;
}

if (!file.exists() || file.isDirectory()) {
throw new IOException(file.getPath() + " : could not create normal file.");
}

if (ignore) {
System.out.println(file + " already exists; skipping");
return null;
}

if (!overwrite) {
throw new IOException(
file.getPath()
+ " : already exists; please remove it or use the -overwrite or -ignore option.");
}

System.out.println("Overwriting existing file " + file);
return file;
}

/**
* @param dirPath Requested path for the directory.
* @param create Create the directory if it does not already exist?
* @return A {@link File} representing a directory that now exists.
* @throws IOException If the directory is not found and/or cannot be created.
*/
public static File getDirectory(String dirPath, boolean create)
throws IOException {
return getDirectory(null, dirPath, create);
}

/**
* @param parent Parent directory of the requested directory.
* @param dirName Requested name for the directory.
* @param create Create the directory if it does not already exist?
* @return A {@link File} representing a directory that now exists.
* @throws IOException If the directory is not found and/or cannot be created.
*/
public static File getDirectory(File parent, String dirName, boolean create)
throws IOException {
File dir = new File(parent, dirName);
boolean alreadyExisted = dir.exists();

if (create) {
// No need to check mkdirs result because we check for dir.exists()
dir.mkdirs();
}

if (!dir.exists() || !dir.isDirectory()) {
if (create) {
throw new IOException(dir.getPath() + " : could not create directory.");
} else {
throw new IOException(dir.getPath() + " : could not find directory.");
}
}

if (create && !alreadyExisted) {
System.out.println("Created directory " + dir);
}

return dir;
}

/**
* Gets the contents of a file from the class path as a String. Note: this
* method is only guaranteed to work for resources in the same class loader
* that contains this {@link CommandLineCreatorUtils} class.
*
* @param partialPath the partial path to the resource on the class path
* @return the contents of the file
* @throws IOException if the file could not be found or an error occurred
* while reading it
*/
public static String getFileFromClassPath(String partialPath)
throws IOException {
try (InputStream in = CommandLineCreatorUtils.class.getClassLoader().getResourceAsStream(
partialPath)) {
if (in == null) {
throw new FileNotFoundException(partialPath);
}
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
}

public static String getInstallPath() {
return InstallPathHolder.INSTALL_PATH;
}

private static class InstallPathHolder {
private static final String INSTALL_PATH = computeInstallationPath();
private static String computeInstallationPath() {
try {
String override = System.getProperty("gwt.devjar");
if (override == null) {
String partialPath = CommandLineCreatorUtils.class.getName().replace('.', '/').concat(
".class");
URL url = CommandLineCreatorUtils.class.getClassLoader().getResource(partialPath);
if (url != null && "jar".equals(url.getProtocol())) {
String path = url.toString();
String jarPath = path.substring(path.indexOf("file:"),
path.lastIndexOf('!'));
File devJarFile = new File(URI.create(jarPath));
if (!devJarFile.isFile()) {
throw new IOException("Could not find jar file; "
+ devJarFile.getCanonicalPath()
+ " does not appear to be a valid file");
}

String dirPath = jarPath.substring(0, jarPath.lastIndexOf('/') + 1);
File installDirFile = new File(URI.create(dirPath));
if (!installDirFile.isDirectory()) {
throw new IOException("Could not find installation directory; "
+ installDirFile.getCanonicalPath()
+ " does not appear to be a valid directory");
}

return installDirFile.getCanonicalPath().replace(
File.separatorChar, '/');
} else {
throw new IOException(
"Cannot determine installation directory; apparently not running from a jar");
}
} else {
override = override.replace('\\', '/');
int pos = override.lastIndexOf('/');
if (pos < 0) {
return "";
} else {
return override.substring(0, pos);
}
}
} catch (IOException e) {
throw new RuntimeException(
"Installation problem detected, please reinstall GWT", e);
}
}
}

public static void writeTemplateFile(File file, String contents,
Map<String, String> replacements) throws IOException {
String replacedContents = contents;
Set<Map.Entry<String, String>> entries = replacements.entrySet();
for (Iterator<Map.Entry<String, String>> iter = entries.iterator(); iter.hasNext();) {
Map.Entry<String, String> entry = iter.next();
String replaceThis = entry.getKey();
String withThis = entry.getValue();
withThis = withThis.replaceAll("\\\\", "\\\\\\\\");
withThis = withThis.replaceAll("\\$", "\\\\\\$");
replacedContents = replacedContents.replaceAll(replaceThis, withThis);
}

try (PrintWriter pw = new PrintWriter(file)) {
LineNumberReader lnr = new LineNumberReader(new StringReader(replacedContents));
for (String line = lnr.readLine(); line != null; line = lnr.readLine()) {
pw.println(line);
}
}
}
}
Loading

0 comments on commit e0ef7b1

Please sign in to comment.