Seperate configurable components out and let them be loaded from Spring 
configuration file


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/cf5d935d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/cf5d935d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/cf5d935d

Branch: refs/heads/javelin
Commit: cf5d935d81eda3283f65a8dc55b4d177834e058d
Parents: ad2cd77
Author: Kelven Yang <[email protected]>
Authored: Wed Jan 9 14:34:43 2013 -0800
Committer: Kelven Yang <[email protected]>
Committed: Wed Jan 9 14:39:16 2013 -0800

----------------------------------------------------------------------
 api/src/org/apache/cloudstack/api/BaseCmd.java     |   14 ++++
 client/tomcatconf/applicationContext.xml.in        |   10 +++-
 .../com/cloud/agent/manager/AgentManagerImpl.java  |    1 -
 .../agent/manager/ClusteredAgentManagerImpl.java   |    2 -
 .../cloud/ha/HighAvailabilityManagerExtImpl.java   |    7 --
 .../com/cloud/ha/HighAvailabilityManagerImpl.java  |    5 --
 .../src/com/cloud/network/NetworkManagerImpl.java  |    2 -
 .../PremiumSecondaryStorageManagerImpl.java        |    2 -
 .../com/cloud/server/ManagementServerExtImpl.java  |    5 --
 .../src/com/cloud/server/ManagementServerImpl.java |   47 +++++++--------
 .../secondary/SecondaryStorageManagerImpl.java     |    5 --
 .../vm/ClusteredVirtualMachineManagerImpl.java     |    5 --
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |    1 -
 .../cloud/utils/component/ComponentContext.java    |   26 ++++++--
 14 files changed, 63 insertions(+), 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/api/src/org/apache/cloudstack/api/BaseCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java 
b/api/src/org/apache/cloudstack/api/BaseCmd.java
index fbbee50..22918ab 100644
--- a/api/src/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
@@ -165,6 +165,7 @@ public abstract class BaseCmd {
         _autoScaleService = locator.getManager(AutoScaleService.class);
         _ravService = locator.getManager(RemoteAccessVpnService.class);
         _responseGenerator = generator;
+<<<<<<< HEAD
         _bareMetalVmService = locator.getManager(BareMetalVmService.class);
         _projectService = locator.getManager(ProjectService.class);
         _firewallService = locator.getManager(FirewallService.class);
@@ -177,6 +178,19 @@ public abstract class BaseCmd {
         _networkACLService = locator.getManager(NetworkACLService.class);
         _s2sVpnService = locator.getManager(Site2SiteVpnService.class);
         _queryService = locator.getManager(QueryService.class);
+=======
+        //_bareMetalVmService = 
ComponentContext.getCompanent(BareMetalVmService.class);
+        _projectService = ComponentContext.getCompanent(ProjectService.class);
+        _firewallService = 
ComponentContext.getCompanent(FirewallService.class);
+        _domainService = ComponentContext.getCompanent(DomainService.class);
+        _resourceLimitService = 
ComponentContext.getCompanent(ResourceLimitService.class);
+        _identityService = 
ComponentContext.getCompanent(IdentityService.class);
+        _storageNetworkService = 
ComponentContext.getCompanent(StorageNetworkService.class);
+        _taggedResourceService = 
ComponentContext.getCompanent(TaggedResourceService.class);
+        _vpcService = ComponentContext.getCompanent(VpcService.class);
+        _networkACLService = 
ComponentContext.getCompanent(NetworkACLService.class);
+        _s2sVpnService = 
ComponentContext.getCompanent(Site2SiteVpnService.class);
+>>>>>>> Seperate configurable components out and let them be loaded from 
Spring configuration file
     }
 
     public abstract void execute() throws ResourceUnavailableException, 
InsufficientCapacityException, ServerApiException, 
ConcurrentOperationException, ResourceAllocationException, 
NetworkRuleConflictException;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/client/tomcatconf/applicationContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/applicationContext.xml.in 
b/client/tomcatconf/applicationContext.xml.in
index 07c9aee..ea67164 100644
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@ -58,6 +58,14 @@
 
   <bean id="eventBus" class = 
"org.apache.cloudstack.framework.eventbus.EventBusBase" />
 
+  <!--
+    Configurable components
+  -->
+  <bean id="ManagementServerExtImpl" class 
="com.cloud.server.ManagementServerExtImpl" />
   <bean id="userVmManager" class ="com.cloud.vm.UserVmManagerImpl" />
-
+  <bean id="ClusteredAgentManagerImpl" class 
="com.cloud.agent.manager.ClusteredAgentManagerImpl" />
+  <bean id="ClusteredVirtualMachineManagerImpl" class 
="com.cloud.vm.ClusteredVirtualMachineManagerImpl" />
+  <bean id="NetworkManagerImpl" class ="com.cloud.network.NetworkManagerImpl" 
/>
+  <bean id="SecondaryStorageManagerImpl" class 
="com.cloud.storage.secondary.SecondaryStorageManagerImpl" />
+  <bean id="HighAvailabilityManagerExtImpl" class 
="com.cloud.ha.HighAvailabilityManagerExtImpl" />
 </beans>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/agent/manager/AgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java 
b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
index ee5971f..8b45895 100755
--- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -139,7 +139,6 @@ import edu.emory.mathcs.backport.java.util.Collections;
  *         ping.interval before announcing an agent has timed out | float | 
2.0x || || router.stats.interval | interval to
  *         report router statistics | seconds | 300s || * }
  **/
-@Component
 @Local(value = { AgentManager.class })
 public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager 
{
     private static final Logger s_logger = 
Logger.getLogger(AgentManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java 
b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
index 6753b28..35aa884 100755
--- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
@@ -91,8 +91,6 @@ import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.nio.Link;
 import com.cloud.utils.nio.Task;
 
-@Component
-@Primary
 @Local(value = { AgentManager.class, ClusteredAgentRebalanceService.class })
 public class ClusteredAgentManagerImpl extends AgentManagerImpl implements 
ClusterManagerListener, ClusteredAgentRebalanceService {
     final static Logger s_logger = 
Logger.getLogger(ClusteredAgentManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java 
b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
index 442cb91..116f611 100644
--- a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
@@ -24,18 +24,11 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
 import com.cloud.alert.AlertManager;
 import com.cloud.configuration.dao.ConfigurationDao;
-import com.cloud.server.ManagementServer;
 import com.cloud.usage.dao.UsageJobDao;
-import com.cloud.utils.component.ComponentLocator;
 import com.cloud.utils.db.Transaction;
 
-@Component
-@Primary
 @Local(value={HighAvailabilityManager.class})
 public class HighAvailabilityManagerExtImpl extends 
HighAvailabilityManagerImpl {
        

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java 
b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 072d237..58f428b 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -18,7 +18,6 @@ package com.cloud.ha;
 
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,7 +31,6 @@ import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.apache.log4j.NDC;
-import org.springframework.stereotype.Component;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.alert.AlertManager;
@@ -66,8 +64,6 @@ import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.user.AccountManager;
 import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.component.Adapters;
-import com.cloud.utils.component.ComponentLocator;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VMInstanceVO;
@@ -99,7 +95,6 @@ import com.cloud.vm.dao.VMInstanceDao;
  *         ha.retry.wait | time to wait before retrying the work item | 
seconds | 120 || || stop.retry.wait | time to wait
  *         before retrying the stop | seconds | 120 || * }
  **/
-@Component
 @Local(value = { HighAvailabilityManager.class })
 public class HighAvailabilityManagerImpl implements HighAvailabilityManager, 
ClusterManagerListener {
     protected static final Logger s_logger = 
Logger.getLogger(HighAvailabilityManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java 
b/server/src/com/cloud/network/NetworkManagerImpl.java
index 5b8109f..68ddbc0 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -46,7 +46,6 @@ import 
org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementors
 import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
 import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
 import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
@@ -174,7 +173,6 @@ import java.util.*;
 /**
  * NetworkManagerImpl implements NetworkManager.
  */
-@Component
 @Local(value = { NetworkManager.class, NetworkService.class })
 public class NetworkManagerImpl implements NetworkManager, NetworkService, 
Manager, Listener {
     private static final Logger s_logger = 
Logger.getLogger(NetworkManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java 
b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java
index d4f4454..73015c1 100755
--- a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java
+++ b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java
@@ -49,8 +49,6 @@ import com.cloud.vm.SystemVmLoadScanner.AfterScanAction;
 import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.dao.SecondaryStorageVmDao;
 
-@Component
-@Primary
 @Local(value = { SecondaryStorageVmManager.class })
 public class PremiumSecondaryStorageManagerImpl extends 
SecondaryStorageManagerImpl {
     private static final Logger s_logger = 
Logger.getLogger(PremiumSecondaryStorageManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/server/ManagementServerExtImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerExtImpl.java 
b/server/src/com/cloud/server/ManagementServerExtImpl.java
index 5ab6d03..5ec75f1 100644
--- a/server/src/com/cloud/server/ManagementServerExtImpl.java
+++ b/server/src/com/cloud/server/ManagementServerExtImpl.java
@@ -26,9 +26,6 @@ import java.util.TimeZone;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
 import com.cloud.api.commands.GenerateUsageRecordsCmd;
 import com.cloud.api.commands.GetUsageRecordsCmd;
 import com.cloud.domain.dao.DomainDao;
@@ -49,8 +46,6 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
 
-@Component
-@Primary
 public class ManagementServerExtImpl extends ManagementServerImpl implements 
ManagementServerExt {
     @Inject private AccountDao _accountDao;
     @Inject private DomainDao _domainDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java 
b/server/src/com/cloud/server/ManagementServerImpl.java
index 33153c3..95d96d0 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -266,7 +266,6 @@ import com.cloud.vm.dao.VMInstanceDao;
 import edu.emory.mathcs.backport.java.util.Arrays;
 import edu.emory.mathcs.backport.java.util.Collections;
 
-@Component
 public class ManagementServerImpl implements ManagementServer {
     public static final Logger s_logger = 
Logger.getLogger(ManagementServerImpl.class.getName());
 
@@ -463,20 +462,15 @@ public class ManagementServerImpl implements 
ManagementServer {
     }
 
     private void startManagers() {
-        @SuppressWarnings("rawtypes")
-        Map<String, Manager> managers = 
ComponentContext.getApplicationContext().getBeansOfType(
-                Manager.class);
-
-        Map<String, Object> params = new HashMap<String, Object>();
-        for (Manager manager : managers.values()) {
-            s_logger.info("Start manager: " + 
ComponentContext.getTargetClass(manager).getName() + "...");
-            try {
-                if (!ComponentContext.isPrimary(manager, Manager.class)) {
-                    s_logger.error("Skip manager:" + 
ComponentContext.getTargetClass(manager).getName() + " as there are multiple 
matches");
-                    continue;
-                }
-
-                if (!manager.configure(manager.getClass().getSimpleName(), 
params)) {
+               @SuppressWarnings("rawtypes")
+               Map<String, Manager> managers = 
ComponentContext.getApplicationContext().getBeansOfType(
+                               Manager.class);
+                       
+               Map<String, Object> params = new HashMap<String, Object>();
+               for(Manager manager : managers.values()) {
+                       s_logger.info("Start manager: " + 
ComponentContext.getTargetClass(manager).getName() + "...");
+                       try {
+                               
if(!manager.configure(manager.getClass().getSimpleName(), params)) {
                     throw new CloudRuntimeException("Failed to start manager: 
" + ComponentContext.getTargetClass(manager).getName());
                 }
 
@@ -495,17 +489,18 @@ public class ManagementServerImpl implements 
ManagementServer {
     }
 
     private void startAdapters() {
-        @SuppressWarnings("rawtypes")
-        Map<String, Adapter> adapters = 
ComponentContext.getApplicationContext().getBeansOfType(
-                Adapter.class);
-
-        Map<String, Object> params = new HashMap<String, Object>();
-        for (Adapter adapter : adapters.values()) {
-            try {
-                if (!ComponentContext.isPrimary(adapter, Adapter.class))
-                    continue;
-
-                if (!adapter.configure(adapter.getClass().getSimpleName(), 
params)) {
+               @SuppressWarnings("rawtypes")
+               Map<String, Adapter> adapters = 
ComponentContext.getApplicationContext().getBeansOfType(
+                               Adapter.class);
+                       
+               Map<String, Object> params = new HashMap<String, Object>();
+               for(Adapter adapter : adapters.values()) {
+                       try {
+                               // we also skip Adapter class that is both a 
manager class and a adapter class
+                               
if(Manager.class.isAssignableFrom(ComponentContext.getTargetClass(adapter)))
+                                       continue;
+                               
+                               
if(!adapter.configure(adapter.getClass().getSimpleName(), params)) {
                     throw new CloudRuntimeException("Failed to start adapter: 
" + ComponentContext.getTargetClass(adapter).getName());
                 }
                 if (!adapter.start()) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java 
b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
index 6afcf32..8638cf4 100755
--- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
+++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
@@ -21,7 +21,6 @@ import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,7 +30,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
@@ -112,8 +110,6 @@ import com.cloud.user.UserContext;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.Adapters;
-import com.cloud.utils.component.ComponentLocator;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.SearchCriteria2;
@@ -157,7 +153,6 @@ import com.cloud.vm.dao.VMInstanceDao;
 // Starting, HA, Migrating, Creating and Running state are all counted as 
"Open" for available capacity calculation
 // because sooner or later, it will be driven into Running state
 //
-@Component
 @Local(value = { SecondaryStorageVmManager.class })
 public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, 
VirtualMachineGuru<SecondaryStorageVmVO>, SystemVmLoadScanHandler<Long>, 
ResourceStateAdapter {
     private static final Logger s_logger = 
Logger.getLogger(SecondaryStorageManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java 
b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
index 96c7446..dc51eab 100644
--- a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
@@ -22,14 +22,9 @@ import java.util.Map;
 import javax.ejb.Local;
 import javax.naming.ConfigurationException;
 
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
 import com.cloud.cluster.ClusterManagerListener;
 import com.cloud.cluster.ManagementServerHostVO;
 
-@Component
-@Primary
 @Local(value=VirtualMachineManager.class)
 public class ClusteredVirtualMachineManagerImpl extends 
VirtualMachineManagerImpl implements ClusterManagerListener {
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java 
b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 2897a63..0b1e2da 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -158,7 +158,6 @@ import com.cloud.vm.dao.SecondaryStorageVmDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
-@Component
 @Local(value = VirtualMachineManager.class)
 public class VirtualMachineManagerImpl implements VirtualMachineManager, 
Listener {
     private static final Logger s_logger = 
Logger.getLogger(VirtualMachineManagerImpl.class);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cf5d935d/utils/src/com/cloud/utils/component/ComponentContext.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java 
b/utils/src/com/cloud/utils/component/ComponentContext.java
index ce46423..ab049ee 100644
--- a/utils/src/com/cloud/utils/component/ComponentContext.java
+++ b/utils/src/com/cloud/utils/component/ComponentContext.java
@@ -67,16 +67,22 @@ public class ComponentContext implements 
ApplicationContextAware {
                Map<String, T> matchedTypes = getComponentsOfType(beanType);
                if(matchedTypes.size() > 0) {
                        for(Map.Entry<String, T> entry : 
matchedTypes.entrySet()) {
-                               Primary primary = 
getTargetClass(entry).getAnnotation(Primary.class);
+                               Primary primary = 
getTargetClass(entry.getValue()).getAnnotation(Primary.class);
                                if(primary != null)
                                        return entry.getValue();
                        }
                        
-                       s_logger.warn("Unable to uniquely locate bean type " + 
beanType.getName());
+                       if(matchedTypes.size() > 1) {
+                               s_logger.warn("Unable to uniquely locate bean 
type " + beanType.getName());
+                               for(Map.Entry<String, T> entry : 
matchedTypes.entrySet()) {
+                                       s_logger.warn("Candidate " + 
getTargetClass(entry.getValue()).getName());
+                               }
+                       }
+                       
                        return (T)matchedTypes.values().toArray()[0];
                }
        }
-       throw new NoSuchBeanDefinitionException("Unable to resolve bean type " 
+ beanType.getName());
+       throw new NoSuchBeanDefinitionException(beanType.getName());
     }
     
     public static <T> Map<String, T> getComponentsOfType(Class<T> beanType) {
@@ -84,13 +90,13 @@ public class ComponentContext implements 
ApplicationContextAware {
     }
     
     public static <T> boolean isPrimary(Object instance, Class<T> beanType) {
-       
        // we assume single line of interface inheritance of beanType
        Class<?> componentType = beanType;
        Class<?> targetClass = getTargetClass(instance);
+       
        Class<?> interfaces[] = targetClass.getInterfaces();
        for(Class<?> intf : interfaces)  {
-               if(beanType.isAssignableFrom(intf)) {
+               if(beanType.isAssignableFrom(intf) && intf != beanType) {
                        componentType = intf;
                        break;
                }
@@ -99,9 +105,15 @@ public class ComponentContext implements 
ApplicationContextAware {
                Map<String, T> matchedTypes = (Map<String, 
T>)ComponentContext.getComponentsOfType(componentType);
                if(matchedTypes.size() > 1) {
                        Primary primary = 
targetClass.getAnnotation(Primary.class);
-                       if(primary != null)
+                       if(primary != null) {
+               s_logger.info(targetClass.getName() + " is the primary 
component of " + componentType.getName());
                                return true;
-                       
+                       }
+               
+                       s_logger.warn(targetClass.getName() + " is not the 
primary component of " + componentType.getName() + ", there are other 
candidates");
+                       for(T candidate : matchedTypes.values()) {
+                               s_logger.warn("Candidate " + 
getTargetClass(candidate).getName());
+                       }
                        return false;
        }
        

Reply via email to