initial quantum version
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / model / BookmarkCollection.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/model/BookmarkCollection.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/model/BookmarkCollection.java
new file mode 100644 (file)
index 0000000..58a854e
--- /dev/null
@@ -0,0 +1,312 @@
+package com.quantum.model;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Vector;
+
+import com.quantum.IQuantumConstants;
+import com.quantum.Messages;
+import com.quantum.model.xml.ModelToXMLConverter;
+import com.quantum.sql.metadata.MetaDataXMLInterface;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * The collection of database bookmarks that the Quantum plug-in knows about.
+ * This collection is loaded by the QuantumPlugin class before any Quantum plugin 
+ * extension is invoked.
+ * 
+ * @author BC
+ */
+public class BookmarkCollection {
+    
+    private static BookmarkCollection instance = new BookmarkCollection();
+    private List bookmarks = new Vector();
+    private boolean changed = false;
+    private PropertyChangeSupport support = new PropertyChangeSupport(this);
+    
+    private BookmarkCollection() {
+    }
+
+    /**
+     * Singleton accessor
+     */
+    public static BookmarkCollection getInstance() {
+        return BookmarkCollection.instance;
+    }
+    
+    /**
+     * Imports the bookmars from a properties file.  This load method is 
+     * provided for backwards compatability only; we no longer persist 
+     * bookmarks as properties files.
+     * @param file
+     */
+    public void load(File file) throws IOException {
+        Properties props = new Properties();
+        FileInputStream in = new FileInputStream(file);
+        props.load(in);
+        in.close();
+        fromProperties(true, props);
+    }
+     
+    private void fromProperties(boolean overwrite, Properties props) {
+        List newBookmarks = new Vector();
+        int i = 0;
+        while (true) {
+            Bookmark bookmark = new Bookmark();
+            String name = props.getProperty(i + ".name"); //$NON-NLS-1$
+            if (name == null) {
+                break;
+            }
+            bookmark.setName(name);
+            bookmark.setUsername(props.getProperty(i + ".username")); //$NON-NLS-1$
+            bookmark.setPassword(props.getProperty(i + ".password")); //$NON-NLS-1$
+            bookmark.setConnect(props.getProperty(i + ".connect")); //$NON-NLS-1$
+            bookmark.setDriver(props.getProperty(i + ".driver")); //$NON-NLS-1$
+            String schema = props.getProperty(i + ".schema"); //$NON-NLS-1$
+            if (schema != null) {
+                bookmark.addSchema(schema);
+            }
+            String type = props.getProperty(i + ".type"); //$NON-NLS-1$
+            if (type != null) {
+                bookmark.setType(type);
+            } else {
+                bookmark.setType(""); //$NON-NLS-1$
+            }
+            String driverFile = props.getProperty(i + ".driverLocation"); //$NON-NLS-1$
+            if (driverFile != null) {
+                bookmark.setDriverFile(driverFile);
+            } else {
+                bookmark.setDriverFile(""); //$NON-NLS-1$
+            }
+            System.out.println(bookmark.toString());
+            if (!bookmark.isEmpty()) {
+                newBookmarks.add(bookmark);
+            }
+            i++;
+        }
+        if (overwrite) {
+            this.bookmarks = newBookmarks;
+        } else {
+            this.bookmarks.addAll(newBookmarks);
+        }
+    }
+    /**
+     * Finds a Bookmark with the specified name.
+     * 
+     * @param name
+     * @return the bookmark with the specified name, or null if no bookmark can be found
+     */
+    public Bookmark find(String name){
+        Bookmark result = null;
+        if (name != null) {
+            for (Iterator i = this.bookmarks.iterator(); result == null && i.hasNext(); ) {
+                Bookmark temp = (Bookmark) i.next();
+                if (name.equals(temp.getName())) {
+                    result = temp;
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Exports a Bookmark data to an XMLDocument Element
+     * The complementary function is importXML()
+     * @param root  The Element to fill up with the bookmark info
+     */
+    public void exportXML(Element root) {
+        System.out.println("Bookmarks: Saving to Element"); //$NON-NLS-1$
+        Element bookmarkRoot = MetaDataXMLInterface.createElementText(root,"bookmarks", ""); //$NON-NLS-1$ //$NON-NLS-2$
+        for (int i = 0; i < bookmarks.size(); i++) {
+            Bookmark b = (Bookmark) bookmarks.get(i);
+            ModelToXMLConverter.getInstance().convert(bookmarkRoot, b);
+        }
+    }
+
+    /**
+     * Imports a Bookmark data from an XMLDocument Element
+     * The complementary function is exportXML()
+     * @param root  The Element from which to load
+     */
+    public void importXML(Element root) {
+        this.changed = true;
+        System.out.println("Bookmarks: Loading from Element"); //$NON-NLS-1$
+        Vector newBookmarks = new Vector();
+        NodeList nodes = root.getElementsByTagName("bookmark"); //$NON-NLS-1$
+        for (int i = 0; i < nodes.getLength(); i++) {
+            Bookmark bookmark = new Bookmark();
+            Element column = (Element) nodes.item(i);
+            
+            String name = MetaDataXMLInterface.getElementText(column,"name"); //$NON-NLS-1$
+            if (name == null) break;
+            bookmark.setName(name);
+            
+            MetaDataXMLInterface.getElementText(column,"name"); //$NON-NLS-1$
+            bookmark.setUsername(MetaDataXMLInterface.getElementText(column,"username")); //$NON-NLS-1$
+            bookmark.setPassword(MetaDataXMLInterface.getElementText(column,"password")); //$NON-NLS-1$
+            bookmark.setPromptForPassword(Boolean.TRUE.toString().equalsIgnoreCase(
+                MetaDataXMLInterface.getElementText(column,"prompt"))); //$NON-NLS-1$
+            bookmark.setConnect(MetaDataXMLInterface.getElementText(column,"connect")); //$NON-NLS-1$
+                       bookmark.setAutoCommit(Boolean.TRUE.toString().equalsIgnoreCase(
+                               MetaDataXMLInterface.getElementText(column,"autoCommit", "True"))); //$NON-NLS-1$
+                       bookmark.setAutoCommitPreference(MetaDataXMLInterface.getElementText(column,"autoCommitPreference", IQuantumConstants.autoCommitTrue)); //$NON-NLS-1$
+            bookmark.setDriver(MetaDataXMLInterface.getElementText(column,"driver")); //$NON-NLS-1$
+            bookmark.addSchema(MetaDataXMLInterface.getElementText(column,"schema")); //$NON-NLS-1$
+            bookmark.setType(MetaDataXMLInterface.getElementText(column,"type")); //$NON-NLS-1$
+            bookmark.setDriverFile(MetaDataXMLInterface.getElementText(column,"driverLocation")); //$NON-NLS-1$
+            NodeList children = column.getElementsByTagName(Messages.getString("ExportXMLAction.OtherSchemas"));
+            if (children.getLength() > 0) {
+                importSchemas((Element) children.item(0), bookmark);
+            }
+            System.out.println(bookmark.toString());
+            if (!bookmark.isEmpty()) {
+                newBookmarks.addElement(bookmark);
+            }
+            importQuickList(bookmark, column);
+            importQueryList(bookmark, column);
+        }
+        this.bookmarks.addAll(newBookmarks);
+        this.support.firePropertyChange("bookmarks", null, null);
+    }
+
+    private void importSchemas(Element otherSchemas, Bookmark bookmark) {
+        Vector vector = MetaDataXMLInterface.getVectorText(otherSchemas, Messages.getString("ExportXMLAction.SchemaName"));
+        List list = new ArrayList();
+        for (Iterator i = vector.iterator(); i.hasNext();) {
+            String schemaName = (String) i.next();
+            list.add(new Schema(schemaName));
+        }
+        bookmark.setSchemas((Schema[]) list.toArray(new Schema[list.size()]));
+    }
+
+    private void importQuickList(Bookmark bookmark, Element bookmarkElement) {
+        NodeList quickList = bookmarkElement.getElementsByTagName("quickList");
+        for (int j = 0,
+            length = (quickList == null) ? 0 : quickList.getLength();
+            j < length;
+            j++) {
+            
+            Element element = (Element) quickList.item(j);
+            NodeList childNodes = element.getChildNodes();
+                
+            for (int k = 0,
+                length2 = (childNodes == null) ? 0 : childNodes.getLength();
+                k < length2;
+                k++) {
+                if (Node.ELEMENT_NODE == childNodes.item(k).getNodeType()) {
+                    Element entity = (Element) childNodes.item(k);
+                    bookmark.addQuickListEntry(entity.getTagName(), 
+                        entity.getAttribute("schema"), entity.getAttribute("name"));
+                }
+            }
+        }
+    }
+    
+    private void importQueryList(Bookmark bookmark, Element bookmarkElement) {
+        NodeList queryList = bookmarkElement.getElementsByTagName("queryList");
+        for (int i = 0,
+            length = (queryList == null) ? 0 : queryList.getLength();
+            i < length;
+            i++) {
+            
+            Element element = (Element) queryList.item(i);
+            NodeList childNodes = element.getElementsByTagName("query");
+                
+            for (int k = 0,
+                length2 = (childNodes == null) ? 0 : childNodes.getLength();
+                k < length2;
+                k++) {
+
+                Element query = (Element) childNodes.item(k);
+                bookmark.addQuery(MetaDataXMLInterface.getElementText(query,"queryString"));
+        
+            }
+        }
+    }
+    
+    public void addBookmark(Bookmark b) {
+        this.changed = true;
+        if (!bookmarks.contains(b)) {
+            Bookmark[] original = getBookmarks();
+            bookmarks.add(b);
+            this.support.firePropertyChange("bookmarks", original, getBookmarks());
+        }
+    }
+    public void removeBookmark(Bookmark b) {
+        this.changed = true;
+        if (bookmarks.contains(b)) {
+            Bookmark[] original = getBookmarks();
+            bookmarks.remove(b);
+            this.support.firePropertyChange("bookmarks", original, getBookmarks());
+        }
+    }
+    
+    public Bookmark[] getBookmarks() {
+        return (Bookmark[]) this.bookmarks.toArray(new Bookmark[this.bookmarks.size()]);
+    }
+    /**
+     * @return
+     */
+    public boolean isAnythingChanged() {
+        boolean anythingChanged = this.changed;
+        for (Iterator i = this.bookmarks.iterator(); !anythingChanged && i.hasNext();) {
+            Bookmark bookmark = (Bookmark) i.next();
+            anythingChanged |= bookmark.isChanged();
+        }
+        return anythingChanged;
+    }
+    
+    public boolean isChanged() {
+        return this.changed;
+    }
+
+    /**
+     * @param b
+     */
+    public void setChanged(boolean changed) {
+        this.changed = changed;
+    }
+
+    /**
+     * @param listener
+     */
+    public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
+        this.support.addPropertyChangeListener(listener);
+    }
+
+    /**
+     * @param listener
+     */
+    public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
+        this.support.removePropertyChangeListener(listener);
+    }
+
+       /**
+        * @param string
+        * @return
+        */
+       public String getCopyName(String name) {
+               
+               String copyName = Messages.getString("BookmarkView.CopyOf") + name;
+               int i = 1;
+               while (find(copyName) != null)
+               {
+                       copyName = Messages.getString("BookmarkView.CopyOf") + name + "(" + String.valueOf(i) + ")";
+                       i++;
+               }
+               
+               return copyName;
+       }
+
+
+}