Coverage Report - us.paulevans.basicxslt.BasicXSLTFrame
 
Classes in this File Line Coverage Branch Coverage Complexity
BasicXSLTFrame
0%
0/699
0%
0/99
0
BasicXSLTFrame$1
0%
0/3
N/A
0
 
 1  
 /*
 2  
         Copyright 2006 Paul Evans 
 3  
 
 4  
         Licensed under the Apache License, Version 2.0 (the "License"); 
 5  
         you may not use this file except in compliance with the License. 
 6  
         You may obtain a copy of the License at 
 7  
 
 8  
                 http://www.apache.org/licenses/LICENSE-2.0 
 9  
 
 10  
         Unless required by applicable law or agreed to in writing, software 
 11  
         distributed under the License is distributed on an "AS IS" BASIS, 
 12  
         WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 13  
         See the License for the specific language governing permissions and 
 14  
         limitations under the License.
 15  
  */
 16  
 package us.paulevans.basicxslt;
 17  
 
 18  
 import java.awt.BorderLayout;
 19  
 import java.awt.Color;
 20  
 import java.awt.Component;
 21  
 import java.awt.Cursor;
 22  
 import java.awt.FlowLayout;
 23  
 import java.awt.Font;
 24  
 import java.awt.GridBagConstraints;
 25  
 import java.awt.GridBagLayout;
 26  
 import java.awt.event.ActionEvent;
 27  
 import java.awt.event.ActionListener;
 28  
 import java.awt.event.WindowAdapter;
 29  
 import java.awt.event.WindowEvent;
 30  
 import java.io.File;
 31  
 import java.io.IOException;
 32  
 import java.net.SocketException;
 33  
 import java.net.UnknownHostException;
 34  
 import java.text.MessageFormat;
 35  
 import java.util.ArrayList;
 36  
 import java.util.Enumeration;
 37  
 import java.util.List;
 38  
 
 39  
 import javax.swing.BorderFactory;
 40  
 import javax.swing.JButton;
 41  
 import javax.swing.JCheckBox;
 42  
 import javax.swing.JCheckBoxMenuItem;
 43  
 import javax.swing.JComboBox;
 44  
 import javax.swing.JFileChooser;
 45  
 import javax.swing.JFrame;
 46  
 import javax.swing.JLabel;
 47  
 import javax.swing.JMenu;
 48  
 import javax.swing.JMenuBar;
 49  
 import javax.swing.JMenuItem;
 50  
 import javax.swing.JOptionPane;
 51  
 import javax.swing.JPanel;
 52  
 import javax.swing.JScrollPane;
 53  
 import javax.swing.JSeparator;
 54  
 import javax.swing.JTextField;
 55  
 import javax.swing.border.BevelBorder;
 56  
 import javax.xml.parsers.ParserConfigurationException;
 57  
 import javax.xml.transform.TransformerException;
 58  
 
 59  
 import net.blueslate.commons.gui.GUIUtils;
 60  
 import net.blueslate.commons.io.IOUtils;
 61  
 import net.blueslate.commons.xml.TransformOutputProperties;
 62  
 import net.blueslate.commons.xml.TransformParameters;
 63  
 import net.blueslate.commons.xml.XMLUtils;
 64  
 
 65  
 import org.apache.commons.lang.BooleanUtils;
 66  
 import org.apache.commons.lang.StringUtils;
 67  
 import org.apache.commons.lang.exception.ExceptionUtils;
 68  
 import org.apache.log4j.Logger;
 69  
 import org.xml.sax.SAXException;
 70  
 
 71  
 /**
 72  
  * Defines the main application window.
 73  
  * @author pevans
 74  
  *
 75  
  */
 76  0
 public class BasicXSLTFrame extends JFrame implements ActionListener,
 77  
         Runnable {
 78  
     
 79  
     // static members...
 80  
     private static UserPreferences userPrefs;
 81  
     private static String lastFileChosen;
 82  
     
 83  
     // get the i18n factory singleton instance...
 84  0
     private static final LabelStringFactory stringFactory = 
 85  
             LabelStringFactory.getInstance();
 86  
     
 87  
         // constants used by Runnable...
 88  
         private static final int THREADMODE_DO_TRANSFORM = 0;
 89  
         private static final int THREADMODE_DO_VALIDATE  = 1;
 90  
         private static final int THREADMODE_DO_XML_IDENTITY_TRANSFORM = 2;
 91  
         
 92  
     // constants...
 93  
     private static final int XML_VALIDATE_ACTION_INDEX = 2;
 94  
     private static final int XML_VIEW_EDIT_OUTPUT_PROPS_INDEX = 3;
 95  
     private static final int XML_CLEAR_OUTPUT_PROPS_INDEX = 4;
 96  
     private static final int XML_DO_IDENTITY_TRANSFORM_ACTION_INDEX = 5;
 97  
     
 98  
         // default frame width and height - these values are used if
 99  
         // a height and width are not found in the user's preferences...
 100  
         private static final String DEFAULT_FRAME_WIDTH = "930";
 101  
         private static final String DEFAULT_FRAME_HEIGHT = "415";
 102  
     
 103  
     // XML action labels...
 104  0
     private static final String XML_ACTIONS[] = {
 105  
             stringFactory.getString(LabelStringFactory.XML_ACTION_TAKE_ACTION),
 106  
             AppConstants.SEPARATOR,
 107  
             stringFactory.getString(LabelStringFactory.XML_ACTION_VALIDATE),
 108  
             stringFactory.getString(
 109  
                             LabelStringFactory.XML_ACTION_IT_OUTPUT_PROPERITES),
 110  
             stringFactory.getString(
 111  
                             LabelStringFactory.XML_ACTION_CLEAR_IT_PROPERTIES),
 112  
             stringFactory.getString(LabelStringFactory.XML_ACTION_PERFORM_IT)
 113  
     };
 114  
     
 115  
     // logger object...
 116  0
     private static final Logger logger = Logger.getLogger(BasicXSLTFrame.class);
 117  
     
 118  
         // instance members...
 119  
         private int threadMode;
 120  
         private String label, identityTransformMessage;
 121  
         private String identityTransformSourceXmlFile, 
 122  
         identityTransformResultXmlFile;
 123  
         private JTextField textField;
 124  
         private boolean suppressSuccessDialog;
 125  
         private List<Component> components;
 126  
         private JTextField sourceXmlTf, autosavePathTf;
 127  
     private List<XSLRow> xslRows;
 128  
     private JPanel xslPanel;
 129  
     private GridBagLayout xslPanelLayout;
 130  
     private GridBagConstraints xslPanelConstraints;
 131  
     private JLabel transformTimeLabel, currentConfigLabel, 
 132  
             outputAsTextIfXmlLabel, xmlIndicatorLabel;
 133  
     private JButton exitBtn, transformBtn, addXslBtn, 
 134  
                 removeCheckedBtn, validateAutosaveBtn;
 135  
         private JComboBox xmlAction;
 136  
     private JButton browseXmlBtn, browseAutosavePathBtn;
 137  
     private JCheckBoxMenuItem checkSaxWarning, checkSaxError, 
 138  
     checkSaxFatalError;
 139  
     private JCheckBox autosaveCb, suppressOutputWindowCb, outputAsTextIfXml;
 140  
     private JMenuItem exit, about, resetForm, transformTimings, 
 141  
             saveConfiguration, saveAsConfiguration, loadConfiguration;
 142  
     private long lastTotalTransformTime;
 143  
     private TransformOutputProperties xmlIdentityTransformOutputProps;
 144  
     private boolean areXmlOutputPropertiesSet;
 145  
 
 146  
     /**
 147  
      * private class constructor
 148  
      */
 149  0
     private BasicXSLTFrame() throws IOException {
 150  
             
 151  
             int width, height;
 152  
             
 153  0
                 userPrefs = Utils.getUserPrefs();
 154  0
                 userPrefs.loadDefaultConfiguration();
 155  0
                 lastFileChosen = 
 156  
                         userPrefs.getProperty(AppConstants.LAST_FILE_CHOSEN_PROP);
 157  0
                 components = new ArrayList<Component>();
 158  0
         buildGui();
 159  0
         setTitle(stringFactory.getString(
 160  
                         LabelStringFactory.MAIN_FRAME_TITLE_BAR));
 161  0
         addWindowListener(new WindowAdapter() {
 162  0
             public void windowClosing(WindowEvent evt) {
 163  0
                 destroy();
 164  0
             }
 165  
         });
 166  0
         width = Integer.parseInt(userPrefs.getProperty(
 167  
                         AppConstants.FRAME_WIDTH_PROP, DEFAULT_FRAME_WIDTH));
 168  0
                 height = Integer.parseInt(userPrefs.getProperty(
 169  
                                 AppConstants.FRAME_HEIGHT_PROP, DEFAULT_FRAME_HEIGHT));
 170  0
         setSize(width, height);
 171  0
         initializeControls();
 172  0
         setToolTips();
 173  0
         setVisible(true);
 174  0
     }
 175  
     
 176  
     /**
 177  
      * Set the various tool-tips on the GUI components.
 178  
      *
 179  
      */
 180  
     private void setToolTips() {
 181  0
                 transformTimings.setToolTipText(stringFactory.getString(
 182  
                                 LabelStringFactory.TOOL_TIP_TRANSFORM_TIMINGS));
 183  0
                 xmlAction.setToolTipText(stringFactory.getString(
 184  
                                 LabelStringFactory.TOOL_TIP_XML_ACTION));
 185  0
                 transformBtn.setToolTipText(stringFactory.getString(
 186  
                                 LabelStringFactory.TOOL_TIP_TRANSFORM_BTN));        
 187  0
                 exitBtn.setToolTipText(stringFactory.getString(
 188  
                                 LabelStringFactory.TOOL_TIP_EXIT_BTN));
 189  0
                 addXslBtn.setToolTipText(stringFactory.getString(
 190  
                                 LabelStringFactory.TOOL_TIP_ADD_XSL_BTN));
 191  0
                 removeCheckedBtn.setToolTipText(stringFactory.getString(
 192  
                                 LabelStringFactory.TOOL_TIP_REMOVE_CHECKED_BTN));
 193  0
                 validateAutosaveBtn.setToolTipText(stringFactory.getString(
 194  
                                 LabelStringFactory.TOOL_TIP_VALIDATE_AUTOSAVE_BTN));
 195  0
                 autosavePathTf.setToolTipText(stringFactory.getString(
 196  
                                 LabelStringFactory.TOOL_TIP_AUTOSAVE_TEXTFIELD));
 197  0
                 sourceXmlTf.setToolTipText(stringFactory.getString(
 198  
                                 LabelStringFactory.TOOL_TIP_SOURCE_XML_TEXTFIELD));
 199  0
                 browseAutosavePathBtn.setToolTipText(stringFactory.getString(
 200  
                                 LabelStringFactory.TOOL_TIP_BROWSE_AUTOSAVE_PATH_BTN));
 201  0
                 browseXmlBtn.setToolTipText(stringFactory.getString(
 202  
                                 LabelStringFactory.TOOL_TIP_BROWSE_XML_BTN));
 203  0
                 suppressOutputWindowCb.setToolTipText(stringFactory.getString(
 204  
                                 LabelStringFactory.TOOL_TIP_SUPPRESS_OUTPUT_WINDOW_CB));
 205  0
                 autosaveCb.setToolTipText(stringFactory.getString(
 206  
                                 LabelStringFactory.TOOL_TIP_AUTOSAVE_CB));
 207  0
                 outputAsTextIfXml.setToolTipText(stringFactory.getString(
 208  
                                 LabelStringFactory.TOOL_TIP_OUTPUT_AS_TEXT_IF_XML_CB));
 209  0
     }
 210  
     
 211  
     private static void loadParameters(XSLRow aXSLRow) {
 212  
             
 213  
             // local declarations...
 214  
             TransformParameters parameters;
 215  
             Enumeration propertyNames;
 216  
             String propName, propValue, prefix;
 217  
             int index;
 218  
             
 219  0
             parameters = aXSLRow.getTransformParameters();
 220  0
             propertyNames = userPrefs.propertyNames();
 221  0
             prefix = userPrefs.getConfiguration() + ".xsl_" + 
 222  
                     aXSLRow.getIndex() + "_params_";
 223  0
             while (propertyNames.hasMoreElements()) {
 224  0
                     propName = (String)propertyNames.nextElement();
 225  0
                     if (propName.startsWith(prefix)) {
 226  0
                             propValue = userPrefs.getPropertyNoPrefix(propName);
 227  0
                             index = propName.indexOf('{');
 228  0
                             if (index != -1) {
 229  0
                                     propName = propName.substring(index);
 230  0
                             } else {
 231  0
                                     index = propName.indexOf("_", prefix.length());
 232  0
                                     propName = propName.substring(index + 1);
 233  
                             }            
 234  0
                             parameters.setParameter(
 235  
                                         TransformParameters.getNamespaceURI(propName),
 236  
                                     TransformParameters.getParameterName(propName),
 237  
                                     propValue);
 238  0
                     }
 239  
             }
 240  0
     }
 241  
     
 242  
     /**
 243  
      * Load the output properties on the aOutputProperties object from the 
 244  
      * user's preferences.
 245  
      * @param aOutputProperties
 246  
      * @param aPropertyNamePrefix
 247  
      */
 248  
     private void loadOutputProperties(
 249  
                     TransformOutputProperties aOutputProperties, 
 250  
                     String aPropertyNamePrefix) {
 251  
                     
 252  0
                 aOutputProperties.setCDATA_SECTION_ELEMENTS(
 253  
                         StringUtils.defaultString(userPrefs.getProperty(
 254  
                                 aPropertyNamePrefix + AppConstants.CDATA_SECTION_ELEMENTS)));
 255  0
                 aOutputProperties.setDOCTYPE_PUBLIC(
 256  
                         StringUtils.defaultString(userPrefs.getProperty(
 257  
                                 aPropertyNamePrefix + AppConstants.DOCTYPE_PUBLIC)));
 258  0
                 aOutputProperties.setDOCTYPE_SYSTEM(
 259  
                         StringUtils.defaultString(userPrefs.getProperty(
 260  
                                 aPropertyNamePrefix + AppConstants.DOCTYPE_SYSTEM)));
 261  0
                 aOutputProperties.setENCODING(
 262  
                         StringUtils.defaultString(userPrefs.getProperty(
 263  
                                 aPropertyNamePrefix + AppConstants.ENCODING)));
 264  0
                 aOutputProperties.setINDENT(BooleanUtils.toBoolean(
 265  
                                 userPrefs.getProperty(aPropertyNamePrefix + 
 266  
                                                 AppConstants.INDENT)));
 267  0
                 aOutputProperties.setMEDIA_TYPE(
 268  
                         StringUtils.defaultString(userPrefs.getProperty(
 269  
                                 aPropertyNamePrefix + AppConstants.MEDIA_TYPE)));
 270  0
                 aOutputProperties.setMETHOD(
 271  
                         StringUtils.defaultString(userPrefs.getProperty(
 272  
                                 aPropertyNamePrefix + AppConstants.METHOD)));
 273  0
                 aOutputProperties.setOMIT_XML_DECLARATION(
 274  
                         BooleanUtils.toBoolean(userPrefs.getProperty(
 275  
                                 aPropertyNamePrefix + AppConstants.OMIT_XML_DECLARATION)));
 276  0
                 aOutputProperties.setSTANDALONE(
 277  
                         BooleanUtils.toBoolean(userPrefs.getProperty(
 278  
                                 aPropertyNamePrefix + AppConstants.STANDALONE)));                
 279  0
                 aOutputProperties.setVERSION(
 280  
                         StringUtils.defaultString(userPrefs.getProperty(
 281  
                                 aPropertyNamePrefix + AppConstants.VERSION)));            
 282  0
     }
 283  
 
 284  
     /**
 285  
      * Initialize the gui
 286  
      *
 287  
      */
 288  
     private void initializeControls() {
 289  
             
 290  
         String val, xCoord, yCoord, propertyNamePrefix;
 291  
         boolean areGoodCoordinates;
 292  
                 int loop;
 293  
                 XSLRow xslRow;
 294  
         
 295  0
                 loop = 0;
 296  0
         val = userPrefs.getProperty(AppConstants.CHK_WARNINGS_PROP);
 297  0
         checkSaxWarning.setSelected(val != null ? 
 298  
                         Boolean.valueOf(val).booleanValue() : false);
 299  0
         val = userPrefs.getProperty(AppConstants.CHK_ERRORS_PROP);
 300  0
         checkSaxError.setSelected(val != null ? 
 301  
                         Boolean.valueOf(val).booleanValue() : false);
 302  0
         val = userPrefs.getProperty(AppConstants.CHK_FATAL_ERRORS_PROP);
 303  0
         checkSaxFatalError.setSelected(val != null ? 
 304  
                         Boolean.valueOf(val).booleanValue() : false);
 305  0
         xCoord = userPrefs.getProperty(AppConstants.X_COORD_PROP);
 306  0
         yCoord = userPrefs.getProperty(AppConstants.Y_COORD_PROP);
 307  0
         areGoodCoordinates = false;
 308  0
         if (xCoord != null && yCoord != null) {
 309  0
            this.setLocation(Integer.parseInt(xCoord), Integer.parseInt(yCoord));
 310  0
            areGoodCoordinates = true;
 311  
         }
 312  0
         if (!areGoodCoordinates) {
 313  0
            GUIUtils.center(this, null);
 314  
         }
 315  0
         sourceXmlTf.setText(userPrefs.getProperty(
 316  
                         AppConstants.LAST_XML_FILE_PROP));
 317  0
         val = userPrefs.getProperty(AppConstants.SUPPRESS_OUTPUT_WINDOW_PROP);
 318  0
         suppressOutputWindowCb.setSelected(BooleanUtils.toBoolean(val));
 319  0
                 val = userPrefs.getProperty(AppConstants.OUTPUT_AS_TEXT_IF_XML_PROP);
 320  0
                 outputAsTextIfXml.setSelected(BooleanUtils.toBoolean(val));
 321  0
         outputAsTextIfXmlLabel.setEnabled(!suppressOutputWindowCb.isSelected());
 322  0
                 outputAsTextIfXml.setEnabled(!suppressOutputWindowCb.isSelected());
 323  0
         val = userPrefs.getProperty(AppConstants.AUTOSAVE_RESULT_PROP);
 324  0
         autosaveCb.setSelected(BooleanUtils.toBoolean(val));
 325  0
         autosavePathTf.setText(userPrefs.getProperty(
 326  
                         AppConstants.AUTOSAVE_FILE_PROP));
 327  0
         autosavePathTf.setEnabled(autosaveCb.isSelected());
 328  0
         browseAutosavePathBtn.setEnabled(autosaveCb.isSelected());
 329  0
         removeCheckedBtn.setEnabled(false);
 330  
            
 331  0
                 xmlIdentityTransformOutputProps = new TransformOutputProperties();
 332  
                 // load xml output props from user prefs
 333  0
                 val = userPrefs.getProperty("xml_identity_transform_opInd");
 334  0
                 setAreOutputPropertiesSet(BooleanUtils.toBoolean(val));
 335  0
                 loadOutputProperties(xmlIdentityTransformOutputProps,
 336  
                         "xml_identity_transform_outputproperties_");
 337  
                 
 338  0
                 refreshXmlIndicatorLabel();
 339  
                 
 340  
         do {
 341  0
                         propertyNamePrefix = "xsl_" + loop + "_outputproperties_";
 342  0
                 val = userPrefs.getProperty("xsl_" + loop + "_file");
 343  0
                 if (val != null) {
 344  0
                         xslRow = xslRows.get(loop);
 345  0
                         loadParameters(xslRow);
 346  0
                         xslRow.getTextField().setText(val);
 347  0
                         val = userPrefs.getProperty("xsl_" + loop + "_onoff"); 
 348  0
                         xslRow.setOn(BooleanUtils.toBoolean(val));   
 349  0
                         val = userPrefs.getProperty("xsl_" + loop + "_opInd");
 350  0
                         xslRow.setAreOutputPropertiesSet(BooleanUtils.toBoolean(val));  
 351  0
                         loadOutputProperties(xslRow.getTransformOutputProperties(),
 352  
                                 propertyNamePrefix);                                                
 353  0
                                loop++;
 354  
                 }
 355  0
         } while (val != null);        
 356  0
     }
 357  
     
 358  
     public static void setLastFileChosen(String aLastFileChosen) {
 359  0
             lastFileChosen = aLastFileChosen;
 360  0
             userPrefs.setProperty(AppConstants.LAST_FILE_CHOSEN_PROP,
 361  
                     lastFileChosen);
 362  0
     }
 363  
 
 364  
     /**
 365  
      * Create the menubar.
 366  
      *
 367  
      */
 368  
     private void buildMenuBar() {
 369  
             
 370  
             // local declarations...
 371  
         JMenuBar menuBar;
 372  
         JMenu help, file, validation, view;
 373  
         
 374  
         // build the file menu and associated menu items...
 375  0
         file = new JMenu(stringFactory.getString(LabelStringFactory.MF_FILE_MENU));
 376  0
         file.setMnemonic(stringFactory.getMnemonic(
 377  
                         LabelStringFactory.MF_FILE_MENU));
 378  0
         resetForm = new JMenuItem(stringFactory.getString(
 379  
                         LabelStringFactory.MF_FILE_RESET_FORM_MI));
 380  0
         resetForm.setMnemonic(stringFactory.getMnemonic(
 381  
                         LabelStringFactory.MF_FILE_RESET_FORM_MI));
 382  0
         resetForm.addActionListener(this);
 383  0
         file.add(resetForm);
 384  0
         file.add(new JSeparator());
 385  0
                 file.add(loadConfiguration = new JMenuItem(stringFactory.getString(
 386  
                                 LabelStringFactory.MF_FILE_LOAD_CONFIGURATION_MI)));
 387  0
                 loadConfiguration.setMnemonic(stringFactory.getMnemonic(
 388  
                                 LabelStringFactory.MF_FILE_LOAD_CONFIGURATION_MI));
 389  0
         file.add(saveConfiguration = new JMenuItem(stringFactory.getString(
 390  
                                 LabelStringFactory.MF_FILE_SAVE_CONFIGURATION_MI)));
 391  0
         saveConfiguration.setMnemonic(stringFactory.getMnemonic(
 392  
                                 LabelStringFactory.MF_FILE_SAVE_CONFIGURATION_MI));
 393  0
         file.add(saveAsConfiguration = new JMenuItem(stringFactory.getString(
 394  
                                 LabelStringFactory.MF_FILE_SAVE_CONFIGURATION_AS_MI)));
 395  0
         saveAsConfiguration.setMnemonic(stringFactory.getMnemonic(
 396  
                                 LabelStringFactory.MF_FILE_SAVE_CONFIGURATION_AS_MI));   
 397  0
         loadConfiguration.addActionListener(this);
 398  0
         saveConfiguration.addActionListener(this);
 399  0
         saveAsConfiguration.addActionListener(this);
 400  0
         file.add(new JSeparator());     
 401  0
         exit = new JMenuItem(stringFactory.getString(
 402  
                                 LabelStringFactory.MF_FILE_EXIT_MI));
 403  0
         exit.setMnemonic(stringFactory.getMnemonic(
 404  
                                 LabelStringFactory.MF_FILE_EXIT_MI));
 405  0
         exit.addActionListener(this);
 406  0
         file.add(exit);              
 407  
         
 408  
         // build the validation menu and associated menu items...
 409  0
                 validation = new JMenu(stringFactory.getString(
 410  
                                 LabelStringFactory.MF_VALIDATION_MENU));
 411  0
                 validation.setMnemonic(stringFactory.getMnemonic(
 412  
                                 LabelStringFactory.MF_VALIDATION_MENU));
 413  0
                 validation.add(checkSaxWarning = new JCheckBoxMenuItem(
 414  
                                 stringFactory.getString(
 415  
                                                 LabelStringFactory.MF_VALIDATION_CHECK_SAX_WARNINGS_MI)));
 416  0
                 checkSaxWarning.setMnemonic(stringFactory.getMnemonic(
 417  
                                 LabelStringFactory.MF_VALIDATION_CHECK_SAX_WARNINGS_MI));
 418  0
                 validation.add(checkSaxError = new JCheckBoxMenuItem(
 419  
                                 stringFactory.getString(
 420  
                                 LabelStringFactory.MF_VALIDATION_CHECK_SAX_ERRORS_MI)));
 421  0
                 checkSaxError.setMnemonic(stringFactory.getMnemonic(
 422  
                                 LabelStringFactory.MF_VALIDATION_CHECK_SAX_ERRORS_MI));
 423  0
                 validation.add(checkSaxFatalError = new JCheckBoxMenuItem(
 424  
                                 stringFactory.getString(
 425  
                                 LabelStringFactory.MF_VALIDATION_CHECK_SAX_FATAL_MI)));
 426  0
                 checkSaxFatalError.setMnemonic(stringFactory.getMnemonic(
 427  
                                 LabelStringFactory.MF_VALIDATION_CHECK_SAX_FATAL_MI));
 428  
         
 429  
                 // build the view menu and associate menu items...
 430  0
         view = new JMenu(stringFactory.getString(LabelStringFactory.MF_VIEW_MENU));
 431  0
         view.setMnemonic(stringFactory.getMnemonic(
 432  
                         LabelStringFactory.MF_VIEW_MENU));
 433  0
         view.add(transformTimings = new JMenuItem(stringFactory.getString(
 434  
                         LabelStringFactory.MF_VIEW_LAST_TIMINGS_MI)));
 435  0
         transformTimings.setMnemonic(stringFactory.getMnemonic(
 436  
                         LabelStringFactory.MF_VIEW_LAST_TIMINGS_MI));
 437  0
         transformTimings.setEnabled(false);
 438  0
         transformTimings.addActionListener(this);
 439  
         
 440  
         // build the help menu and associated menu items...
 441  0
         help = new JMenu(stringFactory.getString(LabelStringFactory.MF_HELP_MENU));
 442  0
         help.setMnemonic(stringFactory.getMnemonic(
 443  
                         LabelStringFactory.MF_HELP_MENU));
 444  0
         about = new JMenuItem(stringFactory.getString(
 445  
                         LabelStringFactory.MF_HELP_ABOUT_MI));
 446  0
         about.setMnemonic(stringFactory.getMnemonic(
 447  
                         LabelStringFactory.MF_HELP_ABOUT_MI));
 448  0
         about.addActionListener(this);
 449  0
         help.add(about);
 450  
         
 451  
         // build the menubar...
 452  0
         menuBar = new JMenuBar();
 453  0
         menuBar.add(file);
 454  0
         menuBar.add(validation);
 455  0
         menuBar.add(view);
 456  0
         menuBar.add(help);
 457  0
         setJMenuBar(menuBar);
 458  0
     }
 459  
 
 460  
     /**
 461  
      * Rebuilds the XSL panel; first it removes all of the components; and then
 462  
      * it loops over the xslRows object and re-adds the components.
 463  
      *
 464  
      */
 465  
     private void rebuildXSLPanel() {
 466  
             
 467  
             int loop, size;
 468  
             int col, xslPanelRow;
 469  
             JTextField xslTf;
 470  
         JButton browseXslBtn, insertBtn;
 471  
         JComboBox action;
 472  
         JLabel xslLabel, indicatorLabel;
 473  
         JCheckBox removeCb;
 474  
         XSLRow xslRow;
 475  
         
 476  0
         xslPanel.removeAll();                
 477  0
                 xslPanelRow = 0;
 478  0
                 GUIUtils.add(xslPanel, new JLabel(""), xslPanelLayout,
 479  
                         xslPanelConstraints, xslPanelRow, col=0, 1, 1, 
 480  
                         GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 481  
                         GUIUtils.SMALL_INSETS);
 482  0
                 GUIUtils.add(xslPanel, new JLabel(stringFactory.getString(
 483  
                                 LabelStringFactory.MAIN_FRAME_XML_FILE_WITH_COLON)), 
 484  
                                 xslPanelLayout, xslPanelConstraints, xslPanelRow, ++col, 1, 1, 
 485  
                                 GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 486  
                                 GUIUtils.SMALL_INSETS);
 487  0
                 GUIUtils.add(xslPanel, sourceXmlTf, xslPanelLayout, xslPanelConstraints, 
 488  
                         xslPanelRow, ++col, 1, 1, GridBagConstraints.WEST, 
 489  
                         GridBagConstraints.BOTH, GUIUtils.SMALL_INSETS);
 490  0
                 GUIUtils.add(xslPanel, new JLabel(""), xslPanelLayout, 
 491  
                                 xslPanelConstraints, xslPanelRow, ++col, 1, 1, 
 492  
                                 GridBagConstraints.WEST, GridBagConstraints.BOTH, 
 493  
                                 GUIUtils.SMALL_INSETS);
 494  0
                 GUIUtils.add(xslPanel, browseXmlBtn, 
 495  
                                 xslPanelLayout, xslPanelConstraints, xslPanelRow, ++col, 1, 1, 
 496  
                                 GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 497  
                                 GUIUtils.SMALL_INSETS);
 498  0
                 GUIUtils.add(xslPanel, xmlAction, 
 499  
                                 xslPanelLayout, xslPanelConstraints, xslPanelRow, ++col, 1, 1, 
 500  
                                 GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 501  
                                 GUIUtils.SMALL_INSETS);
 502  0
                 GUIUtils.add(xslPanel, xmlIndicatorLabel, xslPanelLayout, 
 503  
                                 xslPanelConstraints, xslPanelRow++, ++col, 1, 1, 
 504  
                                 GridBagConstraints.WEST, GridBagConstraints.BOTH, 
 505  
                                 GUIUtils.SMALL_INSETS);        
 506  0
         size = xslRows.size();
 507  0
         for (loop = 0; loop < size; loop++) {
 508  0
                 xslRow = xslRows.get(loop);
 509  0
                 xslLabel = xslRow.getLabel();
 510  0
                 xslTf = xslRow.getTextField();
 511  0
                 removeCb = xslRow.getRemoveCb();
 512  0
                 browseXslBtn = xslRow.getBrowseBtn();
 513  0
                 insertBtn = xslRow.getInsertBtn();
 514  0
                 indicatorLabel = xslRow.getIndicatorLabel();
 515  0
                 action = xslRow.getAction();             
 516  0
                         GUIUtils.add(xslPanel, insertBtn, xslPanelLayout,
 517  
                                                 xslPanelConstraints, xslPanelRow, col=0, 1, 1, 
 518  
                                                 GridBagConstraints.EAST, GridBagConstraints.EAST, 
 519  
                                                 GUIUtils.NO_INSETS);             
 520  0
                         GUIUtils.add(xslPanel, xslLabel, xslPanelLayout, 
 521  
                                         xslPanelConstraints, xslPanelRow, ++col, 1, 1,  
 522  
                                         GridBagConstraints.EAST, GridBagConstraints.NONE, 
 523  
                                         GUIUtils.SMALL_INSETS);
 524  0
                         GUIUtils.add(xslPanel, xslTf, xslPanelLayout, xslPanelConstraints, 
 525  
                                 xslPanelRow, ++col, 1, 1, GridBagConstraints.WEST, 
 526  
                                 GridBagConstraints.BOTH, GUIUtils.SMALL_INSETS);
 527  0
                         GUIUtils.add(xslPanel, removeCb, 
 528  
                                         xslPanelLayout, xslPanelConstraints, xslPanelRow, ++col, 1, 
 529  
                                         1, GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 530  
                                         GUIUtils.SMALL_INSETS);
 531  0
                         GUIUtils.add(xslPanel, browseXslBtn, 
 532  
                                         xslPanelLayout, xslPanelConstraints, xslPanelRow, ++col, 1, 
 533  
                                         1, GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 534  
                                         GUIUtils.SMALL_INSETS);
 535  0
                         GUIUtils.add(xslPanel, action, 
 536  
                                         xslPanelLayout, xslPanelConstraints, xslPanelRow, ++col, 1, 
 537  
                                         1, GridBagConstraints.EAST, GridBagConstraints.BOTH, 
 538  
                                         GUIUtils.SMALL_INSETS);        
 539  0
                         GUIUtils.add(xslPanel, indicatorLabel, xslPanelLayout, 
 540  
                                 xslPanelConstraints, xslPanelRow++, ++col, 1, 1, 
 541  
                                 GridBagConstraints.EAST, GridBagConstraints.BOTH,
 542  
                                 GUIUtils.SMALL_INSETS);        
 543  
                 }
 544  0
     }
 545  
     
 546  
     /**
 547  
      * Refreshes the stylesheets panel
 548  
      *
 549  
      */
 550  
     private void refreshStylesheets() {
 551  
             
 552  
             int loop;
 553  
                 int numStylesheets;
 554  
                 
 555  0
                 numStylesheets = Integer.parseInt(userPrefs.getProperty(
 556  
                                 AppConstants.NUM_STYLESHEETS_PROP, 
 557  
                                 AppConstants.DEFAULT_NUM_STYLESHEETS));
 558  0
                 xslRows.clear();
 559  0
                 for (loop = 0; loop < numStylesheets; loop++) {                
 560  0
                         addXSLRow();
 561  
                 }
 562  0
                 rebuildXSLPanel();
 563  0
     }
 564  
     
 565  
     /**
 566  
      * Setter
 567  
      * @param aAreOutputPropertiesSet
 568  
      */
 569  
         public void setAreOutputPropertiesSet(boolean aAreOutputPropertiesSet) {
 570  0
                 areXmlOutputPropertiesSet = aAreOutputPropertiesSet;
 571  0
                 refreshXmlIndicatorLabel();
 572  0
         }
 573  
     
 574  
         /**
 575  
          * Refreshes the XML indicator label and tool-tip
 576  
          *
 577  
          */
 578  
     private void refreshXmlIndicatorLabel() {
 579  
             
 580  
                 StringBuffer labelText;
 581  
                 StringBuffer toolTip;
 582  
                 
 583  0
                 labelText = new StringBuffer();
 584  0
                 toolTip = new StringBuffer();
 585  0
                 if (areXmlOutputPropertiesSet) {
 586  0
                         labelText.append(stringFactory.getString(
 587  
                                         LabelStringFactory.MAIN_FRAME_XML_INDICATOR_ITOPSPECIFIED));
 588  0
                         toolTip.append(stringFactory.getString(
 589  
                                         LabelStringFactory.
 590  
                                         MAIN_FRAME_XML_INDICATOR_ITOPSPECIFIED_TOOL_TIP));
 591  
                 }
 592  0
                 xmlIndicatorLabel.setText(labelText.toString());
 593  0
                 xmlIndicatorLabel.setToolTipText(toolTip.toString());
 594  0
     }
 595  
     
 596  
     /**
 597  
      * Method to build the GUI
 598  
      */
 599  
     private void buildGui() {
 600  
             
 601  
         JPanel centerPanel;
 602  0
         buildMenuBar();
 603  
         JScrollPane stylesheetsPane;
 604  
                 
 605  0
         xslPanelLayout = new GridBagLayout();
 606  0
         xslPanelConstraints = new GridBagConstraints();
 607  0
         centerPanel = new JPanel();
 608  0
         xslPanel = new JPanel(xslPanelLayout);
 609  0
         stylesheetsPane = new JScrollPane(xslPanel,
 610  
                                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
 611  
                                 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
 612  0
         sourceXmlTf = new JTextField(AppConstants.TF_LENGTH);
 613  0
         browseXmlBtn = new JButton(stringFactory.getString(
 614  
                         LabelStringFactory.MAIN_FRAME_BROWSE_BTN));
 615  0
         xmlAction = new JComboBox(XML_ACTIONS);
 616  0
         browseXmlBtn.addActionListener(this);
 617  0
         xmlIndicatorLabel = new JLabel("");
 618  0
         xmlIndicatorLabel.setFont(new Font("arial", Font.PLAIN, 10));
 619  0
         xmlAction.addActionListener(this);
 620  0
         xslRows = new ArrayList<XSLRow>();
 621  0
         refreshStylesheets();        
 622  0
         centerPanel.setLayout(new BorderLayout());
 623  0
                 centerPanel.add(stylesheetsPane, BorderLayout.CENTER);
 624  0
                 centerPanel.add(new JScrollPane(buildAutosavePanel(),
 625  
                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
 626  
                 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.SOUTH);
 627  0
             browseAutosavePathBtn.addActionListener(this);
 628  0
         getContentPane().setLayout(new BorderLayout());
 629  0
         getContentPane().add(buildNorthPanel(), BorderLayout.NORTH);
 630  0
         getContentPane().add(centerPanel, BorderLayout.CENTER);
 631  0
         getContentPane().add(buildSouthPanel(), BorderLayout.SOUTH);
 632  0
     }
 633  
     
 634  
     /**
 635  
      * Builds the north/top-most panel and returns it.
 636  
      * @return
 637  
      */
 638  
     private JPanel buildNorthPanel() {
 639  
             
 640  
                 JPanel northPanel;
 641  
                 JLabel title;
 642  
                 
 643  0
                 northPanel = new JPanel(new FlowLayout());
 644  0
                 title = new JLabel(stringFactory.getString(
 645  
                                 LabelStringFactory.MAIN_FRAME_TITLE));
 646  0
                 title.setFont(new Font("helvetica", Font.BOLD, 18));
 647  0
                 northPanel.add(title);
 648  0
                 return northPanel;
 649  
     }
 650  
     
 651  
     /**
 652  
      * Builds the auto-save panel
 653  
      * @return
 654  
      */
 655  
     private JPanel buildAutosavePanel() {
 656  
             
 657  
             int row;
 658  
                 JPanel buttons;
 659  
                 JPanel autosavePanel;
 660  
                 
 661  0
                 row = 0;
 662  0
                 buttons = new JPanel(new FlowLayout(FlowLayout.LEFT));
 663  0
                 buttons.add(addXslBtn = new JButton(stringFactory.getString(
 664  
                                 LabelStringFactory.MAIN_FRAME_ADD_XSL_BTN)));
 665  0
                 buttons.add(removeCheckedBtn = new JButton(
 666  
                                 stringFactory.getString(
 667  
                                                 LabelStringFactory.MAIN_FRAME_REMOVE_CHECKED_BTN)));
 668  0
                 addXslBtn.addActionListener(this);
 669  0
                 removeCheckedBtn.addActionListener(this);
 670  0
                 autosavePanel = new JPanel(xslPanelLayout);
 671  0
                 GUIUtils.add(autosavePanel, buttons, xslPanelLayout, 
 672  
                                 xslPanelConstraints, row++, 0, 1, 3, GridBagConstraints.WEST, 
 673  
                                 GridBagConstraints.NONE, GUIUtils.SMALL_INSETS);
 674  0
                 GUIUtils.add(autosavePanel, new JLabel(stringFactory.getString(
 675  
                                 LabelStringFactory.MAIN_FRAME_AUTOSAVERESULT)), xslPanelLayout, 
 676  
                                 xslPanelConstraints, row, 0, 1, 1, GridBagConstraints.EAST, 
 677  
                                 GridBagConstraints.NONE, GUIUtils.SMALL_INSETS);
 678  0
                 GUIUtils.add(autosavePanel, autosaveCb = new JCheckBox(), 
 679  
                                 xslPanelLayout, xslPanelConstraints, row, 1, 1, 1, 
 680  
                                 GridBagConstraints.WEST, GridBagConstraints.NONE, 
 681  
                                 GUIUtils.SMALL_INSETS);
 682  0
                 autosaveCb.addActionListener(this);
 683  0
                 GUIUtils.add(autosavePanel, autosavePathTf = new JTextField(
 684  
                                 AppConstants.TF_LENGTH-4), xslPanelLayout, xslPanelConstraints, 
 685  
                                 row, 2, 1, 1, GridBagConstraints.EAST, GridBagConstraints.NONE, 
 686  
                                 GUIUtils.SMALL_INSETS);                        
 687  0
                 GUIUtils.add(autosavePanel, browseAutosavePathBtn = new JButton(
 688  
                                 stringFactory.getString(
 689  
                                                 LabelStringFactory.MAIN_FRAME_BROWSE_BTN)), 
 690  
                                 xslPanelLayout, xslPanelConstraints, row, 3, 1, 1, 
 691  
                                 GridBagConstraints.EAST, GridBagConstraints.NONE, 
 692  
                                 GUIUtils.SMALL_INSETS);
 693  0
                 GUIUtils.add(autosavePanel, validateAutosaveBtn = new JButton(
 694  
                                 stringFactory.getString(
 695  
                                                 LabelStringFactory.MAIN_FRAME_VALIDATE_BTN)), 
 696  
                                 xslPanelLayout, xslPanelConstraints, row++, 4, 1, 1, 
 697  
                                 GridBagConstraints.EAST, GridBagConstraints.NONE, 
 698  
                                 GUIUtils.SMALL_INSETS);
 699  0
                 validateAutosaveBtn.addActionListener(this);
 700  0
                 GUIUtils.add(autosavePanel, new JLabel(stringFactory.getString(
 701  
                                 LabelStringFactory.MAIN_FRAME_SUPRESS_OUTPUT_WINDOW)), 
 702  
                                 xslPanelLayout, xslPanelConstraints, row, 0, 1, 1, 
 703  
                                 GridBagConstraints.EAST, GridBagConstraints.NONE, 
 704  
                                 GUIUtils.SMALL_INSETS);
 705  0
                 GUIUtils.add(autosavePanel, suppressOutputWindowCb = new JCheckBox(), 
 706  
                                 xslPanelLayout, xslPanelConstraints, row++, 1, 1, 1, 
 707  
                                 GridBagConstraints.WEST, GridBagConstraints.NONE, 
 708  
                                 GUIUtils.SMALL_INSETS);
 709  0
                 GUIUtils.add(autosavePanel, outputAsTextIfXmlLabel = new JLabel(
 710  
                                 stringFactory.getString(
 711  
                                                 LabelStringFactory.
 712  
                                                 MAIN_FRAME_DISPLAY_OUTPUT_AS_TEXT_IF_XML)), 
 713  
                                 xslPanelLayout, xslPanelConstraints, row, 0, 1, 1, 
 714  
                                 GridBagConstraints.EAST, GridBagConstraints.NONE, 
 715  
                                 GUIUtils.SMALL_INSETS);
 716  0
                 GUIUtils.add(autosavePanel, outputAsTextIfXml = new JCheckBox(), 
 717  
                                 xslPanelLayout, xslPanelConstraints, row++, 1, 1, 1, 
 718  
                                 GridBagConstraints.WEST, GridBagConstraints.NONE, 
 719  
                                 GUIUtils.SMALL_INSETS);
 720  0
                 suppressOutputWindowCb.addActionListener(this);
 721  0
                 return autosavePanel;
 722  
     }
 723  
     
 724  
     /**
 725  
      * Builds the south panel
 726  
      * @return
 727  
      */
 728  
     private JPanel buildSouthPanel() {
 729  
             
 730  
                 JPanel transformBtnPanel;
 731  
                 JPanel footerPanel;
 732  
                 JPanel southPanel;
 733  
                 JPanel panel;
 734  
                 JLabel label;
 735  
                 Font footerPanelFont;
 736  
                 Font footerPanelFontBold;
 737  
                 
 738  0
                 transformBtnPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
 739  0
                 transformBtnPanel.add(transformBtn = new JButton(
 740  
                                 stringFactory.getString(
 741  
                                                 LabelStringFactory.MAIN_FRAME_TRANSFORM_BTN)));                
 742  0
                 transformBtnPanel.add(exitBtn = new JButton(stringFactory.getString(
 743  
                                 LabelStringFactory.MAIN_FRAME_EXIT_BTN)));
 744  
         
 745  0
                 footerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 746  0
                 southPanel = new JPanel(new BorderLayout());
 747  0
                 southPanel.add(transformBtnPanel, BorderLayout.CENTER);
 748  0
                 southPanel.add(footerPanel, BorderLayout.SOUTH);        
 749  0
                 footerPanelFont = new Font("arial", Font.PLAIN, 12);
 750  0
                 footerPanelFontBold = new Font("arial", Font.BOLD, 12);
 751  0
                 footerPanel.setBorder(BorderFactory.createBevelBorder(
 752  
                                 BevelBorder.LOWERED));
 753  
                 
 754  0
                 panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 755  0
                 panel.add(label = new JLabel(stringFactory.getString(
 756  
                                 LabelStringFactory.MAIN_FRAME_CURRENT_CONFIGURATION)));
 757  0
                 label.setFont(footerPanelFontBold);
 758  0
                 label.setForeground(Color.BLUE);
 759  0
                 panel.add(currentConfigLabel = new JLabel(
 760  
                                 userPrefs.getConfiguration())); 
 761  0
                 currentConfigLabel.setFont(footerPanelFont);                
 762  0
                 footerPanel.add(panel);
 763  
                 
 764  0
                 panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 765  0
                 panel.add(label = new JLabel(stringFactory.getString(
 766  
                                 LabelStringFactory.MAIN_FRAME_TOTAL_TRANSFORM_TIME)));
 767  0
                 label.setFont(footerPanelFontBold);
 768  0
                 label.setForeground(Color.BLUE);
 769  0
                 panel.add(transformTimeLabel = new JLabel(lastTotalTransformTime + " " + 
 770  
                                 stringFactory.getString(LabelStringFactory.
 771  
                                                 MAIN_FRAME_MILLISECONDS_ABBREVIATION)));
 772  0
                 transformTimeLabel.setFont(footerPanelFont);                
 773  0
                 footerPanel.add(panel);
 774  
                 
 775  0
                 transformTimeLabel.setFont(footerPanelFont);
 776  0
                 footerPanel.add(new JLabel(""));
 777  0
                 footerPanel.add(new JLabel(""));                
 778  0
                 transformBtn.addActionListener(this);
 779  0
                 exitBtn.addActionListener(this);
 780  0
                 return southPanel;
 781  
     }
 782  
 
 783  
     /**
 784  
      * Displays the 'about' dialog
 785  
      *
 786  
      */
 787  
     private void about() {
 788  
             
 789  
         StringBuffer aboutMsg;
 790  
         
 791  0
         aboutMsg = new StringBuffer();
 792  0
         aboutMsg.append(stringFactory.getString(
 793  
                         LabelStringFactory.TOOL_ABOUTDIALOG_TOOLTITLE) + "\n\n");
 794  0
         aboutMsg.append(stringFactory.getString(
 795  
                         LabelStringFactory.TOOL_ABOUTDIALOG_VERSION)).append(
 796  
                                         AppConstants.APP_VERSION).append("\n\n");
 797  0
         aboutMsg.append(stringFactory.getString(
 798  
                         LabelStringFactory.TOOL_DESCRIPTION)).append("\n\n");
 799  0
         aboutMsg.append(stringFactory.getString(
 800  
                         LabelStringFactory.TOOL_DEVELOPED_BY) + "\n\n");
 801  0
         aboutMsg.append(stringFactory.getString(
 802  
                         LabelStringFactory.TOOL_LICENSE));
 803  0
         Utils.showDialog(this, aboutMsg.toString(), stringFactory.getString(
 804  
                         LabelStringFactory.TOOL_ABOUTDIALOG_TITLE), 
 805  
                         JOptionPane.INFORMATION_MESSAGE);
 806  0
     }
 807  
 
 808  
     /**
 809  
      * Returns if aTextField is empty or not
 810  
      * @param aTextField
 811  
      * @return
 812  
      */
 813  
     private static boolean isEmpty(JTextField aTextField) {
 814  0
         return StringUtils.isBlank(aTextField.getText());
 815  
     }
 816  
 
 817  
     /**
 818  
      * Returns if the path specified in aFileTextField points to a valid
 819  
      * file or not.
 820  
      * @param aFileTextField
 821  
      * @return
 822  
      */
 823  
     private static boolean isValidFile(JTextField aFileTextField) {
 824  
             
 825  
         File physFile;
 826  
         
 827  0
         physFile = new File(aFileTextField.getText());
 828  0
         return physFile.exists();
 829  
     }
 830  
     
 831  
     /**
 832  
      * Validates the xml file pointed-to by aTextField.
 833  
      * @param aLabel
 834  
      * @param aTextField
 835  
      * @param aSuppressSuccessDialog
 836  
      * @return
 837  
      */
 838  
     private boolean validateXml(String aLabel, JTextField aTextField, 
 839  
                     boolean aSuppressSuccessDialog) {
 840  
             
 841  
             boolean isValid;
 842  
             
 843  0
             isValid = false;
 844  0
             if (isEmpty(aTextField)) {
 845  0
                     Utils.showDialog(this, stringFactory.getString(
 846  
                                     LabelStringFactory.MAIN_FRAME_XML_FILE_NOT_SPECIFIED), 
 847  
                                     stringFactory.getString(
 848  
                                     LabelStringFactory.MAIN_FRAME_ERROR_LBL), 
 849  
                                     JOptionPane.ERROR_MESSAGE);
 850  0
         } else if (!isValidFile(aTextField)) {                
 851  0
                 Utils.showDialog(this, stringFactory.getString(
 852  
                                     LabelStringFactory.
 853  
                                     MAIN_FRAME_XML_FILE_NOT_EXIST_SPECIFY_VALID_FILE), 
 854  
                                     stringFactory.getString(
 855  
                                                     LabelStringFactory.MAIN_FRAME_ERROR_LBL), 
 856  
                                         JOptionPane.ERROR_MESSAGE);
 857  0
         } else {
 858  0
                 isValid = validateXml(aLabel, aTextField.getText(), 
 859  
                                 checkSaxWarning.isSelected(), checkSaxError.isSelected(),
 860  
                     checkSaxFatalError.isSelected(), this, 
 861  
                     aSuppressSuccessDialog);
 862  
         }
 863  0
             return isValid;
 864  
     }
 865  
     
 866  
     /**
 867  
      * Validates the input xml, each of the stylesheets.
 868  
      * @return
 869  
      */
 870  
     private boolean validateAll() {
 871  
             
 872  
             boolean isValid;
 873  
             int loop, size;
 874  
             String autosavePath;
 875  
             XSLRow xslRow;
 876  
             JTextField textField;
 877  
             File file;
 878  
             
 879  0
             isValid = true;
 880  0
             if (autosaveCb.isSelected()) {
 881  0
                     autosavePath = autosavePathTf.getText();
 882  0
                     if (StringUtils.isNotBlank(autosavePath)) {
 883  0
                             file = new File(autosavePathTf.getText());
 884  0
                                    if ((file.getParentFile() == null) ||  
 885  
                                                    (!(isValid = file.getParentFile().exists()))) {
 886  0
                                            isValid = false;
 887  0
                                            Utils.showDialog(this, MessageFormat.format(
 888  
                                                            stringFactory.getString(LabelStringFactory.
 889  
                                                                            MAIN_FRAME_AUTOSAVE_PATH_DOES_NOT_EXIST),
 890  
                                                            file.getAbsolutePath()), stringFactory.getString(
 891  
                                                                            LabelStringFactory.
 892  
                                                                            MAIN_FRAME_INVALID_AUTOSAVE_PATH),
 893  
                                                    JOptionPane.ERROR_MESSAGE);
 894  0
                                    }
 895  
                            } else {
 896  0
                                    isValid = false;
 897  0
                                 Utils.showDialog(this, stringFactory.getString(
 898  
                                                 LabelStringFactory.
 899  
                                                 MAIN_FRAME_PLEASE_SPECIFY_AUTOSAVE_PATH), 
 900  
                                                 stringFactory.getString(LabelStringFactory.
 901  
                                                                 MAIN_FRAME_INVALID_AUTOSAVE_PATH) ,
 902  
                                         JOptionPane.ERROR_MESSAGE);
 903  
                     }
 904  
             }
 905  0
             if (isValid) {
 906  0
                        if (isValid = validateXml(stringFactory.getString(
 907  
                                        LabelStringFactory.MAIN_FRAME_XML_FILE), sourceXmlTf, 
 908  
                                        true)) {
 909  0
                             size = xslRows.size();
 910  0
                             for (loop = 0; (loop < size) && isValid; loop++) {
 911  0
                                     xslRow = xslRows.get(loop);
 912  0
                                     textField = xslRow.getTextField();
 913  0
                                     if (xslRow.isOnAndNotEmpty()) {
 914  0
                                             isValid = validateXml(xslRow.getDescription(), 
 915  
                                                             textField, true);
 916  
                                     }
 917  
                             }
 918  
                        }
 919  
             }
 920  0
             return isValid;
 921  
     }
 922  
     
 923  
     /**
 924  
      * Returns true if any XSL input textfields are turned on and have a file
 925  
      * specified.
 926  
      * @return
 927  
      */
 928  
     private boolean areAnyStylesheets() {
 929  
             
 930  
             boolean areAnyStylesheets;
 931  
             XSLRow xslRow;
 932  
             int loop, size;
 933  
             
 934  0
             areAnyStylesheets = false;
 935  0
             size = xslRows.size();
 936  0
             for (loop = 0; loop < size; loop++) {
 937  0
                     xslRow = xslRows.get(loop);
 938  0
                     if (xslRow.isOnAndNotEmpty()) {
 939  0
                             areAnyStylesheets = true;
 940  0
                             break;
 941  
                     }
 942  
             }
 943  0
             return areAnyStylesheets;
 944  
     }
 945  
     
 946  
     /**
 947  
      * Refreshes the XSL-panel
 948  
      *
 949  
      */
 950  
     private void refreshXSLPanel() {
 951  0
             rebuildXSLPanel();
 952  0
                 xslPanel.repaint();
 953  0
                 xslPanel.revalidate();
 954  0
     }
 955  
     
 956  
     /**
 957  
      * Resets the form
 958  
      *
 959  
      */
 960  
     private void resetForm() {
 961  0
                 XSLRow.removeAll(xslRows);
 962  0
                 addXSLRow();
 963  0
                 addXSLRow();
 964  0
                 addXSLRow();
 965  0
                 refreshXSLPanel();
 966  0
                 sourceXmlTf.setText("");
 967  0
                 xmlIdentityTransformOutputProps.clear(); 
 968  0
                 setAreOutputPropertiesSet(false);
 969  0
                 autosaveCb.setSelected(false);
 970  0
                 autosavePathTf.setText("");
 971  0
                 autosavePathTf.setEnabled(false);
 972  0
                 browseAutosavePathBtn.setEnabled(false);
 973  0
                 checkSaxError.setSelected(false);
 974  0
                 checkSaxWarning.setSelected(false);
 975  0
                 checkSaxFatalError.setSelected(false);
 976  0
                 removeCheckedBtn.setEnabled(false);
 977  0
                 suppressOutputWindowCb.setSelected(false);
 978  0
                 outputAsTextIfXml.setSelected(false);
 979  0
                 outputAsTextIfXml.setEnabled(true);
 980  0
                 outputAsTextIfXmlLabel.setEnabled(true);
 981  0
     }
 982  
 
 983  
     /**
 984  
      * Method to handle button clicks.
 985  
      * @param evt
 986  
      */
 987  
     public void actionPerformed(ActionEvent evt) {
 988  
             
 989  
             String actionCommand, action, allConfigurations[];
 990  
         Object eventSource;
 991  
         XSLRow xslRow;
 992  
         
 993  0
         eventSource = evt.getSource();
 994  0
         setCursor(new Cursor(Cursor.WAIT_CURSOR));
 995  
         try {
 996  0
                 if (eventSource == transformBtn) {
 997  0
                         if (areAnyStylesheets()) {
 998  0
                                 doTransform();
 999  0
                                 } else {
 1000  0
                                 Utils.showDialog(this, 
 1001  
                                                 stringFactory.getString(LabelStringFactory.
 1002  
                                                                 MAIN_FRAME_SPECIFICY_AT_LEAST_ONE_STYLESHEET), 
 1003  
                                                                 stringFactory.getString(LabelStringFactory.
 1004  
                                                                                 MAIN_FRAME_TRANSFORM_MESSAGE), 
 1005  
                                                                                 JOptionPane.ERROR_MESSAGE);
 1006  
                                 }
 1007  0
                         } else if (eventSource == about) {
 1008  0
                                   about();
 1009  0
                                   setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1010  0
                         } else if (eventSource == exit) {
 1011  0
                             destroy();
 1012  0
                 } else if (eventSource == transformTimings) {
 1013  0
                         new TimingsFrame(this, Utils.toArray(xslRows));
 1014  0
                         setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1015  0
                         } else if (eventSource == validateAutosaveBtn) {
 1016  0
                                 doValidateXml(stringFactory.getString(
 1017  
                                                LabelStringFactory.MAIN_FRAME_XML_FILE), autosavePathTf, 
 1018  
                                                false);
 1019  0
                         } else if (eventSource == exitBtn) {
 1020  0
                                    destroy();
 1021  0
                 } else if (eventSource == resetForm) {
 1022  0
                                 resetForm();
 1023  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1024  0
                        } else if (eventSource == browseAutosavePathBtn) {
 1025  0
                                populateTFFromFileDialog(autosavePathTf);
 1026  0
                                setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1027  0
                               } else if (eventSource == browseXmlBtn) {
 1028  0
                                    populateTFFromFileDialog(sourceXmlTf);
 1029  0
                                    setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1030  0
                        } else if (eventSource == autosaveCb) { 
 1031  0
                                 autosavePathTf.setEnabled(autosaveCb.isSelected());
 1032  0
                                 browseAutosavePathBtn.setEnabled(autosaveCb.isSelected());
 1033  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1034  0
                         } else if (eventSource == suppressOutputWindowCb) {
 1035  0
                                 outputAsTextIfXmlLabel.setEnabled(
 1036  
                                                 !suppressOutputWindowCb.isSelected());
 1037  0
                                 outputAsTextIfXml.setEnabled(
 1038  
                                                 !suppressOutputWindowCb.isSelected());
 1039  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1040  0
                 } else if (eventSource == removeCheckedBtn) {
 1041  0
                         transformTimings.setEnabled(false);
 1042  0
                                 XSLRow.removeChecked(xslRows);
 1043  0
                                 if (xslRows.size() == 0) {
 1044  0
                                         addXSLRow();
 1045  0
                                         refreshXSLPanel();
 1046  
                                 }
 1047  0
                                 enableRemoveCheckedBtn();
 1048  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1049  0
                         } else if (eventSource == addXslBtn) {
 1050  0
                                 transformTimings.setEnabled(false);
 1051  0
                                 addXSLRow();
 1052  0
                                 refreshXSLPanel();
 1053  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1054  0
                         } else if (eventSource == saveConfiguration) {
 1055  0
                                 persistUserPrefs();
 1056  0
                                 userPrefs.persistUserPrefs();
 1057  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1058  0
                 } else if (eventSource == saveAsConfiguration) {
 1059  0
                         new SaveAsConfigurationFrame(this, 
 1060  
                                         userPrefs.getConfiguration());
 1061  0
                         setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1062  0
                 } else if (eventSource == loadConfiguration) {
 1063  0
                         allConfigurations = userPrefs.getAllConfigurations();
 1064  0
                         if (allConfigurations.length > 0) {
 1065  0
                                 new LoadConfigurationFrame(this, 
 1066  
                                                 userPrefs.getConfiguration(), allConfigurations);
 1067  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1068  0
                         } else {
 1069  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1070  0
                                 Utils.showDialog(this, MessageFormat.format(
 1071  
                                                 stringFactory.getString(LabelStringFactory.
 1072  
                                                         MAIN_FRAME_ONLY_CONFIGURATION),
 1073  
                                                         userPrefs.getConfiguration(), 
 1074  
                                                         saveAsConfiguration.getText()),
 1075  
                                                         stringFactory.getString(LabelStringFactory.
 1076  
                                                                 MAIN_FRAME_MESSAGE), 
 1077  
                                                                 JOptionPane.INFORMATION_MESSAGE);
 1078  
                         } 
 1079  0
                 } else if (eventSource == xmlAction) {
 1080  0
                         if (xmlAction.getItemCount() > 0) {
 1081  0
                                 action = (String)xmlAction.getSelectedItem();
 1082  0
                                 xmlAction.setSelectedIndex(0);
 1083  0
                                 if (action.equals(XML_ACTIONS[XML_VALIDATE_ACTION_INDEX])) {
 1084  0
                                                 components.clear();
 1085  0
                                                 components.add(sourceXmlTf);
 1086  0
                                                 components.add(xmlAction);
 1087  0
                                                 components.add(browseXmlBtn);
 1088  0
                                         doValidateXml(stringFactory.getString(
 1089  
                                                            LabelStringFactory.MAIN_FRAME_XML_FILE), 
 1090  
                                                            sourceXmlTf, false);
 1091  0
                                 } else if (action.equals(
 1092  
                                                 XML_ACTIONS[XML_VIEW_EDIT_OUTPUT_PROPS_INDEX])) {
 1093  0
                                         new TransformOutputPropertiesFrame(this,
 1094  
                                                 xmlIdentityTransformOutputProps, 
 1095  
                                                 sourceXmlTf.getText());
 1096  0
                                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1097  0
                                 } else if (action.equals(
 1098  
                                                 XML_ACTIONS[XML_CLEAR_OUTPUT_PROPS_INDEX])) {
 1099  0
                                                 xmlIdentityTransformOutputProps.clear();
 1100  0
                                                 setAreOutputPropertiesSet(false);        
 1101  0
                                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));                                        
 1102  0
                                 } else if (action.equals(
 1103  
                                         XML_ACTIONS[XML_DO_IDENTITY_TRANSFORM_ACTION_INDEX])) {
 1104  
                                         
 1105  0
                                         if (validateXml(stringFactory.getString(
 1106  
                                                            LabelStringFactory.MAIN_FRAME_XML_FILE), 
 1107  
                                                            sourceXmlTf, true)) {                                                        
 1108  0
                                                         components.clear();
 1109  0
                                                         components.add(sourceXmlTf);
 1110  0
                                                         components.add(browseXmlBtn);
 1111  0
                                                         components.add(xmlAction);
 1112  0
                                                         doIdentityTransform(
 1113  
                                                                 stringFactory.getString(
 1114  
                                                                                 LabelStringFactory.
 1115  
                                                                                 MAIN_FRAME_SELECT_FILE_FOR_IT_RESULT),
 1116  
                                                                 sourceXmlTf.getText(), 
 1117  
                                                                 sourceXmlTf.getText());
 1118  0
                                         } else {
 1119  0
                                                         setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1120  
                                         }
 1121  0
                                 } else {
 1122  0
                                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1123  
                                 }
 1124  0
                         }
 1125  
                 } else {                
 1126  0
                                 actionCommand = evt.getActionCommand();
 1127  0
                                 if (AppConstants.INSERT.equals(actionCommand)) {
 1128  0
                                         xslRow = XSLRow.getRowByInsertBtn(xslRows,
 1129  
                                                 (JButton)eventSource);
 1130  0
                                         insertXSLRow(xslRow.getIndex());
 1131  0
                                         refreshXSLPanel();
 1132  0
                                 } else if (AppConstants.REMOVE_CB.equals(actionCommand)) {
 1133  0
                                         enableRemoveCheckedBtn();
 1134  0
                                 } else if (stringFactory.getString(
 1135  
                                         LabelStringFactory.MAIN_FRAME_BROWSE_BTN).equals(
 1136  
                                                         actionCommand)) {
 1137  0
                                         xslRow = XSLRow.getRowByBrowseBtn(xslRows, 
 1138  
                                                 (JButton)eventSource);
 1139  0
                                         populateTFFromFileDialog(xslRow.getTextField());
 1140  0
                                 } else if (AppConstants.TAKE_ACTION.equals(actionCommand)) {
 1141  0
                                         xslRow = XSLRow.getRowByAction(xslRows, 
 1142  
                                                         (JComboBox)eventSource);
 1143  0
                                         if (xslRow.getAction().getItemCount() > 0) {
 1144  0
                                                 action = (String)xslRow.getAction().getSelectedItem();
 1145  0
                                                 xslRow.setSelectedActionIndex(0);
 1146  0
                                                 if (action.equals(
 1147  
                                                                 XSLRow.ACTIONS[XSLRow.VALIDATE_INDEX])) {
 1148  0
                                                         components.clear();
 1149  0
                                                         components.add(xslRow.getTextField());
 1150  0
                                                         components.add(xslRow.getAction());
 1151  0
                                                         components.add(xslRow.getRemoveCb());
 1152  0
                                                         components.add(xslRow.getInsertBtn());
 1153  0
                                                         components.add(xslRow.getBrowseBtn());
 1154  0
                                                         doValidateXml(stringFactory.getString(
 1155  
                                                                         LabelStringFactory.MAIN_FRAME_XSL_PREFIX) + 
 1156  
                                                                         (xslRow.getIndex() + 1), 
 1157  
                                                                 xslRow.getTextField(), false);
 1158  0
                                                 } else if (
 1159  
                                                                 action.startsWith(XSLRow.ON_OFF_ITEM_PREFIX)) {
 1160  0
                                                         xslRow.toggleOnOffBtn();
 1161  0
                                                 } else if (action.equals(
 1162  
                                                 XSLRow.ACTIONS[XSLRow.VIEW_EDIT_OUTPUT_PROPS_INDEX])) {
 1163  0
                                                         new TransformOutputPropertiesFrame(this, xslRow);
 1164  0
                                                 } else if (action.equals(
 1165  
                                                         XSLRow.ACTIONS[XSLRow.CLEAR_OUTPUT_PROPS_INDEX])) {
 1166  0
                                                         xslRow.setAreOutputPropertiesSet(false);
 1167  0
                                                         xslRow.clearOutputProperties();
 1168  0
                                                 } else if (action.equals(
 1169  
                                                                 XSLRow.ACTIONS[XSLRow.
 1170  
                                                                                CLEAR_ALL_PARAMETERS_INDEX])) {
 1171  0
                                                         xslRow.clearAllParameters();                                                        
 1172  0
                                                 } else if (action.equals(XSLRow.ACTIONS[XSLRow.
 1173  
                                                                          VIEW_EDIT_PARAMETERS_INDEX])) {
 1174  0
                                                         new TransformParametersFrame(this, xslRow);
 1175  0
                                                 } else if (action.equals(XSLRow.ACTIONS[XSLRow.
 1176  
                                                                    PERFORM_IDENTITY_TRANSFORM_INDEX])) {
 1177  0
                                                         if (validateXml(stringFactory.getString(
 1178  
                                                                         LabelStringFactory.MAIN_FRAME_XSL_PREFIX) + 
 1179  
                                                                         (xslRow.getIndex()+1),
 1180  
                                                                 xslRow.getTextField(), true)) {
 1181  0
                                                                 components.clear();
 1182  0
                                                                 components.add(xslRow.getBrowseBtn());
 1183  0
                                                                 components.add(xslRow.getRemoveCb());
 1184  0
                                                                 components.add(xslRow.getInsertBtn());
 1185  0
                                                                 components.add(xslRow.getTextField());
 1186  0
                                                                 doIdentityTransform(
 1187  
                                                                         stringFactory.getString(
 1188  
                                                                                         LabelStringFactory.
 1189  
                                                                                         MAIN_FRAME_PICK_FILE_FOR_IT),
 1190  
                                                                         xslRow.getTextField().getText(),
 1191  
                                                                         xslRow.getTextField().getText());                                                                        
 1192  0
                                                         } else {
 1193  0
                                                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1194  
                                                         }                                                        
 1195  
                                                 }
 1196  
                                         }
 1197  
                                 }
 1198  0
                                 setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1199  
                        }
 1200  0
         } catch (Throwable aAny) {
 1201  
                 // log and show dialog...
 1202  0
                 logger.error(ExceptionUtils.getFullStackTrace(aAny));
 1203  0
                 Utils.showErrorDialog(this, aAny);
 1204  0
         }
 1205  0
     }
 1206  
     
 1207  
     /**
 1208  
      * Refreshes the configuration label
 1209  
      *
 1210  
      */
 1211  
     public void refreshConfigurationLabel() {
 1212  0
             currentConfigLabel.setText(userPrefs.getConfiguration());
 1213  0
     }
 1214  
     
 1215  
     /**
 1216  
      * Refreshes the entire application window
 1217  
      *
 1218  
      */
 1219  
     public void refreshApplication() {
 1220  0
             refreshStylesheets();
 1221  0
                 refreshConfigurationLabel();
 1222  0
                 initializeControls();
 1223  0
     }
 1224  
     
 1225  
     /**
 1226  
      * Helper method that populates aTextField by presenting a file-open dialog
 1227  
      * to the user.
 1228  
      * @param aTextField
 1229  
      */
 1230  
     public void populateTFFromFileDialog(JTextField aTextField) 
 1231  
     throws IOException {
 1232  
             
 1233  
             int returnVal;
 1234  
             File file;
 1235  
             
 1236  0
                 Utils.getInstance().getFileChooser().setDialogType(
 1237  
                                 JFileChooser.OPEN_DIALOG);
 1238  0
                 returnVal = Utils.getInstance().getFileChooser().showOpenDialog(this);
 1239  0
                 if (returnVal == JFileChooser.APPROVE_OPTION) {
 1240  0
                         file = Utils.getInstance().getFileChooser().getSelectedFile();
 1241  0
                         setLastFileChosen(file.getAbsolutePath());
 1242  0
                         aTextField.setText(file.getAbsolutePath());
 1243  
                 }
 1244  0
     }
 1245  
     
 1246  
     /**
 1247  
      * Inserts a new XSL row
 1248  
      * @param aIndex
 1249  
      */
 1250  
     private void insertXSLRow(int aIndex) {
 1251  
             
 1252  
             int size, loop;
 1253  
             
 1254  0
             xslRows.add(aIndex, new XSLRow(this, xslPanel, 
 1255  
                             new JButton(AppConstants.INSERT), 
 1256  
                             // label text is updated by subsequent XSLRow.setIndex() call...
 1257  
                                 new JLabel(""), 
 1258  
                                 new JTextField(AppConstants.TF_LENGTH),
 1259  
                                 new JCheckBox(), new JButton(stringFactory.getString(
 1260  
                                         LabelStringFactory.MAIN_FRAME_BROWSE_BTN)), 
 1261  
                                 new JComboBox(), new JLabel(), -1));
 1262  0
             size = xslRows.size();
 1263  0
             for (loop = 0; loop < size; loop++) {
 1264  0
                     ((XSLRow)(xslRows.get(loop))).setIndex(loop);
 1265  
             }
 1266  0
     }
 1267  
     
 1268  
     /**
 1269  
      * Appends a new XSL row
 1270  
      *
 1271  
      */
 1272  
     private void addXSLRow() {
 1273  
             
 1274  
             int size;
 1275  
             
 1276  0
             size = xslRows.size();
 1277  0
                 xslRows.add(new XSLRow(this, xslPanel, new JButton(AppConstants.INSERT), 
 1278  
                                         new JLabel(MessageFormat.format(stringFactory.getString(
 1279  
                                                         LabelStringFactory.XSLROW_XSL_LABEL), 
 1280  
                                                         xslRows.size()+1)),
 1281  
                                         new JTextField(AppConstants.TF_LENGTH),
 1282  
                                         new JCheckBox(), new JButton(stringFactory.getString(
 1283  
                                                 LabelStringFactory.MAIN_FRAME_BROWSE_BTN)), 
 1284  
                                         new JComboBox(), new JLabel(), size));
 1285  0
     }
 1286  
     
 1287  
     /**
 1288  
      * Enables or disables the "remove checked" button.  If any of the xsl
 1289  
      * rows are checked, the button will be enabled.
 1290  
      *
 1291  
      */
 1292  
     private void enableRemoveCheckedBtn() {
 1293  
             
 1294  
             boolean enable;
 1295  
             int size, loop;
 1296  
             
 1297  0
             enable = false;
 1298  0
             size = xslRows.size();
 1299  0
             for (loop = 0; loop < size; loop++) {
 1300  0
                     if (((XSLRow)(xslRows.get(loop))).getRemoveCb().isSelected()) {
 1301  0
                             enable = true;
 1302  0
                             break;
 1303  
                     }
 1304  
             }
 1305  0
             removeCheckedBtn.setEnabled(enable);
 1306  0
     }
 1307  
 
 1308  
     /**
 1309  
      * Method to validate the source xml.
 1310  
      */
 1311  
     private boolean validateXml(String aLabel, String sourceXmlFile, 
 1312  
                     boolean checkWarnings, boolean checkErrors, 
 1313  
                         boolean checkFatalErrors, JFrame parent, 
 1314  
                         boolean aSuppressSuccessDialog) {
 1315  
             
 1316  
         boolean isValid;
 1317  
         
 1318  0
         isValid = false;
 1319  
         try {
 1320  0
             Utils.getInstance().isValidXml(new File(sourceXmlFile), 
 1321  
                             checkWarnings, checkErrors, checkFatalErrors);
 1322  0
             isValid = true;
 1323  0
             if (!aSuppressSuccessDialog) {
 1324  0
                     Utils.showDialog(parent, MessageFormat.format(
 1325  
                                     stringFactory.getString(LabelStringFactory.
 1326  
                                                     MAIN_FRAME_VALID_XML_MSG), 
 1327  
                                                     sourceXmlFile), 
 1328  
                                                     stringFactory.getString(LabelStringFactory.
 1329  
                                                             MAIN_FRAME_VALID_XML_MSG_HDR_YES), 
 1330  
                                         JOptionPane.INFORMATION_MESSAGE);
 1331  
             }
 1332  0
         } catch (UnknownHostException aException) {
 1333  0
                 logger.error(aException);
 1334  0
                 Utils.handleXMLError(stringFactory.getString(LabelStringFactory.
 1335  
                                         MAIN_FRAME_VALID_XML_MSG_HDR_NO), aLabel, 
 1336  
                                         stringFactory.getString(LabelStringFactory.
 1337  
                                                         MAIN_FRAME_XML_VALIDATION_ERR), 
 1338  
                             sourceXmlFile, this, aException.getMessage());
 1339  0
         } catch (SocketException aException) {
 1340  0
                 logger.error(aException);
 1341  0
                 Utils.handleXMLError(stringFactory.getString(LabelStringFactory.
 1342  
                                         MAIN_FRAME_VALID_XML_MSG_HDR_NO), aLabel, 
 1343  
                                         stringFactory.getString(LabelStringFactory.
 1344  
                                                         MAIN_FRAME_XML_VALIDATION_ERR), 
 1345  
                             sourceXmlFile, this, aException.getMessage());
 1346  0
         } catch (Throwable aAny) {
 1347  0
                 Utils.handleXMLError(stringFactory.getString(LabelStringFactory.
 1348  
                                         MAIN_FRAME_VALID_XML_MSG_HDR_NO), aLabel, 
 1349  
                                         stringFactory.getString(LabelStringFactory.
 1350  
                                                         MAIN_FRAME_XML_VALIDATION_ERR), 
 1351  
                             sourceXmlFile, this, aAny);
 1352  0
         }
 1353  0
         return isValid;
 1354  
     }
 1355  
 
 1356  
     /**
 1357  
      * Returns true if a stylesheet between the indexes of aStartIndex
 1358  
      * and the end of the list are enabled and have a file specified.
 1359  
      * @param aStartIndex
 1360  
      * @param aSizeOfList
 1361  
      * @return
 1362  
      */
 1363  
     private boolean isNextStylesheet(int aStartIndex, int aSizeOfList) {
 1364  
             
 1365  
             boolean isNextStylesheet;
 1366  
             int loop;
 1367  
             
 1368  0
             isNextStylesheet = false;
 1369  0
             for (loop = aStartIndex; loop < aSizeOfList; loop++) {
 1370  0
                     if (((XSLRow)(xslRows.get(loop))).isOnAndNotEmpty()) {
 1371  0
                             isNextStylesheet = true;
 1372  0
                             break;
 1373  
                     }
 1374  
             }
 1375  0
             return isNextStylesheet;
 1376  
     }
 1377  
     
 1378  
     /**
 1379  
      * Initiates the xml-validation in a separate thread.
 1380  
      * @param aLabel
 1381  
      * @param aTextField
 1382  
      * @param aSuppressSuccessDialog
 1383  
      */
 1384  
     private void doValidateXml(String aLabel, JTextField aTextField, 
 1385  
                     boolean aSuppressSuccessDialog) {
 1386  0
             label = aLabel;
 1387  0
             textField = aTextField;
 1388  0
             suppressSuccessDialog = aSuppressSuccessDialog;
 1389  0
             threadMode = THREADMODE_DO_VALIDATE;
 1390  0
             Utils.setEnabled(components, false);
 1391  0
             new Thread(this).start();
 1392  0
     }
 1393  
     
 1394  
     /**
 1395  
      * Entry point of threads.
 1396  
      */
 1397  
     public void run() { 
 1398  
             
 1399  
             String sresultsFile;           
 1400  
             File xmlFile, resultsFile;
 1401  
             byte results[];
 1402  
             
 1403  
             try {
 1404  0
                     switch (threadMode) {
 1405  
                     case THREADMODE_DO_TRANSFORM:
 1406  0
                             executeTransform();
 1407  0
                             break;
 1408  
                     case THREADMODE_DO_VALIDATE:
 1409  0
                             validateXml(label, textField, suppressSuccessDialog);
 1410  0
                             break;
 1411  
                     case THREADMODE_DO_XML_IDENTITY_TRANSFORM:
 1412  0
                             xmlFile = new File(identityTransformSourceXmlFile);
 1413  0
                             sresultsFile = (String)JOptionPane.showInputDialog(this, 
 1414  
                                             identityTransformMessage, stringFactory.getString(
 1415  
                                                             LabelStringFactory.
 1416  
                                                             MAIN_FRAME_IDENTITY_TRANSFORM), 
 1417  
                                                 JOptionPane.QUESTION_MESSAGE,
 1418  
                                                 null, null, identityTransformResultXmlFile);
 1419  0
                             if (sresultsFile != null) {
 1420  0
                                     resultsFile = new File(sresultsFile);
 1421  0
                                     resultsFile.getParentFile().mkdirs();
 1422  0
                                     results = XMLUtils.transform(xmlFile, 
 1423  
                                 xmlIdentityTransformOutputProps);
 1424  0
                                 IOUtils.writeFile(resultsFile, results);        
 1425  
                             }
 1426  
                             break;
 1427  
                     }
 1428  0
             } catch (Throwable aAny) {
 1429  0
                     logger.error(ExceptionUtils.getFullStackTrace(aAny));
 1430  0
                     Utils.showErrorDialog(this, aAny);
 1431  
             } finally {
 1432  0
                         Utils.setEnabled(components, true);
 1433  0
                     setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 1434  0
             }
 1435  0
     }
 1436  
     
 1437  
     /**
 1438  
      * Initiates the transform operation in a seperate thread.
 1439  
      *
 1440  
      */
 1441  
     private void doTransform() {
 1442  0
             components.clear();
 1443  0
             components.add(transformBtn);
 1444  0
             threadMode = THREADMODE_DO_TRANSFORM;
 1445  0
             Utils.setEnabled(components, false);
 1446  0
             new Thread(this).start();
 1447  0
     }
 1448  
     
 1449  
     /**
 1450  
      * Initiates the identity-transform operation in a separate thread.
 1451  
      * @param aMessage
 1452  
      * @param aIdentityTransformSourceXmlFile
 1453  
      * @param aIdentityTransformResultXmlFile
 1454  
      */
 1455  
     private void doIdentityTransform(String aMessage, 
 1456  
             String aIdentityTransformSourceXmlFile,
 1457  
             String aIdentityTransformResultXmlFile) {
 1458  0
             Utils.setEnabled(components, false);
 1459  0
             threadMode = THREADMODE_DO_XML_IDENTITY_TRANSFORM;
 1460  0
             identityTransformMessage = aMessage;
 1461  0
             identityTransformSourceXmlFile = aIdentityTransformSourceXmlFile;
 1462  0
                 identityTransformResultXmlFile = aIdentityTransformResultXmlFile;            
 1463  0
             new Thread(this).start();
 1464  0
     }
 1465  
     
 1466  
     /**
 1467  
      * Performs transforms.
 1468  
      * @throws Exception
 1469  
      */
 1470  
     private void executeTransform() throws Exception {
 1471  
             
 1472  
             int loop;
 1473  
             XSLRow lrows[];
 1474  
             
 1475  0
             if (validateAll()) {
 1476  0
                     lrows = Utils.toArray(xslRows);
 1477  0
                     for (loop = 0; loop < lrows.length; loop++) {
 1478  0
                             lrows[loop].setTimeToTransform(0);
 1479  
                     }
 1480  0
                         transform(IOUtils.getContents(sourceXmlTf.getText()));                                
 1481  
                 }
 1482  0
     }
 1483  
     
 1484  
     /**
 1485  
      * Method to do xslt transform.
 1486  
      */
 1487  
     private void transform(byte aXmlContents[]) throws TransformerException,
 1488  
                 IOException, ParserConfigurationException, SAXException {
 1489  
 
 1490  
                 int loop, size;
 1491  
                 long transformTime;
 1492  
                 byte tmp[];
 1493  
             XSLRow xslRow;
 1494  
             byte transformResult[];
 1495  
             boolean success;
 1496  
             TransformOutputProperties transformOutputProps;
 1497  
             TransformParameters transformParameters;
 1498  
             
 1499  0
             xslRow = null;
 1500  0
             transformOutputProps = null;
 1501  0
             transformParameters = null;
 1502  0
             size = xslRows.size();
 1503  0
                 transformResult = aXmlContents;
 1504  0
                 success = true;
 1505  0
                 lastTotalTransformTime = 0;
 1506  
                 try {
 1507  0
                     for (loop = 0; loop < size; loop++) {
 1508  0
                                     xslRow = (XSLRow)xslRows.get(loop);
 1509  0
                                     transformOutputProps = xslRow.getTransformOutputProperties();
 1510  0
                                     transformParameters = xslRow.getTransformParameters();
 1511  0
                                     if (xslRow.isOnAndNotEmpty()) {
 1512  0
                                             transformResult = XMLUtils.transform(tmp = transformResult, 
 1513  
                                                     xslRow.getTextField().getText(),
 1514  
                                                     transformOutputProps, transformParameters);
 1515  0
                                             transformTime = XMLUtils.getTransformTime(tmp, 
 1516  
                                                                xslRow.getTextField().getText(),
 1517  
                                                             transformOutputProps, transformParameters);
 1518  0
                                     xslRow.setTimeToTransform(transformTime);
 1519  0
                                     lastTotalTransformTime += transformTime;
 1520  0
                                     if (!XMLUtils.isXml(transformResult)) {
 1521  0
                                             if (isNextStylesheet(loop + 1, size)) {
 1522  0
                                                     success = false;
 1523  0
                                                     Utils.showDialog(this, MessageFormat.format(
 1524  
                                                                     stringFactory.getString(
 1525  
                                                                     LabelStringFactory.
 1526  
                                                                     MAIN_FRAME_TRANSFORM_RESULT_NOT_XML), 
 1527  
                                                                     (loop + 1)), stringFactory.getString(
 1528  
                                                                                 LabelStringFactory.
 1529  
                                                                                 MAIN_FRAME_TRANSFORM_ERR_MSG), 
 1530  
                                                             JOptionPane.INFORMATION_MESSAGE);  
 1531  0
                                                     break;                                          
 1532  
                                             }
 1533  
                                     }
 1534  
                             }
 1535  
                     }
 1536  0
                 } catch (TransformerException aTransformerException) {
 1537  0
                         success = false;
 1538  0
                         Utils.handleXMLError(stringFactory.getString(
 1539  
                                         LabelStringFactory.MAIN_FRAME_ERR_IN_XSL), 
 1540  
                                         xslRow.getDescription(),
 1541  
                                 stringFactory.getString(
 1542  
                                                 LabelStringFactory.MAIN_FRAME_XSL_TRANSFORMATION_ERR), 
 1543  
                                                 xslRow.getTextField().getText(),
 1544  
                                 this, aTransformerException);
 1545  0
                 }
 1546  0
             if (success) {
 1547  0
                     transformTimeLabel.setText(lastTotalTransformTime + " " +
 1548  
                                     stringFactory.getString(
 1549  
                                                     LabelStringFactory.
 1550  
                                                     MAIN_FRAME_MILLISECONDS_ABBREVIATION));
 1551  0
                         logger.info("total transform time: " + lastTotalTransformTime + 
 1552  
                                         " " + stringFactory.getString(LabelStringFactory.
 1553  
                                         MAIN_FRAME_MILLISECONDS_ABBREVIATION));
 1554  0
                     transformTimings.setEnabled(true);
 1555  0
                         if (autosaveCb.isSelected()) {
 1556  0
                                 IOUtils.writeFile(new File(autosavePathTf.getText()), 
 1557  
                                         transformResult);                    
 1558  
                         }
 1559  0
                         if (!suppressOutputWindowCb.isSelected()) {
 1560  0
                                 if (XMLUtils.isXml(transformResult)) {
 1561  0
                                         if (outputAsTextIfXml.isSelected()) {
 1562  0
                                                 new OutputFrame(this, stringFactory.getString(
 1563  
                                                                 LabelStringFactory.
 1564  
                                                                 MAIN_FRAME_TRANSFORM_RESULTS), transformResult,
 1565  
                                                         Utils.toArray(xslRows));
 1566  0
                                         } else {
 1567  0
                                                 new OutputFrame(this, stringFactory.getString(
 1568  
                                                                 LabelStringFactory.
 1569  
                                                                 MAIN_FRAME_TRANSFORM_RESULTS), 
 1570  
                                                         XMLUtils.getDocument(transformResult), 
 1571  
                                                         transformOutputProps, 
 1572  
                                                         Utils.toArray(xslRows), true);
 1573  
                                         }                                        
 1574  0
                                 } else {
 1575  0
                                         new OutputFrame(this, stringFactory.getString(
 1576  
                                                         LabelStringFactory.MAIN_FRAME_TRANSFORM_RESULTS), 
 1577  
                                                         transformResult, Utils.toArray(xslRows));
 1578  
                                 }
 1579  
                         }
 1580  
             }
 1581  0
     }
 1582  
 
 1583  
     /**
 1584  
      * Writes transform output property values to the user preferences
 1585  
      * object.
 1586  
      * @param aOutputProperties
 1587  
      * @param aPropertyNamePrefix
 1588  
      */
 1589  
         private void persistOutputProperties(
 1590  
                         TransformOutputProperties aOutputProperties,
 1591  
                         String aPropertyNamePrefix) {
 1592  
                         
 1593  
                 String val;
 1594  
                 
 1595  0
                 if (StringUtils.isNotBlank(val = 
 1596  
                         aOutputProperties.getCDATA_SECTION_ELEMENTS())) {
 1597  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1598  
                                 AppConstants.CDATA_SECTION_ELEMENTS, val);
 1599  
                 }
 1600  0
                 if (StringUtils.isNotBlank(val = 
 1601  
                         aOutputProperties.getDOCTYPE_PUBLIC())) {
 1602  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1603  
                                 AppConstants.DOCTYPE_PUBLIC, val);
 1604  
                 }                   
 1605  0
                 if (StringUtils.isNotBlank(val = 
 1606  
                         aOutputProperties.getDOCTYPE_SYSTEM())) {
 1607  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1608  
                                 AppConstants.DOCTYPE_SYSTEM, val);
 1609  
                 }
 1610  0
                 if (StringUtils.isNotBlank(val = 
 1611  
                         aOutputProperties.getENCODING())) {
 1612  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1613  
                                 AppConstants.ENCODING, val);
 1614  
                 }
 1615  0
                 if (StringUtils.isNotBlank(val = 
 1616  
                         aOutputProperties.getINDENT())) {
 1617  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1618  
                                 AppConstants.INDENT, val);
 1619  
                 }
 1620  0
                 if (StringUtils.isNotBlank(val = 
 1621  
                         aOutputProperties.getMEDIA_TYPE())) {
 1622  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1623  
                                 AppConstants.MEDIA_TYPE, val);
 1624  
                 }                        
 1625  0
                 if (StringUtils.isNotBlank(val = 
 1626  
                         aOutputProperties.getMETHOD())) {
 1627  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1628  
                                 AppConstants.METHOD, val);
 1629  
                 }                        
 1630  0
                 if (StringUtils.isNotBlank(val = 
 1631  
                         aOutputProperties.getOMIT_XML_DECLARATION())) {
 1632  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1633  
                                 AppConstants.OMIT_XML_DECLARATION, val);
 1634  
                 }                        
 1635  0
                 if (StringUtils.isNotBlank(val = 
 1636  
                         aOutputProperties.getSTANDALONE())) {
 1637  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1638  
                                 AppConstants.STANDALONE, val);
 1639  
                 }                        
 1640  0
                 if (StringUtils.isNotBlank(val = 
 1641  
                         aOutputProperties.getVERSION())) {
 1642  0
                         userPrefs.setProperty(aPropertyNamePrefix + 
 1643  
                                 AppConstants.VERSION, val);
 1644  
                 }                
 1645  0
         }
 1646  
 
 1647  
         /**
 1648  
          * Persists the user preferences object to the preferences file.
 1649  
          *
 1650  
          */
 1651  
     private void persistUserPrefs() {
 1652  
             
 1653  
             int loop, size, innerLoop;
 1654  
             String paramNames[];
 1655  
             XSLRow xslRow;
 1656  
             String propertyName;
 1657  
         TransformParameters parameters;
 1658  
         
 1659  0
         userPrefs.clearDynamicPrefs();
 1660  0
         userPrefs.setProperty(AppConstants.CHK_WARNINGS_PROP, 
 1661  
                         "" + checkSaxWarning.isSelected());
 1662  0
         userPrefs.setProperty(AppConstants.CHK_ERRORS_PROP, 
 1663  
                         "" + checkSaxError.isSelected());
 1664  0
         userPrefs.setProperty(AppConstants.CHK_FATAL_ERRORS_PROP, 
 1665  
                         "" + checkSaxFatalError.isSelected());
 1666  0
         userPrefs.setProperty(AppConstants.X_COORD_PROP, 
 1667  
                    Integer.toString(this.getX()));
 1668  0
         userPrefs.setProperty(AppConstants.Y_COORD_PROP, 
 1669  
                    Integer.toString(this.getY()));
 1670  0
         userPrefs.setProperty(AppConstants.LAST_XML_FILE_PROP, 
 1671  
                    sourceXmlTf.getText());
 1672  0
         userPrefs.setProperty(AppConstants.SUPPRESS_OUTPUT_WINDOW_PROP, 
 1673  
                         "" + suppressOutputWindowCb.isSelected());
 1674  0
                 userPrefs.setProperty(AppConstants.OUTPUT_AS_TEXT_IF_XML_PROP, 
 1675  
                         "" + outputAsTextIfXml.isSelected());
 1676  0
         userPrefs.setProperty(AppConstants.AUTOSAVE_RESULT_PROP, 
 1677  
                         "" + autosaveCb.isSelected());
 1678  0
         userPrefs.setProperty(AppConstants.AUTOSAVE_FILE_PROP, 
 1679  
                    autosavePathTf.getText());
 1680  
         
 1681  0
                 persistOutputProperties(xmlIdentityTransformOutputProps, 
 1682  
                         "xml_identity_transform_outputproperties_");
 1683  0
                 userPrefs.setProperty("xml_identity_transform_opInd", 
 1684  
                         "" + areXmlOutputPropertiesSet);
 1685  0
                 size = xslRows.size();
 1686  0
         for (loop = 0; loop < size; loop++) {
 1687  0
                   xslRow = (XSLRow)xslRows.get(loop);
 1688  
                    // text field value
 1689  0
                    propertyName = "xsl_" + loop + "_file";
 1690  0
                    userPrefs.setProperty(propertyName, 
 1691  
                            xslRow.getTextField().getText());
 1692  
                    // on/off
 1693  0
                    propertyName = "xsl_" + loop + "_onoff";
 1694  0
                    userPrefs.setProperty(propertyName, "" + xslRow.isOn());   
 1695  
                    // output properties indicator
 1696  0
                    propertyName = "xsl_" + loop + "_opInd";
 1697  0
                    userPrefs.setProperty(propertyName, "" + 
 1698  
                                    xslRow.areOutputPropertiesSet());
 1699  
                    
 1700  0
                    persistOutputProperties(xslRow.getTransformOutputProperties(), 
 1701  
                                 "xsl_" + loop + "_outputproperties_");
 1702  0
                         parameters = xslRow.getTransformParameters();
 1703  0
                         paramNames = parameters.getParameterNames();
 1704  0
                         for (innerLoop = 0; innerLoop < paramNames.length; innerLoop++) {
 1705  0
                                 userPrefs.setProperty("xsl_" + loop + "_params_" + 
 1706  
                                         innerLoop + "_" + paramNames[innerLoop], 
 1707  
                                         (String)parameters.getParameter(paramNames[innerLoop]));
 1708  
                         }
 1709  
         }           
 1710  0
         userPrefs.setProperty(AppConstants.NUM_STYLESHEETS_PROP, 
 1711  
                    Integer.toString(size)); 
 1712  0
         userPrefs.setProperty(AppConstants.FRAME_HEIGHT_PROP,
 1713  
                    Integer.toString(getHeight()));
 1714  0
                 userPrefs.setProperty(AppConstants.FRAME_WIDTH_PROP,
 1715  
                         Integer.toString(getWidth()));
 1716  0
                 if (StringUtils.isNotBlank(lastFileChosen)) {
 1717  0
                         userPrefs.setProperty(AppConstants.LAST_FILE_CHOSEN_PROP,
 1718  
                                 lastFileChosen);
 1719  
                 }
 1720  0
     }
 1721  
 
 1722  
     /**
 1723  
      * Method to shutdown the app.
 1724  
      */
 1725  
     private void destroy() {
 1726  
             try {
 1727  0
                     persistUserPrefs();
 1728  0
                     userPrefs.persistUserPrefs();
 1729  0
             } catch (IOException aException) {
 1730  0
                     logger.error(ExceptionUtils.getFullStackTrace(aException));
 1731  0
                     Utils.showErrorDialog(this, aException);
 1732  
             } finally {
 1733  0
                     dispose();
 1734  0
                     System.exit(0);
 1735  0
             }
 1736  0
     }
 1737  
 
 1738  
     /**
 1739  
      * class main() method - application entry point
 1740  
      * @param aArgs
 1741  
      */
 1742  
     public static void main(String aArgs[]) throws Exception {
 1743  0
                 JFrame.setDefaultLookAndFeelDecorated(true);
 1744  0
         new BasicXSLTFrame();
 1745  0
     }
 1746  
 }