org.pentaho.di.core.util.CurrentDirectoryResolver.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.core.util.CurrentDirectoryResolver.java

Source

/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2015 by Pentaho : http://www.pentaho.com
 *
 *******************************************************************************
 *
 * 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.pentaho.di.core.util;

import org.apache.commons.vfs2.FileName;
import org.apache.commons.vfs2.FileObject;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.ObjectLocationSpecificationMethod;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.variables.Variables;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.trans.step.StepMeta;

public class CurrentDirectoryResolver {

    public CurrentDirectoryResolver() {
    }

    public VariableSpace resolveCurrentDirectory(VariableSpace parentVariables,
            RepositoryDirectoryInterface directory, String filename) {
        Variables tmpSpace = new Variables();
        tmpSpace.setParentVariableSpace(parentVariables);
        tmpSpace.initializeVariablesFrom(parentVariables);

        if (directory != null) {
            tmpSpace.setVariable(Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY, directory.toString());
            tmpSpace.setVariable(Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, directory.toString());
            tmpSpace.setVariable(Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, directory.toString());
        } else if (filename != null) {
            try {
                FileObject fileObject = KettleVFS.getFileObject(filename, tmpSpace);

                if (!fileObject.exists()) {
                    // don't set variables if the file doesn't exist
                    return tmpSpace;
                }

                FileName fileName = fileObject.getName();

                // The filename of the transformation
                tmpSpace.setVariable(Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, fileName.getBaseName());

                // The directory of the transformation
                FileName fileDir = fileName.getParent();
                tmpSpace.setVariable(Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, fileDir.getURI());
                tmpSpace.setVariable(Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, fileDir.getURI());
                tmpSpace.setVariable(Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY, fileDir.getURI());
            } catch (Exception e) {
            }
        }
        return tmpSpace;
    }

    public VariableSpace resolveCurrentDirectory(ObjectLocationSpecificationMethod specificationMethod,
            VariableSpace parentVariables, Repository repository, StepMeta stepMeta, String filename) {
        RepositoryDirectoryInterface directory = null;
        if (repository != null && specificationMethod.equals(ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME)
                && stepMeta != null && stepMeta.getParentTransMeta() != null
                && stepMeta.getParentTransMeta().getRepositoryDirectory() != null) {
            directory = stepMeta.getParentTransMeta().getRepositoryDirectory();
        } else if (repository == null && stepMeta != null && stepMeta.getParentTransMeta() != null) {
            filename = stepMeta.getParentTransMeta().getFilename();
        } else if (stepMeta != null && stepMeta.getParentTransMeta() != null && repository != null
                && specificationMethod.equals(ObjectLocationSpecificationMethod.FILENAME)) {
            // we're using FILENAME but we are connected to a repository
            directory = stepMeta.getParentTransMeta().getRepositoryDirectory();
        } else if (stepMeta != null && stepMeta.getParentTransMeta() != null && filename == null) {
            filename = stepMeta.getParentTransMeta().getFilename();
        }
        return resolveCurrentDirectory(parentVariables, directory, filename);
    }

    public VariableSpace resolveCurrentDirectory(ObjectLocationSpecificationMethod specificationMethod,
            VariableSpace parentVariables, Repository repository, Job job, String filename) {
        RepositoryDirectoryInterface directory = null;
        if (repository != null && specificationMethod.equals(ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME)
                && job != null && job.getJobMeta() != null && job.getJobMeta().getRepositoryDirectory() != null) {
            directory = job.getJobMeta().getRepositoryDirectory();
        } else if (job != null && repository == null
                && specificationMethod.equals(ObjectLocationSpecificationMethod.REPOSITORY_BY_NAME)) {
            filename = job.getFilename();
        } else if (job != null && job.getJobMeta() != null && repository != null
                && specificationMethod.equals(ObjectLocationSpecificationMethod.FILENAME)) {
            // we're using FILENAME but we are connected to a repository
            directory = job.getJobMeta().getRepositoryDirectory();
        } else if (job != null && filename == null) {
            filename = job.getFilename();
        } else if (repository != null && JobMeta.class.isAssignableFrom(parentVariables.getClass())) {
            // fallback protection for design mode: the parentVariables may actually be a JobMeta which
            // may have the required directory
            JobMeta realParent = null;
            realParent = (JobMeta) parentVariables;
            if (realParent != null && realParent.getRepositoryDirectory() != null) {
                directory = realParent.getRepositoryDirectory();
            }
        } else if (JobMeta.class.isAssignableFrom(parentVariables.getClass())) {
            // additional fallback protection for design mode
            JobMeta realParent = null;
            realParent = (JobMeta) parentVariables;
            filename = realParent.getFilename();
        }
        return resolveCurrentDirectory(parentVariables, directory, filename);
    }

    public String normalizeSlashes(String str) {
        while (str.contains("\\")) {
            str = str.replace("\\", "/");
        }
        while (str.contains("//")) {
            str = str.replace("//", "/");
        }
        return str;
    }

}