All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.picketlink.config.idm.resolver.PropertyResolverMapper Maven / Gradle / Ivy

There is a newer version: 3.0.0.Beta2
Show newest version
/*
 * 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 Marek Posolda
 */
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 DEFAULT_PRIMITIVE_RESOLVER = new BasicPropertyResolver.PropertyEditorDelegateResolver();

    // Map from types to resolvers. Key is java type. Value is resolver
    @SuppressWarnings("rawtypes")
    private Map, PropertyResolver> propertyResolvers = new ConcurrentHashMap, 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 
     */
    public  void addPropertyResolver(Class clazz, PropertyResolver propertyResolver) {
        propertyResolvers.put(clazz, propertyResolver);
    }

    @SuppressWarnings("unchecked")
    public  V resolveProperty(Object configurationValue, Class clazz) {
        // Find resolver in mapping first
        PropertyResolver propertyResolver = propertyResolvers.get(clazz);

        if (propertyResolver == null) {
            // Default resolver for simple types
            propertyResolver = (PropertyResolver)DEFAULT_PRIMITIVE_RESOLVER;
        }

        // Use resolver to find correct property
        return propertyResolver.resolveProperty(configurationValue, clazz);
    }
}