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()