/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 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.repository;
import java.util.Calendar;
import java.util.List;
import org.pentaho.di.cluster.ClusterSchema;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.Condition;
import org.pentaho.di.core.ProgressMonitorListener;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleSecurityException;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.partition.PartitionSchema;
import org.pentaho.di.shared.SharedObjects;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.metastore.api.IMetaStore;
public interface Repository {
/**
* @return The name of the repository
*/
public String getName();
/**
* Get the repository version.
*
* @return The repository version as a string
*/
public String getVersion();
/**
* @return the metadata describing this repository.
*/
public RepositoryMeta getRepositoryMeta();
/**
* @return the currently logged on user. (also available through the repository security provider)
*/
public IUser getUserInfo();
/**
* @return The security provider for this repository.
*/
public RepositorySecurityProvider getSecurityProvider();
/**
* @return The security manager for this repository.
*/
public RepositorySecurityManager getSecurityManager();
/**
* @return the logging channel of this repository
*/
public LogChannelInterface getLog();
/**
* Connect to the repository. Make sure you don't connect more than once to the same repository with this repository
* object.
*
* @param username
* the username of the user connecting to the repository.
* @param password
* the password of the user connecting to the repository.
* @throws KettleSecurityException
* in case the supplied user or password is incorrect.
* @throws KettleException
* in case there is a general unexpected error OR if we're already connected to the repository.
*/
public void connect( String username, String password ) throws KettleException, KettleSecurityException;
/**
* Disconnect from the repository.
*/
public void disconnect();
public boolean isConnected();
/**
* Initialize the repository with the repository metadata and user information.
* */
public void init( RepositoryMeta repositoryMeta );
// Common methods...
/**
* See if a repository object exists in the repository
*
* @param name
* the name of the object
* @param repositoryDirectory
* the directory in which it should reside
* @param objectType
* the type of repository object
* @return true if the job exists
* @throws KettleException
* in case something goes wrong.
*/
public boolean exists( String name, RepositoryDirectoryInterface repositoryDirectory,
RepositoryObjectType objectType ) throws KettleException;
public ObjectId getTransformationID( String name, RepositoryDirectoryInterface repositoryDirectory ) throws KettleException;
public ObjectId getJobId( String name, RepositoryDirectoryInterface repositoryDirectory ) throws KettleException;
public void save( RepositoryElementInterface repositoryElement, String versionComment,
ProgressMonitorListener monitor ) throws KettleException;
/**
* Save an object to the repository optionally overwriting any associated objects.
*
* @param repositoryElement
* Object to save
* @param versionComment
* Version comment for update
* @param monitor
* Progress Monitor to report feedback to
* @param overwrite
* Overwrite any existing objects involved in saving {@code repositoryElement}, e.g. repositoryElement,
* database connections, slave servers
* @throws KettleException
* Error saving the object to the repository
*/
public void save( RepositoryElementInterface repositoryElement, String versionComment,
ProgressMonitorListener monitor, boolean overwrite ) throws KettleException;
/**
* Save the object to the repository with version comments as well as version dates. This form exists largely to
* support the importing of revisions, preserving their revision date.
*
* @param repositoryElement
* @param versionComment
* @param versionDate
* @param monitor
* @param overwrite
* @throws KettleException
*/
public void save( RepositoryElementInterface repositoryElement, String versionComment, Calendar versionDate,
ProgressMonitorListener monitor, boolean overwrite ) throws KettleException;
public RepositoryDirectoryInterface getDefaultSaveDirectory( RepositoryElementInterface repositoryElement ) throws KettleException;
public RepositoryDirectoryInterface getUserHomeDirectory() throws KettleException;
/**
* Clear the shared object cache, if applicable.
*/
public void clearSharedObjectCache();
// Transformations : Loading & saving objects...
/**
* Load a transformation with a name from a folder in the repository
*
* @param transname
* the name of the transformation to load
* @param The
* folder to load it from
* @param monitor
* the progress monitor to use (UI feedback)
* @param setInternalVariables
* set to true if you want to automatically set the internal variables of the loaded transformation. (true is
* the default with very few exceptions!)
* @param revision
* the revision to load. Specify null to load the last version.
*/
public TransMeta loadTransformation( String transname, RepositoryDirectoryInterface repdir,
ProgressMonitorListener monitor, boolean setInternalVariables, String revision ) throws KettleException;
/**
* Load a transformation by id
*
* @param id_transformation
* the id of the transformation to load
* @param versionLabel
* version to load. Specify null to load the last version.
*/
public TransMeta loadTransformation( ObjectId id_transformation, String versionLabel ) throws KettleException;
public SharedObjects readTransSharedObjects( TransMeta transMeta ) throws KettleException;
/**
* Move / rename a transformation
*
* @param id_transformation
* The ObjectId of the transformation to move
* @param newDirectory
* The RepositoryDirectoryInterface that will be the new parent of the transformation (May be null if a move
* is not desired)
* @param newName
* The new name of the transformation (May be null if a rename is not desired)
* @return The ObjectId of the transformation that was moved
* @throws KettleException
*/
public ObjectId renameTransformation( ObjectId id_transformation, RepositoryDirectoryInterface newDirectory,
String newName ) throws KettleException;
/**
* Move / rename a transformation
*
* @param id_transformation
* The ObjectId of the transformation to move
* @param versionComment
* Version comment for rename
* @param newDirectory
* The RepositoryDirectoryInterface that will be the new parent of the transformation (May be null if a move
* is not desired)
* @param newName
* The new name of the transformation (May be null if a rename is not desired)
* @return The ObjectId of the transformation that was moved
* @throws KettleException
*/
public ObjectId renameTransformation( ObjectId id_transformation, String versionComment,
RepositoryDirectoryInterface newDirectory, String newName ) throws KettleException;
/**
* Delete everything related to a transformation from the repository. This does not included shared objects :
* databases, slave servers, cluster and partition schema.
*
* @param id_transformation
* the transformation id to delete
* @throws KettleException
*/
public void deleteTransformation( ObjectId id_transformation ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Jobs: Loading & saving objects...
// ///////////////////////////////////////////////////////////////////////////////////////////////
/**
* Load a job from the repository
*
* @param jobname
* the name
* @param repdir
* the directory
* @param monitor
* the progress monitor or null
* @param revision
* the revision to load. Specify null to load the last version.
*/
public JobMeta loadJob( String jobname, RepositoryDirectoryInterface repdir, ProgressMonitorListener monitor,
String revision ) throws KettleException;
/**
* Load a job from the repository by id
*
* @param id_job
* the id of the job
* @param versionLabel
* version to load. Specify null to load the last version.
*/
public JobMeta loadJob( ObjectId id_job, String versionLabel ) throws KettleException;
public SharedObjects readJobMetaSharedObjects( JobMeta jobMeta ) throws KettleException;
/**
* Move / rename a job
*
* @param id_job
* The ObjectId of the job to move
* @param versionComment
* Version comment for rename
* @param newDirectory
* The RepositoryDirectoryInterface that will be the new parent of the job (May be null if a move is not
* desired)
* @param newName
* The new name of the job (May be null if a rename is not desired)
* @return The ObjectId of the job that was moved
* @throws KettleException
*/
public ObjectId renameJob( ObjectId id_job, String versionComment, RepositoryDirectoryInterface newDirectory,
String newName ) throws KettleException;
/**
* Move / rename a job
*
* @param id_job
* The ObjectId of the job to move
* @param newDirectory
* The RepositoryDirectoryInterface that will be the new parent of the job (May be null if a move is not
* desired)
* @param newName
* The new name of the job (May be null if a rename is not desired)
* @return The ObjectId of the job that was moved
* @throws KettleException
*/
public ObjectId renameJob( ObjectId id_job, RepositoryDirectoryInterface newDirectory, String newName ) throws KettleException;
public void deleteJob( ObjectId id_job ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Databases : loading, saving, renaming, etc.
// ///////////////////////////////////////////////////////////////////////////////////////////////
/**
* Load the Database connection Metadata from the repository
*
* @param id_database
* the id of the database connection to load
* @param revision
* the revision to load. Specify null to load the last version.
* @throws KettleException
* in case something goes wrong with database, connection, etc.
*/
public DatabaseMeta loadDatabaseMeta( ObjectId id_database, String revision ) throws KettleException;
/**
* Remove a database connection from the repository
*
* @param databaseName
* The name of the connection to remove
* @throws KettleException
* In case something went wrong: database error, insufficient permissions, depending objects, etc.
*/
public void deleteDatabaseMeta( String databaseName ) throws KettleException;
public ObjectId[] getDatabaseIDs( boolean includeDeleted ) throws KettleException;
public String[] getDatabaseNames( boolean includeDeleted ) throws KettleException;
/**
* Read all the databases defined in the repository
*
* @return a list of all the databases defined in the repository
* @throws KettleException
*/
public List<DatabaseMeta> readDatabases() throws KettleException;
public ObjectId getDatabaseID( String name ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// ClusterSchema
// ///////////////////////////////////////////////////////////////////////////////////////////////
public ClusterSchema loadClusterSchema( ObjectId id_cluster_schema, List<SlaveServer> slaveServers,
String versionLabel ) throws KettleException;
public ObjectId[] getClusterIDs( boolean includeDeleted ) throws KettleException;
public String[] getClusterNames( boolean includeDeleted ) throws KettleException;
public ObjectId getClusterID( String name ) throws KettleException;
public void deleteClusterSchema( ObjectId id_cluster ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// SlaveServer
// ///////////////////////////////////////////////////////////////////////////////////////////////
public SlaveServer loadSlaveServer( ObjectId id_slave_server, String versionLabel ) throws KettleException;
public ObjectId[] getSlaveIDs( boolean includeDeleted ) throws KettleException;
public String[] getSlaveNames( boolean includeDeleted ) throws KettleException;
/**
* @return a list of all the slave servers in the repository.
* @throws KettleException
*/
public List<SlaveServer> getSlaveServers() throws KettleException;
public ObjectId getSlaveID( String name ) throws KettleException;
public void deleteSlave( ObjectId id_slave ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// PartitionSchema
// ///////////////////////////////////////////////////////////////////////////////////////////////
public PartitionSchema loadPartitionSchema( ObjectId id_partition_schema, String versionLabel ) throws KettleException;
public ObjectId[] getPartitionSchemaIDs( boolean includeDeleted ) throws KettleException;
// public ObjectId[] getPartitionIDs(ObjectId id_partition_schema) throws KettleException;
public String[] getPartitionSchemaNames( boolean includeDeleted ) throws KettleException;
public ObjectId getPartitionSchemaID( String name ) throws KettleException;
public void deletePartitionSchema( ObjectId id_partition_schema ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Directory stuff
// ///////////////////////////////////////////////////////////////////////////////////////////////
public RepositoryDirectoryInterface loadRepositoryDirectoryTree() throws KettleException;
public RepositoryDirectoryInterface findDirectory( String directory ) throws KettleException;
public RepositoryDirectoryInterface findDirectory( ObjectId directory ) throws KettleException;
public void saveRepositoryDirectory( RepositoryDirectoryInterface dir ) throws KettleException;
public void deleteRepositoryDirectory( RepositoryDirectoryInterface dir ) throws KettleException;
/**
* Move / rename a repository directory
*
* @param id
* The ObjectId of the repository directory to move
* @param newParentDir
* The RepositoryDirectoryInterface that will be the new parent of the repository directory (May be null if a
* move is not desired)
* @param newName
* The new name of the repository directory (May be null if a rename is not desired)
* @return The ObjectId of the repository directory that was moved
* @throws KettleException
*/
public ObjectId renameRepositoryDirectory( ObjectId id, RepositoryDirectoryInterface newParentDir, String newName ) throws KettleException;
/**
* Create a new directory, possibly by creating several sub-directies of / at the same time.
*
* @param parentDirectory
* the parent directory
* @param directoryPath
* The path to the new Repository Directory, to be created.
* @return The created sub-directory
* @throws KettleException
* In case something goes wrong
*/
public RepositoryDirectoryInterface createRepositoryDirectory( RepositoryDirectoryInterface parentDirectory,
String directoryPath ) throws KettleException;
public String[] getTransformationNames( ObjectId id_directory, boolean includeDeleted ) throws KettleException;
public List<RepositoryElementMetaInterface> getJobObjects( ObjectId id_directory, boolean includeDeleted ) throws KettleException;
public List<RepositoryElementMetaInterface> getTransformationObjects( ObjectId id_directory,
boolean includeDeleted ) throws KettleException;
/**
* Gets all job and transformation objects in the given directory. (Combines {@link #getJobObjects(ObjectId, boolean)}
* and {@link #getTransformationObjects(ObjectId, boolean)} into one operation.
*
* @param id_directory
* directory
* @param includeDeleted
* true to return deleted objects
* @return list of repository objects
* @throws KettleException
* In case something goes wrong
*/
public List<RepositoryElementMetaInterface> getJobAndTransformationObjects( ObjectId id_directory,
boolean includeDeleted ) throws KettleException;
public String[] getJobNames( ObjectId id_directory, boolean includeDeleted ) throws KettleException;
/**
* Returns the child directory names of a parent directory
*
* @param id_directory
* parent directory id
* @return array of child names
* @throws KettleException
*/
public String[] getDirectoryNames( ObjectId id_directory ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Logging...
// ///////////////////////////////////////////////////////////////////////////////////////////////
/**
* Insert an entry in the audit trail of the repository. This is an optional operation and depends on the capabilities
* of the underlying repository.
*
* @param The
* description to be put in the audit trail of the repository.
*/
public ObjectId insertLogEntry( String description ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Relationships between objects !!!!!!!!!!!!!!!!!!!!!! <-----------------
// ///////////////////////////////////////////////////////////////////////////////////////////////
public void insertStepDatabase( ObjectId id_transformation, ObjectId id_step, ObjectId id_database ) throws KettleException;
public void insertJobEntryDatabase( ObjectId id_job, ObjectId id_jobentry, ObjectId id_database ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Condition
// ///////////////////////////////////////////////////////////////////////////////////////////////
/**
* This method saves the object ID of the condition object (if not null) in the step attributes
*
* @param id_step
* @param code
* @param condition
*/
public void saveConditionStepAttribute( ObjectId id_transformation, ObjectId id_step, String code,
Condition condition ) throws KettleException;
/**
* Load a condition from the repository with the Object ID stored in a step attribute.
*
* @param id_step
* @param code
* @return
* @throws KettleException
*/
public Condition loadConditionFromStepAttribute( ObjectId id_step, String code ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Attributes for steps...
// ///////////////////////////////////////////////////////////////////////////////////////////////
public boolean getStepAttributeBoolean( ObjectId id_step, int nr, String code, boolean def ) throws KettleException;
public boolean getStepAttributeBoolean( ObjectId id_step, int nr, String code ) throws KettleException;
public boolean getStepAttributeBoolean( ObjectId id_step, String code ) throws KettleException;
public long getStepAttributeInteger( ObjectId id_step, int nr, String code ) throws KettleException;
public long getStepAttributeInteger( ObjectId id_step, String code ) throws KettleException;
public String getStepAttributeString( ObjectId id_step, int nr, String code ) throws KettleException;
public String getStepAttributeString( ObjectId id_step, String code ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, int nr, String code, String value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, String code, String value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, int nr, String code, boolean value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, String code, boolean value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, int nr, String code, long value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, String code, long value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, int nr, String code, double value ) throws KettleException;
public void saveStepAttribute( ObjectId id_transformation, ObjectId id_step, String code, double value ) throws KettleException;
public int countNrStepAttributes( ObjectId id_step, String code ) throws KettleException;
// ///////////////////////////////////////////////////////////////////////////////////////////////
// Attributes for job entries...
// ///////////////////////////////////////////////////////////////////////////////////////////////
public int countNrJobEntryAttributes( ObjectId id_jobentry, String code ) throws KettleException;
public boolean getJobEntryAttributeBoolean( ObjectId id_jobentry, String code ) throws KettleException;
public boolean getJobEntryAttributeBoolean( ObjectId id_jobentry, int nr, String code ) throws KettleException;
public boolean getJobEntryAttributeBoolean( ObjectId id_jobentry, String code, boolean def ) throws KettleException;
public long getJobEntryAttributeInteger( ObjectId id_jobentry, String code ) throws KettleException;
public long getJobEntryAttributeInteger( ObjectId id_jobentry, int nr, String code ) throws KettleException;
public String getJobEntryAttributeString( ObjectId id_jobentry, String code ) throws KettleException;
public String getJobEntryAttributeString( ObjectId id_jobentry, int nr, String code ) throws KettleException;
public void saveJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, int nr, String code, String value ) throws KettleException;
public void saveJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, String code, String value ) throws KettleException;
public void saveJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, int nr, String code, boolean value ) throws KettleException;
public void saveJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, String code, boolean value ) throws KettleException;
public void saveJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, int nr, String code, long value ) throws KettleException;
public void saveJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, String code, long value ) throws KettleException;
/**
* This method is introduced to avoid having to go over an integer/string/whatever in the interface and the step code.
*
* @param id_step
* @param code
* @return
* @throws KettleException
*/
public DatabaseMeta loadDatabaseMetaFromStepAttribute( ObjectId id_step, String code,
List<DatabaseMeta> databases ) throws KettleException;
/**
* This method saves the object ID of the database object (if not null) in the step attributes
*
* @param id_transformation
* @param id_step
* @param code
* @param database
*/
public void saveDatabaseMetaStepAttribute( ObjectId id_transformation, ObjectId id_step, String code,
DatabaseMeta database ) throws KettleException;
/**
* This method is introduced to avoid having to go over an integer/string/whatever in the interface and the job entry
* code.
*
* @param id_step
* @param code
* @return
* @throws KettleException
*/
public DatabaseMeta loadDatabaseMetaFromJobEntryAttribute( ObjectId id_jobentry, String nameCode, String idCode,
List<DatabaseMeta> databases ) throws KettleException;
/**
* This method is introduced to avoid having to go over an integer/string/whatever in the interface and the job entry
* code.
*
* @param id_entry
* @param nameCode
* @param nr
* @param idcode
* @param databases
* @return
* @throws KettleException
*/
public DatabaseMeta loadDatabaseMetaFromJobEntryAttribute( ObjectId id_jobentry, String nameCode, int nr,
String idCode, List<DatabaseMeta> databases ) throws KettleException;
/**
* This method saves the object ID of the database object (if not null) in the job entry attributes
*
* @param id_job
* @param id_jobentry
* @param idCode
* @param database
*/
public void saveDatabaseMetaJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, String nameCode,
String idCode, DatabaseMeta database ) throws KettleException;
/**
* This method saves the object ID of the database object (if not null) in the job entry attributes
*
* @param id_job
* @param id_jobentry
* @param nr
* @param code
* @param database
*/
public void saveDatabaseMetaJobEntryAttribute( ObjectId id_job, ObjectId id_jobentry, int nr, String nameCode,
String idCode, DatabaseMeta database ) throws KettleException;
/**
* Removes he deleted flag from a repository element in the repository. If it wasn't deleted, it remains untouched.
*
* @param element
* the repository element to restore
* @throws KettleException
* get throws in case something goes horribly wrong.
*/
public void undeleteObject( RepositoryElementMetaInterface repositoryObject ) throws KettleException;
/**
* Retrieves the current list of of IRepository Services.
*
* @return List of repository services
* @throws KettleException
* in case something goes horribly wrong.
*/
public List<Class<? extends IRepositoryService>> getServiceInterfaces() throws KettleException;
/**
* Retrieves a given repository service
*
* @param service
* class name
* @return repository service
*
* @throws KettleException
* in case something goes horribly wrong.
*/
public IRepositoryService getService( Class<? extends IRepositoryService> clazz ) throws KettleException;
/**
* Checks whether a given repository service is available or not
*
* @param repository
* service class that needs to be checked for support
* @throws KettleException
* in case something goes horribly wrong.
*/
public boolean hasService( Class<? extends IRepositoryService> clazz ) throws KettleException;
/**
* Get more information about a certain object ID in the form of the RepositoryObject
*
* @param objectId
* The ID of the object to get more information about.
* @param objectType
* The type of object to investigate.
* @return The repository object or null if nothing could be found.
* @throws KettleException
* In case there was a loading problem.
*/
public RepositoryObject getObjectInformation( ObjectId objectId, RepositoryObjectType objectType ) throws KettleException;
/**
* This is an informational message that a repository can display on connecting within Spoon. If a null is returned,
* no message is displayed to the end user.
*
* @return message
*/
public String getConnectMessage();
/**
* Get the repository version.
*
* @return The repository version as a string
*/
public String[] getJobsUsingDatabase( ObjectId id_database ) throws KettleException;
public String[] getTransformationsUsingDatabase( ObjectId id_database ) throws KettleException;
/**
* @return the importer that will handle imports into this repository
*/
public IRepositoryImporter getImporter();
/**
* @return the exporter that will handle exports from this repository
*/
public IRepositoryExporter getExporter() throws KettleException;
/**
* @return the Metastore that is implemented in this Repository. Return null if this repository doesn't implement a
* Metastore.
*/
public IMetaStore getMetaStore();
}