/*
 * 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.sslclientcert.client;

import jakarta.xml.ws.WebServiceRef;

import com.sun.s1asdev.security.wss.sslclientcert.ejbws.HelloEjb;
import com.sun.s1asdev.security.wss.sslclientcert.ejbws.WssSslClientCertEjbService;
import com.sun.s1asdev.security.wss.sslclientcert.servletws.HelloServlet;
import com.sun.s1asdev.security.wss.sslclientcert.servletws.WssSslClientCertServletService;

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 Client Cert test ";

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

    public static void main(String[] args) {
        stat.addDescription("security-wss-sslclientcert");
        String description = null;
        try {
            // ejb ws
            HelloEjb ejbPort = ejbService.getHelloEjbPort();
            description = testSuite + " sslclientcert: ejb hello";
            String ejbMsg = ejbPort.hello("Sun Ejb");
            System.out.println(ejbMsg);
            if (ejbMsg != null && ejbMsg.startsWith("Hello Ejb, CN=@HOST@")) {
                stat.addStatus(description, stat.PASS);  
            } else {
                stat.addStatus(description, stat.FAIL);  
            }

            description = testSuite + " sslclientcert: ejb hello2";
            String ejbMsg2 = ejbPort.hello2("Sun Ejb - 2");
            System.out.println(ejbMsg2);
            if (ejbMsg2 != null && ejbMsg2.startsWith("Hello Ejb 2, CN=@HOST@")) {
                stat.addStatus(description, stat.PASS);  
            } else {
                stat.addStatus(description, stat.FAIL);  
            }
        } catch(Exception ex) {
            ex.printStackTrace();
            stat.addStatus(description, stat.FAIL);
        }

        try {
            // servlet ws
            HelloServlet servletPort = servletService.getHelloServletPort();
            description = testSuite + " sslclientcert: servlet hello";
            String servletMsg = servletPort.hello("Sun Servlet");
            System.out.println(servletMsg);
            if (servletMsg != null && servletMsg.startsWith("Hello Servlet, CN=@HOST@")) {
                stat.addStatus(description, stat.PASS);  
            } else {
                stat.addStatus(description, stat.FAIL);  
            }
        } catch(Exception ex) {
            ex.printStackTrace();
            stat.addStatus(description, stat.FAIL);
        }

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