001/**
002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package io.jboot.web.render;
017
018import com.jfinal.kit.JsonKit;
019import com.jfinal.render.IRenderFactory;
020import com.jfinal.render.Render;
021import com.jfinal.render.RenderManager;
022import io.jboot.utils.DateUtil;
023import io.jboot.utils.StrUtil;
024import io.jboot.web.ResponseEntity;
025
026import javax.servlet.http.HttpServletRequest;
027import javax.servlet.http.HttpServletResponse;
028import java.io.File;
029import java.math.BigDecimal;
030import java.math.BigInteger;
031import java.util.Date;
032
033/**
034 * @author Michael Yang 杨福海 (fuhai999@gmail.com)
035 * @version V1.0
036 */
037public class JbootReturnValueRender extends Render {
038
039    protected IRenderFactory factory = RenderManager.me().getRenderFactory();
040    protected Object value;
041    protected Render render;
042
043    protected String forwardTo;
044
045    public JbootReturnValueRender(Object returnValue) {
046
047        if (returnValue == null) {
048            this.value = null;
049        } else if (isBaseType(returnValue)) {
050            this.value = String.valueOf(returnValue);
051        } else {
052            this.value = returnValue;
053        }
054
055        initRealRender();
056    }
057
058
059    protected void initRealRender() {
060        if (this.value == null) {
061            this.render = factory.getNullRender();
062        } else if (this.value instanceof ResponseEntity) {
063            this.render = new JbootResponseEntityRender((ResponseEntity) value);
064        } else if (this.value instanceof String) {
065            String newVal = ((String) value).toLowerCase();
066
067            //template
068            if (newVal.endsWith(".html") && !newVal.contains(":")) {
069                this.render = factory.getTemplateRender((String) value);
070            }
071
072            //error
073            else if (newVal.startsWith("error") && newVal.length() > 8) {
074                String trim = ((String) value).substring(5).trim();
075                if (trim.startsWith(":")) {
076                    String errorCodeStr = trim.substring(1).trim();
077                    if (StrUtil.isNumeric(errorCodeStr)) {
078                        this.render = factory.getErrorRender(Integer.parseInt(errorCodeStr));
079                    }
080                }
081                if (this.render == null) {
082                    this.render = factory.getTextRender((String) value);
083                }
084            }
085
086            //forward
087            else if (newVal.startsWith("forward")) {
088                String trim = ((String) value).substring(7).trim();
089                if (trim.startsWith(":")) {
090                    this.forwardTo = trim.substring(1).trim();
091                } else {
092                    this.render = factory.getTextRender((String) value);
093                }
094            }
095
096            //redirect
097            else if (newVal.startsWith("redirect")) {
098                String trim = ((String) value).substring(8).trim();
099                if (trim.startsWith(":")) {
100                    String redirectTo = trim.substring(1).trim();
101                    if (StrUtil.isNotBlank(redirectTo)) {
102                        this.render = factory.getRedirectRender(redirectTo);
103                    }
104                }
105                if (this.render == null) {
106                    this.render = factory.getTextRender((String) value);
107                }
108            }
109
110            //text
111            else {
112                this.render = factory.getTextRender((String) value);
113            }
114        } else if (this.value instanceof Date) {
115            this.render = factory.getTextRender(DateUtil.toDateTimeString((Date) value));
116        } else if (this.value instanceof File) {
117            this.render = factory.getFileRender((File) value);
118        } else if (this.value instanceof Render) {
119            this.render = (Render) value;
120        } else {
121            this.render = factory.getJsonRender(JsonKit.toJson(value));
122        }
123    }
124
125
126    @Override
127    public Render setContext(HttpServletRequest request, HttpServletResponse response) {
128        render.setContext(request, response);
129        return this;
130    }
131
132    @Override
133    public Render setContext(HttpServletRequest request, HttpServletResponse response, String viewPath) {
134        render.setContext(request, response, viewPath);
135        return this;
136    }
137
138    @Override
139    public void render() {
140        this.render.render();
141    }
142
143
144    protected boolean isBaseType(Object value) {
145        Class<?> c = value.getClass();
146        return c == String.class || c == char.class
147                || c == Integer.class || c == int.class
148                || c == Long.class || c == long.class
149                || c == Double.class || c == double.class
150                || c == Float.class || c == float.class
151                || c == Boolean.class || c == boolean.class
152                || c == Short.class || c == short.class
153                || c == BigDecimal.class || c == BigInteger.class;
154    }
155
156    public Render getRealRender(){
157        return render;
158    }
159
160    public String getForwardTo() {
161        return forwardTo;
162    }
163}