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