/*
 * Copyright 2002,2004 The Apache Software Foundation.
 *
 * 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.apache.commons.jelly.tags.bean;

import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;

import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.jelly.JellyException;
import org.apache.commons.jelly.Tag;
import org.apache.commons.jelly.TagLibrary;
import org.apache.commons.jelly.impl.TagFactory;
import org.apache.commons.jelly.impl.TagScript;

import org.xml.sax.Attributes;

/** Describes the Taglib. This class could be generated by XDoclet
  *
  * @author Theo Niemeijer
  * @version $Revision: 1.7 $
  */
public class BeanTagLibrary extends TagLibrary {

    /** Synchronized map of tag names to bean classes */
    private Map beanTypes = new Hashtable();

    /** Synchronized map of tag names to invoke methods */
    private Map invokeMethods = new Hashtable();

    public BeanTagLibrary() {
        registerTagFactory(
            "beandef",
            new TagFactory() {
                public Tag createTag(String name, Attributes attributes) throws JellyException {
                    return new BeandefTag(BeanTagLibrary.this);
                }
            }
        );
    }

    /**
     * Allows tags to register new bean types
     */
    public void registerBean(String name, Class type) {
        beanTypes.put(name, type);
    }

    /**
     * Allows tags to register new bean types with an associated method
     */
    public void registerBean(String name, Class type, Method method) {
        registerBean(name, type);
        if (method != null) {
            invokeMethods.put(name, method);
        }
        else {
            invokeMethods.remove(name);
        }
    }

    /**
     * Allows tags to register new bean types with an associated method
     */
    public void registerBean(String name, Class type, String methodName) {
        Method method = MethodUtils.getAccessibleMethod(
            type, methodName, BeandefTag.EMPTY_ARGUMENT_TYPES
        );
        registerBean(name, type, method);
    }

    // TagLibrary interface
    //-------------------------------------------------------------------------
    public TagScript createTagScript(
        final String name, final Attributes attributes
    ) throws JellyException {

        // check for standard tags first
        TagScript answer = super.createTagScript(name, attributes);
        if (answer != null) {
            return answer;
        }

        // lets try a dynamic tag
        return new TagScript( createTagFactory(name, attributes) );
    }

    // Implementation methods
    //-------------------------------------------------------------------------

    /**
     * Factory method to create a TagFactory for a given tag attribute and attributes
     */
    protected TagFactory createTagFactory(String name, Attributes attributes) throws JellyException {

        return new TagFactory() {
            public Tag createTag(String name, Attributes attributes) throws JellyException {
                return createBeanTag(name, attributes);
            }
        };
    }

    protected Tag createBeanTag(String name, Attributes attributes) throws JellyException {
        // is the name bound to a specific class
        Class beanType = getBeanType(name, attributes);
        if (beanType != null) {
            Method invokeMethod = (Method) invokeMethods.get(name);
            return new BeanTag(beanType, name, invokeMethod);
        }

        // its a property tag
        return new BeanPropertyTag(name);
    }

    protected Class getBeanType(String name, Attributes attributes) {
        return (Class) beanTypes.get(name);
    }
}
