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

com.commercetools.payment.service.PaymentAdapterServiceImpl Maven / Gradle / Ivy

Go to download

The commercetools java payment project intend is to make payment integration easy

The newest version!
package com.commercetools.payment.service;

import com.commercetools.payment.domain.PaymentServiceProvider;
import com.commercetools.payment.domain.PaymentTransactionCreationResultBuilder;
import com.commercetools.payment.model.CreatePaymentData;
import com.commercetools.payment.model.CreatePaymentTransactionData;
import com.commercetools.payment.model.PaymentCreationResult;
import com.commercetools.payment.model.PaymentTransactionCreationResult;
import com.commercetools.payment.utils.PaymentLookupHelper;
import io.sphere.sdk.payments.PaymentMethodInfo;

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;
import java.util.stream.StreamSupport;

import static java.lang.String.format;
import static java.util.concurrent.CompletableFuture.completedFuture;
import static java.util.stream.Collectors.toList;

/**
 * Provides access to the payment service provider handling methods.
 *
 * Created by mgatz on 7/18/16.
 */
public class PaymentAdapterServiceImpl implements PaymentAdapterService {

    private final List paymentServiceProviders;

    public PaymentAdapterServiceImpl() {
        ServiceLoader pspLoader =
                ServiceLoader.load(PaymentServiceProvider.class, PaymentAdapterServiceImpl.class.getClassLoader());

        paymentServiceProviders = StreamSupport.stream(pspLoader.spliterator(), false)
                .collect(toList());
    }

    @Override
    public List findAllPaymentServiceProviders() {
        return paymentServiceProviders;
    }

    @Override
    public List findAvailablePaymentMethods() {
        return findAllPaymentServiceProviders().stream()
                .flatMap(psp -> psp.getAvailablePaymentMethods().stream())
                .collect(toList());
    }

    @Override
    public List findAvailablePaymentMethods(Function, List> filter) {
        return findAllPaymentServiceProviders().stream()
                .flatMap(psp -> psp.getAvailablePaymentMethods(filter).stream())
                .collect(toList());
    }

    @Override
    public CompletionStage createPayment(CreatePaymentData data) {
        // lookup implementation needed to be called
        PaymentServiceProvider provider = findPaymentServiceProvider(data.getPaymentMethodinInfo().getPaymentInterface());

        // let the method be created and apply the passed data
        return provider.provideCreatePaymentHandler(data.getPaymentMethodinInfo().getMethod()).apply(data);
    }

    @Override
    public CompletionStage createPaymentTransaction(CreatePaymentTransactionData createData) {
        return PaymentLookupHelper.of(createData.getSphereClient())
                .findPaymentFor(createData)
                .thenCompose(data -> {
                    if (data.getPayment() == null) {
                        return completedFuture(PaymentTransactionCreationResultBuilder.ofError(
                                format("Payment id=[%s] not found", createData.getPaymentRef())));
                    }

                    return findPaymentServiceProvider(data.getPayment().getPaymentMethodInfo().getPaymentInterface())
                            .provideCreatePaymentTransactionHandler(data.getPayment().getPaymentMethodInfo().getMethod()).apply(data);
                });
    }

    @Override
    public Optional getPaymentMethodInfo(String interfaceId, String method) {
        return findPaymentServiceProvider(interfaceId)
                .getAvailablePaymentMethods().stream()
                .filter(m -> Objects.equals(m.getMethod(), method))
                .findFirst();
    }

    private PaymentServiceProvider findPaymentServiceProvider(String paymentInterfaceId) {
        return findAllPaymentServiceProviders().stream()
                .filter(psp -> psp.getId().equals(paymentInterfaceId))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException(format("Payment interface %s not found", paymentInterfaceId)));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy