[ 
https://issues.apache.org/jira/browse/ARIES-1282?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16346410#comment-16346410
 ] 

ASF subversion and git services commented on ARIES-1282:
--------------------------------------------------------

Commit 1822771 from [~gnt] in branch 'aries/trunk'
[ https://svn.apache.org/r1822771 ]

[ARIES-1282] BeanRecipe.findMatchingMethods is not able to filter out 
overridden method signatures

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