/* * Copyright (C) 2015-2017 PÂRIS Quentin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.phoenicis.apps.repository; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.phoenicis.apps.dto.CategoryDTO; import org.phoenicis.tools.files.FileUtilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class ConfigurableRepository implements Repository { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurableRepository.class); private final LocalRepository.Factory localRepositoryFactory; private final ClasspathRepository.Factory classPathRepositoryFactory; private final Repository repository; private final String cacheDirectoryPath; private final FileUtilities fileUtilities; public ConfigurableRepository(String sourceUrl, String cacheDirectoryPath, FileUtilities fileUtilities, LocalRepository.Factory localRepositoryFactory, ClasspathRepository.Factory classPathRepositoryFactory) { this.cacheDirectoryPath = cacheDirectoryPath; this.localRepositoryFactory = localRepositoryFactory; this.classPathRepositoryFactory = classPathRepositoryFactory; this.fileUtilities = fileUtilities; final String[] urls = sourceUrl.split(";"); repository = new MultipleRepository(Arrays.stream(urls).map(this::toRepository).collect(Collectors.toList())); } @Override public List<CategoryDTO> fetchInstallableApplications() { return repository.fetchInstallableApplications(); } @Override public void onDelete() { this.repository.onDelete(); } private Repository toRepository(String repositoryUrl) { LOGGER.info("Registering: " + repositoryUrl); try { final URI url = new URI(repositoryUrl); final String scheme = url.getScheme().split("\\+")[0]; switch (scheme) { case "git": return new GitRepository(repositoryUrl.replace("git+", ""), cacheDirectoryPath, localRepositoryFactory, fileUtilities); case "file": return localRepositoryFactory.createInstance(url.getRawPath()); case "classpath": return classPathRepositoryFactory.createInstance(url.getPath()); default: LOGGER.warn("Unsupported URL: " + repositoryUrl); return new NullRepository(); } } catch (URISyntaxException e) { LOGGER.warn("Cannot parse URL: " + repositoryUrl, e); return new NullRepository(); } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ConfigurableRepository that = (ConfigurableRepository) o; EqualsBuilder builder = new EqualsBuilder(); builder.append(repository, that.repository); builder.append(cacheDirectoryPath, that.cacheDirectoryPath); return builder.isEquals(); } @Override public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder(); builder.append(repository); builder.append(cacheDirectoryPath); return builder.toHashCode(); } }