From 42257e90337da35c472d87f65aab065a6ec6f07d Mon Sep 17 00:00:00 2001 From: Martin Stockhammer Date: Mon, 10 Jun 2019 23:33:34 +0200 Subject: [PATCH] Using asset API in DAV --- .../archiva/checksum/StreamingChecksum.java | 65 +++++++ .../webdav/ArchivaDavResourceFactory.java | 181 +++++++++++------- 2 files changed, 174 insertions(+), 72 deletions(-) create mode 100644 archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/StreamingChecksum.java diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/StreamingChecksum.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/StreamingChecksum.java new file mode 100644 index 000000000..5e4aa7cfd --- /dev/null +++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/StreamingChecksum.java @@ -0,0 +1,65 @@ +package org.apache.archiva.checksum; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.stream.Collectors; + +/** + * + * Class that handles checksums with streams. + * + * @author Martin Stockhammer + */ +public class StreamingChecksum +{ + static final int BUFFER_SIZE=4096; + + public static void updateChecksums( InputStream input, List algorithms, List checksumOutput) { + List checksums = algorithms.stream().map(a -> new Checksum( a )).collect( Collectors.toList()); + byte[] buffer = new byte[BUFFER_SIZE]; + int read; + try + { + while ( ( read = input.read( buffer ) ) >= 0 ) + { + for (Checksum cs : checksums ) { + cs.update( buffer, 0, read ); + } + } + int minIndex = Math.min(algorithms.size(), checksums.size()); + for (int csIndex = 0; csIndex algorithms = ChecksumUtil.getAlgorithms( archivaConfiguration.getConfiguration( ).getArchivaRuntimeConfiguration( ).getChecksumTypes( ) ); + List outStreams = algorithms.stream( ).map( algo -> { + String ext = algo.getDefaultExtension( ); + try + { + return repo.getAsset( path + "." + ext ).writeData( true ); + } + catch ( IOException e ) + { + e.printStackTrace( ); + return null; + } + } ).filter( Objects::nonNull ).collect( Collectors.toList( ) ); + try { - org.apache.archiva.common.utils.FileUtils.deleteQuietly( checksumFile ); - checksum.createChecksum( Paths.get( path ).toFile(), digester ); + StreamingChecksum.updateChecksums( repo.getAsset(path).getData(), algorithms, outStreams ); } - else if ( !Files.isRegularFile( checksumFile) ) + catch ( IOException e ) { - log.error( "Checksum file is not a file." ); + e.printStackTrace( ); } } + + private boolean isProjectReference( String requestedResource ) { try -- 2.39.5