/*!
* 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 org.pentaho.di.ui.repository.pur;
import java.util.Enumeration;
import java.util.ResourceBundle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.gui.SpoonFactory;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.RepositoriesMeta;
import org.pentaho.di.repository.RepositoryMeta;
import org.pentaho.di.repository.pur.PurRepositoryMeta;
import org.pentaho.di.ui.repository.dialog.RepositoryDialogInterface;
import org.pentaho.di.ui.repository.pur.controller.RepositoryConfigController;
import org.pentaho.ui.xul.XulDomContainer;
import org.pentaho.ui.xul.XulException;
import org.pentaho.ui.xul.XulRunner;
import org.pentaho.ui.xul.components.XulMessageBox;
import org.pentaho.ui.xul.containers.XulDialog;
import org.pentaho.ui.xul.swt.SwtXulLoader;
import org.pentaho.ui.xul.swt.SwtXulRunner;
public class PurRepositoryDialog implements RepositoryDialogInterface, java.io.Serializable {
private static final long serialVersionUID = -4642068735574655692L; /* EESOURCE: UPDATE SERIALVERUID */
protected RepositoryMeta repositoryMeta;
protected RepositoriesMeta repositoriesMeta;
protected RepositoriesMeta masterRepositoriesMeta;
protected String masterRepositoryName;
protected Shell parent;
protected int style;
private static final Class<?> PKG = PurRepositoryDialog.class;
private static Log log = LogFactory.getLog( PurRepositoryDialog.class );
private RepositoryConfigController repositoryConfigController = new RepositoryConfigController();
private XulDomContainer container;
private ResourceBundle resourceBundle = new ResourceBundle() {
@Override
public Enumeration<String> getKeys() {
return null;
}
@Override
protected Object handleGetObject( String key ) {
return BaseMessages.getString( PKG, key );
}
};
public PurRepositoryDialog( Shell parent, int style, RepositoryMeta repositoryMeta, RepositoriesMeta repositoriesMeta ) {
this.parent = parent;
this.repositoriesMeta = repositoriesMeta;
this.repositoryMeta = repositoryMeta;
this.style = style;
this.masterRepositoriesMeta = repositoriesMeta.clone();
this.masterRepositoryName = repositoryMeta.getName();
}
public RepositoryMeta open( final MODE mode ) {
try {
SwtXulLoader swtLoader = new SwtXulLoader();
swtLoader.setOuterContext( parent );
swtLoader.registerClassLoader( getClass().getClassLoader() );
container =
swtLoader.loadXul( "org/pentaho/di/ui/repository/pur/xul/pur-repository-config-dialog.xul", resourceBundle ); //$NON-NLS-1$
final XulRunner runner = new SwtXulRunner();
runner.addContainer( container );
parent.addDisposeListener( new DisposeListener() {
public void widgetDisposed( DisposeEvent arg0 ) {
hide();
}
} );
repositoryConfigController.setMessages( resourceBundle );
repositoryConfigController.setRepositoryMeta( repositoryMeta );
repositoryConfigController.setCallback( new IRepositoryConfigDialogCallback() {
public void onSuccess( PurRepositoryMeta meta ) {
// If repository does not have a name then send back a null repository meta
if ( meta.getName() != null ) {
// If MODE is ADD then check if the repository name does not exist in the repository list then close this
// dialog
// If MODE is EDIT then check if the repository name is the same as before if not check if the new name does
// not exist in the repository. Otherwise return true to this method, which will mean that repository
// already exist
if ( mode == MODE.ADD ) {
if ( masterRepositoriesMeta.searchRepository( meta.getName() ) == null ) {
repositoryMeta = meta;
hide();
} else {
displayRepositoryAlreadyExistMessage( meta.getName() );
}
} else {
if ( masterRepositoryName.equals( meta.getName() ) ) {
repositoryMeta = meta;
hide();
} else if ( masterRepositoriesMeta.searchRepository( meta.getName() ) == null ) {
repositoryMeta = meta;
hide();
} else {
displayRepositoryAlreadyExistMessage( meta.getName() );
}
}
}
}
public void onError( Throwable t ) {
SpoonFactory.getInstance().messageBox( t.getLocalizedMessage(),
resourceBundle.getString( "RepositoryConfigDialog.InitializationFailed" ), false, Const.ERROR ); //$NON-NLS-1$
log.error( resourceBundle.getString( "RepositoryConfigDialog.ErrorStartingXulApplication" ), t );//$NON-NLS-1$
}
public void onCancel() {
repositoryMeta = null;
hide();
}
} );
container.addEventHandler( repositoryConfigController );
try {
runner.initialize();
show();
} catch ( XulException e ) {
SpoonFactory.getInstance().messageBox( e.getLocalizedMessage(),
resourceBundle.getString( "RepositoryConfigDialog.InitializationFailed" ), false, Const.ERROR ); //$NON-NLS-1$
log.error( resourceBundle.getString( "RepositoryConfigDialog.ErrorStartingXulApplication" ), e );//$NON-NLS-1$
}
} catch ( XulException e ) {
log.error( resourceBundle.getString( "RepositoryConfigDialog.ErrorStartingXulApplication" ), e );//$NON-NLS-1$
}
return repositoryMeta;
}
public Composite getDialogArea() {
XulDialog dialog = (XulDialog) container.getDocumentRoot().getElementById( "repository-config-dialog" ); //$NON-NLS-1$
return (Composite) dialog.getManagedObject();
}
public void show() {
XulDialog dialog = (XulDialog) container.getDocumentRoot().getElementById( "repository-config-dialog" ); //$NON-NLS-1$
dialog.show();
}
public void hide() {
XulDialog dialog = (XulDialog) container.getDocumentRoot().getElementById( "repository-config-dialog" ); //$NON-NLS-1$
dialog.hide();
}
public Shell getShell() {
XulDialog dialog = (XulDialog) container.getDocumentRoot().getElementById( "repository-config-dialog" ); //$NON-NLS-1$
return (Shell) dialog.getRootObject();
}
private void displayRepositoryAlreadyExistMessage( String name ) {
try {
XulMessageBox messageBox = (XulMessageBox) container.getDocumentRoot().createElement( "messagebox" );
messageBox.setTitle( resourceBundle.getString( "Dialog.Error" ) );//$NON-NLS-1$
messageBox.setAcceptLabel( resourceBundle.getString( "Dialog.Ok" ) );//$NON-NLS-1$
messageBox.setMessage( BaseMessages.getString( PKG, "PurRepositoryDialog.Dialog.ErrorIdExist.Message", name ) );//$NON-NLS-1$
messageBox.open();
} catch ( XulException e ) {
throw new RuntimeException( e );
}
}
}