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

Guillaume Nodet resolved ARIES-1282.
------------------------------------
       Resolution: Fixed
         Assignee: Guillaume Nodet
    Fix Version/s: blueprint-core-1.9.0

Committing to https://svn.apache.org/repos/asf/aries/trunk ...
        A       
blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/pojos/CachePojos.java
        A       blueprint/blueprint-core/src/test/resources/test-cache.xml
        M       
blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/generics/TypeInference.java
        M       
blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java
Committed r1822771


> BeanRecipe.findMatchingMethods is not able to filter out overridden method 
> signatures
> -------------------------------------------------------------------------------------
>
>                 Key: ARIES-1282
>                 URL: https://issues.apache.org/jira/browse/ARIES-1282
>             Project: Aries
>          Issue Type: Bug
>          Components: Blueprint
>    Affects Versions: blueprint-core-1.1.0, blueprint-core-1.4.2
>            Reporter: Niels Bertram
>            Assignee: Guillaume Nodet
>            Priority: Major
>             Fix For: blueprint-core-1.9.0
>
>
> I was trying to get an Infinispan cache object from an infinispan 
> CacheManager using the following blueprint configuration:
> {code:xml}
> <reference id="cacheManager" availability="mandatory" 
> interface="org.infinispan.manager.CacheContainer" />
> <bean id="queueCountCache" factory-ref="cacheManager" 
> factory-method="getCache">
>       <argument index="0" type="java.lang.String" value="QueueCountCache" />
> </bean>
> {code}
> Unfortunately the blueprint startup fails with following error:
> {code}
> org.osgi.service.blueprint.container.ComponentDefinitionException: Multiple 
> matching factory methods getCache found on class 
> Proxy36341b52_07db_4c05_bab0_40dbf8a3899a for arguments [QueueCountCache] 
> when instanciating bean queueCountCache: [public 
> org.infinispan.commons.api.BasicCache 
> Proxy36341b52_07db_4c05_bab0_40dbf8a3899a.getCache(java.lang.String), public 
> org.infinispan.Cache 
> Proxy36341b52_07db_4c05_bab0_40dbf8a3899a.getCache(java.lang.String)]
>         at 
> org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:305)[7:org.apache.aries.blueprint.core:1.4.0]
>         at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:806)[7:org.apache.aries.blueprint.core:1.4.0]
>         at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[7:org.apache.aries.blueprint.core:1.4.0]
>         ...
> {code}
> looking at the matches produced by the {{BeanRecipe.findMatchingMethods}} 
> makes it obvious that the {{CacheContainer}} implements an interface 
> {{BasicCacheContainer}}. The {{CacheContainer}} interface overrides the 
> getCache(java.lang.String) that is initially defined in the 
> {{BasicCacheContainer}} without any changes. I guess this was implemented for 
> some backward compatibility.
> {code}
> public org.infinispan.commons.api.BasicCache 
> Proxy6e18b006_c93d_4840_bb4d_3522802f6a68.getCache(java.lang.String)=[QueueCountCache]
> {code}
> and
> {code}
> public org.infinispan.Cache                  
> Proxy6e18b006_c93d_4840_bb4d_3522802f6a68.getCache(java.lang.String)=[QueueCountCache]
> {code}
> The {{BeanRecipe.findMatchingMethods}} probably also needs to check if the 
> method signatures found are overridden by another method in the matching 
> collection. If that is the case, all methods that are overridden also need to 
> be discharged.
> Here are the 2 offending interfaces that the {{BeanReceipe}} matches. 
> Unfortunately the CacheContainer getCache method is the one it should match 
> but +not+ the one from BasicCacheContainer.
> {code:title=CacheContainer.java|borderStyle=solid}
> package org.infinispan.manager;
> import org.infinispan.Cache;
> import org.infinispan.commons.api.BasicCache;
> import org.infinispan.commons.api.BasicCacheContainer;
> public interface CacheContainer extends BasicCacheContainer {
>    @Override
>    <K, V> Cache<K, V> getCache();
>    @Override
>    <K, V> Cache<K, V> getCache(String cacheName);
> }
> {code}
> {code:title=BasicCacheContainer.java|borderStyle=solid}
> package org.infinispan.commons.api;
> public interface BasicCacheContainer extends Lifecycle {
>  
>    <K, V> BasicCache<K, V> getCache();
>    <K, V> BasicCache<K, V> getCache(String cacheName);
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to