package org.apache.axis2.wsdl;

import junit.framework.TestCase;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.WSDL11ToAxisServiceBuilder;
import org.apache.axis2.engine.ListenerManager;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
*/

public class WSDLServiceBuilderTest extends TestCase {

    private ConfigurationContext configContext;
    ListenerManager lm;

    protected void setUp() throws Exception {
        configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null);
        lm = new ListenerManager();
        lm.init(configContext);
        lm.start();
    }

    protected void tearDown() throws AxisFault {
        lm.stop();
    }

    public void testWSDLClient() throws Exception {
        File testResourceFile = new File("target/test-classes");
        File outLocation = new File("target/test-resources");
        outLocation.mkdirs();
        if (testResourceFile.exists()) {
            File files [] = testResourceFile.listFiles();
            for (int i = 0; i < files.length; i++) {
                File file1 = files[i];
                if (file1.isFile() && file1.getName().endsWith(".wsdl")) {
                    if (file1.getName().equals("ping-modified.wsdl") ||
                            file1.getName().equals("ping-unbound.wsdl") ||
                            file1.getName().equals("wsat.wsdl") ||
                            file1.getName().equals("no-service.wsdl")) {
                        continue;
                    }
                    try {
                        WSDL11ToAxisServiceBuilder builder = new WSDL11ToAxisServiceBuilder(new FileInputStream(file1), null, null);
                        AxisService service = builder.populateService();
                        System.out.println("Testinf file: " + file1.getName());
                        configContext.getAxisConfiguration().addService(service);
                        OutputStream out = new FileOutputStream(new File(outLocation, file1.getName()));
                        service.printWSDL(out, "http://google.com/axis2/services" ,"services");
                        out.flush();
                        out.close();
//                        URL wsdlURL = new URL("http://localhost:" + 6060 +
//                                "/axis2/services/" + service.getName() + "?wsdl");
//                        builder = new WSDL11ToAxisServiceBuilder(wsdlURL.openStream(), null, null);
//                        service = builder.populateService();
                        configContext.getAxisConfiguration().removeService(service.getName());
                    } catch (Exception e) {
                        System.out.println("Error in WSDL : " + file1.getName());
                        throw e;
                    }

                }
            }
        }
    }
}
