1919import jakarta .servlet .http .HttpServletRequest ;
2020import jakarta .servlet .http .HttpServletResponse ;
2121import org .httprpc .kilo .PageServlet ;
22+ import org .httprpc .kilo .Required ;
2223import org .httprpc .kilo .WebService ;
24+ import org .httprpc .kilo .beans .BeanAdapter ;
2325import org .httprpc .kilo .io .CSVEncoder ;
24- import org .httprpc .kilo .io .TemplateEncoder ;
2526import org .httprpc .kilo .sql .QueryBuilder ;
27+ import org .httprpc .kilo .util .concurrent .Pipe ;
2628
2729import javax .naming .Context ;
2830import javax .naming .InitialContext ;
3234import java .sql .Connection ;
3335import java .sql .SQLException ;
3436import java .util .ResourceBundle ;
37+ import java .util .concurrent .ExecutorService ;
38+ import java .util .concurrent .Executors ;
3539
3640import static org .httprpc .kilo .util .Collections .*;
41+ import static org .httprpc .kilo .util .Iterables .*;
3742import static org .httprpc .kilo .util .Optionals .*;
3843
3944@ WebServlet ("/pets/stream" )
4045public class PetServlet extends PageServlet {
46+ private interface Parameters {
47+ @ Required
48+ String getOwner ();
49+ }
50+
4151 private DataSource dataSource = null ;
4252
53+ private static ExecutorService executorService = Executors .newCachedThreadPool ();
54+
4355 @ Override
4456 public void init () throws ServletException {
4557 super .init ();
@@ -60,50 +72,47 @@ protected Connection openConnection() throws SQLException {
6072 }
6173
6274 @ Override
63- protected void process (HttpServletRequest request , HttpServletResponse response ) throws IOException {
64- var accept = map (request .getHeader ("Accept" ), String ::toLowerCase );
65-
66- if (accept == null ) {
67- return ;
68- }
75+ protected Object execute () {
76+ var parameters = getParameters (Parameters .class );
6977
70- var owner = request . getParameter ( "owner" );
78+ var owner = parameters . getOwner ( );
7179
72- if (owner == null ) {
73- return ;
74- }
80+ var pipe = new Pipe <Pet >();
7581
76- var queryBuilder = QueryBuilder .select (Pet .class )
77- .filterByForeignKey (Owner .class , "owner" )
78- .ordered (true );
82+ var connection = getConnection ();
7983
80- try (var statement = queryBuilder .prepare (getConnection ());
81- var results = queryBuilder .executeQuery (statement , mapOf (
82- entry ("owner" , owner )
83- ))) {
84- if (accept .startsWith (WebService .TEXT_HTML )) {
85- response .setContentType (WebService .TEXT_HTML );
84+ executorService .submit (() -> {
85+ var queryBuilder = QueryBuilder .select (Pet .class )
86+ .filterByForeignKey (Owner .class , "owner" )
87+ .ordered (true );
8688
87- var type = getClass ();
89+ try (var statement = queryBuilder .prepare (connection );
90+ var results = queryBuilder .executeQuery (statement , mapOf (
91+ entry ("owner" , owner )
92+ ))) {
93+ pipe .submit (mapAll (results , BeanAdapter .toType (Pet .class )));
94+ } catch (SQLException exception ) {
95+ throw new RuntimeException (exception );
96+ }
97+ });
8898
89- var templateEncoder = new TemplateEncoder (type , String .format ("%s.html" , type .getSimpleName ()));
99+ return pipe ;
100+ }
90101
91- templateEncoder .setResourceBundle (ResourceBundle .getBundle (type .getName (), request .getLocale ()));
102+ @ Override
103+ protected void encodeResult (HttpServletRequest request , HttpServletResponse response , Object result ) throws IOException {
104+ var accept = map (request .getHeader ("Accept" ), String ::toLowerCase );
92105
93- templateEncoder .write (results , response .getWriter ());
94- } else if (accept .startsWith (WebService .TEXT_CSV )) {
95- response .setContentType (WebService .TEXT_CSV );
106+ if (accept != null && accept .equals (WebService .TEXT_CSV )) {
107+ response .setContentType (WebService .TEXT_CSV );
96108
97- var csvEncoder = new CSVEncoder (listOf ("name" , "species" , "sex" , "birth" , "death" ));
109+ var csvEncoder = new CSVEncoder (listOf ("name" , "species" , "sex" , "birth" , "death" ));
98110
99- csvEncoder .setResourceBundle (ResourceBundle .getBundle (getClass ().getName (), request .getLocale ()));
111+ csvEncoder .setResourceBundle (ResourceBundle .getBundle (getClass ().getName (), request .getLocale ()));
100112
101- csvEncoder .write (results , response .getWriter ());
102- } else {
103- response .setStatus (HttpServletResponse .SC_NOT_ACCEPTABLE );
104- }
105- } catch (SQLException exception ) {
106- throw new RuntimeException (exception );
113+ csvEncoder .write ((Iterable <?>)result , response .getWriter ());
114+ } else {
115+ super .encodeResult (request , response , result );
107116 }
108117 }
109118}
0 commit comments