On Wed, 2002-09-25 at 14:22, Eduard Witteveen wrote:
> The following information should be asked from the connection.
> Connection.getMetaData().
> getDatabaseProductName()
> getDatabaseProductVersion()
> getDriverMajorVersion()
> getDriverMinorVersion()
> getDriverName()
> getDriverVersion()
Changed that also... can i check this in under the bugfix?
--
Eduard Witteveen Systeem Ontwikkelaar
Publieke Omroep, Gateway C Kamer 101
+31(0)356772910 http://www.omroep.nl/
Sed quis custodiet ipsos custodes? : The sixth Satire from Juvenal
<!ELEMENT database-filters ( filter+ ) >
<!ATTLIST filter database-config NMTOKEN #REQUIRED >
<!ELEMENT filter ( driver-class?, driver-name?, driver-version?, driver-major-version?, driver-minor-version?, database-product-name?, database-product-version? )* >
<!ELEMENT driver-class ( #PCDATA ) >
<!ELEMENT driver-name ( #PCDATA ) >
<!ELEMENT driver-version ( #PCDATA ) >
<!ELEMENT driver-major-version ( #PCDATA ) >
<!ATTLIST driver-major-version condition (from|equals|until) #REQUIRED >
<!ELEMENT driver-minor-version ( #PCDATA ) >
<!ATTLIST driver-minor-version condition (from|equals|until) #REQUIRED >
<!ELEMENT database-product-name ( #PCDATA ) >
<!ELEMENT database-product-version ( #PCDATA ) >
<!ELEMENT database-filters ( filter+ ) >
<!ATTLIST filter database-config NMTOKEN #REQUIRED >
<!ELEMENT filter ( driver-class?, driver-name?, driver-version?, driver-major-version?, driver-minor-version?, database-product-name?, database-product-version? )* >
<!ELEMENT driver-class ( #PCDATA ) >
<!ELEMENT driver-name ( #PCDATA ) >
<!ELEMENT driver-version ( #PCDATA ) >
<!ELEMENT driver-major-version ( #PCDATA ) >
<!ATTLIST driver-major-version condition (from|equals|until) #REQUIRED >
<!ELEMENT driver-minor-version ( #PCDATA ) >
<!ATTLIST driver-minor-version condition (from|equals|until) #REQUIRED >
<!ELEMENT database-product-name ( #PCDATA ) >
<!ELEMENT database-product-version ( #PCDATA ) >
/*
This software is OSI Certified Open Source Software.
OSI Certified is a certification mark of the Open Source Initiative.
The license (Mozilla version 1.0) can be read at the MMBase site.
See http://www.MMBase.org/license
*/
package org.mmbase.util;
import org.w3c.dom.traversal.*;
import org.xml.sax.InputSource;
import org.w3c.dom.*;
import java.io.*;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;
public class DatabaseLookup {
private static Logger log = Logging.getLoggerInstance(DatabaseLookup.class.getName());
private File databaseConfigPath;
private Document document;
public DatabaseLookup(File lookupConfig, File databaseConfigPath) {
this.databaseConfigPath = databaseConfigPath;
try {
InputSource in = new InputSource(new FileInputStream(lookupConfig));
document = XMLBasicReader.getDocumentBuilder().parse(in);
} catch(org.xml.sax.SAXException se) {
String message = "error loading configfile :'" + lookupConfig + "'" + Logging.stackTrace(se);
log.error(message);
throw new RuntimeException(message);
} catch(java.io.IOException ioe) {
String message = "error loading configfile :'" + lookupConfig + "'" + Logging.stackTrace(ioe);
throw new RuntimeException(message);
}
}
public File getDatabaseConfig(Connection connection) {
// process all the filters and when we have a match, return the result!
String xpath = "/database-filters/filter";
log.debug("gonna execute the query:" + xpath );
NodeIterator found;
try {
found = org.apache.xpath.XPathAPI.selectNodeIterator(document, xpath);
}
catch(javax.xml.transform.TransformerException te) {
String message = "error executing xpath:'"+xpath+"'" + Logging.stackTrace(te);
log.error(message);
throw new RuntimeException(message);
}
for(Node current = found.nextNode(); current != null; current = found.nextNode()) {
NamedNodeMap nnm = current.getAttributes();
Node databaseConfig = nnm.getNamedItem("database-config");
String databaseConfigName = databaseConfig.getNodeValue();
log.debug("gonna examine if we need to use the config:'" + databaseConfigName +"'");
if(match(databaseConfigName, current, connection)) {
// return the config file which should be used!
return new File(databaseConfigPath, databaseConfigName + ".xml");
}
}
try {
DatabaseMetaData dmd = connection.getMetaData();
String databaseProductName = dmd.getDatabaseProductName();
String databaseProductVersion = dmd.getDatabaseProductVersion();
int driverMajorVersion = dmd.getDriverMajorVersion();
int driverMinorVersion = dmd.getDriverMinorVersion();
String driverName = dmd.getDriverName();
String driverVersion = dmd.getDriverVersion();
String error = "unresolved connection information:";
error += "\ndatabase product name:'" + databaseProductName + "'";
error += "\ndatabase product version:'" + databaseProductVersion + "'";
error += "\ndriver class:'"+connection.getClass().getName()+"'";
error += "\ndriver major version #" + driverMajorVersion;
error += "\ndriver minor version #" + driverMinorVersion;
error += "\ndriver name '" + driverName + "'";
error += "\ndriver version '" + driverVersion + "'";
error += "\nPlease add resolve information to lookup.xml, since this database is not known to the system.";
throw new RuntimeException(error);
}
catch(java.sql.SQLException sqle) {
throw new RuntimeException(Logging.stackTrace(sqle));
}
}
private boolean match(String database, Node filterNode, Connection connection) {
// process all the conditions of this filternode...
int i=0;
Node current = filterNode.getFirstChild();
while(current != null) {
// look if we have a condition (is an element)
if(current.getNodeType()== Node.ELEMENT_NODE) {
Element condition = (Element) current;
log.debug("looking at:" + condition);
try {
// we have the following string value's:
// driver-class driver-name driver-version database-product-name database-product-version
// and the following int values:
// driver-minor-version driver-major-version
DatabaseMetaData dmd = connection.getMetaData();
if(condition.getTagName().equals("driver-class")) {
if(!startMatch(condition, connection.getClass().getName())) return false;
}
else if(condition.getTagName().equals("driver-name")) {
if(!match(condition, dmd.getDriverName())) return false;
}
else if(condition.getTagName().equals("driver-version")) {
if(!match(condition, dmd.getDriverVersion())) return false;
}
else if(condition.getTagName().equals("database-product-name")) {
if(!match(condition, dmd.getDatabaseProductName())) return false;
}
else if(condition.getTagName().equals("database-product-version")) {
if(!match(condition, dmd.getDatabaseProductVersion())) return false;
}
else if(condition.getTagName().equals("driver-major-version")) {
if(!match(condition, dmd.getDriverMajorVersion())) return false;
}
else if(condition.getTagName().equals("driver-minor-version")) {
if(!match(condition, dmd.getDriverMinorVersion())) return false;
}
else {
throw new RuntimeException("tag with name:'"+condition.getTagName()+"' unknown.");
}
i++;
}
catch(java.sql.SQLException sqle) {
new RuntimeException(Logging.stackTrace(sqle));
}
}
current = current.getNextSibling();
}
log.info("Selected database: '"+database+"' based on #" + i + " rules in it's filter.");
return true;
}
private boolean match(Node node, String value) {
// im stupid, this should work...
return node.getFirstChild().getNodeType() == Node.TEXT_NODE
&& node.getFirstChild().getNodeValue().equals(value)
&& node.getFirstChild().getNextSibling() == null;
}
private boolean startMatch(Node node, String value) {
// im stupid, this should work...
return node.getFirstChild().getNodeType() == Node.TEXT_NODE
&& value.startsWith(node.getFirstChild().getNodeValue())
&& node.getFirstChild().getNextSibling() == null;
}
private boolean match(Node node, int value) {
if(node.getFirstChild().getNodeType() != Node.TEXT_NODE) return false;
Element element = (Element) node;
String stringValue = element.getFirstChild().getNodeValue();
if(element.getFirstChild().getNextSibling() != null) return false;
// look what our value is
int foundValue = Integer.parseInt(stringValue);
String condition = element.getAttributes().getNamedItem("condition").getNodeValue();
if(condition.equals("equals")) return foundValue == value;
else if(condition.equals("from")) return foundValue <= value;
else if(condition.equals("until")) return foundValue > value;
else throw new RuntimeException("condition: '" + condition + "' unknown");
}
}
? forum
? bridge/jsp/taglib/html-escaping.diff
? bridge/remote/RemoteCloud.java
? bridge/remote/RemoteCloudContext.java
? bridge/remote/RemoteField.java
? bridge/remote/RemoteFieldIterator.java
? bridge/remote/RemoteFieldList.java
? bridge/remote/RemoteModule.java
? bridge/remote/RemoteModuleIterator.java
? bridge/remote/RemoteModuleList.java
? bridge/remote/RemoteNode.java
? bridge/remote/RemoteNodeIterator.java
? bridge/remote/RemoteNodeList.java
? bridge/remote/RemoteNodeManager.java
? bridge/remote/RemoteNodeManagerIterator.java
? bridge/remote/RemoteNodeManagerList.java
? bridge/remote/RemoteRelation.java
? bridge/remote/RemoteRelationIterator.java
? bridge/remote/RemoteRelationList.java
? bridge/remote/RemoteRelationManager.java
? bridge/remote/RemoteRelationManagerIterator.java
? bridge/remote/RemoteRelationManagerList.java
? bridge/remote/RemoteStringIterator.java
? bridge/remote/RemoteStringList.java
? bridge/remote/RemoteTransaction.java
? bridge/remote/RemoteUser.java
? bridge/remote/implementation
? bridge/remote/rmi
? scripts/.nbattrs
? scripts/WEB-INF
? scripts/jikes-573028668446107358
? util/swing
Index: bridge/implementation/BasicCloud.java
===================================================================
RCS file: /usr/local/cvs/mmbase/bridge/implementation/BasicCloud.java,v
retrieving revision 1.64
diff -r1.64 BasicCloud.java
177c177
< message = "Something went wrong while getting node with number " +
nodenumber + " (does it exist?) " + e.toString();
---
> message = "Something went wrong while getting node with number " +
>nodenumber + " (does it exist?)\n" + Logging.stackTrace(e);
Index: bridge/implementation/BasicCloudContext.java
===================================================================
RCS file: /usr/local/cvs/mmbase/bridge/implementation/BasicCloudContext.java,v
retrieving revision 1.24
diff -r1.24 BasicCloudContext.java
58,72c58,68
< Iterator i=org.mmbase.module.Module.getModules();
< if (i!=null) {
< mmb = (MMBase)org.mmbase.module.Module.getModule("MMBASEROOT");
<
<
< // create transaction manager and temporary node manager
< tmpObjectManager = new TemporaryNodeManager(mmb);
< transactionManager = new TransactionManager(mmb,tmpObjectManager);
<
< // create module list
< while(i.hasNext()) {
< Module mod =
ModuleHandler.getModule((org.mmbase.module.Module)i.next(),this);
< localModules.put(mod.getName(),mod);
< }
<
---
> mmb = org.mmbase.module.core.MMBase.getMMBase();
> // create transaction manager and temporary node manager
> tmpObjectManager = new TemporaryNodeManager(mmb);
> transactionManager = new TransactionManager(mmb,tmpObjectManager);
>
> Iterator i=org.mmbase.module.Module.getModules();
> // create module list
> while(i.hasNext()) {
> Module mod =
>ModuleHandler.getModule((org.mmbase.module.Module)i.next(),this);
> localModules.put(mod.getName(),mod);
> }
75,84d70
<
< }
< else {
< // why dont we start mmbase, when there isnt a running instance, just change
the check...
< String message;
< message = "MMBase has not been started, and cannot be started by "
< + "this Class. (" + getClass().getName() + ")";
< log.error(message);
< throw new BridgeException(message);
< }
96c82
< message = "Module " + moduleName + " does not exist.";
---
> message = "Module '" + moduleName + "' does not exist.";
110c96
< message = "Cloud " + name + " does not exist.";
---
> message = "Cloud '" + name + "' does not exist.";
125c111
< scanpage sp = new scanpage();
---
> scanpage sp = new scanpage();
135c121
< return sp;
---
> return sp;
136a123
>
Index: cache/MultilevelCacheHandler.java
===================================================================
RCS file: /usr/local/cvs/mmbase/cache/MultilevelCacheHandler.java,v
retrieving revision 1.8
diff -r1.8 MultilevelCacheHandler.java
12a13,14
> import org.mmbase.module.core.MMObjectBuilder;
> import org.mmbase.module.core.MMObjectNode;
16a19,20
> import org.mmbase.util.logging.Logger;
> import org.mmbase.util.logging.Logging;
29a34
> private static Logger log =
>Logging.getLoggerInstance(MultilevelCacheHandler.class.getName());
120c125,151
< MultilevelSubscribeNode l = (MultilevelSubscribeNode)listeners.get(type);
---
> MMObjectBuilder builder = mmb.getMMObject(type);
> if(builder == null && mmb.getRelDef().getNumberByName(type) > 0) {
> // maybe it was a reldef thing...
> // try to get the builder from reldef with name:
> // sname / dname
> int relNodeNr = mmb.getRelDef().getNumberByName(type);
> MMObjectNode relNode = mmb.getRelDef().getNode(relNodeNr);
> if(relNode == null) {
> String msg = "Reldef " + type + " could not be found for number#"
>+ relNodeNr;
> log.error(msg);
> throw new RuntimeException(msg);
> }
> int bulNodeNr = relNode.getIntValue("builder");
> MMObjectNode bulNode = mmb.getTypeDef().getNode(bulNodeNr);
> if(relNode == null) {
> String msg = "Could not get the builder-node(" + bulNodeNr + ")
>belonging to the reldef node(" + relNodeNr + ")";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> builder = mmb.getMMObject(bulNode.getStringValue("name"));
> }
> if(builder == null) {
> String msg = "builder wasnt found, tried to look at it as an reldef,
>but also failed (" + type + ")";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> MultilevelSubscribeNode l =
>(MultilevelSubscribeNode)listeners.get(builder);
122,123c153,154
< l = new MultilevelSubscribeNode(mmb,type);
< listeners.put(type,l);
---
> l = new MultilevelSubscribeNode(mmb, builder);
> listeners.put(type,builder);
Index: cache/MultilevelSubscribeNode.java
===================================================================
RCS file: /usr/local/cvs/mmbase/cache/MultilevelSubscribeNode.java,v
retrieving revision 1.7
diff -r1.7 MultilevelSubscribeNode.java
15a16
> import org.mmbase.module.core.MMObjectBuilder;
33c34,35
< private String type;
---
> private MMObjectBuilder type;
>
43,47c45,49
< MultilevelSubscribeNode(MMBase mmb,String type) {
< this.mmb=mmb;
< this.type=type;
< mmb.addLocalObserver(type,this);
< mmb.addRemoteObserver(type,this);
---
> MultilevelSubscribeNode(MMBase mmb, MMObjectBuilder type) {
> this.mmb = mmb;
> this.type = type;
> mmb.addLocalObserver(type, this);
> mmb.addRemoteObserver(type, this);
55c57
< return(true);
---
> return true;
Index: module/core/MMBase.java
===================================================================
RCS file: /usr/local/cvs/mmbase/module/core/MMBase.java,v
retrieving revision 1.68
diff -r1.68 MMBase.java
807a808,822
> public boolean addRemoteObserver(MMObjectBuilder bul, MMBaseObserver obs) {
> if (bul==null) {
> String msg = "Builder was null";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> return bul.addRemoteObserver(obs);
> }
>
> /**
> * Adds a remote observer to a specified builder.
> * The observer is noti
> fied whenever an object of that builder is changed, added, or removed.
> * @return <code>true</code> if adding the observer succeeded,
><code>false</code> otherwise.
> */
810,815c825,830
< if (bul!=null) {
< return bul.addRemoteObserver(obs);
< } else {
< log.error("addRemoteObserver(): ERROR: Can't find builder : "+type);
< return false;
< }
---
> if (bul==null) {
> String msg = "Could not retrieve the builder with name: " + type + ", is
>it active?";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> return bul.addRemoteObserver(obs);
823c838,853
< public boolean addLocalObserver(String type,MMBaseObserver obs) {
---
> public boolean addLocalObserver(MMObjectBuilder bul, MMBaseObserver obs) {
> if (bul==null) {
> String msg = "Builder was null";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> return bul.addLocalObserver(obs);
> }
>
>
> /**
> * Adds a local observer to a specified builder.
> * The observer is notified whenever an object of that builder is changed,
>added, or removed.
> * @return <code>true</code> if adding the observer succeeded,
><code>false</code> otherwise.
> */
> public boolean addLocalObserver(String type, MMBaseObserver obs) {
825,830c855
< if (bul!=null) {
< return bul.addLocalObserver(obs);
< } else {
< log.error("addLocalObserver(): ERROR: Can't find builder : "+type);
< return false;
< }
---
> return addLocalObserver(bul, obs);
Index: module/core/MMObjectBuilder.java
===================================================================
RCS file: /usr/local/cvs/mmbase/module/core/MMObjectBuilder.java,v
retrieving revision 1.150
diff -r1.150 MMObjectBuilder.java
429,440c429,445
< if (mmb.getOAlias()!=null) {
< if (getNode(alias) != null ) { // this alias already exists! Don't add
a new one!
< return false;
< }
< MMObjectNode node=mmb.getOAlias().getNewNode("system");
< node.setValue("name",alias);
< node.setValue("destination",number);
< node.insert("system");
< return true;
< } else {
< return false;
< }
---
> OAlias oalias = mmb.getOAlias();
> if(oalias == null ) {
> String msg = "Could not retrieve the alias builder, is it active?";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> if(oalias.getNumber(alias) > 0) {
> // we already found an alias, return false
> return false;
> }
> MMObjectNode original = getNode(number);
> String owner = original.getStringValue("owner");
> MMObjectNode node= oalias.getNewNode(owner);
> node.setValue("name",alias);
> node.setValue("destination", original);
> node.insert(owner);
> return true;
695c700,702
< throw new SQLException("can't find otype!");
---
> String msg = "The nodetype of node #" + number + " could not be
>found(nodetype # " + otype + ")";
> log.error(msg);
> throw new RuntimeException(msg);
702,704c709,712
< // something went wrong print it to the logs
< log.error(Logging.stackTrace(e));
< return -1;
---
> // something went wrong print it to the logs
> String msg = "Could not retrieve the type of node#" + number + " an SQL
>error occured:\n"+ Logging.stackTrace(e) ;
> log.error(msg);
> throw new RuntimeException(msg);
732,733c740,744
< int nr;
< MMObjectNode node = null;
---
> // 2 options:
> // 1) the string is a number, and we want to retrieve that number
> // 2) the string is an alias and we have to retrieve the number of that
> // the representing node, and retrieve it's value
> int nr = -1;
735,749c746,748
< log.error("getNode(null): ERROR: for tablename("+tableName+"): key is
null!");
< return null;
< }
< try {
< nr=Integer.parseInt(key);
< } catch (Exception e) {
< nr=-1;
< }
< // is not a number, try top obtain the number from the alias builder
< if ((nr<0) && (mmb.getOAlias()!=null)) {
< nr=mmb.getOAlias().getNumber(key);
< }
< // load the node if the number is right
< if (nr>0) {
< node=getNode(nr,usecache);
---
> String msg = "Could not retrieve with key :" + key;
> log.error(msg);
> throw new RuntimeException(msg);
751c750,771
< return node;
---
> try {
> // it was a number,
> nr = Integer.parseInt(key);
> }
> catch(NumberFormatException nfe) {
> // when our key was not a number,..
> // it could have been an alias
> OAlias oalias = mmb.getOAlias();
> if(oalias == null ) {
> String msg = "Could not retrieve the alias builder, is it active?";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> nr = oalias.getNumber(key);
> log.service("alias:" + key + " references node#:" + nr);
> }
> if(nr <= 0) {
> String msg = "Invalid node number #" + nr + " for key: '" + key + "'";
> log.error(msg);
> throw new RuntimeException(msg);
> }
> return getNode(nr,usecache);
787,788c807,809
< log.warn(" ("+tableName+") nodenumber == -1");
< return null;
---
> String msg = "Could not retrieve with key with number:" + number;
> log.error(msg);
> throw new RuntimeException(msg);
818,819c839,841
< log.error("The nodetype of node #" + number + " could not be
found(nodetype # " + bi + ")");
< return null;
---
> String msg = "The nodetype of node #" + number + " could not be
>found(nodetype # " + bi + ")";
> log.error(msg);
> throw new RuntimeException(msg);
850,851c872,874
< log.warn("Node #" + number + " could not be found(nodetype: " +
bul + "(" + bi + "))");
< return null; // not found
---
> String msg = "Node #" + number + " could not be found(nodetype: "
>+ bul + "(" + bi + "))";
> log.error(msg);
> throw new RuntimeException(msg);
860,864c883,885
< String msg = "The node #" + number + " could retrieved : " + e + "\n" +
Logging.stackTrace(e);
< log.error(msg);
< // do we need to throw an exception in this situation, of continue
running?
< // throw new RuntimeException(msg);
< return null;
---
> String msg = "The node #" + number + " could retrieved : " + e + "\n" +
>Logging.stackTrace(e) ;
> log.error(msg);
> throw new RuntimeException(msg);
Index: scripts/build.xml
===================================================================
RCS file: /usr/local/cvs/mmbase/scripts/build.xml,v
retrieving revision 1.145
diff -r1.145 build.xml
380c380
< depends="compile.local,compile.remote">
---
> depends="compile.local,compile.omroep,compile.remote">
431a432
> <exclude name="nl/**" />
445a447,458
>
> <target name="compile.omroep" description="Compile the omroep stuff"
>depends="compile.local">
> <javac srcdir="${source-src.dir}"
> destdir="${build.dir}/classes"
> classpathref="compile.classpath"
> debug="${debug}"
> optimize="${optimize}"
> deprecation="${deprecation}">
> <exclude name="org/**" />
> </javac>
> <tstamp/>
> </target>