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; } }