View Javadoc

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