Package org.maven.i18nbinder.plugin

Source Code of org.maven.i18nbinder.plugin.I18nBinderMojo

/*******************************************************************************
* Copyright 2012 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.maven.i18nbinder.plugin;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashSet;
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.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.DirectoryScanner;
import org.omnaest.i18nbinder.internal.FacadeCreatorHelper;
import org.omnaest.i18nbinder.internal.LocaleFilter;

/**
* Goal which executes the i18nBinder java facade generator
*
* @goal i18nbinder
* @phase generate-sources
* @requiresDependencyResolution compile
* @author <a href="mailto:awonderland6@googlemail.com">Danny Kunz</a>
*/
public class I18nBinderMojo extends AbstractMojo
{
  /* ************************************************** Constants *************************************************** */
  private static final String GENERATED_SOURCES                        = "generated-sources";
  private static final String GENERATED_SOURCES_I18NBINDER             = "i18nbinder";
 
  /* ************************************** Variables / State (internal/hiding) ************************************* */
  /**
   * Location of the output directory root
   *
   * @parameter expression="${project.build.directory}"
   * @required
   */
  private File                outputDirectory;
 
  /**
   * Location of the source i18n files.
   *
   * @parameter
   */
  private File                propertiesRootDirectory                  = new File( "src/main/resources/i18n" );
 
  /**
   * @parameter
   */
  private String              localeFilterRegex                        = ".*";
 
  /**
   * @parameter
   */
  private String              fileNameLocaleGroupPattern               = ".*?((_\\w{2,3}_\\w{2,3})|(_\\w{2,3})|())\\.properties";
 
  /**
   * @parameter
   */
  private List<Integer>       fileNameLocaleGroupPatternGroupIndexList = Arrays.asList( 2, 3, 4 );
 
  /**
   * @parameter
   */
  private boolean             createJavaFacade                         = true;
 
  /**
   * @parameter
   */
  private boolean             logResolvedPropertyFileNames             = false;
 
  /**
   * @parameter
   */
  private String              i18nFacadeName                           = FacadeCreatorHelper.DEFAULT_JAVA_FACADE_FILENAME_I18N_FACADE;
 
  /**
   * @parameter
   */
  private String              baseNameInTargetPlattform                = "i18n";
 
  /**
   * @parameter
   */
  private String              packageName                              = "";
 
  /**
   * @parameter
   */
  private boolean             externalizeTypes                         = true;
 
  /* ***************************** Beans / Services / References / Delegates (external) ***************************** */
 
  /**
   * @parameter expression="${project}"
   * @required
   * @readonly
   */
  private MavenProject        project;
 
  /**
   * @parameter
   */
  private String              javaFileEncoding                         = "utf-8";
 
  /**
   * @parameter
   */
  private String              propertyFileEncoding                     = "utf-8";
 
  /* *************************************************** Methods **************************************************** */
 
  @Override
  public void execute() throws MojoExecutionException
  {
    if ( !this.createJavaFacade )
    {
      this.getLog()
          .info( "Skipping to create the i18n Java facade since it is disabled by the createJavaFacade property within the configuration" );
    }
    else
    {
      //
      this.getLog().info( "Create Java source code facade file from property files..." );
      this.logConfigurationProperties();
      //   
      final String baseFolderIgnoredPath = getBaseFolderIgnoredPath();
      final LocaleFilter localeFilter = this.determineLocaleFilter();
      final Set<File> propertyFileSet = this.resolveFilesFromDirectoryRoot( this.propertiesRootDirectory );
     
      try
      {
        //
        final String i18nFacadeName = StringUtils.defaultString( this.i18nFacadeName,
                                                                 FacadeCreatorHelper.DEFAULT_JAVA_FACADE_FILENAME_I18N_FACADE );
        final Map<String, String> facadeFromPropertyFiles = FacadeCreatorHelper.createI18nInterfaceFacadeFromPropertyFiles( propertyFileSet,
                                                                                                                            localeFilter,
                                                                                                                            this.fileNameLocaleGroupPattern,
                                                                                                                            this.fileNameLocaleGroupPatternGroupIndexList,
                                                                                                                            this.baseNameInTargetPlattform,
                                                                                                                            baseFolderIgnoredPath,
                                                                                                                            this.packageName,
                                                                                                                            i18nFacadeName,
                                                                                                                            this.externalizeTypes,
                                                                                                                            this.propertyFileEncoding );
       
        final File generatedSourceDirectory = createGeneratedSourcesI18nBinderDirectory();
        final File targetPackageDirectory = createTargetPackageDirectory( generatedSourceDirectory );
        for ( String fileName : facadeFromPropertyFiles.keySet() )
        {
          //
          final String fileContent = facadeFromPropertyFiles.get( fileName );
         
          //
          if ( fileName.contains( "." ) )
          {
            fileName = reduceFileNameAndCreateDirectoryPath( fileName, targetPackageDirectory );
          }
         
          //       
          final File file = new File( targetPackageDirectory, fileName + ".java" );
          this.writeContentToFile( fileContent, file, fileName );
        }
       
        //
        this.project.addCompileSourceRoot( this.getCompileSourceRoots() );
      }
      catch ( Exception e )
      {
        this.getLog().error( "Could not write Java facade to file", e );
      }
     
      //
      this.getLog().info( "...done" );
    }
  }
 
  private void writeContentToFile( final String fileContent, final File file, String fileName ) throws IOException
  {
    if ( this.logResolvedPropertyFileNames )
    {
      this.getLog().info( "Writes to: " + fileName );
    }
    FileUtils.writeStringToFile( file, fileContent, this.javaFileEncoding );
  }
 
  private String getBaseFolderIgnoredPath()
  {
    try
    {
      return this.propertiesRootDirectory.getCanonicalPath();
    }
    catch ( Exception e )
    {
      this.getLog().error( e );
      return this.propertiesRootDirectory.getAbsolutePath();
    }
   
  }
 
  private File createTargetPackageDirectory( final File generatedSourceDirectory )
  {
    //
    final String[] pathTokens = StringUtils.split( this.packageName, "." );
    File currentDirectory = generatedSourceDirectory;
    for ( String pathToken : pathTokens )
    {
      currentDirectory = new File( currentDirectory, pathToken );
      if ( !currentDirectory.exists() )
      {
        currentDirectory.mkdir();
      }
    }
   
    //
    return new File( generatedSourceDirectory, this.packageName.replaceAll( "\\.", "/" ) );
  }
 
  /**
   *
   */
  private void logConfigurationProperties()
  {
    this.getLog().info( "baseNameInTargetPlattform=" + this.baseNameInTargetPlattform );
    this.getLog().info( "createJavaFacade=" + this.createJavaFacade );
    this.getLog().info( "javaFileEncoding=" + this.javaFileEncoding );
    this.getLog().info( "externalizeTypes=" + this.externalizeTypes );
    this.getLog().info( "fileNameLocaleGroupPattern=" + this.fileNameLocaleGroupPattern );
    this.getLog().info( "fileNameLocaleGroupPatternGroupIndexList=" + this.fileNameLocaleGroupPatternGroupIndexList );
    this.getLog().info( "i18nFacadeName=" + this.i18nFacadeName );
    this.getLog().info( "localeFilterRegex=" + this.localeFilterRegex );
    this.getLog().info( "outputDirectory=" + this.outputDirectory );
    this.getLog().info( "packageName=" + this.packageName );
    this.getLog().info( "propertiesRootDirectory=" + this.propertiesRootDirectory );
  }
 
  /**
   * @return {@link File}
   */
  private File createGeneratedSourcesI18nBinderDirectory()
  {
    final File generatedSourcesDirectory = new File( this.outputDirectory, GENERATED_SOURCES );
    final File generatedSourcesI18nBinderDirectory = new File( generatedSourcesDirectory,
                                                               I18nBinderMojo.GENERATED_SOURCES_I18NBINDER );
    if ( !generatedSourcesDirectory.exists() )
    {
      generatedSourcesDirectory.mkdir();
    }
    if ( !generatedSourcesI18nBinderDirectory.exists() )
    {
      generatedSourcesI18nBinderDirectory.mkdir();
    }
    return generatedSourcesI18nBinderDirectory;
  }
 
  private Set<File> resolveFilesFromDirectoryRoot( File propertiesRootDirectory )
  {
    //
    final Set<File> retset = new LinkedHashSet<File>();
   
    //
    final String[] includes = { "**/*.properties" };
    DirectoryScanner directoryScanner = new DirectoryScanner();
    {
      directoryScanner.setIncludes( includes );
      directoryScanner.setBasedir( propertiesRootDirectory );
      directoryScanner.setCaseSensitive( true );
      directoryScanner.scan();
    }
   
    //
    final String[] fileNames = directoryScanner.getIncludedFiles();
    for ( int i = 0; i < fileNames.length; i++ )
    {
      final String fileName = fileNames[i].replaceAll( "\\\\", "/" );
      if ( this.logResolvedPropertyFileNames )
      {
        this.getLog().info( "Resolved: " + fileName );
      }
      retset.add( new File( propertiesRootDirectory, fileName ) );
    }
   
    //
    return retset;
  }
 
  private LocaleFilter determineLocaleFilter()
  {
    final LocaleFilter localeFilter = new LocaleFilter();
    localeFilter.setPattern( Pattern.compile( this.localeFilterRegex ) );
    return localeFilter;
  }
 
  private String reduceFileNameAndCreateDirectoryPath( String fileName, File targetPackageDirectory )
  {
    String reducedFileName = StringUtils.removeStart( fileName, this.packageName + "." );
   
    //
    fileName = reducedFileName;
    File directory = targetPackageDirectory;
    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 reducedFileName.replaceAll( "\\.", "/" );
  }
 
  public String getCompileSourceRoots() throws IOException
  {
    return new File( this.outputDirectory, GENERATED_SOURCES + "/" + GENERATED_SOURCES_I18NBINDER ).getCanonicalPath();
  }
 
}
TOP

Related Classes of org.maven.i18nbinder.plugin.I18nBinderMojo

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.