[New] Mapped components by name and store types by class as a MapOfLists
Now one can really have multiple components with the same API registered under different names
This commit is contained in:
parent
f3d5318a6f
commit
9abef500b6
|
@ -29,6 +29,7 @@ import li.strolch.runtime.configuration.StrolchConfigurationException;
|
||||||
import li.strolch.runtime.privilege.PrivilegeHandler;
|
import li.strolch.runtime.privilege.PrivilegeHandler;
|
||||||
import li.strolch.runtime.privilege.PrivilegedRunnable;
|
import li.strolch.runtime.privilege.PrivilegedRunnable;
|
||||||
import li.strolch.runtime.privilege.PrivilegedRunnableWithResult;
|
import li.strolch.runtime.privilege.PrivilegedRunnableWithResult;
|
||||||
|
import li.strolch.utils.collections.MapOfLists;
|
||||||
import li.strolch.utils.dbc.DBC;
|
import li.strolch.utils.dbc.DBC;
|
||||||
import li.strolch.utils.helper.SystemHelper;
|
import li.strolch.utils.helper.SystemHelper;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -51,7 +52,7 @@ public class ComponentContainerImpl implements ComponentContainer {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ComponentContainerImpl.class);
|
private static final Logger logger = LoggerFactory.getLogger(ComponentContainerImpl.class);
|
||||||
|
|
||||||
private final StrolchAgent agent;
|
private final StrolchAgent agent;
|
||||||
private Map<Class<?>, StrolchComponent> componentsByType;
|
private MapOfLists<Class<?>, StrolchComponent> componentsByType;
|
||||||
private Map<String, StrolchComponent> componentsByName;
|
private Map<String, StrolchComponent> componentsByName;
|
||||||
private Map<String, ComponentController> controllerMap;
|
private Map<String, ComponentController> controllerMap;
|
||||||
private ComponentDependencyAnalyzer dependencyAnalyzer;
|
private ComponentDependencyAnalyzer dependencyAnalyzer;
|
||||||
|
@ -87,26 +88,33 @@ public class ComponentContainerImpl implements ComponentContainer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasComponent(Class<?> clazz) {
|
public boolean hasComponent(Class<?> clazz) {
|
||||||
return this.componentsByType != null && this.componentsByType.containsKey(clazz);
|
return this.componentsByType != null && this.componentsByType.containsList(clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <T> T getComponent(Class<T> clazz) throws IllegalArgumentException {
|
public <T> T getComponent(Class<T> clazz) throws IllegalArgumentException {
|
||||||
T component = (T) this.componentsByType.get(clazz);
|
List<StrolchComponent> components = this.componentsByType.getList(clazz);
|
||||||
if (component == null) {
|
if (components == null || components.isEmpty()) {
|
||||||
String msg = "The component does not exist for class {0}";
|
String msg = "No component exists for class {0}";
|
||||||
msg = MessageFormat.format(msg, clazz.getName());
|
msg = MessageFormat.format(msg, clazz.getName());
|
||||||
throw new IllegalArgumentException(msg);
|
throw new IllegalArgumentException(msg);
|
||||||
}
|
}
|
||||||
return component;
|
if (components.size() > 1) {
|
||||||
|
String msg
|
||||||
|
= "Component clazz {0} is ambiguous as there are {1} components registered with this type! Get the component by name.";
|
||||||
|
msg = MessageFormat.format(msg, clazz.getName());
|
||||||
|
throw new IllegalArgumentException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T) components.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T extends StrolchComponent> T getComponentByName(String name) throws IllegalArgumentException {
|
public <T extends StrolchComponent> T getComponentByName(String name) throws IllegalArgumentException {
|
||||||
@SuppressWarnings("unchecked") T component = (T) this.componentsByName.get(name);
|
@SuppressWarnings("unchecked") T component = (T) this.componentsByName.get(name);
|
||||||
if (component == null) {
|
if (component == null) {
|
||||||
String msg = "The component {0} does not exist!";
|
String msg = "The component with name {0} does not exist!";
|
||||||
msg = MessageFormat.format(msg, name);
|
msg = MessageFormat.format(msg, name);
|
||||||
throw new IllegalArgumentException(msg);
|
throw new IllegalArgumentException(msg);
|
||||||
}
|
}
|
||||||
|
@ -187,7 +195,7 @@ public class ComponentContainerImpl implements ComponentContainer {
|
||||||
return getPrivilegeHandler().runAsAgentWithResult(runnable);
|
return getPrivilegeHandler().runAsAgentWithResult(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
private StrolchComponent setupComponent(Map<Class<?>, StrolchComponent> componentMap,
|
private StrolchComponent setupComponent(MapOfLists<Class<?>, StrolchComponent> componentMap,
|
||||||
Map<String, ComponentController> controllerMap, ComponentConfiguration componentConfiguration) {
|
Map<String, ComponentController> controllerMap, ComponentConfiguration componentConfiguration) {
|
||||||
|
|
||||||
String componentName = componentConfiguration.getName();
|
String componentName = componentConfiguration.getName();
|
||||||
|
@ -227,11 +235,7 @@ public class ComponentContainerImpl implements ComponentContainer {
|
||||||
StrolchComponent strolchComponent = constructor.newInstance(this, componentName);
|
StrolchComponent strolchComponent = constructor.newInstance(this, componentName);
|
||||||
strolchComponent.setup(componentConfiguration);
|
strolchComponent.setup(componentConfiguration);
|
||||||
|
|
||||||
StrolchComponent existing = componentMap.put(apiClass, strolchComponent);
|
componentMap.addElement(apiClass, strolchComponent);
|
||||||
if (existing != null)
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Overwrote component " + existing.getName() + " with " + strolchComponent.getName() +
|
|
||||||
" as they share the same API Class!");
|
|
||||||
controllerMap.put(componentName, new ComponentController(strolchComponent));
|
controllerMap.put(componentName, new ComponentController(strolchComponent));
|
||||||
|
|
||||||
return strolchComponent;
|
return strolchComponent;
|
||||||
|
@ -268,7 +272,7 @@ public class ComponentContainerImpl implements ComponentContainer {
|
||||||
System.getProperty("user.timezone")));
|
System.getProperty("user.timezone")));
|
||||||
|
|
||||||
// set up the container itself
|
// set up the container itself
|
||||||
Map<Class<?>, StrolchComponent> componentMap = new HashMap<>();
|
MapOfLists<Class<?>, StrolchComponent> componentMap = new MapOfLists<>();
|
||||||
Map<String, StrolchComponent> componentsByName = new HashMap<>();
|
Map<String, StrolchComponent> componentsByName = new HashMap<>();
|
||||||
Map<String, ComponentController> controllerMap = new HashMap<>();
|
Map<String, ComponentController> controllerMap = new HashMap<>();
|
||||||
Set<String> componentNames = strolchConfiguration.getComponentNames();
|
Set<String> componentNames = strolchConfiguration.getComponentNames();
|
||||||
|
|
Loading…
Reference in New Issue