View Javadoc

1   /*
2    * $Id: TableResults.java,v 1.10 2006/06/15 16:50:08 clq2 Exp $
3    *
4    * (C) Copyright Astrogrid...
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  //      else if (requestedFormat.equals(ReturnCount.COUNT)) {
93  //         return new HtmlTableWriter(target, "Query Results", querier.getQuery().toString(), user);
94  //      }
95  //      else if (format.equals(ReturnTable.FITS)) {
96  //         tableWriter = new StilStarTableWriter(new FitsTableWriter(), out);
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       //add  a filteredtablewriters if any
126       Class filterClass = ConfigFactory.getCommonConfig().getClass(TABLE_FILTERS_KEY,  null);
127       if (filterClass != null) {
128          //wrap plugin around existing one
129          tableWriter = makeTableWriter(filterClass, tableWriter);
130       }
131 
132       //call overridden method that will know what form the data is in
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