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