/*
* Copyright 2007-2010 Sun Microsystems, Inc.
*
* This file is part of Project Darkstar Server.
*
* Project Darkstar Server is free software: you can redistribute it
* and/or modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation and
* distributed hereunder to you.
*
* Project Darkstar Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*/
package com.sun.sgs.impl.kernel;
import com.sun.sgs.kernel.ComponentRegistry;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.MissingResourceException;
/**
* This is a simple implementation of <code>ComponentRegistry</code> used
* to startup and configure the system and individual applications. It
* can have any objects added to it, but components cannot be removed. This
* implementation is not thread-safe.
*/
class ComponentRegistryImpl implements ComponentRegistry {
// the set of components
private LinkedHashSet<Object> componentSet;
/**
* Creates an empty instance of <code>ComponentRegistryImpl</code>.
*/
ComponentRegistryImpl() {
componentSet = new LinkedHashSet<Object>();
}
/**
* {@inheritDoc}
*/
public <T> T getComponent(Class<T> type) {
Object matchingComponent = null;
// iterate through the available components
for (Object component : componentSet) {
// see if provided type matches the component
if (type.isAssignableFrom(component.getClass())) {
// if this isn't the first match, it's an error
if (matchingComponent != null) {
throw new MissingResourceException("More than one " +
"matching component",
type.getName(), null);
}
matchingComponent = component;
}
}
// if no matches were found, it's an error
if (matchingComponent == null) {
throw new MissingResourceException("No matching components",
type.getName(), null);
}
return type.cast(matchingComponent);
}
/**
* Adds a component to the set of available components.
*
* @param component the component to add to the registry
*/
void addComponent(Object component) {
componentSet.add(component);
}
/**
* {@inheritDoc}
*/
public Iterator<Object> iterator() {
return Collections.unmodifiableSet(componentSet).iterator();
}
}