net.mindengine.blogix.utils.BlogixUtils.java Source code

Java tutorial

Introduction

Here is the source code for net.mindengine.blogix.utils.BlogixUtils.java

Source

/*******************************************************************************
* Copyright 2013 Ivan Shubin http://mindengine.net
* 
* 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 net.mindengine.blogix.utils;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import net.mindengine.blogix.web.routes.RouteParserException;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;

public class BlogixUtils {

    public static Pair<Class<?>, Method> readClassAndMethodFromParsedString(ClassLoader[] classLoaders,
            String parsedString, String[] defaultPackages) {
        int id = StringUtils.lastIndexOf(parsedString, ".");

        if (id > 0) {
            String methodName = parsedString.substring(id + 1);
            String classPath = parsedString.substring(0, id);
            return findClassAndMethod(classLoaders, classPath, methodName, defaultPackages);
        } else
            throw new RouteParserException("Cannot parse controller definition '" + parsedString + "'");
    }

    private static Pair<Class<?>, Method> findClassAndMethod(ClassLoader[] classLoaders, String classPath,
            String methodName, String[] defaultPackages) {
        Class<?> controllerClass = null;

        for (String defaultPackage : defaultPackages) {
            try {
                controllerClass = findClassInClassLoaders(classLoaders, defaultPackage + "." + classPath);
                break;
            } catch (Exception e) {
            }

        }
        if (controllerClass == null) {
            try {
                controllerClass = Class.forName(classPath);
            } catch (ClassNotFoundException e) {
                throw new RouteParserException("Cannot find a class for controller: " + classPath);
            }
        }

        Method method = findMethodInClass(controllerClass, methodName);
        if (method != null) {
            return new ImmutablePair<Class<?>, Method>(controllerClass, method);
        } else
            throw new RouteParserException(
                    "Cannot find method '" + methodName + "' for controller " + controllerClass.getName());
    }

    private static Class<?> findClassInClassLoaders(ClassLoader[] classLoaders, String classPath)
            throws ClassNotFoundException {
        for (ClassLoader classLoader : classLoaders) {
            try {
                return classLoader.loadClass(classPath);
            } catch (ClassNotFoundException e) {
            }
        }
        throw new ClassNotFoundException(classPath);
    }

    private static Method findMethodInClass(Class<?> controllerClass, String methodName) {
        Method[] methods = controllerClass.getMethods();
        for (Method method : methods) {
            if (Modifier.isStatic(method.getModifiers()) && method.getName().equals(methodName)) {
                return method;
            }
        }
        return null;
    }
}