GWT i18n Generation

De Wiki de Romain RUDIGER
Aller à : navigation, rechercher

Présentation

L'objectif de cette utilitaire est de générer les interfaces pour la gestion des constantes dans GWT.

I18nGenerator

I18nGenerator

package utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;

/**
 * Outils de génération des interfaces de constantes GWT. L'objectif est
 * d'itérer sur le répertoire <b>inputDir</b> à la rechercher de fichiers de
 * constantes et de générer l'interface associée dans le répertoire <b>outputDir</b>.<br/>
 * Note importante, si les interfaces générées comportent des méthodes sans nom
 * vous avez un pb d'encodage sur le .properties
 * 
 * @author rrudiger
 * @version 0.1
 * 
 */
public class I18nGenerator {

	/**
	 * Répertoire d'origine des .properties.
	 */
	private static String inputDir = ".\\src\\main\\resources\\";

	/**
	 * Répertoire de destination des interfaces générées.
	 */
	private static String outputDir = ".\\src\\main\\java\\";

	/**
	 * Nom du fichier temporaire.
	 */
	private static String tempFileName = "temp.properties";

	/**
	 * Nombre d'interfaces générées.
	 */
	private int count = 0;

	/**
	 * @param args .
	 */
	public static void main(final String[] args) {
		I18nGenerator main = new I18nGenerator();
		File inputDirectory = new File(inputDir);

		main.parseDirectory(inputDirectory);

		System.out.println(main.count + " fichiers generes disponibles dans "
				+ outputDir + "\nPensez a rafraichir le projet");
	}

	/**
	 * Méthode de recherche des .properties.
	 * 
	 * @param inputDirectory
	 *            File
	 */
	private void parseDirectory(final File inputDirectory) {
		// Recherche des dossiers et des fichiers properties
		File[] files = inputDirectory.listFiles(new PropertiesFilter());

		for (File file : files) {
			if (file.isDirectory()) {
				this.parseDirectory(file);
			} else {
				this.epureFile(file);
				this.createClassFile(file);
				count++;
			}
		}
	}

	/**
	 * Méthode d'écriture du fichier de destination.
	 * 
	 * @param file
	 *            File
	 */
	private void createClassFile(final File file) {
		try {
			// Création du fichier cible
			String className = file.getName().substring(0,
					file.getName().length() - 11);
			System.out.println("Creation de la classe " + className);

			String outputClassFileName = file.getPath();
			outputClassFileName = outputClassFileName.replace("properties",
					"java");
			outputClassFileName = outputClassFileName.replace(inputDir,
					outputDir);
			File outputClassFile = new File(outputClassFileName);

			// Création des packages
			File outputClassFileDirectory = outputClassFile.getParentFile();
			outputClassFileDirectory.mkdirs();

			FileWriter fileWriter;

			fileWriter = new FileWriter(outputClassFile, false);

			// Déclaration du package
			String outputClassPackage = outputClassFileDirectory.getPath()
					.replace(outputDir, "");
			outputClassPackage = outputClassPackage.replace("\\", ".");
			fileWriter.write("package " + outputClassPackage + ";\n\n");

			// Déclaration des imports
			fileWriter
					.write("import com.google.gwt.i18n.client.Constants;\n\n");

			fileWriter.write("/**\n");
			fileWriter.write(" * \n");
			fileWriter.write(" * @author rrudiger\n");
			fileWriter.write(" *\n");
			fileWriter.write(" */\n");

			// Déclaration de l'interface
			fileWriter.write("public interface " + className
					+ " extends Constants {\n\n");

			// Lecture du fichier properties
			Properties properties = new Properties();
			FileInputStream fis = new FileInputStream(file);

			properties.load(fis);

			// Ajout des méthodes
			Iterator it = properties.keySet().iterator();
			while (it.hasNext()) {
				String key = (String) it.next();
				if (key != null && !key.equals("")) {
					System.out.println("\tCreation de la methode " + key);
					fileWriter.write("\t/**\n");
					fileWriter
							.write("\t * Methode d'acces a la traduction de la constante "
									+ key + ".\n");
					fileWriter.write("\t * \n");
					fileWriter.write("\t * @return la traduction de " + key
							+ "\n");
					fileWriter.write("\t */\n");
					fileWriter.write("\tString " + key + "();\n\n");
				}
			}
			fileWriter.write("}\n");
			fileWriter.flush();
			fileWriter.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Méthode d'épuration du fichier properties.
	 * 
	 * @param inputFile
	 *            File
	 */
	private void epureFile(final File inputFile) {

		// Création d'un fichier temporaire
		String outputFileName = inputFile.getPath();
		File tempFile = new File(tempFileName);
		inputFile.renameTo(tempFile);
		inputFile.delete();

		// Création du fichier de sortie
		File outputFile = new File(outputFileName);

		try {
			BufferedReader br = new BufferedReader(new FileReader(tempFile));
			BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
			String line = "";

			// Traitement ligne à ligne
			while ((line = br.readLine()) != null) {
				if (line.contains("\t") && !line.endsWith("\t")) {
					String newLine = line.replace("\t", " = ");
					bw.write(newLine + "\n");
					bw.flush();
				} else if (line.contains("=")) {
					String newLine = line.replace("=", " = ");
					bw.write(newLine + "\n");
					bw.flush();
				}
			}
			bw.close();
			br.close();

			// Suppression du fichier temporaire
			tempFile.delete();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

PropertiesFilter.java

package utils;

import java.io.File;
import java.io.FilenameFilter;

/**
 * Filtre associé à la classe I18nGenerator.
 * <ul>
 * <li>Exclusion des répertoires et fichier <b>.svn</b></li>
 * <li>Inclusion des répertoires</li>
 * <li>Inclusion des fichiers finissants par <b>Constants.properties</b></li>
 * </ul>
 * 
 * @author rrudiger
 * @version 0.1
 * 
 */
public class PropertiesFilter implements FilenameFilter {

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
	 */
	public boolean accept(File dir, String name) {
		if (name.equals(".svn")) {
			return false;
		}
		if (name.endsWith("Constants.properties")) {
			return true;
		}
		File temp = new File(dir + "\\" + name);
		if (temp.isDirectory()) {
			return true;
		}
		return false;
	}

}

Rémi Rudiger 15 mai 2009 à 13:45 (UTC)