1
2
3
4
5
6
7 package org.astrogrid.dataservice.queriers;
8
9 import java.io.IOException;
10 import java.lang.reflect.Constructor;
11 import java.lang.reflect.InvocationTargetException;
12 import java.security.Principal;
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.astrogrid.cfg.ConfigException;
16 import org.astrogrid.cfg.ConfigFactory;
17 import org.astrogrid.dataservice.DatacenterException;
18 import org.astrogrid.dataservice.queriers.status.QuerierProcessingResults;
19 import org.astrogrid.dataservice.queriers.status.QuerierStatus;
20 import org.astrogrid.query.returns.ReturnSpec;
21 import org.astrogrid.query.returns.ReturnTable;
22 import org.astrogrid.slinger.sourcetargets.UrlSourceTarget;
23 import org.astrogrid.slinger.targets.TargetIdentifier;
24 import org.astrogrid.tableserver.out.FilteredTableWriter;
25 import org.astrogrid.tableserver.out.HtmlTableWriter;
26 import org.astrogrid.tableserver.out.TableWriter;
27 import org.astrogrid.tableserver.out.VoTableWriter;
28 import org.astrogrid.tableserver.out.XsvTableWriter;
29
30 /*** A container interface that holds the results of a query that is in some
31 * way a table. Implementations might be SqlResults.
32 *
33 * @author M Hill
34 */
35
36 public abstract class TableResults implements QueryResults
37 {
38
39 Log log = LogFactory.getLog(TableResults.class);
40
41 public final static String TABLE_FILTERS_KEY = "datacenter.table.filter";
42
43 protected Querier querier = null;
44
45 /*** Construct with a link to the Querier that spawned these results, so we
46 * can include info from it if need be */
47 public TableResults(Querier parentQuerier) {
48 this.querier = parentQuerier;
49 }
50
51 /*** Subclasses implement suitable ways of writing their results to the given TableWriter */
52 public abstract void writeTable(TableWriter tableWriter, QuerierStatus statusToUpdate) throws IOException;
53
54
55 /*** returns the formats that this result implementation can produce (ie VOTABLE, HTML, CSV, etc) */
56 public static String[] listFormats() {
57 return new String[] { ReturnTable.VOTABLE, ReturnTable.CSV, ReturnTable.HTML };
58 }
59
60 /*** Returns the number of results - or -1 if unknown */
61 public abstract int getCount() throws IOException;
62
63 /*** This is a helper method for plugins; it is meant to be called
64 * from the askQuery method. It transforms the results and sends them
65 * as required, updating the querier status appropriately.
66 */
67 public void send(ReturnSpec returns, Principal user) throws IOException {
68 if (returns instanceof ReturnTable) {
69 sendTable( (ReturnTable) returns, user);
70 }
71 else {
72 throw new UnsupportedOperationException("Unknown return type "+returns.getClass().getName());
73 }
74 }
75
76 /*** Subclasses override to make spocial table writers. requested format is given
77 * as a mime type*/
78 public TableWriter makeTableWriter(TargetIdentifier target, String requestedFormat, Principal user) throws IOException {
79
80 if (requestedFormat.equals(ReturnTable.VOTABLE)) {
81 return new VoTableWriter(target, "Query Results", user);
82 }
83 else if (requestedFormat.equals(ReturnTable.CSV)) {
84 return new XsvTableWriter(target, "Query Results", ",", user);
85 }
86 else if (requestedFormat.equals(ReturnTable.TSV)) {
87 return new XsvTableWriter(target, "Query Results", "\t", user);
88 }
89 else if (requestedFormat.equals(ReturnTable.HTML)) {
90 return new HtmlTableWriter(target, "Query Results", querier.getQuery().toHTMLString(), user);
91 }
92
93
94
95
96
97
98 else if (requestedFormat.equals(ReturnTable.DEFAULT)) {
99 return new VoTableWriter(target, "Query Results", user);
100 }
101 else {
102 throw new IllegalArgumentException("Unknown results format "+requestedFormat+" given");
103 }
104 }
105
106 /*** Sends a table */
107 public void sendTable(ReturnTable returns, Principal user) throws IOException {
108
109 QuerierProcessingResults status = new QuerierProcessingResults(querier.getStatus());
110 querier.setStatus(status);
111
112 log.info(querier+", sending results to "+returns);
113
114 TargetIdentifier target = returns.getTarget();
115 String format = returns.getFormat();
116
117 if (target == null) {
118 throw new DatacenterException("No Target given for results");
119 }
120
121 status.setMessage("Sending results to "+target.toString()+" as "+format);
122
123 TableWriter tableWriter = makeTableWriter(target, format, user);
124
125
126 Class filterClass = ConfigFactory.getCommonConfig().getClass(TABLE_FILTERS_KEY, null);
127 if (filterClass != null) {
128
129 tableWriter = makeTableWriter(filterClass, tableWriter);
130 }
131
132
133 writeTable(tableWriter, status);
134
135 if (querier.isAborted()) {
136 return;
137 }
138
139 String s = "Results sent as table ("+format+") to ";
140
141 if (target instanceof UrlSourceTarget) {
142 s =s+"<a href='ViewFile?"+((UrlSourceTarget) target).toURI()+"'>"+target+"</a>";
143 }
144 else {
145 s =s+target;
146 }
147
148 status.addDetail(s);
149 status.setMessage("");
150
151 log.info(querier+" results sent");
152 }
153
154
155 public TableWriter makeTableWriter(Class filter, TableWriter writer) {
156 if (!filter.isInstance(FilteredTableWriter.class)) {
157 throw new ConfigException("tablewriter filter class given by "+TABLE_FILTERS_KEY+" is not a FilteredTableWriter");
158 }
159 try {
160 Constructor constr = filter.getConstructor(new Class[] { TableWriter.class });
161 return (TableWriter) constr.newInstance(new Object[] { writer } );
162 }
163 catch (NoSuchMethodException nsme) {
164 throw new ConfigException("Class "+filter+" given by "+TABLE_FILTERS_KEY+" must extend FilteredTableWriter and have a constructor that takes only a TableWriter");
165 }
166 catch (InvocationTargetException e) {
167 throw new ConfigException("Class "+filter+" given by "+TABLE_FILTERS_KEY+" fails to construct",e);
168 }
169 catch (IllegalAccessException e) {
170 throw new ConfigException("Class "+filter+" given by "+TABLE_FILTERS_KEY+" fails to construct",e);
171 }
172 catch (InstantiationException e) {
173 throw new ConfigException("Class "+filter+" given by "+TABLE_FILTERS_KEY+" fails to construct",e);
174 }
175 }
176
177 }
178
179
180
181