    001// Licensed under the Apache License, Version 2.0 (the "License");
    002// you may not use this file except in compliance with the License.
    003// You may obtain a copy of the License at
    004//
    005// http://www.apache.org/licenses/LICENSE-2.0
    006//
    007// Unless required by applicable law or agreed to in writing, software
    008// distributed under the License is distributed on an "AS IS" BASIS,
    009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    010// See the License for the specific language governing permissions and
    011// limitations under the License.
    012
    013package org.apache.tapestry5.internal;
    014
    015import org.apache.tapestry5.services.ComponentOverride;
    016import org.slf4j.Logger;
    017
    018import java.util.*;
    019
    020public class ComponentOverrideImpl implements ComponentOverride
    021{
    022
    023    private final Map<String, Class> nameToClass;
    024
    025    @SuppressWarnings("rawtypes")
    026    public ComponentOverrideImpl(Map<Class, Class> contributions, Logger logger)
    027    {
    028
    029        Map<Class, Class> replacements = Collections.unmodifiableMap(contributions);
    030        Map<String, Class> nameToClass = new HashMap<String, Class>();
    031
    032        int maxLength = 0;
    033
    034        for (Class<?> clazz : contributions.keySet())
    035        {
    036
    037            final String name = clazz.getName();
    038            if (name.length() > maxLength)
    039            {
    040                maxLength = name.length();
    041            }
    042            nameToClass.put(name, contributions.get(clazz));
    043
    044        }
    045
    046        this.nameToClass = Collections.unmodifiableMap(nameToClass);
    047
    048        if (replacements.size() > 0 && logger.isInfoEnabled())
    049        {
    050            StringBuilder builder = new StringBuilder(1000);
    051            final String format = "%" + maxLength + "s: %s\n";
    052            builder.append("Component replacements (including components, pages and mixins):\n");
    053            List<String> names = new ArrayList<String>(nameToClass.keySet());
    054            Collections.sort(names);
    055
    056            for (String name : names)
    057            {
    058                builder.append(String.format(format, name, nameToClass.get(name).getName()));
    059            }
    060
    061            logger.info(builder.toString());
    062        }
    063
    064    }
    065
    066    @Override
    067    public boolean hasReplacements()
    068    {
    069        return !nameToClass.isEmpty();
    070    }
    071
    072    @Override
    073    public Class getReplacement(String className)
    074    {
    075        return nameToClass.get(className);
    076    }
    077
    078}