Author: jflesch
Date: 2007-01-05 00:14:59 +0000 (Fri, 05 Jan 2007)
New Revision: 11568

Added:
   trunk/apps/Thaw/images/min-export.png
   trunk/apps/Thaw/images/min-import.png
   trunk/apps/Thaw/images/min-terminal.png
   trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexRoot.java
Modified:
   trunk/apps/Thaw/src/thaw/core/IconBox.java
   trunk/apps/Thaw/src/thaw/core/MainWindow.java
   trunk/apps/Thaw/src/thaw/core/PluginManager.java
   trunk/apps/Thaw/src/thaw/i18n/thaw.properties
   trunk/apps/Thaw/src/thaw/plugins/Console.java
   trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java
   trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java
   trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java
   trunk/apps/Thaw/src/thaw/plugins/index/Index.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexCategory.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexTree.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexTreeNode.java
Log:
Allow index database import-export

Added: trunk/apps/Thaw/images/min-export.png
===================================================================
(Binary files differ)


Property changes on: trunk/apps/Thaw/images/min-export.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/apps/Thaw/images/min-import.png
===================================================================
(Binary files differ)


Property changes on: trunk/apps/Thaw/images/min-import.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/apps/Thaw/images/min-terminal.png
===================================================================
(Binary files differ)


Property changes on: trunk/apps/Thaw/images/min-terminal.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/apps/Thaw/src/thaw/core/IconBox.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/IconBox.java  2007-01-04 23:06:34 UTC (rev 
11567)
+++ trunk/apps/Thaw/src/thaw/core/IconBox.java  2007-01-05 00:14:59 UTC (rev 
11568)
@@ -69,8 +69,14 @@
        public static ImageIcon remove;

        public static ImageIcon terminal;
+       public static ImageIcon minTerminal;
        public static ImageIcon queueWatcher;
+       public static ImageIcon importExport;

+       public static ImageIcon minImportAction;
+       public static ImageIcon minExportAction;
+
+
        /**
         * Not really used
         */
@@ -142,8 +148,12 @@
                IconBox.minHelp = IconBox.loadIcon("min-help.png");
                IconBox.mainWindow = IconBox.loadIcon("mainWindow.png");
                IconBox.terminal = IconBox.loadIcon("terminal.png");
+               IconBox.minTerminal = IconBox.loadIcon("min-terminal.png");
                IconBox.remove = IconBox.loadIcon("remove.png");
                IconBox.queueWatcher = IconBox.loadIcon("queueWatcher.png");
+               IconBox.importExport = IconBox.loadIcon("refresh.png");
+               IconBox.minImportAction = IconBox.loadIcon("min-import.png");
+               IconBox.minExportAction = IconBox.loadIcon("min-export.png");
        }

 }

Modified: trunk/apps/Thaw/src/thaw/core/MainWindow.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/MainWindow.java       2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/core/MainWindow.java       2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -56,11 +56,14 @@
        private JMenuBar menuBar = null;
        private JMenu fileMenu = null;

+       private Vector fileMenuList = null;
+
        private JMenuItem reconnectionFileMenuItem = null;
        private JMenuItem optionsFileMenuItem = null;
        private JMenuItem quitFileMenuItem = null;

        private JMenu helpMenu = null;
+       private Vector menuList = null;
        private JMenuItem aboutHelpMenuItem = null;

        private JToolBar toolBar = null;
@@ -98,7 +101,11 @@
                // MENUS

                menuBar = new JMenuBar();
+               menuList = new Vector();
+
+
                fileMenu = new JMenu(I18n.getMessage("thaw.menu.file"));
+               fileMenuList = new Vector();

                reconnectionFileMenuItem = new 
JMenuItem(I18n.getMessage("thaw.menu.item.reconnect"),
                                                         
IconBox.minReconnectAction);
@@ -107,6 +114,10 @@
                quitFileMenuItem = new 
JMenuItem(I18n.getMessage("thaw.menu.item.quit"),
                                                 IconBox.minQuitAction);

+               fileMenuList.add(reconnectionFileMenuItem);
+               fileMenuList.add(optionsFileMenuItem);
+               fileMenuList.add(quitFileMenuItem);
+
                reconnectionFileMenuItem.addActionListener(this);
                optionsFileMenuItem.addActionListener(this);
                quitFileMenuItem.addActionListener(this);
@@ -116,6 +127,7 @@
                fileMenu.add(quitFileMenuItem);

                menuBar.add(fileMenu);
+               menuList.add(fileMenu);

                helpMenu = new JMenu(I18n.getMessage("thaw.menu.help"));

@@ -127,6 +139,7 @@

                //menuBar.add(Box.createHorizontalGlue());
                menuBar.add(helpMenu);
+               menuList.add(helpMenu);

                // TOOLBAR
                connectButton = new JButton(IconBox.connectAction);
@@ -291,16 +304,73 @@
        }

        /**
-        * Used by plugins to add their own menu. Not recommanded for the 
moment.
-        * Need to find a more elegant way.
-        * @return Check it does not return null.
+        * Used by plugins to add their own menu.
         */
-       public JMenuBar getMenuBar() {
-               return menuBar;
+       public void insertMenuAt(JMenu menu, int position) {
+               menuList.add(position, menu);
+               refreshMenuBar();
        }

+       public void removeMenu(JMenu menu) {
+               menuList.remove(menu);
+               refreshMenuBar();
+       }

+       protected void refreshMenuBar() {
+               Logger.info(this, "Display "+
+                           Integer.toString(menuList.size())+
+                           " menus in the main window");
+
+               /* rebuilding menubar */
+               JMenuBar bar = new JMenuBar();
+
+               for (Iterator it = menuList.iterator();
+                    it.hasNext();) {
+                       JMenu m = (JMenu)it.next();
+                       bar.add(m);
+               }
+
+               mainWindow.setJMenuBar(bar);
+               menuBar = bar;
+               mainWindow.validate(); /* no getContentPane() ! else it won't 
work ! */
+       }
+
+
        /**
+        * Used by plugins to add their own menu / menuItem to the menu 'file'.
+        */
+       public void insertInFileMenuAt(Object newItem, int position) {
+               fileMenuList.add(position, newItem);
+               refreshFileMenu();
+       }
+
+       public void removeFromFileMenu(Object item) {
+               fileMenuList.remove(item);
+               refreshFileMenu();
+       }
+
+       protected void refreshFileMenu() {
+               /* rebuilding menubar */
+               JMenu m = new JMenu(I18n.getMessage("thaw.menu.file"));
+
+               for (Iterator it = fileMenuList.iterator();
+                    it.hasNext();) {
+                       Object e = it.next();
+                       if (e instanceof JMenuItem)
+                               m.add((JMenuItem)e);
+                       else
+                               m.add((JMenu)e);
+               }
+
+               menuList.remove(fileMenu);
+               fileMenu = m;
+               menuList.add(0, fileMenu);
+
+               refreshMenuBar();
+       }
+
+
+       /**
         * Called when an element from the menu is called.
         */
        public void actionPerformed(final ActionEvent e) {

Modified: trunk/apps/Thaw/src/thaw/core/PluginManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/PluginManager.java    2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/core/PluginManager.java    2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -8,11 +8,14 @@
  * Manages plugins :)
  */
 public class PluginManager {
-       private final static String[] defaultPlugins = 
{"thaw.plugins.QueueWatcher",
-                                                       
"thaw.plugins.FetchPlugin",
-                                                       
"thaw.plugins.InsertPlugin",
-                                                       
"thaw.plugins.StatusBar",
-                                                       
"thaw.plugins.IndexBrowser"};
+       private final static String[] defaultPlugins = {
+               "thaw.plugins.QueueWatcher",
+               "thaw.plugins.FetchPlugin",
+               "thaw.plugins.InsertPlugin",
+               "thaw.plugins.StatusBar",
+               "thaw.plugins.IndexBrowser",
+               "thaw.plugins.IndexExporter"
+       };

        private Core core = null;


Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties       2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties       2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -265,3 +265,12 @@
 thaw.plugin.index.useAutoRefresh=Use auto-refresh
 thaw.plugin.index.autoRefreshInterval=Auto-refresh interval (in sec):
 thaw.plugin.index.nmbIndexPerRefresh=Number of indexes refreshed for each 
interval:
+
+thaw.plugin.index.importExportPlugin=Index Import / Export
+thaw.plugin.index.export=Export
+thaw.plugin.index.import=Import
+thaw.plugin.index.export.indexKeys=Index keys (+ folders)
+thaw.plugin.index.export.all=Indexes keys + file lists + link lists
+thaw.plugin.index.importedFolderName=Imported indexes
+
+

Modified: trunk/apps/Thaw/src/thaw/plugins/Console.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/Console.java       2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/Console.java       2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -70,7 +70,7 @@
                consolePanel.add(logAreaScrollPane, BorderLayout.CENTER);
                consolePanel.add(saveToFile, BorderLayout.SOUTH);

-               
core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.console.console"), 
consolePanel);
+               
core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.console.console"), 
thaw.core.IconBox.minTerminal, consolePanel);

                Logger.addLogListener(this);


Modified: trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java  2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java  2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -63,11 +63,12 @@
                newDb = false;

                if (core.getConfig().getValue("indexDatabaseVersion") == null) {
-                       DatabaseManager.createTables(hsqldb);
                        newDb = true;
                        core.getConfig().setValue("indexDatabaseVersion", "1");
                }

+               DatabaseManager.createTables(hsqldb);
+
                browserPanel = new IndexBrowserPanel(hsqldb, 
core.getQueueManager(), core.getConfig(), core.getMainWindow());
                setMainWindow(core.getMainWindow());
                core.getMainWindow().getTabbedPane().addChangeListener(this);
@@ -106,6 +107,10 @@
                return true;
        }

+       public IndexBrowserPanel getIndexBrowserPanel() {
+               return browserPanel;
+       }
+
        public boolean stop() {
                if (autoRefresh != null)
                        autoRefresh.stop();

Added: trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java                         
(rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java 2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -0,0 +1,150 @@
+package thaw.plugins;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JFileChooser;
+
+import thaw.core.*;
+import thaw.plugins.IndexBrowser;
+import thaw.plugins.index.*;
+
+public class IndexExporter implements Plugin, ActionListener {
+
+       private Core core;
+
+       private JMenu menu;
+       private JMenu exportMenu;
+       private JMenuItem importItem;
+       private JMenuItem exportKeys;
+       private JMenuItem exportAll;
+
+       private IndexBrowser indexBrowser;
+
+       public boolean run(Core core) {
+               this.core = core;
+
+               
if(core.getPluginManager().getPlugin("thaw.plugins.IndexBrowser") == null) {
+                       Logger.info(this, "Loading IndexBrowser plugin");
+
+                       
if(core.getPluginManager().loadPlugin("thaw.plugins.IndexBrowser") == null
+                          || 
!core.getPluginManager().runPlugin("thaw.plugins.IndexBrowser")) {
+                               Logger.error(this, "Unable to load IndexBrowser 
!");
+                               return false;
+                       }
+               }
+
+               indexBrowser = 
(IndexBrowser)core.getPluginManager().getPlugin("thaw.plugins.IndexBrowser");
+
+               if (indexBrowser == null) {
+                       Logger.error(this, "WTF?!");
+                       return false;
+               }
+
+               menu = new JMenu(I18n.getMessage("thaw.plugin.index.indexes"));
+               menu.setIcon(IconBox.minIndex);
+               exportMenu = new 
JMenu(I18n.getMessage("thaw.plugin.index.export"));
+               exportMenu.setIcon(IconBox.minExportAction);
+               exportKeys = new 
JMenuItem(I18n.getMessage("thaw.plugin.index.export.indexKeys"));
+               exportAll  = new 
JMenuItem(I18n.getMessage("thaw.plugin.index.export.all"));
+               importItem = new 
JMenuItem(I18n.getMessage("thaw.plugin.index.import"), IconBox.minImportAction);
+
+               exportMenu.add(exportKeys);
+               exportMenu.add(exportAll);
+
+               exportKeys.addActionListener(this);
+               exportAll.addActionListener(this);
+               importItem.addActionListener(this);
+
+               menu.add(exportMenu);
+               menu.add(importItem);
+
+               core.getMainWindow().insertInFileMenuAt(menu, 2);
+
+               return true;
+       }
+
+
+       public boolean stop() {
+               core.getMainWindow().removeFromFileMenu(menu);
+
+               return true;
+       }
+
+       public String getNameForUser() {
+               return I18n.getMessage("thaw.plugin.index.importExportPlugin");
+       }
+
+       public javax.swing.ImageIcon getIcon() {
+               return IconBox.importExport;
+       }
+
+       public void actionPerformed(ActionEvent e) {
+               FileChooser fileChooser;
+               boolean in = false;
+               boolean content = false;
+
+               if (e.getSource() == importItem) {
+                       in = true;
+                       content = true;
+               }
+
+
+               if (e.getSource() == exportAll) {
+                       in = false;
+                       content = true;
+               }
+
+               if (e.getSource() == exportKeys) {
+                       in = false;
+                       content = false;
+               }
+
+               fileChooser = new FileChooser();
+               fileChooser.setTitle(in ? 
I18n.getMessage("thaw.plugin.index.import") : 
I18n.getMessage("thaw.plugin.index.export"));
+               fileChooser.setDirectoryOnly(false);
+               fileChooser.setDialogType(in ? JFileChooser.OPEN_DIALOG : 
JFileChooser.SAVE_DIALOG);
+
+               java.io.File file = fileChooser.askOneFile();
+
+               if (file == null || (in && (!file.exists() || !file.isFile()))) 
{
+                       Logger.notice(this, "Cancelled");
+                       return;
+               }
+
+
+               Worker k = new Worker(in, content, file);
+               Thread th = new Thread(k);
+               th.start();
+
+       }
+
+       private class Worker implements Runnable {
+               private boolean impor;
+               private boolean content;
+               private java.io.File file;
+
+               public Worker(boolean impor, boolean content, java.io.File 
file) {
+                       this.impor = impor;
+                       this.content = content;
+                       this.file = file;
+               }
+
+               public void run() {
+                       if (impor) {
+                               DatabaseManager.importDatabase(file,
+                                                              
indexBrowser.getIndexBrowserPanel(),
+                                                              
core.getQueueManager());
+                       } else  {
+                               DatabaseManager.exportDatabase(file,
+                                                              
indexBrowser.getIndexBrowserPanel().getDb(),
+                                                              
indexBrowser.getIndexBrowserPanel().getIndexTree(),
+                                                              content);
+                       }
+               }
+
+       }
+}

Modified: trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java    2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java    2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -64,6 +64,7 @@
                panel = getPanel();

                
core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.hsqldb.console"),
+                                           thaw.core.IconBox.minTerminal,
                                            panel);

                return true;

Modified: trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java 2007-01-04 
23:06:34 UTC (rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java 2007-01-05 
00:14:59 UTC (rev 11568)
@@ -1,9 +1,28 @@
 package thaw.plugins.index;

-import java.sql.SQLException;
+import java.sql.*;

+import java.io.FileOutputStream;
+import java.io.FileInputStream;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+
 import thaw.core.Logger;
 import thaw.plugins.Hsqldb;
+import thaw.fcp.FCPQueueManager;

 /**
  * Creates all the tables used to save the indexes,
@@ -133,11 +152,143 @@
        }


-       public static void exportDatabase(IndexTree indexTree) {
+       public static int getNmbIndexes(Hsqldb db) {
+               int nmb;

+               try {
+                       final Connection c = db.getConnection();
+                       PreparedStatement st;
+
+                       st = c.prepareStatement("SELECT count(id) FROM 
indexes");
+                       st.execute();
+
+                       try {
+                               final ResultSet answer = st.getResultSet();
+                               answer.next();
+                               nmb = answer.getInt(1);
+                       } catch(final SQLException e) {
+                               nmb = 0;
+                       }
+
+               } catch(final SQLException e) {
+                       Logger.error(new DatabaseManager(), "Unable to insert 
the new index category in the db, because: "+e.toString());
+
+                       return 0;
+               }
+
+               return nmb;
        }

-       public static void importDatabase(IndexTree indexTree) {

+       public static void exportDatabase(java.io.File dest, Hsqldb db, 
IndexTree indexTree, boolean withContent) {
+               int nmbIndexes = getNmbIndexes(db);
+
+
+               Logger.info(new DatabaseManager(), "Generating export ...");
+
+               FileOutputStream outputStream;
+
+               try {
+                       outputStream = new FileOutputStream(dest);
+               } catch(final java.io.FileNotFoundException e) {
+                       Logger.warning(new DatabaseManager(), "Unable to create 
file '"+dest.toString()+"' ! not generated !");
+                       return;
+               }
+
+               final StreamResult streamResult = new 
StreamResult(outputStream);
+               Document xmlDoc;
+
+               final DocumentBuilderFactory xmlFactory = 
DocumentBuilderFactory.newInstance();
+               DocumentBuilder xmlBuilder;
+
+               try {
+                       xmlBuilder = xmlFactory.newDocumentBuilder();
+               } catch(final javax.xml.parsers.ParserConfigurationException e) 
{
+                       Logger.error(new DatabaseManager(), "Unable to generate 
the index because : "+e.toString());
+                       return;
+               }
+
+               final DOMImplementation impl = 
xmlBuilder.getDOMImplementation();
+
+               xmlDoc = impl.createDocument(null, "indexDatabase", null);
+
+               final Element rootEl = xmlDoc.getDocumentElement();
+
+
+               rootEl.appendChild(indexTree.getRoot().do_export(xmlDoc, 
withContent));
+
+
+               /* Serialization */
+               final DOMSource domSource = new DOMSource(xmlDoc);
+               final TransformerFactory transformFactory = 
TransformerFactory.newInstance();
+
+               Transformer serializer;
+
+               try {
+                       serializer = transformFactory.newTransformer();
+               } catch(final 
javax.xml.transform.TransformerConfigurationException e) {
+                       Logger.error(new DatabaseManager(), "Unable to save 
index because: "+e.toString());
+                       return;
+               }
+
+               serializer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
+               serializer.setOutputProperty(OutputKeys.INDENT,"yes");
+
+               /* final step */
+               try {
+                       serializer.transform(domSource, streamResult);
+               } catch(final javax.xml.transform.TransformerException e) {
+                       Logger.error(new DatabaseManager(), "Unable to save 
index because: "+e.toString());
+                       return;
+               }
+
+               Logger.info(new DatabaseManager(), "Export done");
        }
+
+
+       public static void importDatabase(java.io.File source, 
IndexBrowserPanel indexBrowser, FCPQueueManager queueManager) {
+               java.io.InputStream input;
+
+               Logger.info(new DatabaseManager(), "Importing ...");
+
+               try {
+                       input = new FileInputStream(source);
+               } catch(final java.io.FileNotFoundException e) {
+                       Logger.error(new DatabaseManager(), "Unable to load 
XML: FileNotFoundException ('"+source.getPath()+"') ! : "+e.toString());
+                       return;
+               }
+
+               final DocumentBuilderFactory xmlFactory = 
DocumentBuilderFactory.newInstance();
+               DocumentBuilder xmlBuilder;
+
+               try {
+                       xmlBuilder = xmlFactory.newDocumentBuilder();
+               } catch(final javax.xml.parsers.ParserConfigurationException e) 
{
+                       Logger.error(new DatabaseManager(), "Unable to load 
index because: "+e.toString());
+                       return;
+               }
+
+               Document xmlDoc;
+
+               try {
+                       xmlDoc = xmlBuilder.parse(input);
+               } catch(final org.xml.sax.SAXException e) {
+                       Logger.error(new DatabaseManager(), "Unable to load XML 
file because: "+e.toString());
+                       return;
+               } catch(final java.io.IOException e) {
+                       Logger.error(new DatabaseManager(), "Unable to load 
index because: "+e.toString());
+                       return;
+               }
+
+               final Element rootEl = xmlDoc.getDocumentElement();
+
+               Element e = 
(Element)rootEl.getElementsByTagName("indexCategory").item(0);
+
+               IndexCategory importCategory = 
indexBrowser.getIndexTree().getRoot().getNewImportFolder();
+
+               importCategory.do_import(e);
+
+               Logger.info(new DatabaseManager(), "Import done");
+
+       }
 }

Modified: trunk/apps/Thaw/src/thaw/plugins/index/Index.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/Index.java   2007-01-04 23:06:34 UTC 
(rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/index/Index.java   2007-01-05 00:14:59 UTC 
(rev 11568)
@@ -1289,4 +1289,30 @@
                return false;
        }

+
+       public Element do_export(Document xmlDoc, boolean withContent) {
+               Element e = xmlDoc.createElement("fullIndex");
+
+               e.setAttribute("displayName", displayName);
+               e.setAttribute("publicKey", getPublicKey());
+               if (getPrivateKey() != null)
+                       e.setAttribute("privateKey", getPrivateKey());
+
+               if (withContent) {
+                       e.appendChild(getXMLHeader(xmlDoc));
+                       e.appendChild(getXMLLinks(xmlDoc));
+                       e.appendChild(getXMLFileList(xmlDoc));
+               }
+
+               return e;
+       }
+
+       /**
+        * will call create() !!
+        */
+       public void do_import(Element e) {
+               String dn;
+               loadXML(e);
+       }
+
 }

Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexCategory.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexCategory.java   2007-01-04 
23:06:34 UTC (rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexCategory.java   2007-01-05 
00:14:59 UTC (rev 11568)
@@ -13,6 +13,11 @@
 import javax.swing.tree.MutableTreeNode;
 import javax.swing.tree.TreeNode;

+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
 import thaw.core.Logger;
 import thaw.fcp.FCPQueueManager;
 import thaw.plugins.Hsqldb;
@@ -111,7 +116,7 @@
                        child.delete();
                }

-               children = null;
+               unloadChildren();

                try {
                        final Connection c = db.getConnection();
@@ -124,7 +129,6 @@
        }

        public void rename(final String name) {
-
                try {
                        final Connection c = db.getConnection();
                        final PreparedStatement st = c.prepareStatement("UPDATE 
indexCategories SET name = ? WHERE id = ?");
@@ -269,7 +273,11 @@
                return children;
        }

+       public void unloadChildren() {
+               children = null;
+       }

+
        public void loadChildIndexes(final Vector children) {

                ResultSet result;
@@ -370,6 +378,9 @@
                if((node == this) || (node == null))
                        return;

+               if (children == null)
+                       loadChildren();
+
                if(children.size() <= position) {
                        children.setSize(position+1);
                } else {
@@ -517,8 +528,82 @@
        }


+       public Element do_export(Document xmlDoc, boolean withContent) {
+               Element e = xmlDoc.createElement("indexCategory");
+
+               if (id != -1)
+                       e.setAttribute("name", name);
+
+               if(children == null)
+                       children = loadChildren();
+
+               for(final Iterator it = children.iterator();
+                   it.hasNext();) {
+                       final IndexTreeNode node = 
(IndexTreeNode)((DefaultMutableTreeNode)it.next()).getUserObject();
+                       e.appendChild(node.do_export(xmlDoc, withContent));
+               }
+
+               unloadChildren();
+
+               return e;
+       }
+
+       /**
+        * will call create() !
+        * @param e must be a indexCategory tag
+        * @see #do_export(Document, boolean)
+        */
+       public void do_import(Element e) {
+               NodeList list = e.getChildNodes();
+
+               for (int i = 0 ; i < list.getLength(); i++) {
+                       Node n = list.item(i);
+
+                       if (n.getNodeType() == Node.ELEMENT_NODE) {
+                               Element el = (Element)n;
+
+                               if (el.getTagName().equals("fullIndex")) {
+                                       Index index = 
IndexManagementHelper.reuseIndex(queueManager, indexBrowser,
+                                                                               
       this, el.getAttribute("publicKey"),
+                                                                               
       el.getAttribute("privateKey"), false);
+                                       if (index != null) {
+                                               
index.rename(el.getAttribute("displayName"));
+                                               index.do_import(el);
+                                       }
+                               }
+
+                               if (el.getTagName().equals("indexCategory")) {
+                                       IndexCategory newCat = 
IndexManagementHelper.addIndexCategory(queueManager, indexBrowser, this,
+                                                                               
                      el.getAttribute("name"));
+                                       newCat.do_import(el);
+                               }
+                       }
+               }
+       }
+
+
        public boolean isLeaf() {
                return false;
        }

+       /**
+        * used to create import directory
+        */
+       protected IndexTreeNode getDirectChild(String name) {
+               if(children == null)
+                       children = loadChildren();
+
+               for(final Iterator it = children.iterator();
+                   it.hasNext();) {
+                       final IndexTreeNode node = 
(IndexTreeNode)((DefaultMutableTreeNode)it.next()).getUserObject();
+                       if (name.equals(node.toString()))
+                               return node;
+               }
+
+               return null;
+       }
+
+       public boolean areChildrenLoaded() {
+               return (children != null);
+       }
 }

Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java   
2007-01-04 23:06:34 UTC (rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java   
2007-01-05 00:14:59 UTC (rev 11568)
@@ -135,13 +135,13 @@
                }
        }

-       public static void createIndex(final FCPQueueManager queueManager, 
final IndexBrowserPanel indexBrowser, IndexCategory target, final String name) {
+       public static Index createIndex(final FCPQueueManager queueManager, 
final IndexBrowserPanel indexBrowser, IndexCategory target, final String name) {
                if (target == null)
                        target = indexBrowser.getIndexTree().getRoot();

                if ((name == null) || (name.indexOf("/") >= 0) || 
name.indexOf("\\") >= 0) {
                        Logger.error(new IndexManagementHelper(), "invalid 
name");
-                       return;
+                       return null;
                }

                final Index index = new Index(queueManager, indexBrowser, -1, 
target, name, name, null, null, 0, null);
@@ -150,6 +150,8 @@
                index.create();

                indexBrowser.getIndexTree().addToIndexCategory(target, index);
+
+               return index;
        }


@@ -362,33 +364,40 @@
        }


-       public static void addIndex(final FCPQueueManager queueManager, final 
IndexBrowserPanel indexBrowser, final IndexCategory target, final String 
publicKey) {
-               IndexManagementHelper.reuseIndex(queueManager, indexBrowser, 
target, publicKey, null);
+       public static Index addIndex(final FCPQueueManager queueManager, final 
IndexBrowserPanel indexBrowser, final IndexCategory target, final String 
publicKey) {
+               return IndexManagementHelper.reuseIndex(queueManager, 
indexBrowser, target, publicKey, null);
        }

+       public static Index reuseIndex(final FCPQueueManager queueManager, 
final IndexBrowserPanel indexBrowser, final IndexCategory target, String 
publicKey, String privateKey) {
+               return reuseIndex(queueManager, indexBrowser, target, 
publicKey, privateKey, true);
+       }

        /**
         * Can be use directly
         * @param privateKey Can be null
         */
-       public static void reuseIndex(final FCPQueueManager queueManager, final 
IndexBrowserPanel indexBrowser, final IndexCategory target, String publicKey, 
String privateKey) {
+       public static Index reuseIndex(final FCPQueueManager queueManager, 
final IndexBrowserPanel indexBrowser, final IndexCategory target, String 
publicKey, String privateKey,
+                                     boolean load) {

                publicKey = FreenetURIHelper.cleanURI(publicKey);
                privateKey = FreenetURIHelper.cleanURI(privateKey);

                if (publicKey == null)
-                       return;
+                       return null;

+               if (privateKey != null && privateKey.equals(""))
+                       privateKey = null;
+
                if (Index.isAlreadyKnown(indexBrowser.getDb(), publicKey)) {
                        Logger.notice(new IndexManagementHelper(), "Index 
already added !");
-                       return;
+                       return null;
                }

                final String name = Index.getNameFromKey(publicKey);

                if (name == null || name.indexOf("/") >= 0 || 
name.indexOf("\\") >= 0) {
                        Logger.error(new IndexManagementHelper(), "Invalid 
index name !\n");
-                       return;
+                       return null;
                }

                IndexCategory parent;
@@ -404,11 +413,14 @@

                index.create();

-               index.updateFromFreenet(-1);
+               if (load)
+                       index.updateFromFreenet(-1);

                parent.insert(index.getTreeNode(), 0);

                indexBrowser.getIndexTree().reloadModel(parent);
+
+               return index;
        }


@@ -434,7 +446,7 @@
        }


-       public static void addIndexCategory(final FCPQueueManager queueManager, 
final IndexBrowserPanel indexBrowser, IndexCategory target, final String name) {
+       public static IndexCategory addIndexCategory(final FCPQueueManager 
queueManager, final IndexBrowserPanel indexBrowser, IndexCategory target, final 
String name) {
                if (target == null)
                        target = indexBrowser.getIndexTree().getRoot();

@@ -443,6 +455,8 @@
                newCat.create();

                indexBrowser.getIndexTree().addToIndexCategory(target, newCat);
+
+               return newCat;
        }



Added: trunk/apps/Thaw/src/thaw/plugins/index/IndexRoot.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexRoot.java                       
        (rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexRoot.java       2007-01-05 
00:14:59 UTC (rev 11568)
@@ -0,0 +1,46 @@
+package thaw.plugins.index;
+
+import thaw.core.Logger;
+import thaw.core.I18n;
+import thaw.fcp.FCPQueueManager;
+import thaw.plugins.Hsqldb;
+
+
+public class IndexRoot extends IndexCategory {
+
+       private FCPQueueManager queueManager;
+       private IndexBrowserPanel indexBrowser;
+
+       public IndexRoot(final FCPQueueManager queueManager, final 
IndexBrowserPanel indexBrowser, final String name) {
+               super(queueManager, indexBrowser, -1, null, name);
+               this.queueManager = queueManager;
+               this.indexBrowser = indexBrowser;
+       }
+
+
+       public IndexCategory getNewImportFolder() {
+               int idx;
+               String name;
+               IndexTreeNode node;
+               IndexCategory importFolder;
+
+               if (!areChildrenLoaded())
+                       loadChildren();
+
+               idx = 0;
+               name = I18n.getMessage("thaw.plugin.index.importedFolderName");
+               node = getDirectChild(name);
+
+               while (node != null) {
+                       idx++;
+                       name = 
I18n.getMessage("thaw.plugin.index.importedFolderName") + " - 
"+Integer.toString(idx);
+                       node = getDirectChild(name);
+               }
+
+               importFolder = 
IndexManagementHelper.addIndexCategory(queueManager, indexBrowser, this, name);
+
+               return importFolder;
+       }
+
+}
+

Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexTree.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexTree.java       2007-01-04 
23:06:34 UTC (rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexTree.java       2007-01-05 
00:14:59 UTC (rev 11568)
@@ -50,7 +50,7 @@
        private JPanel panel;

        private JTree tree;
-       private IndexCategory root;
+       private IndexRoot root;

        private JPopupMenu indexCategoryMenu;
        private Vector indexCategoryActions; /* 
IndexManagementHelper.MenuAction */
@@ -113,7 +113,7 @@

                registeredIndexes = new Hashtable();

-               root = new IndexCategory(queueManager, indexBrowser, -1, null, 
rootName);
+               root = new IndexRoot(queueManager, indexBrowser, rootName);
                root.loadChildren();

                root.addObserver(this);
@@ -387,7 +387,7 @@
                return tree;
        }

-       public IndexCategory getRoot() {
+       public IndexRoot getRoot() {
                return root;
        }


Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexTreeNode.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexTreeNode.java   2007-01-04 
23:06:34 UTC (rev 11567)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexTreeNode.java   2007-01-05 
00:14:59 UTC (rev 11568)
@@ -3,6 +3,8 @@
 import java.util.Vector;

 import javax.swing.tree.DefaultMutableTreeNode;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;


 public interface IndexTreeNode {
@@ -71,4 +73,10 @@

        public void register();
        public void unregister();
+
+       /**
+        * Will export private keys too !
+        */
+       public Element do_export(Document xmlDoc, boolean withContent);
+       public void do_import(Element e);
 }


Reply via email to