James Moger
2015-11-22 ed552ba47c02779c270ffd62841d6d1048dade70
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Copyright 2011 gitblit.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.gitblit.servlet;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Type;
import java.text.MessageFormat;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import com.gitblit.Constants;
import com.gitblit.utils.JsonUtils;
import com.gitblit.utils.StringUtils;
 
/**
 * Servlet class for interpreting json requests.
 *
 * @author James Moger
 *
 */
public abstract class JsonServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    protected final int forbiddenCode = HttpServletResponse.SC_FORBIDDEN;
 
    protected final int notAllowedCode = HttpServletResponse.SC_METHOD_NOT_ALLOWED;
 
    protected final int failureCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
 
    protected final Logger logger;
 
    public JsonServlet() {
        super();
        logger = LoggerFactory.getLogger(getClass());
    }
 
    /**
     * Processes an gson request.
     *
     * @param request
     * @param response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    protected abstract void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException;
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    protected <X> X deserialize(HttpServletRequest request, HttpServletResponse response,
            Class<X> clazz) throws IOException {
        String json = readJson(request, response);
        if (StringUtils.isEmpty(json)) {
            return null;
        }
 
        X object = JsonUtils.fromJsonString(json.toString(), clazz);
        return object;
    }
 
    protected <X> X deserialize(HttpServletRequest request, HttpServletResponse response, Type type)
            throws IOException {
        String json = readJson(request, response);
        if (StringUtils.isEmpty(json)) {
            return null;
        }
 
        X object = JsonUtils.fromJsonString(json.toString(), type);
        return object;
    }
 
    private String readJson(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        BufferedReader reader = request.getReader();
        StringBuilder json = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            json.append(line);
        }
        reader.close();
 
        if (json.length() == 0) {
            logger.error(MessageFormat.format("Failed to receive json data from {0}",
                    request.getRemoteAddr()));
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return null;
        }
        return json.toString();
    }
 
    protected void serialize(HttpServletResponse response, Object o) throws IOException {
        if (o != null) {
            // Send JSON response
            String json = JsonUtils.toJsonString(o);
            response.setCharacterEncoding(Constants.ENCODING);
            response.setContentType("application/json");
            response.getWriter().append(json);
        }
    }
}