SoftwareComponent.java

package eu.javaexperience.software;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import eu.javaexperience.interfaces.ObjectWithProperty;
import eu.javaexperience.reflect.Mirror;

public class SoftwareComponent implements ObjectWithProperty
{
	protected static final SoftwareComponent SOFTWARE_COMPONENT_ROOT = new SoftwareComponent();
	
	public static SoftwareComponent getRoot()
	{
		return SOFTWARE_COMPONENT_ROOT;
	}
	
	protected final ConcurrentMap<String, Object> root = new ConcurrentHashMap<>();
	
	public Object getComponent(String key)
	{
		return root.get(key);
	}
	
	public void registerComponent(String key, Object object)
	{
		if(null != root.putIfAbsent(key, object))
		{
			throw new RuntimeException("Software component already registered: `"+key+"`");
		}
	}
	
	public void unregisterComponent(String key)
	{
		if(null == root.remove(key))
		{
			throw new RuntimeException("Software component doesn't exists: `"+key+"`");
		}
	}

	@Override
	public Object get(String key)
	{
		return root.get(key);
	}

	@Override
	public String[] keys()
	{
		return root.keySet().toArray(Mirror.emptyStringArray);
	}
}