// Path: com/nymph/utils/AnnoUtil.java
// public abstract class AnnoUtil {
// 	
// 	/**
// 	 * 判断一个注解数组是否包含某个注解相同类型的注解...
// 	 * @param annos  注解数组
// 	 * @param parent 目标注解
// 	 * @return 注解数组中包含的注解
// 	 */
// 	public static Annotation get(Annotation[] annos, Class<? extends Annotation> parent) {
// 		for (Annotation annotation : annos) {
// 			if (annotation.annotationType().isAnnotationPresent(parent)) {
// 				return annotation;
// 			}
// 		}
// 		return null;
// 	}
// 	
// 	/**
// 	 * 判断一个注解数组是否包含某个注解相同类型的注解...
// 	 * @param annos  注解数组
// 	 * @param parent 目标注解
// 	 * @return 注解数组中包含的注解类型
// 	 */
// 	public static Class<? extends Annotation> getType(Annotation[] annos, Class<? extends Annotation> parent) {
// 		for (Annotation annotation : annos) {
// 			Class<? extends Annotation> annotationType = annotation.annotationType();
// 			if (annotationType.isAnnotationPresent(parent)) {
// 				return annotationType;
// 			}
// 		}
// 		return null;
// 	}
// 	/**
// 	 * 判断一个注解数组中是否包含某个注解
// 	 * @param annos		注解数组
// 	 * @param parent	目标注解
// 	 * @return <code>true</code> <b>or</b> <code>false</code>
// 	 */
// 	public static boolean exist(Annotation[] annos, Class<? extends Annotation> parent) {
// 		for (Annotation annotation : annos) {
// 			if (annotation.annotationType().isAnnotationPresent(parent) || 
// 				annotation.annotationType() == parent) {
// 				return true;
// 			}
// 		}
// 		return false;
// 	}
// 	
// 	/**
// 	 * 获取注解的指定方法的值
// 	 * @param annotation 目标注解
// 	 * @param methodName 注解的方法名
// 	 * @return			   结果
// 	 */
// 	public static Object invoke(Annotation annotation, String methodName) {
// 		try {
// 			Class<? extends Annotation> annotationType = annotation.annotationType();
// 			return annotationType.getMethod(methodName).invoke(annotation);
// 		} catch (Exception e) {
// 			e.printStackTrace();
// 			return null;
// 		}
// 	}
// 	
// 	/**
// 	 * 获取注解的value方法的值
// 	 * @param annotation 目标注解
// 	 * @return			   结果
// 	 */
// 	public static String getValueOfValueMethod(Annotation annotation) {
// 		return String.valueOf(invoke(annotation, "value"));
// 	}
// 
// }


import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.nymph.annotation.HTTP;
import com.nymph.annotation.Request;
import com.nymph.utils.AnnoUtil;
/**
 * 
 */
package com.nymph.bean.web;



/**
 * 关于web层的bean的一些处理, 主要是将一个完整的url映射到具体的一个方法, 这样可以加快访问的速度, 直接通过浏览器
 *     的url地址的字符串就能获取到对应的类和方法
 * @author NYMPH
 * @date 2017年9月26日2017年9月26日
 */
public class MapperInfoContainer {

	private final Map<String, MapperInfo> httpMap = new HashMap<>();

	/**
	 * 对拥有@HTTP注解的bean进行处理主要是将@HTTP注解的value和@Request系列注解(@GET这种)
	 *     的value拼接成一个完整的表示url地址的字符串, 然后存入map中, 这样当一个请求访问过来
	 *     时只需要拿到这个请求的uri就可以直接获取到对应的Class和Method,如果用@UrlHolder
	 *     注解这种占位符形式的url的话就只有遍历来寻找是否存在请求所映射的类了
	 * @param clazz	待处理的Class
	 */
	public void filterAlsoSave(Class<?> clazz) throws IllegalAccessException {
		HTTP http = clazz.getAnnotation(HTTP.class);
		// 没有@HTTP注解的bean则不进行处理
		if (http == null)
// Path: com/nymph/utils/AnnoUtil.java
// public abstract class AnnoUtil {
// 	
// 	/**
// 	 * 判断一个注解数组是否包含某个注解相同类型的注解...
// 	 * @param annos  注解数组
// 	 * @param parent 目标注解
// 	 * @return 注解数组中包含的注解
// 	 */
// 	public static Annotation get(Annotation[] annos, Class<? extends Annotation> parent) {
// 		for (Annotation annotation : annos) {
// 			if (annotation.annotationType().isAnnotationPresent(parent)) {
// 				return annotation;
// 			}
// 		}
// 		return null;
// 	}
// 	
// 	/**
// 	 * 判断一个注解数组是否包含某个注解相同类型的注解...
// 	 * @param annos  注解数组
// 	 * @param parent 目标注解
// 	 * @return 注解数组中包含的注解类型
// 	 */
// 	public static Class<? extends Annotation> getType(Annotation[] annos, Class<? extends Annotation> parent) {
// 		for (Annotation annotation : annos) {
// 			Class<? extends Annotation> annotationType = annotation.annotationType();
// 			if (annotationType.isAnnotationPresent(parent)) {
// 				return annotationType;
// 			}
// 		}
// 		return null;
// 	}
// 	/**
// 	 * 判断一个注解数组中是否包含某个注解
// 	 * @param annos		注解数组
// 	 * @param parent	目标注解
// 	 * @return <code>true</code> <b>or</b> <code>false</code>
// 	 */
// 	public static boolean exist(Annotation[] annos, Class<? extends Annotation> parent) {
// 		for (Annotation annotation : annos) {
// 			if (annotation.annotationType().isAnnotationPresent(parent) || 
// 				annotation.annotationType() == parent) {
// 				return true;
// 			}
// 		}
// 		return false;
// 	}
// 	
// 	/**
// 	 * 获取注解的指定方法的值
// 	 * @param annotation 目标注解
// 	 * @param methodName 注解的方法名
// 	 * @return			   结果
// 	 */
// 	public static Object invoke(Annotation annotation, String methodName) {
// 		try {
// 			Class<? extends Annotation> annotationType = annotation.annotationType();
// 			return annotationType.getMethod(methodName).invoke(annotation);
// 		} catch (Exception e) {
// 			e.printStackTrace();
// 			return null;
// 		}
// 	}
// 	
// 	/**
// 	 * 获取注解的value方法的值
// 	 * @param annotation 目标注解
// 	 * @return			   结果
// 	 */
// 	public static String getValueOfValueMethod(Annotation annotation) {
// 		return String.valueOf(invoke(annotation, "value"));
// 	}
// 
// }


// Path: com/nymph/bean/web/MapperInfoContainer.java
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.nymph.annotation.HTTP;
import com.nymph.annotation.Request;
import com.nymph.utils.AnnoUtil;

/**
 * 
 */
package com.nymph.bean.web;



/**
 * 关于web层的bean的一些处理, 主要是将一个完整的url映射到具体的一个方法, 这样可以加快访问的速度, 直接通过浏览器
 *     的url地址的字符串就能获取到对应的类和方法
 * @author NYMPH
 * @date 2017年9月26日2017年9月26日
 */
public class MapperInfoContainer {

	private final Map<String, MapperInfo> httpMap = new HashMap<>();

	/**
	 * 对拥有@HTTP注解的bean进行处理主要是将@HTTP注解的value和@Request系列注解(@GET这种)
	 *     的value拼接成一个完整的表示url地址的字符串, 然后存入map中, 这样当一个请求访问过来
	 *     时只需要拿到这个请求的uri就可以直接获取到对应的Class和Method,如果用@UrlHolder
	 *     注解这种占位符形式的url的话就只有遍历来寻找是否存在请求所映射的类了
	 * @param clazz	待处理的Class
	 */
	public void filterAlsoSave(Class<?> clazz) throws IllegalAccessException {
		HTTP http = clazz.getAnnotation(HTTP.class);
		// 没有@HTTP注解的bean则不进行处理
		if (http == null)
			return;