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