Skip to content

Commit 8e2babc

Browse files
committed
Update tests.
1 parent 63dfbae commit 8e2babc

File tree

4 files changed

+91
-106
lines changed

4 files changed

+91
-106
lines changed

benchmark.sh

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,25 @@ BASE_URL=http://localhost:8080/httprpc-test-1.0/employees
22
OUTPUT_FORMAT='%{time_starttransfer}, %{time_total}\n'
33

44
echo SQL
5-
curl $BASE_URL/sql -s -o /dev/null -w "$OUTPUT_FORMAT"
5+
curl "$BASE_URL" -s -o /dev/null -w "$OUTPUT_FORMAT"
66

77
echo SQL Jackson
8-
curl $BASE_URL/sql-jackson -s -o /dev/null -w "$OUTPUT_FORMAT"
8+
curl "$BASE_URL?jackson=true" -s -o /dev/null -w "$OUTPUT_FORMAT"
99

1010
echo SQL stream
11-
curl $BASE_URL/sql-stream -s -o /dev/null -w "$OUTPUT_FORMAT"
11+
curl "$BASE_URL?stream=true" -s -o /dev/null -w "$OUTPUT_FORMAT"
12+
13+
echo SQL Jackson/stream
14+
curl "$BASE_URL?jackson=true&stream=true" -s -o /dev/null -w "$OUTPUT_FORMAT"
1215

1316
echo HQL
14-
curl $BASE_URL/hql -s -o /dev/null -w "$OUTPUT_FORMAT"
17+
curl "$BASE_URL?hql=true" -s -o /dev/null -w "$OUTPUT_FORMAT"
1518

1619
echo HQL Jackson
17-
curl $BASE_URL/hql-jackson -s -o /dev/null -w "$OUTPUT_FORMAT"
20+
curl "$BASE_URL?hql=true&jackson=true" -s -o /dev/null -w "$OUTPUT_FORMAT"
1821

1922
echo HQL stream
20-
curl $BASE_URL/hql-stream -s -o /dev/null -w "$OUTPUT_FORMAT"
23+
curl "$BASE_URL?hql=true&stream=true" -s -o /dev/null -w "$OUTPUT_FORMAT"
2124

22-
echo HQL stream/Jackson
23-
curl $BASE_URL/hql-stream-jackson -s -o /dev/null -w "$OUTPUT_FORMAT"
25+
echo HQL Jackson/stream
26+
curl "$BASE_URL?hql=true&jackson=true&stream=true" -s -o /dev/null -w "$OUTPUT_FORMAT"

httprpc-client/src/main/java/org/httprpc/beans/BeanAdapter.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,18 +335,22 @@ public int size() {
335335
@Override
336336
public Iterator<Entry<String, Object>> iterator() {
337337
return new Iterator<Entry<String, Object>>() {
338-
private Iterator<String> keys = accessors.keySet().iterator();
338+
private Iterator<Entry<String, Method>> iterator = accessors.entrySet().iterator();
339339

340340
@Override
341341
public boolean hasNext() {
342-
return keys.hasNext();
342+
return iterator.hasNext();
343343
}
344344

345345
@Override
346346
public Entry<String, Object> next() {
347-
String key = keys.next();
347+
Entry<String, Method> entry = iterator.next();
348348

349-
return new SimpleImmutableEntry<>(key, get(key));
349+
try {
350+
return new SimpleImmutableEntry<>(entry.getKey(), adapt(entry.getValue().invoke(bean), accessorCache));
351+
} catch (InvocationTargetException | IllegalAccessException exception) {
352+
throw new RuntimeException(exception);
353+
}
350354
}
351355
};
352356
}

httprpc-test/src/main/java/org/httprpc/test/EmployeeService.java

Lines changed: 72 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.hibernate.SessionFactory;
99
import org.hibernate.cfg.Configuration;
1010
import org.httprpc.RequestMethod;
11-
import org.httprpc.ResourcePath;
1211
import org.httprpc.WebService;
1312
import org.httprpc.beans.BeanAdapter;
1413
import org.httprpc.io.JSONEncoder;
@@ -34,9 +33,9 @@
3433
import java.sql.Statement;
3534
import java.util.Date;
3635
import java.util.List;
36+
import java.util.Map;
3737
import java.util.Properties;
3838
import java.util.stream.Collectors;
39-
import java.util.stream.Stream;
4039

4140
@WebServlet(urlPatterns={"/employees/*"}, loadOnStartup=1)
4241
public 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
}

httprpc-test/src/main/webapp/index.jsp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -199,16 +199,6 @@
199199
<hr/>
200200

201201
<a href="${pageContext.request.contextPath}/employees?api">Employees (API)</a><br/>
202-
<br/>
203-
<a href="${pageContext.request.contextPath}/employees/sql">Employees (SQL)</a><br/>
204-
<a href="${pageContext.request.contextPath}/employees/sql-jackson">Employees (SQL Jackson)</a><br/>
205-
<a href="${pageContext.request.contextPath}/employees/sql-stream">Employees (SQL stream)</a><br/>
206-
<br/>
207-
<a href="${pageContext.request.contextPath}/employees/hql">Employees (HQL)</a><br/>
208-
<a href="${pageContext.request.contextPath}/employees/hql-jackson">Employees (HQL Jackson)</a><br/>
209-
<a href="${pageContext.request.contextPath}/employees/hql-stream">Employees (HQL stream)</a><br/>
210-
<br/>
211-
<a href="${pageContext.request.contextPath}/employees/hql-stream-jackson">Employees (HQL stream Jackson)</a><br/>
212202

213203
</body>
214204
</html>

0 commit comments

Comments
 (0)