Author: jflesch
Date: 2007-03-19 17:18:58 +0000 (Mon, 19 Mar 2007)
New Revision: 12219
Modified:
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/IndexFolder.java
trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
Log:
Reimplement index database importation
Modified: trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java 2007-03-19
13:09:25 UTC (rev 12218)
+++ trunk/apps/Thaw/src/thaw/plugins/index/DatabaseManager.java 2007-03-19
17:18:58 UTC (rev 12219)
@@ -10,6 +10,8 @@
import java.util.Iterator;
import java.util.Vector;
+/* DOM */
+
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
@@ -22,6 +24,23 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+
+/* SAX */
+
+import org.xml.sax.*;
+import org.xml.sax.helpers.LocatorImpl;
+
+import java.io.IOException;
+
+import org.xml.sax.helpers.XMLReaderFactory;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+
+
+
import thaw.core.Config;
import thaw.core.Logger;
import thaw.core.SplashScreen;
@@ -238,12 +257,16 @@
}
}
+ /**
+ * try to use the auto increment instead
+ */
public static int getNextId(Hsqldb db, String table) {
try {
PreparedStatement st;
- st =
db.getConnection().prepareStatement("SELECT IDENTITY()+1 FROM "+
- table);
+ st =
db.getConnection().prepareStatement("select id+1 from "+
+ table +
+ "
order by id desc limit 1");
ResultSet res = st.executeQuery();
if (res.next())
@@ -353,6 +376,200 @@
}
+
+ protected static class DatabaseHandler extends DefaultHandler {
+ private Locator locator = null;
+
+ private Hsqldb db;
+ private IndexBrowserPanel indexBrowser;
+
+ private IndexFolder importFolder;
+
+ private IndexFolder folders[] = new IndexFolder[64];
+ private int folderLevel = 0;
+
+
+ public DatabaseHandler(IndexBrowserPanel indexBrowser) {
+ this.db = indexBrowser.getDb();
+ this.indexBrowser = indexBrowser;
+ }
+
+ /**
+ * @see
org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
+ */
+ public void setDocumentLocator(Locator value) {
+ locator = value;
+ }
+
+ /**
+ * Called when parsing is started
+ * @see org.xml.sax.ContentHandler#startDocument()
+ */
+ public void startDocument() throws SAXException {
+ importFolder =
indexBrowser.getIndexTree().getRoot().getNewImportFolder(db);
+ folders[0] = importFolder;
+ folderLevel = 0;
+ }
+
+ /**
+ * Called when parsing is finished
+ * @see org.xml.sax.ContentHandler#endDocument()
+ */
+ public void endDocument() throws SAXException {
+ /* \_o< */
+ }
+
+ /**
+ * Called when starting to parse in a specific name space
+ * @param prefix name space prefix
+ * @param URI name space URI
+ * @see
org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String,
java.lang.String)
+ */
+ public void startPrefixMapping(String prefix, String URI)
throws SAXException {
+ /* \_o< */
+ }
+
+ /**
+ * @param prefix name space prefix
+ * @see
org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
+ */
+ public void endPrefixMapping(String prefix) throws SAXException
{
+ /* \_o< */
+ }
+
+
+
+ /**
+ * if null, then not in an index
+ * else all the tag found will be sent to this handler
+ */
+ private Index.IndexHandler indexHandler = null;
+
+
+ /**
+ * Called when the parsed find an opening tag
+ * @param localName local tag name
+ * @param rawName rawName (the one used here)
+ * @see
org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String,
java.lang.String, org.xml.sax.Attributes)
+ */
+ public void startElement(String nameSpaceURI, String localName,
+ String rawName, Attributes attrs)
throws SAXException {
+ if (rawName == null) {
+ rawName = localName;
+ }
+
+ if (rawName == null)
+ return;
+
+
+ if ("indexCategory".equals(rawName)) {
+ /* should be indexFolder ... but because of the
backward compatibility ... */
+
+ if (attrs.getValue("name") == null) {
+ /* this should never happen, but the
exporter is a little
+ * b0rked, and I'm a little bit lazy,
so it happens
+ */
+ return;
+ }
+
+ folderLevel++;
+
+ folders[folderLevel] =
+
IndexManagementHelper.addIndexFolder(indexBrowser,
+
folders[folderLevel-1],
+
attrs.getValue("name"));
+
+ return;
+ }
+
+ if ("fullIndex".equals(rawName)) {
+ Index index =
IndexManagementHelper.reuseIndex(null, indexBrowser,
+
folders[folderLevel],
+
attrs.getValue("publicKey"),
+
attrs.getValue("privateKey"),
+
false);
+ if (index != null) {
+
index.rename(attrs.getValue("displayName"));
+
+ indexHandler = index.getIndexHandler();
+
+ indexHandler.startDocument();
+ }
+
+ return;
+ }
+
+ if (indexHandler != null) {
+ indexHandler.startElement(nameSpaceURI,
localName,
+ rawName, attrs);
+ }
+ }
+
+ /**
+ * Called when a closing tag is met
+ * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
java.lang.String, java.lang.String)
+ */
+ public void endElement(String nameSpaceURI, String localName,
+ String rawName) throws SAXException {
+ if (rawName == null) {
+ rawName = localName;
+ }
+
+ if (rawName == null)
+ return;
+
+ if ("indexCategory".equals(rawName)) {
+ folderLevel--;
+ return;
+ }
+
+ if ("fullIndex".equals(rawName)) {
+ indexHandler.endDocument();
+ indexHandler = null;
+ return;
+ }
+
+ if (indexHandler != null)
+ indexHandler.endElement(nameSpaceURI,
localName, rawName);
+ }
+
+
+ /**
+ * Called when a text between two tag is met
+ * @param ch text
+ * @param start position
+ * @param end position
+ * @see org.xml.sax.ContentHandler#characters(char[], int, int)
+ */
+ public void characters(char[] ch, int start, int end) throws
SAXException {
+ String txt = new String(ch, start, end);
+
+ if (indexHandler != null)
+ indexHandler.characters(ch, start, end);
+
+ /* ignore unkwown stuffs */
+
+ }
+
+ public void ignorableWhitespace(char[] ch, int start, int end)
throws SAXException {
+
+ }
+
+ public void processingInstruction(String target, String data)
throws SAXException {
+
+ }
+
+ /**
+ * @see
org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
+ */
+ public void skippedEntity(String arg0) throws SAXException {
+
+ }
+
+
+ }
+
+
public static void importDatabase(java.io.File source,
IndexBrowserPanel indexBrowser, FCPQueueManager queueManager) {
java.io.InputStream input;
@@ -365,36 +582,25 @@
return;
}
- final DocumentBuilderFactory xmlFactory =
DocumentBuilderFactory.newInstance();
- DocumentBuilder xmlBuilder;
+ DatabaseHandler handler = new DatabaseHandler(indexBrowser);
+
try {
- xmlBuilder = xmlFactory.newDocumentBuilder();
- } catch(final javax.xml.parsers.ParserConfigurationException e)
{
- Logger.error(new DatabaseManager(), "Unable to load
index because: "+e.toString());
- return;
- }
+ // Use the default (non-validating) parser
+ SAXParserFactory factory =
SAXParserFactory.newInstance();
- 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;
+ // Parse the input
+ SAXParser saxParser = factory.newSAXParser();
+ saxParser.parse(input, handler);
+ } catch(javax.xml.parsers.ParserConfigurationException e) {
+ Logger.error(new DatabaseManager(), "Error (1) while
importing database : "+e.toString());
+ } catch(org.xml.sax.SAXException e) {
+ Logger.error(new DatabaseManager(), "Error (2) while
importing database : "+e.toString());
+ } catch(java.io.IOException e) {
+ Logger.error(new DatabaseManager(), "Error (3) while
importing database : "+e.toString());
}
- final Element rootEl = xmlDoc.getDocumentElement();
- Element e =
(Element)rootEl.getElementsByTagName("indexCategory").item(0);
-
- IndexFolder importCategory =
indexBrowser.getIndexTree().getRoot().getNewImportFolder(indexBrowser.getDb());
-
- importCategory.do_import(indexBrowser, e);
-
indexBrowser.getIndexTree().getRoot().forceReload();
indexBrowser.getIndexTree().refresh();
Modified: trunk/apps/Thaw/src/thaw/plugins/index/Index.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/Index.java 2007-03-19 13:09:25 UTC
(rev 12218)
+++ trunk/apps/Thaw/src/thaw/plugins/index/Index.java 2007-03-19 17:18:58 UTC
(rev 12219)
@@ -19,7 +19,7 @@
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
-/* DOM (to remove) */
+/* DOM */
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -1075,7 +1075,7 @@
}
- protected class IndexHandler extends DefaultHandler {
+ public class IndexHandler extends DefaultHandler {
private Locator locator = null;
public IndexHandler() {
@@ -1299,6 +1299,14 @@
}
+ /**
+ * see import functionnality
+ */
+ public IndexHandler getIndexHandler() {
+ return new IndexHandler();
+ }
+
+
public synchronized void loadXML(final java.io.InputStream input,
boolean clean) {
IndexHandler handler = new IndexHandler();
Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexFolder.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexFolder.java 2007-03-19
13:09:25 UTC (rev 12218)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexFolder.java 2007-03-19
17:18:58 UTC (rev 12219)
@@ -1228,6 +1228,7 @@
}
public void do_import(IndexBrowserPanel indexBrowser, Element e) {
+ /*
NodeList list = e.getChildNodes();
for (int i = 0 ; i < list.getLength(); i++) {
@@ -1253,6 +1254,7 @@
}
}
}
+ */
}
}
Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
2007-03-19 13:09:25 UTC (rev 12218)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
2007-03-19 17:18:58 UTC (rev 12219)
@@ -191,7 +191,7 @@
" publicKey, privateKey, author, "+
" positionInTree, revision, "+
" newRev, parent) "+
-
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
/* TODO : Author */
@@ -214,7 +214,7 @@
if (getTarget().getId() >= 0)
st.setInt(10,
getTarget().getId());
else
- st.setNull(10, Types.INTEGER);
+ st.setNull(11, Types.INTEGER);
st.execute();