[ 
https://issues.apache.org/jira/browse/OPENJPA-1506?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Albert Lee resolved OPENJPA-1506.
---------------------------------

       Resolution: Fixed
    Fix Version/s: 2.0.0-beta2

> ConfigurationImpl.equals fails using a OpenJPA derived provider
> ---------------------------------------------------------------
>
>                 Key: OPENJPA-1506
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1506
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: lib
>    Affects Versions: 2.0.0, 2.0.1
>            Reporter: Albert Lee
>            Assignee: Albert Lee
>            Priority: Minor
>             Fix For: 2.0.0, 2.0.0-beta2
>
>
> TestDynamicConfiguration.testConfigurationIsEqualByValueAndHashCode failed 
> with configuration object equality
> using a OpenJPA derived provider.
>     public void testConfigurationIsEqualByValueAndHashCode() {
>               OpenJPAEntityManagerFactorySPI emf1 = createEMF(FRESH_EMF);
>               assertNotNull(emf1);
>               OpenJPAConfiguration conf1 = emf1.getConfiguration();
>               
>               OpenJPAEntityManagerFactorySPI emf2 = createEMF(FRESH_EMF);
>               assertNotNull(emf2);
>               OpenJPAConfiguration conf2 = emf2.getConfiguration();
>               
>               assertFalse(emf1==emf2);
>               assertFalse(emf1.equals(emf2));
>               assertFalse(conf1==conf2);
>               assertEquals(conf1, conf2);     <<<< faild here
>               assertEquals(conf1.hashCode(), conf2.hashCode());
>               assertEquals(conf1.toProperties(false), 
> conf2.toProperties(false));
>       }
> The problem is in the equals() method of ConfigurationImpl:
>     public boolean equals(Object other) {
>       .....
>         for(Value v : _vals) {
>             Value thatV = conf.getValue(propName);
>                   if (!v.equals(thatV)) {
>               return false;
>             }
>         }
>         return true;
>     }
> getValue search backward based on the property name as in:
>     public Value getValue(String property) {
>         if (property == null)
>             return null;
>         // search backwards so that custom values added after construction
>         // are found quickly, since this will be the std way of accessing them
>         for (int i = _vals.size()-1; i >= 0; i--) { 
>             if (_vals.get(i).matches(property))
>                 return _vals.get(i);
>         }
>         return null;
>     }
> In the case of a dervied provider, it adds new EntityManagerFactoryValue to 
> the end of the property list, which in theory override
> the one defined by the openjpa provider.
> However the equals method iterate the "current" configuration _vals list from 
> the top but match the "other" configuration _vals
> list found from the bottom, so even both configuration objects are exactly 
> the same, the equals will fail.
> In the case of a single openjpa provider, this problem is NOT surfaced.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to