/* * eXist Open Source Native XML Database * Copyright (C) 2001-2011 The eXist Project * http://exist-db.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $Id$ */ package org.exist.client; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.HeadlessException; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Properties; import java.util.prefs.Preferences; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.ProgressMonitor; import javax.swing.border.BevelBorder; import javax.swing.filechooser.FileFilter; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.xml.transform.OutputKeys; import org.exist.backup.Backup; import org.exist.backup.CreateBackupDialog; import org.exist.backup.Restore; import org.exist.client.xacml.XACMLEditor; import org.exist.security.Permission; import org.exist.security.PermissionFactory; import org.exist.storage.DBBroker; import org.exist.storage.serializers.EXistOutputKeys; import org.exist.util.MimeTable; import org.exist.util.MimeType; import org.exist.util.serializer.SAXSerializer; import org.exist.util.serializer.SerializerPool; import org.exist.xmldb.CollectionImpl; import org.exist.xmldb.CollectionManagementServiceImpl; import org.exist.xmldb.DatabaseInstanceManager; import org.exist.xmldb.EXistResource; import org.exist.xmldb.ExtendedResource; import org.exist.xmldb.IndexQueryService; import org.exist.xmldb.UserManagementService; import org.exist.xmldb.XmldbURI; import org.exist.xquery.Constants; import org.exist.xquery.util.URIUtils; import org.xml.sax.SAXException; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; /** Main frame of the eXist GUI */ public class ClientFrame extends JFrame implements WindowFocusListener, KeyListener, ActionListener, MouseListener { private static final long serialVersionUID = 1L; public final static String CUT = Messages.getString("ClientFrame.0"); //$NON-NLS-1$ public final static String COPY = Messages.getString("ClientFrame.1"); //$NON-NLS-1$ public final static String PASTE = Messages.getString("ClientFrame.2"); //$NON-NLS-1$ public final static int MAX_DISPLAY_LENGTH = 512000; public final static int MAX_HISTORY = 50; private final static SimpleAttributeSet promptAttrs = new SimpleAttributeSet(); private final static SimpleAttributeSet defaultAttrs = new SimpleAttributeSet(); { StyleConstants.setForeground(promptAttrs, Color.blue); StyleConstants.setBold(promptAttrs, true); StyleConstants.setForeground(defaultAttrs, Color.black); } private int commandStart = 0; private boolean gotUp = false; private DefaultStyledDocument doc; private JLabel statusbar; private JTable fileman; private ResourceTableModel resources = new ResourceTableModel(); private JTextPane shell; private JPopupMenu shellPopup; private InteractiveClient client; private XmldbURI path = null; private ProcessThread process = new ProcessThread(); private Properties properties; private Preferences preferences; /** * @throws java.awt.HeadlessException */ public ClientFrame(InteractiveClient client, XmldbURI path, Properties properties) throws HeadlessException { super(Messages.getString("ClientFrame.3")); //$NON-NLS-1$ this.path = path; this.properties = properties; this.client = client; setupComponents(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent ev) { close(); } }); pack(); process.start(); shell.requestFocus(); preferences = Preferences.userNodeForPackage(ClientFrame.class); } private void setupComponents() { setJMenuBar(createMenuBar()); // create the toolbar JToolBar toolbar = new JToolBar(); URL url = getClass().getResource("icons/Up24.gif"); //$NON-NLS-1$ JButton button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.5")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { goUpAction(e); } }); toolbar.add(button); url = getClass().getResource("icons/Refresh24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.7")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { client.reloadCollection(); } catch (XMLDBException e1) { } } }); toolbar.add(button); toolbar.addSeparator(); url = getClass().getResource("icons/New24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.9")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { newCollectionAction(e); } }); toolbar.add(button); url = getClass().getResource("icons/Add24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.11")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { uploadAction(e); } }); toolbar.add(button); url = getClass().getResource("icons/Delete24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.13")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { removeAction(e); } }); toolbar.add(button); url = getClass().getResource(Messages.getString("ClientFrame.14")); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.15")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setPermAction(e); } }); toolbar.add(button); toolbar.addSeparator(); url = getClass().getResource("icons/Export24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.17")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { backupAction(e); } }); toolbar.add(button); url = getClass().getResource("icons/Import24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.19")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { restoreAction(e); } }); toolbar.add(button); toolbar.addSeparator(); url = getClass().getResource(Messages.getString("ClientFrame.20")); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.21")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editUsersAction(e); } }); toolbar.add(button); url = getClass().getResource("icons/Find24.gif"); //$NON-NLS-1$ button = new JButton(new ImageIcon(url)); button.setToolTipText(Messages.getString("ClientFrame.23")); //$NON-NLS-1$ button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { findAction(e); } }); toolbar.add(button); // the split pane separates the resource view table from the shell JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT); split.setResizeWeight(0.5); // create table for resources and collections fileman = new JTable(); fileman.setModel(resources); fileman.addMouseListener(new TableMouseListener()); ResourceTableCellRenderer renderer = new ResourceTableCellRenderer(); fileman.setDefaultRenderer(Object.class, renderer); JScrollPane scroll = new JScrollPane(fileman); scroll.setMinimumSize(new Dimension(300, 150)); split.setLeftComponent(scroll); shellPopup = new JPopupMenu(Messages.getString("ClientFrame.24")); //$NON-NLS-1$ shellPopup.add(new JMenuItem(CUT)).addActionListener(this); shellPopup.add(new JMenuItem(COPY)).addActionListener(this); shellPopup.add(new JMenuItem(PASTE)).addActionListener(this); // shell window doc = new DefaultStyledDocument(); shell = new JTextPane(doc); shell.setContentType("text/plain; charset=UTF-8"); //$NON-NLS-1$ shell.setFont(new Font("Monospaced", Font.PLAIN, 12)); //$NON-NLS-1$ shell.setMargin(new Insets(7, 5, 7, 5)); shell.addKeyListener(this); shell.addMouseListener(this); scroll = new JScrollPane(shell); split.setRightComponent(scroll); statusbar = new JLabel(Messages.getString("ClientFrame.27") + properties.getProperty("user") + "@" + properties.getProperty("uri")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ statusbar.setMinimumSize(new Dimension(400, 15)); statusbar.setBorder(BorderFactory .createBevelBorder(BevelBorder.LOWERED)); getContentPane().add(split, BorderLayout.CENTER); getContentPane().add(toolbar, BorderLayout.NORTH); getContentPane().add(statusbar, BorderLayout.SOUTH); } private JMenuBar createMenuBar() { JMenuBar menubar = new JMenuBar(); JMenu fileMenu = new JMenu(Messages.getString("ClientFrame.31")); //$NON-NLS-1$ fileMenu.setMnemonic(KeyEvent.VK_F); menubar.add(fileMenu); JMenuItem item = new JMenuItem(Messages.getString("ClientFrame.32"), KeyEvent.VK_S); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { uploadAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.34"), KeyEvent.VK_N); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { newCollectionAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.36"), KeyEvent.VK_B); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //FIXME: Prevent owerwrite. Security? Collection collection = client.current; XMLResource result = null; String nameres = JOptionPane.showInputDialog(null, Messages.getString("ClientFrame.38")); //$NON-NLS-1$ if (nameres != null) { try { result = (XMLResource) collection.createResource( URIUtils.urlEncodeUtf8(nameres), XMLResource.RESOURCE_TYPE); result.setContent(Messages.getString("ClientFrame.39")); //$NON-NLS-1$ String mimeType = MimeType.XML_TYPE.getName(); MimeType mime = MimeTable.getInstance().getContentTypeFor(nameres); if (mime != null) { mimeType = mime.getName(); } ((EXistResource)result).setMimeType(mimeType); collection.storeResource(result); collection.close(); client.reloadCollection(); } catch (XMLDBException ev) { showErrorMessage(ev.getMessage(), ev); } } } }); fileMenu.add(item); fileMenu.addSeparator(); item = new JMenuItem(Messages.getString("ClientFrame.40")); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { removeAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.42"), KeyEvent.VK_C); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { copyAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.44"), KeyEvent.VK_M); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { moveAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.46"), KeyEvent.VK_R); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { renameAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.47"), KeyEvent.VK_E); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { exportAction(e); } }); fileMenu.add(item); fileMenu.addSeparator(); item = new JMenuItem(Messages.getString("ClientFrame.48"), KeyEvent.VK_I); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { reindexAction(e); } }); fileMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.50")); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setPermAction(e); } }); fileMenu.add(item); fileMenu.addSeparator(); item = new JMenuItem(Messages.getString("ClientFrame.52"), KeyEvent.VK_Q); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { close(); } }); fileMenu.add(item); JMenu toolsMenu = new JMenu(Messages.getString("ClientFrame.54")); //$NON-NLS-1$ toolsMenu.setMnemonic(KeyEvent.VK_T); menubar.add(toolsMenu); item = new JMenuItem(Messages.getString("ClientFrame.55"), KeyEvent.VK_F); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { findAction(e); } }); toolsMenu.add(item); toolsMenu.addSeparator(); item = new JMenuItem(Messages.getString("ClientFrame.57"), KeyEvent.VK_U); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editUsersAction(e); } }); toolsMenu.add(item); // Disable "Edit Indexes" menu item. // item = new JMenuItem(Messages.getString("ClientFrame.59"), KeyEvent.VK_I); //$NON-NLS-1$ // item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, // Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); // item.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // editIndexesAction(e); // } // }); // toolsMenu.add(item); item = new JMenuItem("Edit Triggers", KeyEvent.VK_T); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editTriggersAction(e); } }); toolsMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.61"), KeyEvent.VK_O); //$NON-NLS-1$ item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editPolicies(); } }); toolsMenu.add(item); toolsMenu.addSeparator(); item = new JMenuItem("Enter service mode"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { DatabaseInstanceManager service = (DatabaseInstanceManager) client.current.getService("DatabaseInstanceManager", "1.0"); service.enterServiceMode(); } catch (XMLDBException ex) { showErrorMessage(ex.getMessage(), ex); } } }); toolsMenu.add(item); item = new JMenuItem("Exit service mode"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { DatabaseInstanceManager service = (DatabaseInstanceManager) client.current.getService("DatabaseInstanceManager", "1.0"); service.exitServiceMode(); } catch (XMLDBException ex) { showErrorMessage(ex.getMessage(), ex); } } }); toolsMenu.add(item); toolsMenu.addSeparator(); item = new JMenuItem(Messages.getString("ClientFrame.63"), KeyEvent.VK_B); //$NON-NLS-1$ item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { backupAction(e); } }); toolsMenu.add(item); item = new JMenuItem(Messages.getString("ClientFrame.64"), KeyEvent.VK_R); //$NON-NLS-1$ item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { restoreAction(e); } }); toolsMenu.add(item); JMenu connectMenu = new JMenu(Messages.getString("ClientFrame.65")); //$NON-NLS-1$ connectMenu.setMnemonic(KeyEvent.VK_D); menubar.add(connectMenu); item = new JMenuItem(Messages.getString("ClientFrame.66"), KeyEvent.VK_S); //$NON-NLS-1$ item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display(Messages.getString("ClientFrame.67")); //$NON-NLS-1$ process.setAction("shutdown"); //$NON-NLS-1$ } }); connectMenu.add(item); // Show LoginPanel to Reconnect item = new JMenuItem(Messages.getString("ClientFrame.69"), KeyEvent.VK_U); //$NON-NLS-1$ item.setToolTipText(Messages.getString("ClientFrame.70")); //$NON-NLS-1$ item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // load properties modified by the login panel Properties loginData=getLoginData(properties); if (loginData == null) return; Properties oldProps=properties; properties.putAll(loginData); statusbar.setText(Messages.getString("ClientFrame.71") + properties.getProperty("user") + "@" + properties.getProperty("uri")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ try { client.shutdown(false); client.connect(); client.reloadCollection(); } catch (Exception u) { showErrorMessage(Messages.getString("ClientFrame.75") + properties.getProperty("uri") + Messages.getString("ClientFrame.77"), u); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ properties=oldProps; try { client.connect(); } catch (Exception uu) { showErrorMessage(Messages.getString("ClientFrame.78") + properties.getProperty("uri") , u); //$NON-NLS-1$ //$NON-NLS-2$ } } } }); connectMenu.add(item); JMenu optionsMenu = new JMenu(Messages.getString("ClientFrame.80")); //$NON-NLS-1$ optionsMenu.setMnemonic(KeyEvent.VK_O); menubar.add(optionsMenu); JCheckBoxMenuItem check = new JCheckBoxMenuItem(Messages.getString("ClientFrame.81"), properties //$NON-NLS-1$ .getProperty(OutputKeys.INDENT).equals("yes")); //$NON-NLS-1$ check.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { properties.setProperty(OutputKeys.INDENT, ((JCheckBoxMenuItem) e.getSource()).isSelected() ? "yes" //$NON-NLS-1$ : "no"); //$NON-NLS-1$ try { client.getResources(); } catch (XMLDBException e1) { } } }); optionsMenu.add(check); check = new JCheckBoxMenuItem(Messages.getString("ClientFrame.85"), properties //$NON-NLS-1$ .getProperty(EXistOutputKeys.EXPAND_XINCLUDES).equals("yes")); //$NON-NLS-1$ check.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { properties.setProperty(EXistOutputKeys.EXPAND_XINCLUDES, ((JCheckBoxMenuItem) e.getSource()).isSelected() ? "yes" //$NON-NLS-1$ : "no"); //$NON-NLS-1$ try { client.getResources(); } catch (XMLDBException e1) { } } }); optionsMenu.add(check); JMenu HelpMenu = new JMenu(Messages.getString("ClientFrame.89")); //$NON-NLS-1$ HelpMenu.setMnemonic(KeyEvent.VK_H); menubar.add(HelpMenu); item = new JMenuItem(Messages.getString("ClientFrame.90"), KeyEvent.VK_A); //$NON-NLS-1$ item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { AboutAction(); } }); HelpMenu.add(item); return menubar; } public void setPath(XmldbURI currentPath) { path = currentPath; } protected void displayPrompt() { String pathString = path.getCollectionPath(); try { commandStart = doc.getLength(); doc.insertString(commandStart, Messages.getString("ClientFrame.91"), promptAttrs); //$NON-NLS-1$ commandStart += 6; doc.insertString(commandStart, pathString + '>', promptAttrs); commandStart += pathString.length() + 1; doc.insertString(commandStart++, Messages.getString("ClientFrame.92"), defaultAttrs); //$NON-NLS-1$ shell.setCaretPosition(commandStart); } catch (BadLocationException e) { } } protected void display(String message) { try { commandStart = doc.getLength(); if (commandStart > MAX_DISPLAY_LENGTH) { doc.remove(0, MAX_DISPLAY_LENGTH); commandStart = doc.getLength(); } doc.insertString(commandStart, message, defaultAttrs); commandStart = doc.getLength(); shell.setCaretPosition(commandStart); } catch (BadLocationException e) { } } protected void setResources(List rows) { resources.setData(rows); } protected void setStatus(String message) { statusbar.setText(message); } protected void setEditable(boolean enabled) { shell.setEditable(enabled); shell.setVisible(enabled); } /** @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent) */ public void keyPressed(KeyEvent e) { type(e); gotUp = false; } /** @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent) */ public void keyReleased(KeyEvent e) { gotUp = true; type(e); } /* * (non-Javadoc) * * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent) */ public void keyTyped(KeyEvent e) { type(e); } private synchronized void type(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_ENTER : if (e.getID() == KeyEvent.KEY_PRESSED && gotUp) { enter(); } e.consume(); break; case KeyEvent.VK_HOME : shell.setCaretPosition(commandStart); e.consume(); break; case KeyEvent.VK_LEFT : case KeyEvent.VK_DELETE : case KeyEvent.VK_BACK_SPACE : if (shell.getCaretPosition() <= commandStart) e.consume(); break; case KeyEvent.VK_UP : if (e.getID() == KeyEvent.KEY_PRESSED) historyBack(); e.consume(); break; case KeyEvent.VK_DOWN : if (e.getID() == KeyEvent.KEY_PRESSED) historyForward(); e.consume(); break; default : if ((e.getModifiers() & (InputEvent.CTRL_MASK | InputEvent.META_MASK | InputEvent.ALT_MASK)) == 0) { if (shell.getCaretPosition() < commandStart) shell.setCaretPosition(doc.getLength()); } if (e.paramString().indexOf(Messages.getString("ClientFrame.93")) > Constants.STRING_NOT_FOUND) { //$NON-NLS-1$ if (shell.getCaretPosition() <= commandStart) e.consume(); } break; } } /** @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals(CUT)) shell.cut(); else if (cmd.equals(COPY)) shell.copy(); else if (cmd.equals(PASTE)) shell.paste(); } private void goUpAction(ActionEvent ev) { display(Messages.getString("ClientFrame.94")); //$NON-NLS-1$ process.setAction("cd .."); //$NON-NLS-1$ } private void newCollectionAction(ActionEvent ev) { String newCol = JOptionPane.showInputDialog(this, Messages.getString("ClientFrame.96")); //$NON-NLS-1$ if (newCol != null) { String command = "mkcol \"" + newCol + '"'; //$NON-NLS-1$ display(command + "\n"); //$NON-NLS-1$ process.setAction(command); } } private void newServerURIAction(String newURI) { if (newURI == null) newURI = JOptionPane.showInputDialog(this, Messages.getString("ClientFrame.99") //$NON-NLS-1$ + Messages.getString("ClientFrame.100")); //$NON-NLS-1$ if (newURI != null) { properties.setProperty("uri", newURI); //$NON-NLS-1$ try { client.shutdown(false); client.connect(); } catch (Exception e) { showErrorMessage(Messages.getString("ClientFrame.102") + newURI + Messages.getString("ClientFrame.103"), e); //$NON-NLS-1$ //$NON-NLS-2$ } } } /** * Returns an array of user-selected resources. */ private ResourceDescriptor[] getSelectedResources() { final int[] selectedRows = fileman.getSelectedRows(); final ResourceDescriptor[] res = new ResourceDescriptor[selectedRows.length]; for (int i = 0; i < selectedRows.length; i++) { res[i] = resources.getRow(selectedRows[i]); } return res; } private void removeAction(ActionEvent ev) { final ResourceDescriptor[] res = getSelectedResources(); // String cmd; if (JOptionPane.showConfirmDialog(this, Messages.getString("ClientFrame.104") + Messages.getString("ClientFrame.105"), //$NON-NLS-1$ //$NON-NLS-2$ Messages.getString("ClientFrame.106"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { //$NON-NLS-1$ Runnable removeTask = new Runnable() { public void run() { ProgressMonitor monitor = new ProgressMonitor(ClientFrame.this, Messages.getString("ClientFrame.107"), Messages.getString("ClientFrame.108"), 1, res.length); //$NON-NLS-1$ //$NON-NLS-2$ monitor.setMillisToDecideToPopup(500); monitor.setMillisToPopup(500); for (int i = 0; i < res.length; i++) { ResourceDescriptor resource = res[i]; if (resource.isCollection()) { try { CollectionManagementServiceImpl mgtService = (CollectionManagementServiceImpl) client.current .getService( "CollectionManagementService", //$NON-NLS-1$ "1.0"); //$NON-NLS-1$ mgtService .removeCollection(resource.getName()); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } } else { try { Resource res = client.current .getResource(resource.getName().toString()); client.current.removeResource(res); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } } monitor.setProgress(i + 1); if (monitor.isCanceled()) return; } try { client.getResources(); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } } }; new Thread(removeTask).start(); } } private void moveAction(ActionEvent ev) { final ResourceDescriptor[] res = getSelectedResources(); PrettyXmldbURI[] collections = null; //get an array of collection paths try { Collection root = client.getCollection(DBBroker.ROOT_COLLECTION); ArrayList alCollections = getCollections(root, new ArrayList()); collections = new PrettyXmldbURI[alCollections.size()]; alCollections.toArray(collections); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); return; } //prompt the user for a destination collection from the list Object val = JOptionPane.showInputDialog(this, Messages.getString("ClientFrame.111"), Messages.getString("ClientFrame.112"), JOptionPane.QUESTION_MESSAGE, null, collections, collections[0]); //$NON-NLS-1$ //$NON-NLS-2$ if(val == null) return; final XmldbURI destinationPath = ((PrettyXmldbURI)val).getTargetURI(); Runnable moveTask = new Runnable() { public void run() { try { CollectionManagementServiceImpl service = (CollectionManagementServiceImpl) client.current.getService("CollectionManagementService", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ for(int i = 0; i < res.length; i++) { setStatus(Messages.getString("ClientFrame.115") + res[i].getName() + Messages.getString("ClientFrame.116") + destinationPath + Messages.getString("ClientFrame.117")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if(res[i].isCollection()) service.move(res[i].getName(), destinationPath, null); else service.moveResource(res[i].getName(), destinationPath, null); } client.reloadCollection(); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } setStatus(Messages.getString("ClientFrame.118")); //$NON-NLS-1$ } }; new Thread(moveTask).start(); } private void renameAction(ActionEvent ev) { final ResourceDescriptor[] res = getSelectedResources(); Object val = JOptionPane.showInputDialog(this, Messages.getString("ClientFrame.119"), Messages.getString("ClientFrame.120"), JOptionPane.QUESTION_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ if(val == null) return; XmldbURI parseIt; try { parseIt = URIUtils.encodeXmldbUriFor((String)val); } catch (URISyntaxException e) { showErrorMessage(Messages.getString("ClientFrame.121")+e.getMessage(),e); //$NON-NLS-1$ return; } final XmldbURI destinationFilename = parseIt; Runnable renameTask = new Runnable() { public void run() { try { CollectionManagementServiceImpl service = (CollectionManagementServiceImpl) client.current.getService("CollectionManagementService", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ for(int i = 0; i < res.length; i++) { setStatus(Messages.getString("ClientFrame.124") + res[i].getName() + Messages.getString("ClientFrame.125") + destinationFilename + Messages.getString("ClientFrame.126")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if(res[i].isCollection()) service.move(res[i].getName(), null, destinationFilename); else service.moveResource(res[i].getName(), null, destinationFilename); } client.reloadCollection(); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } setStatus(Messages.getString("ClientFrame.127")); //$NON-NLS-1$ } }; new Thread(renameTask).start(); } private void copyAction(ActionEvent ev) { final ResourceDescriptor[] res = getSelectedResources(); PrettyXmldbURI[] collections = null; //get an array of collection paths try { Collection root = client.getCollection(DBBroker.ROOT_COLLECTION); ArrayList alCollections = getCollections(root, new ArrayList()); collections = new PrettyXmldbURI[alCollections.size()]; alCollections.toArray(collections); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); return; } //prompt the user for a destination collection from the list Object val = JOptionPane.showInputDialog(this, Messages.getString("ClientFrame.128"), Messages.getString("ClientFrame.129"), JOptionPane.QUESTION_MESSAGE, null, collections, collections[0]); //$NON-NLS-1$ //$NON-NLS-2$ if(val == null) return; final XmldbURI destinationPath = ((PrettyXmldbURI)val).getTargetURI(); Runnable moveTask = new Runnable() { public void run() { try { CollectionManagementServiceImpl service = (CollectionManagementServiceImpl) client.current.getService("CollectionManagementService", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ for(int i = 0; i < res.length; i++) { //TODO //what happens if the source and destination paths are the same? //we need to check and prompt the user to either skip or choose a new name //this function can copy multiple resources/collections selected by the user, //so may need to prompt the user multiple times? is in this thread the correct //place to do it? also need to do something similar for moveAction() // //Its too late and brain hurts - deliriumsky setStatus(Messages.getString("ClientFrame.132") + res[i].getName() + Messages.getString("ClientFrame.133") + destinationPath + Messages.getString("ClientFrame.134")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if(res[i].isCollection()) service.copy(res[i].getName(), destinationPath, null); else service.copyResource(res[i].getName(), destinationPath, null); } client.reloadCollection(); } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } setStatus(Messages.getString("ClientFrame.135")); //$NON-NLS-1$ } }; new Thread(moveTask).start(); } private ArrayList getCollections(Collection root, ArrayList collectionsList) throws XMLDBException { collectionsList.add(new PrettyXmldbURI(XmldbURI.create(root.getName()))); String[] childCollections= root.listChildCollections(); Collection child; for(int i = 0; i < childCollections.length; i++) { child = root.getChildCollection(childCollections[i]); getCollections(child, collectionsList); } return collectionsList; } private void reindexAction(ActionEvent ev) { final int[] selRows = fileman.getSelectedRows(); ResourceDescriptor[] res; if(selRows.length == 0) { res = new ResourceDescriptor[1]; res[0] = new ResourceDescriptor.Collection(client.path); } else { res = new ResourceDescriptor[selRows.length]; for (int i = 0; i < selRows.length; i++) { res[i] = resources.getRow(selRows[i]); if(!(res[i].isCollection())) { JOptionPane.showMessageDialog(this, Messages.getString("ClientFrame.136"), Messages.getString("ClientFrame.137"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ return; } } } if (JOptionPane.showConfirmDialog(this, Messages.getString("ClientFrame.138"), //$NON-NLS-1$ Messages.getString("ClientFrame.139"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { //$NON-NLS-1$ final ResourceDescriptor collections[] = res; Runnable reindexThread = new Runnable() { public void run() { ClientFrame.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); IndexQueryService service; try { service = (IndexQueryService) client.current.getService("IndexQueryService", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ for(int i = 0; i < collections.length; i++) { ResourceDescriptor next = collections[i]; setStatus(Messages.getString("ClientFrame.142") + next.getName() + Messages.getString("ClientFrame.143")); //$NON-NLS-1$ //$NON-NLS-2$ service.reindexCollection(next.getName()); } setStatus(Messages.getString("ClientFrame.144")); //$NON-NLS-1$ } catch (XMLDBException e) { showErrorMessage(e.getMessage(), e); } ClientFrame.this.setCursor(Cursor.getDefaultCursor()); } }; new Thread(reindexThread).start(); } } private void uploadAction(ActionEvent ev) { // TODO store last file choose in properties JFileChooser chooser = new JFileChooser(preferences.get("directory.last", System.getProperty("user.dir"))); chooser.setMultiSelectionEnabled(true); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.addChoosableFileFilter(new BinaryFileFilter()); chooser.addChoosableFileFilter(new XMLFileFilter()); if (chooser.showDialog(this, Messages.getString("ClientFrame.146")) == JFileChooser.APPROVE_OPTION) { //$NON-NLS-1$ // remember directory in preferences preferences.put("directory.last", chooser.getCurrentDirectory().getAbsolutePath()); final File[] files = chooser.getSelectedFiles(); if (files.length > 0) { new Thread() { public void run() { UploadDialog upload = new UploadDialog(); try { client.parse(files, upload); client.getResources(); } catch (XMLDBException e) { showErrorMessage(Messages.getString("ClientFrame.147") //$NON-NLS-1$ + e.getMessage(), e); } } }.start(); } } } private boolean deleteDirectory(File target) { if (target.isDirectory()) { String[] children = target.list(); for (int i=0; i<children.length; i++) { boolean success = deleteDirectory(new File(target, children[i])); if (!success) { return false; } } } // The directory is now empty so delete it return target.delete(); } private void backupAction(ActionEvent ev) { CreateBackupDialog dialog = new CreateBackupDialog( properties.getProperty("uri", "xmldb:exist://"), properties.getProperty("user", "admin"), properties.getProperty("password", null), new File(preferences.get("directory.backup", System.getProperty("user.home")))); if (JOptionPane.showOptionDialog(this, dialog, Messages.getString("ClientFrame.157"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null) == JOptionPane.YES_OPTION) { String collection = dialog.getCollection(); String backuptarget = dialog.getBackupTarget(); // DWES add check here? File target=new File(backuptarget); if(target.exists()){ if (JOptionPane.showConfirmDialog( this, Messages.getString("CreateBackupDialog.6a") + " " + backuptarget + " " + Messages.getString("CreateBackupDialog.6b"), Messages.getString("CreateBackupDialog.6c"), JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) { deleteDirectory(target); } } try { Backup backup = new Backup( properties.getProperty("user", "admin"), properties.getProperty("password", null), backuptarget, XmldbURI.xmldbUriFor(properties.getProperty("uri", "xmldb:exist://") + collection)); backup.backup(true, this); } catch (XMLDBException e) { showErrorMessage("XMLDBException: " + e.getMessage(), e); //$NON-NLS-1$ } catch (IOException e) { showErrorMessage("IOException: " + e.getMessage(), e); //$NON-NLS-1$ } catch (SAXException e) { showErrorMessage("SAXException: " + e.getMessage(), e); //$NON-NLS-1$ } catch (URISyntaxException e) { showErrorMessage("URISyntaxException: " + e.getMessage(), e); //$NON-NLS-1$ } } } private void restoreAction(ActionEvent ev) { JFileChooser chooser = new JFileChooser(preferences.get("directory.backup", System.getProperty("user.dir"))); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.addChoosableFileFilter(new BackupContentsFilter()); // re-enable later chooser.addChoosableFileFilter(new ZipFilter()); //chooser.setSelectedFile(new File("eXist-backup.zip")); if (chooser.showDialog(null, Messages.getString("ClientFrame.169")) == JFileChooser.APPROVE_OPTION) { //$NON-NLS-1$ File f = chooser.getSelectedFile(); preferences.put("directory.backup", chooser.getCurrentDirectory().getAbsolutePath()); JPanel askPass = new JPanel(new BorderLayout()); askPass.add(new JLabel(Messages.getString("ClientFrame.170")), BorderLayout.NORTH); //$NON-NLS-1$ JPasswordField passInput = new JPasswordField(25); askPass.add(passInput, BorderLayout.CENTER); if (JOptionPane.showOptionDialog(this, askPass, Messages.getString("ClientFrame.171"), //$NON-NLS-1$ JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null) == JOptionPane.YES_OPTION) { String newDbaPass = passInput.getPassword().length == 0 ? null : new String(passInput.getPassword()); String restoreFile = f.getAbsolutePath(); try { Restore restore = new Restore(properties.getProperty("user", //$NON-NLS-1$ "admin"), properties.getProperty("password", null), //$NON-NLS-1$ //$NON-NLS-2$ newDbaPass, new File(restoreFile), properties.getProperty("uri", //$NON-NLS-1$ "xmldb:exist://")); //$NON-NLS-1$ restore.restore(true, this); if (properties.getProperty("user", "admin").equals("admin") && newDbaPass != null) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ properties.setProperty("password", newDbaPass); //$NON-NLS-1$ client.reloadCollection(); } catch (Exception e) { showErrorMessage(Messages.getString("ClientFrame.181") + e.getMessage(), e); //$NON-NLS-1$ } } } } private void editUsersAction(ActionEvent ev) { try { Collection collection = client.getCollection(); UserManagementService service = (UserManagementService) collection .getService("UserManagementService", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ UserDialog dialog = new UserDialog(service, Messages.getString("ClientFrame.184"), client); //$NON-NLS-1$ dialog.setVisible(true); } catch (XMLDBException e) { showErrorMessage(Messages.getString("ClientFrame.185"), e); //$NON-NLS-1$ e.printStackTrace(); } } private void exportAction(ActionEvent ev) { if (fileman.getSelectedRowCount() == 0) return; int row = fileman.getSelectedRow(); ResourceDescriptor desc = resources.getRow(row); if (desc.isCollection()) return; JFileChooser chooser = new JFileChooser(preferences.get("directory.last", System.getProperty("user.dir"))); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setSelectedFile(new File(desc.getName().toString())); if (chooser.showDialog(this, "Select file for export") == JFileChooser.APPROVE_OPTION) { preferences.put("directory.last", chooser.getCurrentDirectory().getAbsolutePath()); File file = chooser.getSelectedFile(); if (file.exists() && JOptionPane.showConfirmDialog(this, "File exists. Overwrite?", "Overwrite?", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) return; Resource resource; FileOutputStream os; BufferedWriter writer; SAXSerializer contentSerializer; try { Collection collection = client.getCollection(); try { resource = collection .getResource(desc.getName().toString()); os = new FileOutputStream(file); if (resource instanceof ExtendedResource) { ((ExtendedResource) resource).getContentIntoAStream(os); } else { writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); // write resource to contentSerializer contentSerializer = (SAXSerializer) SerializerPool .getInstance() .borrowObject(SAXSerializer.class); contentSerializer.setOutput(writer, properties); ((EXistResource) resource) .setLexicalHandler(contentSerializer); ((XMLResource) resource) .getContentAsSAX(contentSerializer); SerializerPool.getInstance().returnObject( contentSerializer); writer.close(); } } catch (Exception e) { System.err .println("An exception occurred while writing the resource: " + e.getMessage()); e.printStackTrace(); } } catch (Exception e) { System.err.println("An exception occurred" + e.getMessage()); e.printStackTrace(); } } } private void editIndexesAction(ActionEvent ev) { IndexDialog dialog = new IndexDialog(Messages.getString("ClientFrame.186"), client); //$NON-NLS-1$ dialog.setVisible(true); } private void editTriggersAction(ActionEvent ev) { TriggersDialog dialog = new TriggersDialog("Edit Triggers", client); dialog.setVisible(true); } private void editPolicies() { Collection systemCollection; try { systemCollection = client.getCollection(DBBroker.SYSTEM_COLLECTION); } catch (XMLDBException e) { showErrorMessage(Messages.getString("ClientFrame.187"), e); //$NON-NLS-1$ return; } try { DatabaseInstanceManager dim = (DatabaseInstanceManager)systemCollection.getService("DatabaseInstanceManager", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ if(!dim.isXACMLEnabled()) { showErrorMessage(Messages.getString("ClientFrame.190"), null); //$NON-NLS-1$ return; } } catch (XMLDBException e) { showErrorMessage(Messages.getString("ClientFrame.191"), e); //$NON-NLS-1$ return; } XACMLEditor editor = new XACMLEditor(systemCollection); editor.setVisible(true); } private void findAction(ActionEvent ev) { Collection collection = client.getCollection(); QueryDialog dialog = new QueryDialog(client, collection, properties); dialog.setVisible(true); } private void setPermAction(ActionEvent ev) { if (fileman.getSelectedRowCount() == 0) return; try { Collection collection = client.getCollection(); UserManagementService service = (UserManagementService) collection .getService("UserManagementService", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$ Permission perm = null; XmldbURI name; Date created = new Date(); Date modified = null; String mimeType = null; if (fileman.getSelectedRowCount() == 1) { int row = fileman.getSelectedRow(); ResourceDescriptor desc = resources.getRow(row); name = desc.getName(); if (desc.isCollection()) { Collection coll = collection.getChildCollection(name.toString()); created = ((CollectionImpl) coll).getCreationTime(); perm = service.getPermissions(coll); } else { Resource res = collection.getResource(name.toString()); created = ((EXistResource) res).getCreationTime(); modified = ((EXistResource) res).getLastModificationTime(); mimeType = ((EXistResource) res).getMimeType(); perm = service.getPermissions(res); } } else { name = XmldbURI.create(".."); //$NON-NLS-1$ perm = PermissionFactory.getPermission("", "", Permission.DEFAULT_PERM); //$NON-NLS-1$ //$NON-NLS-2$ } ResourcePropertyDialog dialog = new ResourcePropertyDialog(this, service, name, perm, created, modified, mimeType); dialog.setVisible(true); if (dialog.getResult() == ResourcePropertyDialog.APPLY_OPTION) { int rows[] = fileman.getSelectedRows(); for (int i = 0; i < rows.length; i++) { ResourceDescriptor desc = resources.getRow(rows[i]); if (desc.isCollection()) { Collection coll = collection.getChildCollection(desc .getName().toString()); service.setPermissions(coll, dialog.permissions); } else { Resource res = collection.getResource(desc.getName().toString()); service.setPermissions(res, dialog.permissions); } } client.reloadCollection(); } } catch (XMLDBException e) { showErrorMessage(Messages.getString("ClientFrame.197") + e.getMessage(), e); //$NON-NLS-1$ e.printStackTrace(); } } private void enter() { int end = doc.getLength(); if (end - commandStart == 0) return; try { String command = doc.getText(commandStart, end - commandStart); commandStart = end; doc.insertString(commandStart++, "\n", defaultAttrs); //$NON-NLS-1$ if (command != null) { process.setAction(command); client.console.getHistory().addToHistory(command); } } catch (BadLocationException e) { e.printStackTrace(); } } private void historyBack() { client.console.getHistory().previous(); String item = client.console.getHistory().current(); if (item == null) return; try { if (shell.getCaretPosition() > commandStart) doc.remove(commandStart, doc.getLength() - commandStart); doc.insertString(commandStart, item, defaultAttrs); } catch (BadLocationException e) { e.printStackTrace(); } } private void historyForward() { client.console.getHistory().next(); String item = client.console.getHistory().current(); try { if (shell.getCaretPosition() > commandStart) doc.remove(commandStart, doc.getLength() - commandStart); doc.insertString(commandStart, item, defaultAttrs); } catch (BadLocationException e) { e.printStackTrace(); } } private void close() { setVisible(false); dispose(); process.terminate(); System.exit(0); } private void actionFinished() { if (!process.getStatus()) close(); displayPrompt(); } private void AboutAction() { Properties sysProperties = InteractiveClient.getSystemProperties(); JOptionPane.showMessageDialog(this, sysProperties.getProperty("product-name") + " version " + sysProperties.getProperty("product-version") + " (revision " + sysProperties.getProperty("svn-revision") + ") \n\n" + "Copyright (C) 2001-2011 The eXist Project\n\n" + "eXist-db comes with ABSOLUTELY NO WARRANTY.\n" + "This is free software, and you are welcome to\n" + "redistribute it under certain conditions;\n" + "for details read the license file." ); return; } class TableMouseListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { int row = fileman.getSelectedRow(); final ResourceDescriptor resource = resources.getRow(row); if (resource.isCollection()) { // cd into collection String command = "cd " + '"'+URIUtils.urlDecodeUtf8(resource.getName()) +'"'; //$NON-NLS-1$ display(command + "\n"); //$NON-NLS-1$ process.setAction(command); } else { // open a document for editing ClientFrame.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { DocumentView view = new DocumentView(client, resource.getName(), properties); view.setSize(new Dimension(640, 400)); view.viewDocument(); } catch (XMLDBException ex) { showErrorMessage(Messages.getString("ClientFrame.206") + ex.getMessage(), ex); //$NON-NLS-1$ } ClientFrame.this.setCursor(Cursor.getDefaultCursor()); } } } } /** * Compares resources according to their name, ensuring that collections * always are before documents. * @author gpothier */ private static class ResourceComparator implements Comparator { public int compare(Object aO1, Object aO2) { ResourceDescriptor desc1 = (ResourceDescriptor) aO1; ResourceDescriptor desc2 = (ResourceDescriptor) aO2; if (desc1.isCollection() != desc2.isCollection()) { return desc1.isCollection() ? Constants.INFERIOR : Constants.SUPERIOR; } else return desc1.getName().compareTo(desc2.getName()); } } class ProcessThread extends Thread { private String action = null; private boolean terminate = false; private boolean status = false; public ProcessThread() { super(); } synchronized public void setAction(String action) { while (this.action != null) { try { wait(); } catch (InterruptedException e) { } } this.action = action; notify(); } synchronized public void terminate() { terminate = true; notify(); } synchronized public boolean getStatus() { return status; } public boolean isReady() { return action == null; } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { while (!terminate) { while (action == null) try { synchronized (this) { wait(); } } catch (InterruptedException e) { } status = client.process(action); synchronized (this) { action = null; actionFinished(); notify(); } } } } class ResourceTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private final String[] columnNames = new String[]{ Messages.getString("ClientFrame.207") //$NON-NLS-1$ , Messages.getString("ClientFrame.208") //$NON-NLS-1$ , Messages.getString("ClientFrame.209") //$NON-NLS-1$ , Messages.getString("ClientFrame.210") //$NON-NLS-1$ , Messages.getString("ClientFrame.211") //$NON-NLS-1$ }; private List rows = null; public void setData(List rows) { Collections.sort(rows, new ResourceComparator()); this.rows = rows; fireTableDataChanged(); } public ResourceDescriptor getRow(int index) { return (ResourceDescriptor) rows.get(index); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnCount() */ public int getColumnCount() { return columnNames.length; } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnName(int) */ public String getColumnName(int column) { return columnNames[column]; } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getRowCount() */ public int getRowCount() { return rows == null ? 0 : rows.size(); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getValueAt(int, int) */ public Object getValueAt(int rowIndex, int columnIndex) { ResourceDescriptor row = getRow(rowIndex); switch (columnIndex) { case 0: return row.getName(); case 1: return row.getDate(); case 2: return row.getOwner(); case 3: return row.getGroup(); case 4: return row.getPermissions(); default: throw new RuntimeException(Messages.getString("ClientFrame.212")); //$NON-NLS-1$ } } } /** * @param properties pass properties to the login panel * @return the modiefied properties */ protected static Properties getLoginData(Properties properties) { Properties sysProperties = InteractiveClient.getSystemProperties(); LoginPanel login = new LoginPanel(properties); if (JOptionPane.showOptionDialog(null, login, sysProperties.getProperty("product-name") + " " + sysProperties.getProperty("product-version") + " Database Login" , JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null) == JOptionPane.OK_OPTION) { return login.getProperties(); } return null; } public static void showErrorMessage(String message, Throwable t) { JScrollPane scroll = null; JTextArea msgArea = new JTextArea(message); msgArea.setBorder(BorderFactory.createTitledBorder(Messages.getString("ClientFrame.214"))); //$NON-NLS-1$ msgArea.setEditable(false); msgArea.setBackground(null); if (t != null) { StringWriter out = new StringWriter(); PrintWriter writer = new PrintWriter(out); t.printStackTrace(writer); JTextArea stacktrace = new JTextArea(out.toString(), 20, 50); stacktrace.setBackground(null); stacktrace.setEditable(false); scroll = new JScrollPane(stacktrace); scroll.setPreferredSize(new Dimension(250, 300)); scroll.setBorder(BorderFactory .createTitledBorder(Messages.getString("ClientFrame.215"))); //$NON-NLS-1$ } JOptionPane optionPane = new JOptionPane(); optionPane.setMessage(new Object[]{msgArea, scroll}); optionPane.setMessageType(JOptionPane.ERROR_MESSAGE); JDialog dialog = optionPane.createDialog(null, Messages.getString("ClientFrame.216")); //$NON-NLS-1$ dialog.setResizable(true); dialog.pack(); dialog.setVisible(true); return; } public static int showErrorMessageQuery(String message, Throwable t) { JScrollPane scroll = null; JTextArea msgArea = new JTextArea(message); msgArea.setBorder(BorderFactory.createTitledBorder(Messages.getString("ClientFrame.217"))); //$NON-NLS-1$ msgArea.setEditable(false); msgArea.setBackground(null); if (t != null) { StringWriter out = new StringWriter(); PrintWriter writer = new PrintWriter(out); t.printStackTrace(writer); JTextArea stacktrace = new JTextArea(out.toString(), 20, 50); stacktrace.setBackground(null); stacktrace.setEditable(false); scroll = new JScrollPane(stacktrace); scroll.setPreferredSize(new Dimension(250, 300)); scroll.setBorder(BorderFactory .createTitledBorder(Messages.getString("ClientFrame.218"))); //$NON-NLS-1$ } JOptionPane optionPane = new JOptionPane(); optionPane.setMessage(new Object[]{msgArea, scroll}); optionPane.setMessageType(JOptionPane.ERROR_MESSAGE); optionPane.setOptionType(optionPane.OK_CANCEL_OPTION); JDialog dialog = optionPane.createDialog(null, Messages.getString("ClientFrame.219")); //$NON-NLS-1$ dialog.setResizable(true); dialog.pack(); dialog.setVisible(true); Object result = optionPane.getValue(); if (result == null) return 2; return ((Integer)optionPane.getValue()).intValue(); } /* * (non-Javadoc) * * @see java.awt.event.WindowFocusListener#windowGainedFocus(java.awt.event.WindowEvent) */ public void windowGainedFocus(WindowEvent e) { toFront(); } /* * (non-Javadoc) * * @see java.awt.event.WindowFocusListener#windowLostFocus(java.awt.event.WindowEvent) */ public void windowLostFocus(WindowEvent e) { } /* * (non-Javadoc) * * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) */ public void mouseClicked(MouseEvent e) { } /* * (non-Javadoc) * * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent) */ public void mouseEntered(MouseEvent e) { } /* * (non-Javadoc) * * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent) */ public void mouseExited(MouseEvent e) { } /* * (non-Javadoc) * * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent) */ public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { shellPopup.show((Component) e.getSource(), e.getX(), e.getY()); } } /* * (non-Javadoc) * * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent) */ public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { shellPopup.show((Component) e.getSource(), e.getX(), e.getY()); } } static class ResourceTableCellRenderer implements TableCellRenderer { public final static Color collectionBackground = new Color(225, 235, 224); public final static Color collectionForeground = Color.black; public final static Color highBackground = new Color(115, 130, 189); public final static Color highForeground = Color.white; public final static Color altBackground = new Color(235, 235, 235); public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); /* * (non-Javadoc) * * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, * java.lang.Object, boolean, boolean, int, int) */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(value instanceof XmldbURI) { value = new PrettyXmldbURI((XmldbURI)value); } Component renderer = DEFAULT_RENDERER .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); ((JLabel) renderer).setOpaque(true); Color foreground, background; ResourceTableModel resources = (ResourceTableModel) table.getModel(); if (isSelected) { foreground = highForeground; background = highBackground; } else if (resources.getRow(row).isCollection()) { foreground = collectionForeground; background = collectionBackground; } else if (row % 2 == 0) { background = altBackground; foreground = Color.black; } else { foreground = Color.black; background = Color.white; } renderer.setForeground(foreground); renderer.setBackground(background); return renderer; } } class BinaryFileFilter extends FileFilter { /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#getDescription() */ public String getDescription() { return Messages.getString("ClientFrame.220"); //$NON-NLS-1$ } /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#accept(java.io.File) */ public boolean accept(File f) { if(f.isDirectory()) return true; return !MimeTable.getInstance().isXMLContent(f.getName()); } } class XMLFileFilter extends FileFilter { /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#getDescription() */ public String getDescription() { return Messages.getString("ClientFrame.221"); //$NON-NLS-1$ } /* (non-Javadoc) * @see javax.swing.filechooser.FileFilter#accept(java.io.File) */ public boolean accept(File f) { if(f.isDirectory()) return true; return MimeTable.getInstance().isXMLContent(f.getName()); } } }