org.pentaho.platform.plugin.services.importer.LocaleFilesProcessor.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.plugin.services.importer.LocaleFilesProcessor.java

Source

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