Package ru.aristar.jnuget.sources

Source Code of ru.aristar.jnuget.sources.RemotePackageSource

package ru.aristar.jnuget.sources;

import com.sun.jersey.api.client.UniformInterfaceException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.aristar.jnuget.Version;
import ru.aristar.jnuget.client.ClientFactory;
import ru.aristar.jnuget.client.NugetClient;
import ru.aristar.jnuget.files.Nupkg;
import ru.aristar.jnuget.files.RemoteNupkg;
import static ru.aristar.jnuget.sources.AbstractPackageSource.extractLastVersion;
import ru.aristar.jnuget.sources.push.ModifyStrategy;
import ru.aristar.jnuget.sources.push.NugetPushException;

/**
*
* @author sviridov
*/
public class RemotePackageSource implements PackageSource<RemoteNupkg> {

    /**
     * Удаленное хранилище пакетов
     */
    protected NugetClient remoteStorage = new NugetClient();
    /**
     * Пул запросов в удаленное хранилище
     */
    private static ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
    /**
     * Логгер
     */
    protected Logger logger = LoggerFactory.getLogger(this.getClass());
    /**
     * Стратегия публикации пакетов
     */
    protected ModifyStrategy pushStrategy = new ModifyStrategy(false);
    /**
     * Имя хранилища
     */
    private String name;

    /**
     * Получает список пакетов из удаленного хранилища
     *
     * @param filter фильтр отбора пактов
     * @return список пакетов
     */
    private Collection<RemoteNupkg> getPackagesFromRemoteStorage(String filter) {
        try {
            List<RemoteNupkg> result = new ArrayList<>();
            result = Collections.synchronizedList(result);
            int count = remoteStorage.getPackageCount(false);
            int groupCount = 200;
            logger.debug("Получение {} пакетов из удаленного сервера группами по {}",
                    new Object[]{count, groupCount});
            ClientFactory clientFactory = new ClientFactory(getUrl());
            forkJoinPool.invoke(new GetRemotePackageFeedAction(groupCount, result, 0, count, clientFactory));
            logger.debug("Завершено получение пакетов count={}", new Object[]{result.size()});
            return result;
        } catch (IOException | URISyntaxException e) {
            logger.warn("Ошибка получения пакета из удаленного хранилища", e);
            return new ArrayList<>(1);
        }
    }

    /**
     * @param url URL удаленного хранилища
     */
    public void setUrl(String url) {
        remoteStorage.setUrl(url);
    }

    /**
     * @return URL удаленного хранилища
     */
    public String getUrl() {
        return remoteStorage.getUrl();
    }

    /**
     * @param apiKey ключ доступа к удаленному хранилищу
     */
    public void setApiKey(String apiKey) {
        remoteStorage.setApiKey(apiKey);
    }

    /**
     * @return ключ доступа к удаленному хранилищу
     */
    public String getApiKey() {
        return remoteStorage.getApiKey();
    }

    @Override
    public RemoteNupkg getLastVersionPackage(String id) {
        String filter = "tolower(Id) eq '" + id + "'";
        Collection<RemoteNupkg> nupkgs = getPackagesFromRemoteStorage(filter);
        Collection<RemoteNupkg> result = extractLastVersion(nupkgs);
        if (!result.isEmpty()) {
            return result.iterator().next();
        } else {
            return null;
        }
    }

    @Override
    public Collection<RemoteNupkg> getLastVersionPackages() {
        return getPackagesFromRemoteStorage("IsLatestVersion");
    }

    @Override
    public RemoteNupkg getPackage(String id, Version version) {
        Collection<RemoteNupkg> nupkgs = getPackages(id);
        for (RemoteNupkg remoteNupkg : nupkgs) {
            if (version.equals(remoteNupkg.getVersion())) {
                return remoteNupkg;
            }
        }
        return null;
    }

    @Override
    public Collection<RemoteNupkg> getPackages() {
        return getPackagesFromRemoteStorage(null);
    }

    @Override
    public Collection<RemoteNupkg> getPackages(String id) {
        String filter = "tolower(Id) eq '" + id + "'";
        return getPackagesFromRemoteStorage(filter);
    }

    @Override
    public ModifyStrategy getPushStrategy() {
        return pushStrategy;
    }

    @Override
    public boolean pushPackage(Nupkg nupkg) throws IOException {
        try {
            boolean beforeTrigger = getPushStrategy().processBeforeTriggers(nupkg, this);
            if (!beforeTrigger) {
                return false;
            }
            remoteStorage.putPackage(nupkg);
            getPushStrategy().processAfterTriggers(nupkg, this);
            return true;
        } catch (UniformInterfaceException | NugetPushException e) {
            logger.warn("Ошибка помещения пакета в удаленное хранилище", e);
            return false;
        }
    }

    @Override
    public void setPushStrategy(ModifyStrategy strategy) {
        this.pushStrategy = strategy;
    }

    @Override
    public void removePackage(Nupkg nupkg) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String toString() {
        return "RemotePackageSource{" + remoteStorage.getUrl() + '}';
    }

    @Override
    public void refreshPackage(Nupkg nupkg) {
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String storageName) {
        this.name = storageName;
    }
}
TOP

Related Classes of ru.aristar.jnuget.sources.RemotePackageSource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.