View Javadoc

1   /*
2    * $Id: SkyNodeService.java,v 1.3 2006/06/15 16:50:10 clq2 Exp $
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 //implements SkyNodeSoap
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) {} //ignore
140        catch (IOException e) {} //ignore
141       /*
142        if (!select.getLocalName().equals("Select")) {
143        try {
144        MessageContext.getCurrentContext().getMessage().writeTo(System.out);
145        }
146        catch (SOAPException e) {} //ignore
147        catch (IOException e) {} //ignore
148        throw server.makeFault(server.SERVERFAULT, "First parameter (ADQL element) is '"+select.getLocalName()+"', should be 'Select'", null);
149        }
150        */
151        /*
152       //manky thing to get the adql document without having to re/unmarshall the SelectType object model
153       SOAPMessage message = MessageContext.getCurrentContext().getMessage();
154       Element adqlElement = null;
155       try
156       {
157          Iterator children = message.getSOAPPart().getEnvelope().getBody().getChildElements();
158          while (children.hasNext() && (adqlElement == null)) {
159             RPCElement child = (RPCElement) children.next();
160             log.debug("body child: "+child+" ("+child.getClass()+")");
161             adqlElement = DsaDomHelper.getSingleChildByTagName(child.getAsDOM(), "Select");
162          }
163       }
164       catch (Throwable e) {
165          throw server.makeFault(server.SERVERFAULT, e.toString()+" in performQuery()", e);
166       }
167         */
168       //normal bit - carry out the query
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          //server.askQuery(LoginAccount.ANONYMOUS, AdqlQueryMaker.makeQuery(adqlElement, new WriterTarget(sw), requestedFormat), server.getSource()+" via SkyNode");
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    public Availability getAvailability() throws RemoteException {
197       throw server.makeFault("Method not implemented");
198    }
199    
200    public float queryCost(long planid, SelectType select) throws RemoteException {
201       throw server.makeFault("Method not implemented");
202    }
203    
204    public ArrayOfMetaFunction functions() throws RemoteException {
205       throw server.makeFault("Method not implemented");
206    }
207 
208    public VOData executePlan(ExecPlan plan) throws RemoteException {
209       throw server.makeFault("Method not implemented");
210    }
211    
212    public RegionType footprint(RegionType region) throws RemoteException {
213       throw server.makeFault("Method not implemented");
214    }
215     */
216    
217 }