org.jspringbot.spring.KeywordUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.jspringbot.spring.KeywordUtils.java

Source

/*
 * Copyright (c) 2012. JSpringBot. All Rights Reserved.
 *
 * See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The JSpringBot 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.
 */

package org.jspringbot.spring;

import org.apache.commons.io.IOUtils;
import org.jspringbot.Keyword;
import org.jspringbot.KeywordInfo;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceEditor;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * Utility class for robot keyword metadata retrieval.
 */
public class KeywordUtils {

    /**
     * Default argument descriptor for all keywords not annotated with KeywordInfo.
     * Or for annotated ones that did not specify parameter descriptor.
     */
    public static final String[] DEFAULT_PARAMS = { "None" };

    /**
     * Private constructor to disable creation of KeywordUtils objects.
     */
    private KeywordUtils() {
        // Disable creation of new instance.
    }

    /**
     * Builds mapping of robot keywords to actual bean names in spring context.
     *
     * @param context Spring application context.
     * @return mapping of robot keywords to bean names
     */
    public static Map<String, String> getKeywordMap(ApplicationContext context) {
        Map<String, String> keywordToBeanMap = new HashMap<String, String>();

        // Retrieve beans implementing the Keyword interface.
        String[] beanNames = context.getBeanNamesForType(Keyword.class);

        for (String beanName : beanNames) {
            Object bean = context.getBean(beanName);

            // Retrieve keyword information
            KeywordInfo keywordInfo = AnnotationUtils.findAnnotation(bean.getClass(), KeywordInfo.class);

            // Set keyword name as specified in the keyword info, or if information is not available, use bean name.
            String keywordName = keywordInfo != null ? keywordInfo.name() : beanName;

            if (keywordToBeanMap.put(keywordName, beanName) != null) {
                // If map already contains the keyword name, throw an exception. Keywords should be unique.
                throw new RuntimeException("Multiple definitions for keyword '" + keywordName + "' exists.");
            }
        }

        return keywordToBeanMap;
    }

    /**
     * Retrieves the given keyword's description.
     *
     * @param keyword keyword name
     * @param context Spring application context
     * @param beanMap keyword name to bean name mapping
     * @return the documentation string of the given keyword, or empty string if unavailable.
     */
    public static String getDescription(String keyword, ApplicationContext context, Map<String, String> beanMap) {
        KeywordInfo keywordInfo = getKeywordInfo(keyword, context, beanMap);

        if (keywordInfo == null) {
            return "";
        }

        String desc = keywordInfo.description();

        if (desc.startsWith("classpath:")) {
            try {
                ResourceEditor editor = new ResourceEditor();
                editor.setAsText(desc);
                Resource r = (Resource) editor.getValue();

                return IOUtils.toString(r.getInputStream());
            } catch (Exception ignored) {
            }
        }

        return desc;
    }

    /**
     * Retrieves the given keyword's parameter description.
     *
     * @param keyword keyword name
     * @param context Spring application context
     * @param beanMap keyword name to bean name mapping
     * @return the parameter description string of the given keyword, or {"*args"} if unavailable.
     */
    public static String[] getParameters(String keyword, ApplicationContext context, Map<String, String> beanMap) {
        KeywordInfo keywordInfo = getKeywordInfo(keyword, context, beanMap);

        return keywordInfo == null ? DEFAULT_PARAMS : keywordInfo.parameters();
    }

    /**
     * Retrieves the KeywordInfo of the given keyword.
     *
     * @param keyword keyword name
     * @param context Spring application context
     * @param beanMap keyword name to bean name mapping
     * @return KeywordInfo object or null if unavailable
     */
    public static KeywordInfo getKeywordInfo(String keyword, ApplicationContext context,
            Map<String, String> beanMap) {
        Object bean = context.getBean(beanMap.get(keyword));
        return AnnotationUtils.findAnnotation(bean.getClass(), KeywordInfo.class);
    }
}