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>

Reply via email to