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