diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index fbbee50b578..22918ab3ce8 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; diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index 07c9aeef873..ea671643a0d 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -58,6 +58,14 @@ + + - + + + + + diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index ee5971f51c7..8b458955b1b 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); diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 6753b280961..35aa8843ea8 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); diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java index 442cb911aa0..116f6114c03 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 { diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index 072d23788d8..58f428b7795 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); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 5b8109ff6db..68ddbc0b89f 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); diff --git a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java index d4f44541c85..73015c11464 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); diff --git a/server/src/com/cloud/server/ManagementServerExtImpl.java b/server/src/com/cloud/server/ManagementServerExtImpl.java index 5ab6d037d3c..5ec75f193fb 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; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 33153c361c1..95d96d09cc2 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 managers = ComponentContext.getApplicationContext().getBeansOfType( - Manager.class); - - Map params = new HashMap(); - 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 managers = ComponentContext.getApplicationContext().getBeansOfType( + Manager.class); + + Map params = new HashMap(); + 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 adapters = ComponentContext.getApplicationContext().getBeansOfType( - Adapter.class); - - Map params = new HashMap(); - for (Adapter adapter : adapters.values()) { - try { - if (!ComponentContext.isPrimary(adapter, Adapter.class)) - continue; - - if (!adapter.configure(adapter.getClass().getSimpleName(), params)) { + @SuppressWarnings("rawtypes") + Map adapters = ComponentContext.getApplicationContext().getBeansOfType( + Adapter.class); + + Map params = new HashMap(); + 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()) { diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 6afcf32d6ab..8638cf40932 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, SystemVmLoadScanHandler, ResourceStateAdapter { private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class); diff --git a/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java b/server/src/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java index 96c7446f8fd..dc51eab4fc7 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 { diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 2897a63afed..0b1e2da27da 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); diff --git a/utils/src/com/cloud/utils/component/ComponentContext.java b/utils/src/com/cloud/utils/component/ComponentContext.java index ce464232417..ab049ee1a83 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 matchedTypes = getComponentsOfType(beanType); if(matchedTypes.size() > 0) { for(Map.Entry 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 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 Map getComponentsOfType(Class beanType) { @@ -84,13 +90,13 @@ public class ComponentContext implements ApplicationContextAware { } public static boolean isPrimary(Object instance, Class 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 matchedTypes = (Map)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; }