Package org.omnaest.i18nbinder

Source Code of org.omnaest.i18nbinder.I18nBinder

/*******************************************************************************
* 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;
  }
 
}
TOP

Related Classes of org.omnaest.i18nbinder.I18nBinder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.