001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.eclipse.aether.spi.io; 020 021import java.io.*; 022import java.nio.ByteBuffer; 023import java.nio.file.Files; 024import java.nio.file.NoSuchFileException; 025import java.nio.file.Path; 026 027/** 028 * A utility component to perform file-based operations. 029 * 030 * @since 2.0.0 031 */ 032public interface PathProcessor { 033 /** 034 * Returns last modified of path in milliseconds, if exists. 035 * 036 * @param path The path, may be {@code null}. 037 * @throws UncheckedIOException If an I/O error occurs. 038 */ 039 default long lastModified(Path path, long defValue) { 040 try { 041 return Files.getLastModifiedTime(path).toMillis(); 042 } catch (NoSuchFileException e) { 043 return defValue; 044 } catch (IOException e) { 045 throw new UncheckedIOException(e); 046 } 047 } 048 049 /** 050 * Sets last modified of path in milliseconds, if exists. 051 * 052 * @param path The path, may be {@code null}. 053 * @throws IOException If an I/O error occurs. Some exceptions/reasons of failure to set mtime may be swallowed, 054 * and can be multiple, ranging from "file not found" to cases when FS does not support the setting the mtime. 055 * @since 2.0.0 056 */ 057 void setLastModified(Path path, long value) throws IOException; 058 059 /** 060 * Returns size of file, if exists. 061 * 062 * @param path The path, may be {@code null}. 063 * @throws UncheckedIOException If an I/O error occurs. 064 */ 065 default long size(Path path, long defValue) { 066 try { 067 return Files.size(path); 068 } catch (NoSuchFileException e) { 069 return defValue; 070 } catch (IOException e) { 071 throw new UncheckedIOException(e); 072 } 073 } 074 075 /** 076 * Writes the given data to a file. UTF-8 is assumed as encoding for the data. Creates the necessary directories for 077 * the target file. In case of an error, the created directories will be left on the file system. 078 * 079 * @param target The file to write to, must not be {@code null}. This file will be overwritten. 080 * @param data The data to write, may be {@code null}. 081 * @throws IOException If an I/O error occurs. 082 */ 083 void write(Path target, String data) throws IOException; 084 085 /** 086 * Writes the given stream to a file. Creates the necessary directories for the target file. In case of an error, 087 * the created directories will be left on the file system. 088 * 089 * @param target The file to write to, must not be {@code null}. This file will be overwritten. 090 * @param source The stream to write to the file, must not be {@code null}. 091 * @throws IOException If an I/O error occurs. 092 */ 093 void write(Path target, InputStream source) throws IOException; 094 095 /** 096 * Moves the specified source file to the given target file. If the target file already exists, it is overwritten. 097 * Creates the necessary directories for the target file. In case of an error, the created directories will be left 098 * on the file system. 099 * 100 * @param source The file to move from, must not be {@code null}. 101 * @param target The file to move to, must not be {@code null}. 102 * @throws IOException If an I/O error occurs. 103 */ 104 void move(Path source, Path target) throws IOException; 105 106 /** 107 * Copies the specified source file to the given target file. Creates the necessary directories for the target file. 108 * In case of an error, the created directories will be left on the file system. 109 * 110 * @param source The file to copy from, must not be {@code null}. 111 * @param target The file to copy to, must not be {@code null}. 112 * @throws IOException If an I/O error occurs. 113 */ 114 default void copy(Path source, Path target) throws IOException { 115 copy(source, target, null); 116 } 117 118 /** 119 * Same as {@link #copy(Path, Path)} but sets source file last modified timestamp on target as well. 120 * 121 * @param source The file to copy from, must not be {@code null}. 122 * @param target The file to copy to, must not be {@code null}. 123 * @throws IOException If an I/O error occurs. 124 * @see #setLastModified(Path, long) 125 * @since 2.0.0 126 */ 127 default void copyWithTimestamp(Path source, Path target) throws IOException { 128 copy(source, target, null); 129 setLastModified(target, Files.getLastModifiedTime(source).toMillis()); 130 } 131 132 /** 133 * Copies the specified source file to the given target file. Creates the necessary directories for the target file. 134 * In case of an error, the created directories will be left on the file system. 135 * 136 * @param source The file to copy from, must not be {@code null}. 137 * @param target The file to copy to, must not be {@code null}. 138 * @param listener The listener to notify about the copy progress, may be {@code null}. 139 * @return The number of copied bytes. 140 * @throws IOException If an I/O error occurs. 141 */ 142 long copy(Path source, Path target, ProgressListener listener) throws IOException; 143 144 /** 145 * A listener object that is notified for every progress made while copying files. 146 * 147 * @see PathProcessor#copy(Path, Path, ProgressListener) 148 */ 149 interface ProgressListener { 150 151 void progressed(ByteBuffer buffer) throws IOException; 152 } 153}