FileSystemUtilities.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* 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, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.resources;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.UtilsException;
/**
* Classe utilizzabile per raccogliere utility su operazioni effettuate su file system
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class FileSystemUtilities {
private FileSystemUtilities() {}
public static File createTempFile(String prefix, String suffix) throws IOException{
Path p = createTempPath(prefix, suffix);
if(p==null) {
throw new IOException("Creation failed");
}
return p.toFile();
}
public static Path createTempPath(String prefix, String suffix) throws IOException{
return Utilities.createTempPath(prefix, suffix);
}
public static File createTempFile(File dir, String prefix, String suffix) throws IOException{
Path p = createTempPath(dir.toPath(), prefix, suffix);
if(p==null) {
throw new IOException("Creation failed");
}
return p.toFile();
}
public static Path createTempPath(Path dir, String prefix, String suffix) throws IOException{
return Utilities.createTempPath(dir, prefix, suffix);
}
public static void copy(File in, File out) throws IOException {
FileSystemUtilities.copy(in.getAbsolutePath(),out.getAbsolutePath());
}
public static void copy(String in, String out)
throws IOException {
try(FileInputStream fin = new FileInputStream(in);
FileOutputStream fout = new FileOutputStream(out);){
FileSystemUtilities.copy(fin,fout);
fout.flush();
}
}
public static void copy(InputStream in, OutputStream out)
throws IOException {
byte[] buffer = new byte[256];
while (true) {
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
public static void copyDirectory(String srcPath, String dstPath)
throws IOException{
FileSystemUtilities.copyDirectory(new File(srcPath), new File(dstPath));
}
public static void copyDirectory(File srcPath, File dstPath)
throws IOException{
if (srcPath.isDirectory()){
if (!dstPath.exists()){
dstPath.mkdir();
}
String[] files = srcPath.list();
if(files!=null) {
for(int i = 0; i < files.length; i++){
FileSystemUtilities.copyDirectory(new File(srcPath, files[i]),
new File(dstPath, files[i]));
}
}
}
else{
if(!srcPath.exists()){
/** System.out.println("File or directory does not exist."); */
}
else {
try (InputStream in = new FileInputStream(srcPath);
OutputStream out = new FileOutputStream(dstPath);){
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.flush();
}
}
}
/** System.out.println("Directory copied."); */
}
public static String readFile(String f) throws UtilsException, FileNotFoundException{
return FileSystemUtilities.readFile(new File(f));
}
public static String readFile(File f) throws UtilsException, FileNotFoundException{
return readFileEngine(f, null, null);
}
public static String readFile(String f, String charsetName) throws UtilsException, FileNotFoundException{
return FileSystemUtilities.readFile(new File(f),charsetName);
}
public static String readFile(File f, String charsetName) throws UtilsException, FileNotFoundException{
return readFileEngine(f, charsetName, null);
}
public static String readFile(String f, Charset charset) throws UtilsException, FileNotFoundException{
return FileSystemUtilities.readFile(new File(f), charset);
}
public static String readFile(File f, Charset charset) throws UtilsException, FileNotFoundException{
return readFileEngine(f, null, charset);
}
private static String readFileEngine(File f, String charsetName, Charset charset) throws UtilsException, FileNotFoundException{
try (FileInputStream fis =new FileInputStream(f);
ByteArrayOutputStream byteInputBuffer = new ByteArrayOutputStream();){
byte [] readB = new byte[8192];
int readByte = 0;
while((readByte = fis.read(readB))!= -1){
byteInputBuffer.write(readB,0,readByte);
}
byteInputBuffer.flush();
if(charsetName!=null) {
return byteInputBuffer.toString(charsetName);
}
else if(charset!=null) {
return byteInputBuffer.toString(charset);
}
else {
return byteInputBuffer.toString();
}
}
catch(FileNotFoundException notFound) {
throw notFound;
}
catch(Exception e) {
throw new UtilsException(e.getMessage(),e);
}
}
public static byte[] readBytesFromFile(String f) throws UtilsException, FileNotFoundException{
return FileSystemUtilities.readBytesFromFile(new File(f));
}
public static byte[] readBytesFromFile(File f) throws UtilsException, FileNotFoundException{
try (FileInputStream fis =new FileInputStream(f);
ByteArrayOutputStream byteInputBuffer = new ByteArrayOutputStream();){
byte [] readB = new byte[8192];
int readByte = 0;
while((readByte = fis.read(readB))!= -1){
byteInputBuffer.write(readB,0,readByte);
}
byteInputBuffer.flush();
return byteInputBuffer.toByteArray();
}
catch(FileNotFoundException notFound) {
throw notFound;
}
catch(Exception e) {
throw new UtilsException(e.getMessage(),e);
}
}
public static void writeFile(String f,byte[] contenuto)throws UtilsException{
FileSystemUtilities.writeFile(new File(f), contenuto);
}
public static void writeFile(File f,byte[] contenuto)throws UtilsException{
try (FileOutputStream fos = new FileOutputStream(f);){
fos.write(contenuto);
fos.flush();
}
catch(Exception e) {
throw new UtilsException(e.getMessage(),e);
}
}
public static void writeFile(String f,byte[] ... args)throws UtilsException{
FileSystemUtilities.writeFile(new File(f), args);
}
public static void writeFile(File f,byte[] ... args)throws UtilsException{
if(args!=null){
try (FileOutputStream fos = new FileOutputStream(f);){
for(int i=0; i<args.length; i++){
fos.write(args[i]);
}
fos.flush();
}
catch(Exception e) {
throw new UtilsException(e.getMessage(),e);
}
}
}
public static void copyFileAndReplaceAllKeywords(String read,String write,String keyword,String values) throws UtilsException, FileNotFoundException{
FileSystemUtilities.copyFileAndReplaceAllKeywords(new File(read),new File(write),keyword,values);
}
public static void copyFileAndReplaceAllKeywords(File read,File write,String keyword,String values) throws UtilsException, FileNotFoundException{
String[]k = new String[1];
k[0] = keyword;
String[]v = new String[1];
v[0] = values;
FileSystemUtilities.copyFileAndReplaceAllKeywords(read, write, k, v);
}
public static void copyFileAndReplaceAllKeywords(String read,String write,String[] keyword,String[] values) throws UtilsException, FileNotFoundException{
FileSystemUtilities.copyFileAndReplaceAllKeywords(new File(read),new File(write),keyword,values);
}
public static void copyFileAndReplaceAllKeywords(File read,File write,String[] keyword,String[] values) throws UtilsException, FileNotFoundException{
String file = FileSystemUtilities.readFile(read);
for(int i=0; i<keyword.length; i++){
/** System.out.println("FILE ["+file+"] contains ["+keyword[i]+"] (value:"+file.indexOf(keyword[i])+")"); */
int indexOf = file.indexOf(keyword[i]);
while(indexOf>=0){
/** System.out.println("REPLACE ["+keyword[i]+"] ["+values[i]+"]"); */
file = file.replace(keyword[i], values[i]);
indexOf = file.indexOf(keyword[i],indexOf+values[i].length());
/** System.out.println("INDEX OF ["+indexOf+"]"); */
}
}
FileSystemUtilities.writeFile(write, file.getBytes());
}
public static void copyFileAndReplaceKeywords(String read,String write,String keyword,String values) throws UtilsException, FileNotFoundException{
FileSystemUtilities.copyFileAndReplaceKeywords(new File(read),new File(write),keyword,values);
}
public static void copyFileAndReplaceKeywords(File read,File write,String keyword,String values) throws UtilsException, FileNotFoundException{
String[]k = new String[1];
k[0] = keyword;
String[]v = new String[1];
v[0] = values;
FileSystemUtilities.copyFileAndReplaceKeywords(read, write, k, v);
}
public static void copyFileAndReplaceKeywords(String read,String write,String[] keyword,String[] values) throws UtilsException, FileNotFoundException{
FileSystemUtilities.copyFileAndReplaceKeywords(new File(read),new File(write),keyword,values);
}
public static void copyFileAndReplaceKeywords(File read,File write,String[] keyword,String[] values) throws UtilsException, FileNotFoundException{
String file = FileSystemUtilities.readFile(read);
for(int i=0; i<keyword.length; i++){
file = file.replace(keyword[i], values[i]);
}
FileSystemUtilities.writeFile(write, file.getBytes());
}
public static boolean emptyDir(String dir) {
File d = new File(dir);
if(!d.exists()){
return true;
}
return FileSystemUtilities.emptyDir(d);
}
public static boolean emptyDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
if(children!=null && children.length>0) {
for (int i=0; i<children.length; i++) {
boolean success = FileSystemUtilities.deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
}
return true;
}
public static boolean deleteDirNotEmpty(String dir, int maxChilds) {
return deleteDirNotEmpty(new File(dir), maxChilds);
}
public static boolean deleteDirNotEmpty(File dir, int maxChilds) {
return deleteDirNotEmpty(dir, maxChilds , 0);
}
private static boolean deleteDirNotEmpty(File dir, int maxChilds, int level) {
if (emptyDir(dir)) {
deleteDir(dir);
return true;
}
else {
if(maxChilds==level) {
return false;
}
File [] childs = dir.listFiles();
if(childs!=null && childs.length>0) {
return deleteDirNotEmpty(childs, maxChilds, level);
}
return true;
}
}
private static boolean deleteDirNotEmpty(File [] childs, int maxChilds, int level) {
boolean ok = true;
for (File file : childs) {
if(file.isDirectory()) {
boolean v = deleteDirNotEmpty(file, maxChilds , level+1);
if(!v) {
ok = false;
}
}
else {
try {
Files.delete(file.toPath());
}catch(Exception e) {
ok = false;
}
}
}
return ok;
}
public static boolean deleteDir(String dir) {
File d = new File(dir);
if(!d.exists()){
return true;
}
return FileSystemUtilities.deleteDir(d);
}
public static boolean deleteDir(File dir) {
if (!emptyDir(dir)) {
return false;
}
// The directory is now empty so now it can be smoked
try {
Files.delete(dir.toPath());
return true;
}catch(Exception e) {
return false;
}
}
public static void deleteFile(File f) {
try {
if(f!=null) {
java.nio.file.Files.delete(f.toPath());
}
}catch(Exception e) {
// ignore
}
}
public static void clearFile(File f) {
try {
if(f!=null) {
try(FileOutputStream fos = new FileOutputStream(f);){
byte[] emptyBytes = new byte[0];
fos.write(emptyBytes);
fos.flush();
}
}
}catch(Exception e) {
// ignore
}
}
public static boolean moveToDir(String src,String destDir){
// File (or directory) to be moved
File file = new File(src);
// Destination directory
File dir = new File(destDir);
return FileSystemUtilities.moveToDir(file,dir);
}
public static boolean moveToDir(File src,File destDir){
// Move file to new directory
return src.renameTo(new File(destDir, src.getName()));
}
public static boolean moveToFile(String src,String destFile){
// File (or directory) to be moved
File file = new File(src);
// Destination directory
File dir = new File(destFile);
return FileSystemUtilities.moveToDir(file,dir);
}
public static boolean moveToFile(File src,File destFile){
// Move file to new directory
return src.renameTo(destFile);
}
public static void mkdirParentDirectory(File file) throws UtilsException {
FileSystemUtilities.mkdirParentDirectory(file.getAbsolutePath());
}
public static void mkdirParentDirectory(File file,
Boolean readable, Boolean readableOwnerOnly,
Boolean writable, Boolean writableOwnerOnly,
Boolean executable, Boolean executableOwnerOnly) throws UtilsException {
FileSystemUtilities.mkdirParentDirectory(file.getAbsolutePath(),
readable, readableOwnerOnly,
writable, writableOwnerOnly,
executable, executableOwnerOnly);
}
public static void mkdirParentDirectory(String file) throws UtilsException {
mkdirParentDirectory(file,
null, null,
null, null,
null, null);
}
public static void mkdirParentDirectory(String file,
Boolean readable, Boolean readableOwnerOnly,
Boolean writable, Boolean writableOwnerOnly,
Boolean executable, Boolean executableOwnerOnly) throws UtilsException {
try{
File p = new File(file);
if(p.getParentFile()==null){
return;
}
if(p.getParentFile().exists()){
return;
}
FileSystemUtilities.mkdirParentDirectory(p.getParentFile().getAbsolutePath());
if(!p.getParentFile().mkdir()){
throw new UtilsException(DIRECTORY_PREFIX_MSG+p.getParentFile().getAbsolutePath()+"] non esistente e creazione non riuscita");
}
else {
setRWX(p,
readable, readableOwnerOnly,
writable, writableOwnerOnly,
executable, executableOwnerOnly);
}
}catch(Exception e){
throw new UtilsException("mkdirParentDirectory non riuscito: "+e.getMessage(),e);
}
}
private static void setRWX(File p,
Boolean readable, Boolean readableOwnerOnly,
Boolean writable, Boolean writableOwnerOnly,
Boolean executable, Boolean executableOwnerOnly) {
setParentR(p, readable, readableOwnerOnly);
setParentW(p, writable, writableOwnerOnly);
setParentX(p, executable, executableOwnerOnly);
}
private static void setParentR(File p, Boolean readable, Boolean readableOwnerOnly) {
if(readable!=null) {
if(readableOwnerOnly!=null) {
if(!p.getParentFile().setReadable(readable, readableOwnerOnly)) {
// ignore
}
}
else {
if(!p.getParentFile().setReadable(readable)) {
// ignore
}
}
}
}
private static void setParentW(File p, Boolean writable, Boolean writableOwnerOnly) {
if(writable!=null) {
if(writableOwnerOnly!=null) {
if(!p.getParentFile().setWritable(writable, writableOwnerOnly)) {
// ignore
}
}
else {
if(!p.getParentFile().setWritable(writable)) {
// ignore
}
}
}
}
private static void setParentX(File p, Boolean executable, Boolean executableOwnerOnly) {
if(executable!=null) {
if(executableOwnerOnly!=null) {
if(!p.getParentFile().setExecutable(executable, executableOwnerOnly)) {
// ignore
}
}
else {
if(!p.getParentFile().setExecutable(executable)) {
// ignore
}
}
}
}
public static void mkdir(String f) throws UtilsException{
mkdir(f, new FileSystemMkdirConfig());
}
public static void mkdir(String f,
Boolean readable, Boolean readableOwnerOnly,
Boolean writable, Boolean writableOwnerOnly,
Boolean executable, Boolean executableOwnerOnly) throws UtilsException{
mkdir(f, new FileSystemMkdirConfig(),
new FileRWXConfig(readable, readableOwnerOnly,
writable, writableOwnerOnly,
executable, executableOwnerOnly));
}
public static void mkdir(String f,
FileRWXConfig rwxConfig) throws UtilsException{
mkdir(f, new FileSystemMkdirConfig(), rwxConfig);
}
public static void mkdir(String f, FileSystemMkdirConfig config) throws UtilsException{
File dir = new File(f);
mkdir(dir, config);
}
public static void mkdir(String f, FileSystemMkdirConfig config,
FileRWXConfig rwxConfig) throws UtilsException{
File dir = new File(f);
mkdir(dir, config, rwxConfig);
}
public static void mkdir(File dir) throws UtilsException{
mkdir(dir, new FileSystemMkdirConfig());
}
public static void mkdir(File dir,
Boolean readable, Boolean readableOwnerOnly,
Boolean writable, Boolean writableOwnerOnly,
Boolean executable, Boolean executableOwnerOnly) throws UtilsException{
mkdir(dir, new FileSystemMkdirConfig(),
new FileRWXConfig(readable, readableOwnerOnly,
writable, writableOwnerOnly,
executable, executableOwnerOnly));
}
public static void mkdir(File dir, FileRWXConfig rwxConfig) throws UtilsException{
mkdir(dir, new FileSystemMkdirConfig(), rwxConfig);
}
public static void mkdir(File dir, FileSystemMkdirConfig config) throws UtilsException{
mkdir(dir, config, null);
}
public static void mkdir(File dir, FileSystemMkdirConfig config,
FileRWXConfig rwxConfig) throws UtilsException{
Boolean readable = null;
Boolean readableOwnerOnly = null;
Boolean writable = null;
Boolean writableOwnerOnly = null;
Boolean executable = null;
Boolean executableOwnerOnly = null;
if(rwxConfig!=null) {
readable = rwxConfig.getReadable();
readableOwnerOnly = rwxConfig.getReadableOwnerOnly();
writable = rwxConfig.getWritable();
writableOwnerOnly = rwxConfig.getWritableOwnerOnly();
executable = rwxConfig.getExecutable();
executableOwnerOnly = rwxConfig.getExecutableOwnerOnly();
}
if(dir.exists()){
checkDir(dir, config);
}
else{
if(dir.getParentFile()!=null) {
File parent = dir.getParentFile();
if(!parent.exists() &&
config.crateParentIfNotExists) {
mkdirParentDirectory(dir,
readable, readableOwnerOnly,
writable, writableOwnerOnly,
executable, executableOwnerOnly);
}
}
if(!dir.mkdir()){
throw new UtilsException("Creazione directory ["+dir.getAbsolutePath()+"] non riuscita");
}
else {
setR(dir, readable, readableOwnerOnly);
setW(dir, writable, writableOwnerOnly);
setX(dir, executable, executableOwnerOnly);
}
}
}
private static void checkDir(File dir, FileSystemMkdirConfig config) throws UtilsException {
if(!dir.isDirectory()){
throw new UtilsException("File ["+dir.getAbsolutePath()+"] is not directory");
}
if(config.isCheckCanRead() &&
!dir.canRead()){
throw new UtilsException(DIRECTORY_PREFIX_MSG+dir.getAbsolutePath()+"] cannot read");
}
if(config.isCheckCanWrite() &&
!dir.canWrite()){
throw new UtilsException(DIRECTORY_PREFIX_MSG+dir.getAbsolutePath()+"] cannot write");
}
if(config.isCheckCanExecute() &&
!dir.canExecute()){
throw new UtilsException(DIRECTORY_PREFIX_MSG+dir.getAbsolutePath()+"] cannot execute");
}
}
private static void setR(File dir, Boolean readable, Boolean readableOwnerOnly) {
if(readable!=null) {
if(readableOwnerOnly!=null) {
if(!dir.setReadable(readable, readableOwnerOnly)) {
// ignore
}
}
else {
if(!dir.setReadable(readable)) {
// ignore
}
}
}
}
private static void setW(File dir, Boolean writable, Boolean writableOwnerOnly) {
if(writable!=null) {
if(writableOwnerOnly!=null) {
if(!dir.setWritable(writable, writableOwnerOnly)) {
// ignore
}
}
else {
if(!dir.setWritable(writable)) {
// ignore
}
}
}
}
private static void setX(File dir, Boolean executable, Boolean executableOwnerOnly) {
if(executable!=null) {
if(executableOwnerOnly!=null) {
if(!dir.setExecutable(executable, executableOwnerOnly)) {
// ignore
}
}
else {
if(!dir.setExecutable(executable)) {
// ignore
}
}
}
}
private static final String DIRECTORY_PREFIX_MSG = "Directory [";
}