X-Git-Url: http://git.phpeclipse.com 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 index 58a854e..873e42e 100644 --- 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 @@ -6,19 +6,24 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Properties; +import java.util.Set; import java.util.Vector; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + import com.quantum.IQuantumConstants; import com.quantum.Messages; +import com.quantum.adapters.AdapterFactory; 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; +import com.quantum.util.JarUtil; /** * The collection of database bookmarks that the Quantum plug-in knows about. @@ -29,10 +34,13 @@ import org.w3c.dom.NodeList; */ public class BookmarkCollection { - private static BookmarkCollection instance = new BookmarkCollection(); + +private static final String SUN_JDBC_ODBC_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver"; + private static BookmarkCollection instance = new BookmarkCollection(); private List bookmarks = new Vector(); private boolean changed = false; private PropertyChangeSupport support = new PropertyChangeSupport(this); + private Set drivers = Collections.synchronizedSet(new HashSet()); private BookmarkCollection() { } @@ -71,28 +79,18 @@ public class BookmarkCollection { 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++; + String driver = props.getProperty(i + ".driver"); //$NON-NLS-1$ + String driverFile = props.getProperty(i + ".driverLocation"); //$NON-NLS-1$ + String type = props.getProperty(i + ".type"); //$NON-NLS-1$ + this.drivers.add(new JDBCDriver(driver, new String[] { driverFile }, type)); } if (overwrite) { this.bookmarks = newBookmarks; @@ -127,6 +125,10 @@ public class BookmarkCollection { 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 (Iterator i = this.drivers.iterator(); i.hasNext(); ) { + JDBCDriver driver = (JDBCDriver) i.next(); + ModelToXMLConverter.getInstance().convert(bookmarkRoot, driver); + } for (int i = 0; i < bookmarks.size(); i++) { Bookmark b = (Bookmark) bookmarks.get(i); ModelToXMLConverter.getInstance().convert(bookmarkRoot, b); @@ -141,7 +143,83 @@ public class BookmarkCollection { public void importXML(Element root) { this.changed = true; System.out.println("Bookmarks: Loading from Element"); //$NON-NLS-1$ - Vector newBookmarks = new Vector(); + importDrivers(root); + Vector newBookmarks = importBookmarks(root); + this.bookmarks.addAll(newBookmarks); + this.support.firePropertyChange("bookmarks", null, null); + } + + /** + * @param root + * @return + */ + private void importDrivers(Element root) { + NodeList nodes = root.getElementsByTagName("jdbcDriver"); //$NON-NLS-1$ + for (int i = 0; i < nodes.getLength(); i++) { + Element driver = (Element) nodes.item(i); + + List jarFileNames = new ArrayList(); + String jarFileName = driver.getAttribute("jarFileName"); + if (jarFileName != null && jarFileName.trim().length() > 0) { + jarFileNames.add(jarFileName); + } + NodeList jars = driver.getElementsByTagName("jar"); + for (int j = 0; j < jars.getLength(); j++) { + String fileName = ((Element) jars.item(j)).getAttribute("fileName"); + if (fileName != null && fileName.trim().length() > 0) { + jarFileNames.add(fileName); + } + } + + if (!isQuantum232Notation(driver)) { + addDriver(new JDBCDriver( + driver.getAttribute("className"), + (String[]) jarFileNames.toArray(new String[jarFileNames.size()]), + driver.getAttribute("type"), + driver.getAttribute("name"), + driver.getAttribute("version"))); + } + } + addStandardDrivers(); + } + + /** + * An earlier version of the Quantum XML format omitted the + * type. + * + * @param driver + * @return + */ + private boolean isQuantum232Notation(Element driver) { + return "".equals(driver.getAttribute("type")); + } + + /** + * + */ + private void addStandardDrivers() { + if (JarUtil.loadDriver(null, SUN_JDBC_ODBC_DRIVER) != null) { + addDriver(new JDBCDriver(SUN_JDBC_ODBC_DRIVER, new String[0], + AdapterFactory.JDBC_ODBC_BRIDGE)); + } + } + + /** + * @param driver + */ + public void addDriver(JDBCDriver driver) { + if (!this.drivers.contains(driver)) { + this.drivers.add(driver); + this.support.firePropertyChange("drivers", null, driver); + } + } + + /** + * @param root + * @return + */ + private Vector importBookmarks(Element root) { + Vector newBookmarks = new Vector(); NodeList nodes = root.getElementsByTagName("bookmark"); //$NON-NLS-1$ for (int i = 0; i < nodes.getLength(); i++) { Bookmark bookmark = new Bookmark(); @@ -160,14 +238,32 @@ public class BookmarkCollection { 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")); + + backwardCompatibility(bookmark, column); + + String driverClassName = MetaDataXMLInterface.getElementText(column,"driver"); //$NON-NLS-1$ + + List jarFiles = new ArrayList(); + NodeList driverLocations = column.getElementsByTagName("driverLocation"); + for (int j = 0, length = driverLocations == null + ? 0 : driverLocations.getLength(); j < length; j++) { + String jarFileName = MetaDataXMLInterface.extractText((Element) driverLocations.item(j), ""); + if (jarFileName != null && jarFileName.trim().length() > 0) { + jarFiles.add(jarFileName); + } + } + String type = MetaDataXMLInterface.getElementText(column,"type"); //$NON-NLS-1$ + + bookmark.setJDBCDriver(new JDBCDriver(driverClassName, + (String[]) jarFiles.toArray(new String[jarFiles.size()]), + type)); + + NodeList children = column.getElementsByTagName("Other_Schemas"); if (children.getLength() > 0) { importSchemas((Element) children.item(0), bookmark); } + + System.out.println(bookmark.toString()); if (!bookmark.isEmpty()) { newBookmarks.addElement(bookmark); @@ -175,21 +271,54 @@ public class BookmarkCollection { importQuickList(bookmark, column); importQueryList(bookmark, column); } - this.bookmarks.addAll(newBookmarks); - this.support.firePropertyChange("bookmarks", null, null); - } + return newBookmarks; + } + + /** + * Earlier versions of the xml file expected one schema element under the + * bookmark element. This method sees if it exists. + * + * @param bookmark + * @param element + */ + private void backwardCompatibility(Bookmark bookmark, Element element) { + NodeList children = element.getChildNodes(); + for (int i = 0, length = children.getLength(); i < length; i++) { + Node node = children.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE && + "schema".equals(((Element) node).getTagName())) { + String schema = MetaDataXMLInterface.extractText(element,""); + if (schema != null && schema.trim().length() > 0) { + bookmark.addSchema(schema); + } + } + } + } - private void importSchemas(Element otherSchemas, Bookmark bookmark) { - Vector vector = MetaDataXMLInterface.getVectorText(otherSchemas, Messages.getString("ExportXMLAction.SchemaName")); + private void importSchemas(Element otherSchemas, Bookmark bookmark) { List list = new ArrayList(); - for (Iterator i = vector.iterator(); i.hasNext();) { - String schemaName = (String) i.next(); - list.add(new Schema(schemaName)); + NodeList children = otherSchemas.getChildNodes(); + for (int i = 0, length = children.getLength(); i < length; i++) { + Node node = children.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE + && "schema".equalsIgnoreCase(((Element) node).getTagName())) { + list.add(new Schema( + MetaDataXMLInterface.extractText((Element) node, ""))); + } } - bookmark.setSchemas((Schema[]) list.toArray(new Schema[list.size()])); + + String schemaRule = otherSchemas.getAttribute("schemaRule"); + if ("useAll".equals(schemaRule)) { + bookmark.setSchemaRule(Bookmark.SCHEMA_RULE_USE_ALL); + } else if ("useDefault".equals(schemaRule)) { + bookmark.setSchemaRule(Bookmark.SCHEMA_RULE_USE_DEFAULT); + } else { + bookmark.setSchemaRule(Bookmark.SCHEMA_RULE_USE_SELECTED); + } + bookmark.setSchemaSelections((Schema[]) list.toArray(new Schema[list.size()])); } - private void importQuickList(Bookmark bookmark, Element bookmarkElement) { + private void importQuickList(Bookmark bookmark, Element bookmarkElement) { NodeList quickList = bookmarkElement.getElementsByTagName("quickList"); for (int j = 0, length = (quickList == null) ? 0 : quickList.getLength(); @@ -206,7 +335,7 @@ public class BookmarkCollection { if (Node.ELEMENT_NODE == childNodes.item(k).getNodeType()) { Element entity = (Element) childNodes.item(k); bookmark.addQuickListEntry(entity.getTagName(), - entity.getAttribute("schema"), entity.getAttribute("name")); + entity.getAttribute("schema"), entity.getAttribute("name"), entity.getAttribute("isSynonym").equals("true") ); } } } @@ -254,6 +383,16 @@ public class BookmarkCollection { public Bookmark[] getBookmarks() { return (Bookmark[]) this.bookmarks.toArray(new Bookmark[this.bookmarks.size()]); } + + public JDBCDriver[] getJDBCDrivers() { + if (this.drivers.isEmpty()) { + addStandardDrivers(); + } + + List list = new ArrayList(this.drivers); + Collections.sort(list); + return (JDBCDriver[]) list.toArray(new JDBCDriver[list.size()]); + } /** * @return */ @@ -308,5 +447,53 @@ public class BookmarkCollection { return copyName; } + /** + * @param driver + * @param driverFile + */ + public JDBCDriver findDriver(String driverClassName, String[] driverFiles, String type) { + JDBCDriver temp = new JDBCDriver(driverClassName, driverFiles, type); + return findDriver(temp); + } + + /** + * @param temp + * @return + */ + public JDBCDriver findDriver(JDBCDriver temp) { + JDBCDriver result = null; + for (Iterator i = this.drivers.iterator(); result == null && i.hasNext();) { + JDBCDriver driver = (JDBCDriver) i.next(); + if (temp.equals(driver)) { + result = driver; + } + } + if (result == null) { + addDriver(temp); + result = temp; + } + return result; + } + /** + * @param driver + */ + public boolean removeDriver(JDBCDriver driver) { + boolean found = false; + for (Iterator i = this.bookmarks.iterator(); + !found && driver != null && i.hasNext();) { + Bookmark bookmark = (Bookmark) i.next(); + found |= driver.equals(bookmark.getJDBCDriver()); + } + + if (!found && driver != null && !SUN_JDBC_ODBC_DRIVER.equals(driver.getClassName())) { + boolean deleted = this.drivers.remove(driver); + if (deleted) { + this.support.firePropertyChange("drivers", null, null); + } + return deleted; + } else { + return false; + } + } }