All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jfinal.core.paragetter.ParaProcessorBuilder Maven / Gradle / Ivy

/**
 * Copyright (c) 2011-2017, 玛雅牛 (myaniu AT gmail.com).
 *
 * 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.jfinal.core.paragetter;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.Map;

import com.jfinal.core.Controller;
import com.jfinal.kit.LogKit;

public class ParaProcessorBuilder {

	private final static ParaProcessorBuilder me = new ParaProcessorBuilder();
	private Map, Holder> typeMap = new HashMap, Holder>();

	private ParaProcessorBuilder() {
		regist(short.class, ShortGetter.class, "0");
		regist(int.class, IntegerGetter.class, "0");
		regist(long.class, LongGetter.class, "0");
		regist(float.class, FloatGetter.class, "0");
		regist(double.class, DoubleGetter.class, "0");
		regist(boolean.class, BooleanGetter.class, "false");
		regist(Short.class, ShortGetter.class, null);
		regist(Integer.class, IntegerGetter.class, null);
		regist(Long.class, LongGetter.class, null);
		regist(Float.class, FloatGetter.class, null);
		regist(Double.class, DoubleGetter.class, null);
		regist(Boolean.class, BooleanGetter.class, null);
		regist(String.class, StringGetter.class, null);
		regist(java.util.Date.class, DateGetter.class, null);
		regist(java.sql.Date.class, SqlDateGetter.class, null);
		regist(java.sql.Time.class, TimeGetter.class, null);
		regist(java.sql.Timestamp.class, TimestampGetter.class, null);
		regist(java.math.BigDecimal.class, BigDecimalGetter.class, null);
		regist(java.math.BigInteger.class, BigIntegerGetter.class, null);
		regist(java.io.File.class, FileGetter.class, null);
		regist(com.jfinal.upload.UploadFile.class, UploadFileGetter.class, null);
		regist(String[].class, StringArrayGetter.class, null);
		regist(Integer[].class, IntegerArrayGetter.class, null);
		regist(Long[].class, LongArrayGetter.class, null);
		regist(RawPostData.class, RawPostDataGetter.class, null);
		
	}

	public static ParaProcessorBuilder me() {
		return me;
	}
	
	/**
	 * 注册一个类型对应的参数获取器 
	 * ParameterGetterBuilder.me().regist(java.lang.String.class, StringParaGetter.class, null);
	 * @param typeClass 类型,例如 java.lang.Integer.class
	 * @param pgClass 参数获取器实现类,必须继承ParaGetter
	 * @param defaultValue,默认值,比如int的默认值为0, java.lang.Integer的默认值为null
	 */
	public  void regist(Class typeClass, Class> pgClass, String defaultValue){
		this.typeMap.put(typeClass, new Holder(pgClass, defaultValue));
	}

	public ParaProcessor build(Class controllerClass, Method method) {
		final int parameterCount = method.getParameterCount();
		ParaProcessor opag = new ParaProcessor(parameterCount);
		if (0 == parameterCount) {
			return opag;
		}
		for (Parameter p : method.getParameters()) {
			IParaGetter pg = createParaGetter(controllerClass, method, p);
			//存在文件的情况下,文件需要优先获取才行
			if (pg instanceof FileGetter) {
				opag.addParaGetterToHeader(pg);
			} else {
				opag.addParaGetter(pg);
			}
		}
		return opag;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private IParaGetter createParaGetter(Class controllerClass, Method method,
			Parameter p) {
		if(!p.isNamePresent()) {
			LogKit.warn("you should add compiler flag -parameters to support parameter auto binding");
		}
		String parameterName = p.getName();
		String defaultValue = null;
		Class typeClass = p.getType();
		Para para = p.getAnnotation(Para.class);
		if (para != null) {
			parameterName = para.value().trim();
			defaultValue = para.defaultValue().trim();
			if (defaultValue.isEmpty()) {
				defaultValue = null;
			}
		}
		Holder holder = typeMap.get(typeClass);
		if (holder != null) {
			if (null == defaultValue) {
				defaultValue = holder.getDefaultValue();
			}
			try {
				return holder.born(parameterName, defaultValue);
			} catch (Exception e) {
				throw new RuntimeException(e.getMessage(), e);
			}
		}
		//枚举
		if(Enum.class.isAssignableFrom(typeClass)){
			return new EnumGetter(typeClass,parameterName,defaultValue);
		}else if (com.jfinal.plugin.activerecord.IBean.class.isAssignableFrom(typeClass)) {
			//实现了IBean接口,优先按BeanGetter来处理。
			return new BeanGetter(typeClass, parameterName);
		}else if (com.jfinal.plugin.activerecord.Model.class.isAssignableFrom(typeClass)) {
			return new ModelGetter(typeClass, parameterName);
		} else {
			return new BeanGetter(typeClass, parameterName);
		}
	}

	private static class Holder {
		private final String defaultValue;
		private final Class> clazz;

		Holder(Class> clazz, String defaultValue) {
			this.clazz = clazz;
			this.defaultValue = defaultValue;
		}
		final String getDefaultValue() {
			return defaultValue;
		}
		ParaGetter born(String parameterName, String defaultValue) throws Exception {
			Constructor> con = clazz.getConstructor(String.class, String.class);
			return con.newInstance(parameterName, defaultValue);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy