ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/tomcat/buildutil/translate/Utils.java

Path
ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/tomcat/buildutil/translate/Utils.java
Status
scanned
Type
file
Name
Utils.java
Extension
.java
Programming language
Java
Mime type
text/plain
File type
ASCII text, with CRLF line terminators
Tag

      
    
Rootfs path

      
    
Size
8929 (8.7 KB)
MD5
76a6e28a0550b088f4cbb5ecd34cc21d
SHA1
89a36f4e4425cd6d7f542c75ad2f228865f53270
SHA256
22f6a0542b446ad4fd8d92b68102a53fbd65271aa4c744df9cf1396e9d235444
SHA512

      
    
SHA1_git
3c65c9cc1d1fa4cebd927caa66c8960f3d62dda9
Is binary

      
    
Is text
True
Is archive

      
    
Is media

      
    
Is legal

      
    
Is manifest

      
    
Is readme

      
    
Is top level

      
    
Is key file

      
    
Utils.java | 8.7 KB |

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.tomcat.buildutil.translate; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.regex.Pattern; public class Utils { private static final Pattern ESCAPE_LEADING_SPACE = Pattern.compile("^( )", Pattern.MULTILINE); private static final Set<String> KEYS_WITH_UNNECESSARY_ESCAPING = new HashSet<>(); // Package private so it is visible to tests static final String PADDING = "POEDITOR_EXPORT_PADDING_DO_NOT_DELETE"; static { KEYS_WITH_UNNECESSARY_ESCAPING.add("arrays.malformed.arrays"); KEYS_WITH_UNNECESSARY_ESCAPING.add("jsp.error.attribute.deferredmix"); KEYS_WITH_UNNECESSARY_ESCAPING.add("jsp.error.el.template.deferred"); } private Utils() { // Utility class. Hide default constructor. } static String getLanguage(String name) { return name.substring(Constants.L10N_PREFIX.length(), name.length() - Constants.L10N_SUFFIX.length()); } static Properties load(File f) { Properties props = new Properties(); try (FileInputStream fis = new FileInputStream(f); Reader r = new InputStreamReader(fis, StandardCharsets.UTF_8)) { props.load(r); } catch (IOException ioe) { ioe.printStackTrace(); } return props; } /* * This is the formatting applied when exporting values from Tomcat to POE. * * The values have been read from Tomcat's property files (so the input is the actual value with none of the * escaping required to represent that value in a property file) and are being written back out in a single file to * be imported into POEditor. The padding for blank lines needs to be added followed by the common formatting * required to convert a property value to the representation of that value in a file. */ static String formatValueExport(String in) { String result; if (in.startsWith(" ")) { result = PADDING + in; } else { result = in; } return formatValueCommon(result); } /* * This is the formatting applied when importing values to Tomcat from POE. * * The values have been read from POE's property files (so the input is the actual value with none of the escaping * required to represent that value in a property file) and are being written back out to individual files in * Tomcat. The padding for blank lines needs to be removed followed by the common formatting required to convert a * property value to the representation of that value in a file. */ static String formatValueImport(String in) { String result; if (in.startsWith(PADDING)) { result = in.substring(PADDING.length()); } else { result = in; } return formatValueCommon(result); } /* * Values containing "[{n}]" and "'" need to have the "'" escaped as "''". POEditor attempts to do this * automatically but does it for any value containing "{" or "}" leading to some unnecessary escaping. This method * undoes the unnecessary escaping. */ static String fixUnnecessaryEscaping(String key, String value) { if (KEYS_WITH_UNNECESSARY_ESCAPING.contains(key)) { return value.replace("''", "'"); } return value; } /* * Common formatting to convert a String value for storage as a value in a property file. Values that contain * line-breaks need the line-break in the value to be replaced with the correct representation of a line-break in a * property file. Leading space needs to be escaped with a '\' and horizontal tabs need to be converted to " ". * * Note that a single '\' needs to be escaped both in a Java string and in a property file so if a property value * needs to contain a single `\` (e.g. to escape white space at the start of a line) that will appear as "\\\\" in * the Java code. */ static String formatValueCommon(String in) { String result = in.replace(" ", "\ \\ "); if (result.endsWith("\ \\ ")) { result = result.substring(0, result.length() - 2); } result = ESCAPE_LEADING_SPACE.matcher(result).replaceAll("\\\\$1"); result = result.replace(" ", "\ "); return result; } static void processDirectory(File root, File dir, Map<String,Properties> translations) throws IOException { File[] files = dir.listFiles(); if (files == null) { throw new IllegalArgumentException("Not a directory [" + dir.getAbsolutePath() + "]"); } for (File f : files) { if (f.isDirectory()) { processDirectory(root, f, translations); } else if (f.isFile()) { processFile(root, f, translations); } } } static void processFile(File root, File f, Map<String,Properties> translations) throws IOException { String name = f.getName(); // non-l10n files if (!name.startsWith(Constants.L10N_PREFIX)) { return; } // Determine language String language = getLanguage(name); String keyPrefix = getKeyPrefix(root, f); Properties props = load(f); // Create a Map for the language if one does not exist. Properties translation = translations.get(language); if (translation == null) { translation = new Properties(); translations.put(language, translation); } // Add the properties from this file to the combined file, prefixing the // key with the package name to ensure uniqueness. for (Object obj : props.keySet()) { String key = (String) obj; String value = props.getProperty(key); translation.put(keyPrefix + key, value); } } static String getKeyPrefix(File root, File f) throws IOException { String prefix = f.getParentFile().getCanonicalPath(); prefix = prefix.substring(root.getCanonicalPath().length() + 1); prefix = prefix.replace(File.separatorChar, '.'); prefix = prefix + Constants.END_PACKAGE_MARKER; // POEditor uses javax package names. // Renaming here is less work than renaming terms in POEditor prefix = prefix.replace(Constants.JAKARTA_EE_SUBSTRING, Constants.JAVA_EE_SUBSTRING); return prefix; } static void export(String language, Properties translation, File storageDir) { File out = new File(storageDir, Constants.L10N_PREFIX + language + Constants.L10N_SUFFIX); try (FileOutputStream fos = new FileOutputStream(out); Writer w = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) { String[] keys = translation.keySet().toArray(new String[0]); Arrays.sort(keys); for (String key : keys) { w.write(key + "=" + formatValueExport(translation.getProperty(key)) + " "); } } catch (IOException ioe) { ioe.printStackTrace(); } } static void insertEditInstructions(Writer w) throws IOException { w.write(System.lineSeparator()); w.write("# Do not edit this file directly."); w.write(System.lineSeparator()); w.write("# To edit translations see: https://tomcat.apache.org/getinvolved.html#Translations"); w.write(System.lineSeparator()); } }
Detected license expression
apache-2.0
Detected license expression (SPDX)
Apache-2.0
Percentage of license text
11.83
Copyrights

      
    
Holders

      
    
Authors

      
    
License detections License expression License expression SPDX
apache_2_0-4bde3f57-78aa-4201-96bf-531cba09e7de apache-2.0 Apache-2.0
URL Start line End line
http://www.apache.org/licenses/LICENSE-2.0 9 9
https://tomcat.apache.org/getinvolved.html#Translations 230 230