/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* 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 org.picketlink.config.idm.resolver;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Mapper for resolvers. It's main purpose is to find correct resolver for type from XML configuration and map it to requested
* Java type
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class PropertyResolverMapper {
// PropertyResolverMapper is actually singleton
private static final PropertyResolverMapper INSTANCE = initInstance();
// Default resolver for all types, which are configured in XML as simple String
private final PropertyResolver<Object> DEFAULT_PRIMITIVE_RESOLVER = new BasicPropertyResolver.PropertyEditorDelegateResolver<Object>();
// Map from types to resolvers. Key is java type. Value is resolver
@SuppressWarnings("rawtypes")
private Map<Class<?>, PropertyResolver> propertyResolvers = new ConcurrentHashMap<Class<?>, PropertyResolver>();
public static PropertyResolverMapper getInstance() {
return INSTANCE;
}
private static PropertyResolverMapper initInstance() {
PropertyResolverMapper instance = new PropertyResolverMapper();
// Fill map with basic resolver types here. User can add his own resolvers
instance.addPropertyResolver(String.class, new BasicPropertyResolver.StringResolver());
instance.addPropertyResolver(Class.class, new BasicPropertyResolver.ClassResolver());
return instance;
}
private PropertyResolverMapper() {};
/**
* Adding resolvers for custom java types
*
* @param clazz expected class of type, which will be used as return type of resolver
* @param propertyResolver resolver to be added
* @param <V>
*/
public <V> void addPropertyResolver(Class<V> clazz, PropertyResolver<V> propertyResolver) {
propertyResolvers.put(clazz, propertyResolver);
}
@SuppressWarnings("unchecked")
public <V> V resolveProperty(Object configurationValue, Class<V> clazz) {
// Find resolver in mapping first
PropertyResolver<V> propertyResolver = propertyResolvers.get(clazz);
if (propertyResolver == null) {
// Default resolver for simple types
propertyResolver = (PropertyResolver<V>)DEFAULT_PRIMITIVE_RESOLVER;
}
// Use resolver to find correct property
return propertyResolver.resolveProperty(configurationValue, clazz);
}
}