use of org.haiku.haikudepotserver.repository.model.RepositoryHpkrIngressException in project haikudepotserver by haiku.
the class RepositoryHpkrIngressJobRunner method runImportHpkrForRepositorySource.
private void runImportHpkrForRepositorySource(ObjectContext mainContext, RepositorySource repositorySource) {
URL url = repositorySource.tryGetInternalFacingDownloadHpkrURL().orElseThrow(() -> new RuntimeException("unable to import for [" + repositorySource + "] as there is no download url able to be derived."));
// now shift the URL's data into a temporary file and then process it.
File temporaryFile = null;
try {
temporaryFile = File.createTempFile(repositorySource.getCode() + "__import", ".hpkr");
LOGGER.info("will copy repository hpkr [{}] ({}) to temporary file", repositorySource, url.toString());
FileHelper.streamUrlDataToFile(url, temporaryFile, TIMEOUT_REPOSITORY_SOURCE_FETCH);
LOGGER.info("did copy {} bytes for repository hpkr [{}] ({}) to temporary file", temporaryFile.length(), repositorySource, url);
HpkrFileExtractor fileExtractor = new HpkrFileExtractor(temporaryFile);
long startTimeMs = System.currentTimeMillis();
LOGGER.info("will process data for repository hpkr {}", repositorySource.getCode());
// import any packages that are in the repository.
Set<String> repositoryImportPkgNames = Sets.newHashSet();
PkgIterator pkgIterator = new PkgIterator(fileExtractor.getPackageAttributesIterator());
while (pkgIterator.hasNext()) {
ObjectContext pkgImportContext = serverRuntime.newContext();
Pkg pkg = pkgIterator.next();
repositoryImportPkgNames.add(pkg.getName());
try {
pkgImportService.importFrom(pkgImportContext, repositorySource.getObjectId(), pkg, shouldPopulateFromPayload);
pkgImportContext.commitChanges();
} catch (Throwable th) {
throw new RepositoryHpkrIngressException("unable to store package [" + pkg + "]", th);
}
}
// [apl 6.aug.2014] #5
// Packages may be removed from a repository. In this case there is no trigger to indicate that the
// package version should be removed. Check all of the packages that have an active version in this
// repository and then if the package simply doesn't exist in that repository any more, mark all of
// those versions are inactive.
pkgService.fetchPkgNamesWithAnyPkgVersionAssociatedWithRepositorySource(mainContext, repositorySource).forEach((persistedPkgName) -> {
if (!repositoryImportPkgNames.contains(persistedPkgName)) {
ObjectContext removalContext = serverRuntime.newContext();
RepositorySource removalRepositorySource = RepositorySource.get(removalContext, repositorySource.getObjectId());
int changes = pkgService.deactivatePkgVersionsForPkgAssociatedWithRepositorySource(removalContext, org.haiku.haikudepotserver.dataobjects.Pkg.getByName(removalContext, persistedPkgName), removalRepositorySource);
if (changes > 0) {
removalContext.commitChanges();
LOGGER.info("did remove all versions of package {} from repository source {} because this package is no longer in the repository", persistedPkgName, repositorySource);
}
}
});
LOGGER.info("did process data for repository hpkr {} in {}ms", repositorySource, System.currentTimeMillis() - startTimeMs);
} catch (Throwable th) {
throw new RuntimeException("a problem has arisen processing a repository file for repository hpkr " + repositorySource + " from url '" + url.toString() + "'", th);
} finally {
if (null != temporaryFile && temporaryFile.exists()) {
if (!temporaryFile.delete()) {
LOGGER.error("unable to delete the file; {}" + temporaryFile.getAbsolutePath());
}
}
}
}
use of org.haiku.haikudepotserver.repository.model.RepositoryHpkrIngressException in project haikudepotserver by haiku.
the class RepositoryHpkrIngressJobRunner method runImportInfoForRepositorySource.
/**
* <p>Each repository has a little "repo.info" file that resides next to the HPKR data.
* This method will pull this in and process the data into the repository source.</p>
*/
private void runImportInfoForRepositorySource(ObjectContext mainContext, RepositorySource repositorySource) throws RepositoryHpkrIngressException {
URL url = repositorySource.tryGetInternalFacingDownloadRepoInfoURL().orElseThrow(() -> new RepositoryHpkrIngressException("unable to download for [" + repositorySource.getCode() + "] as no download repo info url was available"));
// now shift the URL's data into a temporary file and then process it.
File temporaryFile = null;
try {
temporaryFile = File.createTempFile(repositorySource.getCode() + "__import", ".repo-info");
LOGGER.info("will copy data for repository info [{}] ({}) to temporary file", repositorySource, url.toString());
FileHelper.streamUrlDataToFile(url, temporaryFile, TIMEOUT_REPOSITORY_SOURCE_FETCH);
try (InputStream inputStream = new FileInputStream(temporaryFile);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charsets.UTF_8);
BufferedReader reader = new BufferedReader(inputStreamReader)) {
List<Parameter> parameters = DriverSettings.parse(reader);
String identifierParameterValue = ObjectUtils.firstNonNull(tryGetParameterValue(parameters, PARAMETER_NAME_IDENTIFIER).orElse(null), tryGetParameterValue(parameters, PARAMETER_NAME_URL).orElse(null));
if (StringUtils.isEmpty(identifierParameterValue)) {
throw new DriverSettingsException("expected to find the parameter [" + PARAMETER_NAME_IDENTIFIER + "] or [" + PARAMETER_NAME_URL + "]");
}
if (!Objects.equals(identifierParameterValue, repositorySource.getIdentifier())) {
LOGGER.info("updated the repo info identifier to [{}] for repository source [{}]", identifierParameterValue, repositorySource.getCode());
repositorySource.setIdentifier(identifierParameterValue);
repositorySource.getRepository().setModifyTimestamp();
mainContext.commitChanges();
}
Optional<String> architectureCodeOptional = tryGetParameterValue(parameters, PARAMETER_ARCHITECTURE);
if (architectureCodeOptional.isEmpty()) {
throw new RepositoryHpkrIngressException("repository source [" + repositorySource.getCode() + "] has no architecture code");
}
Optional<Architecture> architectureOptional = Architecture.tryGetByCode(mainContext, architectureCodeOptional.get());
if (architectureOptional.isEmpty()) {
throw new RepositoryHpkrIngressException("repository source [" + repositorySource.getCode() + "] has unknown architecture code [" + architectureCodeOptional.get() + "]");
}
repositorySource.setArchitecture(architectureOptional.get());
}
} catch (IOException | DriverSettingsException e) {
throw new RepositoryHpkrIngressException("a problem has arisen parsing or dealing with the 'repo.info' file", e);
} finally {
if (null != temporaryFile && temporaryFile.exists()) {
if (!temporaryFile.delete()) {
LOGGER.error("unable to delete the file; {}" + temporaryFile.getAbsolutePath());
}
}
}
}
Aggregations