/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/* $Id$ */

package org.apache.fop.render;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;

/**
 * Configurator for XMLHandler objects.
 */
public class XMLHandlerConfigurator extends AbstractRendererConfigurator {

    /** logger instance */
    protected static Log log = LogFactory.getLog(XMLHandlerConfigurator.class);

    /**
     * Default constructor
     * @param userAgent the user agent
     */
    public XMLHandlerConfigurator(FOUserAgent userAgent) {
        super(userAgent);
    }

    /**
     * Returns the configuration subtree for a specific renderer.
     * @param cfg the renderer configuration
     * @param namespace the namespace (i.e. the XMLHandler) for which the configuration should
     *                  be returned
     * @return the requested configuration subtree, null if there's no configuration
     */
    private Configuration getHandlerConfig(Configuration cfg, String namespace) {
        if (cfg == null || namespace == null) {
            return null;
        }
        Configuration handlerConfig = null;

        Configuration[] children = cfg.getChildren("xml-handler");
        for (int i = 0; i < children.length; ++i) {
            try {
                if (children[i].getAttribute("namespace").equals(namespace)) {
                    handlerConfig = children[i];
                    break;
                }
            } catch (ConfigurationException e) {
                // silently pass over configurations without namespace
            }
        }
        if (log.isDebugEnabled()) {
            log.debug((handlerConfig == null ? "No" : "")
                    + "XML handler configuration found for namespace " + namespace);
        }
        return handlerConfig;
    }

    /**
     * Configures renderer context by setting the handler configuration on it.
     * @param context the RendererContext (contains the user agent)
     * @param ns the Namespace of the foreign object
     * @throws FOPException if configuring the target objects fails
     */
    public void configure(RendererContext context, String ns) throws FOPException {
        //Optional XML handler configuration
        Configuration cfg = getRendererConfig(context.getRenderer());
        if (cfg != null) {
            cfg = getHandlerConfig(cfg, ns);
            if (cfg != null) {
                context.setProperty(RendererContextConstants.HANDLER_CONFIGURATION, cfg);
            }
        }
    }
}
