org.pentaho.platform.plugin.services.importexport.PentahoMetadataFileInfo.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.plugin.services.importexport.PentahoMetadataFileInfo.java

Source

/*
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License, version 2 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.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 General Public License for more details.
 *
 *
 * Copyright 2006 - 2013 Pentaho Corporation.  All rights reserved.
 */

package org.pentaho.platform.plugin.services.importexport;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.platform.repository.RepositoryFilenameUtils;
import org.springframework.util.Assert;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.pentaho.platform.plugin.services.importexport.PentahoMetadataFileInfo.FileType.UNKNOWN;

/**
 * Parser for potential Pentaho Metadata Filenames from the old repository
 * 
 * @author <a href="mailto:dkincade@pentaho.com">David M. Kincade</a>
 */
public class PentahoMetadataFileInfo {
    private static Log log = LogFactory.getLog(PentahoMetadataFileInfo.class);

    public enum FileType {
        XMI, PROPERTIES, UNKNOWN
    }

    private static final Pattern[] xmiPatterns = new Pattern[] {
            // Created by data access
            Pattern.compile(".*/([^/]+/resources/metadata/[^/]+\\.xmi)$"),

            // Stored in solution repository
            Pattern.compile(".*/([^/]+)/metadata.xmi$"), };

    private static final String LANG = "[a-z]{2}";
    private static final String LANG_CC = LANG + "_[A-Z]{2}";
    private static final String LANG_CC_EXT = LANG_CC + "_[^/]+";

    private static final String PROPERTY_BUNDLE_DOMAIN_POSTFIX = ".xmi";

    private static final Pattern[] propertyBundlePatternsWithPostfix = new Pattern[] {
            // Created by data access
            Pattern.compile(".*/([^/]+/resources/metadata/[^/]+)_(" + LANG + ")\\.properties$"),
            Pattern.compile(".*/([^/]+/resources/metadata/[^/]+)_(" + LANG_CC + ")\\.properties$"),
            Pattern.compile(".*/([^/]+/resources/metadata/[^/]+)_(" + LANG_CC_EXT + ")\\.properties$") };

    private static final Pattern[] propertyBundlePatternsNoPostfix = new Pattern[] {
            // Store in solution repository
            Pattern.compile(".*/([^/]+)/metadata_(" + LANG + ").properties$"),
            Pattern.compile(".*/([^/]+)/metadata_(" + LANG_CC + ").properties$"),
            Pattern.compile(".*/([^/]+)/metadata_(" + LANG_CC_EXT + ").properties$"),
            Pattern.compile(".*/([^/]+)_(" + LANG + ")\\.properties$"),
            Pattern.compile(".*/([^/]+)_(" + LANG_CC + ")\\.properties$"),
            Pattern.compile(".*/([^/]+)_(" + LANG_CC_EXT + ")\\.properties$"), };

    private FileType fileType;
    private String locale;
    private String domainId;
    private String path;

    public FileType getFileType() {
        return fileType;
    }

    public String getLocale() {
        return locale;
    }

    public String getDomainId() {
        return domainId;
    }

    public String getPath() {
        return path;
    }

    public PentahoMetadataFileInfo(final String path) {
        this.path = path;
        this.fileType = UNKNOWN;
        final String internalPath = RepositoryFilenameUtils.normalize(path, true);
        if (!StringUtils.isEmpty(internalPath)) {
            final String fileExtension = RepositoryFilenameUtils.getExtension(path);
            if (StringUtils.equals(fileExtension, "xmi")) {
                for (final Pattern xmiPattern : xmiPatterns) {
                    final Matcher xmiMatcher = xmiPattern.matcher(internalPath);
                    if (xmiMatcher.matches()) {
                        log.trace("MATCH: [" + internalPath + "] by [" + xmiPattern.pattern() + "] - group(s)=["
                                + xmiMatcher.group(1) + "]");
                        initialize(FileType.XMI, xmiMatcher.group(1), null);
                        break;
                    }
                }
            } else if (StringUtils.equals(fileExtension, "properties")) {
                for (final Pattern propertyBundlePattern : propertyBundlePatternsNoPostfix) {
                    final Matcher propertyBundleMatcher = propertyBundlePattern.matcher(internalPath);
                    if (propertyBundleMatcher.matches()) {
                        log.trace("MATCH: [" + internalPath + "] by [" + propertyBundleMatcher.pattern()
                                + "] - group(s)=[" + propertyBundleMatcher.group(1) + " : "
                                + propertyBundleMatcher.group(2) + "]");
                        initialize(FileType.PROPERTIES, propertyBundleMatcher.group(1),
                                propertyBundleMatcher.group(2));
                        break;
                    }
                }
                for (final Pattern propertyBundlePattern : propertyBundlePatternsWithPostfix) {
                    final Matcher propertyBundleMatcher = propertyBundlePattern.matcher(internalPath);
                    if (propertyBundleMatcher.matches()) {
                        log.trace("MATCH: [" + internalPath + "] by [" + propertyBundleMatcher.pattern()
                                + "] - group(s)=[" + propertyBundleMatcher.group(1) + " : "
                                + propertyBundleMatcher.group(2) + "]");
                        initialize(FileType.PROPERTIES,
                                propertyBundleMatcher.group(1) + PROPERTY_BUNDLE_DOMAIN_POSTFIX,
                                propertyBundleMatcher.group(2));
                        break;
                    }
                }
            }
        }
    }

    protected void initialize(final FileType fileType, final String domainId, final String locale) {
        Assert.hasText(domainId);
        Assert.isTrue(locale == null || !StringUtils.isEmpty(locale));
        this.fileType = fileType;
        this.domainId = domainId;
        this.locale = locale;
    }

    public String toString() {
        final StringBuilder s = new StringBuilder();
        s.append("PentahoMetadataFileInfo[fileType=");
        switch (fileType) {
        case UNKNOWN:
            s.append("unknown");
            break;
        case XMI:
            s.append("XMI : domainID=").append(domainId);
            break;

        case PROPERTIES:
            s.append("PROPERTIES : domainID=").append(domainId).append(" : locale=").append(locale);
            break;
        }
        s.append(" : path=").append(path).append("]");
        return s.toString();
    }
}