// CHECKSTYLE:FileLength:OFF
/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 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.dialog;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.pentaho.di.cluster.ClusterSchema;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.core.plugins.PluginInterface;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.RepositoryPluginType;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.partition.PartitionSchema;
import org.pentaho.di.repository.IUser;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryCapabilities;
import org.pentaho.di.repository.RepositoryDirectory;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.RepositoryElementInterface;
import org.pentaho.di.repository.RepositoryElementMetaInterface;
import org.pentaho.di.repository.RepositoryMeta;
import org.pentaho.di.repository.RepositoryObjectType;
import org.pentaho.di.repository.RepositorySecurityManager;
import org.pentaho.di.repository.RepositorySecurityProvider;
import org.pentaho.di.repository.UserInfo;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.ui.cluster.dialog.ClusterSchemaDialog;
import org.pentaho.di.ui.cluster.dialog.SlaveServerDialog;
import org.pentaho.di.ui.core.ConstUI;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.database.dialog.DatabaseDialog;
import org.pentaho.di.ui.core.dialog.EnterStringDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.gui.WindowProperty;
import org.pentaho.di.ui.core.widget.DoubleClickInterface;
import org.pentaho.di.ui.core.widget.TreeItemAccelerator;
import org.pentaho.di.ui.core.widget.TreeMemory;
import org.pentaho.di.ui.partition.dialog.PartitionSchemaDialog;
import org.pentaho.di.ui.repository.RepositoryDirectoryUI;
import org.pentaho.di.ui.repository.RepositorySecurityUI;
import org.pentaho.di.ui.spoon.Spoon;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
import org.w3c.dom.Document;
/**
* This dialog displays the content of the repository in a Windows explorer like fashion. The user can manipulate the
* objects in the repository as well as administer users, profiles, etc.
*
* @author Matt
* @since 18-mei-2003
*
*/
public class RepositoryExplorerDialog extends Dialog {
private static Class<?> PKG = RepositoryExplorerDialog.class; // for i18n purposes, needed by Translator2!!
private static final String REPOSITORY_PKG = "org.pentaho.di.ui.repository";
public interface RepositoryExplorerCallback {
/**
* request that specified object be opened in 'Spoon' display
*
* @param object
* @return boolean indicating if repository explorer dialog should close
*/
boolean open( RepositoryObjectReference object );
}
/**
* capture a reference to an object in the repository
*
* @author jgoldman
*
*/
public class RepositoryObjectReference {
private RepositoryObjectType type; // Type of object
private RepositoryDirectoryInterface directory; // The directory to which it belongs.
private String name; // name of object being referenced
private String versionLabel; // the version to be loaded
public RepositoryObjectReference( RepositoryObjectType type, RepositoryDirectoryInterface dir, String name ) {
this( type, dir, name, null );
}
public RepositoryObjectReference( RepositoryObjectType type, RepositoryDirectoryInterface dir, String name,
String versionLabel ) {
this.type = type;
this.directory = dir;
this.name = name;
this.versionLabel = versionLabel;
}
public RepositoryDirectoryInterface getDirectory() {
return directory;
}
public String getName() {
return name;
}
public RepositoryObjectType getType() {
return type;
}
public String getVersionLabel() {
return versionLabel;
}
}
private static final String STRING_DATABASES = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Connections" );
private static final String STRING_PARTITIONS = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Partitions" );
private static final String STRING_SLAVES = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Slaves" );
private static final String STRING_CLUSTERS = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Clusters" );
public static final String STRING_TRANSFORMATIONS = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Transformations" );
public static final String STRING_JOBS = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Jobs" );
private static final String STRING_USERS = BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Tree.String.Users" );
private static final int ITEM_CATEGORY_NONE = 0;
private static final int ITEM_CATEGORY_ROOT = 1;
private static final int ITEM_CATEGORY_DATABASES_ROOT = 2;
private static final int ITEM_CATEGORY_DATABASE = 3;
private static final int ITEM_CATEGORY_TRANSFORMATIONS_ROOT = 4;
private static final int ITEM_CATEGORY_TRANSFORMATION = 5;
private static final int ITEM_CATEGORY_TRANSFORMATION_DIRECTORY = 6;
private static final int ITEM_CATEGORY_JOBS_ROOT = 7;
private static final int ITEM_CATEGORY_JOB = 8;
private static final int ITEM_CATEGORY_JOB_DIRECTORY = 9;
private static final int ITEM_CATEGORY_USERS_ROOT = 10;
private static final int ITEM_CATEGORY_USER = 11;
private static final int ITEM_CATEGORY_PARTITIONS_ROOT = 14;
private static final int ITEM_CATEGORY_PARTITION = 15;
private static final int ITEM_CATEGORY_SLAVES_ROOT = 16;
private static final int ITEM_CATEGORY_SLAVE = 17;
private static final int ITEM_CATEGORY_CLUSTERS_ROOT = 18;
private static final int ITEM_CATEGORY_CLUSTER = 19;
private Shell shell;
private Tree wTree;
private Button wOK;
private LogChannelInterface log;
private PropsUI props;
private Repository rep;
private String debug;
private int sortColumn;
private boolean ascending;
private TreeColumn nameColumn;
private TreeColumn typeColumn;
private TreeColumn userColumn;
private TreeColumn changedColumn;
private TreeColumn descriptionColumn;
private TreeColumn lockColumn;
private RepositoryExplorerCallback callback;
private RepositoryObjectReference lastOpened;
private VariableSpace variableSpace;
private ToolItem exportToXML, importFromXML, showHideDeleted, expandAll, collapseAll;
private FormData fdTreeTb;
private RepositoryDirectoryInterface directoryTree;
private RepositoryMeta repositoryMeta;
private RepositoryCapabilities capabilities;
private boolean readonly;
private RepositorySecurityProvider securityProvider;
private RepositorySecurityManager securityManager;
private boolean includeDeleted;
private Map<String, RepositoryElementMetaInterface> objectMap;
DatabaseDialog databaseDialog;
private RepositoryExplorerDialog( Shell par, int style, Repository rep, VariableSpace variableSpace ) {
super( par, style );
this.props = PropsUI.getInstance();
this.rep = rep;
this.log = rep.getLog();
this.variableSpace = variableSpace;
sortColumn = 0;
ascending = false;
objectMap = new HashMap<String, RepositoryElementMetaInterface>();
repositoryMeta = rep.getRepositoryMeta();
capabilities = repositoryMeta.getRepositoryCapabilities();
securityProvider = rep.getSecurityProvider();
securityManager = rep.getSecurityManager();
readonly = securityProvider.isReadOnly();
includeDeleted = false;
}
public RepositoryExplorerDialog( Shell par, int style, Repository rep, RepositoryExplorerCallback callback,
VariableSpace variableSpace ) {
this( par, style, rep, variableSpace );
this.callback = callback;
}
private static final String STRING_REPOSITORY_EXPLORER_TREE_NAME = "Repository Exporer Tree Name";
private DatabaseDialog getDatabaseDialog() {
if ( databaseDialog != null ) {
return databaseDialog;
}
databaseDialog = new DatabaseDialog( shell );
return databaseDialog;
}
public RepositoryObjectReference open() {
debug = "opening repository explorer";
try {
debug = "open new independent shell";
Shell parent = getParent();
Display display = parent.getDisplay();
shell = new Shell( display, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
props.setLook( shell );
shell.setImage( GUIResource.getInstance().getImageFolderConnections() );
shell.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Title" ) + rep.getName() + "]" );
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout( formLayout );
// Add a small toolbar to expand/collapse all items
//
ToolBar treeTb = new ToolBar( shell, SWT.HORIZONTAL | SWT.FLAT );
props.setLook( treeTb );
fdTreeTb = new FormData();
fdTreeTb.left = new FormAttachment( 0, 0 );
fdTreeTb.top = new FormAttachment( 0, 0 );
treeTb.setLayoutData( fdTreeTb );
// Add the items...
//
exportToXML = new ToolItem( treeTb, SWT.PUSH );
exportToXML.setImage( GUIResource.getInstance().getImageExport() );
exportToXML.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.ToolItem.ExportToXML.Label" ) );
exportToXML.setToolTipText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.ExportToXML.Tooltip" ) );
importFromXML = new ToolItem( treeTb, SWT.PUSH );
importFromXML.setImage( GUIResource.getInstance().getImageImport() );
importFromXML
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.ToolItem.ImportFromXML.Label" ) );
importFromXML.setToolTipText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.ImportFromXML.Tooltip" ) );
new ToolItem( treeTb, SWT.SEPARATOR );
showHideDeleted = new ToolItem( treeTb, SWT.PUSH );
showHideDeleted.setImage( GUIResource.getInstance().getImageShowDeleted() );
showHideDeleted
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.ToolItem.ShowDeleted.Label" ) );
showHideDeleted.setToolTipText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.ShowDeleted.Tooltip" ) );
showHideDeleted.setEnabled( rep.getRepositoryMeta().getRepositoryCapabilities().supportsRevisions() );
new ToolItem( treeTb, SWT.SEPARATOR );
expandAll = new ToolItem( treeTb, SWT.PUSH );
expandAll.setImage( GUIResource.getInstance().getImageExpandAll() );
expandAll.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.ToolItem.ExpandAll.Label" ) );
expandAll.setToolTipText( BaseMessages
.getString( PKG, "RepositoryExplorerDialog.ToolItem.ExpandAll.Tooltip" ) );
collapseAll = new ToolItem( treeTb, SWT.PUSH );
collapseAll.setImage( GUIResource.getInstance().getImageCollapseAll() );
collapseAll.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.ToolItem.CollapseAll.Label" ) );
collapseAll.setToolTipText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.CollapseAll.Tooltip" ) );
// Tree
wTree = new Tree( shell, SWT.MULTI | SWT.BORDER );
wTree.setHeaderVisible( true );
props.setLook( wTree );
// Add some columns to it as well...
nameColumn = new TreeColumn( wTree, SWT.LEFT );
nameColumn.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Column.Name" ) );
nameColumn.setWidth( 350 );
nameColumn.setAlignment( 10 );
nameColumn.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
setSort( 0 );
}
} );
// No sorting on the type column just yet.
typeColumn = new TreeColumn( wTree, SWT.LEFT );
typeColumn.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Column.Type" ) );
typeColumn.setWidth( 100 );
typeColumn.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
setSort( 1 );
}
} );
userColumn = new TreeColumn( wTree, SWT.LEFT );
userColumn.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Column.User" ) );
userColumn.setWidth( 100 );
userColumn.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
setSort( 2 );
}
} );
changedColumn = new TreeColumn( wTree, SWT.LEFT );
changedColumn.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Column.Changed" ) );
changedColumn.setWidth( 120 );
changedColumn.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
setSort( 3 );
}
} );
descriptionColumn = new TreeColumn( wTree, SWT.LEFT );
descriptionColumn.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Column.Description" ) );
descriptionColumn.setWidth( 120 );
descriptionColumn.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
setSort( 4 );
}
} );
lockColumn = new TreeColumn( wTree, SWT.LEFT );
lockColumn.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Column.LockMessage" ) );
lockColumn.setWidth( 120 );
lockColumn.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
setSort( 5 );
}
} );
// Add a memory to the tree.
TreeMemory.addTreeListener( wTree, STRING_REPOSITORY_EXPLORER_TREE_NAME );
// Buttons
wOK = new Button( shell, SWT.PUSH );
wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) );
FormData fdTree = new FormData();
int margin = 10;
fdTree.left = new FormAttachment( 0, 0 ); // To the right of the label
fdTree.top = new FormAttachment( treeTb, 0 );
fdTree.right = new FormAttachment( 100, 0 );
fdTree.bottom = new FormAttachment( 100, -50 );
wTree.setLayoutData( fdTree );
BaseStepDialog.positionBottomButtons( shell, new Button[] { wOK, }, margin, null );
// Add listeners
wOK.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event e ) {
close();
}
} );
wTree.addMenuDetectListener( new MenuDetectListener() {
@Override
public void menuDetected( MenuDetectEvent e ) {
setTreeMenu();
}
} );
wTree.addMouseListener( new MouseAdapter() {
@Override
public void mouseDoubleClick( MouseEvent e ) {
if ( e.button == 1 ) { // left double click!
doDoubleClick();
}
}
} );
wTree.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// F2 --> rename...
if ( e.keyCode == SWT.F2 ) {
if ( !readonly ) {
renameInTree();
}
}
// F5 --> refresh...
if ( e.keyCode == SWT.F5 ) {
refreshTree();
}
}
} );
expandAll.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
expandAllItems( wTree.getItems(), true );
}
} );
collapseAll.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
expandAllItems( wTree.getItems(), false );
}
} );
importFromXML.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
importAll();
}
} );
exportToXML.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
exportAll( null );
}
} );
showHideDeleted.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
includeDeleted = !includeDeleted;
if ( includeDeleted ) {
showHideDeleted.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.HideDeleted.Label" ) );
showHideDeleted.setToolTipText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.HideDeleted.Tooltip" ) );
} else {
showHideDeleted.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.ShowDeleted.Label" ) );
showHideDeleted.setToolTipText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.ToolItem.ShowDeleted.Tooltip" ) );
}
refreshTree();
}
} );
// Drag & Drop
Transfer[] ttypes = new Transfer[] { TextTransfer.getInstance() };
DragSource ddSource = new DragSource( wTree, DND.DROP_MOVE );
ddSource.setTransfer( ttypes );
ddSource.addDragListener( new DragSourceListener() {
@Override
public void dragStart( DragSourceEvent event ) {
debug = "drag start";
event.doit = true;
}
@Override
public void dragSetData( DragSourceEvent event ) {
debug = "drag set data";
event.data = "";
event.doit = false;
TreeItem[] ti = wTree.getSelection();
if ( ti.length >= 1 ) {
int cat = getItemCategory( ti[0] );
//
// Drag around a transformation...
//
if ( cat == ITEM_CATEGORY_TRANSFORMATION ) {
debug = "drag set: drag around transformation";
RepositoryDirectoryInterface repdir = getDirectory( ti[0] );
if ( repdir != null ) {
//
// Pass info as a piece of XML
//
String xml = XMLHandler.getXMLHeader();
xml += "<dragdrop>" + Const.CR;
xml += " " + XMLHandler.addTagValue( "directory", repdir.getPath() );
xml += " " + XMLHandler.addTagValue( "transformation", ti[0].getText() );
xml += "</dragdrop>" + Const.CR;
event.data = xml;
event.doit = true;
}
} else if ( cat == ITEM_CATEGORY_JOB ) {
debug = "drag set: drag around job";
RepositoryDirectoryInterface repdir = getDirectory( ti[0] );
if ( repdir != null ) {
//
// Pass info as a piece of XML
//
String xml = XMLHandler.getXMLHeader();
xml += "<dragdrop>" + Const.CR;
xml += " " + XMLHandler.addTagValue( "directory", repdir.getPath() );
xml += " " + XMLHandler.addTagValue( "job", ti[0].getText() );
xml += "</dragdrop>" + Const.CR;
event.data = xml;
event.doit = true;
}
} else {
debug = "do nothing";
String xml = XMLHandler.getXMLHeader();
xml += "<dragdrop>" + Const.CR;
xml += "</dragdrop>" + Const.CR;
event.data = xml;
event.doit = true;
}
}
}
@Override
public void dragFinished( DragSourceEvent event ) {
}
} );
DropTarget ddTarget = new DropTarget( wTree, DND.DROP_MOVE );
ddTarget.setTransfer( ttypes );
ddTarget.addDropListener( new DropTargetListener() {
@Override
public void dragEnter( DropTargetEvent event ) {
}
@Override
public void dragLeave( DropTargetEvent event ) {
debug = "drag leave";
}
@Override
public void dragOperationChanged( DropTargetEvent event ) {
}
@Override
public void dragOver( DropTargetEvent event ) {
debug = "drag over";
}
@Override
public void drop( DropTargetEvent event ) {
try {
debug = "Drop item in tree";
if ( event.data == null ) { // no data to copy, indicate failure in event.detail
event.detail = DND.DROP_NONE;
return;
}
// event.feedback = DND.FEEDBACK_NONE;
TreeItem ti = (TreeItem) event.item;
if ( ti != null ) {
debug = "Get category";
int category = getItemCategory( ti );
if ( category == ITEM_CATEGORY_TRANSFORMATION_DIRECTORY || category == ITEM_CATEGORY_TRANSFORMATION ) {
debug = "Get directory";
RepositoryDirectoryInterface repdir = getDirectory( ti );
if ( repdir != null ) {
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if ( moveTransformation( (String) event.data, repdir ) ) {
refreshTree();
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_INFORMATION | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Trans.Move.UnableToMove.Message" ) );
mb.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Trans.Move.UnableToMove.Title" ) );
mb.open();
}
}
} else if ( category == ITEM_CATEGORY_JOB_DIRECTORY || category == ITEM_CATEGORY_JOB ) {
debug = "Get directory";
RepositoryDirectoryInterface repdir = getDirectory( ti );
if ( repdir != null ) {
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if ( moveJob( (String) event.data, repdir ) ) {
refreshTree();
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_INFORMATION | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Job.Move.UnableToMove.Message" ) );
mb.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Job.Move.UnableToMove.Title" ) );
mb.open();
}
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_INFORMATION | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Trans.Move.SorryOneItemAtATime.Message" ) );
mb.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Trans.Move.SorryOneItemAtATime.Title" ) );
mb.open();
}
}
} catch ( Throwable e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Drop.UnexpectedError.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Drop.UnexpectedError.Message1" )
+ debug
+ "]"
+ Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Drop.UnexpectedError.Message2" ), e );
}
}
@Override
public void dropAccept( DropTargetEvent event ) {
debug = "drop accept";
}
} );
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener( new ShellAdapter() {
@Override
public void shellClosed( ShellEvent e ) {
close();
}
} );
debug = "set screen size and position";
BaseStepDialog.setSize( shell, 400, 480, true );
setSort( 0 ); // refreshes too.
shell.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
} catch ( Throwable e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Main.UnexpectedError.Title" ), BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Main.UnexpectedError.Message1" )
+ debug
+ "]"
+ Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Main.UnexpectedError.Message2" )
+ Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Main.UnexpectedError.Message3" ), e );
}
return lastOpened;
}
private void expandAllItems( TreeItem[] treeitems, boolean expand ) {
for ( TreeItem item : treeitems ) {
item.setExpanded( expand );
TreeMemory.getInstance().storeExpanded(
STRING_REPOSITORY_EXPLORER_TREE_NAME, ConstUI.getTreeStrings( item ), expand );
if ( item.getItemCount() > 0 ) {
expandAllItems( item.getItems(), expand );
}
}
}
protected void setSort( int i ) {
if ( sortColumn == i ) {
ascending = !ascending;
} else {
sortColumn = i;
ascending = true;
}
if ( sortColumn >= 0 && sortColumn < 5 ) {
TreeColumn column = wTree.getColumn( sortColumn );
wTree.setSortColumn( column );
wTree.setSortDirection( ascending ? SWT.UP : SWT.DOWN );
}
refreshTree();
}
public RepositoryDirectoryInterface getDirectory( TreeItem ti ) {
RepositoryDirectoryInterface repdir = null;
int level = ConstUI.getTreeLevel( ti );
String[] path = ConstUI.getTreeStrings( ti );
if ( level > 1 ) {
int cat = getItemCategory( ti );
String[] realpath;
switch ( cat ) {
case ITEM_CATEGORY_JOB:
case ITEM_CATEGORY_TRANSFORMATION:
// The first 3 levels of text[] don't belong to the path to this transformation!
realpath = new String[level - 2];
for ( int i = 0; i < realpath.length; i++ ) {
realpath[i] = path[i + 2];
}
repdir = directoryTree.findDirectory( realpath );
break;
case ITEM_CATEGORY_JOB_DIRECTORY:
case ITEM_CATEGORY_TRANSFORMATION_DIRECTORY:
// The first 3 levels of text[] don't belong to the path to this transformation!
realpath = new String[level - 1];
for ( int i = 0; i < realpath.length; i++ ) {
realpath[i] = path[i + 2];
}
repdir = directoryTree.findDirectory( realpath );
break;
default:
break;
}
}
return repdir;
}
public boolean sameCategory( TreeItem[] tisel ) {
if ( tisel.length == 0 ) {
return false;
}
int cat = getItemCategory( tisel[0] );
for ( int i = 1; i < tisel.length; i++ ) {
if ( cat != getItemCategory( tisel[i] ) ) {
return false;
}
}
return true;
}
public void doDoubleClick() {
final TreeItem[] tisel = wTree.getSelection();
if ( tisel.length == 1 || sameCategory( tisel ) ) {
final TreeItem ti = tisel[0];
final int level = ConstUI.getTreeLevel( ti );
int cat = getItemCategory( ti );
if ( ( level >= 2 )
&& ( ( cat == ITEM_CATEGORY_JOB_DIRECTORY )
|| ( cat == ITEM_CATEGORY_TRANSFORMATION_DIRECTORY )
|| ( cat == ITEM_CATEGORY_JOB )
|| ( cat == ITEM_CATEGORY_TRANSFORMATION ) ) ) {
String[] realpath;
if ( ( cat == ITEM_CATEGORY_JOB_DIRECTORY ) || ( cat == ITEM_CATEGORY_TRANSFORMATION_DIRECTORY ) ) {
// The first levels of path[] don't belong to the path to this directory!
realpath = new String[level - 1];
} else {
// The first 3 levels of path[] don't belong to the path to this transformation or Job!
realpath = new String[level - 2];
}
final String[] path = ConstUI.getTreeStrings( ti );
for ( int i = 0; i < realpath.length; i++ ) {
realpath[i] = path[i + 2];
}
// Find the directory in the directory tree...
final RepositoryDirectoryInterface repdir = directoryTree.findDirectory( realpath );
switch ( cat ) {
case ITEM_CATEGORY_JOB_DIRECTORY:
case ITEM_CATEGORY_TRANSFORMATION_DIRECTORY: {
if ( !readonly ) {
createDirectory( ti, repdir );
}
break;
}
case ITEM_CATEGORY_TRANSFORMATION: {
openTransformation( ti.getText(), repdir );
break;
}
case ITEM_CATEGORY_JOB: {
openJob( ti.getText(), repdir );
break;
}
default:
}
}
}
}
public void setTreeMenu() {
Menu mTree = new Menu( shell, SWT.POP_UP );
final TreeItem[] tisel = wTree.getSelection();
if ( tisel.length == 1 || sameCategory( tisel ) ) {
final TreeItem ti = tisel[0];
final int level = ConstUI.getTreeLevel( ti );
final String[] path = ConstUI.getTreeStrings( ti );
final String fullPath = ConstUI.getTreePath( ti, 0 );
final String item = ti.getText();
final RepositoryElementMetaInterface repositoryObject = objectMap.get( fullPath );
int cat = getItemCategory( ti );
switch ( cat ) {
case ITEM_CATEGORY_ROOT:
// Export all
MenuItem miExp = new MenuItem( mTree, SWT.PUSH );
miExp.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ExportAll" ) );
SelectionAdapter lsExp = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
exportAll( directoryTree );
}
};
miExp.addSelectionListener( lsExp );
// Import all
MenuItem miImp = new MenuItem( mTree, SWT.PUSH );
miImp.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ImportAll" ) );
SelectionAdapter lsImp = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
importAll();
}
};
miImp.addSelectionListener( lsImp );
miImp.setEnabled( !readonly );
// Export transMeta
MenuItem miTrans = new MenuItem( mTree, SWT.PUSH );
miTrans
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ExportTrans" ) );
SelectionAdapter lsTrans = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
exportTransformations( directoryTree );
}
};
miTrans.addSelectionListener( lsTrans );
// Export jobs
MenuItem miJobs = new MenuItem( mTree, SWT.PUSH );
miJobs.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ExportJob" ) );
SelectionAdapter lsJobs = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
exportJobs( directoryTree );
}
};
miJobs.addSelectionListener( lsJobs );
break;
case ITEM_CATEGORY_DATABASES_ROOT:
// New database
MenuItem miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.ConnectionsRoot.New" ) );
SelectionAdapter lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newDatabase();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
break;
case ITEM_CATEGORY_DATABASE:
// New database
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Connections.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newDatabase();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
// Edit database info
MenuItem miEdit = new MenuItem( mTree, SWT.PUSH );
miEdit.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Connections.Edit" ) );
SelectionAdapter lsEdit = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
editDatabase( item );
}
};
miEdit.addSelectionListener( lsEdit );
miEdit.setEnabled( !readonly );
// Delete database info
MenuItem miDel = new MenuItem( mTree, SWT.PUSH );
miDel.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Connections.Delete" ) );
SelectionAdapter lsDel = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delDatabase( item );
}
};
miDel.addSelectionListener( lsDel );
miDel.setEnabled( !readonly );
break;
case ITEM_CATEGORY_SLAVES_ROOT:
// New slave
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Slave.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newSlaveServer();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
break;
case ITEM_CATEGORY_SLAVE:
// New slave
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Slave.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newSlaveServer();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
// Edit slave
miEdit = new MenuItem( mTree, SWT.PUSH );
miEdit.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Slave.Edit" ) );
lsEdit = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
editSlaveServer( item );
}
};
miEdit.addSelectionListener( lsEdit );
miEdit.setEnabled( !readonly );
// Delete slave
miDel = new MenuItem( mTree, SWT.PUSH );
miDel.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Slave.Delete" ) );
lsDel = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delSlaveServer( item );
}
};
miDel.addSelectionListener( lsDel );
miDel.setEnabled( !readonly );
break;
case ITEM_CATEGORY_PARTITIONS_ROOT:
// New partition schema
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.PartitionSchema.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newPartitionSchema();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
break;
case ITEM_CATEGORY_PARTITION:
// New partition schema
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.PartitionSchema.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newPartitionSchema();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
// Edit partition schema
miEdit = new MenuItem( mTree, SWT.PUSH );
miEdit
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.PartitionSchema.Edit" ) );
lsEdit = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
editPartitionSchema( item );
}
};
miEdit.addSelectionListener( lsEdit );
miEdit.setEnabled( !readonly );
// Delete partition schema
miDel = new MenuItem( mTree, SWT.PUSH );
miDel
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.PartitionSchema.Delete" ) );
lsDel = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delPartitionSchema( item );
}
};
miDel.addSelectionListener( lsDel );
miDel.setEnabled( !readonly );
break;
case ITEM_CATEGORY_CLUSTERS_ROOT:
// New cluster
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Cluster.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newCluster();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
break;
case ITEM_CATEGORY_CLUSTER:
// New cluster
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Cluster.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newCluster();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
// Edit cluster
miEdit = new MenuItem( mTree, SWT.PUSH );
miEdit.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Cluster.Edit" ) );
lsEdit = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
editCluster( item );
}
};
miEdit.addSelectionListener( lsEdit );
miEdit.setEnabled( !readonly );
// Delete cluster
miDel = new MenuItem( mTree, SWT.PUSH );
miDel.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Cluster.Delete" ) );
lsDel = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delCluster( item );
}
};
miDel.addSelectionListener( lsDel );
miDel.setEnabled( !readonly );
break;
case ITEM_CATEGORY_TRANSFORMATIONS_ROOT:
break;
case ITEM_CATEGORY_TRANSFORMATION:
if ( level >= 2 && repositoryObject != null ) {
final RepositoryDirectoryInterface repdir = repositoryObject.getRepositoryDirectory();
if ( tisel.length == 1 ) {
if ( !repositoryObject.isDeleted() ) {
// Open transformation...
MenuItem miOpen = new MenuItem( mTree, SWT.PUSH );
miOpen.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.Transformations.Open" ) );
miOpen.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
openTransformation( item, repdir );
}
} );
// Rename transformation
MenuItem miRen = new MenuItem( mTree, SWT.PUSH );
miRen.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.Transformations.Rename" ) );
miRen.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
renameTransformation( item, repdir );
}
} );
miRen.setEnabled( !readonly );
}
}
if ( repositoryObject.isDeleted() ) {
if ( capabilities.supportsRevisions() ) {
// Restore transformation
MenuItem miRestore = new MenuItem( mTree, SWT.PUSH );
miRestore.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.Transformations.Restore" ) );
miRestore.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
restoreSelectedObjects();
}
} );
}
} else {
// Delete transformation
miDel = new MenuItem( mTree, SWT.PUSH );
miDel.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.Transformations.Delete" ) );
miDel.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delSelectedObjects();
}
} );
miDel.setEnabled( !readonly );
}
}
break;
case ITEM_CATEGORY_JOB_DIRECTORY:
case ITEM_CATEGORY_TRANSFORMATION_DIRECTORY:
if ( level >= 2 ) {
// The first levels of path[] don't belong to the path to this directory!
String[] realpath = new String[level - 1];
for ( int i = 0; i < realpath.length; i++ ) {
realpath[i] = path[i + 2];
}
// Find the directory in the directory tree...
final RepositoryDirectoryInterface repdir = directoryTree.findDirectory( realpath );
// Export xforms and jobs from directory
miExp = new MenuItem( mTree, SWT.PUSH );
miExp.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ExportAll" ) );
lsExp = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
exportAll( repdir );
}
};
miExp.addSelectionListener( lsExp );
miExp.setEnabled( !readonly );
if ( cat == ITEM_CATEGORY_TRANSFORMATION_DIRECTORY ) {
// Export transMeta
miTrans = new MenuItem( mTree, SWT.PUSH );
miTrans.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ExportTrans" ) );
lsTrans = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
exportTransformations( repdir );
}
};
miTrans.addSelectionListener( lsTrans );
}
if ( cat == ITEM_CATEGORY_JOB_DIRECTORY ) {
// Export jobs
miJobs = new MenuItem( mTree, SWT.PUSH );
miJobs
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Objects.ExportJob" ) );
lsJobs = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
exportJobs( repdir );
}
};
miJobs.addSelectionListener( lsJobs );
}
// create directory...
MenuItem miCreate = new MenuItem( mTree, SWT.PUSH );
miCreate.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.TransDirectory.Create" ) );
miCreate.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
createDirectory( ti, repdir );
}
} );
if ( level > 2 ) { // Can't rename or delete root directory...
// Rename directory
MenuItem miRename = new MenuItem( mTree, SWT.PUSH );
miRename.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.TransDirectory.Rename" ) );
miRename.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
renameDirectory( ti, repdir );
}
} );
// Delete directory
MenuItem miDelete = new MenuItem( mTree, SWT.PUSH );
miDelete.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PopupMenu.TransDirectory.Delete" ) );
miDelete.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delDirectory( ti, repdir );
}
} );
}
}
break;
case ITEM_CATEGORY_JOBS_ROOT:
break;
case ITEM_CATEGORY_JOB:
if ( level >= 2 && repositoryObject != null ) {
final RepositoryDirectoryInterface repdir = repositoryObject.getRepositoryDirectory();
if ( tisel.length == 1 ) {
if ( !repositoryObject.isDeleted() ) {
// Open job...
MenuItem miOpen = new MenuItem( mTree, SWT.PUSH );
miOpen.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Jobs.Open" ) );
miOpen.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
openJob( item, repdir );
}
} );
// Rename job
MenuItem miRen = new MenuItem( mTree, SWT.PUSH );
miRen.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Jobs.Rename" ) );
miRen.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
renameJob( ti, item, repdir );
}
} );
miRen.setEnabled( !readonly );
}
}
if ( repositoryObject.isDeleted() ) {
if ( capabilities.supportsRevisions() ) {
// Restore job
MenuItem miRestore = new MenuItem( mTree, SWT.PUSH );
miRestore
.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Jobs.Restore" ) );
miRestore.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
restoreSelectedObjects();
}
} );
}
} else {
// Delete job
miDel = new MenuItem( mTree, SWT.PUSH );
miDel.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Jobs.Delete" ) );
miDel.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delSelectedObjects();
}
} );
miDel.setEnabled( !readonly );
}
}
break;
case ITEM_CATEGORY_USERS_ROOT:
mTree = new Menu( shell, SWT.POP_UP );
// New user
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.UsersRoot.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newUser();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
break;
case ITEM_CATEGORY_USER:
// New user
miNew = new MenuItem( mTree, SWT.PUSH );
miNew.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Users.New" ) );
lsNew = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
newUser();
}
};
miNew.addSelectionListener( lsNew );
miNew.setEnabled( !readonly );
// Edit user info
miEdit = new MenuItem( mTree, SWT.PUSH );
miEdit.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Users.Edit" ) );
lsEdit = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
editUser( item );
}
};
miEdit.addSelectionListener( lsEdit );
miEdit.setEnabled( !readonly );
// Rename user
MenuItem miRen = new MenuItem( mTree, SWT.PUSH );
miRen.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Users.Rename" ) );
SelectionAdapter lsRen = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
renameUser();
}
};
miRen.addSelectionListener( lsRen );
miRen.setEnabled( !readonly );
// Delete user info
miDel = new MenuItem( mTree, SWT.PUSH );
miDel.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Users.Delete" ) );
lsDel = new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
delUser( item );
}
};
miDel.addSelectionListener( lsDel );
miDel.setEnabled( !readonly );
break;
default:
mTree = null;
}
}
ConstUI.displayMenu( mTree, wTree );
}
public void renameInTree() {
TreeItem[] ti = wTree.getSelection();
if ( ti.length == 1 ) {
// Get the parent.
final TreeItem item = ti[0];
int level = ConstUI.getTreeLevel( item );
String[] text = ConstUI.getTreeStrings( item );
int cat = getItemCategory( item );
switch ( cat ) {
case ITEM_CATEGORY_DATABASE:
renameDatabase();
break;
case ITEM_CATEGORY_TRANSFORMATION:
String name = item.getText();
// The first 3 levels of text[] don't belong to the path to this transformation!
String[] path = new String[level - 2];
for ( int i = 0; i < path.length; i++ ) {
path[i] = text[i + 2];
}
// Find the directory in the directory tree...
RepositoryDirectoryInterface repdir = directoryTree.findDirectory( path );
if ( repdir != null ) {
renameTransformation( name, repdir );
}
break;
case ITEM_CATEGORY_JOB:
name = item.getText();
// The first 3 levels of text[] don't belong to the path to this transformation!
path = new String[level - 2];
for ( int i = 0; i < path.length; i++ ) {
path[i] = text[i + 2];
}
// Find the directory in the directory tree...
repdir = directoryTree.findDirectory( path );
if ( repdir != null ) {
renameJob( name, repdir );
}
break;
case ITEM_CATEGORY_USER:
renameUser();
break;
default:
break;
}
}
}
public void close() {
props.setScreen( new WindowProperty( shell ) );
shell.dispose();
}
public void refreshTree() {
try {
// IUser userinfo = securityProvider.getUserInfo();
wTree.removeAll();
objectMap.clear();
// Load the directory tree:
directoryTree = rep.loadRepositoryDirectoryTree();
TreeItem tiTree = new TreeItem( wTree, SWT.NONE );
tiTree.setImage( GUIResource.getInstance().getImageFolderConnections() );
tiTree.setText( rep.getName() == null ? "-" : rep.getName() );
// The Databases...
TreeItem tiParent = new TreeItem( tiTree, SWT.NONE );
tiParent.setImage( GUIResource.getInstance().getImageBol() );
tiParent.setText( STRING_DATABASES );
if ( !!readonly ) {
TreeItemAccelerator.addDoubleClick( tiParent, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
newDatabase();
}
} );
}
String[] names = rep.getDatabaseNames( includeDeleted );
for ( int i = 0; i < names.length; i++ ) {
TreeItem newDB = new TreeItem( tiParent, SWT.NONE );
newDB.setImage( GUIResource.getInstance().getImageConnection() );
newDB.setText( Const.NVL( names[i], "" ) );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( newDB, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
editDatabase( treeItem.getText() );
}
} );
}
}
// The partition schemas...
tiParent = new TreeItem( tiTree, SWT.NONE );
tiParent.setImage( GUIResource.getInstance().getImageBol() );
tiParent.setText( STRING_PARTITIONS );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( tiParent, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
newPartitionSchema();
}
} );
}
names = rep.getPartitionSchemaNames( includeDeleted );
for ( int i = 0; i < names.length; i++ ) {
TreeItem newItem = new TreeItem( tiParent, SWT.NONE );
newItem.setImage( GUIResource.getInstance().getImageFolderConnections() );
newItem.setText( Const.NVL( names[i], "" ) );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( newItem, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
editPartitionSchema( treeItem.getText() );
}
} );
}
}
// The slaves...
tiParent = new TreeItem( tiTree, SWT.NONE );
tiParent.setImage( GUIResource.getInstance().getImageBol() );
tiParent.setText( STRING_SLAVES );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( tiParent, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
newSlaveServer();
}
} );
}
names = rep.getSlaveNames( includeDeleted );
for ( int i = 0; i < names.length; i++ ) {
TreeItem newItem = new TreeItem( tiParent, SWT.NONE );
newItem.setImage( GUIResource.getInstance().getImageSlave() );
newItem.setText( Const.NVL( names[i], "" ) );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( newItem, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
editSlaveServer( treeItem.getText() );
}
} );
}
}
// The clusters ...
tiParent = new TreeItem( tiTree, SWT.NONE );
tiParent.setImage( GUIResource.getInstance().getImageBol() );
tiParent.setText( STRING_CLUSTERS );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( tiParent, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
newCluster();
}
} );
}
names = rep.getClusterNames( includeDeleted );
for ( int i = 0; i < names.length; i++ ) {
TreeItem newItem = new TreeItem( tiParent, SWT.NONE );
newItem.setImage( GUIResource.getInstance().getImageCluster() );
newItem.setText( Const.NVL( names[i], "" ) );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( newItem, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
editCluster( treeItem.getText() );
}
} );
}
}
// The transformations...
TreeItem tiTrans = new TreeItem( tiTree, SWT.NONE );
tiTrans.setImage( GUIResource.getInstance().getImageTransGraph() );
tiTrans.setText( STRING_TRANSFORMATIONS );
TreeItem newCat = new TreeItem( tiTrans, SWT.NONE );
newCat.setImage( GUIResource.getInstance().getImageLogoSmall() );
Color dircolor = GUIResource.getInstance().getColorDirectory();
RepositoryDirectoryUI.getTreeWithNames(
newCat, rep, dircolor, sortColumn, includeDeleted, ascending, true, false, directoryTree, null, null );
// The Jobs...
TreeItem tiJob = new TreeItem( tiTree, SWT.NONE );
tiJob.setImage( GUIResource.getInstance().getImageJobGraph() );
tiJob.setText( STRING_JOBS );
TreeItem newJob = new TreeItem( tiJob, SWT.NONE );
newJob.setImage( GUIResource.getInstance().getImageLogoSmall() );
RepositoryDirectoryUI.getTreeWithNames(
newJob, rep, dircolor, sortColumn, includeDeleted, ascending, false, true, directoryTree, null, null );
//
// Add the users or only yourself
//
if ( capabilities.supportsUsers() && capabilities.managesUsers() ) {
TreeItem tiUser = new TreeItem( tiTree, SWT.NONE );
tiUser.setImage( GUIResource.getInstance().getImageBol() );
tiUser.setText( STRING_USERS );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( tiUser, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
newUser();
}
} );
}
String[] users = securityProvider.getUserLogins();
for ( int i = 0; i < users.length; i++ ) {
if ( users[i] != null ) {
// If users[i] is null TreeWidget will throw exceptions.
// The solution is to verify on saving a user.
TreeItem newUser = new TreeItem( tiUser, SWT.NONE );
newUser.setImage( GUIResource.getInstance().getImageUser() );
newUser.setText( users[i] );
if ( !readonly ) {
TreeItemAccelerator.addDoubleClick( newUser, new DoubleClickInterface() {
@Override
public void action( TreeItem treeItem ) {
editUser( treeItem.getText() );
}
} );
}
}
}
}
// Always expand the top level entry...
TreeMemory.getInstance().storeExpanded(
STRING_REPOSITORY_EXPLORER_TREE_NAME, new String[] { tiTree.getText() }, true );
// Set the expanded flags based on the TreeMemory
TreeMemory.setExpandedFromMemory( wTree, STRING_REPOSITORY_EXPLORER_TREE_NAME );
} catch ( KettleException dbe ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Dialog.ErrorRefreshingTree.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PopupMenu.Dialog.ErrorRefreshingTree.Message" ), dbe );
}
}
public void openTransformation( String name, RepositoryDirectoryInterface repdir ) {
lastOpened = new RepositoryObjectReference( RepositoryObjectType.TRANSFORMATION, repdir, name );
if ( callback != null ) {
if ( callback.open( lastOpened ) ) {
close();
}
} else {
close();
}
}
public void openJob( String name, RepositoryDirectoryInterface repdir ) {
lastOpened = new RepositoryObjectReference( RepositoryObjectType.JOB, repdir, name );
if ( callback != null ) {
if ( callback.open( lastOpened ) ) {
close();
}
} else {
close();
}
}
public boolean delSelectedObjects() {
TreeItem[] items = wTree.getSelection();
boolean error = false;
MessageBox mb = new MessageBox( shell, SWT.ICON_WARNING | SWT.YES | SWT.NO );
mb
.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.Confirm.Message1" )
+ ( items.length > 1
? BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.Confirm.Message2" )
+ items.length + BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.Confirm.Message3" )
: BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.Confirm.Message4" ) ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.Confirm.Title" ) );
int answer = mb.open();
if ( answer != SWT.YES ) {
return false;
}
for ( int i = 0; i < items.length; i++ ) {
final RepositoryElementMetaInterface repositoryObject = objectMap.get( ConstUI.getTreePath( items[i], 0 ) );
if ( repositoryObject != null ) {
try {
switch ( repositoryObject.getObjectType() ) {
case TRANSFORMATION:
rep.deleteTransformation( repositoryObject.getObjectId() );
break;
case JOB:
rep.deleteJob( repositoryObject.getObjectId() );
break;
default:
break;
}
} catch ( Exception e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.ErrorRemoving.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.ErrorRemoving.Message" )
+ repositoryObject.getName() + "]", e );
error = true;
}
}
}
refreshTree();
return !error;
}
public boolean restoreSelectedObjects() {
TreeItem[] items = wTree.getSelection();
boolean error = false;
for ( int i = 0; i < items.length; i++ ) {
final RepositoryElementMetaInterface repositoryObject = objectMap.get( ConstUI.getTreePath( items[i], 0 ) );
if ( repositoryObject != null ) {
try {
rep.undeleteObject( repositoryObject );
} catch ( Exception e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.ErrorRestoring.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Trans.Delete.ErrorRestoring.Message" ), e );
error = true;
}
}
}
refreshTree();
return !error;
}
public boolean renameTransformation( String name, RepositoryDirectoryInterface repdir ) {
boolean retval = false;
final TreeItem ti = wTree.getSelection()[0];
if ( ti.getItemCount() == 0 ) {
final String fname = name;
final RepositoryDirectoryInterface frepdir = repdir;
TreeEditor editor = new TreeEditor( wTree );
editor.setItem( ti );
final Text text = new Text( wTree, SWT.NONE );
props.setLook( text );
text.setText( name );
text.addFocusListener( new FocusAdapter() {
@Override
public void focusLost( FocusEvent arg0 ) {
// Focus is lost: apply changes.
String newname = text.getText();
if ( renameTransformation( fname, newname, frepdir ) ) {
ti.setText( newname );
}
text.dispose();
}
} );
text.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// ESC --> Don't change tree item...
if ( e.keyCode == SWT.ESC ) {
text.dispose();
}
// ENTER --> Save changes...
if ( e.character == SWT.CR ) {
String newname = text.getText();
if ( renameTransformation( fname, newname, frepdir ) ) {
ti.setText( newname );
}
text.dispose();
}
}
} );
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
text.selectAll();
text.setFocus();
editor.layout();
editor.setEditor( text );
}
return retval;
}
public boolean renameTransformation( String name, String newname, RepositoryDirectoryInterface repdir ) {
boolean retval = false;
try {
if ( Utils.isEmpty( newname ) ) {
throw new KettleException( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Exception.NameCanNotBeEmpty" ) );
}
if ( !name.equals( newname ) ) {
ObjectId id = rep.getTransformationID( name, repdir );
if ( id != null ) {
// System.out.println("Renaming transformation ["+name+"] with ID = "+id);
String comment = BaseMessages.getString( REPOSITORY_PKG, "Repository.Rename", name, newname );
rep.renameTransformation( id, comment, repdir, newname );
retval = true;
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb
.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Trans.Rename.ErrorFinding.Message1" )
+ name + "]" + Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Rename.ErrorFinding.Message2" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Rename.ErrorFinding.Title" ) );
mb.open();
}
} catch ( KettleException dbe ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Rename.ErrorRenaming.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Trans.Rename.ErrorRenaming.Message" )
+ name + "]!", dbe );
}
return retval;
}
public boolean moveTransformation( String xml, RepositoryDirectoryInterface repdir ) {
debug = "Move transformation";
boolean retval = false;
try {
debug = "parse xml";
Document doc = XMLHandler.loadXMLString( xml );
String dirname = XMLHandler.getTagValue( doc, "dragdrop", "directory" );
String transname = XMLHandler.getTagValue( doc, "dragdrop", "transformation" );
if ( dirname != null && transname != null ) {
debug = "dirname=" + dirname + ", transname=" + transname;
// OK, find this transformation...
RepositoryDirectoryInterface fromdir = directoryTree.findDirectory( dirname );
if ( fromdir != null ) {
debug = "fromdir found: move transformation!";
ObjectId existingTransID = rep.getTransformationID( transname, repdir );
if ( existingTransID == null ) {
ObjectId id = rep.getTransformationID( transname, fromdir );
rep.renameTransformation( id, repdir, transname );
retval = true;
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Trans.Move.ErrorDuplicate.Message", transname )
+ Const.CR );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Move.ErrorDuplicate.Title" ) );
mb.open();
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Move.ErrorMoving.Message" )
+ dirname + "]" + Const.CR );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Move.ErrorMoving.Title" ) );
mb.open();
}
}
} catch ( Exception dbe ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Move.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Move.UnexpectedError.Message" ), dbe );
}
return retval;
}
public boolean moveJob( String xml, RepositoryDirectoryInterface repdir ) {
debug = "Move Job";
boolean retval = false;
try {
debug = "parse xml";
Document doc = XMLHandler.loadXMLString( xml );
String dirname = XMLHandler.getTagValue( doc, "dragdrop", "directory" );
String jobname = XMLHandler.getTagValue( doc, "dragdrop", "job" );
if ( dirname != null && jobname != null ) {
debug = "dirname=" + dirname + ", jobname=" + jobname;
// OK, find this transformation...
RepositoryDirectoryInterface fromdir = directoryTree.findDirectory( dirname );
if ( fromdir != null ) {
debug = "fromdir found: move job!";
ObjectId existingjobID = rep.getJobId( jobname, repdir );
if ( existingjobID == null ) {
ObjectId id = rep.getJobId( jobname, fromdir );
rep.renameJob( id, repdir, jobname );
retval = true;
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Job.Move.ErrorDuplicate.Message", jobname )
+ Const.CR );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.ErrorDuplicate.Title" ) );
mb.open();
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.ErrorMoving.Message" )
+ dirname + "]" + Const.CR );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.ErrorMoving.Title" ) );
mb.open();
}
}
} catch ( Exception dbe ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Trans.Move.UnexpectedError.Message" ), dbe );
}
return retval;
}
public boolean renameJob( String name, RepositoryDirectoryInterface repdir ) {
boolean retval = false;
final TreeItem ti = wTree.getSelection()[0];
if ( ti.getItemCount() == 0 ) {
final String fname = name;
final RepositoryDirectoryInterface frepdir = repdir;
TreeEditor editor = new TreeEditor( wTree );
editor.setItem( ti );
final Text text = new Text( wTree, SWT.NONE );
props.setLook( text );
text.setText( name );
text.addFocusListener( new FocusAdapter() {
@Override
public void focusLost( FocusEvent arg0 ) {
// Focus is lost: apply changes
String newname = text.getText();
if ( renameJob( fname, newname, frepdir ) ) {
ti.setText( newname );
}
text.dispose();
}
} );
text.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// ESC --> Don't change tree item...
if ( e.keyCode == SWT.ESC ) {
text.dispose();
}
// ENTER --> Save changes...
if ( e.character == SWT.CR ) {
String newname = text.getText();
if ( renameJob( fname, newname, frepdir ) ) {
ti.setText( newname );
}
text.dispose();
}
}
} );
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
text.selectAll();
text.setFocus();
editor.layout();
editor.setEditor( text );
}
return retval;
}
public boolean renameJob( String name, String newname, RepositoryDirectoryInterface repdir ) {
boolean retval = false;
try {
if ( Utils.isEmpty( newname ) ) {
throw new KettleException( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Exception.NameCanNotBeEmpty" ) );
}
if ( !name.equals( newname ) ) {
ObjectId id = rep.getJobId( name, repdir );
if ( id != null ) {
System.out.println( "Renaming job [" + name + "] with ID = " + id );
String comment = BaseMessages.getString( REPOSITORY_PKG, "Repository.Rename", name, newname );
rep.renameJob( id, comment, repdir, newname );
retval = true;
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb
.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.ErrorFinding.Message1" )
+ name + "]" + Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.ErrorFinding.Message2" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.ErrorFinding.Title" ) );
mb.open();
}
} catch ( KettleException dbe ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Move.UnexpectedError.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Job.Move.UnexpectedError.Message" )
+ name + "]", dbe );
}
return retval;
}
public void renameJob( TreeItem treeitem, String jobname, RepositoryDirectoryInterface repositorydir ) {
final TreeItem ti = treeitem;
final String name = jobname;
final RepositoryDirectoryInterface repdir = repositorydir;
TreeEditor editor = new TreeEditor( wTree );
editor.setItem( ti );
final Text text = new Text( wTree, SWT.NONE );
props.setLook( text );
text.setText( name );
text.addFocusListener( new FocusAdapter() {
@Override
public void focusLost( FocusEvent arg0 ) {
// Focus is lost: apply changes
String newname = text.getText();
if ( renameJob( name, repdir, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
} );
text.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// ESC --> Don't change tree item...
if ( e.keyCode == SWT.ESC ) {
text.dispose();
}
// ENTER --> Save changes...
if ( e.character == SWT.CR ) {
String newname = text.getText();
if ( renameJob( name, repdir, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
}
} );
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
text.selectAll();
text.setFocus();
editor.layout();
editor.setEditor( text );
}
public boolean renameJob( String name, RepositoryDirectoryInterface repdir, String newname ) {
boolean retval = false;
try {
if ( Utils.isEmpty( newname ) ) {
throw new KettleException( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Exception.NameCanNotBeEmpty" ) );
}
if ( !name.equals( newname ) ) {
ObjectId id = rep.getJobId( name, repdir );
if ( id != null ) {
// System.out.println("Renaming transformation ["+name+"] with ID = "+id);
String comment = BaseMessages.getString( REPOSITORY_PKG, "Repository.Rename", name, newname );
rep.renameJob( id, comment, repdir, newname );
retval = true;
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb
.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Job.Rename.ErrorFinding.Message1" )
+ name + "]" + Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Rename.ErrorFinding.Message2" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Rename.ErrorFinding.Title" ) );
mb.open();
}
}
} catch ( KettleException dbe ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Job.Rename.UnexpectedError.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Job.Rename.UnexpectedError.Message" )
+ name + "]", dbe );
}
return retval;
}
public void editUser( String login ) {
try {
IUser uinfo = securityManager.loadUserInfo( login ); // Get UserInfo from repository...
UserDialog ud = new UserDialog( shell, SWT.NONE, rep, uinfo );
IUser ui = ud.open();
if ( !readonly ) {
if ( ui != null ) {
securityManager.saveUserInfo( ui );
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_WARNING | SWT.OK );
mb.setMessage( BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Edit.NotAllowed.Message" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Edit.NotAllowed.Title" ) );
mb.open();
}
if ( ui != null && !login.equalsIgnoreCase( ui.getLogin() ) ) {
refreshTree();
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Edit.UnexpectedError.Message.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Edit.UnexpectedError.Message" ), e );
}
}
public void newUser() {
UserDialog ud = new UserDialog( shell, SWT.NONE, rep, new UserInfo() );
IUser ui = ud.open();
if ( ui != null ) {
/***************************
* Removed by sboden as the user dialog already saves the id on pressing ok. Related defect #4228 on javaforge.
*
* // See if this user already exists... long uid = rep.getUserID(ui.getLogin()); if (uid<=0) { ui.saveRep(rep); }
* else { MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
* mb.setMessage(BaseMessages.getString(PKG, "RepositoryExplorerDialog.User.New.AlreadyExists.Message"));
* mb.setText(BaseMessages.getString(PKG, "RepositoryExplorerDialog.User.New.AlreadyExists.Title")); mb.open(); }
****************************/
// Refresh tree...
refreshTree();
}
}
public void delUser( String login ) {
try {
ObjectId idUser = securityManager.getUserID( login );
if ( idUser != null ) {
securityManager.delUser( idUser );
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Delete.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Delete.UnexpectedError.Message" ), e );
}
refreshTree();
}
public boolean renameUser() {
boolean retval = false;
final TreeItem ti = wTree.getSelection()[0];
if ( ti.getItemCount() == 0 ) {
final String name = ti.getText();
TreeEditor editor = new TreeEditor( wTree );
editor.setItem( ti );
final Text text = new Text( wTree, SWT.NONE );
props.setLook( text );
text.setText( name );
text.addFocusListener( new FocusAdapter() {
@Override
public void focusLost( FocusEvent arg0 ) {
// Focus is lost: apply changes
String newname = text.getText();
if ( renameUser( name, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
} );
text.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// ESC --> Don't change tree item...
if ( e.keyCode == SWT.ESC ) {
text.dispose();
}
// ENTER --> Save changes...
if ( e.character == SWT.CR ) {
String newname = text.getText();
if ( renameUser( name, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
}
} );
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
text.selectAll();
text.setFocus();
editor.layout();
editor.setEditor( text );
}
return retval;
}
public boolean renameUser( String name, String newname ) {
boolean retval = false;
try {
if ( Utils.isEmpty( newname ) ) {
throw new KettleException( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Exception.NameCanNotBeEmpty" ) );
}
if ( !name.equals( newname ) ) {
ObjectId id = securityManager.getUserID( name );
if ( id != null ) {
// System.out.println("Renaming user ["+name+"] with ID = "+id);
securityManager.renameUser( id, newname );
retval = true;
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb
.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.User.Rename.ErrorFinding.Message1" )
+ name + "]" + Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Rename.ErrorFinding.Message2" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Rename.ErrorFinding.Title" ) );
mb.open();
}
}
} catch ( KettleException e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.User.Rename.UnexpectedError.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.User.Rename.UnexpectedError.Message" )
+ name + "]", e );
}
return retval;
}
public void editDatabase( String databasename ) {
try {
ObjectId idDatabase = rep.getDatabaseID( databasename );
DatabaseMeta databaseMeta = rep.loadDatabaseMeta( idDatabase, null ); // reads last version
getDatabaseDialog().setDatabaseMeta( databaseMeta );
String name = getDatabaseDialog().open();
if ( name != null ) {
if ( !readonly ) {
rep.insertLogEntry( "Updating database connection '"
+ getDatabaseDialog().getDatabaseMeta().getName() + "'" );
rep.save( databaseMeta, Const.VERSION_COMMENT_EDIT_VERSION, null );
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_WARNING | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Connection.Edit.NotAllowed.Message" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Edit.NotAllowed.Title" ) );
mb.open();
}
if ( !databasename.equalsIgnoreCase( name ) ) {
refreshTree();
}
}
} catch ( KettleException e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Edit.UnexpectedError.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Connection.Edit.UnexpectedError.Message" )
+ databasename + "]", e );
}
}
public void newDatabase() {
try {
DatabaseMeta databaseMeta = new DatabaseMeta();
databaseMeta.initializeVariablesFrom( null );
getDatabaseDialog().setDatabaseMeta( databaseMeta );
String name = getDatabaseDialog().open();
if ( name != null ) {
// See if this user already exists...
ObjectId idDatabase = rep.getDatabaseID( name );
if ( idDatabase == null ) {
rep.insertLogEntry( "Creating new database '" + databaseMeta.getName() + "'" );
rep.save( databaseMeta, Const.VERSION_COMMENT_INITIAL_VERSION, null );
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Connection.Create.AlreadyExists.Message" ) );
mb.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Connection.Create.AlreadyExists.Title" ) );
mb.open();
}
// Refresh tree...
refreshTree();
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Create.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Create.UnexpectedError.Message" ), e );
}
}
public void delDatabase( String databasename ) {
try {
rep.deleteDatabaseMeta( databasename );
refreshTree();
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Delete.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Delete.UnexpectedError.Message" ), e );
}
}
public boolean renameDatabase() {
boolean retval = false;
final TreeItem ti = wTree.getSelection()[0];
if ( ti.getItemCount() == 0 ) {
final String name = ti.getText();
TreeEditor editor = new TreeEditor( wTree );
editor.setItem( ti );
final Text text = new Text( wTree, SWT.NONE );
props.setLook( text );
text.setText( name );
text.addFocusListener( new FocusAdapter() {
@Override
public void focusLost( FocusEvent arg0 ) {
// Focus is lost: apply changes
String newname = text.getText();
if ( renameDatabase( name, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
} );
text.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// ESC --> Don't change tree item...
if ( e.keyCode == SWT.ESC ) {
text.dispose();
}
// ENTER --> Save changes...
if ( e.character == SWT.CR ) {
if ( ti.getText().equals( name ) ) { // Only if the name wasn't changed already.
String newname = text.getText();
if ( renameDatabase( name, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
}
}
} );
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
text.selectAll();
text.setFocus();
editor.layout();
editor.setEditor( text );
}
return retval;
}
public boolean renameDatabase( String name, String newname ) {
boolean retval = false;
try {
if ( Utils.isEmpty( newname ) ) {
throw new KettleException( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Exception.NameCanNotBeEmpty" ) );
}
if ( !name.equals( newname ) ) {
ObjectId id = rep.getDatabaseID( name );
if ( id != null ) {
DatabaseMeta databaseMeta = rep.loadDatabaseMeta( id, null ); // reads last version
databaseMeta.setName( newname );
rep.insertLogEntry( "Renaming database connection '"
+ getDatabaseDialog().getDatabaseMeta().getName() + "'" );
rep.save( databaseMeta, Const.VERSION_COMMENT_EDIT_VERSION, null );
retval = true;
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb
.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Connection.Rename.ErrorFinding.Message1" )
+ name + "]" + Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Rename.ErrorFinding.Message2" ) );
mb.setText( BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Connection.Rename.ErrorFinding.Title" ) );
mb.open();
}
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Rename.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Rename.UnexpectedError.Message" ), e );
}
return retval;
}
public void renameDirectory( TreeItem treeitem, RepositoryDirectoryInterface rd ) {
final TreeItem ti = treeitem;
final RepositoryDirectoryInterface repdir = rd;
final String name = ti.getText();
TreeEditor editor = new TreeEditor( wTree );
editor.setItem( ti );
final Text text = new Text( wTree, SWT.NONE );
props.setLook( text );
text.setText( name );
text.addFocusListener( new FocusAdapter() {
@Override
public void focusLost( FocusEvent arg0 ) {
// Focus is lost: apply changes
String newname = text.getText();
if ( renameDirectory( repdir, name, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
} );
text.addKeyListener( new KeyAdapter() {
@Override
public void keyPressed( KeyEvent e ) {
// ESC --> Don't change tree item...
if ( e.keyCode == SWT.ESC ) {
text.dispose();
}
// ENTER --> Save changes...
if ( e.character == SWT.CR ) {
String newname = text.getText();
if ( renameDirectory( repdir, name, newname ) ) {
ti.setText( newname );
}
text.dispose();
}
}
} );
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
text.selectAll();
text.setFocus();
editor.layout();
editor.setEditor( text );
}
public boolean renameDirectory( RepositoryDirectoryInterface repdir, String name, String newname ) {
boolean retval = false;
try {
if ( Utils.isEmpty( newname ) ) {
throw new KettleException( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Exception.NameCanNotBeEmpty" ) );
}
if ( !name.equals( newname ) ) {
repdir.setName( newname );
try {
rep.renameRepositoryDirectory( repdir.getObjectId(), repdir, newname );
retval = true;
} catch ( Exception exception ) {
retval = false;
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Message1" )
+ name + "]" + Const.CR
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Message2" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Title" ),
exception );
}
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Message" ), e );
}
return retval;
}
public void createDirectory( TreeItem ti, RepositoryDirectoryInterface repdir ) {
EnterStringDialog esd = new EnterStringDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.AskName.Default" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.AskName.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.AskName.Message" ) );
String newdir = esd.open();
if ( newdir != null ) {
RepositoryDirectoryInterface rd = new RepositoryDirectory( repdir, newdir );
String[] path = rd.getPathArray();
RepositoryDirectoryInterface exists = directoryTree.findDirectory( path );
if ( exists == null ) {
try {
rep.saveRepositoryDirectory( rd );
} catch ( Exception exception ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.UnexpectedError.Message1" )
+ newdir
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.UnexpectedError.Message2" )
+ repdir.getPath() + "]",
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.UnexpectedError.Title" ),
exception );
}
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb
.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Directory.Create.AlreadyExists.Message1" )
+ newdir + BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.AlreadyExists.Message2" )
+ repdir.getPath()
+ BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Create.AlreadyExists.Message3" ) );
mb
.setText( BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Directory.Create.AlreadyExists.Title" ) );
mb.open();
}
}
}
public void delDirectory( TreeItem ti, RepositoryDirectoryInterface repdir ) {
try {
rep.deleteRepositoryDirectory( repdir );
refreshTree();
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Delete.ErrorRemoving.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Directory.Delete.ErrorRemoving.Message1" ), e );
}
}
public void exportTransformations( RepositoryDirectoryInterface root ) {
try {
DirectoryDialog dialog = new DirectoryDialog( shell, SWT.OPEN );
if ( dialog.open() != null ) {
String directory = dialog.getFilterPath();
ObjectId[] dirids = ( ( root == null ) ? directoryTree : root ).getDirectoryIDs();
for ( int d = 0; d < dirids.length; d++ ) {
RepositoryDirectoryInterface repdir = directoryTree.findDirectory( dirids[d] );
String[] trans = rep.getTransformationNames( dirids[d], false );
// See if the directory exists...
File dir = new File( directory + repdir.getPath() );
if ( !dir.exists() ) {
dir.mkdir();
log.logBasic( "Exporting transformation", "Created directory [" + dir.getName() + "]" );
}
for ( int i = 0; i < trans.length; i++ ) {
TransMeta ti = rep.loadTransformation( trans[i], repdir, null, true, null ); // reads last version
if ( log.isBasic() ) {
log.logBasic(
"Exporting transformation", "[" + trans[i] + "] in directory [" + repdir.getPath() + "]" );
}
String xml = XMLHandler.getXMLHeader() + ti.getXML();
String filename =
directory + repdir.getPath() + Const.FILE_SEPARATOR + fixFileName( trans[i] ) + ".ktr";
File f = new File( filename );
try {
FileOutputStream fos = new FileOutputStream( f );
fos.write( xml.getBytes( Const.XML_ENCODING ) );
fos.close();
} catch ( IOException e ) {
throw new RuntimeException( "Exporting transformation: Couldn't create file [" + filename + "]", e );
}
}
}
}
} catch ( Exception e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.ExportTrans.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.ExportTrans.UnexpectedError.Message" ), e );
}
}
private String fixFileName( String filename ) {
filename = filename.replace( '/', '_' ); // do something with illegal file name chars
if ( !( "/".equals( Const.FILE_SEPARATOR ) ) ) {
filename = Const.replace( filename, Const.FILE_SEPARATOR, "_" );
}
return filename;
}
public void exportJobs( RepositoryDirectoryInterface root ) {
try {
DirectoryDialog dialog = new DirectoryDialog( shell, SWT.OPEN );
if ( dialog.open() != null ) {
String directory = dialog.getFilterPath();
ObjectId[] dirids = ( ( null == root ) ? directoryTree : root ).getDirectoryIDs();
for ( int d = 0; d < dirids.length; d++ ) {
RepositoryDirectoryInterface repdir = directoryTree.findDirectory( dirids[d] );
String[] jobs = rep.getJobNames( dirids[d], false );
// See if the directory exists...
File dir = new File( directory + repdir.getPath() );
if ( !dir.exists() ) {
dir.mkdir();
log.logBasic( "Exporting Jobs", "Created directory [" + dir.getName() + "]" );
}
for ( int i = 0; i < jobs.length; i++ ) {
JobMeta ji = rep.loadJob( jobs[i], repdir, null, null ); // reads last version
log.logBasic( "Exporting Jobs", "[" + jobs[i] + "] in directory [" + repdir.getPath() + "]" );
String xml = XMLHandler.getXMLHeader() + ji.getXML();
String filename =
directory + repdir.getPath() + Const.FILE_SEPARATOR + fixFileName( jobs[i] ) + ".kjb";
File f = new File( filename );
try {
FileOutputStream fos = new FileOutputStream( f );
fos.write( xml.getBytes( Const.XML_ENCODING ) );
fos.close();
} catch ( IOException e ) {
throw new RuntimeException( "Exporting jobs: Couldn't create file [" + filename + "]", e );
}
}
}
}
} catch ( Exception e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.ExportJobs.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.ExportJobs.UnexpectedError.Message" ), e );
}
}
public void exportAll( RepositoryDirectoryInterface dir ) {
FileDialog dialog = Spoon.getInstance().getExportFileDialog(); // new FileDialog( shell, SWT.SAVE | SWT.SINGLE );
if ( dialog.open() == null ) {
return;
}
String filename = dialog.getFilterPath() + Const.FILE_SEPARATOR + dialog.getFileName();
// check if file is exists
MessageBox box = RepositoryExportProgressDialog.checkIsFileIsAcceptable( shell, log, filename );
int answer = ( box == null ) ? SWT.OK : box.open();
if ( answer != SWT.OK ) {
// seems user don't want to overwrite file...
return;
}
if ( log.isBasic() ) {
log.logBasic( "Exporting All", "Export objects to file [" + filename + "]" ); //$NON-NLS-3$
}
// check file is not empty
RepositoryExportProgressDialog repd = new RepositoryExportProgressDialog( shell, rep, dir, filename );
repd.open();
}
public void importAll() {
FileDialog dialog = new FileDialog( shell, SWT.OPEN | SWT.MULTI );
if ( dialog.open() != null ) {
// Ask for a destination in the repository...
//
SelectDirectoryDialog sdd = new SelectDirectoryDialog( shell, SWT.NONE, rep );
RepositoryDirectoryInterface baseDirectory = sdd.open();
if ( baseDirectory != null ) {
// Finally before importing, ask for a version comment (if applicable)
//
String versionComment = null;
boolean versionOk = false;
while ( !versionOk ) {
versionComment =
RepositorySecurityUI.getVersionComment( shell, rep, "Import of files into ["
+ baseDirectory.getPath() + "]", "", true );
// if the version comment is null, the user hit cancel, exit.
if ( rep != null
&& rep.getSecurityProvider() != null && versionComment == null ) {
return;
}
if ( Utils.isEmpty( versionComment ) && rep.getSecurityProvider().isVersionCommentMandatory() ) {
if ( !RepositorySecurityUI.showVersionCommentMandatoryDialog( shell ) ) {
versionOk = true;
}
} else {
versionOk = true;
}
}
String[] filenames = dialog.getFileNames();
if ( filenames.length > 0 ) {
RepositoryImportProgressDialog ripd =
new RepositoryImportProgressDialog(
shell, SWT.NONE, rep, dialog.getFilterPath(), filenames, baseDirectory, versionComment );
ripd.open();
refreshTree();
}
}
}
}
private int getItemCategory( TreeItem ti ) {
int cat = ITEM_CATEGORY_NONE;
int level = ConstUI.getTreeLevel( ti );
String[] path = ConstUI.getTreeStrings( ti );
String item = "";
String parent = "";
if ( ti != null ) {
item = ti.getText();
if ( ti.getParentItem() != null ) {
parent = ti.getParentItem().getText();
}
}
// Level 1:
if ( level == 0 ) {
cat = ITEM_CATEGORY_ROOT;
} else if ( level == 1 ) {
if ( item.equals( STRING_USERS ) ) {
cat = ITEM_CATEGORY_USERS_ROOT;
} else if ( item.equals( STRING_DATABASES ) ) {
cat = ITEM_CATEGORY_DATABASES_ROOT;
} else if ( item.equals( STRING_PARTITIONS ) ) {
cat = ITEM_CATEGORY_PARTITIONS_ROOT;
} else if ( item.equals( STRING_SLAVES ) ) {
cat = ITEM_CATEGORY_SLAVES_ROOT;
} else if ( item.equals( STRING_CLUSTERS ) ) {
cat = ITEM_CATEGORY_CLUSTERS_ROOT;
} else if ( item.equals( STRING_TRANSFORMATIONS ) ) {
cat = ITEM_CATEGORY_TRANSFORMATIONS_ROOT;
} else if ( item.equals( STRING_JOBS ) ) {
cat = ITEM_CATEGORY_JOBS_ROOT;
}
} else if ( level >= 2 ) {
if ( parent.equals( STRING_USERS ) ) {
cat = ITEM_CATEGORY_USER;
} else if ( parent.equals( STRING_DATABASES ) ) {
cat = ITEM_CATEGORY_DATABASE;
} else if ( parent.equals( STRING_PARTITIONS ) ) {
cat = ITEM_CATEGORY_PARTITION;
} else if ( parent.equals( STRING_SLAVES ) ) {
cat = ITEM_CATEGORY_SLAVE;
} else if ( parent.equals( STRING_CLUSTERS ) ) {
cat = ITEM_CATEGORY_CLUSTER;
}
final Color dircolor = GUIResource.getInstance().getColorDirectory();
if ( path[1].equals( STRING_TRANSFORMATIONS ) ) {
if ( ti.getForeground().equals( dircolor ) ) {
cat = ITEM_CATEGORY_TRANSFORMATION_DIRECTORY;
} else {
cat = ITEM_CATEGORY_TRANSFORMATION;
}
} else if ( path[1].equals( STRING_JOBS ) ) {
if ( ti.getForeground().equals( dircolor ) ) {
cat = ITEM_CATEGORY_JOB_DIRECTORY;
} else {
cat = ITEM_CATEGORY_JOB;
}
}
}
return cat;
}
public void newSlaveServer() {
try {
SlaveServer slaveServer = new SlaveServer();
SlaveServerDialog dd = new SlaveServerDialog( shell, slaveServer, rep.getSlaveServers() );
if ( dd.open() ) {
// See if this slave server already exists...
ObjectId idSlave = rep.getSlaveID( slaveServer.getName() );
if ( idSlave == null ) {
rep.insertLogEntry( "Creating new slave server '" + slaveServer.getName() + "'" );
rep.save( slaveServer, Const.VERSION_COMMENT_INITIAL_VERSION, null );
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Slave.Create.AlreadyExists.Message" ) );
mb.setText( BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Create.AlreadyExists.Title" ) );
mb.open();
}
// Refresh tree...
refreshTree();
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Create.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Connection.Create.UnexpectedError.Message" ), e );
}
}
public void editSlaveServer( String slaveName ) {
try {
ObjectId id = rep.getSlaveID( slaveName );
SlaveServer slaveServer = rep.loadSlaveServer( id, null ); // Load the last version
SlaveServerDialog dd = new SlaveServerDialog( shell, slaveServer );
if ( dd.open() ) {
rep.insertLogEntry( "Updating slave server '" + slaveServer.getName() + "'" );
rep.save( slaveServer, Const.VERSION_COMMENT_EDIT_VERSION, null );
if ( !slaveName.equalsIgnoreCase( slaveServer.getName() ) ) {
refreshTree();
}
}
} catch ( KettleException e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.UnexpectedError.Title" ), BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Slave.Edit.UnexpectedError.Message" )
+ slaveName + "]", e );
}
}
public void delSlaveServer( String slaveName ) {
try {
ObjectId id = rep.getSlaveID( slaveName );
if ( id != null ) {
rep.deleteSlave( id );
}
refreshTree();
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Delete.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Slave.Delete.UnexpectedError.Message" ), e );
}
}
public void newPartitionSchema() {
try {
PartitionSchema partitionSchema = new PartitionSchema();
PartitionSchemaDialog dd =
new PartitionSchemaDialog( shell, partitionSchema, rep.readDatabases(), variableSpace );
if ( dd.open() ) {
// See if this slave server already exists...
ObjectId idPartitionSchema = rep.getPartitionSchemaID( partitionSchema.getName() );
if ( idPartitionSchema == null ) {
rep.insertLogEntry( "Creating new partition schema '" + partitionSchema.getName() + "'" );
rep.save( partitionSchema, Const.VERSION_COMMENT_INITIAL_VERSION, null );
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PartitionSchema.Create.AlreadyExists.Message" ) );
mb.setText( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.PartitionSchema.Create.AlreadyExists.Title" ) );
mb.open();
}
// Refresh tree...
refreshTree();
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PartitionSchema.Create.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PartitionSchema.Create.UnexpectedError.Message" ), e );
}
}
public void editPartitionSchema( String partitionSchemaName ) {
try {
ObjectId id = rep.getPartitionSchemaID( partitionSchemaName );
PartitionSchema partitionSchema = rep.loadPartitionSchema( id, null ); // Load the last version
PartitionSchemaDialog dd =
new PartitionSchemaDialog( shell, partitionSchema, rep.readDatabases(), variableSpace );
if ( dd.open() ) {
rep.insertLogEntry( "Updating partition schema '" + partitionSchema.getName() + "'" );
rep.save( partitionSchema, Const.VERSION_COMMENT_EDIT_VERSION, null );
if ( !partitionSchemaName.equalsIgnoreCase( partitionSchema.getName() ) ) {
refreshTree();
}
}
} catch ( KettleException e ) {
new ErrorDialog(
shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PartitionSchema.Edit.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PartitionSchema.Edit.UnexpectedError.Message" )
+ partitionSchemaName + "]", e );
}
}
public void delPartitionSchema( String partitionSchemaName ) {
try {
ObjectId id = rep.getPartitionSchemaID( partitionSchemaName );
if ( id != null ) {
rep.deletePartitionSchema( id );
}
refreshTree();
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PartitionSchema.Delete.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.PartitionSchema.Delete.UnexpectedError.Message" ), e );
}
}
public void newCluster() {
try {
ClusterSchema cluster = new ClusterSchema();
ClusterSchemaDialog dd = new ClusterSchemaDialog( shell, cluster, rep.getSlaveServers() );
if ( dd.open() ) {
// See if this slave server already exists...
ObjectId idCluster = rep.getClusterID( cluster.getName() );
if ( idCluster == null ) {
rep.insertLogEntry( "Creating new cluster '" + cluster.getName() + "'" );
rep.save( cluster, Const.VERSION_COMMENT_INITIAL_VERSION, null );
} else {
MessageBox mb = new MessageBox( shell, SWT.ICON_ERROR | SWT.OK );
mb.setMessage( BaseMessages.getString(
PKG, "RepositoryExplorerDialog.Cluster.Create.AlreadyExists.Message" ) );
mb
.setText( BaseMessages
.getString( PKG, "RepositoryExplorerDialog.Cluster.Create.AlreadyExists.Title" ) );
mb.open();
}
// Refresh tree...
refreshTree();
}
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Cluster.Create.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Cluster.Create.UnexpectedError.Message" ), e );
}
}
public void editCluster( String clusterName ) {
try {
ObjectId id = rep.getClusterID( clusterName );
ClusterSchema cluster = rep.loadClusterSchema( id, rep.getSlaveServers(), null ); // Load the last version
ClusterSchemaDialog dd = new ClusterSchemaDialog( shell, cluster, rep.getSlaveServers() );
if ( dd.open() ) {
rep.insertLogEntry( "Updating cluster '" + cluster.getName() + "'" );
rep.save( cluster, Const.VERSION_COMMENT_EDIT_VERSION, null );
if ( !clusterName.equalsIgnoreCase( cluster.getName() ) ) {
refreshTree();
}
}
} catch ( KettleException e ) {
//CHECKSTYLE:LineLength:OFF
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Cluster.Edit.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Cluster.Edit.UnexpectedError.Message" ) + clusterName + "]", e );
}
}
public void delCluster( String clusterName ) {
try {
ObjectId id = rep.getClusterID( clusterName );
if ( id != null ) {
rep.deleteClusterSchema( id );
}
refreshTree();
} catch ( KettleException e ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Cluster.Delete.UnexpectedError.Title" ),
BaseMessages.getString( PKG, "RepositoryExplorerDialog.Cluster.Delete.UnexpectedError.Message" ), e );
}
}
protected RepositoryRevisionBrowserDialogInterface getVersionBrowserDialog(
final RepositoryElementInterface element ) throws Exception {
return getVersionBrowserDialog( shell, rep, element );
}
public static final RepositoryRevisionBrowserDialogInterface getVersionBrowserDialog( Shell shell,
Repository repository, final RepositoryElementInterface element ) throws Exception {
String className = repository.getRepositoryMeta().getRevisionBrowserDialogClassName();
PluginRegistry registry = PluginRegistry.getInstance();
PluginInterface plugin =
registry.getPlugin( RepositoryPluginType.class, repository.getRepositoryMeta().getId() );
Class<? extends RepositoryRevisionBrowserDialogInterface> dialogClass = registry.getClass( plugin, className );
Constructor<?> constructor =
dialogClass.getConstructor( Shell.class, Integer.TYPE, Repository.class, RepositoryElementInterface.class );
return (RepositoryRevisionBrowserDialogInterface) constructor.newInstance( new Object[] {
shell, Integer.valueOf( SWT.NONE ), repository, element, } );
}
}