1111import org .httprpc .ResourcePath ;
1212import org .httprpc .WebService ;
1313import org .httprpc .beans .BeanAdapter ;
14- import org .httprpc .beans .Key ;
1514import org .httprpc .io .JSONEncoder ;
1615import org .httprpc .sql .QueryBuilder ;
1716import org .httprpc .sql .ResultSetAdapter ;
2625import javax .persistence .Table ;
2726import javax .servlet .ServletException ;
2827import javax .servlet .annotation .WebServlet ;
29- import javax .servlet .http .HttpServletRequest ;
30- import javax .servlet .http .HttpServletResponse ;
3128import javax .sql .DataSource ;
3229import java .io .IOException ;
3330import java .sql .Connection ;
3633import java .util .Date ;
3734import java .util .List ;
3835import java .util .Properties ;
39- import java .util .stream .Collectors ;
4036import java .util .stream .Stream ;
4137
42- @ WebServlet (urlPatterns ={"/employess /*" }, loadOnStartup =1 )
38+ @ WebServlet (urlPatterns ={"/employees /*" }, loadOnStartup =1 )
4339public class EmployeeService extends WebService {
4440 public interface Employee {
45- @ Key ("emp_no" )
4641 int getEmployeeNumber ();
47-
48- @ Key ("first_name" )
4942 String getFirstName ();
50-
51- @ Key ("last_name" )
5243 String getLastName ();
53-
54- @ Key ("gender" )
5544 String getGender ();
56-
57- @ Key ("birth_date" )
5845 Date getBirthDate ();
59-
60- @ Key ("hire_date" )
6146 Date getHireDate ();
6247 }
6348
@@ -112,10 +97,16 @@ public Date getHireDate() {
11297
11398 private SessionFactory sessionFactory = null ;
11499
115- private static final String SQL_QUERY = QueryBuilder .select ("*" ).from ("employees" ).toString ();
100+ private static final String SQL_QUERY = QueryBuilder .select ("emp_no AS employeeNumber" ,
101+ "first_name AS firstName" ,
102+ "last_name AS lastName" ,
103+ "gender" ,
104+ "birth_date AS birthDate" ,
105+ "hire_date AS hireDate" ).from ("employees" ).toString ();
106+
116107 private static final String HQL_QUERY = QueryBuilder .select ("e" ).from ("EmployeeEntity e" ).toString ();
117108
118- private ThreadLocal < Boolean > useJackson = new ThreadLocal <>() ;
109+ private static final int FETCH_SIZE = 2048 ;
119110
120111 @ Override
121112 public void init () throws ServletException {
@@ -140,154 +131,80 @@ public void init() throws ServletException {
140131 configuration .addAnnotatedClass (EmployeeEntity .class );
141132
142133 sessionFactory = configuration .buildSessionFactory ();
143-
144- useJackson .set (false );
145134 }
146135
147136 @ RequestMethod ("GET" )
148- public List <Employee > getEmployees () throws SQLException {
137+ @ ResourcePath ("sql" )
138+ public Iterable <Employee > getEmployees () throws SQLException {
149139 try (Connection connection = dataSource .getConnection ();
150140 Statement statement = connection .createStatement ();
151141 ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
152- resultSetAdapter .setFetchSize (2048 );
153-
154- return resultSetAdapter .stream ()
155- .map (result -> (Employee )BeanAdapter .adapt (result , Employee .class ))
156- .collect (Collectors .toList ());
157- }
158- }
159-
160- @ RequestMethod ("GET" )
161- @ ResourcePath ("jackson" )
162- public List <Employee > getEmployeesJackson () throws SQLException {
163- useJackson .set (true );
142+ resultSetAdapter .setFetchSize (FETCH_SIZE );
164143
165- try {
166- return getEmployees ();
167- } finally {
168- useJackson .set (false );
144+ return new StreamAdapter <>(resultSetAdapter .stream ().map (result -> BeanAdapter .adapt (result , Employee .class )));
169145 }
170146 }
171147
172148 @ RequestMethod ("GET" )
173- @ ResourcePath ("hibernate " )
149+ @ ResourcePath ("hql " )
174150 public List <EmployeeEntity > getEmployeesHibernate () {
175151 try (Session session = sessionFactory .openSession ()) {
176152 return session .createQuery (HQL_QUERY , EmployeeEntity .class ).list ();
177153 }
178154 }
179155
180156 @ RequestMethod ("GET" )
181- @ ResourcePath ("hibernate-jackson" )
182- public List <EmployeeEntity > getEmployeesHibernateJackson () {
183- useJackson .set (true );
184-
185- try {
186- return getEmployeesHibernate ();
187- } finally {
188- useJackson .set (false );
189- }
190- }
191-
192- @ Override
193- protected void encodeResult (HttpServletRequest request , HttpServletResponse response , Object result ) throws IOException {
194- if (useJackson .get ()) {
195- ObjectMapper objectMapper = new ObjectMapper ();
196-
197- objectMapper .enable (SerializationFeature .INDENT_OUTPUT );
198-
199- objectMapper .writeValue (getResponse ().getOutputStream (), result );
200- } else {
201- super .encodeResult (request , response , result );
202- }
203- }
204-
205- @ RequestMethod ("GET" )
206- @ ResourcePath ("stream" )
157+ @ ResourcePath ("sql-stream" )
207158 public void streamEmployees () throws SQLException , IOException {
208159 getResponse ().setContentType ("application/json" );
209160
210- try (Connection connection = dataSource .getConnection ();
211- Statement statement = connection .createStatement ();
212- ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
213- resultSetAdapter .setFetchSize (2048 );
214-
215- JSONEncoder jsonEncoder = new JSONEncoder ();
216-
217- jsonEncoder .write (resultSetAdapter , getResponse ().getOutputStream ());
218- }
219- }
220-
221- @ RequestMethod ("GET" )
222- @ ResourcePath ("stream-jackson" )
223- public void streamEmployeesJackson () throws SQLException , IOException {
224- getResponse ().setContentType ("application/json" );
161+ JSONEncoder jsonEncoder = new JSONEncoder ();
225162
226163 try (Connection connection = dataSource .getConnection ();
227164 Statement statement = connection .createStatement ();
228165 ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
229- resultSetAdapter .setFetchSize (2048 );
166+ resultSetAdapter .setFetchSize (FETCH_SIZE );
230167
231- ObjectMapper objectMapper = new ObjectMapper ();
232-
233- objectMapper .enable (SerializationFeature .INDENT_OUTPUT );
234-
235- ObjectWriter objectWriter = objectMapper .writer ();
236-
237- try (SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
238- sequenceWriter .init (true );
239-
240- resultSetAdapter .stream ()
241- .map (result -> (Employee )BeanAdapter .adapt (result , Employee .class ))
242- .forEach (employee -> {
243- try {
244- sequenceWriter .write (employee );
245- } catch (IOException exception ) {
246- throw new RuntimeException (exception );
247- }
248- });
249- }
168+ jsonEncoder .write (resultSetAdapter , getResponse ().getOutputStream ());
250169 }
251170 }
252171
253172 @ RequestMethod ("GET" )
254- @ ResourcePath ("stream-hibernate " )
173+ @ ResourcePath ("hql-stream " )
255174 public void streamEmployeesHibernate () throws IOException {
256175 getResponse ().setContentType ("application/json" );
257176
177+ JSONEncoder jsonEncoder = new JSONEncoder ();
178+
258179 try (Session session = sessionFactory .openSession ();
259180 StreamAdapter <EmployeeEntity > streamAdapter = new StreamAdapter <>(session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ())) {
260- JSONEncoder jsonEncoder = new JSONEncoder ();
261-
262181 jsonEncoder .write (streamAdapter , getResponse ().getOutputStream ());
263182 }
264183 }
265184
266185 @ RequestMethod ("GET" )
267- @ ResourcePath ("stream-hibernate -jackson" )
186+ @ ResourcePath ("hql-stream -jackson" )
268187 public void streamEmployeesHibernateJackson () throws IOException {
269188 getResponse ().setContentType ("application/json" );
270189
271- try (Session session = sessionFactory .openSession ();
272- Stream <EmployeeEntity > stream = session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ()) {
273- ObjectMapper objectMapper = new ObjectMapper ();
274-
275- objectMapper .enable (SerializationFeature .INDENT_OUTPUT );
190+ ObjectMapper objectMapper = new ObjectMapper ();
276191
277- ObjectWriter objectWriter = objectMapper .writer ( );
192+ objectMapper .enable ( SerializationFeature . INDENT_OUTPUT );
278193
279- try (SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
280- sequenceWriter .init (true );
194+ ObjectWriter objectWriter = objectMapper .writer ();
281195
282- stream .forEach (employee -> {
283- try {
284- sequenceWriter .write (employee );
285- } catch (IOException exception ) {
286- throw new RuntimeException (exception );
287- }
288- });
289- }
196+ try (Session session = sessionFactory .openSession ();
197+ Stream <EmployeeEntity > stream = session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ();
198+ SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
199+ sequenceWriter .init (true );
200+
201+ stream .forEach (employeeEntity -> {
202+ try {
203+ sequenceWriter .write (employeeEntity );
204+ } catch (IOException exception ) {
205+ throw new RuntimeException (exception );
206+ }
207+ });
290208 }
291209 }
292-
293210}
0 commit comments