1
2
3
4
5 package org.astrogrid.dataservice.service.skynode.v074;
6
7 import java.io.IOException;
8 import java.io.StringWriter;
9 import java.rmi.RemoteException;
10 import javax.xml.soap.SOAPException;
11 import org.apache.axis.MessageContext;
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.astrogrid.account.LoginAccount;
15 import org.astrogrid.dataservice.queriers.QuerierPluginException;
16 import org.astrogrid.dataservice.service.AxisDataServer;
17 import org.astrogrid.dataservice.service.DataServer;
18 import org.astrogrid.query.adql.AdqlQueryMaker;
19 import org.astrogrid.slinger.mime.MimeTypes;
20 import org.astrogrid.slinger.targets.TargetMaker;
21 import org.astrogrid.xml.DomHelper;
22 import org.w3c.dom.Element;
23
24 /***
25 * SkyNode - an implementation of the SkyNode interface.
26 * This should be described in the WSDD as a message-style service, as the
27 * methods take the list
28 * of elements that are childs of the soap:Body element
29 *
30 */
31
32 public class SkyNodeService
33 {
34
35 private static Log log = LogFactory.getLog(SkyNodeService.class);
36
37 AxisDataServer server = new AxisDataServer();
38
39
40 /*** Example/test method, returns the elements sent */
41 public Element[] echo(Element[] elements) {
42 return elements;
43 }
44
45 /*** Returns string array of which formats the results can be produced in */
46 public Element[] formats(Element[] elements) throws RemoteException {
47 try {
48 String[] formats = DataServer.getFormats();
49 Element[] returns = new Element[formats.length];
50 for (int i = 0; i < formats.length; i++) {
51 returns[i] = elements[0].getOwnerDocument().createElementNS(elements[0].getNamespaceURI(), "Format");
52 }
53 return returns;
54 }
55 catch (QuerierPluginException pe) {
56 throw server.makeFault(false, "Getting formats", pe);
57 }
58 }
59
60 /*** Returns information about the given table. Case insensitive. *
61 public MetaTable table(String table) throws RemoteException {
62 try {
63 return makeMetaTable(RdbmsResourceReader.getTable(table));
64 }
65 catch (IOException e) {
66 throw server.makeFault(server.SERVERFAULT, e+" getting/parsing "+RdbmsResourceGenerator.XSI_TYPE,e);
67 }
68 }
69
70 /** Returns details about the given column *
71 public MetaColumn column(String table, String column) throws RemoteException {
72 try {
73 return makeMetaColumn(RdbmsResourceReader.getColumn(table, column));
74 }
75 catch (IOException e) {
76 throw server.makeFault(server.SERVERFAULT, e+" getting/parsing "+RdbmsResourceGenerator.XSI_TYPE,e);
77 }
78 }
79
80 /** Given a resource table element, returns a metatable object *
81 private MetaTable makeMetaTable(Element tableRes) {
82 MetaTable returns = new MetaTable();
83 returns.setName(DomHelper.getValue(DsaDomHelper.getSingleChildByTagName(tableRes, "Name")));
84 returns.setDescription(DomHelper.getValue(DsaDomHelper.getSingleChildByTagName(tableRes, "Description")));
85 return returns;
86 }
87
88 /** Given a resource column element, returns a metacolumn object *
89 private MetaColumn makeMetaColumn(Element colRes) {
90 MetaColumn returns = new MetaColumn();
91 returns.setName(DomHelper.getValue(DsaDomHelper.getSingleChildByTagName(colRes, "Name")));
92 returns.setDescription(DomHelper.getValue(DsaDomHelper.getSingleChildByTagName(colRes, "Description")));
93 returns.setUCD(DomHelper.getValue(DsaDomHelper.getSingleChildByTagName(colRes, "UCD")));
94 returns.setUnit(DomHelper.getValue(DsaDomHelper.getSingleChildByTagName(colRes, "Unit")));
95 return returns;
96 }
97
98 public ArrayOfMetaTable tables() throws RemoteException {
99 try {
100 Element[] tableRes = RdbmsResourceReader.getTables();
101 MetaTable[] meta = new MetaTable[tableRes.length];
102 for (int i = 0; i < tableRes.length; i++) {
103 meta[i] = makeMetaTable(tableRes[i]);
104 }
105 ArrayOfMetaTable returns = new ArrayOfMetaTable();
106 returns.setMetaTable(meta);
107 return returns;
108 }
109 catch (IOException e) {
110 throw server.makeFault(server.SERVERFAULT, e+" getting/parsing "+RdbmsResourceGenerator.XSI_TYPE,e);
111 }
112 }
113
114 public ArrayOfMetaColumn columns(String table) throws RemoteException {
115 try {
116 Element[] colRes = RdbmsResourceReader.getColumns(table);
117 MetaColumn[] meta = new MetaColumn[colRes.length];
118 for (int i = 0; i < colRes.length; i++) {
119 meta[i] = makeMetaColumn(colRes[i]);
120 }
121 ArrayOfMetaColumn returns = new ArrayOfMetaColumn();
122 returns.setMetaColumn(meta);
123 return returns;
124 }
125 catch (IOException e) {
126 throw server.makeFault(server.SERVERFAULT, e+" getting/parsing "+RdbmsResourceGenerator.XSI_TYPE,e);
127 }
128 }
129 */
130
131
132 public Element[] performQuery(Element[] bodyElements) throws RemoteException {
133 try {
134 MessageContext.getCurrentContext().getMessage().writeTo(System.out);
135
136 log.debug("SkyNode SOAP Message, body element 0: "+DomHelper.ElementToString(bodyElements[0]));
137 }
138 catch (SOAPException e) {}
139 catch (IOException e) {}
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168 try
169 {
170 Element performQueryElement = bodyElements[0];
171 Element[] parameters = DomHelper.getChildren(performQueryElement);
172 Element adqlElement = DomHelper.getSingleChildByTagName(parameters[0], "Select");
173
174 String requestedFormat = MimeTypes.VOTABLE;
175
176 if (parameters.length>1) {
177 requestedFormat = DomHelper.getValueOf(parameters[1]);
178 }
179
180 StringWriter sw = new StringWriter();
181 server.askQuery(LoginAccount.ANONYMOUS, AdqlQueryMaker.makeQuery(adqlElement, TargetMaker.makeTarget(sw), requestedFormat), server.getSource()+" via SkyNode");
182 Element votable = DomHelper.newDocument(sw.toString()).getDocumentElement();
183 return new Element[] { votable };
184 }
185 catch (Throwable e) {
186 throw server.makeFault(server.SERVERFAULT, e.toString()+" in performQuery()", e);
187 }
188 }
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212 }