/******************************************************************************* * Copyright (c) 2014 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.utilbox.misc; import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail; import java.io.File; import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; import melnorme.utilbox.core.CommonException; public class PathUtil { public static final Path DEFAULT_ROOT_PATH = createValidPath("").toAbsolutePath().getRoot(); public static final Location DEFAULT_ROOT_LOC = Location.fromAbsolutePath(DEFAULT_ROOT_PATH); /** @return a valid path, * or null if a valid path could not be created from given pathString. */ public static Path createPathOrNull(String pathString) { try { return Paths.get(pathString); } catch (InvalidPathException ipe) { return null; } } /** @return a valid path. Given pathString must represent a valid path. */ public static Path createValidPath(String pathString) { try { return Paths.get(pathString); } catch (InvalidPathException ipe) { throw assertFail(); } } public static Path createPath(String pathString) throws CommonException { return createPath(pathString, "Invalid path: "); } public static Path createResolvedPath(String basePath, String subPath) throws CommonException { return createPath(basePath).resolve(createPath(subPath)).normalize(); } /** @return a valid path from given pathString. * @throws CommonException if a valid path could not be created. * Given errorMessagePrefix will be used as a prefix in {@link CommonException}'s message. */ public static Path createPath(String pathString, String errorMessagePrefix) throws CommonException { try { return Paths.get(pathString); } catch (InvalidPathException ipe) { String pathMessage = ipe.getMessage(); if(pathMessage == null) { pathMessage = ipe.toString(); } throw new CommonException(errorMessagePrefix + pathMessage); } } public static Path getParentOrEmpty(Path path) throws CommonException { Path parent = path.getParent(); return parent == null ? createValidPath("") : parent; } public static Path toPath(Location location) { return location == null ? null : location.toPath(); } /* ----------------- ----------------- */ public static String concatenatePath(String basePath, String subPath) { return concatenatePath(basePath, subPath, File.separator); } /** Concatenate a basepath with a subpath. * This method is notable for not using the {@link Path} API, therefore it works even on invalid paths. */ public static String concatenatePath(String basePath, String subPath, String separator) { if(basePath.isEmpty()) { return subPath; } if(!basePath.endsWith(separator)) { basePath += separator; } return basePath + subPath; } }