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/SurveyCurrents");
            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();
                Iterator iterator2 = null;
                Iterator iterator3 = null;

                String tagName = null;
                SOAPElement se = null;

                if (iterator.hasNext()) {
                    se = (SOAPElement) iterator.next();
                    iterator = se.getChildElements();
                    while (iterator.hasNext()) {
                        se = (SOAPElement) iterator.next();
                        printMetadata(se);
                        tagName = se.getElementName().getLocalName();
                        if ("data".equals(tagName)) {
                            iterator2 = se.getChildElements();
                            while (iterator2.hasNext()) {
                                se = (SOAPElement) iterator2.next();
                                iterator3 = se.getChildElements();
                                while (iterator3.hasNext()) {
                                    se = (SOAPElement) iterator3.next();
                                    printData(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("getCurrentsAndMetadata", "csd",
                    "https://opendap.co-ops.nos.noaa.gov/axis/webservices/currents/wsdl");
            SOAPBodyElement bodyElement = body.addBodyElement(bodyName);

            //Constructing the body for the request
            Name name = soapFactory.createName("stationId");
            SOAPElement symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("COI0502");
            name = soapFactory.createName("beginDate");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("20050528 00:00");
            name = soapFactory.createName("endDate");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("20050528 00:18");
             name = soapFactory.createName("binNumber");
            symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("1"); 

        } catch (SOAPException e) {
            System.err.println("ERROR: ******* " + e.toString());
        }
        return message;
    }

    public static void printMetadata(SOAPElement se) {
        String tagName = se.getElementName().getLocalName();
        if (tagName != null) {
            if ("stationId".equals(tagName)) {
                System.out.println("Printing Metadata \n");
                System.out.println("Station ID       : " + se.getValue());
            } else if ("stationName".equals(tagName)) {
                System.out.println("station Name     : " + se.getValue());
            } else if ("latitude".equals(tagName)) {
                System.out.println("Latitude         : " + se.getValue());
            } else if ("longitude".equals(tagName)) {
                System.out.println("Longitude        : " + se.getValue());
            } else if ("state".equals(tagName)) {
                System.out.println("State            : " + se.getValue());
            } else if ("dataSource".equals(tagName)) {
                System.out.println("Data Source      : " + se.getValue());
            } else if ("COOPSDisclaimer".equals(tagName)) {
                System.out.println("COOPS Disclaimer : " + se.getValue());
            } else if ("beginDate".equals(tagName)) {
                System.out.println("Begin Date       : " + se.getValue());
            } else if ("endDate".equals(tagName)) {
                System.out.println("End Date         : " + se.getValue());
            } else if ("timeZone".equals(tagName)) {
                System.out.println("Time Zone        : " + se.getValue());
            } else if ("unit".equals(tagName)) {
                System.out.println("Unit             : " + se.getValue());
            } else if ("sensorOrientation".equals(tagName)) {
                System.out.println("Orientation      : " + se.getValue());
            } else if ("binNumber".equals(tagName)) {
                System.out.println("Bin Number       : " + se.getValue());
            } else if ("binDistance".equals(tagName)) {
                System.out.println("Bin Distance (ft): " + se.getValue() + "\n");
                System.out.println("Printing the data \n");    
            }
        }
    }

    public static void printData(SOAPElement se) {
        String tagName = se.getElementName().getLocalName();
        if (tagName != null) {
            if (tagName.equals("timeStamp")) {
                System.out.println("Time Stamp  : " + se.getValue());
            } else if (tagName.equals("CS")) {
                System.out.println("CS          : " + se.getValue());
            } else if (tagName.equals("CD")) {
                System.out.println("CD          : " + se.getValue() + "\n");
            }
        }
    }
}
/****************************************************
SAMPLE RUN
 
>java Client
 
Printing the message that is being sent:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <csd:getCurrentsAndMetadata xmlns:csd="https://opendap.co-ops.nos.noaa.gov/axis/webservices/currents/wsdl">
            <stationId>COI0502</stationId>
            <beginDate>20050528 00:00</beginDate>
            <endDate>20050528 00:18</endDate>
            <binNumber>1</binNumber>
        </csd:getCurrentsAndMetadata>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Iterating through the response object to get the values:
  

Printing Metadata 

Station ID       : COI0502
station Name     : The Forelands
Latitude         : 60.7207
Longitude        : -151.5573
Data Source      : USDOC/NOAA/NOS/COOPS(Center for Operational Oceanographic Products and Services)
COOPS 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.
Begin Date       : 20050528 00:00
End Date         : 20050528 00:18
Time Zone        : GMT
Unit             : Current speed is in knots and current direction in degrees true. Approximate bin distance is in feet below the surface.
Orientation      : Up (Bottom-Mounted)
Bin Number       : 1
Bin Distance (ft): 66.2

Printing the data 

Time Stamp  : 2005-05-28 00:05:00.0
CS          : 0.225
CD          : 316.0

Time Stamp  : 2005-05-28 00:11:00.0
CS          : 0.416
CD          : 354.0

Time Stamp  : 2005-05-28 00:17:00.0
CS          : 0.643
CD          : 9.0

***********************************************************/