/*! ******************************************************************************
*
* 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.ui.repository;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleSecurityException;
import org.pentaho.di.core.logging.LogChannel;
import org.pentaho.di.core.plugins.PluginInterface;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.PluginTypeInterface;
import org.pentaho.di.core.plugins.RepositoryPluginType;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.RepositoriesMeta;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.dialog.EnterSelectionDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.repository.dialog.RepositoryDialogInterface;
import org.pentaho.di.ui.repository.dialog.RepositoryDialogInterface.MODE;
import org.pentaho.di.ui.repository.model.RepositoriesModel;
import org.pentaho.ui.xul.XulComponent;
import org.pentaho.ui.xul.components.XulConfirmBox;
import org.pentaho.ui.xul.dom.Document;
import org.pentaho.ui.xul.util.XulDialogCallback;
public class RepositoriesHelper {
private static Class<?> PKG = RepositoriesHelper.class; // for i18n purposes, needed by Translator2!!
private Shell shell;
private PropsUI props;
private RepositoriesMeta input;
private Repository repository;
private String prefRepositoryName;
private RepositoriesModel model;
private Document document;
private LogChannel log;
public RepositoriesHelper( RepositoriesModel model, Document document, Shell shell ) {
this.props = PropsUI.getInstance();
this.input = new RepositoriesMeta();
this.repository = null;
this.model = model;
this.document = document;
this.shell = shell;
log = new LogChannel( "RepositoriesHelper" );
try {
try {
this.input.readData();
if ( input.getErrorMessage() != null && input.getErrorMessage().length() > 0 ) {
throw new KettleException( input.getErrorMessage() );
}
} catch ( KettleException e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorReadingRepositoryDefinitions", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorReadingRepositoryDefinitions", e.getLocalizedMessage() ), e );
}
List<RepositoryMeta> repositoryList = new ArrayList<RepositoryMeta>();
for ( int i = 0; i < this.input.nrRepositories(); i++ ) {
repositoryList.add( this.input.getRepository( i ) );
}
model.setAvailableRepositories( repositoryList );
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorReadingRepositoryDefinitions" ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorReadingRepositoryDefinitions" ), e );
}
}
public void newRepository() {
PluginRegistry registry = PluginRegistry.getInstance();
Class<? extends PluginTypeInterface> pluginType = RepositoryPluginType.class;
List<PluginInterface> plugins = registry.getPlugins( pluginType );
String[] names = new String[plugins.size()];
for ( int i = 0; i < names.length; i++ ) {
PluginInterface plugin = plugins.get( i );
names[i] = plugin.getName() + " - " + plugin.getDescription();
}
// TODO: make this a bit fancier!
EnterSelectionDialog selectRepositoryType = new EnterSelectionDialog( this.shell, names,
BaseMessages.getString( PKG, "RepositoryLogin.SelectRepositoryType" ),
BaseMessages.getString( PKG, "RepositoryLogin.SelectRepositoryTypeCreate" ) );
String choice = selectRepositoryType.openRepoDialog();
if ( choice != null ) {
int index = selectRepositoryType.getSelectionNr();
PluginInterface plugin = plugins.get( index );
String id = plugin.getIds()[0];
try {
// With this ID we can create a new Repository object...
//
RepositoryMeta repositoryMeta =
PluginRegistry.getInstance().loadClass( RepositoryPluginType.class, id, RepositoryMeta.class );
RepositoryDialogInterface dialog = getRepositoryDialog( plugin, repositoryMeta, input, this.shell );
RepositoryMeta meta = dialog.open( MODE.ADD );
if ( meta != null ) {
// If the repository meta is not null and the repository name does not exist in the repositories list.
// If it does then display a error to the user
if ( meta.getName() != null ) {
input.addRepository( meta );
fillRepositories();
model.setSelectedRepository( meta );
writeData();
}
}
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorCreatingRepository", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorCreatingRepository", e.getLocalizedMessage() ), e );
}
}
}
public void editRepository() {
try {
PluginInterface plugin = null;
RepositoryMeta ri = input.searchRepository( model.getSelectedRepository().getName() );
if ( ri != null ) {
plugin = PluginRegistry.getInstance().getPlugin( RepositoryPluginType.class, ri.getId() );
if ( plugin == null ) {
throw new KettleException( BaseMessages
.getString( PKG, "RepositoryLogin.ErrorFindingPlugin", ri.getId() ) );
}
}
RepositoryDialogInterface dd = getRepositoryDialog( plugin, ri, input, this.shell );
if ( dd.open( MODE.EDIT ) != null ) {
fillRepositories();
int idx = input.indexOfRepository( ri );
model.setSelectedRepository( input.getRepository( idx ) );
writeData();
}
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorEditingRepository", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorEditingRepository", e.getLocalizedMessage() ), e );
}
}
public void deleteRepository() {
try {
XulConfirmBox confirmBox = (XulConfirmBox) document.createElement( "confirmbox" );
final RepositoryMeta repositoryMeta = input.searchRepository( model.getSelectedRepository().getName() );
if ( repositoryMeta != null ) {
confirmBox.setTitle( BaseMessages.getString( PKG, "RepositoryLogin.ConfirmDeleteRepositoryDialog.Title" ) );
confirmBox.setMessage( BaseMessages.getString(
PKG, "RepositoryLogin.ConfirmDeleteRepositoryDialog.Message" ) );
confirmBox.setAcceptLabel( BaseMessages.getString( PKG, "Dialog.Ok" ) );
confirmBox.setCancelLabel( BaseMessages.getString( PKG, "Dialog.Cancel" ) );
confirmBox.addDialogCallback( new XulDialogCallback<Object>() {
public void onClose( XulComponent sender, Status returnCode, Object retVal ) {
if ( returnCode == Status.ACCEPT ) {
int idx = input.indexOfRepository( repositoryMeta );
input.removeRepository( idx );
fillRepositories();
writeData();
}
}
public void onError( XulComponent sender, Throwable t ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.UnableToDeleteRepository", t
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.UnableToDeleteRepository", t.getLocalizedMessage() ), t );
}
} );
confirmBox.open();
}
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.UnableToDeleteRepository", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.UnableToDeleteRepository", e.getLocalizedMessage() ), e );
}
}
protected RepositoryDialogInterface getRepositoryDialog( PluginInterface plugin, RepositoryMeta repositoryMeta,
RepositoriesMeta input2, Shell shell ) throws Exception {
String className = repositoryMeta.getDialogClassName();
Class<? extends RepositoryDialogInterface> dialogClass =
PluginRegistry.getInstance().getClass( plugin, className );
Constructor<?> constructor =
dialogClass.getConstructor( Shell.class, Integer.TYPE, RepositoryMeta.class, RepositoriesMeta.class );
return (RepositoryDialogInterface) constructor.newInstance( new Object[] {
shell, Integer.valueOf( SWT.NONE ), repositoryMeta, input, } );
}
/**
* Copy information from the meta-data input to the dialog fields.
*/
public void getMetaData() {
fillRepositories();
String repname = props.getLastRepository();
if ( repname != null ) {
model.setSelectedRepositoryUsingName( repname );
String username = props.getLastRepositoryLogin();
if ( username != null ) {
model.setUsername( username );
}
}
// Do we have a preferred repository name to select
if ( prefRepositoryName != null ) {
model.setSelectedRepositoryUsingName( prefRepositoryName );
}
model.setShowDialogAtStartup( props.showRepositoriesDialogAtStartup() );
}
public void fillRepositories() {
model.getAvailableRepositories().clear();
if ( input.nrRepositories() == 0 ) {
model.addToAvailableRepositories( null );
} else {
for ( int i = 0; i < input.nrRepositories(); i++ ) {
model.addToAvailableRepositories( input.getRepository( i ) );
}
}
}
public Repository getConnectedRepository() {
return repository;
}
public void setPreferredRepositoryName( String repname ) {
prefRepositoryName = repname;
}
public void loginToRepository() throws KettleException, KettleSecurityException {
if ( model != null && model.getSelectedRepository() != null ) {
RepositoryMeta repositoryMeta =
input.getRepository( model.getRepositoryIndex( model.getSelectedRepository() ) );
repository =
PluginRegistry.getInstance().loadClass(
RepositoryPluginType.class, repositoryMeta.getId(), Repository.class );
repository.init( repositoryMeta );
repository.connect( model.getUsername(), model.getPassword() );
props.setLastRepository( repositoryMeta.getName() );
props.setLastRepositoryLogin( model.getUsername() );
} else {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorLoginToRepository" ) );
throw new KettleException( BaseMessages.getString( PKG, "RepositoryLogin.ErrorLoginToRepository" ) );
}
}
public void updateShowDialogOnStartup( boolean value ) {
props.setRepositoriesDialogAtStartupShown( value );
}
private void writeData() {
try {
input.writeData();
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorSavingRepositoryDefinition", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorSavingRepositoryDefinition", e.getLocalizedMessage() ), e );
}
}
}