001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel.impl;
018
019import java.util.HashMap;
020import java.util.HashSet;
021import java.util.Map;
022import java.util.Set;
023
024import org.apache.camel.NoSuchBeanException;
025import org.apache.camel.spi.Registry;
026
027/**
028 * A {@link Map}-based registry.
029 */
030public class SimpleRegistry extends HashMap<String, Object> implements Registry {
031
032    private static final long serialVersionUID = -3739035212761568984L;
033
034    public Object lookupByName(String name) {
035        return get(name);
036    }
037
038    public <T> T lookupByNameAndType(String name, Class<T> type) {
039        Object answer = lookupByName(name);
040
041        // just to be safe
042        if (answer == null) {
043            return null;
044        }
045
046        try {
047            return type.cast(answer);
048        } catch (Throwable e) {
049            String msg = "Found bean: " + name + " in SimpleRegistry: " + this
050                    + " of type: " + answer.getClass().getName() + " expected type was: " + type;
051            throw new NoSuchBeanException(name, msg, e);
052        }
053    }
054
055    public <T> Map<String, T> findByTypeWithName(Class<T> type) {
056        Map<String, T> result = new HashMap<String, T>();
057        for (Map.Entry<String, Object> entry : entrySet()) {
058            if (type.isInstance(entry.getValue())) {
059                result.put(entry.getKey(), type.cast(entry.getValue()));
060            }
061        }
062        return result;
063    }
064
065    public <T> Set<T> findByType(Class<T> type) {
066        Set<T> result = new HashSet<T>();
067        for (Map.Entry<String, Object> entry : entrySet()) {
068            if (type.isInstance(entry.getValue())) {
069                result.add(type.cast(entry.getValue()));
070            }
071        }
072        return result;
073    }
074
075    public Object lookup(String name) {
076        return lookupByName(name);
077    }
078
079    public <T> T lookup(String name, Class<T> type) {
080        return lookupByNameAndType(name, type);
081    }
082
083    public <T> Map<String, T> lookupByType(Class<T> type) {
084        return findByTypeWithName(type);
085    }
086}