/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.plugin.services.importer;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.PropertyResourceBundle;
import org.apache.commons.lang.StringUtils;
import org.pentaho.platform.api.repository2.unified.IPlatformImportBundle;
import org.pentaho.platform.api.mimetype.IPlatformMimeResolver;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.services.importexport.ExportFileNameEncoder;
import org.pentaho.platform.plugin.services.importexport.ImportSession;
import org.pentaho.platform.plugin.services.importexport.ImportSource.IRepositoryFileBundle;
import org.pentaho.platform.repository.RepositoryFilenameUtils;
/**
* this class is used to handle .properties files that are XACTION or URL files that contain the metadata used for
* localization. These files may contain additional information that will allow the properties file to be stored and
* used by XACTION and URL as well as localize the title and description.
*
* @author tband /ezequiel / tkafalas
*
*/
public class LocaleFilesProcessor {
private static final String FILE_LOCALE_RESOLVER = "file.locale";
private static final String URL_DESCRIPTION = "url_description";
private static final String URL_NAME = "url_name";
private static final String DESCRIPTION = "description";
private static final String TITLE = "title";
private static final String NAME = "name";
private static final String PROPERTIES_EXT = ".properties";
private static final String LOCALE_EXT = ".locale";
private List<LocaleFileDescriptor> localeFiles;
public LocaleFilesProcessor() {
localeFiles = new ArrayList<LocaleFileDescriptor>();
}
/**
*
* @param file
* @param parentPath
* @param bytes
* @return false - means discard the file extension type
* @throws IOException
*/
public boolean isLocaleFile( IRepositoryFileBundle file, String parentPath, byte[] bytes ) throws IOException {
boolean isLocale = false;
String fileName = file.getFile().getName();
String actualFilePath = file.getPath();
RepositoryFile localeRepositoryFile = file.getFile();
if ( ImportSession.getSession().getManifest() != null && ImportSession.getSession().getManifest().getManifestInformation().getManifestVersion() != null ) {
fileName = ExportFileNameEncoder.decodeZipFileName( fileName );
actualFilePath = ExportFileNameEncoder.decodeZipFileName( actualFilePath );
localeRepositoryFile = new RepositoryFile.Builder( localeRepositoryFile ).name(
ExportFileNameEncoder.decodeZipFileName( localeRepositoryFile.getName() ) ).build();
}
int sourceVersion = 0; // 0 = Not a local file, 1 = 4.8 .properties file, 2= Sugar 5.0 .local file
if ( fileName.endsWith( PROPERTIES_EXT ) ) {
sourceVersion = 1;
} else if ( fileName.endsWith( LOCALE_EXT ) ) {
sourceVersion = 2;
}
if ( sourceVersion != 0 ) {
InputStream inputStream = new ByteArrayInputStream( bytes );
Properties properties = loadProperties( inputStream );
String name = getProperty( properties, NAME, sourceVersion );
String title = getProperty( properties, TITLE, sourceVersion );
String description = getProperty( properties, DESCRIPTION, sourceVersion );
String url_name = getProperty( properties, URL_NAME, sourceVersion );
String url_description = getProperty( properties, URL_DESCRIPTION, sourceVersion );
if ( !StringUtils.isEmpty( url_name ) ) {
name = url_name;
}
if ( !StringUtils.isEmpty( title ) ) {
name = title;
}
description = !StringUtils.isEmpty( description ) ? description : "";
if ( !StringUtils.isEmpty( url_description ) ) {
description = url_description;
}
if ( !StringUtils.isEmpty( name ) ) {
String filePath = ( actualFilePath.equals( "/" ) || actualFilePath.equals( "\\" ) ) ? "" : actualFilePath;
filePath = RepositoryFilenameUtils.concat( parentPath, filePath );
LocaleFileDescriptor localeFile =
new LocaleFileDescriptor( name, description, filePath, localeRepositoryFile, inputStream );
localeFiles.add( localeFile );
/**
* assumes that the properties file has additional localization attributes and should be imported
*/
if ( properties.size() <= 2 || sourceVersion == 2 ) {
isLocale = true;
}
}
}
return isLocale;
}
private String getProperty( Properties properties, String propertyName, int sourceVersion ) {
if ( sourceVersion == 1 ) {
return properties.getProperty( propertyName );
} else {
return properties.getProperty( "file." + propertyName );
}
}
public Properties loadProperties( InputStream inputStream ) throws IOException {
assert inputStream != null;
final Properties properties = new Properties();
final PropertyResourceBundle rb = new PropertyResourceBundle( inputStream );
final Enumeration<?> keyEnum = rb.getKeys();
while ( keyEnum.hasMoreElements() ) {
final Object key = keyEnum.nextElement();
assert key != null;
final String sKey = String.valueOf( key );
properties.put( sKey, rb.getObject( sKey ) );
}
return properties;
}
public boolean createLocaleEntry( String filePath, String name, String title, String description,
RepositoryFile file, InputStream is ) throws IOException {
return createLocaleEntry( filePath, name, title, description, file, is, 2 );
}
public boolean createLocaleEntry( String filePath, String name, String title, String description,
RepositoryFile file, InputStream is, int sourceVersion ) throws IOException {
boolean success = false;
// need to spoof the locales to think this is the actual parent .prpt and not the meta.xml
RepositoryFile.Builder rf = new RepositoryFile.Builder( name );
rf.path( filePath );
if ( !StringUtils.isEmpty( title ) ) {
name = title;
}
if ( !StringUtils.isEmpty( name ) ) {
LocaleFileDescriptor localeFile = new LocaleFileDescriptor( name, description, filePath, rf.build(), is );
localeFiles.add( localeFile );
success = true;
}
return success;
}
public void processLocaleFiles( IPlatformImporter importer ) throws PlatformImportException {
RepositoryFileImportBundle.Builder bundleBuilder = new RepositoryFileImportBundle.Builder();
IPlatformMimeResolver mimeResolver = PentahoSystem.get( IPlatformMimeResolver.class );
String mimeType = mimeResolver.resolveMimeForFileName( FILE_LOCALE_RESOLVER );
for ( LocaleFileDescriptor localeFile : localeFiles ) {
bundleBuilder.name( localeFile.getName() );
bundleBuilder.comment( localeFile.getDescription() );
bundleBuilder.path( localeFile.getPath() );
bundleBuilder.file( localeFile.getFile() );
bundleBuilder.input( localeFile.getInputStream() );
bundleBuilder.mime( mimeType );
IPlatformImportBundle platformImportBundle = bundleBuilder.build();
importer.importFile( platformImportBundle );
}
}
}