/*! * Copyright 2010 - 2015 Pentaho Corporation. All rights reserved. * * 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 com.pentaho.repository.importexport; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.parameters.DuplicateParamException; import org.pentaho.di.core.parameters.NamedParams; import org.pentaho.di.core.parameters.NamedParamsDefault; import org.pentaho.di.job.JobMeta; import org.pentaho.di.repository.Repository; import org.pentaho.di.trans.TransMeta; import org.pentaho.platform.api.repository2.unified.IUnifiedRepository; import org.pentaho.platform.api.repository2.unified.RepositoryFile; import org.pentaho.platform.api.util.IPdiContentProvider; import org.pentaho.platform.engine.core.system.PentahoSystem; public class PdiContentProvider implements IPdiContentProvider { private Log log = LogFactory.getLog( PdiContentProvider.class ); IUnifiedRepository unifiedRepository = PentahoSystem.get( IUnifiedRepository.class, null ); @Override public boolean hasUserParameters( String kettleFilePath ) { if ( !StringUtils.isEmpty( kettleFilePath ) ) { RepositoryFile file = unifiedRepository.getFile( kettleFilePath ); if ( file != null ) { try { return hasUserParameters( getMeta( file ) ); } catch ( KettleException e ) { log.error( e ); } } } return false; } @Override public String[] getUserParameters( String kettleFilePath ) { List<String> userParams = new ArrayList<String>(); if ( !StringUtils.isEmpty( kettleFilePath ) ) { RepositoryFile file = unifiedRepository.getFile( kettleFilePath ); if ( file != null ) { try { NamedParams np = getMeta( file ); if ( !isEmpty( np = filterUserParameters( np ) ) ) { return np.listParameters(); } } catch ( KettleException e ) { log.error( e ); } } } return userParams.toArray( new String[] {} ); } private NamedParams filterUserParameters( NamedParams params ) { NamedParams userParams = new NamedParamsDefault(); if ( !isEmpty( params ) ) { for ( String paramName : params.listParameters() ) { if ( isUserParameter( paramName ) ) { try { userParams.addParameterDefinition( paramName, StringUtils.EMPTY, StringUtils.EMPTY ); } catch ( DuplicateParamException e ) { // ignore } } } } return userParams; } private NamedParams getMeta( RepositoryFile file ) throws KettleException { NamedParams meta = null; if ( file != null ) { String extension = FilenameUtils.getExtension( file.getName() ); Repository repo = PDIImportUtil.connectToRepository( null ); if ( "ktr".equalsIgnoreCase( extension ) ) { meta = new TransMeta( convertTransformation( file.getId() ), repo, true, null, null ); } else if ( "kjb".equalsIgnoreCase( extension ) ) { meta = new JobMeta( convertJob( file.getId() ), repo, null ); } } return meta; } private InputStream convertTransformation( Serializable fileId ) { return new StreamToTransNodeConverter( unifiedRepository ).convert( fileId ); } private InputStream convertJob( Serializable fileId ) { return new StreamToJobNodeConverter( unifiedRepository ).convert( fileId ); } private boolean isUserParameter( String paramName ) { if ( !StringUtils.isEmpty( paramName ) ) { // prevent rendering of protected/hidden/system parameters if ( paramName.startsWith( IPdiContentProvider.PROTECTED_PARAMETER_PREFIX ) ) { return false; } } return true; } private boolean hasUserParameters( NamedParams params ) { return !isEmpty( filterUserParameters( params ) ); } private boolean isEmpty( NamedParams np ) { return np == null || np.listParameters() == null || np.listParameters().length == 0; } }