1public class XQueryMocker implements JavaClassSequence {
 2
 3    private final ParameterizedRowMapper<Subscription> mapper = new ParameterizedRowMapper<Subscription>() {
 4        public Subscription mapRow(ResultSet rs, int rowNum) throws SQLException {
 5            Subscription sub = new Subscription();
 6            sub.id = rs.getString("id");
 7            sub.startdate = rs.getTimestamp("startdate");
 8            sub.enddate = rs.getTimestamp("enddate");
 9            sub.category = rs.getInt("category");
10            sub.username = rs.getString("username");
11            sub.etag = rs.getString("etag");
12            return sub;
13        }
14    };
15
16    public void init(Configuration config) {
17        // any setup stuff
18    }
19
20    public void destroy() {
21        // any completion stuff
22    }
23
24    public void execute(Message msg, Mediation mediation) throws Exception {
25
26        Message res = msg.createDefaultResponseMessage();
27        String method = (String) msg.getMessageProperty(HttpConstants.METHOD);
28
29        if ("GET".equals(method)) {
30
31            // get etag from request, and query parameters
32            String clientETag = msg.getFirstTransportHeader("If-None-Match");
33            @SuppressWarnings("unchecked")
34            Map<String, String> params = (Map<String, String>) msg.getMessageProperty(HttpConstants.QUERY_PARAM_MAP);
35
36            if (clientETag != null) {
37                SimpleJdbcTemplate t = new SimpleJdbcTemplate(mediation.getDataSource("dataSource"));
38                String serverETag = t.queryForObject("SELECT ETAG FROM SUBSCRIPTION WHERE ID = ?", String.class, new Object[]{params.get("id")});
39
40                if (clientETag.equals(serverETag)) {
41                    mediation.sendResponse(msg, 304);
42                    return;
43                }
44            }
45
46            // if client did not send a if-none-match header, or if the etag sent did not match the latest on DB
47            SimpleJdbcTemplate t = new SimpleJdbcTemplate(mediation.getDataSource("dataSource"));
48            Subscription sub = t.queryForObject("SELECT * FROM SUBSCRIPTION WHERE ID = ?", mapper, params.get("id"));
49            Map<String, Object> vars = new HashMap<String, Object>();
50            if (sub != null) {
51                vars.put("id", sub.id);
52                vars.put("startdate", sub.startdate.toString());
53                vars.put("enddate", sub.enddate.toString());
54                vars.put("category", sub.category);
55                vars.put("username", sub.username);
56            }
57
58            XQuerySupport xq = mediation.getSpringBean("xq", XQuerySupport.class);
59            xq.transformMessage(res, "samples/resources/sample1.xq", vars);
60            if (sub != null) {
61                res.addTransportHeader("ETag", sub.etag);
62            }
63            mediation.sendResponse(res, 200);
64
65        } else if ("POST".equals(method)) {
66
67            XQuerySupport xq = mediation.getSpringBean("xq", XQuerySupport.class);
68
69            Map<String, Object> vars = new HashMap<String, Object>();
70
71            if (msg.getCurrentPayload() instanceof DOMMessage) {
72                vars.put("payload", (((DOMMessage) msg.getCurrentPayload()).getDocument()));
73            } else {
74                DOMMessage domMessage = new DOMMessage(msg.getCurrentPayload());
75                vars.put("payload", domMessage.getDocument());
76            }
77
78            String[][] ns = {{"m0", "http://mock.samples/"}};
79            String paid = mediation.extractAsStringUsingXPath(msg, "//m0:updateSubscription/m0:amountPaid", ns);
80            vars.put("balance", Double.valueOf(paid) + 1550.33);
81
82            xq.transformMessage(res, "samples/resources/sample2.xq", vars);
83            mediation.sendResponse(res, 200);
84        }
85    }
86
87    static class Subscription {
88        String id;
89        Date startdate;
90        Date enddate;
91        int category;
92        String username;
93        String etag;
94    }
95}