/*
 * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.s1asdev.security.wss.ssl.client;

import jakarta.xml.ws.WebServiceRef;

import com.sun.s1asdev.security.wss.ssl.ejbws.HelloEjb;
import com.sun.s1asdev.security.wss.ssl.ejbws.WssSslEjbService;
import com.sun.s1asdev.security.wss.ssl.servletws.HelloServlet;
import com.sun.s1asdev.security.wss.ssl.servletws.WssSslServletService;

import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;

public class Client {
    private static SimpleReporterAdapter stat =
            new SimpleReporterAdapter("appserv-tests");
    private static String testSuite = "Sec:WSS SSL test ";

    @WebServiceRef(wsdlLocation="https://@HOST@:@PORT@/WssSslEjbService/HelloEjb?WSDL")
    private static WssSslEjbService ejbService;
    @WebServiceRef(wsdlLocation="https://@HOST@:@PORT@/security-wss-ssl/webservice/WssSslServletService/HelloServlet?WSDL")
    private static WssSslServletService servletService;

    public static void main(String[] args) {
        stat.addDescription("security-wss-ssl");
        String description = null;
        try {
            // ejb ws
            HelloEjb ejbPort = ejbService.getHelloEjbPort();
            description = testSuite + " ssl: ejb hello";
            ejbPort.hello("Sun Ejb");
            stat.addStatus(description, stat.PASS);  
        } catch(Exception ex) {
            ex.printStackTrace();
            stat.addStatus(description, stat.FAIL);
        }

        try {
            // servlet ws
            HelloServlet servletPort = servletService.getHelloServletPort();
            description = testSuite + " ssl: servlet hello";
            servletPort.hello("Sun Servlet");
            stat.addStatus(description, stat.PASS);  
        } catch(Exception ex) {
            ex.printStackTrace();
            stat.addStatus(description, stat.FAIL);
        }

        stat.printSummary("security-wss-ssl");
    }
}
