cz.vutbr.fit.xzelin15.dp.consumer.WSDynamicClientFactory.java Source code

Java tutorial

Introduction

Here is the source code for cz.vutbr.fit.xzelin15.dp.consumer.WSDynamicClientFactory.java

Source

/*
 * JBoss, Home of Professional Open Source Copyright 2009, Red Hat Middleware
 * LLC, and individual contributors by the @authors tag. See the copyright.txt
 * in the distribution for a full listing of individual contributors.
 * 
 * This is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This software is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this software; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
 * site: http://www.fsf.org.
 */
package cz.vutbr.fit.xzelin15.dp.consumer;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.lang.StringUtils;
import org.jboss.internal.soa.esb.assertion.AssertArgument;
import sun.misc.BASE64Encoder;
import it.javalinux.wise.core.client.WSDynamicClient;
import it.javalinux.wise.core.exceptions.WiseConnectionException;
import it.javalinux.wise.core.exceptions.WiseException;
import it.javalinux.wise.core.utils.IDGenerator;
import it.javalinux.wise.core.utils.IOUtils;
import it.javalinux.wise.core.utils.WiseProperties;

/**
 * Factory for {@link WSDynamicClient}. 
 * Lifted from {@link it.javalinux.wise.core.client.WSDynamicClientFactory}.
 * <p/>
 */
public class WSDynamicClientFactory {
    private static final String WISE_PROPERTIES_FILE = "wise-core.properties";

    private static final WSDynamicClientFactory SINGLETON = new WSDynamicClientFactory();

    public static WSDynamicClientFactory getFactory() {
        return SINGLETON;
    }

    public synchronized WSDynamicClient create(final String wsdl, final String name, final String username,
            final String password) throws WiseException {
        AssertArgument.isNotNull(name, "name");
        AssertArgument.isNotNull(wsdl, "wsdl");

        final WiseProperties wiseProperties = new WiseProperties(WISE_PROPERTIES_FILE);

        String usableWsdl = wsdl;
        if (wsdl.startsWith("http://")) {
            usableWsdl = downloadWsdl(wsdl, username, password, wiseProperties);
        }

        final WSDynamicClient client = new WSDynamicClient(wiseProperties);
        client.init(usableWsdl, name, username, password);
        return client;
    }

    private String downloadWsdl(String wsdlURL, String userName, String password, WiseProperties wiseProperties)
            throws WiseConnectionException {
        if (StringUtils.trimToNull(userName) == null || StringUtils.trimToNull(password) == null) {
            return this.transferWSDL(wsdlURL, null, wiseProperties);
        } else {
            return this.transferWSDL(wsdlURL, new StringBuffer(userName).append(":").append(password).toString(),
                    wiseProperties);
        }
    }

    private String transferWSDL(String wsdlURL, String userPassword, WiseProperties wiseProperties)
            throws WiseConnectionException {
        String filePath = null;
        try {
            URL endpoint = new URL(wsdlURL);
            // Create the connection
            HttpURLConnection conn = (HttpURLConnection) endpoint.openConnection();
            conn.setDoOutput(false);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept",
                    "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
            // set Connection close, otherwise we get a keep-alive
            // connection
            // that gives us fragmented answers.
            conn.setRequestProperty("Connection", "close");
            // BASIC AUTH
            if (userPassword != null) {
                conn.setRequestProperty("Authorization",
                        "Basic " + (new BASE64Encoder()).encode(userPassword.getBytes()));
            }
            // Read response
            InputStream is = null;
            if (conn.getResponseCode() == 200) {
                is = conn.getInputStream();
            } else {
                is = conn.getErrorStream();
                InputStreamReader isr = new InputStreamReader(is);
                StringWriter sw = new StringWriter();
                char[] buf = new char[200];
                int read = 0;
                while (read != -1) {
                    read = isr.read(buf);
                    sw.write(buf);
                }
                throw new WiseConnectionException("Remote server's response is an error: " + sw.toString());
            }
            // saving file
            File file = new File(wiseProperties.getProperty("wise.tmpDir"),
                    new StringBuffer("Wise").append(IDGenerator.nextVal()).append(".xml").toString());
            OutputStream fos = new BufferedOutputStream(new FileOutputStream(file));
            IOUtils.copyStream(fos, is);
            fos.close();
            is.close();
            filePath = file.getPath();
        } catch (WiseConnectionException wce) {
            throw wce;
        } catch (Exception e) {
            throw new WiseConnectionException("Wsdl download failed!", e);
        }
        return filePath;
    }
}