01: package org.makumba.list.engine.valuecomputer;
02:
03: import javax.servlet.jsp.PageContext;
04:
05: import org.makumba.LogicException;
06: import org.makumba.analyser.PageCache;
07: import org.makumba.commons.MultipleKey;
08: import org.makumba.commons.formatters.RecordFormatter;
09: import org.makumba.list.engine.ComposedQuery;
10: import org.makumba.list.engine.QueryExecution;
11: import org.makumba.list.html.RecordViewer;
12: import org.makumba.list.tags.QueryTag;
13:
14: /**
15: * The ValueComputer of a queryMak:value
16: *
17: * @author Cristian Bogdan
18: */
19: public abstract class QueryValueComputer extends ValueComputer {
20:
21: /** The key of the generated query */
22: MultipleKey queryKey;
23:
24: /**
25: * Makes a key that adds the given keyDifference to the tagKey of the parentList, and associates with it a subquery
26: * of the parentQuery made from the given queryProps.
27: *
28: * @param analyzed
29: * the analyzed tag
30: * @param keyDifference
31: * @param queryProps
32: * @param expr
33: * @param pageCache
34: * the page cache of the current page
35: */
36: public void makeQueryAtAnalysis(MultipleKey parentListKey,
37: String keyDifference, String[] queryProps, String expr,
38: PageCache pageCache) {
39: this .expr = expr;
40:
41: parentKey = parentListKey;
42:
43: queryKey = new MultipleKey(parentKey, keyDifference);
44:
45: QueryTag.cacheQuery(pageCache, queryKey, queryProps, parentKey)
46: .checkProjectionInteger(expr);
47: }
48:
49: /** The key of the query in which this value is a projection. Returns queryKey */
50: MultipleKey getQueryKey() {
51: return queryKey;
52: }
53:
54: /**
55: * If other ValueComputers sharing the same valueQuery did not analyze it yet, we analyze it here.
56: * @param pageCache
57: * the page cache of the current page
58: */
59: public void doEndAnalyze(PageCache pageCache) {
60: if (pageCache.retrieve(RecordFormatter.FORMATTERS, queryKey) == null) {
61: ComposedQuery myQuery = QueryTag.getQuery(pageCache,
62: queryKey);
63: myQuery.analyze();
64: pageCache.cache(RecordFormatter.FORMATTERS, queryKey,
65: new RecordViewer(myQuery));
66: }
67: super .doEndAnalyze(pageCache);
68: }
69:
70: static final Object dummy = new Object();
71:
72: /**
73: * Obtains the iterationGroupData for the valueQuery
74: *
75: * @param running
76: * the tag that is currently running
77: * @throws LogicException
78: * @return The QueryExecution that will give us the data
79: */
80: QueryExecution runQuery(PageContext pageContext)
81: throws LogicException {
82: QueryExecution ex = QueryExecution.getFor(queryKey,
83: pageContext, null, null);
84:
85: QueryExecution parentEx = QueryExecution.getFor(parentKey,
86: pageContext, null, null);
87:
88: // if the valueQuery's iterationGroup for this parentIteration was not computed, do it now...
89: if (parentEx.valueQueryData.get(queryKey) == null) {
90: ex.getIterationGroupData();
91:
92: // ... and make sure it won't be done this parentIteration again
93: parentEx.valueQueryData.put(queryKey, dummy);
94: }
95: return ex;
96: }
97: }
|