Package com.alibaba.citrus.dev.handler.impl.visitor

Source Code of com.alibaba.citrus.dev.handler.impl.visitor.BeansVisitor$BeanName

/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* 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 com.alibaba.citrus.dev.handler.impl.visitor;

import static com.alibaba.citrus.dev.handler.util.ReflectionUtil.*;
import static com.alibaba.citrus.util.CollectionUtil.*;
import static com.alibaba.citrus.util.ExceptionUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;

import java.util.Arrays;
import java.util.List;

import com.alibaba.citrus.dev.handler.impl.ExplorerHandler.ExplorerVisitor;
import com.alibaba.citrus.dev.handler.util.BeanDefinitionReverseEngine;
import com.alibaba.citrus.dev.handler.util.Element;
import com.alibaba.citrus.webx.handler.RequestHandlerContext;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;

public class BeansVisitor extends AbstractFallbackVisitor<ExplorerVisitor> {
    private final DefaultListableBeanFactory factory;

    public BeansVisitor(RequestHandlerContext context, ExplorerVisitor v) {
        super(context, v);
        this.factory = (DefaultListableBeanFactory) v.getApplicationContext().getBeanFactory();
    }

    public void visitBeanCount() {
        out().print(factory.getBeanDefinitionCount());
    }

    public void visitBeans() {
        List<Element> elements = createLinkedList();

        for (String name : getSortedBeanNames()) {
            Element beanElement = null;

            try {
                RootBeanDefinition bd = getBeanDefinition(name);
                beanElement = new BeanDefinitionReverseEngine(bd, name, factory.getAliases(name)).toDom();
            } catch (Exception e) {
                beanElement = new Element("bean").setText(getStackTrace(getRootCause(e)));
            }

            if (beanElement != null) {
                elements.add(beanElement);
            }
        }

        getFallbackVisitor().getDomComponent().visitTemplate(context, elements);
    }

    private RootBeanDefinition getBeanDefinition(String name) throws Exception {
        return (RootBeanDefinition) getAccessibleMethod(factory.getClass(), "getMergedLocalBeanDefinition",
                                                        new Class<?>[] { String.class }).invoke(factory, name);
    }

    /** 将bean names排序。先按bean name的复杂度排序,再按字母顺序排序。 */
    private String[] getSortedBeanNames() {
        String[] names = factory.getBeanDefinitionNames();
        BeanName[] beanNames = new BeanName[names.length];

        for (int i = 0; i < names.length; i++) {
            beanNames[i] = new BeanName();
            beanNames[i].beanName = names[i];
            beanNames[i].components = split(names[i], ".");
        }

        Arrays.sort(beanNames);

        names = new String[beanNames.length];

        for (int i = 0; i < beanNames.length; i++) {
            names[i] = beanNames[i].beanName;
        }

        return names;
    }

    static class BeanName implements Comparable<BeanName> {
        String   beanName;
        String[] components;

        public int compareTo(BeanName o) {
            if (components.length != o.components.length) {
                return components.length - o.components.length;
            }

            for (int i = 0; i < components.length; i++) {
                String comp1 = components[i];
                String comp2 = o.components[i];

                if (!comp1.equals(comp2)) {
                    return comp1.compareTo(comp2);
                }
            }

            return 0;
        }
    }
}
TOP

Related Classes of com.alibaba.citrus.dev.handler.impl.visitor.BeansVisitor$BeanName

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.