/**
* Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.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.render;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.jfinal.plugin.activerecord.CPI;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.ModelRecordElResolver;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
/**
* JspRender.
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class JspRender extends Render {
private static boolean isSupportActiveRecord = false;
static {
try {
com.jfinal.plugin.activerecord.ModelRecordElResolver.init();
}
catch (Exception e) {
// System.out.println("Jsp or JSTL can not be supported!");
}
}
@Deprecated
public static void setSupportActiveRecord(boolean supportActiveRecord) {
JspRender.isSupportActiveRecord = supportActiveRecord;
ModelRecordElResolver.setWorking(JspRender.isSupportActiveRecord ? false : true);
}
public JspRender(String view) {
this.view = view;
}
public void render() {
// 在 jsp 页面使用如下指令则无需再指字符集, 否则是重复指定了,与页面指定的不一致时还会出乱码
// <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
// response.setContentType(contentType);
// response.setCharacterEncoding(encoding);
try {
if (isSupportActiveRecord)
supportActiveRecord(request);
request.getRequestDispatcher(view).forward(request, response);
} catch (Exception e) {
throw new RenderException(e);
}
}
private static int DEPTH = 8;
private void supportActiveRecord(HttpServletRequest request) {
for (Enumeration<String> attrs = request.getAttributeNames(); attrs.hasMoreElements();) {
String key = attrs.nextElement();
Object value = request.getAttribute(key);
request.setAttribute(key, handleObject(value, DEPTH));
}
}
private Object handleObject(Object value, int depth) {
if(value == null || (depth--) <= 0)
return value;
if (value instanceof List)
return handleList((List)value, depth);
else if (value instanceof Model)
return handleMap(CPI.getAttrs((Model)value), depth);
else if (value instanceof Record)
return handleMap(((Record)value).getColumns(), depth);
else if(value instanceof Map)
return handleMap((Map)value, depth);
else if (value instanceof Page)
return handlePage((Page)value, depth);
else if (value instanceof Object[])
return handleArray((Object[])value, depth);
else
return value;
}
private Map handleMap(Map map, int depth) {
if (map == null || map.size() == 0)
return map;
Map<Object, Object> result = map;
for (Map.Entry<Object, Object> e : result.entrySet()) {
Object key = e.getKey();
Object value = e.getValue();
value = handleObject(value, depth);
result.put(key, value);
}
return result;
}
private List handleList(List list, int depth) {
if (list == null || list.size() == 0)
return list;
List result = new ArrayList(list.size());
for (Object value : list)
result.add(handleObject(value, depth));
return result;
}
private Object handlePage(Page page, int depth) {
Map<String, Object> result = new HashMap<String, Object>();
result.put("list", handleList(page.getList(), depth));
result.put("pageNumber", page.getPageNumber());
result.put("pageSize", page.getPageSize());
result.put("totalPage", page.getTotalPage());
result.put("totalRow", page.getTotalRow());
return result;
}
private List handleArray(Object[] array, int depth) {
if (array == null || array.length == 0)
return new ArrayList(0);
List result = new ArrayList(array.length);
for (int i=0; i<array.length; i++)
result.add(handleObject(array[i], depth));
return result;
}
}
/*
private void handleGetterMethod(Map<String, Object> result, Method[] methods) {
for (Method method : methods) {
String methodName = method.getName();
if (methodName.startsWith("get") && method.getParameterTypes().length == 0) {
throw new RuntimeException("Not finished!");
}
}
}
*/