You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2003/02/11 10:41:55 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/broker/metadata MetadataTest.java
arminw 2003/02/11 01:41:55
Modified: src/java/org/apache/ojb/broker/metadata
ConnectionRepository.java
src/java/org/apache/ojb/broker/ta
PersistenceBrokerFactoryDefaultImpl.java
src/java/org/apache/ojb/broker/util BrokerHelper.java
src/test/org/apache/ojb/broker/metadata MetadataTest.java
Log:
fix bug in usage of PBKey
with user/password 'null'.
Revision Changes Path
1.7 +34 -18 db-ojb/src/java/org/apache/ojb/broker/metadata/ConnectionRepository.java
Index: ConnectionRepository.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/ConnectionRepository.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ConnectionRepository.java 31 Jan 2003 17:03:32 -0000 1.6
+++ ConnectionRepository.java 11 Feb 2003 09:41:55 -0000 1.7
@@ -1,17 +1,18 @@
package org.apache.ojb.broker.metadata;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.lang.SystemUtils;
import org.apache.ojb.broker.PBKey;
import org.apache.ojb.broker.util.logging.Logger;
import org.apache.ojb.broker.util.logging.LoggerFactory;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
/**
* Manages all {@link JdbcConnectionDescriptor} instances.
*
@@ -22,11 +23,13 @@
{
private static Logger log = LoggerFactory.getLogger(ConnectionRepository.class);
- public static final String DATABASE_METADATA_FILENAME = "repository_database.xml";
- private HashMap jcdMap = new HashMap();
+ private HashMap jcdMap;
+ private Hashtable jcdAliasToPBKeyMap;
public ConnectionRepository()
{
+ jcdMap = new HashMap();
+ jcdAliasToPBKeyMap = new Hashtable();
}
/**
@@ -39,13 +42,13 @@
if (result == null)
{
result = deepCopyOfFirstFound(pbKey.getAlias());
- if(result != null)
+ if (result != null)
{
result.setUserName(pbKey.getUser());
result.setPassWord(pbKey.getPassword());
// this build connection descriptor could not be the default connection
result.setDefaultConnection(false);
- log.info("Automatic create of new jdbc-connection-descriptor for PBKey "+pbKey);
+ log.info("Automatic create of new jdbc-connection-descriptor for PBKey " + pbKey);
addDescriptor(result);
}
else
@@ -68,7 +71,7 @@
while (it.hasNext())
{
jcd = (JdbcConnectionDescriptor) it.next();
- if(jcdAlias.equals(jcd.getJcdAlias()))
+ if (jcdAlias.equals(jcd.getJcdAlias()))
{
return (JdbcConnectionDescriptor) SerializationUtils.clone(jcd);
}
@@ -76,6 +79,11 @@
return null;
}
+ public PBKey getStandardPBKeyForJcdAlias(String jcdAlias)
+ {
+ return (PBKey) jcdAliasToPBKeyMap.get(jcdAlias);
+ }
+
/**
* Add a new {@link JdbcConnectionDescriptor}.
*/
@@ -86,10 +94,17 @@
if (jcdMap.containsKey(jcd.getPBKey()))
{
throw new MetadataException("Found duplicate connection descriptor using PBKey " +
- jcd.getPBKey() + ", remove the old descriptor first, before add the new one. "+jcd);
+ jcd.getPBKey() + ", remove the old descriptor first, before add the new one. " + jcd);
}
jcdMap.put(jcd.getPBKey(), jcd);
- if(log.isDebugEnabled()) log.debug("New descriptor was added: " + jcd);
+ // only if the jcdAlias was not found, put the new PBKey,
+ // because we don't want to replace the original PBKey with
+ // automatic generated descriptors PBKey's - see method getDescriptor(PBKey key)
+ if (!jcdAliasToPBKeyMap.containsKey(jcd.getJcdAlias()))
+ {
+ jcdAliasToPBKeyMap.put(jcd.getJcdAlias(), jcd.getPBKey());
+ }
+ if (log.isDebugEnabled()) log.debug("New descriptor was added: " + jcd);
}
}
@@ -100,14 +115,14 @@
*/
public void removeDescriptor(Object validKey)
{
- PBKey jcdKey;
+ PBKey pbKey;
if (validKey instanceof PBKey)
{
- jcdKey = (PBKey) validKey;
+ pbKey = (PBKey) validKey;
}
else if (validKey instanceof JdbcConnectionDescriptor)
{
- jcdKey = ((JdbcConnectionDescriptor) validKey).getPBKey();
+ pbKey = ((JdbcConnectionDescriptor) validKey).getPBKey();
}
else
{
@@ -117,7 +132,8 @@
Object removed = null;
synchronized (jcdMap)
{
- removed = jcdMap.remove(jcdKey);
+ removed = jcdMap.remove(pbKey);
+ jcdAliasToPBKeyMap.remove(pbKey.getAlias());
}
log.info("Remove descriptor: " + removed);
}
1.36 +21 -15 db-ojb/src/java/org/apache/ojb/broker/ta/PersistenceBrokerFactoryDefaultImpl.java
Index: PersistenceBrokerFactoryDefaultImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/ta/PersistenceBrokerFactoryDefaultImpl.java,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- PersistenceBrokerFactoryDefaultImpl.java 30 Jan 2003 15:16:51 -0000 1.35
+++ PersistenceBrokerFactoryDefaultImpl.java 11 Feb 2003 09:41:55 -0000 1.36
@@ -54,10 +54,6 @@
* <http://www.apache.org/>.
*/
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
import org.apache.commons.pool.KeyedObjectPool;
import org.apache.commons.pool.KeyedPoolableObjectFactory;
import org.apache.commons.pool.impl.GenericKeyedObjectPool;
@@ -65,7 +61,6 @@
import org.apache.ojb.broker.PBKey;
import org.apache.ojb.broker.PBState;
import org.apache.ojb.broker.PersistenceBroker;
-import org.apache.ojb.broker.accesslayer.ConnectionFactoryFactory;
import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
import org.apache.ojb.broker.metadata.MetadataManager;
import org.apache.ojb.broker.server.PersistenceBrokerClient;
@@ -74,6 +69,7 @@
import org.apache.ojb.broker.singlevm.PersistenceBrokerImpl;
import org.apache.ojb.broker.singlevm.PersistenceBrokerThreadMapping;
import org.apache.ojb.broker.singlevm.PoolablePersistenceBroker;
+import org.apache.ojb.broker.util.BrokerHelper;
import org.apache.ojb.broker.util.ClassHelper;
import org.apache.ojb.broker.util.configuration.Configuration;
import org.apache.ojb.broker.util.configuration.ConfigurationException;
@@ -85,11 +81,16 @@
import org.apache.ojb.broker.util.logging.LoggerFactory;
import org.apache.ojb.broker.util.logging.LoggingHelper;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
/**
* This is the default implementation of the {@link PersistenceBrokerFactoryIF}
* interface.
*
* @author <a href="mailto:thma@apache.org">Thomas Mahler<a>
+ * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
* @version $Id$
*/
public class PersistenceBrokerFactoryDefaultImpl implements PersistenceBrokerFactoryIF
@@ -122,7 +123,7 @@
{
this.defaultPBKey = key;
- log.info("Set default PBKey: "+key);
+ log.info("Set default PBKey: " + key);
/*
TODO
should we change the default-connection entry
@@ -146,9 +147,9 @@
for (Iterator iterator = descriptors.iterator(); iterator.hasNext();)
{
descriptor = (JdbcConnectionDescriptor) iterator.next();
- if(descriptor.isDefaultConnection())
+ if (descriptor.isDefaultConnection())
{
- return new PBKey(descriptor.getJcdAlias(),descriptor.getUserName(), descriptor.getPassWord());
+ return new PBKey(descriptor.getJcdAlias(), descriptor.getUserName(), descriptor.getPassWord());
}
}
log.warn("### No 'default' jdbc-connection-descriptor defined," +
@@ -181,7 +182,7 @@
*/
protected PersistenceBroker createNewBrokerInstance(PBKey key) throws PBFactoryException
{
- if(key == null) throw new PBFactoryException("Could not create new broker with PBkey argument 'null'");
+ if (key == null) throw new PBFactoryException("Could not create new broker with PBkey argument 'null'");
if (log.isEnabledFor(Logger.INFO))
{
// only count created instances when INFO-Log-Level
@@ -210,9 +211,14 @@
public PersistenceBroker createPersistenceBroker(PBKey pbKey) throws PBFactoryException
{
+ if (log.isDebugEnabled()) log.debug("createPersistenceBroker(key) called");
PersistenceBroker broker;
- if (log.isDebugEnabled()) log.debug("createPersistenceBroker(key) called");
+ /*
+ try to find a valid PBKey, if given key does not full match
+ */
+ pbKey = BrokerHelper.crossCheckPBKey(pbKey);
+
// running in client/server mode ?
if (getPersistenceBrokerConfiguration().isRunningInServerMode())
{
@@ -263,7 +269,7 @@
*/
public PersistenceBroker defaultPersistenceBroker(String user, String password) throws PBFactoryException
{
- if(getDefaultKey() == null) throw new PBFactoryException("There was no default-PBKey specified");
+ if (getDefaultKey() == null) throw new PBFactoryException("There was no default-PBKey specified");
return this.createPersistenceBroker(
new PBKey(getDefaultKey().getAlias(), user, password));
}
@@ -273,7 +279,7 @@
*/
public PersistenceBroker defaultPersistenceBroker() throws PBFactoryException
{
- if(getDefaultKey() == null) throw new PBFactoryException("There was no default-PBKey specified");
+ if (getDefaultKey() == null) throw new PBFactoryException("There was no default-PBKey specified");
return this.createPersistenceBroker(getDefaultKey());
}
@@ -383,7 +389,7 @@
public void destroyObject(Object key, Object obj) throws Exception
{
PersistenceBroker broker = ((PoolablePersistenceBroker) obj).getInnermostDelegate();
- if(broker instanceof PersistenceBrokerImpl)
+ if (broker instanceof PersistenceBrokerImpl)
{
((PersistenceBrokerImpl) broker).destroy();
}
@@ -402,7 +408,7 @@
{
//here we could validate the PB instance
//if corresponding configuration properties are set
- if(((PersistenceBroker) obj).isInTransaction())
+ if (((PersistenceBroker) obj).isInTransaction())
{
log.error("Illegal broker state! This broker instance was already in transaction.");
return false;
1.8 +17 -9 db-ojb/src/java/org/apache/ojb/broker/util/BrokerHelper.java
Index: BrokerHelper.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/util/BrokerHelper.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- BrokerHelper.java 16 Jan 2003 16:19:32 -0000 1.7
+++ BrokerHelper.java 11 Feb 2003 09:41:55 -0000 1.8
@@ -65,6 +65,7 @@
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.metadata.FieldDescriptor;
import org.apache.ojb.broker.metadata.MetadataException;
+import org.apache.ojb.broker.metadata.MetadataManager;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentField;
import org.apache.ojb.broker.singlevm.PersistenceBrokerConfiguration;
import org.apache.ojb.broker.util.sequence.SequenceManagerException;
@@ -123,19 +124,26 @@
{
passwd = "";
}
- /*
- allow ODMG-api database.open("myAlias") if 'myAlias' was
- declared as default-connection
- */
- if (user == null && passwd == null)
+ PBKey key = new PBKey(dbName, user, passwd);
+ return key;
+ }
+
+ /**
+ * Check if the user of the given PBKey was <code>null</code>, if so we try to
+ * get user/password from the jdbc-connection-descriptor matching the given
+ * PBKey.getAlias().
+ */
+ public static PBKey crossCheckPBKey(PBKey key)
+ {
+ if(key.getUser() == null)
{
- PBKey defKey = PersistenceBrokerFactory.getDefaultKey();
- if (defKey != null && defKey.getAlias().equals(dbName))
+ PBKey defKey = MetadataManager.getInstance().
+ connectionRepository().getStandardPBKeyForJcdAlias(key.getAlias());
+ if(defKey != null)
{
return defKey;
}
}
- PBKey key = new PBKey(dbName, user, passwd);
return key;
}
1.4 +106 -13 db-ojb/src/test/org/apache/ojb/broker/metadata/MetadataTest.java
Index: MetadataTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/metadata/MetadataTest.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MetadataTest.java 31 Jan 2003 17:50:07 -0000 1.3
+++ MetadataTest.java 11 Feb 2003 09:41:55 -0000 1.4
@@ -1,13 +1,23 @@
package org.apache.ojb.broker.metadata;
import junit.framework.TestCase;
+import org.apache.ojb.broker.PBFactoryException;
import org.apache.ojb.broker.PBKey;
import org.apache.ojb.broker.PersistenceBroker;
-import org.apache.ojb.broker.PersistenceBrokerFactory;
-import org.apache.ojb.broker.PBFactoryException;
import org.apache.ojb.broker.PersistenceBrokerException;
+import org.apache.ojb.broker.PersistenceBrokerFactory;
+import org.apache.ojb.broker.TestHelper;
+import org.apache.ojb.broker.query.Criteria;
+import org.apache.ojb.broker.query.Query;
+import org.apache.ojb.broker.query.QueryFactory;
import org.apache.ojb.broker.sequence.SMMaxA;
import org.apache.ojb.broker.util.sequence.SequenceManagerHighLowImpl;
+import org.apache.ojb.odmg.OJB;
+import org.apache.ojb.odmg.collections.DListImpl;
+import org.odmg.Database;
+import org.odmg.Implementation;
+import org.odmg.OQLQuery;
+import org.odmg.Transaction;
import java.util.Iterator;
@@ -17,6 +27,11 @@
*/
public class MetadataTest extends TestCase
{
+ /**
+ * A persistent object class
+ */
+ private Class testClass = DListImpl.class;
+
public static void main(String[] args)
{
String[] arr = {MetadataTest.class.getName()};
@@ -60,12 +75,12 @@
ThreadGroup metadata = new ThreadGroup("metadata");
new Thread(metadata, gub).start();
new Thread(metadata, tub).start();
- while(metadata.activeCount() > 0)
+ while (metadata.activeCount() > 0)
{
Thread.sleep(50);
}
period = System.currentTimeMillis() - period;
- System.out.println("RuntimeMetadataChanges test take: "+period+" ms");
+ System.out.println("RuntimeMetadataChanges test take: " + period + " ms");
MetadataManager.getInstance().setEnablePerThreadChanges(false);
PersistenceBroker broker = null;
@@ -79,7 +94,7 @@
}
finally
{
- if(broker != null) broker.close();
+ if (broker != null) broker.close();
}
}
@@ -95,10 +110,10 @@
public void run()
{
PersistenceBroker broker = null;
- int k =0;
+ int k = 0;
try
{
- while (k<loops)
+ while (k < loops)
{
try
{
@@ -110,7 +125,7 @@
}
finally
{
- if(broker != null) broker.close();
+ if (broker != null) broker.close();
}
try
{
@@ -122,7 +137,7 @@
}
finally
{
- if(broker != null) broker.close();
+ if (broker != null) broker.close();
}
k++;
@@ -164,7 +179,7 @@
MetadataManager.getInstance().setPerThreadDescriptor(dr);
int k = 0;
- while (k<loops)
+ while (k < loops)
{
PersistenceBroker broker = null;
try
@@ -177,7 +192,7 @@
}
finally
{
- if(broker != null) broker.close();
+ if (broker != null) broker.close();
}
try
@@ -190,7 +205,7 @@
}
finally
{
- if(broker != null) broker.close();
+ if (broker != null) broker.close();
}
k++;
@@ -206,6 +221,84 @@
}
}
+ /**
+ * test to check PB create with PBKey
+ */
+ public void testLookupPB1()
+ {
+ PBKey key1 = new PBKey(TestHelper.DEF_JCD_ALIAS);
+ PBKey key2 = new PBKey(TestHelper.DEF_JCD_ALIAS, TestHelper.DEF_USER, TestHelper.DEF_PASSWORD);
+ PBKey key3 = new PBKey(TestHelper.FAR_AWAY_JCD_ALIAS);
+ Query query = QueryFactory.newQuery(testClass, new Criteria());
+
+ PersistenceBroker broker = PersistenceBrokerFactory.createPersistenceBroker(key1);
+ broker.getCount(query);
+ broker.close();
+
+ broker = PersistenceBrokerFactory.createPersistenceBroker(key2);
+ broker.getCount(query);
+ broker.close();
+
+ broker = PersistenceBrokerFactory.createPersistenceBroker(key3);
+ broker.getCount(query);
+ broker.close();
+ }
+
+ /**
+ * test to check PB create with PBKey
+ */
+ public void testLookupPB2()
+ {
+ PBKey key1 = new PBKey(TestHelper.DEF_JCD_ALIAS, "!!TestCase: This should fail!!", "nothing");
+ Query query = QueryFactory.newQuery(testClass, new Criteria());
+ PersistenceBroker broker = PersistenceBrokerFactory.createPersistenceBroker(key1);
+ // hsql is not very strict in user handling
+ try
+ {
+ broker.getCount(query);
+ fail("We excect a exception, because we pass a PBKey with user and password that doesn't exist");
+ }
+ catch (Exception e)
+ {
+ assertTrue(true);
+ }
+ broker.close();
+ }
+
+ /**
+ * test to check database open
+ */
+ public void testLookupDatabase() throws Exception
+ {
+ String queryStr = "select allArticle from " + testClass.getName();
+ Implementation odmg = OJB.getInstance();
+ Transaction tx;
+ Database db = odmg.newDatabase();
+ db.open(TestHelper.DEF_JCD_ALIAS, Database.OPEN_READ_WRITE);
+ db.close();
+ db = odmg.newDatabase();
+ db.open(TestHelper.DEF_JCD_ALIAS + "#" +
+ TestHelper.DEF_USER + "#" +
+ TestHelper.DEF_PASSWORD, Database.OPEN_READ_WRITE);
+ tx = odmg.newTransaction();
+ tx.begin();
+ OQLQuery query = odmg.newOQLQuery();
+ query.create(queryStr);
+ query.execute();
+ tx.commit();
+ db.close();
+
+ db = odmg.newDatabase();
+ db.open(TestHelper.DEF_JCD_ALIAS, Database.OPEN_READ_WRITE);
+ tx = odmg.newTransaction();
+ tx.begin();
+ OQLQuery query2 = odmg.newOQLQuery();
+ query2.create(queryStr);
+ query2.execute();
+ tx.commit();
+ db.close();
+ }
+
public void testTimeToCopyRepository()
{
DescriptorRepository dr = null;
@@ -223,7 +316,7 @@
it.next();
++descriptors;
}
- System.out.println("# Time to create a copy of "+ descriptors +" class-descriptors: " + period/loop + " ms #");
+ System.out.println("# Time to create a copy of " + descriptors + " class-descriptors: " + period / loop + " ms #");
}
public void testReadConnectionDescriptor()