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}