Skip to content

Commit

Permalink
[BACKLOG-3826] - Implemented universal directory variable and created…
Browse files Browse the repository at this point in the history
… fallbacks for legacy variables.
  • Loading branch information
wseyler authored and mdamour1976 committed Aug 26, 2015
1 parent d0a79a7 commit 9e50fed
Show file tree
Hide file tree
Showing 13 changed files with 626 additions and 163 deletions.
7 changes: 6 additions & 1 deletion core/src/org/pentaho/di/core/Const.java
Expand Up @@ -459,20 +459,25 @@ public String getMessage() {
/** comma-separated list of extension point plugins for which snmp traps should be sent */ /** comma-separated list of extension point plugins for which snmp traps should be sent */
public static final String VARIABLE_MONITORING_SNMP_TRAPS_ENABLED = "monitoring.snmp.traps.enabled"; public static final String VARIABLE_MONITORING_SNMP_TRAPS_ENABLED = "monitoring.snmp.traps.enabled";


/** The current transformation directory */
public static final String INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY = INTERNAL_VARIABLE_PREFIX
+ ".Entry.Current.Directory";

/** /**
* All the internal transformation variables * All the internal transformation variables
*/ */
public static final String[] INTERNAL_TRANS_VARIABLES = new String[] { public static final String[] INTERNAL_TRANS_VARIABLES = new String[] {
Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY,
Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY,
Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_NAME, Const.INTERNAL_VARIABLE_TRANSFORMATION_NAME, Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_NAME, Const.INTERNAL_VARIABLE_TRANSFORMATION_NAME,
Const.INTERNAL_VARIABLE_TRANSFORMATION_REPOSITORY_DIRECTORY, Const.INTERNAL_VARIABLE_TRANSFORMATION_REPOSITORY_DIRECTORY,

}; };


/** /**
* All the internal job variables * All the internal job variables
*/ */
public static final String[] INTERNAL_JOB_VARIABLES = new String[] { public static final String[] INTERNAL_JOB_VARIABLES = new String[] {
Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY,
Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME,
Const.INTERNAL_VARIABLE_JOB_NAME, Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY, Const.INTERNAL_VARIABLE_JOB_NAME, Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY,
Const.INTERNAL_VARIABLE_JOB_RUN_ID, Const.INTERNAL_VARIABLE_JOB_RUN_ATTEMPTNR, }; Const.INTERNAL_VARIABLE_JOB_RUN_ID, Const.INTERNAL_VARIABLE_JOB_RUN_ATTEMPTNR, };
Expand Down
126 changes: 126 additions & 0 deletions engine/src/org/pentaho/di/core/util/CurrentDirectoryResolver.java
@@ -0,0 +1,126 @@
/*! ******************************************************************************
*
* 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 );
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 ) {
}
} else {
tmpSpace.setVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY, parentVariables
.getVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY ) );
}
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 = 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 = 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 );
}

}
48 changes: 31 additions & 17 deletions engine/src/org/pentaho/di/job/Job.java
Expand Up @@ -1538,34 +1538,48 @@ public void setInternalKettleVariables( VariableSpace var ) {
FileName fileName = fileObject.getName(); FileName fileName = fileObject.getName();


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


// The directory of the transformation // The directory of the transformation
FileName fileDir = fileName.getParent(); FileName fileDir = fileName.getParent();
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, fileDir.getURI() ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, fileDir.getURI() );
} catch ( Exception e ) { } catch ( Exception e ) {
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" );
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" );
} }
} else { } else {
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" );
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" );
} }


boolean hasRepoDir = jobMeta.getRepositoryDirectory() != null && jobMeta.getRepository() != null;

// The name of the job // The name of the job
var.setVariable( Const.INTERNAL_VARIABLE_JOB_NAME, Const.NVL( jobMeta.getName(), "" ) ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_NAME, Const.NVL( jobMeta.getName(), "" ) );


// The name of the directory in the repository // The name of the directory in the repository
var.setVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY, jobMeta.getRepositoryDirectory() != null variables.setVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY,
? jobMeta.getRepositoryDirectory().getPath() : "" ); hasRepoDir ? jobMeta.getRepositoryDirectory().getPath() : "" );


// Undefine the transformation specific variables // setup fallbacks
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, null ); if ( hasRepoDir ) {
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_NAME, null ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY,
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, null ); variables.getVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY ) );
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_NAME, null ); } else {
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_NAME, null ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY,
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_REPOSITORY_DIRECTORY, null ); variables.getVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY ) );
}

if ( hasRepoDir ) {
variables.setVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY,
variables.getVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY ) );
if ( "/".equals(variables.getVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY ) ) ) {
variables.setVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY, "" );
}
} else {
variables.setVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY,
variables.getVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY ) );
}
} }


/* /*
Expand Down
40 changes: 22 additions & 18 deletions engine/src/org/pentaho/di/job/JobMeta.java
Expand Up @@ -2421,18 +2421,23 @@ public void setInternalKettleVariables( VariableSpace var ) {
setInternalNameKettleVariable( var ); setInternalNameKettleVariable( var );


// The name of the directory in the repository // The name of the directory in the repository
var.setVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY, directory != null variables.setVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY, directory != null
? directory.getPath() : "" ); ? directory.getPath() : "" );


// Undefine the transformation specific variables: boolean hasRepoDir = getRepositoryDirectory() != null && getRepository() != null;
// transformations can't run jobs, so if you use these they are 99.99%
// wrong. // setup fallbacks
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, null ); if ( hasRepoDir ) {
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_NAME, null ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY,
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_DIRECTORY, null ); variables.getVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY ) );
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_FILENAME_NAME, null ); } else {
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_NAME, null ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY,
var.setVariable( Const.INTERNAL_VARIABLE_TRANSFORMATION_REPOSITORY_DIRECTORY, null ); variables.getVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY ) );
}

variables.setVariable( Const.INTERNAL_VARIABLE_ENTRY_CURRENT_DIRECTORY,
variables.getVariable( repository != null ?
Const.INTERNAL_VARIABLE_JOB_REPOSITORY_DIRECTORY : Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY ) );
} }


/** /**
Expand All @@ -2444,7 +2449,7 @@ public void setInternalKettleVariables( VariableSpace var ) {
@Override @Override
protected void setInternalNameKettleVariable( VariableSpace var ) { protected void setInternalNameKettleVariable( VariableSpace var ) {
// The name of the job // The name of the job
var.setVariable( Const.INTERNAL_VARIABLE_JOB_NAME, Const.NVL( name, "" ) ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_NAME, Const.NVL( name, "" ) );
} }


/** /**
Expand All @@ -2457,24 +2462,23 @@ protected void setInternalNameKettleVariable( VariableSpace var ) {
protected void setInternalFilenameKettleVariables( VariableSpace var ) { protected void setInternalFilenameKettleVariables( VariableSpace var ) {
if ( filename != null ) { if ( filename != null ) {
// we have a filename that's defined. // we have a filename that's defined.

try { try {
FileObject fileObject = KettleVFS.getFileObject( filename, var ); FileObject fileObject = KettleVFS.getFileObject( filename, var );
FileName fileName = fileObject.getName(); FileName fileName = fileObject.getName();


// The filename of the job // The filename of the job
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, fileName.getBaseName() ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, fileName.getBaseName() );


// The directory of the job // The directory of the job
FileName fileDir = fileName.getParent(); FileName fileDir = fileName.getParent();
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, fileDir.getURI() ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, fileDir.getURI() );
} catch ( Exception e ) { } catch ( Exception e ) {
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" );
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" );
} }
} else { } else {
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_DIRECTORY, "" );
var.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" ); variables.setVariable( Const.INTERNAL_VARIABLE_JOB_FILENAME_NAME, "" );
} }
} }


Expand Down
64 changes: 52 additions & 12 deletions engine/src/org/pentaho/di/job/entries/job/JobEntryJob.java
Expand Up @@ -52,6 +52,7 @@
import org.pentaho.di.core.parameters.DuplicateParamException; import org.pentaho.di.core.parameters.DuplicateParamException;
import org.pentaho.di.core.parameters.NamedParams; import org.pentaho.di.core.parameters.NamedParams;
import org.pentaho.di.core.parameters.NamedParamsDefault; import org.pentaho.di.core.parameters.NamedParamsDefault;
import org.pentaho.di.core.util.CurrentDirectoryResolver;
import org.pentaho.di.core.variables.VariableSpace; import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.variables.Variables; import org.pentaho.di.core.variables.Variables;
import org.pentaho.di.core.vfs.KettleVFS; import org.pentaho.di.core.vfs.KettleVFS;
Expand Down Expand Up @@ -1193,31 +1194,70 @@ public JobMeta getJobMeta( Repository rep, VariableSpace space ) throws KettleEx
public JobMeta getJobMeta( Repository rep, IMetaStore metaStore, VariableSpace space ) throws KettleException { public JobMeta getJobMeta( Repository rep, IMetaStore metaStore, VariableSpace space ) throws KettleException {
JobMeta jobMeta = null; JobMeta jobMeta = null;
try { try {
CurrentDirectoryResolver r = new CurrentDirectoryResolver();
VariableSpace tmpSpace = r.resolveCurrentDirectory(
specificationMethod, space, rep, parentJob, getFilename() );
switch ( specificationMethod ) { switch ( specificationMethod ) {
case FILENAME: case FILENAME:
jobMeta = String realFilename = tmpSpace.environmentSubstitute( getFilename() );
new JobMeta( space, ( space != null ? space.environmentSubstitute( getFilename() ) : getFilename() ), if ( rep != null ) {
rep, metaStore, null ); // need to try to load from the repository
while ( realFilename.contains( "//" ) ) {
realFilename = realFilename.replace( "//", "/" );
}
try {
String dirStr = realFilename.substring( 0, realFilename.lastIndexOf( "/" ) );
String tmpFilename = realFilename.substring( realFilename.lastIndexOf( "/" ) + 1 );
RepositoryDirectoryInterface dir = rep.findDirectory( dirStr );
jobMeta = rep.loadJob( tmpFilename, dir, null, null );
} catch ( KettleException ke ) {
// try without extension
if ( realFilename.endsWith( Const.STRING_JOB_DEFAULT_EXT ) ) {
try {
String tmpFilename = realFilename.substring( realFilename.lastIndexOf( "/" ) + 1,
realFilename.indexOf( "." + Const.STRING_JOB_DEFAULT_EXT ) );
String dirStr = realFilename.substring( 0, realFilename.lastIndexOf( "/" ) );
RepositoryDirectoryInterface dir = rep.findDirectory( dirStr );
jobMeta = rep.loadJob( tmpFilename, dir, null, null );
} catch ( KettleException ke2 ) {
// fall back to try loading from file system (mappingJobMeta is going to be null)
}
}
}
}
if ( jobMeta == null ) {
jobMeta = new JobMeta( tmpSpace, realFilename, rep, metaStore, null );
}
break; break;
case REPOSITORY_BY_NAME: case REPOSITORY_BY_NAME:
String realDirectory = tmpSpace.environmentSubstitute( getDirectory() );
String realJobName = tmpSpace.environmentSubstitute( getJobName() );

if ( rep != null ) { if ( rep != null ) {
String realDirectory =
( space != null ? space.environmentSubstitute( getDirectory() ) : getDirectory() );
RepositoryDirectoryInterface repositoryDirectory = RepositoryDirectoryInterface repositoryDirectory =
rep.loadRepositoryDirectoryTree().findDirectory( realDirectory ); rep.loadRepositoryDirectoryTree().findDirectory( realDirectory );
if ( repositoryDirectory == null ) { if ( repositoryDirectory == null ) {
throw new KettleException( "Unable to find repository directory [" throw new KettleException( "Unable to find repository directory ["
+ Const.NVL( realDirectory, "" ) + "]" ); + Const.NVL( realDirectory, "" ) + "]" );
} }
jobMeta = jobMeta = rep.loadJob( realJobName, repositoryDirectory, null, null ); // reads
rep.loadJob(
( space != null ? space.environmentSubstitute( getJobName() ) : getJobName() ),
repositoryDirectory, null, null ); // reads
break;
} else { } else {
throw new KettleException( // rep is null, let's try loading by filename
"Could not execute job specified in a repository since we're not connected to one" ); try {
jobMeta = new JobMeta( tmpSpace, realDirectory + "/" + realJobName, rep, metaStore, null );
} catch ( KettleException ke ) {
try {
// add .kjb extension and try again
jobMeta = new JobMeta( tmpSpace,
realDirectory + "/" + realJobName + "." + Const.STRING_JOB_DEFAULT_EXT, rep, metaStore, null );
} catch ( KettleException ke2 ) {
ke2.printStackTrace();
throw new KettleException(
"Could not execute job specified in a repository since we're not connected to one" );
}
}
} }
break;
case REPOSITORY_BY_REFERENCE: case REPOSITORY_BY_REFERENCE:
if ( rep != null ) { if ( rep != null ) {
// Load the last version... // Load the last version...
Expand Down

0 comments on commit 9e50fed

Please sign in to comment.