/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 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.repo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Shell;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.KettleLogStore;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.RepositoryMeta;
import org.pentaho.di.ui.core.database.dialog.DatabaseDialog;
import org.pentaho.di.ui.core.dialog.ThinDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.util.HelpUtils;
import org.pentaho.platform.settings.ServerPort;
import org.pentaho.platform.settings.ServerPortRegistry;
/**
* Created by bmorrise on 2/21/16.
*/
public class RepositoryDialog extends ThinDialog {
public static final String HELP_URL = Const.getDocUrl( "0L0/0Y0/040" );
private LogChannelInterface log =
KettleLogStore.getLogChannelInterfaceFactory().create( RepositoryDialog.class );
private static Class<?> PKG = RepositoryConnectMenu.class;
private static final int WIDTH = 630;
private static final int HEIGHT = 630;
private static final int OPTIONS = SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM;
private static final String CREATION_TITLE = BaseMessages.getString( PKG, "RepositoryDialog.Dialog.NewRepo.Title" );
private static final String CREATION_WEB_CLIENT_PATH = "/repositories/web/index.html";
private static final String MANAGER_TITLE = BaseMessages.getString( PKG, "RepositoryDialog.Dialog.Manager.Title" );
private static final String MANAGER_WEB_CLIENT_PATH = "/repositories/web/index.html#repository-manager";
private static final String LOGIN_TITLE = BaseMessages.getString( PKG, "RepositoryDialog.Dialog.Login.Title" );
private static final String LOGIN_WEB_CLIENT_PATH = "/repositories/web/index.html#repository-connect";
private static final String OSGI_SERVICE_PORT = "OSGI_SERVICE_PORT";
private static final Image LOGO = GUIResource.getInstance().getImageLogoSmall();
private RepositoryConnectController controller;
private Shell shell;
private boolean result = false;
public RepositoryDialog( Shell shell, RepositoryConnectController controller ) {
super( shell, WIDTH, HEIGHT );
this.controller = controller;
this.shell = shell;
}
private boolean open() {
return open( null );
}
private boolean open( RepositoryMeta repositoryMeta ) {
return open( repositoryMeta, false, null );
}
private boolean open( RepositoryMeta repositoryMeta, boolean relogin, String errorMessage ) {
new BrowserFunction( browser, "close" ) {
@Override public Object function( Object[] arguments ) {
browser.dispose();
dialog.close();
dialog.dispose();
return true;
}
};
new BrowserFunction( browser, "setResult" ) {
@Override public Object function( Object[] arguments ) {
setResult( (boolean) arguments[ 0 ] );
return true;
}
};
new BrowserFunction( browser, "getErrorMessage" ) {
@Override public Object function( Object[] objects ) {
return errorMessage == null ? "" : errorMessage;
}
};
new BrowserFunction( browser, "help" ) {
@Override public Object function( Object[] objects ) {
HelpUtils.openHelpDialog( shell, BaseMessages.getString( PKG, "RepositoryDialog.Dialog.Tile" ), HELP_URL,
BaseMessages.getString( PKG, "RepositoryDialog.Dialog.Header" ) );
return true;
}
};
new BrowserFunction( browser, "getRepositories" ) {
@Override public Object function( Object[] objects ) {
return controller.getRepositories();
}
};
new BrowserFunction( browser, "getRepositoryTypes" ) {
@Override public Object function( Object[] objects ) {
return controller.getPlugins();
}
};
new BrowserFunction( browser, "deleteRepository" ) {
@Override public Object function( Object[] objects ) {
return controller.deleteRepository( (String) objects[ 0 ] );
}
};
new BrowserFunction( browser, "selectLocation" ) {
@Override public Object function( Object[] objects ) {
DirectoryDialog directoryDialog = new DirectoryDialog( shell );
return directoryDialog.open();
}
};
new BrowserFunction( browser, "connectToRepository" ) {
@Override public Object function( Object[] objects ) {
try {
controller.connectToRepository();
dialog.dispose();
} catch ( KettleException e ) {
return false;
}
return true;
}
};
new BrowserFunction( browser, "setDefaultRepository" ) {
@Override public Object function( Object[] objects ) {
return controller.setDefaultRepository( (String) objects[ 0 ] );
}
};
new BrowserFunction( browser, "getDatabases" ) {
@Override public Object function( Object[] objects ) {
return controller.getDatabases();
}
};
new BrowserFunction( browser, "createNewConnection" ) {
@Override public Object function( Object[] objects ) {
DatabaseDialog databaseDialog = new DatabaseDialog( shell, new DatabaseMeta() );
databaseDialog.open();
DatabaseMeta databaseMeta = databaseDialog.getDatabaseMeta();
if ( databaseMeta != null ) {
if ( !controller.isDatabaseWithNameExist( databaseMeta, true ) ) {
controller.addDatabase( databaseMeta );
return true;
} else {
DatabaseDialog.showDatabaseExistsDialog( shell, databaseMeta );
}
}
return false;
}
};
new BrowserFunction( browser, "editDatabaseConnection" ) {
@Override public Object function( Object[] objects ) {
DatabaseMeta databaseMeta = controller.getDatabase( (String) objects[ 0 ] );
String originalName = databaseMeta.getName();
DatabaseDialog databaseDialog = new DatabaseDialog( shell, databaseMeta );
databaseDialog.open();
if ( !controller.isDatabaseWithNameExist( databaseMeta, false ) ) {
controller.save();
return databaseMeta.getName();
} else {
DatabaseDialog.showDatabaseExistsDialog( shell, databaseMeta );
databaseMeta.setName( originalName );
databaseMeta.setDisplayName( originalName );
return originalName;
}
}
};
new BrowserFunction( browser, "deleteDatabaseConnection" ) {
@Override public Object function( Object[] objects ) {
controller.removeDatabase( (String) objects[ 0 ] );
return true;
}
};
new BrowserFunction( browser, "reset" ) {
@Override public Object function( Object[] objects ) {
controller.setCurrentRepository( null );
controller.setRelogin( false );
return true;
}
};
new BrowserFunction( browser, "getCurrentUser" ) {
@Override public Object function( Object[] objects ) {
return controller.getCurrentUser();
}
};
new BrowserFunction( browser, "getCurrentRepository" ) {
@Override
public Object function( Object[] objects ) {
return controller.getCurrentRepository() != null ? controller.getCurrentRepository().getName() : "";
}
};
new BrowserFunction( browser, "getDefaultUrl" ) {
@Override public Object function( Object[] objects ) {
return controller.getDefaultUrl();
}
};
new BrowserFunction( browser, "loadRepository" ) {
@Override public Object function( Object[] objects ) {
return controller.getRepository( (String) objects[ 0 ] );
}
};
new BrowserFunction( browser, "getConnectedRepositoryName" ) {
@Override public Object function( Object[] objects ) {
return controller.getConnectedRepository() != null ? controller.getConnectedRepository().getName() : "";
}
};
controller.setCurrentRepository( repositoryMeta );
controller.setRelogin( relogin );
while ( !dialog.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
return result;
}
public void openManager() {
super.createDialog( MANAGER_TITLE, getRepoURL( MANAGER_WEB_CLIENT_PATH ), OPTIONS, LOGO );
open();
}
public void openCreation() {
super.createDialog( CREATION_TITLE, getRepoURL( CREATION_WEB_CLIENT_PATH ), OPTIONS, LOGO );
open();
}
public boolean openRelogin( RepositoryMeta repositoryMeta, String errorMessage ) {
super.createDialog( LOGIN_TITLE, getRepoURL( LOGIN_WEB_CLIENT_PATH ), OPTIONS, LOGO );
return open( repositoryMeta, true, errorMessage );
}
public boolean openLogin( RepositoryMeta repositoryMeta ) {
super.createDialog( LOGIN_TITLE, getRepoURL( LOGIN_WEB_CLIENT_PATH ), OPTIONS, LOGO );
return open( repositoryMeta );
}
private void setResult( boolean result ) {
this.result = result;
}
private static Integer getOsgiServicePort() {
// if no service port is specified try getting it from
ServerPort osgiServicePort = ServerPortRegistry.getPort( OSGI_SERVICE_PORT );
if ( osgiServicePort != null ) {
return osgiServicePort.getAssignedPort();
}
return null;
}
private static String getRepoURL( String path ) {
return "http://localhost:" + getOsgiServicePort() + path;
}
}