org.pentaho.di.ui.trans.steps.getxmldata.GetXMLDataDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.ui.trans.steps.getxmldata.GetXMLDataDialog.java

Source

/*************************************************************************************** 
 * Copyright (C) 2007 Samatar, Brahim.  All rights reserved. 
 * This software was developed by Samatar, Brahim and is provided under the terms 
 * of the GNU Lesser General Public License, Version 2.1. You may not use 
 * this file except in compliance with the license. A copy of the license, 
 * is included with the binaries and source code. The Original Code is Samatar, Brahim.  
 * The Initial Developer is Samatar, Brahim.
 *
 * Software distributed under the GNU Lesser Public License is distributed on an 
 * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. 
 * Please refer to the license for the specific language governing your rights 
 * and limitations.
 ***************************************************************************************/

package org.pentaho.di.ui.trans.steps.getxmldata;

import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Cursor;
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.Composite;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.Props;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.fileinput.FileInputList;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.TransPreviewFactory;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDialogInterface;
import org.pentaho.di.trans.steps.getxmldata.GetXMLDataField;
import org.pentaho.di.trans.steps.getxmldata.GetXMLDataMeta;
import org.pentaho.di.trans.steps.getxmldata.Messages;
import org.pentaho.di.ui.core.dialog.EnterNumberDialog;
import org.pentaho.di.ui.core.dialog.EnterSelectionDialog;
import org.pentaho.di.ui.core.dialog.EnterTextDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.dialog.PreviewRowsDialog;
import org.pentaho.di.ui.core.widget.ColumnInfo;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.core.widget.TextVar;
import org.pentaho.di.ui.trans.dialog.TransPreviewProgressDialog;
import org.pentaho.di.ui.trans.step.BaseStepDialog;

public class GetXMLDataDialog extends BaseStepDialog implements StepDialogInterface {

    private CTabFolder wTabFolder;
    private FormData fdTabFolder;

    private CTabItem wFileTab, wContentTab, wFieldsTab;

    private Composite wFileComp, wContentComp, wFieldsComp;
    private FormData fdFileComp, fdContentComp, fdFieldsComp;

    private Label wlFilename, wlXMLIsAFile;
    private Button wbbFilename; // Browse: add file or directory
    private Button wbdFilename; // Delete
    private Button wbeFilename; // Edit
    private Button wbaFilename; // Add or change
    private TextVar wFilename;
    private FormData fdlFilename, fdbFilename, fdbdFilename, fdbeFilename, fdbaFilename, fdFilename;

    private Label wlFilenameList;
    private TableView wFilenameList;
    private FormData fdlFilenameList, fdFilenameList;

    private Label wlFilemask;
    private TextVar wFilemask;
    private FormData fdlFilemask, fdFilemask;

    private Button wbShowFiles;
    private FormData fdbShowFiles;

    private Label wluseToken;
    private Button wuseToken;
    private FormData fdluseToken, fduseToken;

    private FormData fdlXMLField, fdlXMLStreamField, fdlXMLIsAFile;
    private FormData fdXMLField, fdXSDFileField;
    private FormData fdOutputField, fdXMLIsAFile, fdAdditionalFields, fdAddFileResult, fdXmlConf;
    private Label wlXMLField, wlXmlStreamField;
    private CCombo wXMLField;
    private Button wXMLStreamField, wXMLIsAFile;

    private Label wlInclFilename;
    private Button wInclFilename, wAddResult;
    private FormData fdlInclFilename, fdInclFilename, fdAddResult, fdlAddResult;

    private Label wlNameSpaceAware;
    private Button wNameSpaceAware;
    private FormData fdlNameSpaceAware, fdNameSpaceAware;

    private Label wlreadUrl;
    private Button wreadUrl;
    private FormData fdlreadUrl, fdreadUrl;

    private Label wlIgnoreComment;
    private Button wIgnoreComment;
    private FormData fdlIgnoreComment, fdIgnoreComment;

    private Label wlValidating;
    private Button wValidating;
    private FormData fdlValidating, fdValidating;

    private Label wlInclFilenameField;
    private TextVar wInclFilenameField;
    private FormData fdlInclFilenameField, fdInclFilenameField;

    private Label wlInclRownum, wlAddResult;
    private Button wInclRownum;
    private FormData fdlInclRownum, fdRownum;

    private Label wlInclRownumField;
    private TextVar wInclRownumField;
    private FormData fdlInclRownumField, fdInclRownumField;

    private Label wlLimit;
    private Text wLimit;
    private FormData fdlLimit, fdLimit;

    private Label wlLoopXPath;
    private TextVar wLoopXPath;
    private FormData fdlLoopXPath, fdLoopXPath;

    private Label wlPrunePath;
    private TextVar wPrunePath;
    private FormData fdlPrunePath, fdPrunePath;

    private Label wlEncoding;
    private CCombo wEncoding;
    private FormData fdlEncoding, fdEncoding;

    private TableView wFields;
    private FormData fdFields;

    private Group wOutputField;
    private Group wAdditionalFields;
    private Group wAddFileResult;
    private Group wXmlConf;

    private Button wbbLoopPathList;
    private FormData fdbLoopPathList;

    // ignore empty files flag
    private Label wlIgnoreEmptyFile;
    private Button wIgnoreEmptyFile;
    private FormData fdlIgnoreEmptyFile, fdIgnoreEmptyFile;

    // do not fail if no files?
    private Label wldoNotFailIfNoFile;
    private Button wdoNotFailIfNoFile;
    private FormData fdldoNotFailIfNoFile, fddoNotFailIfNoFile;

    private GetXMLDataMeta input;

    private boolean gotEncodings = false;

    private HashSet<String> list = new HashSet<String>();

    public static final int dateLengths[] = new int[] { 23, 19, 14, 10, 10, 10, 10, 8, 8, 8, 8, 6, 6 };

    ArrayList<String> listpath = new ArrayList<String>();
    String precNodeName = null;

    public GetXMLDataDialog(Shell parent, Object in, TransMeta transMeta, String sname) {
        super(parent, (BaseStepMeta) in, transMeta, sname);
        input = (GetXMLDataMeta) in;
    }

    public String open() {
        Shell parent = getParent();
        Display display = parent.getDisplay();

        shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);
        props.setLook(shell);
        setShellImage(shell, input);

        ModifyListener lsMod = new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                input.setChanged();
            }
        };
        changed = input.hasChanged();

        FormLayout formLayout = new FormLayout();
        formLayout.marginWidth = Const.FORM_MARGIN;
        formLayout.marginHeight = Const.FORM_MARGIN;

        shell.setLayout(formLayout);
        shell.setText(Messages.getString("GetXMLDataDialog.DialogTitle"));

        int middle = props.getMiddlePct();
        int margin = Const.MARGIN;

        // Stepname line
        wlStepname = new Label(shell, SWT.RIGHT);
        wlStepname.setText(Messages.getString("System.Label.StepName"));
        props.setLook(wlStepname);
        fdlStepname = new FormData();
        fdlStepname.left = new FormAttachment(0, 0);
        fdlStepname.top = new FormAttachment(0, margin);
        fdlStepname.right = new FormAttachment(middle, -margin);
        wlStepname.setLayoutData(fdlStepname);
        wStepname = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        wStepname.setText(stepname);
        props.setLook(wStepname);
        wStepname.addModifyListener(lsMod);
        fdStepname = new FormData();
        fdStepname.left = new FormAttachment(middle, 0);
        fdStepname.top = new FormAttachment(0, margin);
        fdStepname.right = new FormAttachment(100, 0);
        wStepname.setLayoutData(fdStepname);

        wTabFolder = new CTabFolder(shell, SWT.BORDER);
        props.setLook(wTabFolder, Props.WIDGET_STYLE_TAB);

        //////////////////////////
        // START OF FILE TAB   ///
        //////////////////////////
        wFileTab = new CTabItem(wTabFolder, SWT.NONE);
        wFileTab.setText(Messages.getString("GetXMLDataDialog.File.Tab"));

        wFileComp = new Composite(wTabFolder, SWT.NONE);
        props.setLook(wFileComp);

        FormLayout fileLayout = new FormLayout();
        fileLayout.marginWidth = 3;
        fileLayout.marginHeight = 3;
        wFileComp.setLayout(fileLayout);

        // ///////////////////////////////
        // START OF Output Field GROUP  //
        ///////////////////////////////// 

        wOutputField = new Group(wFileComp, SWT.SHADOW_NONE);
        props.setLook(wOutputField);
        wOutputField.setText(Messages.getString("GetXMLDataDialog.wOutputField.Label"));

        FormLayout outputfieldgroupLayout = new FormLayout();
        outputfieldgroupLayout.marginWidth = 10;
        outputfieldgroupLayout.marginHeight = 10;
        wOutputField.setLayout(outputfieldgroupLayout);

        //Is XML string defined in a Field      
        wlXmlStreamField = new Label(wOutputField, SWT.RIGHT);
        wlXmlStreamField.setText(Messages.getString("GetXMLDataDialog.wlXmlStreamField.Label"));
        props.setLook(wlXmlStreamField);
        fdlXMLStreamField = new FormData();
        fdlXMLStreamField.left = new FormAttachment(0, -margin);
        fdlXMLStreamField.top = new FormAttachment(0, margin);
        fdlXMLStreamField.right = new FormAttachment(middle, -2 * margin);
        wlXmlStreamField.setLayoutData(fdlXMLStreamField);

        wXMLStreamField = new Button(wOutputField, SWT.CHECK);
        props.setLook(wXMLStreamField);
        wXMLStreamField.setToolTipText(Messages.getString("GetXMLDataDialog.wXmlStreamField.Tooltip"));
        fdXSDFileField = new FormData();
        fdXSDFileField.left = new FormAttachment(middle, -margin);
        fdXSDFileField.top = new FormAttachment(0, margin);
        wXMLStreamField.setLayoutData(fdXSDFileField);
        SelectionAdapter lsxmlstream = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                ActiveXmlStreamField();
                input.setChanged();
            }
        };
        wXMLStreamField.addSelectionListener(lsxmlstream);

        //Is XML source is a file?      
        wlXMLIsAFile = new Label(wOutputField, SWT.RIGHT);
        wlXMLIsAFile.setText(Messages.getString("GetXMLDataDialog.XMLIsAFile.Label"));
        props.setLook(wlXMLIsAFile);
        fdlXMLIsAFile = new FormData();
        fdlXMLIsAFile.left = new FormAttachment(0, -margin);
        fdlXMLIsAFile.top = new FormAttachment(wXMLStreamField, margin);
        fdlXMLIsAFile.right = new FormAttachment(middle, -2 * margin);
        wlXMLIsAFile.setLayoutData(fdlXMLIsAFile);

        wXMLIsAFile = new Button(wOutputField, SWT.CHECK);
        props.setLook(wXMLIsAFile);
        wXMLIsAFile.setToolTipText(Messages.getString("GetXMLDataDialog.XMLIsAFile.Tooltip"));
        fdXMLIsAFile = new FormData();
        fdXMLIsAFile.left = new FormAttachment(middle, -margin);
        fdXMLIsAFile.top = new FormAttachment(wXMLStreamField, margin);
        wXMLIsAFile.setLayoutData(fdXMLIsAFile);
        SelectionAdapter lsxmlisafile = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                if (wXMLIsAFile.getSelection())
                    wreadUrl.setSelection(false);
                input.setChanged();
            }
        };
        wXMLIsAFile.addSelectionListener(lsxmlisafile);

        // read url as source ?
        wlreadUrl = new Label(wOutputField, SWT.RIGHT);
        wlreadUrl.setText(Messages.getString("GetXMLDataDialog.readUrl.Label"));
        props.setLook(wlreadUrl);
        fdlreadUrl = new FormData();
        fdlreadUrl.left = new FormAttachment(0, -margin);
        fdlreadUrl.top = new FormAttachment(wXMLIsAFile, margin);
        fdlreadUrl.right = new FormAttachment(middle, -2 * margin);
        wlreadUrl.setLayoutData(fdlreadUrl);
        wreadUrl = new Button(wOutputField, SWT.CHECK);
        props.setLook(wreadUrl);
        wreadUrl.setToolTipText(Messages.getString("GetXMLDataDialog.readUrl.Tooltip"));
        fdreadUrl = new FormData();
        fdreadUrl.left = new FormAttachment(middle, -margin);
        fdreadUrl.top = new FormAttachment(wXMLIsAFile, margin);
        wreadUrl.setLayoutData(fdreadUrl);
        SelectionAdapter lsreadurl = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                if (wreadUrl.getSelection())
                    wXMLIsAFile.setSelection(false);
                input.setChanged();
            }
        };
        wreadUrl.addSelectionListener(lsreadurl);

        // If XML string defined in a Field
        wlXMLField = new Label(wOutputField, SWT.RIGHT);
        wlXMLField.setText(Messages.getString("GetXMLDataDialog.wlXMLField.Label"));
        props.setLook(wlXMLField);
        fdlXMLField = new FormData();
        fdlXMLField.left = new FormAttachment(0, -margin);
        fdlXMLField.top = new FormAttachment(wreadUrl, margin);
        fdlXMLField.right = new FormAttachment(middle, -2 * margin);
        wlXMLField.setLayoutData(fdlXMLField);

        wXMLField = new CCombo(wOutputField, SWT.BORDER | SWT.READ_ONLY);
        wXMLField.setEditable(true);
        props.setLook(wXMLField);
        wXMLField.addModifyListener(lsMod);
        fdXMLField = new FormData();
        fdXMLField.left = new FormAttachment(middle, -margin);
        fdXMLField.top = new FormAttachment(wreadUrl, margin);
        fdXMLField.right = new FormAttachment(100, -margin);
        wXMLField.setLayoutData(fdXMLField);
        wXMLField.addFocusListener(new FocusListener() {
            public void focusLost(org.eclipse.swt.events.FocusEvent e) {
            }

            public void focusGained(org.eclipse.swt.events.FocusEvent e) {
                Cursor busy = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
                shell.setCursor(busy);
                setXMLStreamField();
                shell.setCursor(null);
                busy.dispose();
            }
        });

        fdOutputField = new FormData();
        fdOutputField.left = new FormAttachment(0, margin);
        fdOutputField.top = new FormAttachment(wFilenameList, margin);
        fdOutputField.right = new FormAttachment(100, -margin);
        wOutputField.setLayoutData(fdOutputField);

        // ///////////////////////////////////////////////////////////
        // / END OF Output Field GROUP
        // ///////////////////////////////////////////////////////////      

        // Filename line
        wlFilename = new Label(wFileComp, SWT.RIGHT);
        wlFilename.setText(Messages.getString("GetXMLDataDialog.Filename.Label"));
        props.setLook(wlFilename);
        fdlFilename = new FormData();
        fdlFilename.left = new FormAttachment(0, 0);
        fdlFilename.top = new FormAttachment(wOutputField, margin);
        fdlFilename.right = new FormAttachment(middle, -margin);
        wlFilename.setLayoutData(fdlFilename);

        wbbFilename = new Button(wFileComp, SWT.PUSH | SWT.CENTER);
        props.setLook(wbbFilename);
        wbbFilename.setText(Messages.getString("GetXMLDataDialog.FilenameBrowse.Button"));
        wbbFilename.setToolTipText(Messages.getString("System.Tooltip.BrowseForFileOrDirAndAdd"));
        fdbFilename = new FormData();
        fdbFilename.right = new FormAttachment(100, 0);
        fdbFilename.top = new FormAttachment(wOutputField, margin);
        wbbFilename.setLayoutData(fdbFilename);

        wbaFilename = new Button(wFileComp, SWT.PUSH | SWT.CENTER);
        props.setLook(wbaFilename);
        wbaFilename.setText(Messages.getString("GetXMLDataDialog.FilenameAdd.Button"));
        wbaFilename.setToolTipText(Messages.getString("GetXMLDataDialog.FilenameAdd.Tooltip"));
        fdbaFilename = new FormData();
        fdbaFilename.right = new FormAttachment(wbbFilename, -margin);
        fdbaFilename.top = new FormAttachment(wOutputField, margin);
        wbaFilename.setLayoutData(fdbaFilename);

        wFilename = new TextVar(transMeta, wFileComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wFilename);
        wFilename.addModifyListener(lsMod);
        fdFilename = new FormData();
        fdFilename.left = new FormAttachment(middle, 0);
        fdFilename.right = new FormAttachment(wbaFilename, -margin);
        fdFilename.top = new FormAttachment(wOutputField, margin);
        wFilename.setLayoutData(fdFilename);

        wlFilemask = new Label(wFileComp, SWT.RIGHT);
        wlFilemask.setText(Messages.getString("GetXMLDataDialog.RegExp.Label"));
        props.setLook(wlFilemask);
        fdlFilemask = new FormData();
        fdlFilemask.left = new FormAttachment(0, 0);
        fdlFilemask.top = new FormAttachment(wFilename, margin);
        fdlFilemask.right = new FormAttachment(middle, -margin);
        wlFilemask.setLayoutData(fdlFilemask);
        wFilemask = new TextVar(transMeta, wFileComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wFilemask);
        wFilemask.addModifyListener(lsMod);
        fdFilemask = new FormData();
        fdFilemask.left = new FormAttachment(middle, 0);
        fdFilemask.top = new FormAttachment(wFilename, margin);
        fdFilemask.right = new FormAttachment(100, 0);
        wFilemask.setLayoutData(fdFilemask);

        // Filename list line
        wlFilenameList = new Label(wFileComp, SWT.RIGHT);
        wlFilenameList.setText(Messages.getString("GetXMLDataDialog.FilenameList.Label"));
        props.setLook(wlFilenameList);
        fdlFilenameList = new FormData();
        fdlFilenameList.left = new FormAttachment(0, 0);
        fdlFilenameList.top = new FormAttachment(wFilemask, margin);
        fdlFilenameList.right = new FormAttachment(middle, -margin);
        wlFilenameList.setLayoutData(fdlFilenameList);

        // Buttons to the right of the screen...
        wbdFilename = new Button(wFileComp, SWT.PUSH | SWT.CENTER);
        props.setLook(wbdFilename);
        wbdFilename.setText(Messages.getString("GetXMLDataDialog.FilenameRemove.Button"));
        wbdFilename.setToolTipText(Messages.getString("GetXMLDataDialog.FilenameRemove.Tooltip"));
        fdbdFilename = new FormData();
        fdbdFilename.right = new FormAttachment(100, 0);
        fdbdFilename.top = new FormAttachment(wFilemask, 40);
        wbdFilename.setLayoutData(fdbdFilename);

        wbeFilename = new Button(wFileComp, SWT.PUSH | SWT.CENTER);
        props.setLook(wbeFilename);
        wbeFilename.setText(Messages.getString("GetXMLDataDialog.FilenameEdit.Button"));
        wbeFilename.setToolTipText(Messages.getString("GetXMLDataDialog.FilenameEdit.Tooltip"));
        fdbeFilename = new FormData();
        fdbeFilename.right = new FormAttachment(100, 0);
        fdbeFilename.left = new FormAttachment(wbdFilename, 0, SWT.LEFT);
        fdbeFilename.top = new FormAttachment(wbdFilename, margin);
        wbeFilename.setLayoutData(fdbeFilename);

        wbShowFiles = new Button(wFileComp, SWT.PUSH | SWT.CENTER);
        props.setLook(wbShowFiles);
        wbShowFiles.setText(Messages.getString("GetXMLDataDialog.ShowFiles.Button"));
        fdbShowFiles = new FormData();
        fdbShowFiles.left = new FormAttachment(middle, 0);
        fdbShowFiles.bottom = new FormAttachment(100, 0);
        wbShowFiles.setLayoutData(fdbShowFiles);

        ColumnInfo[] colinfo = new ColumnInfo[3];
        colinfo[0] = new ColumnInfo(Messages.getString("GetXMLDataDialog.Files.Filename.Column"),
                ColumnInfo.COLUMN_TYPE_TEXT, false);
        colinfo[1] = new ColumnInfo(Messages.getString("GetXMLDataDialog.Files.Wildcard.Column"),
                ColumnInfo.COLUMN_TYPE_TEXT, false);

        colinfo[0].setUsingVariables(true);
        colinfo[1].setUsingVariables(true);
        colinfo[1].setToolTip(Messages.getString("GetXMLDataDialog.Files.Wildcard.Tooltip"));
        colinfo[2] = new ColumnInfo(Messages.getString("GetXMLDataDialog.Required.Column"),
                ColumnInfo.COLUMN_TYPE_CCOMBO, GetXMLDataMeta.RequiredFilesDesc);
        colinfo[2].setToolTip(Messages.getString("GetXMLDataDialog.Required.Tooltip"));

        wFilenameList = new TableView(transMeta, wFileComp, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER, colinfo,
                2, lsMod, props);
        props.setLook(wFilenameList);
        fdFilenameList = new FormData();
        fdFilenameList.left = new FormAttachment(middle, 0);
        fdFilenameList.right = new FormAttachment(wbdFilename, -margin);
        fdFilenameList.top = new FormAttachment(wFilemask, margin);
        fdFilenameList.bottom = new FormAttachment(wbShowFiles, -margin);
        wFilenameList.setLayoutData(fdFilenameList);

        fdFileComp = new FormData();
        fdFileComp.left = new FormAttachment(0, 0);
        fdFileComp.top = new FormAttachment(0, 0);
        fdFileComp.right = new FormAttachment(100, 0);
        fdFileComp.bottom = new FormAttachment(100, 0);
        wFileComp.setLayoutData(fdFileComp);

        wFileComp.layout();
        wFileTab.setControl(wFileComp);

        /////////////////////////////////////////////////////////////
        /// END OF FILE TAB
        /////////////////////////////////////////////////////////////

        //////////////////////////
        // START OF CONTENT TAB///
        ///
        wContentTab = new CTabItem(wTabFolder, SWT.NONE);
        wContentTab.setText(Messages.getString("GetXMLDataDialog.Content.Tab"));

        FormLayout contentLayout = new FormLayout();
        contentLayout.marginWidth = 3;
        contentLayout.marginHeight = 3;

        wContentComp = new Composite(wTabFolder, SWT.NONE);
        props.setLook(wContentComp);
        wContentComp.setLayout(contentLayout);

        // ///////////////////////////////
        // START OF XmlConf Field GROUP  //
        ///////////////////////////////// 

        wXmlConf = new Group(wContentComp, SWT.SHADOW_NONE);
        props.setLook(wXmlConf);
        wXmlConf.setText(Messages.getString("GetXMLDataDialog.wXmlConf.Label"));

        FormLayout XmlConfgroupLayout = new FormLayout();
        XmlConfgroupLayout.marginWidth = 10;
        XmlConfgroupLayout.marginHeight = 10;
        wXmlConf.setLayout(XmlConfgroupLayout);

        wbbLoopPathList = new Button(wXmlConf, SWT.PUSH | SWT.CENTER);
        props.setLook(wbbLoopPathList);
        wbbLoopPathList.setText(Messages.getString("GetXMLDataDialog.LoopPathList.Button"));
        wbbLoopPathList.setToolTipText(Messages.getString("System.Tooltip.BrowseForFileOrDirAndAdd"));
        fdbLoopPathList = new FormData();
        fdbLoopPathList.right = new FormAttachment(100, 0);
        fdbLoopPathList.top = new FormAttachment(0, 0);
        wbbLoopPathList.setLayoutData(fdbLoopPathList);

        wbbLoopPathList.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                getLoopPathList();
            }
        });

        wlLoopXPath = new Label(wXmlConf, SWT.RIGHT);
        wlLoopXPath.setText(Messages.getString("GetXMLDataDialog.LoopXPath.Label"));
        props.setLook(wlLoopXPath);
        fdlLoopXPath = new FormData();
        fdlLoopXPath.left = new FormAttachment(0, 0);
        fdlLoopXPath.top = new FormAttachment(0, margin);
        fdlLoopXPath.right = new FormAttachment(middle, -margin);
        wlLoopXPath.setLayoutData(fdlLoopXPath);
        wLoopXPath = new TextVar(transMeta, wXmlConf, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        wLoopXPath.setToolTipText(Messages.getString("GetXMLDataDialog.LoopXPath.Tooltip"));
        props.setLook(wLoopXPath);
        wLoopXPath.addModifyListener(lsMod);
        fdLoopXPath = new FormData();
        fdLoopXPath.left = new FormAttachment(middle, 0);
        fdLoopXPath.top = new FormAttachment(0, margin);
        fdLoopXPath.right = new FormAttachment(wbbLoopPathList, -margin);
        wLoopXPath.setLayoutData(fdLoopXPath);

        wlEncoding = new Label(wXmlConf, SWT.RIGHT);
        wlEncoding.setText(Messages.getString("GetXMLDataDialog.Encoding.Label"));
        props.setLook(wlEncoding);
        fdlEncoding = new FormData();
        fdlEncoding.left = new FormAttachment(0, 0);
        fdlEncoding.top = new FormAttachment(wLoopXPath, margin);
        fdlEncoding.right = new FormAttachment(middle, -margin);
        wlEncoding.setLayoutData(fdlEncoding);
        wEncoding = new CCombo(wXmlConf, SWT.BORDER | SWT.READ_ONLY);
        wEncoding.setEditable(true);
        props.setLook(wEncoding);
        wEncoding.addModifyListener(lsMod);
        fdEncoding = new FormData();
        fdEncoding.left = new FormAttachment(middle, 0);
        fdEncoding.top = new FormAttachment(wLoopXPath, margin);
        fdEncoding.right = new FormAttachment(100, 0);
        wEncoding.setLayoutData(fdEncoding);
        wEncoding.addFocusListener(new FocusListener() {
            public void focusLost(org.eclipse.swt.events.FocusEvent e) {
            }

            public void focusGained(org.eclipse.swt.events.FocusEvent e) {
                Cursor busy = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
                shell.setCursor(busy);
                setEncodings();
                shell.setCursor(null);
                busy.dispose();
            }
        });

        // Set Namespace aware ?
        wlNameSpaceAware = new Label(wXmlConf, SWT.RIGHT);
        wlNameSpaceAware.setText(Messages.getString("GetXMLDataDialog.NameSpaceAware.Label"));
        props.setLook(wlNameSpaceAware);
        fdlNameSpaceAware = new FormData();
        fdlNameSpaceAware.left = new FormAttachment(0, 0);
        fdlNameSpaceAware.top = new FormAttachment(wEncoding, margin);
        fdlNameSpaceAware.right = new FormAttachment(middle, -margin);
        wlNameSpaceAware.setLayoutData(fdlNameSpaceAware);
        wNameSpaceAware = new Button(wXmlConf, SWT.CHECK);
        props.setLook(wNameSpaceAware);
        wNameSpaceAware.setToolTipText(Messages.getString("GetXMLDataDialog.NameSpaceAware.Tooltip"));
        fdNameSpaceAware = new FormData();
        fdNameSpaceAware.left = new FormAttachment(middle, 0);
        fdNameSpaceAware.top = new FormAttachment(wEncoding, margin);
        wNameSpaceAware.setLayoutData(fdNameSpaceAware);

        // Ignore comments ?
        wlIgnoreComment = new Label(wXmlConf, SWT.RIGHT);
        wlIgnoreComment.setText(Messages.getString("GetXMLDataDialog.IgnoreComment.Label"));
        props.setLook(wlIgnoreComment);
        fdlIgnoreComment = new FormData();
        fdlIgnoreComment.left = new FormAttachment(0, 0);
        fdlIgnoreComment.top = new FormAttachment(wNameSpaceAware, margin);
        fdlIgnoreComment.right = new FormAttachment(middle, -margin);
        wlIgnoreComment.setLayoutData(fdlIgnoreComment);
        wIgnoreComment = new Button(wXmlConf, SWT.CHECK);
        props.setLook(wIgnoreComment);
        wIgnoreComment.setToolTipText(Messages.getString("GetXMLDataDialog.IgnoreComment.Tooltip"));
        fdIgnoreComment = new FormData();
        fdIgnoreComment.left = new FormAttachment(middle, 0);
        fdIgnoreComment.top = new FormAttachment(wNameSpaceAware, margin);
        wIgnoreComment.setLayoutData(fdIgnoreComment);

        // Validate XML?
        wlValidating = new Label(wXmlConf, SWT.RIGHT);
        wlValidating.setText(Messages.getString("GetXMLDataDialog.Validating.Label"));
        props.setLook(wlValidating);
        fdlValidating = new FormData();
        fdlValidating.left = new FormAttachment(0, 0);
        fdlValidating.top = new FormAttachment(wIgnoreComment, margin);
        fdlValidating.right = new FormAttachment(middle, -margin);
        wlValidating.setLayoutData(fdlValidating);
        wValidating = new Button(wXmlConf, SWT.CHECK);
        props.setLook(wValidating);
        wValidating.setToolTipText(Messages.getString("GetXMLDataDialog.Validating.Tooltip"));
        fdValidating = new FormData();
        fdValidating.left = new FormAttachment(middle, 0);
        fdValidating.top = new FormAttachment(wIgnoreComment, margin);
        wValidating.setLayoutData(fdValidating);

        // use Token ?
        wluseToken = new Label(wXmlConf, SWT.RIGHT);
        wluseToken.setText(Messages.getString("GetXMLDataDialog.useToken.Label"));
        props.setLook(wluseToken);
        fdluseToken = new FormData();
        fdluseToken.left = new FormAttachment(0, 0);
        fdluseToken.top = new FormAttachment(wValidating, margin);
        fdluseToken.right = new FormAttachment(middle, -margin);
        wluseToken.setLayoutData(fdluseToken);
        wuseToken = new Button(wXmlConf, SWT.CHECK);
        props.setLook(wuseToken);
        wuseToken.setToolTipText(Messages.getString("GetXMLDataDialog.useToken.Tooltip"));
        fduseToken = new FormData();
        fduseToken.left = new FormAttachment(middle, 0);
        fduseToken.top = new FormAttachment(wValidating, margin);
        wuseToken.setLayoutData(fduseToken);

        // Ignore Empty File
        wlIgnoreEmptyFile = new Label(wXmlConf, SWT.RIGHT);
        wlIgnoreEmptyFile.setText(Messages.getString("GetXMLDataDialog.IgnoreEmptyFile.Label"));
        props.setLook(wlIgnoreEmptyFile);
        fdlIgnoreEmptyFile = new FormData();
        fdlIgnoreEmptyFile.left = new FormAttachment(0, 0);
        fdlIgnoreEmptyFile.top = new FormAttachment(wuseToken, margin);
        fdlIgnoreEmptyFile.right = new FormAttachment(middle, -margin);
        wlIgnoreEmptyFile.setLayoutData(fdlIgnoreEmptyFile);
        wIgnoreEmptyFile = new Button(wXmlConf, SWT.CHECK);
        props.setLook(wIgnoreEmptyFile);
        wIgnoreEmptyFile.setToolTipText(Messages.getString("GetXMLDataDialog.IgnoreEmptyFile.Tooltip"));
        fdIgnoreEmptyFile = new FormData();
        fdIgnoreEmptyFile.left = new FormAttachment(middle, 0);
        fdIgnoreEmptyFile.top = new FormAttachment(wuseToken, margin);
        wIgnoreEmptyFile.setLayoutData(fdIgnoreEmptyFile);

        // do not fail if no files?
        wldoNotFailIfNoFile = new Label(wXmlConf, SWT.RIGHT);
        wldoNotFailIfNoFile.setText(Messages.getString("GetXMLDataDialog.doNotFailIfNoFile.Label"));
        props.setLook(wldoNotFailIfNoFile);
        fdldoNotFailIfNoFile = new FormData();
        fdldoNotFailIfNoFile.left = new FormAttachment(0, 0);
        fdldoNotFailIfNoFile.top = new FormAttachment(wIgnoreEmptyFile, margin);
        fdldoNotFailIfNoFile.right = new FormAttachment(middle, -margin);
        wldoNotFailIfNoFile.setLayoutData(fdldoNotFailIfNoFile);
        wdoNotFailIfNoFile = new Button(wXmlConf, SWT.CHECK);
        props.setLook(wdoNotFailIfNoFile);
        wdoNotFailIfNoFile.setToolTipText(Messages.getString("GetXMLDataDialog.doNotFailIfNoFile.Tooltip"));
        fddoNotFailIfNoFile = new FormData();
        fddoNotFailIfNoFile.left = new FormAttachment(middle, 0);
        fddoNotFailIfNoFile.top = new FormAttachment(wIgnoreEmptyFile, margin);
        wdoNotFailIfNoFile.setLayoutData(fddoNotFailIfNoFile);

        wlLimit = new Label(wXmlConf, SWT.RIGHT);
        wlLimit.setText(Messages.getString("GetXMLDataDialog.Limit.Label"));
        props.setLook(wlLimit);
        fdlLimit = new FormData();
        fdlLimit.left = new FormAttachment(0, 0);
        fdlLimit.top = new FormAttachment(wdoNotFailIfNoFile, margin);
        fdlLimit.right = new FormAttachment(middle, -margin);
        wlLimit.setLayoutData(fdlLimit);
        wLimit = new Text(wXmlConf, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wLimit);
        wLimit.addModifyListener(lsMod);
        fdLimit = new FormData();
        fdLimit.left = new FormAttachment(middle, 0);
        fdLimit.top = new FormAttachment(wdoNotFailIfNoFile, margin);
        fdLimit.right = new FormAttachment(100, 0);
        wLimit.setLayoutData(fdLimit);

        // Prune path to handle large files (streaming mode)
        wlPrunePath = new Label(wXmlConf, SWT.RIGHT);
        wlPrunePath.setText(Messages.getString("GetXMLDataDialog.StreamingMode.Label"));
        props.setLook(wlPrunePath);
        fdlPrunePath = new FormData();
        fdlPrunePath.left = new FormAttachment(0, 0);
        fdlPrunePath.top = new FormAttachment(wLimit, margin);
        fdlPrunePath.right = new FormAttachment(middle, -margin);
        wlPrunePath.setLayoutData(fdlPrunePath);
        wPrunePath = new TextVar(transMeta, wXmlConf, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        wPrunePath.setToolTipText(Messages.getString("GetXMLDataDialog.StreamingMode.Tooltip"));
        props.setLook(wPrunePath);
        wPrunePath.addModifyListener(lsMod);
        fdPrunePath = new FormData();
        fdPrunePath.left = new FormAttachment(middle, 0);
        fdPrunePath.top = new FormAttachment(wLimit, margin);
        fdPrunePath.right = new FormAttachment(100, 0);
        wPrunePath.setLayoutData(fdPrunePath);

        fdXmlConf = new FormData();
        fdXmlConf.left = new FormAttachment(0, margin);
        fdXmlConf.top = new FormAttachment(0, margin);
        fdXmlConf.right = new FormAttachment(100, -margin);
        wXmlConf.setLayoutData(fdXmlConf);

        // ///////////////////////////////////////////////////////////
        // / END OF XmlConf Field GROUP
        // ///////////////////////////////////////////////////////////      

        // ///////////////////////////////
        // START OF Additional Fields GROUP  //
        ///////////////////////////////// 

        wAdditionalFields = new Group(wContentComp, SWT.SHADOW_NONE);
        props.setLook(wAdditionalFields);
        wAdditionalFields.setText(Messages.getString("GetXMLDataDialog.wAdditionalFields.Label"));

        FormLayout AdditionalFieldsgroupLayout = new FormLayout();
        AdditionalFieldsgroupLayout.marginWidth = 10;
        AdditionalFieldsgroupLayout.marginHeight = 10;
        wAdditionalFields.setLayout(AdditionalFieldsgroupLayout);

        wlInclFilename = new Label(wAdditionalFields, SWT.RIGHT);
        wlInclFilename.setText(Messages.getString("GetXMLDataDialog.InclFilename.Label"));
        props.setLook(wlInclFilename);
        fdlInclFilename = new FormData();
        fdlInclFilename.left = new FormAttachment(0, 0);
        fdlInclFilename.top = new FormAttachment(wXmlConf, 4 * margin);
        fdlInclFilename.right = new FormAttachment(middle, -margin);
        wlInclFilename.setLayoutData(fdlInclFilename);
        wInclFilename = new Button(wAdditionalFields, SWT.CHECK);
        props.setLook(wInclFilename);
        wInclFilename.setToolTipText(Messages.getString("GetXMLDataDialog.InclFilename.Tooltip"));
        fdInclFilename = new FormData();
        fdInclFilename.left = new FormAttachment(middle, 0);
        fdInclFilename.top = new FormAttachment(wXmlConf, 4 * margin);
        wInclFilename.setLayoutData(fdInclFilename);

        wlInclFilenameField = new Label(wAdditionalFields, SWT.LEFT);
        wlInclFilenameField.setText(Messages.getString("GetXMLDataDialog.InclFilenameField.Label"));
        props.setLook(wlInclFilenameField);
        fdlInclFilenameField = new FormData();
        fdlInclFilenameField.left = new FormAttachment(wInclFilename, margin);
        fdlInclFilenameField.top = new FormAttachment(wLimit, 4 * margin);
        wlInclFilenameField.setLayoutData(fdlInclFilenameField);
        wInclFilenameField = new TextVar(transMeta, wAdditionalFields, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wInclFilenameField);
        wInclFilenameField.addModifyListener(lsMod);
        fdInclFilenameField = new FormData();
        fdInclFilenameField.left = new FormAttachment(wlInclFilenameField, margin);
        fdInclFilenameField.top = new FormAttachment(wLimit, 4 * margin);
        fdInclFilenameField.right = new FormAttachment(100, 0);
        wInclFilenameField.setLayoutData(fdInclFilenameField);

        wlInclRownum = new Label(wAdditionalFields, SWT.RIGHT);
        wlInclRownum.setText(Messages.getString("GetXMLDataDialog.InclRownum.Label"));
        props.setLook(wlInclRownum);
        fdlInclRownum = new FormData();
        fdlInclRownum.left = new FormAttachment(0, 0);
        fdlInclRownum.top = new FormAttachment(wInclFilenameField, margin);
        fdlInclRownum.right = new FormAttachment(middle, -margin);
        wlInclRownum.setLayoutData(fdlInclRownum);
        wInclRownum = new Button(wAdditionalFields, SWT.CHECK);
        props.setLook(wInclRownum);
        wInclRownum.setToolTipText(Messages.getString("GetXMLDataDialog.InclRownum.Tooltip"));
        fdRownum = new FormData();
        fdRownum.left = new FormAttachment(middle, 0);
        fdRownum.top = new FormAttachment(wInclFilenameField, margin);
        wInclRownum.setLayoutData(fdRownum);

        wlInclRownumField = new Label(wAdditionalFields, SWT.RIGHT);
        wlInclRownumField.setText(Messages.getString("GetXMLDataDialog.InclRownumField.Label"));
        props.setLook(wlInclRownumField);
        fdlInclRownumField = new FormData();
        fdlInclRownumField.left = new FormAttachment(wInclRownum, margin);
        fdlInclRownumField.top = new FormAttachment(wInclFilenameField, margin);
        wlInclRownumField.setLayoutData(fdlInclRownumField);
        wInclRownumField = new TextVar(transMeta, wAdditionalFields, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wInclRownumField);
        wInclRownumField.addModifyListener(lsMod);
        fdInclRownumField = new FormData();
        fdInclRownumField.left = new FormAttachment(wlInclRownumField, margin);
        fdInclRownumField.top = new FormAttachment(wInclFilenameField, margin);
        fdInclRownumField.right = new FormAttachment(100, 0);
        wInclRownumField.setLayoutData(fdInclRownumField);

        fdAdditionalFields = new FormData();
        fdAdditionalFields.left = new FormAttachment(0, margin);
        fdAdditionalFields.top = new FormAttachment(wXmlConf, margin);
        fdAdditionalFields.right = new FormAttachment(100, -margin);
        wAdditionalFields.setLayoutData(fdAdditionalFields);

        // ///////////////////////////////////////////////////////////
        // / END OF Additional Fields GROUP
        // ///////////////////////////////////////////////////////////   

        // ///////////////////////////////
        // START OF AddFileResult GROUP  //
        ///////////////////////////////// 

        wAddFileResult = new Group(wContentComp, SWT.SHADOW_NONE);
        props.setLook(wAddFileResult);
        wAddFileResult.setText(Messages.getString("GetXMLDataDialog.wAddFileResult.Label"));

        FormLayout AddFileResultgroupLayout = new FormLayout();
        AddFileResultgroupLayout.marginWidth = 10;
        AddFileResultgroupLayout.marginHeight = 10;
        wAddFileResult.setLayout(AddFileResultgroupLayout);

        wlAddResult = new Label(wAddFileResult, SWT.RIGHT);
        wlAddResult.setText(Messages.getString("GetXMLDataDialog.AddResult.Label"));
        props.setLook(wlAddResult);
        fdlAddResult = new FormData();
        fdlAddResult.left = new FormAttachment(0, 0);
        fdlAddResult.top = new FormAttachment(wAdditionalFields, margin);
        fdlAddResult.right = new FormAttachment(middle, -margin);
        wlAddResult.setLayoutData(fdlAddResult);
        wAddResult = new Button(wAddFileResult, SWT.CHECK);
        props.setLook(wAddResult);
        wAddResult.setToolTipText(Messages.getString("GetXMLDataDialog.AddResult.Tooltip"));
        fdAddResult = new FormData();
        fdAddResult.left = new FormAttachment(middle, 0);
        fdAddResult.top = new FormAttachment(wAdditionalFields, margin);
        wAddResult.setLayoutData(fdAddResult);

        fdAddFileResult = new FormData();
        fdAddFileResult.left = new FormAttachment(0, margin);
        fdAddFileResult.top = new FormAttachment(wAdditionalFields, margin);
        fdAddFileResult.right = new FormAttachment(100, -margin);
        wAddFileResult.setLayoutData(fdAddFileResult);

        // ///////////////////////////////////////////////////////////
        // / END OF AddFileResult GROUP
        // ///////////////////////////////////////////////////////////   

        fdContentComp = new FormData();
        fdContentComp.left = new FormAttachment(0, 0);
        fdContentComp.top = new FormAttachment(0, 0);
        fdContentComp.right = new FormAttachment(100, 0);
        fdContentComp.bottom = new FormAttachment(100, 0);
        wContentComp.setLayoutData(fdContentComp);

        wContentComp.layout();
        wContentTab.setControl(wContentComp);

        // ///////////////////////////////////////////////////////////
        // / END OF CONTENT TAB
        // ///////////////////////////////////////////////////////////

        // Fields tab...
        //
        wFieldsTab = new CTabItem(wTabFolder, SWT.NONE);
        wFieldsTab.setText(Messages.getString("GetXMLDataDialog.Fields.Tab"));

        FormLayout fieldsLayout = new FormLayout();
        fieldsLayout.marginWidth = Const.FORM_MARGIN;
        fieldsLayout.marginHeight = Const.FORM_MARGIN;

        wFieldsComp = new Composite(wTabFolder, SWT.NONE);
        wFieldsComp.setLayout(fieldsLayout);
        props.setLook(wFieldsComp);

        wGet = new Button(wFieldsComp, SWT.PUSH);
        wGet.setText(Messages.getString("GetXMLDataDialog.GetFields.Button"));
        fdGet = new FormData();
        fdGet.left = new FormAttachment(50, 0);
        fdGet.bottom = new FormAttachment(100, 0);
        wGet.setLayoutData(fdGet);

        final int FieldsRows = input.getInputFields().length;

        ColumnInfo[] colinf = new ColumnInfo[] {
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Name.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.XPath.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Element.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, GetXMLDataField.ElementTypeDesc, true),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Type.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMeta.getTypes(), true),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Format.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, Const.getConversionFormats()),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Length.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Precision.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Currency.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Decimal.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Group.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.TrimType.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, GetXMLDataField.trimTypeDesc, true),
                new ColumnInfo(Messages.getString("GetXMLDataDialog.FieldsTable.Repeat.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, new String[] { Messages.getString("System.Combo.Yes"),
                                Messages.getString("System.Combo.No") },
                        true),

        };

        colinf[0].setUsingVariables(true);
        colinf[0].setToolTip(Messages.getString("GetXMLDataDialog.FieldsTable.Name.Column.Tooltip"));
        colinf[1].setUsingVariables(true);
        colinf[1].setToolTip(Messages.getString("GetXMLDataDialog.FieldsTable.XPath.Column.Tooltip"));

        wFields = new TableView(transMeta, wFieldsComp, SWT.FULL_SELECTION | SWT.MULTI, colinf, FieldsRows, lsMod,
                props);

        fdFields = new FormData();
        fdFields.left = new FormAttachment(0, 0);
        fdFields.top = new FormAttachment(0, 0);
        fdFields.right = new FormAttachment(100, 0);
        fdFields.bottom = new FormAttachment(wGet, -margin);
        wFields.setLayoutData(fdFields);

        fdFieldsComp = new FormData();
        fdFieldsComp.left = new FormAttachment(0, 0);
        fdFieldsComp.top = new FormAttachment(0, 0);
        fdFieldsComp.right = new FormAttachment(100, 0);
        fdFieldsComp.bottom = new FormAttachment(100, 0);
        wFieldsComp.setLayoutData(fdFieldsComp);

        wFieldsComp.layout();
        wFieldsTab.setControl(wFieldsComp);

        fdTabFolder = new FormData();
        fdTabFolder.left = new FormAttachment(0, 0);
        fdTabFolder.top = new FormAttachment(wStepname, margin);
        fdTabFolder.right = new FormAttachment(100, 0);
        fdTabFolder.bottom = new FormAttachment(100, -50);
        wTabFolder.setLayoutData(fdTabFolder);

        wOK = new Button(shell, SWT.PUSH);
        wOK.setText(Messages.getString("System.Button.OK"));

        wPreview = new Button(shell, SWT.PUSH);
        wPreview.setText(Messages.getString("GetXMLDataDialog.Button.PreviewRows"));

        wCancel = new Button(shell, SWT.PUSH);
        wCancel.setText(Messages.getString("System.Button.Cancel"));

        setButtonPositions(new Button[] { wOK, wPreview, wCancel }, margin, wTabFolder);

        // Add listeners
        lsOK = new Listener() {
            public void handleEvent(Event e) {
                ok();
            }
        };
        lsGet = new Listener() {
            public void handleEvent(Event e) {
                get();
            }
        };
        lsPreview = new Listener() {
            public void handleEvent(Event e) {
                preview();
            }
        };
        lsCancel = new Listener() {
            public void handleEvent(Event e) {
                cancel();
            }
        };

        wOK.addListener(SWT.Selection, lsOK);
        wGet.addListener(SWT.Selection, lsGet);
        wPreview.addListener(SWT.Selection, lsPreview);
        wCancel.addListener(SWT.Selection, lsCancel);

        lsDef = new SelectionAdapter() {
            public void widgetDefaultSelected(SelectionEvent e) {
                ok();
            }
        };

        wStepname.addSelectionListener(lsDef);
        wLimit.addSelectionListener(lsDef);
        wInclRownumField.addSelectionListener(lsDef);
        wInclFilenameField.addSelectionListener(lsDef);

        // Add the file to the list of files...
        SelectionAdapter selA = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                wFilenameList.add(new String[] { wFilename.getText(), wFilemask.getText() });
                wFilename.setText("");
                wFilemask.setText("");
                wFilenameList.removeEmptyRows();
                wFilenameList.setRowNums();
                wFilenameList.optWidth(true);
            }
        };
        wbaFilename.addSelectionListener(selA);
        wFilename.addSelectionListener(selA);

        // Delete files from the list of files...
        wbdFilename.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                int idx[] = wFilenameList.getSelectionIndices();
                wFilenameList.remove(idx);
                wFilenameList.removeEmptyRows();
                wFilenameList.setRowNums();
            }
        });

        // Edit the selected file & remove from the list...
        wbeFilename.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                int idx = wFilenameList.getSelectionIndex();
                if (idx >= 0) {
                    String string[] = wFilenameList.getItem(idx);
                    wFilename.setText(string[0]);
                    wFilemask.setText(string[1]);
                    wFilenameList.remove(idx);
                }
                wFilenameList.removeEmptyRows();
                wFilenameList.setRowNums();
            }
        });

        // Show the files that are selected at this time...
        wbShowFiles.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                try {
                    GetXMLDataMeta tfii = new GetXMLDataMeta();
                    getInfo(tfii);
                    FileInputList fileInputList = tfii.getFiles(transMeta);
                    String files[] = fileInputList.getFileStrings();
                    if (files != null && files.length > 0) {
                        EnterSelectionDialog esd = new EnterSelectionDialog(shell, files,
                                Messages.getString("GetXMLDataDialog.FilesReadSelection.DialogTitle"),
                                Messages.getString("GetXMLDataDialog.FilesReadSelection.DialogMessage"));
                        esd.setViewOnly();
                        esd.open();
                    } else {
                        MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
                        mb.setMessage(Messages.getString("GetXMLDataDialog.NoFileFound.DialogMessage"));
                        mb.setText(Messages.getString("System.Dialog.Error.Title"));
                        mb.open();
                    }
                } catch (KettleException ex) {
                    new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.ErrorParsingData.DialogTitle"),
                            Messages.getString("GetXMLDataDialog.ErrorParsingData.DialogMessage"), ex);
                }
            }
        });
        // Enable/disable the right fields to allow a filename to be added to each row...
        wInclFilename.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setIncludeFilename();
            }
        });

        // Enable/disable the right fields to allow a row number to be added to each row...
        wInclRownum.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setIncludeRownum();
            }
        });

        // Whenever something changes, set the tooltip to the expanded version of the filename:
        wFilename.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                wFilename.setToolTipText(wFilename.getText());
            }
        });

        // Listen to the Browse... button
        wbbFilename.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (wFilemask.getText() != null && wFilemask.getText().length() > 0) // A mask: a directory!
                {
                    DirectoryDialog dialog = new DirectoryDialog(shell, SWT.OPEN);
                    if (wFilename.getText() != null) {
                        String fpath = transMeta.environmentSubstitute(wFilename.getText());
                        dialog.setFilterPath(fpath);
                    }

                    if (dialog.open() != null) {
                        String str = dialog.getFilterPath();
                        wFilename.setText(str);
                    }
                } else {
                    FileDialog dialog = new FileDialog(shell, SWT.OPEN);
                    dialog.setFilterExtensions(new String[] { "*.xml;*.XML", "*" });
                    if (wFilename.getText() != null) {
                        String fname = transMeta.environmentSubstitute(wFilename.getText());
                        dialog.setFileName(fname);
                    }

                    dialog.setFilterNames(new String[] { Messages.getString("System.FileType.XMLFiles"),
                            Messages.getString("System.FileType.AllFiles") });

                    if (dialog.open() != null) {
                        String str = dialog.getFilterPath() + System.getProperty("file.separator")
                                + dialog.getFileName();
                        wFilename.setText(str);
                    }
                }
            }
        });

        // Detect X or ALT-F4 or something that kills this window...
        shell.addShellListener(new ShellAdapter() {
            public void shellClosed(ShellEvent e) {
                cancel();
            }
        });

        wTabFolder.setSelection(0);

        // Set the shell size, based upon previous time...
        setSize();
        getData(input);
        ActiveXmlStreamField();
        setIncludeFilename();
        setIncludeRownum();
        input.setChanged(changed);
        wFields.optWidth(true);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        return stepname;
    }

    private void setXMLStreamField() {
        try {

            wXMLField.removeAll();

            RowMetaInterface r = transMeta.getPrevStepFields(stepname);
            if (r != null) {
                r.getFieldNames();

                for (int i = 0; i < r.getFieldNames().length; i++) {
                    wXMLField.add(r.getFieldNames()[i]);

                }
            }
        } catch (KettleException ke) {
            new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.FailedToGetFields.DialogTitle"), //$NON-NLS-1$
                    Messages.getString("GetXMLDataDialog.FailedToGetFields.DialogMessage"), ke); //$NON-NLS-1$
        }
    }

    private void ActiveXmlStreamField() {
        wlXMLField.setEnabled(wXMLStreamField.getSelection());
        wXMLField.setEnabled(wXMLStreamField.getSelection());
        wlXMLIsAFile.setEnabled(wXMLStreamField.getSelection());
        wXMLIsAFile.setEnabled(wXMLStreamField.getSelection());
        wlreadUrl.setEnabled(wXMLStreamField.getSelection());
        wreadUrl.setEnabled(wXMLStreamField.getSelection());

        wlFilename.setEnabled(!wXMLStreamField.getSelection());
        wbbFilename.setEnabled(!wXMLStreamField.getSelection());
        wbaFilename.setEnabled(!wXMLStreamField.getSelection());
        wFilename.setEnabled(!wXMLStreamField.getSelection());
        wlFilemask.setEnabled(!wXMLStreamField.getSelection());
        wFilemask.setEnabled(!wXMLStreamField.getSelection());
        wlFilenameList.setEnabled(!wXMLStreamField.getSelection());
        wbdFilename.setEnabled(!wXMLStreamField.getSelection());
        wbeFilename.setEnabled(!wXMLStreamField.getSelection());
        wbShowFiles.setEnabled(!wXMLStreamField.getSelection());
        wlFilenameList.setEnabled(!wXMLStreamField.getSelection());
        wFilenameList.setEnabled(!wXMLStreamField.getSelection());
        wInclFilename.setEnabled(!wXMLStreamField.getSelection());
        wlInclFilename.setEnabled(!wXMLStreamField.getSelection());

        if (wXMLStreamField.getSelection()) {
            wInclFilename.setSelection(false);
            wlInclFilenameField.setEnabled(false);
            wInclFilenameField.setEnabled(false);
        } else {
            wlInclFilenameField.setEnabled(wInclFilename.getSelection());
            wInclFilenameField.setEnabled(wInclFilename.getSelection());
        }

        if (wXMLStreamField.getSelection() && !wXMLIsAFile.getSelection()) {
            wEncoding.setEnabled(false);
            wlEncoding.setEnabled(false);
        } else {
            wEncoding.setEnabled(true);
            wlEncoding.setEnabled(true);
        }
        wAddResult.setEnabled(!wXMLStreamField.getSelection());
        wlAddResult.setEnabled(!wXMLStreamField.getSelection());
        wLimit.setEnabled(!wXMLStreamField.getSelection());
        wlLimit.setEnabled(!wXMLStreamField.getSelection());
        wPreview.setEnabled(!wXMLStreamField.getSelection());
        wGet.setEnabled(!wXMLStreamField.getSelection());
        wbbLoopPathList.setEnabled(!wXMLStreamField.getSelection());
        wPrunePath.setEnabled(!wXMLStreamField.getSelection());
        wlPrunePath.setEnabled(!wXMLStreamField.getSelection());
    }

    @SuppressWarnings("unchecked")
    private void getLoopPathList() {
        try {
            GetXMLDataMeta meta = new GetXMLDataMeta();
            getInfo(meta);
            FileInputList fileinputList = meta.getFiles(transMeta);

            if (fileinputList.nrOfFiles() > 0) {
                // Check the first file

                if (fileinputList.getFile(0).exists()) {
                    listpath.clear();
                    // get encoding. By default UTF-8
                    String encoding = "UTF-8";
                    if (!Const.isEmpty(meta.getEncoding()))
                        encoding = meta.getEncoding();
                    SAXReader reader = new SAXReader();
                    Document document = reader.read(KettleVFS.getInputStream(fileinputList.getFile(0)), encoding);
                    List<Node> nodes = document.selectNodes(document.getRootElement().getName());

                    for (Node node : nodes) {
                        if (!listpath.contains(node.getPath())) {
                            listpath.add(node.getPath());
                            addLoopXPath(node);
                        }
                    }
                    String[] list_xpath = (String[]) listpath.toArray(new String[listpath.size()]);

                    EnterSelectionDialog dialog = new EnterSelectionDialog(shell, list_xpath,
                            Messages.getString("GetXMLDataDialog.Dialog.SelectALoopPath.Title"),
                            Messages.getString("GetXMLDataDialog.Dialog.SelectALoopPath.Message"));
                    String listxpaths = dialog.open();

                    if (listxpaths != null)
                        wLoopXPath.setText(listxpaths);

                } else {
                    // The file not exists !
                    throw new KettleException(Messages.getString("GetXMLDataDialog.Exception.FileDoesNotExist",
                            KettleVFS.getFilename(fileinputList.getFile(0))));
                }
            }

            else {
                // No file specified
                MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
                mb.setMessage(Messages.getString("GetXMLDataDialog.FilesMissing.DialogMessage"));
                mb.setText(Messages.getString("System.Dialog.Error.Title"));
                mb.open();
            }
        } catch (Exception e) {
            new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.UnableToGetListOfPaths.Title"),
                    Messages.getString("GetXMLDataDialog.UnableToGetListOfPaths.Message"), e);
        }
    }

    @SuppressWarnings("unchecked")
    private void get() {
        try {
            list.clear();
            GetXMLDataMeta meta = new GetXMLDataMeta();
            getInfo(meta);

            //    check if the path is given 
            if (!checkLoopXPath(meta))
                return;

            FileInputList inputList = meta.getFiles(transMeta);

            if (inputList.getFiles().size() > 0) {
                wFields.removeAll();
                // get encoding. By default UTF-8
                String encoding = "UTF-8";
                if (!Const.isEmpty(meta.getEncoding())) {
                    encoding = meta.getEncoding();
                }

                SAXReader reader = new SAXReader();
                Document document = reader.read(KettleVFS.getInputStream(inputList.getFile(0)), encoding);
                String realXPath = transMeta.environmentSubstitute(meta.getLoopXPath());
                List<Node> nodes = document.selectNodes(realXPath);
                String realXPathCleaned = cleanLoopXpath(realXPath);
                for (Node node : nodes) {
                    setNodeField(node, realXPathCleaned);
                    ChildNode(node, realXPath, realXPathCleaned);
                }

                wFields.removeEmptyRows();
                wFields.setRowNums();
                wFields.optWidth(true);
            }
        } catch (Exception e) {
            new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.ErrorParsingData.DialogTitle"),
                    Messages.getString("GetXMLDataDialog.ErrorParsingData.DialogMessage"), e);
        }
    }

    private void ChildNode(Node node, String realXPath, String realXPathCleaned) {
        Element ce = (Element) node;
        // List child 
        for (int j = 0; j < ce.nodeCount(); j++) {
            Node cnode = ce.node(j);
            if (!Const.isEmpty(cnode.getName())) {
                Element cce = (Element) cnode;
                if (cce.nodeCount() > 1) {
                    if (Const.getOccurenceString(cnode.asXML(), "/>") <= 1) {
                        // We do not have child nodes ...
                        setNodeField(cnode, realXPathCleaned);
                    } else {
                        // let's get child nodes
                        ChildNode(cnode, realXPath, realXPathCleaned);
                    }
                } else {
                    setNodeField(cnode, realXPathCleaned);
                }
            }
        }
    }

    private void addLoopXPath(Node node) {
        Element ce = (Element) node;

        // List child 
        for (int j = 0; j < ce.nodeCount(); j++) {
            Node cnode = ce.node(j);

            if (!Const.isEmpty(cnode.getName())) {
                Element cce = (Element) cnode;
                if (!listpath.contains(cnode.getPath()))
                    listpath.add(cnode.getPath());
                // let's get child nodes
                if (cce.nodeCount() > 1)
                    addLoopXPath(cnode);
            }
        }
    }

    private void setAttributeField(Attribute attribute, String realXPathCleaned) {
        // Get Attribute Name
        String attributname = attribute.getName();
        String attributnametxt = cleanString(attribute.getPath(), realXPathCleaned);
        if (!Const.isEmpty(attributnametxt) && !list.contains(attribute.getPath())) {
            TableItem item = new TableItem(wFields.table, SWT.NONE);
            item.setText(1, attributname);
            item.setText(2, attributnametxt);
            item.setText(3, GetXMLDataField.ElementTypeDesc[0]);

            // Get attribute value
            String valueAttr = attribute.getText();

            // Try to get the Type
            if (IsDate(valueAttr)) {
                item.setText(4, "Date");
                item.setText(5, "yyyy/MM/dd");

            } else if (IsInteger(valueAttr))
                item.setText(4, "Integer");
            else if (IsNumber(valueAttr))
                item.setText(4, "Number");
            else
                item.setText(4, "String");
            list.add(attribute.getPath());
        } // end if

    }

    private String cleanString(String inputstring, String realXPathCleaned) {
        String retval = inputstring;
        retval = retval.replace(realXPathCleaned, "");
        while (retval.startsWith("/")) {
            retval = retval.substring(1, retval.length());
        }

        return retval;
    }

    @SuppressWarnings("unchecked")
    private void setNodeField(Node node, String realXPathCleaned) {
        Element e = (Element) node;
        // get all attributes
        List<Attribute> lista = e.attributes();
        for (int i = 0; i < lista.size(); i++) {
            setAttributeField(lista.get(i), realXPathCleaned);
        }

        // Get Node Name
        String nodename = node.getName();
        String nodenametxt = cleanString(node.getPath(), realXPathCleaned);

        if (!Const.isEmpty(nodenametxt) && !list.contains(nodenametxt)) {
            TableItem item = new TableItem(wFields.table, SWT.NONE);
            item.setText(1, nodename);
            item.setText(2, nodenametxt);
            item.setText(3, GetXMLDataField.ElementTypeDesc[0]);

            // Get Node value
            String valueNode = node.getText();

            // Try to get the Type
            if (IsDate(valueNode)) {
                item.setText(4, "Date");
                item.setText(5, "yyyy/MM/dd");
            } else if (IsInteger(valueNode))
                item.setText(4, "Integer");
            else if (IsNumber(valueNode))
                item.setText(4, "Number");
            else
                item.setText(4, "String");

            list.add(nodenametxt);

        } // end if
    }

    private boolean IsInteger(String str) {
        try {
            Integer.parseInt(str);
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }

    private boolean IsNumber(String str) {
        try {
            Float.parseFloat(str);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    private boolean IsDate(String str) {
        // TODO: What about other dates? Maybe something for a CRQ
        try {
            SimpleDateFormat fdate = new SimpleDateFormat("yyyy/MM/dd");
            fdate.setLenient(false);
            fdate.parse(str);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    private void setEncodings() {
        // Encoding of the text file:
        if (!gotEncodings) {
            gotEncodings = true;

            wEncoding.removeAll();
            ArrayList<Charset> values = new ArrayList<Charset>(Charset.availableCharsets().values());
            for (int i = 0; i < values.size(); i++) {
                Charset charSet = (Charset) values.get(i);
                wEncoding.add(charSet.displayName());
            }

            // Now select the default!
            String defEncoding = Const.getEnvironmentVariable("file.encoding", "UTF-8");
            int idx = Const.indexOfString(defEncoding, wEncoding.getItems());
            if (idx >= 0)
                wEncoding.select(idx);
        }
    }

    public void setIncludeFilename() {
        wlInclFilenameField.setEnabled(wInclFilename.getSelection());
        wInclFilenameField.setEnabled(wInclFilename.getSelection());
    }

    public void setIncludeRownum() {
        wlInclRownumField.setEnabled(wInclRownum.getSelection());
        wInclRownumField.setEnabled(wInclRownum.getSelection());
    }

    /**
     * Read the data from the TextFileInputMeta object and show it in this dialog.
     * 
     * @param in The TextFileInputMeta object to obtain the data from.
     */
    public void getData(GetXMLDataMeta in) {
        if (in.getFileName() != null) {
            wFilenameList.removeAll();
            for (int i = 0; i < in.getFileName().length; i++) {
                wFilenameList.add(new String[] { in.getFileName()[i], in.getFileMask()[i],
                        in.getRequiredFilesDesc(in.getFileRequired()[i]) });
            }

            wFilenameList.removeEmptyRows();
            wFilenameList.setRowNums();
            wFilenameList.optWidth(true);
        }
        wInclFilename.setSelection(in.includeFilename());
        wInclRownum.setSelection(in.includeRowNumber());
        wAddResult.setSelection(in.addResultFile());
        wNameSpaceAware.setSelection(in.isNamespaceAware());
        wreadUrl.setSelection(in.isReadUrl());
        wIgnoreComment.setSelection(in.isIgnoreComments());
        wValidating.setSelection(in.isValidating());
        wuseToken.setSelection(in.isuseToken());
        wIgnoreEmptyFile.setSelection(in.isIgnoreEmptyFile());
        wdoNotFailIfNoFile.setSelection(in.isdoNotFailIfNoFile());
        wXMLStreamField.setSelection(in.isInFields());
        wXMLIsAFile.setSelection(in.getIsAFile());

        if (in.getXMLField() != null)
            wXMLField.setText(in.getXMLField());

        if (in.getFilenameField() != null)
            wInclFilenameField.setText(in.getFilenameField());
        if (in.getRowNumberField() != null)
            wInclRownumField.setText(in.getRowNumberField());
        wLimit.setText("" + in.getRowLimit());
        if (in.getPrunePath() != null)
            wPrunePath.setText(in.getPrunePath());
        if (in.getLoopXPath() != null)
            wLoopXPath.setText(in.getLoopXPath());
        if (in.getEncoding() != null) {
            wEncoding.setText("" + in.getEncoding());
        } else {
            wEncoding.setText("UTF-8");
        }

        log.logDebug(toString(), Messages.getString("GetXMLDataDialog.Log.GettingFieldsInfo"));
        for (int i = 0; i < in.getInputFields().length; i++) {
            GetXMLDataField field = in.getInputFields()[i];

            if (field != null) {
                TableItem item = wFields.table.getItem(i);
                String name = field.getName();
                String xpath = field.getXPath();
                String element = field.getElementTypeDesc();
                String type = field.getTypeDesc();
                String format = field.getFormat();
                String length = "" + field.getLength();
                String prec = "" + field.getPrecision();
                String curr = field.getCurrencySymbol();
                String group = field.getGroupSymbol();
                String decim = field.getDecimalSymbol();
                String trim = field.getTrimTypeDesc();
                String rep = field.isRepeated() ? Messages.getString("System.Combo.Yes")
                        : Messages.getString("System.Combo.No");

                if (name != null)
                    item.setText(1, name);
                if (xpath != null)
                    item.setText(2, xpath);
                if (element != null)
                    item.setText(3, element);
                if (type != null)
                    item.setText(4, type);
                if (format != null)
                    item.setText(5, format);
                if (length != null && !"-1".equals(length))
                    item.setText(7, length);
                if (prec != null && !"-1".equals(prec))
                    item.setText(8, prec);
                if (curr != null)
                    item.setText(8, curr);
                if (decim != null)
                    item.setText(9, decim);
                if (group != null)
                    item.setText(10, group);
                if (trim != null)
                    item.setText(11, trim);
                if (rep != null)
                    item.setText(12, rep);

            }
        }

        wFields.removeEmptyRows();
        wFields.setRowNums();
        wFields.optWidth(true);

        wStepname.selectAll();
    }

    private void cancel() {
        stepname = null;
        input.setChanged(changed);
        dispose();
    }

    private void ok() {
        try {
            getInfo(input);
        } catch (KettleException e) {
            new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.ErrorParsingData.DialogTitle"),
                    Messages.getString("GetXMLDataDialog.ErrorParsingData.DialogMessage"), e);
        }
        dispose();
    }

    private void getInfo(GetXMLDataMeta in) throws KettleException {
        stepname = wStepname.getText(); // return value

        // copy info to TextFileInputMeta class (input)
        in.setRowLimit(Const.toLong(wLimit.getText(), 0L));
        in.setPrunePath(wPrunePath.getText());
        in.setLoopXPath(wLoopXPath.getText());
        in.setEncoding(wEncoding.getText());
        in.setFilenameField(wInclFilenameField.getText());
        in.setRowNumberField(wInclRownumField.getText());
        in.setAddResultFile(wAddResult.getSelection());
        in.setIncludeFilename(wInclFilename.getSelection());
        in.setIncludeRowNumber(wInclRownum.getSelection());
        in.setNamespaceAware(wNameSpaceAware.getSelection());
        in.setReadUrl(wreadUrl.getSelection());
        in.setIgnoreComments(wIgnoreComment.getSelection());
        in.setValidating(wValidating.getSelection());
        in.setuseToken(wuseToken.getSelection());
        in.setIgnoreEmptyFile(wIgnoreEmptyFile.getSelection());
        in.setdoNotFailIfNoFile(wdoNotFailIfNoFile.getSelection());

        in.setInFields(wXMLStreamField.getSelection());
        in.setIsAFile(wXMLIsAFile.getSelection());
        in.setXMLField(wXMLField.getText());

        int nrFiles = wFilenameList.getItemCount();
        int nrFields = wFields.nrNonEmpty();

        in.allocate(nrFiles, nrFields);
        in.setFileName(wFilenameList.getItems(0));
        in.setFileMask(wFilenameList.getItems(1));
        in.setFileRequired(wFilenameList.getItems(2));

        for (int i = 0; i < nrFields; i++) {
            GetXMLDataField field = new GetXMLDataField();

            TableItem item = wFields.getNonEmpty(i);

            field.setName(item.getText(1));
            field.setXPath(item.getText(2));
            field.setElementType(GetXMLDataField.getElementTypeByDesc(item.getText(3)));
            field.setType(ValueMeta.getType(item.getText(4)));
            field.setFormat(item.getText(5));
            field.setLength(Const.toInt(item.getText(6), -1));
            field.setPrecision(Const.toInt(item.getText(7), -1));
            field.setCurrencySymbol(item.getText(8));
            field.setDecimalSymbol(item.getText(9));
            field.setGroupSymbol(item.getText(10));
            field.setTrimType(GetXMLDataField.getTrimTypeByDesc(item.getText(11)));
            field.setRepeated(Messages.getString("System.Combo.Yes").equalsIgnoreCase(item.getText(12)));

            in.getInputFields()[i] = field;
        }
    }

    // check if the loop xpath is given
    private boolean checkLoopXPath(GetXMLDataMeta meta) {
        if (meta.getLoopXPath() == null || meta.getLoopXPath().length() < 1) {
            MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
            mb.setMessage(Messages.getString("GetXMLDataDialog.SpecifyRepeatingElement.DialogMessage"));
            mb.setText(Messages.getString("System.Dialog.Error.Title"));
            mb.open();
            return false;
        } else {
            return true;
        }
    }

    // Preview the data
    private void preview() {
        try {
            // Create the XML input step
            GetXMLDataMeta oneMeta = new GetXMLDataMeta();
            getInfo(oneMeta);

            // check if the path is given
            if (!checkLoopXPath(oneMeta))
                return;
            TransMeta previewMeta = TransPreviewFactory.generatePreviewTransformation(transMeta, oneMeta,
                    wStepname.getText());

            EnterNumberDialog numberDialog = new EnterNumberDialog(shell, props.getDefaultPreviewSize(),
                    Messages.getString("GetXMLDataDialog.NumberRows.DialogTitle"),
                    Messages.getString("GetXMLDataDialog.NumberRows.DialogMessage"));

            int previewSize = numberDialog.open();
            if (previewSize > 0) {
                TransPreviewProgressDialog progressDialog = new TransPreviewProgressDialog(shell, previewMeta,
                        new String[] { wStepname.getText() }, new int[] { previewSize });
                progressDialog.open();

                if (!progressDialog.isCancelled()) {
                    Trans trans = progressDialog.getTrans();
                    String loggingText = progressDialog.getLoggingText();

                    if (trans.getResult() != null && trans.getResult().getNrErrors() > 0) {
                        EnterTextDialog etd = new EnterTextDialog(shell,
                                Messages.getString("System.Dialog.PreviewError.Title"),
                                Messages.getString("System.Dialog.PreviewError.Message"), loggingText, true);
                        etd.setReadOnly();
                        etd.open();
                    }
                    PreviewRowsDialog prd = new PreviewRowsDialog(shell, transMeta, SWT.NONE, wStepname.getText(),
                            progressDialog.getPreviewRowsMeta(wStepname.getText()),
                            progressDialog.getPreviewRows(wStepname.getText()), loggingText);
                    prd.open();
                }
            }
        } catch (KettleException e) {
            new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.ErrorPreviewingData.DialogTitle"),
                    Messages.getString("GetXMLDataDialog.ErrorPreviewingData.DialogMessage"), e);
        }
    }

    private String cleanLoopXpath(String realXPath) {
        StringBuffer buffer = new StringBuffer();
        String open = "[";
        String close = "]";
        String rest = realXPath;

        // search for opening string
        int i = rest.indexOf(open);
        while (i > -1) {
            int j = rest.indexOf(close, i + open.length());
            // search for closing string
            if (j > -1) {
                buffer.append(rest.substring(0, i));
                rest = rest.substring(j + close.length());
            } else {
                // no closing tag found; end the search
                buffer.append(rest);
                rest = "";
            }
            // keep searching
            i = rest.indexOf(open);
        }
        buffer.append(rest);
        return buffer.toString();
    }

    public String toString() {
        return this.getClass().getName();
    }
}