import javax.xml.soap.*; import java.util.Iterator; import java.net.URL; import java.io.*; public class Client { public static void main(String[] args) { try { SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnectionFactory.createConnection(); SOAPFactory soapFactory = SOAPFactory.newInstance(); SOAPMessage message = prepareMessage(); URL endpoint = new URL("https://opendap.co-ops.nos.noaa.gov/axis/services/portsconditions"); SOAPMessage response = connection.call(message, endpoint); connection.close(); System.out.print("\nPrinting the message that is being sent: \n\n"); message.writeTo(System.out); System.out.println("\n\n"); /* System.out.println("\nPrinting the respone that was recieved: \n\n" ); response.writeTo(System.out); */ //Uncoment this part if you want the response to be saved locally in an XML file /* FileOutputStream fout = new FileOutputStream ("SoapResponse.xml"); response.writeTo(fout); fout.close(); */ //You can also store the response as a String /* ByteArrayOutputStream out = new ByteArrayOutputStream(); response.writeTo( out ); String str = out.toString(); */ System.out.println("\n\nIterating through the response object to get the values:\n\n"); SOAPBody responseBody = response.getSOAPBody(); //Checking for errors if (responseBody.hasFault()) { SOAPFault fault = responseBody.getFault(); String actor = fault.getFaultActor(); System.out.println("Fault contains: "); System.out.println("Fault code: " + fault.getFaultCodeAsName().getQualifiedName()); System.out.println("Fault string: " + fault.getFaultString()); if (actor != null) { System.out.println("Actor: " + actor); } } else { Iterator iterator = responseBody.getChildElements(); String tagName = null; SOAPElement se = null; Name attributeName = null; while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); iterator = se.getChildElements(); attributeName = soapFactory.createName("date"); System.out.println(" Date : " + se.getAttributeValue(attributeName)); attributeName = soapFactory.createName("portsId"); System.out.println(" Ports Id : " + se.getAttributeValue(attributeName)); attributeName = soapFactory.createName("time"); System.out.println(" Time : " + se.getAttributeValue(attributeName)); attributeName = soapFactory.createName("timeZone"); System.out.println(" Time Zone : " + se.getAttributeValue(attributeName) + "\n"); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); tagName = se.getElementName().getLocalName(); if ("definitions".equals(tagName)) { printDefinitions(se); } else if ("units".equals(tagName)) { printUnits(se); } else if ("dataSource".equals(tagName)) { System.out.println("Data Source and Disclaimer: "); System.out.println("==================== "); System.out.println("Data Source : " + se.getValue()); } else if ("dataDisclaimer".equals(tagName)) { System.out.println("Data Disclaimer : " + se.getValue()); } else if ("portsStations".equals(tagName)) { printStations(se); } else if ("observations".equals(tagName)) { printObservations(se); } } } } } catch (SOAPException e) { System.err.println("ERROR: ******* " + e.toString()); } catch (IOException io) { System.err.println("ERROR: ******* " + io.toString()); } } public static SOAPMessage prepareMessage() { SOAPMessage message = null; try { SOAPFactory soapFactory = SOAPFactory.newInstance(); MessageFactory factory = MessageFactory.newInstance(); message = factory.createMessage(); SOAPHeader header = message.getSOAPHeader(); SOAPBody body = message.getSOAPBody(); header.detachNode(); message.getMimeHeaders().addHeader("SOAPAction", ""); Name bodyName = soapFactory.createName("getPortsConditions", "ports", "https://opendap.co-ops.nos.noaa.gov/axis/services/portsconditions?wsdl"); //Constructing the body for the request SOAPBodyElement bodyElement = body.addBodyElement(bodyName); Name name = soapFactory.createName("portsId"); SOAPElement symbol = bodyElement.addChildElement(name); symbol.addTextNode("cn"); } catch (SOAPException e) { System.err.println("ERROR: ******* " + e.toString()); } return message; } public static void printObservations(SOAPElement se) { Iterator iterator = se.getChildElements();//Observations String tagName; System.out.println("\nObservations: "); System.out.println("==================== "); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); tagName = se.getElementName().getLocalName(); if ("wlMetData".equals(tagName)) { printWlMetData(se); } else if ("currentData".equals(tagName)) { printCurrentData(se); } } } public static void printCurrentData(SOAPElement se) { Iterator iterator = se.getChildElements(); String tagName; System.out.print("Current Data for Station ID: "); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); tagName = se.getElementName().getLocalName(); if ("ID".equals(tagName)) { System.out.println(se.getValue()); System.out.println("===================================="); } else if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("speed".equals(tagName)) { System.out.println("Speed : " + se.getValue()); } else if ("direction".equals(tagName)) { System.out.println("Direction : " + se.getValue()); } else if ("level".equals(tagName)) { System.out.println("Level : " + se.getValue()); } else if ("trend".equals(tagName)) { System.out.println("Trend : " + se.getValue()); } } System.out.println("\n"); } public static String addSpaces(String orig, int quantity) { StringBuffer copy = new StringBuffer(orig); while (copy.length() < quantity) { copy.append(' '); } return copy.toString(); } public static void printStations(SOAPElement se) { Iterator iterator1 = null; Iterator iterator = se.getChildElements();//portsStations String tagName; System.out.println("\nStations: "); System.out.println("==================== "); System.out.println("ID \t" + addSpaces("Name", 80) + "Latitude\tLongitude"); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("ID".equals(tagName)) { System.out.print(addSpaces(se.getValue(), 8)); } else if ("name".equals(tagName)) { System.out.print("\t" + addSpaces(se.getValue(), 80)); } else if ("latitude".equals(tagName)) { System.out.print(se.getValue()); } else if ("longitude".equals(tagName)) { System.out.println("\t\t" + se.getValue()); } } } System.out.println("\n"); } public static void printWlMetData(SOAPElement se) { Iterator iterator1 = null; Iterator iterator = se.getChildElements(); String tagName; System.out.print("Water Level - Met Data for Station ID: "); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); tagName = se.getElementName().getLocalName(); if ("ID".equals(tagName)) { System.out.println(se.getValue()); System.out.println("=============================================== "); } else if ("waterLevel".equals(tagName)) { System.out.println("***Water Level*** "); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("observed".equals(tagName)) { System.out.println("observed : " + se.getValue()); } else if ("trend".equals(tagName)) { System.out.println("Trend : " + se.getValue()); } } } else if ("airTemperature".equals(tagName)) { System.out.println("***Air Temperature*** "); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("airTemp".equals(tagName)) { System.out.println("Air Temperature : " + se.getValue()); } } } else if ("waterTemperature".equals(tagName)) { System.out.println("***Water Temperature*** "); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("waterTemp".equals(tagName)) { System.out.println("Water Temperature : " + se.getValue()); } } } else if ("barometricPressure".equals(tagName)) { System.out.println("***Barometric Pressure*** "); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("pressure".equals(tagName)) { System.out.println("Pressure : " + se.getValue()); } else if ("trend".equals(tagName)) { System.out.println("Trend : " + se.getValue()); } } } else if ("salinity".equals(tagName)) { System.out.println("***Salinity*** "); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("wSalinity".equals(tagName)) { System.out.println("Salinity : " + se.getValue()); } } } else if ("airGap".equals(tagName)) { System.out.println("***Air Gap*** "); iterator1 = se.getChildElements(); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("clearance".equals(tagName)) { System.out.println("Clearance : " + se.getValue()); } else if ("trend".equals(tagName)) { System.out.println("Trend : " + se.getValue()); } } } else if ("wind".equals(tagName)) { iterator1 = se.getChildElements(); System.out.println("***Wind*** "); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("speed".equals(tagName)) { System.out.println("Speed : " + se.getValue()); } else if ("direction".equals(tagName)) { System.out.println("Direction : " + se.getValue()); } else if ("gust".equals(tagName)) { System.out.println("Gust : " + se.getValue()); } } } } System.out.println("\n"); } public static void printDefinitions(SOAPElement se) { Iterator iterator = se.getChildElements(); String tagName; System.out.println("Definitions: "); System.out.println("==================== "); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); tagName = se.getElementName().getLocalName(); if ("level".equals(tagName)) { System.out.println("Level : " + se.getValue()); } else if ("datum".equals(tagName)) { System.out.println("Datum : " + se.getValue()); } else if ("trend".equals(tagName)) { System.out.println("trend : " + se.getValue()); } else if ("missingValue".equals(tagName)) { System.out.println("Missing Value : " + se.getValue()); } } System.out.println("\n"); } public static void printUnits(SOAPElement se) { Iterator iterator1 = null; Iterator iterator = se.getChildElements(); String tagName; System.out.println("Units: "); System.out.println("==================== "); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); tagName = se.getElementName().getLocalName(); if ("timeStamp".equals(tagName)) { System.out.println("Time Stamp : " + se.getValue()); } else if ("waterLevel ".equals(tagName)) { System.out.println("Water Level : " + se.getValue()); } else if ("airTemperature".equals(tagName)) { System.out.println("Air Temperature : " + se.getValue()); } else if ("waterTemperature".equals(tagName)) { System.out.println("Water Temperature : " + se.getValue()); } else if ("barometricPressure".equals(tagName)) { System.out.println("Barometric Pressure : " + se.getValue()); } else if ("airGap".equals(tagName)) { System.out.println("Air Gap : " + se.getValue()); } else if ("salinity".equals(tagName)) { System.out.println("Salinity : " + se.getValue()); } else if ("windUnits".equals(tagName)) { iterator1 = se.getChildElements(); System.out.println("**Wind** "); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("speed".equals(tagName)) { System.out.println("Speed : " + se.getValue()); } else if ("direction".equals(tagName)) { System.out.println("Direction : " + se.getValue()); } else if ("gust".equals(tagName)) { System.out.println("Gust : " + se.getValue()); } } } else if ("current".equals(tagName)) { iterator1 = se.getChildElements(); System.out.println("**Current** "); while (iterator1.hasNext()) { se = (SOAPElement) iterator1.next(); tagName = se.getElementName().getLocalName(); if ("speed".equals(tagName)) { System.out.println("speed : " + se.getValue()); } else if ("direction".equals(tagName)) { System.out.println("Direction : " + se.getValue()); } } } } System.out.println("\n"); } } /********************** * >java Client Printing the message that is being sent: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <ports:getPortsConditions xmlns:ports="https://opendap.co-ops.nos.noaa.gov/axis/webservices/portsconditions/wsdl"> <portsId>cn</portsId> </ports:getPortsConditions> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Iterating through the response object to get the values: Date : 20140604 Ports Id :Chesapeake Bay North PORTS Time : 12:47 Time Zone : EDT //This time is the local time for PORTS while all the data is in GMT Definitions: ==================== Level : Real time bin for the current instrument Datum : 0 = MLLW, 1 = IGLD, 2 = CRD, 4 = STD trend : 0 = Steady (Slack), 1 = decreasing (Ebbing), 2 = increasing (Flooding), 3 = undefined Missing Value : -999.999 = indicates that there was no reading recorded Units: ==================== Time Stamp : Timestamp of all data is in GMT Air Temperature : Air temperature is in degrees centigrade Water Temperature : Water temperature is in degrees centigrade **Wind** Speed : Wind speed is in meters per second Direction : Wind direction is in degrees (true) Gust : Wind gust is in meters per second Barometric Pressure : Barometric pressure is in millibars Air Gap : Clearance is in meters Salinity : Salinity is in psu -- parts per thousand **Current** speed : Current speed is in knots Direction : Current direction is in degrees (true) Data Source and Disclaimer: ==================== Data Source : USDOC/NOAA/NOS/CO-OPS (Center for Operational Oceanographic Products and Services) Data Disclaimer : These raw data have not been subjected to the National Ocean Service's quality control or quality assurance procedures and do not meet the criteria and standards of official National Ocean Service data. They are released for limited public use as preliminary data to be used only with appropriate caution. Stations: ==================== ID Name Latitude Longitude 8632837 Rapp. Lt Front Range 37.538 -76.015 8636580 Windmill Point 37.615 -76.29 8635750 Lewisetta 37.996 -76.464 8578240 Piney Point 38.133 -76.533 8577330 Solomons Island 38.317 -76.452 cb1001 Cove Point LNG Pier Currents 38.403 -76.384 8577018 Cove Point LNG Pier 38.404 -76.385 8594900 Washington D.C. 38.873 -77.022 tplm2 Thomas Pt Light 38.899 -76.436 8575512 Annapolis 38.983 -76.482 8575432 Chesapeake Bay Brdg 38.993 -76.382 8573364 Tolchester Beach 39.213 -76.245 8574729 NE Tower 39.22 -76.525 8574728 Baltimore Key Bridge 39.22 -76.528 8574680 Baltimore 39.267 -76.578 8573927 Chesapeake City 39.527 -75.81 8573928 Ches. City Bridge 39.527 -75.81 cb1301 Chesapeake City Currents 39.531 -75.828 8551910 Reedy Point 39.558 -75.573 db0201 Reedy Point (pred) 39.559 -75.552 8551911 Reedy Point Bridge 39.56 -75.568 cb0901 Potomac R MCh LWB B 38.115 -76.531 cb1201 Tolch. Front Range 39.141 -76.33 cb0801 Rapp. Shl Ch LBB 60 37.674 -76.155 cb1101 Chesapeake Ch LBB 92 38.982 -76.385 Observations: ==================== Water Level - Met Data for Station ID: 8551911 =============================================== Water Level - Met Data for Station ID: 8551910 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:42:00.0 observed : 0.629 Trend : 2 ***Water Temperature*** Time Stamp : 2014-06-04 16:42:00.0 Water Temperature : 21.5 ***Air Temperature*** Time Stamp : 2014-06-04 16:42:00.0 Air Temperature : 26.2 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:42:00.0 Pressure : 1009.8 Trend : 1 Water Level - Met Data for Station ID: 8573928 =============================================== ***Air Gap*** Time Stamp : 2014-06-04 16:30:00.0 Clearance : 43.357 Trend : 1 Water Level - Met Data for Station ID: 8573927 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:36:00.0 observed : 0.497 Trend : 2 ***Water Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Water Temperature : 22.5 ***Air Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Air Temperature : 26.0 ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 1.898 Direction : 328.0 Gust : 5.0 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:36:00.0 Pressure : 1009.8 Trend : 1 Water Level - Met Data for Station ID: 8574680 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:36:00.0 observed : 0.554 Trend : 1 ***Water Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Water Temperature : 23.7 ***Air Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Air Temperature : 26.7 ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 3.802 Direction : 10.29 Gust : 4.7 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:36:00.0 Pressure : 1010.0 Trend : 1 ***Salinity*** Time Stamp : 2014-06-04 16:36:00.0 Salinity : 1.82 Water Level - Met Data for Station ID: 8574729 =============================================== ***Air Temperature*** Time Stamp : 2014-06-04 16:30:00.0 Air Temperature : 26.7 ***Wind*** Time Stamp : 2014-06-04 16:30:00.0 Speed : 0.478 Direction : 240.97 Gust : 1.0 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:30:00.0 Pressure : 1010.4 Trend : 1 Water Level - Met Data for Station ID: 8574728 =============================================== ***Air Temperature*** Time Stamp : 2014-06-04 16:42:00.0 Air Temperature : 27.0 ***Wind*** Time Stamp : 2014-06-04 16:42:00.0 Speed : 0.201 Direction : 107.0 Gust : 0.6 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:42:00.0 Pressure : 1010.5 Trend : 1 Water Level - Met Data for Station ID: 8573364 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:36:00.0 observed : 0.54 Trend : 0 ***Water Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Water Temperature : 21.7 ***Air Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Air Temperature : 25.0 ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 0.7 Direction : 337.0 Gust : 0.9 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:36:00.0 Pressure : 1010.8 Trend : 1 Water Level - Met Data for Station ID: 8575432 =============================================== ***Air Gap*** Time Stamp : 2014-06-04 16:36:00.0 Clearance : 57.203 Trend : 1 Water Level - Met Data for Station ID: 8575512 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:30:00.0 observed : 0.479 Trend : 1 ***Air Temperature*** Time Stamp : 2014-06-04 16:30:00.0 Air Temperature : 24.8 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:30:00.0 Pressure : 1010.3 Trend : 1 Water Level - Met Data for Station ID: tplm2 =============================================== Water Level - Met Data for Station ID: 8594900 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:36:00.0 observed : 0.949 Trend : 2 ***Water Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Water Temperature : 22.8 ***Air Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Air Temperature : 28.4 ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 2.243 Direction : 265.05 Gust : 3.2 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:36:00.0 Pressure : 1010.1 Trend : 1 Water Level - Met Data for Station ID: 8577018 =============================================== ***Air Temperature*** Time Stamp : 2014-06-04 16:42:00.0 Air Temperature : 23.3 ***Wind*** Time Stamp : 2014-06-04 16:42:00.0 Speed : 2.3 Direction : 348.0 Gust : 2.5 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:42:00.0 Pressure : 1010.7 Trend : 1 Water Level - Met Data for Station ID: 8577330 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:30:00.0 observed : 0.288 Trend : 1 ***Water Temperature*** Time Stamp : 2014-06-04 16:30:00.0 Water Temperature : 21.1 Water Level - Met Data for Station ID: 8578240 =============================================== ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 2.001 Direction : 269.0 Gust : 2.1 Water Level - Met Data for Station ID: 8635750 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:36:00.0 observed : 0.238 Trend : 1 ***Water Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Water Temperature : 22.8 ***Air Temperature*** Time Stamp : 2014-06-04 16:36:00.0 Air Temperature : 26.1 ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 1.739 Direction : 66.29 Gust : 2.4 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:36:00.0 Pressure : 1010.6 Trend : 1 ***Salinity*** Time Stamp : 2014-06-04 16:36:00.0 Salinity : 8.72 Water Level - Met Data for Station ID: 8636580 =============================================== ***Water Level*** Time Stamp : 2014-06-04 16:36:00.0 observed : 0.304 Trend : 2 Water Level - Met Data for Station ID: 8632837 =============================================== ***Wind*** Time Stamp : 2014-06-04 16:36:00.0 Speed : 1.698 Direction : 335.0 Gust : 6.6 ***Barometric Pressure*** Time Stamp : 2014-06-04 16:36:00.0 Pressure : 1011.3 Trend : 1 Current Data for Station ID: cb0801 ==================================== Time Stamp : -999 Speed : -999.999 Direction : -999.999 Level : -999 Trend : -999 Current Data for Station ID: cb0901 ==================================== Time Stamp : 2014-06-04 16:35:00.0 Speed : 0.377 Direction : 109.0 Level : 4 Trend : 1 Current Data for Station ID: cb1001 ==================================== Time Stamp : 2014-06-04 16:34:00.0 Speed : 0.535 Direction : 149.0 Level : 14 Trend : 1 Current Data for Station ID: cb1101 ==================================== Time Stamp : 2014-06-04 16:35:00.0 Speed : 0.29 Direction : 34.0 Level : 4 Trend : 2 Current Data for Station ID: cb1201 ==================================== Time Stamp : 2014-06-04 16:34:00.0 Speed : 0.432 Direction : 353.0 Level : 4 Trend : 2 Current Data for Station ID: cb1301 ==================================== Time Stamp : -999 Speed : -999.999 Direction : -999.999 Level : -999 Trend : -999 Current Data for Station ID: db0201 ==================================== Time Stamp : 2014-06-04 16:47:00.0 Speed : 0.87 Direction : 179.0 Level : 14 Trend : 1 */