Java tutorial
/** * Most of the code in the Qalingo project is copyrighted Hoteia and licensed * under the Apache License Version 2.0 (release version 0.8.0) * http://www.apache.org/licenses/LICENSE-2.0 * * Copyright (c) Hoteia, 2012-2014 * http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com * */ package org.hoteia.qalingo.translation; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.text.Format; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * <p> * <a href="LoaderTranslationUtil.java.html"><i>View Source</i></a> * </p> * * @author Denis Gosset (http://www.hoteia.com) */ public class LoaderTranslationUtil { public static final String FORMATTER_FULL_DATE = "dd/MM/yy HH:mm:ss"; public static final String FORMATTER_DATE_TO_FOLDER = "yyyyMMdd_HHmmss"; private final static Logger LOG = LoggerFactory.getLogger(LoaderTranslationUtil.class); private static Format formatterFolder = new SimpleDateFormat(FORMATTER_DATE_TO_FOLDER); /** * */ public LoaderTranslationUtil() { } public void finalize() { } public static final void buildMessagesProperties(String currentPath, String project, String filePath, List<String> activedLanguages, String defaultLanguage, String inputEncoding, String outputEncoding) { try { String newPath = currentPath + project + LoaderTranslation.PROPERTIES_PATH; File folderProject = new File(newPath); if (!folderProject.exists()) { folderProject.mkdirs(); } InputStreamReader reader = new InputStreamReader(new FileInputStream(new File(filePath)), inputEncoding); LOG.info("File CSV encoding: " + inputEncoding); LOG.info("File properties encoding: " + outputEncoding); CSVFormat csvFormat = CSVFormat.DEFAULT; CSVParser readerCSV = new CSVParser(reader, csvFormat); List<CSVRecord> records = null; try { records = readerCSV.getRecords(); } catch (Exception e) { LOG.error("Failed to load: " + filePath, e); } String prefixFileName = ""; CSVRecord firstLineRecord = records.get(0); String[] prefixFileNameTemp = firstLineRecord.get(0).split("## Filename :"); if (prefixFileNameTemp.length > 1) { prefixFileName = prefixFileNameTemp[1].trim(); } String prefixKey = ""; CSVRecord secondLineRecord = records.get(1); String[] prefixKeyTemp = secondLineRecord.get(0).split("## PrefixKey :"); if (prefixKeyTemp.length > 1) { prefixKey = prefixKeyTemp[1].trim(); } Map<String, Integer> availableLanguages = new HashMap<String, Integer>(); for (CSVRecord record : records) { String firstCell = record.get(0); if (firstCell.contains("Prefix") && record.size() > 1) { String secondCell = record.get(1); if (secondCell.contains("Key")) { for (int i = 2; i < record.size(); i++) { String languageCode = record.get(i); availableLanguages.put(languageCode, new Integer(i)); } break; } } } // BUILD DEFAULT FILE String fileFullPath = newPath + "/" + prefixFileName + ".properties"; Integer defaultLanguagePosition = availableLanguages.get(defaultLanguage); buildMessagesProperties(records, fileFullPath, prefixKey, defaultLanguage, defaultLanguagePosition, outputEncoding, true); for (Iterator<String> iterator = availableLanguages.keySet().iterator(); iterator.hasNext();) { String languageCode = (String) iterator.next(); if (activedLanguages.contains(languageCode)) { Integer languagePosition = availableLanguages.get(languageCode); String languegFileFullPath = newPath + "/" + prefixFileName + "_" + languageCode + ".properties"; buildMessagesProperties(records, languegFileFullPath, prefixKey, languageCode, languagePosition.intValue(), outputEncoding, false); } } LOG.info(newPath + "/" + prefixFileName + ".properties"); } catch (Exception e) { LOG.info("Exception", e); } } public static final void buildMessagesProperties(List<CSVRecord> records, String fileFullPath, String prefixKey, String languageCode, int languagePosition, String outputEncoding, boolean isDefault) { try { File file = new File(fileFullPath); if (!file.exists()) { file.createNewFile(); } DataOutputStream writer = new DataOutputStream(new FileOutputStream(file)); int linePosition = 1; for (Iterator<CSVRecord> iterator = records.iterator(); iterator.hasNext();) { CSVRecord line = (CSVRecord) iterator.next(); String firstCell = line.get(0); if (firstCell.contains("Prefix") || firstCell.contains("Filename")) { // THIS IS THE LINE TITLE - DO NOTHING } else if (firstCell.contains("##")) { // THIS IS A COMMENT String value = firstCell; if (value.contains("XXLANGUAGE_CODEXX")) { if (isDefault) { value = value.replace("XXLANGUAGE_CODEXX", "Default Locale: " + languageCode); } else { value = value.replace("XXLANGUAGE_CODEXX", "Locale: " + languageCode); } } processLineWithComment(writer, languageCode, value, outputEncoding); linePosition++; } else { processLineWithValue(writer, prefixKey, line, languagePosition, linePosition, outputEncoding); linePosition++; } } writer.flush(); writer.close(); } catch (Exception e) { LOG.info("Exception", e); } } private static void processLineWithComment(DataOutputStream writer, String languageCode, String line, String outputEncoding) throws UnsupportedEncodingException, IOException { writer.write(((String) line).getBytes(outputEncoding)); writer.write(buildCarriageReturn(outputEncoding)); } private static void processLineWithValue(DataOutputStream writer, String prefixKey, CSVRecord line, int languagePosition, int linePosition, String outputEncoding) throws UnsupportedEncodingException, IOException { if (line.size() > 1) { String key = prefixKey + "."; String firstCell = line.get(0); if (StringUtils.isNotEmpty(firstCell)) { key = key + I18nKeyUtil.handleKey(firstCell).trim() + "."; } String secondCell = line.get(1); if (StringUtils.isNotEmpty(secondCell)) { key = key + I18nKeyUtil.handleKey(secondCell).trim(); if (StringUtils.isNotEmpty(secondCell) && line.size() > languagePosition) { String value = line.get(languagePosition); if (value.contains("\\\"")) { LOG.warn("Some properties values contain double quote twice: " + value); value = value.replace("\\\"", "\""); } writer.write(((String) key + "=" + value).getBytes(outputEncoding)); } } if (linePosition != 1) { writer.write(buildCarriageReturn(outputEncoding)); } } } private static byte[] buildCarriageReturn(String outputEncoding) throws UnsupportedEncodingException { return ((String) "\n").getBytes(outputEncoding); } public static final void copyPropertiesFiles(String folderSource, String folderTarget, String project) { LOG.info("forlder source: " + folderSource); LOG.info("folder target: " + folderTarget); File folder = new File(folderSource); for (final File fileEntry : folder.listFiles()) { if (fileEntry.isFile()) { LoaderTranslationUtil.copyFile(folderSource, folderTarget, fileEntry.getName()); } } } public static final String getFolderPath(String path) { String date = formatterFolder.format(new Date()); String currentPath = ""; if (path != null && !path.equalsIgnoreCase("")) { currentPath = path; } else { currentPath = "output/" + date + "/"; } File folderBuild = new File(currentPath); if (!folderBuild.exists()) { folderBuild.mkdirs(); } return currentPath; } private static final void copyFile(String srcDir, String destDir, String name) { try { String newPath = destDir; File folderProject = new File(newPath); if (!folderProject.exists()) folderProject.mkdirs(); File f1 = new File(srcDir + name + ""); File f2 = new File(destDir + name + ""); InputStream in = new FileInputStream(f1); // For Overwrite the file. OutputStream out = new FileOutputStream(f2); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } catch (FileNotFoundException e) { LOG.error("FileNotFoundException", e); } catch (IOException e) { LOG.error("IOException", e); } } }