class Versions
        extends JFrame {

    /**
     * The serial version UID of this class.
     */
    private static final long serialVersionUID = 2925242862240301106L;

    /**
     * A label with info about the library, JVM,...
     */
    JLabel library_versions = new JLabel();

    /**
     * The table with all the plug-ins (name, version and date).
     */
    JTable plugin_versions = new JTable();

    /**
     * A scrollpane for the plugin_versions table.
     */
    JScrollPane scroll_versions = new JScrollPane();

    /**
     * Constructs a Versions object.
     */
    public Versions() {
        super("Plugins and their version");
        try {
            initialize();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Main method (test purposes only)
     *
     * @param args String[]
     */
    public static void main(String[] args) {
        Versions version = new Versions();
        version.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        version.setVisible(true);
    }

    /**
     * Initialization of the jFrame.
     *
     * @throws Exception
     */
    private void initialize() throws Exception {<FILL_FUNCTION_BODY>}

    /**
     * Returns the TableModel implementation that will be used to show the plugin_versions.
     *
     * @param versionsarray ArrayList
     * @return TableModel
     */
    public TableModel getVersionTableModel(final ArrayList<String> versionsarray) {
        return new AbstractTableModel() {

            private static final long serialVersionUID = 5105003782164682777L;

            public int getColumnCount() {
                return 4;
            }

            public int getRowCount() {
                return versionsarray.size();
            }

            public Object getValueAt(int rowIndex, int columnIndex) {
                String dummy;
                switch (columnIndex) {
                    case 0:
                        dummy = versionsarray.get(rowIndex);
                        return dummy.split(".java")[0];
                    case 1:
                        dummy = versionsarray.get(rowIndex);
                        return dummy.split(" ")[1];
                    case 2:
                        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        dummy = versionsarray.get(rowIndex);
                        try {
                            return df.parse(dummy.split(" ")[2] + " "
                                    + dummy.split(" ")[3]);
                        } catch (ParseException ex) {
                            return null;
                        }
                    case 3:
                        dummy = versionsarray.get(rowIndex);
                        return dummy.split(" ")[4];

                }
                return versionsarray;
            }

            public String getColumnName(int column) {
                switch (column) {
                    case 0:
                        return "Name";
                    case 1:
                        return "Version";
                    case 2:
                        return "Changed";
                    case 3:
                        return "ChangeBy";
                    default:
                        return "";
                }
            }

            public Class<? extends Object> getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return java.util.Date.class;
                    case 3:
                        return String.class;
                    default:
                        return null;
                }
            }
        };

    }
}

        this.getContentPane().setLayout(new BorderLayout());
        scroll_versions.setViewportView(plugin_versions);
        library_versions.setIcon(new ImageIcon(Versions.class.getResource(
                "1t3xt.gif")));
        this.getContentPane().add(library_versions, BorderLayout.NORTH);
        this.getContentPane().add(scroll_versions, BorderLayout.CENTER);
        Properties properties = System.getProperties();
        Runtime runtime = Runtime.getRuntime();
        StringBuilder sb = new StringBuilder();
        sb.append("<html>");
        sb.append("<p>iTexttoolbox version: ").append(Versions.class.getPackage().getImplementationVersion())
                .append("</p>");
        sb.append("<p>iText version: ").append(Document.getVersion()).append("</p>");
        sb.append("<p>java.version: ").append(properties.getProperty("java.version")).append("</p>");
        sb.append("<p>java.vendor: ").append(properties.getProperty("java.vendor")).append("</p>");
        sb.append("<p>java.home: ").append(properties.getProperty("java.home")).append("</p>");
        sb.append("<p>java.freeMemory: ").append(runtime.freeMemory()).append(" bytes").append("</p>");
        sb.append("<p>java.totalMemory: ").append(runtime.totalMemory()).append(" bytes").append("</p>");
        sb.append("<p>user.home: ").append(properties.getProperty("user.home")).append("</p>");
        sb.append("<p>os.name: ").append(properties.getProperty("os.name")).append("</p>");
        sb.append("<p>os.arch: ").append(properties.getProperty("os.arch")).append("</p>");
        sb.append("<p>os.version: ").append(properties.getProperty("os.version")).append("</p>");
        sb.append("</html>");
        library_versions.setText(sb.toString());

        TableModel model = getVersionTableModel(AbstractTool.versionsarray);
        RowSorter<TableModel> sorter =
                new TableRowSorter<>(model);
        plugin_versions.setRowSorter(sorter);
        plugin_versions.setModel(model);

        pack();
    
<methods>public void <init>() throws java.awt.HeadlessException,public void <init>(java.awt.GraphicsConfiguration) ,public void <init>(java.lang.String) throws java.awt.HeadlessException,public void <init>(java.lang.String, java.awt.GraphicsConfiguration) ,public javax.accessibility.AccessibleContext getAccessibleContext() ,public java.awt.Container getContentPane() ,public int getDefaultCloseOperation() ,public java.awt.Component getGlassPane() ,public java.awt.Graphics getGraphics() ,public javax.swing.JMenuBar getJMenuBar() ,public javax.swing.JLayeredPane getLayeredPane() ,public javax.swing.JRootPane getRootPane() ,public javax.swing.TransferHandler getTransferHandler() ,public static boolean isDefaultLookAndFeelDecorated() ,public void remove(java.awt.Component) ,public void repaint(long, int, int, int, int) ,public void setContentPane(java.awt.Container) ,public void setDefaultCloseOperation(int) ,public static void setDefaultLookAndFeelDecorated(boolean) ,public void setGlassPane(java.awt.Component) ,public void setIconImage(java.awt.Image) ,public void setJMenuBar(javax.swing.JMenuBar) ,public void setLayeredPane(javax.swing.JLayeredPane) ,public void setLayout(java.awt.LayoutManager) ,public void setTransferHandler(javax.swing.TransferHandler) ,public void update(java.awt.Graphics) <variables>protected javax.accessibility.AccessibleContext accessibleContext,private int defaultCloseOperation,private static final java.lang.Object defaultLookAndFeelDecoratedKey,protected javax.swing.JRootPane rootPane,protected boolean rootPaneCheckingEnabled,private javax.swing.TransferHandler transferHandler