All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.wavesoftware.wfirma.api.simple.mapper.SimpleGateway Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2014 Krzysztof Suszyński 
 *
 * 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.
 */
package pl.wavesoftware.wfirma.api.simple.mapper;

import com.google.common.base.Charsets;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.StatusLine;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import pl.wavesoftware.wfirma.api.core.mapper.ResponseChecker;
import pl.wavesoftware.wfirma.api.core.mapper.ResponseListener;
import pl.wavesoftware.wfirma.api.core.model.Credentials;
import pl.wavesoftware.wfirma.api.core.model.Gateway;
import pl.wavesoftware.wfirma.api.core.model.PostRequest;
import pl.wavesoftware.wfirma.api.core.model.Request;
import pl.wavesoftware.wfirma.api.core.model.exceptions.WFirmaException;
import pl.wavesoftware.wfirma.api.core.model.exceptions.WFirmaSecurityException;
import pl.wavesoftware.wfirma.api.core.model.validation.RemoteGatewayException;
import pl.wavesoftware.wfirma.api.core.model.validation.RequestValidator;

import javax.annotation.Nonnull;
import java.io.IOException;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;

/**
 * @author Krzysztof Suszyński 
 */
class SimpleGateway implements Gateway {

    public static final int HTTP_DEFAULT_PORT = 80;
    public static final int HTTPS_DEFAULT_PORT = 443;
    private final Credentials credentials;

    private final URI gateway;

    private final ResponseChecker statusParser = new ResponseChecker();

    private final Set listeners = new HashSet<>();

    /**
     * A default constructor
     *
     * @param credentials a credentials
     * @param gateway     a gateway address
     */
    SimpleGateway(Credentials credentials, URI gateway) {
        this.credentials = credentials;
        this.gateway = gateway;
    }

    @Override
    public void addListener(@Nonnull ResponseListener listener) {
        listeners.add(listener);
    }

    @Override
    public void removeListener(@Nonnull ResponseListener listener) {
        listeners.remove(listener);
    }

    private String get(@Nonnull HttpRequest httpRequest) throws WFirmaException {
        httpRequest.setHeader("Accept", "text/xml");
        HttpHost target = getTargetHost();
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope(target.getHostName(), target.getPort()),
                new UsernamePasswordCredentials(credentials.getConsumerKey(), credentials.getConsumerSecret()));
        try (CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCredentialsProvider(credsProvider).build()) {

            // Create AuthCache instance
            AuthCache authCache = new BasicAuthCache();
            // Generate BASIC scheme object and add it to the local
            // auth cache
            BasicScheme basicAuth = new BasicScheme();
            authCache.put(target, basicAuth);

            // Add AuthCache to the execution context
            HttpClientContext localContext = HttpClientContext.create();
            localContext.setAuthCache(authCache);

            try (CloseableHttpResponse response = httpclient.execute(target, httpRequest, localContext)) {
                return getContent(response);
            }
        } catch (IOException ioe) {
            throw new RemoteGatewayException(ioe);
        }
    }

    @Override
    @Nonnull
    public String get(@Nonnull Request request) throws WFirmaException {
        new RequestValidator(request).validate();
        HttpGet httpget = new HttpGet(request.getAddress().getCorrectedPath());
        return get(httpget);
    }

    private HttpHost getTargetHost() throws WFirmaException {
        int port = gateway.getPort();
        if (port < 1) {
            switch (gateway.getScheme().toLowerCase()) {
                case "http":
                    port = HTTP_DEFAULT_PORT;
                    break;
                case "https":
                    port = HTTPS_DEFAULT_PORT;
                    break;
                default:
                    throw new WFirmaException("Unsupported URI scheme: "
                            + gateway.getScheme() + ", supporting only: `http` and `https`");
            }
        }
        return new HttpHost(gateway.getHost(), port, gateway.getScheme());
    }

    private String getContent(CloseableHttpResponse response) throws WFirmaException, IOException {
        switch (response.getStatusLine().getStatusCode()) {
            case 200:
                return handleCode200OK(response);
            case 403:
                throw new WFirmaSecurityException("Auth failed for user: `%s`", credentials.getConsumerKey());
            default:
                StatusLine status = response.getStatusLine();
                throw new WFirmaException("Connection error: %d - %s", status.getStatusCode(),
                        status.getReasonPhrase());
        }
    }

    private String handleCode200OK(CloseableHttpResponse response) throws IOException, WFirmaException {
        HttpEntity entity = response.getEntity();
        String content = EntityUtils.toString(entity, Charsets.UTF_8);
        for (ResponseListener responseListener : listeners) {
            responseListener.responseRecived(content);
        }
        return statusParser.checkedForStatus(credentials.getConsumerKey(), content);
    }

    @Override
    @Nonnull
    public String post(@Nonnull PostRequest request) throws WFirmaException {
        new RequestValidator(request).validate();
        String body = request.getBody();
        HttpPost post = new HttpPost(request.getAddress().getCorrectedPath());
        post.setEntity(new StringEntity(body, Charsets.UTF_8));
        return get(post);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy