Search in sources :

Example 16 with AS400

use of com.ibm.as400.access.AS400 in project IBMiProgTool by vzupka.

the class EditFile method rewriteSourceMember.

/**
 * Rewrite source member with edited text area using an intermediate temporary IFS file; This method is fast enough.
 *
 * @return
 */
protected String rewriteSourceMember() {
    // Extract individual names (libraryName, fileName, memberName) from the AS400 IFS path
    extractNamesFromIfsPath(filePathString);
    // Path to the output source member
    String outMemberPathString = "/QSYS.LIB/" + libraryName + ".LIB/" + fileName + ".FILE" + "/" + memberName + ".MBR";
    // Enable calling CL commands
    CommandCall cmdCall = new CommandCall(remoteServer);
    IFSFileOutputStream outStream = null;
    try {
        // ------------------------------------
        if (!properties.getProperty("OVERWRITE_FILE").equals("Y")) {
            row = "Info: Member  " + libraryName + "/" + fileName + "(" + memberName + ")   cannot be overwtitten. " + " Overwriting files is not allowed.";
            mainWindow.msgVector.add(row);
            mainWindow.showMessages();
            return "ERROR";
        }
        // Overwrite is allowed
        // --------------------
        // First create an IFS '/home/userName directory if it does not exist
        String home_userName = "/home/" + userName;
        IFSFile ifsDir = new IFSFile(remoteServer, home_userName);
        // Create new directory if it does not exist
        ifsDir.mkdir();
        // Create hidden temporary file (with leading dot) in the directory
        String tmpFileString = home_userName + "/.tmp" + Timestamp.valueOf(LocalDateTime.now()).toString();
        IFSFile ifsTmpFile = new IFSFile(remoteServer, tmpFileString);
        IFSFile ifsTmpFilePath = new IFSFile(remoteServer, tmpFileString);
        ifsTmpFile.createNewFile();
        // Force the memeber CCSID to the IFS file as an attribute
        ifsTmpFilePath.setCCSID(ibmCcsidInt);
        // Copy edited text area to the temporary IFS file
        outStream = new IFSFileOutputStream(remoteServer, tmpFileString);
        String textAreaString = textArea.getText();
        byte[] byteArray;
        AS400Text textConverter = new AS400Text(textAreaString.length(), ibmCcsidInt);
        byteArray = textConverter.toBytes(textAreaString);
        // Write text from the text area to the file
        outStream.write(byteArray);
        // Close file
        outStream.close();
        // Copy data from temporary IFS file to the member. If the member does not exist it is created.
        String commandCpyFrmStmfString = "CPYFRMSTMF FROMSTMF('" + tmpFileString + "') TOMBR('" + outMemberPathString + "') MBROPT(*REPLACE) CVTDTA(*AUTO)";
        // Perform the command
        cmdCall.run(commandCpyFrmStmfString);
        // Get messages from the command if any
        AS400Message[] as400MessageList = cmdCall.getMessageList();
        // return.
        for (AS400Message as400Message : as400MessageList) {
            if (as400Message.getType() == AS400Message.ESCAPE) {
                row = "Error: Copy IFS file  " + tmpFileString + "  to source member  " + tmpFileString + "  using command CPYFRMSTMF  -  " + as400Message.getID() + " " + as400Message.getText();
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
                return "ERROR";
            } else {
                row = "Info: Copy IFS file  " + tmpFileString + "  to source member  " + tmpFileString + "  using command CPYFRMSTMF  -  " + as400Message.getID() + " " + as400Message.getText();
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
            }
        }
        // Delete the temporary file
        ifsTmpFile.delete();
        row = "Comp: Source member  " + libraryName + "/" + fileName + "(" + memberName + ")  was saved.";
        mainWindow.msgVector.add(row);
        mainWindow.showMessages();
        return "";
    } catch (Exception exc) {
        try {
            outStream.close();
        } catch (Exception exce) {
            exce.printStackTrace();
        }
        exc.printStackTrace();
        row = "Error: 3 Data cannot be written to the source member  " + libraryName + "/" + fileName + "(" + memberName + ")  -  " + exc.toString();
        mainWindow.msgVector.add(row);
        mainWindow.showMessages();
        // Must not continue in order not to lock an object
        return "ERROR";
    }
}
Also used : CommandCall(com.ibm.as400.access.CommandCall) IFSFileOutputStream(com.ibm.as400.access.IFSFileOutputStream) AS400Text(com.ibm.as400.access.AS400Text) AS400Message(com.ibm.as400.access.AS400Message) CannotUndoException(javax.swing.undo.CannotUndoException) CannotRedoException(javax.swing.undo.CannotRedoException) BadLocationException(javax.swing.text.BadLocationException) IFSFile(com.ibm.as400.access.IFSFile)

Example 17 with AS400

use of com.ibm.as400.access.AS400 in project IBMiProgTool by vzupka.

the class MainWindow method createWindow.

/**
 * Create window containing trees with initial files in upper part; Left tree
 * shows local file system; Right tree shows IBM i file system (IFS).
 */
public void createWindow() {
    cont = getContentPane();
    globalPanel = new JPanel();
    globalPanelLayout = new GroupLayout(globalPanel);
    menuBar = new JMenuBar();
    helpMenu = new JMenu("Help");
    helpMenuItemEN = new JMenuItem("Help English");
    helpMenuItemCZ = new JMenuItem("Nápověda česky");
    helpMenuItemRPGIII = new JMenuItem("RPG III forms");
    helpMenuItemRPGIV = new JMenuItem("RPG IV forms");
    helpMenuItemCOBOL = new JMenuItem("COBOL form");
    helpMenuItemDDS = new JMenuItem("DDS forms");
    helpMenu.add(helpMenuItemEN);
    helpMenu.add(helpMenuItemCZ);
    helpMenu.add(helpMenuItemRPGIII);
    helpMenu.add(helpMenuItemRPGIV);
    helpMenu.add(helpMenuItemCOBOL);
    helpMenu.add(helpMenuItemDDS);
    menuBar.add(helpMenu);
    // In macOS on the main system menu bar above, in Windows on the window menu bar
    setJMenuBar(menuBar);
    panelTop = new JPanel();
    panelTopLayout = new GroupLayout(panelTop);
    panelTop.setLayout(panelTopLayout);
    panelPathLeft = new JPanel();
    panelPathLeft.setLayout(new BoxLayout(panelPathLeft, BoxLayout.LINE_AXIS));
    scrollPaneLeft = new JScrollPane();
    scrollPaneLeft.setBorder(BorderFactory.createEmptyBorder());
    panelPathRight = new JPanel();
    panelPathRight.setLayout(new BoxLayout(panelPathRight, BoxLayout.LINE_AXIS));
    scrollPaneRight = new JScrollPane();
    scrollPaneRight.setBorder(BorderFactory.createEmptyBorder());
    // Windows: Disks combo box is included in order to choose proper root
    // directory (A:\, C:\, ...)
    Component diskLabelWin;
    Component disksComboBoxWin;
    if (operatingSystem.equals(WINDOWS)) {
        diskLabelWin = disksLabel;
        disksComboBoxWin = disksComboBox;
    } else {
        // 
        // Unix (Mac): Empty component instead of combo box
        diskLabelWin = new JLabel("");
        disksComboBoxWin = new JLabel("");
    }
    disksComboBox.setToolTipText("List of root directories.");
    // Lay out components in panelTop
    panelTopLayout.setAutoCreateGaps(false);
    panelTopLayout.setAutoCreateContainerGaps(false);
    panelTopLayout.setHorizontalGroup(panelTopLayout.createParallelGroup(Alignment.LEADING).addGroup(panelTopLayout.createSequentialGroup().addComponent(userNameLabel).addComponent(userNameTextField).addComponent(hostLabel).addComponent(hostTextField).addComponent(connectReconnectButton).addGap(5).addComponent(libraryPatternLabel).addComponent(libraryPatternTextField).addGap(5).addComponent(filePatternLabel).addComponent(filePatternTextField).addGap(5).addComponent(memberPatternLabel).addComponent(memberPatternTextField).addGap(5).addComponent(sourceTypeLabel).addComponent(sourceTypeComboBox)).addGroup(panelTopLayout.createSequentialGroup().addComponent(pcCharsetLabel).addComponent(pcCharComboBox).addComponent(ibmCcsidLabel).addComponent(ibmCcsidComboBox).addComponent(sourceRecordLengthLabel).addComponent(sourceRecordLengthTextField).addComponent(sourceRecordPrefixLabel).addComponent(sourceRecordPrefixCheckBox).addComponent(overwriteOutputFileLabel).addComponent(overwriteOutputFileCheckBox).addComponent(diskLabelWin).addComponent(disksComboBoxWin)));
    panelTopLayout.setVerticalGroup(panelTopLayout.createSequentialGroup().addGroup(panelTopLayout.createParallelGroup(Alignment.CENTER).addComponent(userNameLabel).addComponent(userNameTextField).addComponent(hostLabel).addComponent(hostTextField).addComponent(connectReconnectButton).addGap(5).addComponent(libraryPatternLabel).addComponent(libraryPatternTextField).addGap(5).addComponent(filePatternLabel).addComponent(filePatternTextField).addGap(5).addComponent(memberPatternLabel).addComponent(memberPatternTextField).addGap(5).addComponent(sourceTypeLabel).addComponent(sourceTypeComboBox)).addGroup(panelTopLayout.createParallelGroup(Alignment.CENTER).addComponent(pcCharsetLabel).addComponent(pcCharComboBox).addComponent(ibmCcsidLabel).addComponent(ibmCcsidComboBox).addComponent(sourceRecordLengthLabel).addComponent(sourceRecordLengthTextField).addComponent(sourceRecordPrefixLabel).addComponent(sourceRecordPrefixCheckBox).addComponent(overwriteOutputFileLabel).addComponent(overwriteOutputFileCheckBox).addComponent(diskLabelWin).addComponent(disksComboBoxWin)));
    panelTop.setLayout(panelTopLayout);
    panelPathLeft.add(leftPathLabel);
    leftPathComboBox.setEditable(true);
    panelPathLeft.add(leftPathComboBox);
    panelPathRight.add(rightPathLabel);
    rightPathComboBox.setEditable(true);
    panelPathRight.add(rightPathComboBox);
    panelLeft = new JPanel();
    panelLeft.setLayout(new BorderLayout());
    panelLeft.add(panelPathLeft, BorderLayout.NORTH);
    panelLeft.add(scrollPaneLeft, BorderLayout.CENTER);
    panelRight = new JPanel();
    panelRight.setLayout(new BorderLayout());
    panelRight.add(panelPathRight, BorderLayout.NORTH);
    panelRight.add(scrollPaneRight, BorderLayout.CENTER);
    // Split pane inner - divided by horizontal divider
    splitPaneInner = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    splitPaneInner.setLeftComponent(panelLeft);
    splitPaneInner.setRightComponent(panelRight);
    splitPaneInner.setDividerSize(6);
    splitPaneInner.setBorder(BorderFactory.createEmptyBorder());
    // Scroll pane for message list
    scrollMessagePane.setBorder(BorderFactory.createEmptyBorder());
    // Split pane outer - divided by vertical divider
    splitPaneOuter = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    splitPaneOuter.setTopComponent(splitPaneInner);
    splitPaneOuter.setBottomComponent(scrollMessagePane);
    splitPaneOuter.setDividerSize(6);
    splitPaneOuter.setBorder(BorderFactory.createEmptyBorder());
    // This listener keeps the scroll pane at the LAST MESSAGE.
    messageScrollPaneAdjustmentListenerMax = new MessageScrollPaneAdjustmentListenerMax();
    // List of messages for placing into message scroll pane
    messageList = new JList<String>();
    // Decision what color the message will get
    messageList.setCellRenderer(new DefaultListCellRenderer() {

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value.toString().startsWith("Comp")) {
                this.setForeground(DIM_BLUE);
            } else if (value.toString().startsWith("Err")) {
                this.setForeground(DIM_RED);
            } else if (value.toString().startsWith("Info")) {
                this.setForeground(Color.GRAY);
            } else if (value.toString().startsWith("Wait")) {
                this.setForeground(DIM_PINK);
            } else {
                this.setForeground(Color.BLACK);
            }
            return component;
        }
    });
    // Build messageTable and put it to scrollMessagePane and panelMessages
    buildMessageList();
    // Create left tree showing local file system
    // ----------------
    leftRoot = properties.getProperty("LEFT_PATH");
    // ----------------------------------------------
    // Create new left side
    // ----------------------------------------------
    // Create split panes containing the PC file tree on the left side of the window
    createNewLeftSide(leftRoot);
    // Lay out the window components using GroupLayout
    // -----------------------------
    globalPanelLayout.setAutoCreateGaps(false);
    globalPanelLayout.setAutoCreateContainerGaps(false);
    globalPanelLayout.setHorizontalGroup(globalPanelLayout.createSequentialGroup().addGroup(globalPanelLayout.createParallelGroup().addComponent(panelTop).addComponent(splitPaneOuter)));
    globalPanelLayout.setVerticalGroup(globalPanelLayout.createParallelGroup().addGroup(globalPanelLayout.createSequentialGroup().addComponent(panelTop).addComponent(splitPaneOuter)));
    // Create a global panel to wrap the layout
    globalPanel.setLayout(globalPanelLayout);
    // Set border to the global panel - before it is visible
    globalPanel.setBorder(BorderFactory.createLineBorder(globalPanel.getBackground(), borderWidth));
    // When the split pane is visible - can divide it by percentage
    // 50 %
    double splitPaneInnerDividerLoc = 0.50d;
    // Percentage to reveal the first message line height when the scroll pane is full
    double splitPaneOuterDividerLoc = 0.835d;
    splitPaneInner.setDividerLocation(splitPaneInnerDividerLoc);
    splitPaneOuter.setDividerLocation(splitPaneOuterDividerLoc);
    // Stabilize vertical divider always in the middle
    splitPaneInner.setResizeWeight(0.5);
    // Register WindowListener for storing X and Y coordinates to properties
    addWindowListener(new MainWindowAdapter());
    // Register HelpWindow menu item listener
    helpMenuItemEN.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("Help English")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "IBMiProgTool_doc_EN.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemCZ.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("Nápověda česky")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "IBMiProgTool_doc_CZ.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemRPGIII.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("RPG III forms")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "RPG_III_forms.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemRPGIV.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("RPG IV forms")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "RPG_IV_forms.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemCOBOL.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("COBOL form")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "COBOL_form.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemDDS.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("DDS forms")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "DDS_forms.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Set left path string as selected in the left combo box
    leftPathComboBox.setSelectedItem(leftPathString);
    // Set also right path string in the right combo box
    rightPathComboBox.setSelectedItem(rightPathString);
    // 
    // User name text field action
    // ---------------------------
    userNameTextField.addActionListener(ae -> {
        userNameTextField.setText(userNameTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("USERNAME", userNameTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            refreshWindow();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Host text field action
    // ----------------------
    hostTextField.addActionListener(ae -> {
        hostTextField.setText(hostTextField.getText());
        // Connect or reconnect the server
        connectReconnectRefresh();
    });
    // 
    // Source Type combo box item listener
    // ---------------------
    sourceTypeComboBox.addItemListener(il -> {
        // JComboBox<String> source = new
        // JComboBox<String>((String[])il.getSource());
        JComboBox<String[]> source = (JComboBox) il.getSource();
        sourceType = (String) source.getSelectedItem();
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("SOURCE_TYPE", sourceType);
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Library pattern text field action
    // -------------------------
    libraryPatternTextField.addActionListener(ae -> {
        libraryPatternTextField.setText(libraryPatternTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("LIBRARY_PATTERN", libraryPatternTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            connectReconnectRefresh();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Source file pattern text field action
    // ------------------------------------
    filePatternTextField.addActionListener(ae -> {
        filePatternTextField.setText(filePatternTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("FILE_PATTERN", filePatternTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            connectReconnectRefresh();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Member pattern text field action
    // -------------------------------
    memberPatternTextField.addActionListener(ae -> {
        memberPatternTextField.setText(memberPatternTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("MEMBER_PATTERN", memberPatternTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            connectReconnectRefresh();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Source record length text field action
    // --------------------------------------
    sourceRecordLengthTextField.addActionListener(ae -> {
        String srcRecLen = sourceRecordLengthTextField.getText();
        try {
            Integer.parseInt(srcRecLen);
        } catch (NumberFormatException nfe) {
            // If the user enters non-integer text, take default value
            srcRecLen = "80";
        }
        sourceRecordLengthTextField.setText(srcRecLen);
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.setProperty("SOURCE_RECORD_LENGTH", srcRecLen);
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Connect/Reconnect button action
    // -------------------------------
    connectReconnectButton.addActionListener(ae -> {
        connectReconnectRefresh();
    });
    // 
    // PC charset combo box
    // --------------------
    // Select charset name from the list in combo box - listener
    pcCharComboBox.addItemListener(il -> {
        JComboBox source = (JComboBox) il.getSource();
        pcCharset = (String) source.getSelectedItem();
        if (!pcCharset.equals("*DEFAULT")) {
            // Check if charset is valid
            try {
                Charset.forName(pcCharset);
            } catch (IllegalCharsetNameException | UnsupportedCharsetException charset) {
                // If pcCharset is invalid, take ISO-8859-1
                pcCharset = "ISO-8859-1";
                pcCharComboBox.setSelectedItem(pcCharset);
            }
        }
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("PC_CHARSET", pcCharset);
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    });
    // 
    // IBM i CCSID combo box item listener
    // ---------------------
    ibmCcsidComboBox.addItemListener(il -> {
        JComboBox source = (JComboBox) il.getSource();
        ibmCcsid = (String) source.getSelectedItem();
        if (!ibmCcsid.equals("*DEFAULT")) {
            try {
                ibmCcsidInt = Integer.parseInt(ibmCcsid);
            } catch (Exception exc) {
                exc.printStackTrace();
                ibmCcsid = "37";
                ibmCcsidInt = 37;
                ibmCcsidComboBox.setSelectedItem(ibmCcsid);
            }
        }
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.setProperty("IBM_CCSID", ibmCcsid);
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Source record pattern check box - Yes = "Y", No = ""
    // ---------------------------------------------------
    sourceRecordPrefixCheckBox.addItemListener(il -> {
        Object source = il.getSource();
        if (source == sourceRecordPrefixCheckBox) {
            String check;
            if (sourceRecordPrefixCheckBox.isSelected()) {
                check = "Y";
            } else {
                check = "";
            }
            // Create the updated text file in directory "paramfiles"
            try {
                infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
                properties.load(infile);
                infile.close();
                outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
                properties.setProperty("SOURCE_RECORD_PREFIX", check);
                properties.store(outfile, PROP_COMMENT);
                outfile.close();
            } catch (Exception exc) {
                exc.printStackTrace();
            }
        }
    });
    // 
    // Overwrite output file(s) check box - Yes = "Y", No = ""
    // -------------------------------------------------------
    overwriteOutputFileCheckBox.addItemListener(il -> {
        Object source = il.getSource();
        if (source == overwriteOutputFileCheckBox) {
            String check;
            if (overwriteOutputFileCheckBox.isSelected()) {
                check = "Y";
            } else {
                check = "";
            }
            // Create the updated text file in directory "paramfiles"
            try {
                infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
                properties.load(infile);
                infile.close();
                outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
                properties.setProperty("OVERWRITE_FILE", check);
                properties.store(outfile, PROP_COMMENT);
                outfile.close();
            } catch (Exception exc) {
                exc.printStackTrace();
            }
        }
    });
    // 
    // Left popup menu on Right mouse click
    // ====================================
    // 
    // Find text in multiple PC files
    // 
    findInPcFiles.addActionListener(ae -> {
        copySourceTree = leftTree;
        // Set clipboard path string for find operation
        clipboardPathStrings = leftPathStrings;
        SearchWindow searchWindow = new SearchWindow(remoteServer, this, "PC");
    });
    // 
    // Send to remote server (IBM i)
    // 
    copyFromLeft.addActionListener(ae -> {
        copySourceTree = leftTree;
        // Set clipboard path string for paste operation
        clipboardPathStrings = leftPathStrings;
    });
    // 
    // Receive from remote server (IBM i) or PC itself
    // 
    pasteToLeft.addActionListener(ae -> {
        if (copySourceTree == rightTree) {
            row = "Wait: Copying from IBM i to PC . . .";
            msgVector.add(row);
            showMessages();
            // Paste from IBM i to PC
            ParallelCopy_IBMi_PC parallelCopy_IMBI_PC = new ParallelCopy_IBMi_PC(remoteServer, clipboardPathStrings, leftPathStrings[0], null, this);
            parallelCopy_IMBI_PC.execute();
        } else if (copySourceTree == leftTree) {
            row = "Wait: Copying from PC to PC . . .";
            msgVector.add(row);
            showMessages(nodes);
            // Paste from PC to PC
            ParallelCopy_PC_PC parallelCopy_PC_PC = new ParallelCopy_PC_PC(clipboardPathStrings, leftPathStrings[0], null, this);
            parallelCopy_PC_PC.execute();
        }
    });
    // Insert spooled file that is copied from directory *workfiles* and, renamed,
    // into selected directory *targetPathString*
    insertSpooledFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        sourcePathString = Paths.get(System.getProperty("user.dir"), "workfiles", "SpooledFile.txt").toString();
        targetPathString = leftPathStrings[0];
        copyAndRenameFile("SpooledFile.txt");
        reloadLeftSide(nodes);
    });
    // Display PC file
    displayPcFile.addActionListener(ae -> {
        clipboardPathStrings = leftPathStrings;
        // Display all selected files
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            sourcePathString = clipboardPathStrings[idx];
            JTextArea textArea = new JTextArea();
            // This is a way to display a PC file directly from Java:
            DisplayFile dspf = new DisplayFile(textArea, this);
            dspf.displayPcFile(sourcePathString);
        }
    });
    // Edit PC file
    editPcFile.addActionListener(ae -> {
        clipboardPathStrings = leftPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            sourcePathString = clipboardPathStrings[idx];
            JTextArea textArea = new JTextArea();
            JTextArea textArea2 = new JTextArea();
            EditFile edtf = new EditFile(remoteServer, this, textArea, textArea2, leftPathString, "rewritePcFile");
        }
    });
    // Rename PC file
    renamePcFile.addActionListener(ae -> {
        RenamePcObject rnmpf = new RenamePcObject(this, pcFileSep, currentX, currentY);
        rnmpf.renamePcObject(leftPathString);
    });
    // Create PC directory
    createPcDirectory.addActionListener(ae -> {
        clipboardPathStrings = leftPathStrings;
        if (clipboardPathStrings.length > 0) {
            leftPathString = clipboardPathStrings[0];
            CreateAndDeleteInPC cpcd = new CreateAndDeleteInPC(this, "createPcDirectory", currentX, currentY);
            cpcd.createAndDeleteInPC();
            reloadLeftSide(nodes);
        }
    });
    // Create PC file
    createPcFile.addActionListener(ae -> {
        CreateAndDeleteInPC cpcf = new CreateAndDeleteInPC(this, "createPcFile", currentX, currentY);
        cpcf.createAndDeleteInPC();
        reloadLeftSide(nodes);
    });
    // Move PC objects to trash
    movePcObjectToTrash.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Move selected objects to trash
        // ------------------------------
        // Set clipboard path strings for paste operation
        clipboardPathStrings = leftPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            // Set path string for the following class
            leftPathString = clipboardPathStrings[idx];
            // Move one object to trash
            CreateAndDeleteInPC dpco = new CreateAndDeleteInPC(this, "movePcObjectToTrash", currentX, currentY);
            dpco.createAndDeleteInPC();
        }
        // Remove selected nodes
        TreePath[] paths = leftTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            leftNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            leftTreeModel.removeNodeFromParent(leftNode);
        }
    });
    // 
    // Right popup menu on Right mouse click
    // =====================================
    // 
    // Find text in multiple IFS files
    // 
    findInIfsFiles.addActionListener(ae -> {
        copySourceTree = rightTree;
        // Set clipboard path string for find operation
        clipboardPathStrings = rightPathStrings;
        SearchWindow searchWindow = new SearchWindow(remoteServer, this, "IFS");
    });
    // Send to PC or IBM i itself
    copyFromRight.addActionListener(ae -> {
        copySourceTree = rightTree;
        // Set clipboard path string for paste operation
        clipboardPathStrings = rightPathStrings;
    });
    // Receive from PC or IBM i itself
    // -------------------------------
    pasteToRight.addActionListener(ae -> {
        // This listener keeps the scroll pane at the LAST MESSAGE.
        // It is removed at the end of the method of the background task.
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        sourcePathString = clipboardPathString;
        targetPathString = rightPathStrings[0];
        if (copySourceTree == rightTree) {
            // Paste from IBM i to IBM i
            row = "Wait: Copying from IBM i to IBM i . . .";
            msgVector.add(row);
            showMessages();
            ParallelCopy_IBMi_IBMi parallelCopy_IMBI_IBMI = new ParallelCopy_IBMi_IBMi(remoteServer, clipboardPathStrings, targetPathString, null, this);
            parallelCopy_IMBI_IBMI.execute();
        } else if (copySourceTree == leftTree) {
            // Paste from PC to IBM i
            row = "Wait: Copying from PC to IBM i . . .";
            msgVector.add(row);
            showMessages();
            ParallelCopy_PC_IBMi parallelCopy_PC_IBMI = new ParallelCopy_PC_IBMi(remoteServer, clipboardPathStrings, targetPathString, null, this);
            parallelCopy_PC_IBMI.execute();
        }
    });
    // Copy library
    copyLibrary.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "copyLibrary", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Clear library
    clearLibrary.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Clear selected libraries
            // ------------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "clearLibrary", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Reload nodes of cleared libraries
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            reloadRightSide();
        }
    });
    // Delete library
    deleteLibrary.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected libraries
            // -------------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteLibrary", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Create IFS directory in a parent directory
    createIfsDirectory.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createIfsDirectory", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create IFS directory in a parent directory
    createIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createIfsFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create AS400 Source Physical File
    createSourcePhysicalFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createSourcePhysicalFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create AS400 Source Member
    createSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createSourceMember", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create Save File
    createSaveFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createSaveFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Clear Save File
    clearSaveFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "clearSaveFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
    });
    // Delete IFS object (directory or file)
    deleteIfsObject.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Delete selected objects
        // -----------------------
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteIfsObject", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Delete AS400 Source Member
    deleteSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected objects
            // -----------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteSourceMember", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Delete AS400 Source Physical File
    deleteSourcePhysicalFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected objects
            // -----------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteSourcePhysicalFile", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Delete Save File
    deleteSaveFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected objects
            // -----------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteSaveFile", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Work with spooled files
    workWithSpooledFiles.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        String className = this.getClass().getSimpleName();
        // first "false" stands for *ALL users (not *CURRENT user),
        // second "true" stands for "create spooled file table".
        WrkSplFCall wwsp = new WrkSplFCall(remoteServer, this, rightPathString, // not *CURRENT user
        false, currentX, currentY, className, // create spooled file table
        true);
        wwsp.execute();
    });
    // Display IFS file
    displayIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        DisplayFile dspf = new DisplayFile(textArea, this);
        dspf.displayIfsFile(remoteServer, rightPathString);
    });
    // Edit IFS file with source types suffix (e.g. .CLLE, .RPGLE, etc.)
    editIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        JTextArea textArea2 = new JTextArea();
        EditFile edtf = new EditFile(remoteServer, this, textArea, textArea2, rightPathString, "rewriteIfsFile");
    });
    // Rename IFS file
    renameIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        RenameIfsObject rnmifsf = new RenameIfsObject(remoteServer, this, currentX, currentY);
        rnmifsf.renameIfsObject(rightPathString);
    });
    // Compile IFS file
    compileIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        if (compile == null) {
            compile = new Compile(remoteServer, this, rightPathString, true);
        }
        // "true" stands for "IFS file" as a source text
        compile.compile(rightPathString, true);
    // compile = null;
    });
    // Display IBM i Source Member
    displaySourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        DisplayFile dspf = new DisplayFile(textArea, this);
        dspf.displaySourceMember(remoteServer, rightPathString);
    });
    // Edit IBM i Source Member
    editSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        JTextArea textArea2 = new JTextArea();
        EditFile edtf = new EditFile(remoteServer, this, textArea, textArea2, rightPathString, "rewriteSourceMember");
    });
    // Compile Source Member
    compileSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        if (compile == null) {
            compile = new Compile(remoteServer, this, rightPathString, false);
        }
        // "false" means "IFS file" is NOT a source text
        compile.compile(rightPathString, false);
    // compile = null;
    });
    // 
    // Find text in multiple Source Members
    // 
    findInSourceMembers.addActionListener(ae -> {
        copySourceTree = rightTree;
        // Set clipboard path string for find operation
        clipboardPathStrings = rightPathStrings;
        SearchWindow searchWindow = new SearchWindow(remoteServer, this, "MBR");
    });
    // =================
    if (operatingSystem.equals(WINDOWS)) {
        // Item listener for DISKS ComboBox reacts on item selection with
        // the
        // mouse
        disksComboBox.addItemListener(il -> {
            JComboBox<String> comboBox = (JComboBox) il.getSource();
            leftPathString = (String) comboBox.getSelectedItem();
            // Remove the old and create a new combo box for left path selection
            panelPathLeft.remove(leftPathComboBox);
            leftPathComboBox = new JComboBox<>();
            leftPathComboBox.setEditable(true);
            panelPathLeft.add(leftPathComboBox);
            leftPathComboBox.addItem(leftPathString);
            leftPathComboBox.setSelectedIndex(0);
            // Register a new ActionListener to the new combo box
            leftPathComboBox.addActionListener(leftPathActionListener);
            // Get the first item (disk symbol or file system root) from the
            // combo box and make it leftRoot
            leftRoot = leftPathString;
            // Make the disk symbol also firstLeftRootSymbol
            firstLeftRootSymbol = leftPathString;
            // Clear and set the tree map with leftRoot and row number 0
            leftTreeMap.clear();
            leftTreeMap.put(leftRoot, 0);
            // Create a new tree and table on the left side of the window
            leftRootChanged = true;
            createNewLeftSide(leftPathString);
        });
    }
    // End Windows
    // Processing continues for both Windows and Unix:
    // 
    // Register action listener for LEFT PATH ComboBox reacts on text change
    // in its input field (first time)
    leftPathComboBox.addActionListener(leftPathActionListener);
    // Component listener reacting to WINDOW RESIZING
    ComponentListener resizingListener = new ComponentAdapter() {

        @Override
        public void componentResized(ComponentEvent componentEvent) {
            windowWidth = componentEvent.getComponent().getWidth();
            windowHeight = componentEvent.getComponent().getHeight();
            // 50 %
            double splitPaneInnerDividerLoc = 0.50d;
            // int splitPaneInnerDividerLoc = (windowWidth - (2 * borderWidth + 5)) / 2;
            splitPaneInner.setDividerLocation(splitPaneInnerDividerLoc);
        }
    };
    // Register window resizing listener
    addComponentListener(resizingListener);
    // Add the global panel to the frame, NOT container
    cont.add(globalPanel);
    add(globalPanel);
    // Set initial size and width of the window
    setSize(windowWidth, windowHeight);
    // Set window coordinates from application properties
    setLocation(mainWindowX, mainWindowY);
    // Show the window on the screen
    setVisible(true);
    // Do not pack
    pack();
}
Also used : JPanel(javax.swing.JPanel) ComponentListener(java.awt.event.ComponentListener) JTextArea(javax.swing.JTextArea) BorderLayout(java.awt.BorderLayout) DefaultListCellRenderer(javax.swing.DefaultListCellRenderer) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) ComponentEvent(java.awt.event.ComponentEvent) JSplitPane(javax.swing.JSplitPane) IFSFile(com.ibm.as400.access.IFSFile) BoxLayout(javax.swing.BoxLayout) URI(java.net.URI) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) GroupLayout(javax.swing.GroupLayout) JMenuItem(javax.swing.JMenuItem) Component(java.awt.Component) JComponent(javax.swing.JComponent) ComponentAdapter(java.awt.event.ComponentAdapter) JScrollPane(javax.swing.JScrollPane) JComboBox(javax.swing.JComboBox) JLabel(javax.swing.JLabel) IOException(java.io.IOException) Point(java.awt.Point) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) IOException(java.io.IOException) TreePath(javax.swing.tree.TreePath) JMenuBar(javax.swing.JMenuBar) JMenu(javax.swing.JMenu)

Example 18 with AS400

use of com.ibm.as400.access.AS400 in project IBMiProgTool by vzupka.

the class WrkSplF method selectSpooledFiles.

/**
 * Select spooled files according to path string from the node selected from the right tree and to criteria given in
 * parameters;
 * The path string is a file of type .OUTQ or library QSYS.LIB; Information from the spooled files is written to array lists.
 *
 * @param namePar
 * @param numberPar
 * @param pagesPar
 * @param jobPar
 * @param userPar
 * @param jobNumberPar
 * @param datePar
 * @param timePar
 * @return
 */
protected SpooledFile selectSpooledFiles(String namePar, String numberPar, String pagesPar, String jobPar, String userPar, String jobNumberPar, String datePar, String timePar) {
    this.namePar = namePar;
    this.numberPar = numberPar;
    this.pagesPar = pagesPar;
    this.jobPar = jobPar;
    this.userPar = userPar;
    this.jobNumberPar = jobNumberPar;
    this.datePar = datePar;
    this.timePar = timePar;
    nbrOfRows = 0;
    // Check connection to PRINT service before creating a spooled file list.
    // ======================================================================
    pingObject = new AS400JPing(properties.getProperty("HOST"));
    // pingObject.setTimeout(1000);
    ping_PRINT = pingObject.ping(AS400.PRINT);
    boolean isPingOk = ping_PRINT;
    while (!isPingOk) {
        row = "Error: Ping to server  " + properties.getProperty("HOST") + "  failed. Reconnecting PRINT service.";
        mainWindow.msgVector.add(row);
        mainWindow.showMessages(noNodes);
        try {
            ping_PRINT = pingObject.ping(AS400.PRINT);
            isPingOk = ping_PRINT;
            System.out.println("pingOk: " + isPingOk);
            Thread.sleep(2000);
        } catch (Exception exc) {
            row = "Error: Ping: " + exc.toString();
            System.out.println("Error: Ping: " + exc.toString());
            mainWindow.msgVector.add(row);
            mainWindow.showMessages(noNodes);
            exc.printStackTrace();
        }
    }
    try {
        remoteServer.connectService(AS400.PRINT);
    } catch (Exception exc) {
        row = "Error: Getting connection to PRINT service: " + exc.toString();
        mainWindow.msgVector.add(row);
        mainWindow.showMessages(noNodes);
        exc.printStackTrace();
    }
    // Create object representing spooled files
    SpooledFileList splfList = new SpooledFileList(remoteServer);
    try {
        // Parameter for selection all users for the first time or a specific user if not empty
        if (rightPathString.equals("/QSYS.LIB")) {
            row = "Wait: Retrieving list of all spooled files . . .";
            mainWindow.msgVector.add(row);
            mainWindow.showMessages(noNodes);
            mainWindow.scrollMessagePane.getVerticalScrollBar().removeAdjustmentListener(mainWindow.messageScrollPaneAdjustmentListenerMax);
            splfList.setUserFilter("*ALL");
            splfList.setQueueFilter("/QSYS.LIB/%ALL%.LIB/%ALL%.OUTQ");
            // Remove message scroll listener (cancel scrolling to the last message)
            mainWindow.scrollMessagePane.getVerticalScrollBar().removeAdjustmentListener(mainWindow.messageScrollPaneAdjustmentListenerMax);
        } else if (currentUser) {
            // Spooled files for current user will be selected
            splfList.setUserFilter("*CURRENT");
        } else {
            // Spooled files will be selected only from the output queue /QSYS.LIB/xxx.LIB/yyy.OUTQ
            // (right path string from the right file tree)
            splfList.setUserFilter("*ALL");
            splfList.setQueueFilter(rightPathString);
        }
        // Selection of spooled files is asynchronous
        splfList.openAsynchronously();
        // Wait for completion
        splfList.waitForListToComplete();
        // Get list of all spooled files
        Enumeration<SpooledFile> spooledFiles = splfList.getObjects();
        // Clear array lists containing characteristics of spooled files
        // that will be placed in table columns
        nameArrList = new ArrayList<>();
        numberArrList = new ArrayList<>();
        pagesArrList = new ArrayList<>();
        jobArrList = new ArrayList<>();
        userArrList = new ArrayList<>();
        spoolUsers = new ArrayList<>();
        jobNumberArrList = new ArrayList<>();
        dateArrList = new ArrayList<>();
        timeArrList = new ArrayList<>();
        queueArrList = new ArrayList<>();
        splfArrList = new ArrayList<>();
        // Select spooled files according to selection parameters
        while (spooledFiles.hasMoreElements()) {
            // Get next spooled file
            splf = (SpooledFile) spooledFiles.nextElement();
            if (splf != null) {
                String splfFileNumberChar = String.valueOf(splf.getNumber());
                String splfFilePagesChar = String.valueOf(splf.getIntegerAttribute(SpooledFile.ATTR_PAGES));
                // to the array lists for the table
                if (splf.getName().contains(namePar) && splfFileNumberChar.contains(numberPar) && splfFilePagesChar.contains(pagesPar) && splf.getJobName().contains(jobPar) && splf.getJobUser().contains(userPar) && splf.getJobNumber().contains(jobNumberPar) && splf.getCreateDate().contains(datePar) && splf.getCreateTime().contains(timePar)) {
                    // System.out.println("namePar 2: " + namePar);
                    // System.out.println("splf.getName() 2: " + splf.getName());
                    // System.out.print("File name selectSpoolFiles2: " + splf.getName());
                    // System.out.print(" \tFile number: " + splfFileNumberChar);
                    // System.out.print(" \tJob name: " + splf.getJobName());
                    // System.out.print(" \tUser name: " + splf.getJobUser());
                    // System.out.print(" \tJob number: " + splf.getJobNumber());
                    // System.out.print(" \tDate: " + splf.getCreateDate());
                    // System.out.print(" \tTime: " + splf.getCreateTime());
                    // System.out.println();
                    nameArrList.add(splf.getName());
                    numberArrList.add(splfFileNumberChar);
                    pagesArrList.add(splfFilePagesChar);
                    jobArrList.add(splf.getJobName());
                    userArrList.add(splf.getJobUser());
                    spoolUsers.add(splf.getJobUser());
                    jobNumberArrList.add(splf.getJobNumber());
                    dateArrList.add(splf.getCreateDate());
                    timeArrList.add(splf.getCreateTime());
                    // Qualified name of output queue, e.g. QGPL/QPRINT
                    queueArrList.add(getQualifiedQueueNameFromIfsPath(splf.getStringAttribute(SpooledFile.ATTR_OUTPUT_QUEUE)));
                    splfArrList.add(splf);
                    nameArrListWork.add(splf.getName());
                    numberArrListWork.add(splfFileNumberChar);
                    pagesArrListWork.add(splfFilePagesChar);
                    jobArrListWork.add(splf.getJobName());
                    userArrListWork.add(splf.getJobUser());
                    jobNumberArrListWork.add(splf.getJobNumber());
                    dateArrListWork.add(splf.getCreateDate());
                    timeArrListWork.add(splf.getCreateTime());
                    // Qualified name of output queue, e.g. QGPL/QPRINT
                    queueArrListWork.add(getQualifiedQueueNameFromIfsPath(splf.getStringAttribute(SpooledFile.ATTR_OUTPUT_QUEUE)));
                    splfArrListWork.add(splf);
                    nbrOfRows++;
                }
            }
        }
        // Ensure uniqueness of user names in array list (over linked hash set)
        Set<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.addAll(spoolUsers);
        spoolUsers.clear();
        spoolUsers.addAll(linkedHashSet);
        // Last spooled file selected
        return splf;
    } catch (Exception exc) {
        System.out.println("Error: " + exc.toString());
        exc.printStackTrace();
        return null;
    }
}
Also used : LinkedHashSet(java.util.LinkedHashSet) AS400JPing(com.ibm.as400.access.AS400JPing) SpooledFileList(com.ibm.as400.access.SpooledFileList) SpooledFile(com.ibm.as400.access.SpooledFile) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException)

Example 19 with AS400

use of com.ibm.as400.access.AS400 in project camel by apache.

the class Jt400DataQueueService method stop.

@Override
public void stop() throws Exception {
    if (queue != null) {
        LOG.info("Releasing connection to {}", endpoint);
        AS400 system = queue.getSystem();
        queue = null;
        endpoint.releaseSystem(system);
    }
}
Also used : AS400(com.ibm.as400.access.AS400)

Example 20 with AS400

use of com.ibm.as400.access.AS400 in project IBMiProgTool by vzupka.

the class Copy_IBMi_IBMi method copyToSourceFile.

/**
 * Copy IFS directory to Source File (all members).
 *
 * @param remoteServer
 * @param sourcePathString
 * @param targetPathString
 * @return
 */
protected String copyToSourceFile(AS400 remoteServer, String sourcePathString, String targetPathString) {
    // Extract individual names (library, file, member) from the AS400 IFS
    // path
    extractNamesFromIfsPath(targetPathString);
    // Path to the output source file
    String outSourceFilePath = "/QSYS.LIB/" + libraryName + ".LIB/" + fileName + ".FILE";
    try {
        IFSFile inIfsDirFile = new IFSFile(remoteServer, sourcePathString);
        IFSFile outIfsDirectory = new IFSFile(remoteServer, outSourceFilePath);
        // Create Source Physical File.
        if (!outIfsDirectory.exists()) {
            outIfsDirectory.mkdir();
        }
        boolean atLeastOneErrorInMembers = false;
        // Copy IFS files to Source Members
        if (inIfsDirFile.isDirectory()) {
            // From IFS directory to Source file
            // ---------------------------------
            IFSFile[] ifsFiles = inIfsDirFile.listFiles();
            // Copy all objects of the IFS directory
            for (IFSFile ifsFile : ifsFiles) {
                // Correct the source type
                String ifsFileName = ifsFile.getName();
                String mbrName = ifsFileName;
                if (ifsFileName.lastIndexOf(".") >= 0) {
                    mbrName = ifsFileName.substring(0, ifsFileName.lastIndexOf("."));
                }
                // Directories, are not copied
                if (ifsFile.isDirectory()) {
                    row = "Info: IFS directory  " + ifsFile + "  was NOT copied to source physical file  " + libraryName + "/" + fileName + ".";
                    mainWindow.msgVector.add(row);
                    mainWindow.showMessages();
                    continue;
                // Save files are not copied
                } else if (ifsFileName.endsWith(".savf")) {
                    row = "Info: IFS save file  " + ifsFile + "  was NOT copied to source physical file  " + libraryName + "/" + fileName + ".";
                    mainWindow.msgVector.add(row);
                    mainWindow.showMessages();
                    continue;
                }
                // Copy IFS file to Source member
                String msgTextMbr = copyToSourceMember(ifsFile.toString(), targetPathString + "/" + mbrName + ".MBR");
                // If at least one message is not empty - note error
                if (!msgTextMbr.isEmpty()) {
                    atLeastOneErrorInMembers = true;
                }
            }
            if (!atLeastOneErrorInMembers) {
                row = "Comp: IFS directory  " + sourcePathString + "  was copied to source physical file  " + libraryName + "/" + fileName + ".";
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
            } else {
                row = "Comp: IFS directory  " + sourcePathString + "  was NOT completely copied to source physical file  " + libraryName + "/" + fileName + ".";
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
            }
            msgText = atLeastOneErrorInMembers ? "ERROR" : "";
            return msgText;
        } else {
            // From IFS file to Source file
            // ----------------------------
            // Correct source type
            String ifsFileName = inIfsDirFile.getName();
            String mbrName = ifsFileName;
            if (ifsFileName.lastIndexOf(".") >= 0) {
                mbrName = ifsFileName.substring(0, ifsFileName.lastIndexOf("."));
            }
            // Copy IFS object to Source file
            String msgTextMbr = copyToSourceMember(sourcePathString, targetPathString + "/" + mbrName + ".MBR");
            // If at least one message is not empty - note error
            if (!msgTextMbr.isEmpty()) {
                atLeastOneErrorInMembers = true;
            }
            if (!atLeastOneErrorInMembers) {
                row = "Comp: IFS file  " + sourcePathString + "  was copied to Source physical file  " + libraryName + "/" + fileName + ".";
                mainWindow.msgVector.add(row);
                mainWindow.showMessages(nodes);
            } else {
                row = "Comp: IFS file  " + sourcePathString + "  was NOT copied to Source physical file  " + libraryName + "/" + fileName + ".";
                mainWindow.msgVector.add(row);
                mainWindow.showMessages(nodes);
            }
            msgText = atLeastOneErrorInMembers ? "ERROR" : "";
            return msgText;
        }
    } catch (Exception exc) {
        exc.printStackTrace();
        row = "Error: Copying from IFS object  " + sourcePathString + "  -  " + exc.toString();
        mainWindow.msgVector.add(row);
        mainWindow.showMessages(nodes);
        return "ERROR";
    }
}
Also used : IFSFile(com.ibm.as400.access.IFSFile)

Aggregations

IFSFile (com.ibm.as400.access.IFSFile)16 AS400Text (com.ibm.as400.access.AS400Text)14 IllegalCharsetNameException (java.nio.charset.IllegalCharsetNameException)14 UnsupportedCharsetException (java.nio.charset.UnsupportedCharsetException)14 AS400Message (com.ibm.as400.access.AS400Message)12 AS400 (com.ibm.as400.access.AS400)11 CommandCall (com.ibm.as400.access.CommandCall)9 IOException (java.io.IOException)8 AS400FileRecordDescription (com.ibm.as400.access.AS400FileRecordDescription)5 Record (com.ibm.as400.access.Record)5 RecordFormat (com.ibm.as400.access.RecordFormat)5 SequentialFile (com.ibm.as400.access.SequentialFile)5 BadLocationException (javax.swing.text.BadLocationException)5 ProgramCall (com.ibm.as400.access.ProgramCall)4 Point (java.awt.Point)4 Path (java.nio.file.Path)4 AS400SecurityException (com.ibm.as400.access.AS400SecurityException)3 RequestNotSupportedException (com.ibm.as400.access.RequestNotSupportedException)3 IntrospectionException (java.beans.IntrospectionException)3 ConnectorException (org.identityconnectors.framework.common.exceptions.ConnectorException)3