88import org .hibernate .SessionFactory ;
99import org .hibernate .cfg .Configuration ;
1010import org .httprpc .RequestMethod ;
11- import org .httprpc .ResourcePath ;
1211import org .httprpc .WebService ;
1312import org .httprpc .beans .BeanAdapter ;
1413import org .httprpc .io .JSONEncoder ;
3433import java .sql .Statement ;
3534import java .util .Date ;
3635import java .util .List ;
36+ import java .util .Map ;
3737import java .util .Properties ;
3838import java .util .stream .Collectors ;
39- import java .util .stream .Stream ;
4039
4140@ WebServlet (urlPatterns ={"/employees/*" }, loadOnStartup =1 )
4241public class EmployeeService extends WebService {
@@ -103,17 +102,16 @@ public Date getHireDate() {
103102 }
104103
105104 private DataSource dataSource = null ;
106-
107105 private SessionFactory sessionFactory = null ;
108106
109107 private ThreadLocal <Boolean > useJackson = new ThreadLocal <>();
110108
111- private static final String SQL_QUERY = QueryBuilder .select ("emp_no AS employeeNumber" ,
112- "first_name AS firstName" ,
113- "last_name AS lastName" ,
109+ private static final String SQL_QUERY = QueryBuilder .select ("emp_no as employeeNumber" ,
110+ "first_name as firstName" ,
111+ "last_name as lastName" ,
114112 "gender" ,
115- "birth_date AS birthDate" ,
116- "hire_date AS hireDate" ).from ("employees" ).toString ();
113+ "birth_date as birthDate" ,
114+ "hire_date as hireDate" ).from ("employees" ).toString ();
117115
118116 private static final String HQL_QUERY = QueryBuilder .select ("e" ).from ("EmployeeService$EmployeeEntity e" ).toString ();
119117
@@ -140,8 +138,6 @@ public void init() throws ServletException {
140138 configuration .addAnnotatedClass (EmployeeEntity .class );
141139
142140 sessionFactory = configuration .buildSessionFactory ();
143-
144- useJackson .set (false );
145141 }
146142
147143 @ Override
@@ -153,113 +149,105 @@ public void destroy() {
153149 }
154150 }
155151
152+ @ Override
153+ public void service (HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException {
154+ try {
155+ super .service (request , response );
156+ } finally {
157+ useJackson .remove ();
158+ }
159+ }
160+
156161 @ Override
157162 protected void encodeResult (HttpServletRequest request , HttpServletResponse response , Object result ) throws IOException {
158163 if (useJackson .get ()) {
159164 ObjectMapper objectMapper = new ObjectMapper ();
160165
161166 objectMapper .enable (SerializationFeature .INDENT_OUTPUT );
162-
163- objectMapper .writeValue (getResponse ().getOutputStream (), result );
167+ objectMapper .writeValue (response .getOutputStream (), result );
164168 } else {
165169 super .encodeResult (request , response , result );
166170 }
167171 }
168172
169173 @ RequestMethod ("GET" )
170- @ ResourcePath ("sql" )
171- public List <Employee > getEmployees () throws SQLException {
172- try (Connection connection = dataSource .getConnection ();
173- Statement statement = connection .createStatement ();
174- ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
175- return resultSetAdapter .stream ()
176- .map (result -> (Employee )BeanAdapter .adapt (result , Employee .class ))
177- .collect (Collectors .toList ());
178- }
179- }
180-
181- @ RequestMethod ("GET" )
182- @ ResourcePath ("sql-jackson" )
183- public List <Employee > getEmployeesJackson () throws SQLException {
184- useJackson .set (true );
185-
186- try {
187- return getEmployees ();
188- } finally {
189- useJackson .set (false );
190- }
191- }
192-
193- @ RequestMethod ("GET" )
194- @ ResourcePath ("sql-stream" )
195- public void streamEmployees () throws SQLException , IOException {
196- getResponse ().setContentType ("application/json" );
197-
198- JSONEncoder jsonEncoder = new JSONEncoder ();
199-
200- try (Connection connection = dataSource .getConnection ();
201- Statement statement = connection .createStatement ();
202- ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
203- jsonEncoder .write (resultSetAdapter , getResponse ().getOutputStream ());
204- }
205- }
206-
207- @ RequestMethod ("GET" )
208- @ ResourcePath ("hql" )
209- public List <? extends Employee > getEmployeesHibernate () {
210- try (Session session = sessionFactory .openSession ()) {
211- return session .createQuery (HQL_QUERY , EmployeeEntity .class ).list ();
174+ public List <? extends Employee > getEmployees (boolean hql , boolean jackson , boolean stream ) throws IOException , SQLException {
175+ if (stream ) {
176+ streamEmployees (hql , jackson );
177+ return null ;
178+ } else {
179+ return getEmployees (hql , jackson );
212180 }
213181 }
214182
215- @ RequestMethod ("GET" )
216- @ ResourcePath ("hql-jackson" )
217- public List <? extends Employee > getEmployeesHibernateJackson () {
218- useJackson .set (true );
183+ private List <? extends Employee > getEmployees (boolean hql , boolean jackson ) throws SQLException {
184+ useJackson .set (jackson );
219185
220- try {
221- return getEmployeesHibernate ();
222- } finally {
223- useJackson .set (false );
186+ if (hql ) {
187+ try (Session session = sessionFactory .openSession ()) {
188+ return session .createQuery (HQL_QUERY , EmployeeEntity .class ).list ();
189+ }
190+ } else {
191+ try (Connection connection = dataSource .getConnection ();
192+ Statement statement = connection .createStatement ();
193+ ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
194+ return resultSetAdapter .stream ()
195+ .map (result -> (Employee )BeanAdapter .adapt (result , Employee .class ))
196+ .collect (Collectors .toList ());
197+ }
224198 }
225199 }
226200
227- @ RequestMethod ("GET" )
228- @ ResourcePath ("hql-stream" )
229- public void streamEmployeesHibernate () throws IOException {
201+ private void streamEmployees (boolean hql , boolean jackson ) throws IOException , SQLException {
230202 getResponse ().setContentType ("application/json" );
231203
232- JSONEncoder jsonEncoder = new JSONEncoder ();
204+ if (jackson ) {
205+ streamEmployeesJackson (hql );
206+ } else {
207+ JSONEncoder jsonEncoder = new JSONEncoder ();
233208
234- try (Session session = sessionFactory .openSession ();
235- StreamAdapter <?> streamAdapter = new StreamAdapter <>(session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ().map (BeanAdapter ::new ))) {
236- jsonEncoder .write (streamAdapter , getResponse ().getOutputStream ());
209+ if (hql ) {
210+ try (Session session = sessionFactory .openSession ();
211+ StreamAdapter <Map <String , ?>> streamAdapter = new StreamAdapter <>(session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ().map (BeanAdapter ::new ))) {
212+ jsonEncoder .write (streamAdapter , getResponse ().getOutputStream ());
213+ }
214+ } else {
215+ try (Connection connection = dataSource .getConnection ();
216+ Statement statement = connection .createStatement ();
217+ ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ))) {
218+ jsonEncoder .write (resultSetAdapter , getResponse ().getOutputStream ());
219+ }
220+ }
237221 }
238222 }
239223
240- @ RequestMethod ("GET" )
241- @ ResourcePath ("hql-stream-jackson" )
242- public void streamEmployeesHibernateJackson () throws IOException {
243- getResponse ().setContentType ("application/json" );
244-
224+ private void streamEmployeesJackson (boolean hql ) throws IOException , SQLException {
245225 ObjectMapper objectMapper = new ObjectMapper ();
246226
247227 objectMapper .enable (SerializationFeature .INDENT_OUTPUT );
248-
249228 ObjectWriter objectWriter = objectMapper .writer ();
250229
251- try (Session session = sessionFactory .openSession ();
252- Stream <EmployeeEntity > stream = session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ();
253- SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
254- sequenceWriter .init (true );
230+ if (hql ) {
231+ try (Session session = sessionFactory .openSession ();
232+ StreamAdapter <? extends Employee > streamAdapter = new StreamAdapter <>(session .createQuery (HQL_QUERY , EmployeeEntity .class ).stream ());
233+ SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
234+ sequenceWriter .init (true );
255235
256- stream .forEach (employee -> {
257- try {
236+ for (Employee employee : streamAdapter ) {
258237 sequenceWriter .write (employee );
259- } catch (IOException exception ) {
260- throw new RuntimeException (exception );
261238 }
262- });
239+ }
240+ } else {
241+ try (Connection connection = dataSource .getConnection ();
242+ Statement statement = connection .createStatement ();
243+ ResultSetAdapter resultSetAdapter = new ResultSetAdapter (statement .executeQuery (SQL_QUERY ));
244+ SequenceWriter sequenceWriter = objectWriter .writeValues (getResponse ().getOutputStream ())) {
245+ sequenceWriter .init (true );
246+
247+ for (Map <String , ?> result : resultSetAdapter ) {
248+ sequenceWriter .write (result );
249+ }
250+ }
263251 }
264252 }
265253}
0 commit comments