/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, 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 Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.util; import java.io.File; import org.apache.commons.io.FilenameUtils; import org.datacleaner.configuration.DataCleanerConfiguration; import org.datacleaner.configuration.DataCleanerConfigurationImpl; import org.datacleaner.configuration.DataCleanerHomeFolder; /** * Helper class for resolving {@link File}s based on their path and a * base-directory and vice-versa. */ public class FileResolver { private final File _baseDir; public FileResolver(final DataCleanerConfiguration configuration) { this(configuration == null ? null : configuration.getHomeFolder()); } public FileResolver(final DataCleanerHomeFolder homeFolder) { if (homeFolder == null) { _baseDir = DataCleanerConfigurationImpl.defaultHomeFolder().toFile(); } else { _baseDir = homeFolder.toFile(); } } public FileResolver(final File baseDir) { if (baseDir == null) { throw new IllegalArgumentException("Base directory cannot be null"); } _baseDir = baseDir; } public File getBaseDirectory() { return _baseDir; } public File toFile(String filename) { if (filename == null) { return null; } filename = filename.trim(); if (filename.toLowerCase().startsWith("file://")) { filename = filename.substring("file://".length()); } final File file; final File nonParentCandidate = new File(filename); if (nonParentCandidate.isAbsolute()) { file = nonParentCandidate; } else { if (_baseDir == null || ".".equals(_baseDir.getPath())) { file = nonParentCandidate; } else { file = new File(_baseDir, filename); } } return file; } public String toPath(final File file) { if (file == null) { return null; } String path = file.getPath(); // Make relative if possible final String basePath = FilenameUtils.normalize(_baseDir.getAbsolutePath(), true); final String filePath = FilenameUtils.normalize(file.getAbsolutePath(), true); final boolean absolute; if (filePath.startsWith(basePath)) { path = filePath.substring(basePath.length()); absolute = false; } else { absolute = file.isAbsolute(); } path = StringUtils.replaceAll(path, "\\", "/"); if (!absolute) { // some normalization (because filenames are often used to compare // datastores) if (path.startsWith("/")) { path = path.substring(1); } if (path.startsWith("./")) { path = path.substring(2); } } return path; } }