org.omnaest.i18nbinder.I18nBinder.java Source code

Java tutorial

Introduction

Here is the source code for org.omnaest.i18nbinder.I18nBinder.java

Source

/*******************************************************************************
 * Copyright 2011 Danny Kunz
 * 
 * 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 org.omnaest.i18nbinder;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
import org.omnaest.i18nbinder.internal.FacadeCreatorHelper;
import org.omnaest.i18nbinder.internal.LocaleFilter;
import org.omnaest.i18nbinder.internal.Logger;
import org.omnaest.i18nbinder.internal.ModifierHelper;
import org.omnaest.i18nbinder.internal.XLSFile;

public class I18nBinder extends Task {
    /* ********************************************** Variables ********************************************** */
    private List<FileSet> fileSetList = new ArrayList<FileSet>();

    private boolean createXLSFile = false;
    private String xlsFileName = null;

    private String javaFileEncoding = "utf-8";;

    private Boolean logInfo = false;

    private LocaleFilter localeFilter = new LocaleFilter();
    private boolean deletePropertiesWithBlankValue = true;

    private String fileNameLocaleGroupPattern = null;
    private List<Integer> fileNameLocaleGroupPatternGroupIndexList = null;

    private boolean createJavaFacade = false;
    private String javaFacadeFileName = FacadeCreatorHelper.DEFAULT_JAVA_FACADE_FILENAME_I18N_FACADE;
    private String baseNameInTargetPlattform = "";
    private String baseFolderIgnoredPath = "";
    private String packageName = "";
    private boolean externalizeTypes;

    private String propertyFileEncoding = "utf-8";

    private boolean useJavaStyleUnicodeEscaping = false;

    /* ********************************************** Methods ********************************************** */
    @Override
    public void execute() throws BuildException {
        //
        super.execute();

        //
        this.run();
    }

    public void run() {
        //
        if (this.logInfo) {
            ModifierHelper.logger = new Logger() {
                @Override
                public void info(String message) {
                    I18nBinder.this.log(message, Project.MSG_INFO);
                }
            };
        }

        //
        if (this.fileSetList.size() > 0) {
            //
            if (this.createJavaFacade) {
                this.createJavaFaceFromFiles();
            }

            //
            if (this.createXLSFile) {
                this.createXLSFileFromFiles();
            }
        } else {
            this.writeXLSFileBackToFiles();
        }

    }

    protected void writeXLSFileBackToFiles() {
        //
        if (this.xlsFileName != null) {
            //
            this.log("Write properties from XLS file back to property files...");

            //
            File file = new File(this.xlsFileName);
            if (file.exists()) {
                ModifierHelper.writeXLSFileContentToPropertyFiles(file, this.propertyFileEncoding,
                        this.localeFilter, this.deletePropertiesWithBlankValue, this.useJavaStyleUnicodeEscaping);
            }

            //
            this.log("...done");
        }
    }

    /**
     * Parses the property files and creates the xls file.
     */
    protected void createXLSFileFromFiles() {
        //
        if (this.xlsFileName != null && this.fileSetList.size() > 0) {
            //
            this.log("Create XLS file from property files...");

            //
            Set<File> propertyFileSet = this.resolveFilesFromFileSetList(this.fileSetList);

            //
            XLSFile xlsFile = ModifierHelper.createXLSFileFromPropertyFiles(propertyFileSet,
                    this.propertyFileEncoding, this.localeFilter, this.fileNameLocaleGroupPattern,
                    this.fileNameLocaleGroupPatternGroupIndexList, this.useJavaStyleUnicodeEscaping);

            //
            File file = new File(this.xlsFileName);
            xlsFile.setFile(file);
            xlsFile.store();

            //
            this.log("...done");
        } else {
            this.log(
                    "No xls file name specified. Please provide a file name for the xls file which should be created.",
                    Project.MSG_ERR);
        }

    }

    /**
     * Parses the property files and creates a Java facade source code file
     */
    protected void createJavaFaceFromFiles() {
        //
        this.log("Create Java source code facade file from property files...");

        //
        Set<File> propertyFileSet = this.resolveFilesFromFileSetList(this.fileSetList);

        try {
            //
            final String i18nFacadeName = StringUtils
                    .defaultString(this.javaFacadeFileName,
                            FacadeCreatorHelper.DEFAULT_JAVA_FACADE_FILENAME_I18N_FACADE)
                    .replaceAll("\\.java$", "");
            final Map<String, String> facadeFromPropertyFiles = FacadeCreatorHelper
                    .createI18nInterfaceFacadeFromPropertyFiles(propertyFileSet, this.localeFilter,
                            this.fileNameLocaleGroupPattern, this.fileNameLocaleGroupPatternGroupIndexList,
                            this.baseNameInTargetPlattform, this.baseFolderIgnoredPath, this.packageName,
                            i18nFacadeName, this.externalizeTypes, this.propertyFileEncoding);
            for (String fileName : facadeFromPropertyFiles.keySet()) {
                //
                final String fileContent = facadeFromPropertyFiles.get(fileName);
                final boolean isRootFacadeType = StringUtils.equals(this.packageName + "." + i18nFacadeName,
                        fileName);

                //
                if (!isRootFacadeType && fileName.contains(".")) {
                    fileName = reduceFileNameAndCreateDirectoryPath(fileName);
                }

                //        
                final File file = isRootFacadeType ? new File(this.javaFacadeFileName)
                        : new File(fileName + ".java");
                FileUtils.writeStringToFile(file, fileContent, this.javaFileEncoding);
            }
        } catch (Exception e) {
            this.log("Could not write Java facade to file", e, Project.MSG_ERR);
        }

        //
        this.log("...done");
    }

    private String reduceFileNameAndCreateDirectoryPath(String fileName) {
        fileName = StringUtils.removeStart(fileName, this.packageName + ".");
        File directory = new File(this.baseNameInTargetPlattform);
        String[] tokens = fileName.split("\\.");
        for (int ii = 0; ii < tokens.length - 1; ii++) {
            String directoryName = tokens[ii];
            directory = new File(directory, directoryName);
            if (!directory.exists()) {
                directory.mkdir();
            }
        }
        fileName = StringUtils.join(Arrays.copyOf(tokens, tokens.length - 1), "/") + (tokens.length > 1 ? "/" : "")
                + tokens[tokens.length - 1];
        return fileName;
    }

    /**
     * @see #resolveFilesFromFileSet(FileSet)
     * @param fileSetList
     * @return
     */
    protected Set<File> resolveFilesFromFileSetList(List<FileSet> fileSetList) {
        //
        Set<File> retset = new HashSet<File>();

        //
        if (fileSetList != null) {
            for (FileSet fileSet : fileSetList) {
                retset.addAll(this.resolveFilesFromFileSet(fileSet));
            }
        }

        //
        return retset;
    }

    /**
     * @see #resolveFilesFromFileSetList(List)
     * @param fileSet
     * @return
     */
    protected List<File> resolveFilesFromFileSet(FileSet fileSet) {
        //
        List<File> retlist = new ArrayList<File>();

        //
        if (fileSet != null) {
            //
            DirectoryScanner directoryScanner = fileSet.getDirectoryScanner();
            String[] includedFileNames = directoryScanner.getIncludedFiles();

            //
            if (includedFileNames != null) {
                //
                File basedir = directoryScanner.getBasedir();

                //
                for (String fileNameUnnormalized : includedFileNames) {
                    //
                    String fileName = fileNameUnnormalized.replaceAll(Pattern.quote("\\"), "/");

                    //
                    File file = new File(basedir, fileName);
                    if (file.exists()) {
                        retlist.add(file);
                    }
                }
            }

        }

        //
        return retlist;
    }

    public void addFileset(FileSet fileset) {
        if (fileset != null) {
            this.fileSetList.add(fileset);
        }
    }

    public String getXlsFileName() {
        return this.xlsFileName;
    }

    public void setXlsFileName(String xlsFileName) {
        this.log("xlsFileName=" + xlsFileName);
        this.xlsFileName = xlsFileName;
    }

    public void setFileEncoding(String fileEncoding) {
        this.log("fileEncoding=" + fileEncoding);
        this.propertyFileEncoding = fileEncoding;
        this.javaFileEncoding = fileEncoding;
    }

    public Boolean getLogInfo() {
        return this.logInfo;
    }

    public void setLogInfo(Boolean logInfo) {
        this.log("logInfo=" + logInfo);
        this.logInfo = logInfo;
    }

    public String getLocaleFilterRegex() {
        return this.localeFilter.getPattern().pattern();
    }

    public void setLocaleFilterRegex(String localeFilterRegex) {
        this.log("localeFilterRegex=" + localeFilterRegex);
        this.localeFilter.setPattern(Pattern.compile(localeFilterRegex));
    }

    public String getFileNameLocaleGroupPattern() {
        return this.fileNameLocaleGroupPattern;
    }

    public void setFileNameLocaleGroupPattern(String fileNameLocaleGroupPattern) {
        //
        this.log("fileNameLocaleGroupPattern=" + fileNameLocaleGroupPattern);

        //
        this.fileNameLocaleGroupPattern = fileNameLocaleGroupPattern;

        //
        if (this.fileNameLocaleGroupPatternGroupIndexList == null) {
            this.fileNameLocaleGroupPatternGroupIndexList = Arrays.asList(1);
        }
    }

    public boolean isDeletePropertiesWithBlankValue() {
        return this.deletePropertiesWithBlankValue;
    }

    public void setDeletePropertiesWithBlankValue(boolean deletePropertiesWithBlankValue) {
        this.log("deletePropertiesWithBlankValue=" + deletePropertiesWithBlankValue);
        this.deletePropertiesWithBlankValue = deletePropertiesWithBlankValue;
    }

    public String getFileNameLocaleGroupPatternGroupIndexList() {
        return StringUtils.join(this.fileNameLocaleGroupPatternGroupIndexList, ",");
    }

    public void setFileNameLocaleGroupPatternGroupIndexList(String fileNameLocaleGroupPatternGroupIndexStringList) {
        //
        this.log("fileNameLocaleGroupPatternGroupIndexList=" + fileNameLocaleGroupPatternGroupIndexStringList);
        String[] tokens = StringUtils.split(fileNameLocaleGroupPatternGroupIndexStringList.replaceAll(";", ","),
                ",");

        //
        List<Integer> fileNameLocaleGroupPatternGroupIndexList = new ArrayList<Integer>();
        for (String token : tokens) {
            fileNameLocaleGroupPatternGroupIndexList.add(Integer.valueOf(token));
        }

        //
        this.fileNameLocaleGroupPatternGroupIndexList = fileNameLocaleGroupPatternGroupIndexList;
    }

    public void setCreateXLSFile(boolean createXLSFile) {
        this.log("createXLSFile=" + createXLSFile);
        this.createXLSFile = createXLSFile;
    }

    public void setCreateJavaFacade(boolean createJavaFacade) {
        this.log("createJavaFacade=" + createJavaFacade);
        this.createJavaFacade = createJavaFacade;
    }

    public void setJavaFacadeFileName(String javaFacadeFileName) {
        this.log("javaFacadeFileName=" + javaFacadeFileName);
        this.javaFacadeFileName = javaFacadeFileName;
    }

    public void setBaseNameInTargetPlattform(String baseNameInTargetPlattform) {
        this.log("baseNameInTargetPlattform=" + baseNameInTargetPlattform);
        this.baseNameInTargetPlattform = baseNameInTargetPlattform;
    }

    public void setBaseFolderIgnoredPath(String baseFolderIgnoredPath) {
        this.log("baseFolderIgnoredPath=" + baseFolderIgnoredPath);
        this.baseFolderIgnoredPath = baseFolderIgnoredPath;
    }

    public void setPackageName(String packageName) {
        this.log("packageName=" + packageName);
        this.packageName = packageName;
    }

    public void setExternalizeTypes(boolean externalizeTypes) {
        this.log("externalizeTypes=" + externalizeTypes);
        this.externalizeTypes = externalizeTypes;
    }

    public void setPropertyFileEncoding(String propertyFileEncoding) {
        this.log("propertyFileEncoding=" + propertyFileEncoding);
        this.propertyFileEncoding = propertyFileEncoding;
    }

    public void setJavaFileEncoding(String javaFileEncoding) {
        this.log("javaFileEncoding=" + javaFileEncoding);
        this.javaFileEncoding = javaFileEncoding;
    }

    public void setUseJavaStyleUnicodeEscaping(boolean useJavaStyleUnicodeEscaping) {
        this.useJavaStyleUnicodeEscaping = useJavaStyleUnicodeEscaping;
    }

}