/*
*
* Copyright 2014 McEvoy Software Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.milton.context;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FactoryCatalog {
private static final Logger log = LoggerFactory.getLogger(FactoryCatalog.class);
public Map<Class,Factory> factoriesByClass = new HashMap<Class,Factory>();
public Map<String,Factory> factoriesById = new HashMap<String,Factory>();
public List<Factory> factories = new ArrayList<Factory>();
public Map<String,String> keys = new HashMap<String,String>();
public File configFile;
public void setKeys(Map<String,String> mapOfKeys) {
for( Map.Entry<String,String> entry : mapOfKeys.entrySet()) {
addKey( entry.getKey(), entry.getValue());
}
}
public Map<String,String> getKeys() {
return keys;
}
public List<Factory> getFactories() {
return factories;
}
public void setFactories(List<Factory> list) {
for( Factory f : list ) {
addFactory( f );
}
}
public void setSingletons(List<Object> list) {
for( Object single : list ) {
SingletonFactory f = new SingletonFactory();
f.setBean( single );
addFactory( f );
}
}
public void addFactory(Factory factory) {
log.debug("addFactory: " + factory.getClass());
if( factory.keyClasses() != null ) {
for( Class c: factory.keyClasses() ) {
if( !factoriesByClass.containsKey(c) ) {
log.debug(" " + c.getCanonicalName());
factoriesByClass.put(c, factory);
}
}
}
if( factory.keyIds() != null ) {
for( String id: factory.keyIds() ) {
if( !factoriesById.containsKey(id) ) {
factoriesById.put(id, factory);
}
}
}
factories.add( factory );
}
public Factory get(Class c) throws IllegalArgumentException {
Factory factory = factoriesByClass.get(c);
if( factory == null ) {
log.warn("No factory found for: " + c.getCanonicalName());
for( Class cc : factoriesByClass.keySet() ) {
log.warn(" key: " + cc.getCanonicalName());
}
return null;
}
return factory;
}
public Factory get(String id) {
Factory factory = factoriesById.get(id);
if( factory == null ) return null;
return factory;
}
public void destroy() {
log.debug("destroy FactoryCatalog");
for( Factory f : factories ) {
log.debug("destroying " + f.getClass().getName() );
f.destroy();
}
}
public void addKey(String key, String value) {
keys.put(key,value);
}
public File getConfigFile() {
return configFile;
}
public void setConfigFile(File configFile) {
this.configFile = configFile;
}
}