/* * Copyright (c) 2016 the original author or authors. * 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: * Etienne Studer & Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation */ package org.eclipse.buildship.core.util.file; import com.google.common.base.Preconditions; import org.eclipse.core.runtime.IPath; /** * Contains helper methods to convert absolute paths to relative paths and vica versa. */ public final class RelativePathUtils { private RelativePathUtils() { } /** * Calculates the relative path from a base to a target path. * * @param base the base path to make the target path relative to * @param target the target file to which the relative path is calculated * @return the relative path from the base to the target location * @throws NullPointerException if an argument is {@code null} * @throws IllegalArgumentException if an argument does not denote an absolute path */ public static IPath getRelativePath(IPath base, IPath target) { Preconditions.checkNotNull(base); Preconditions.checkNotNull(target); Preconditions.checkArgument(base.isAbsolute()); Preconditions.checkArgument(target.isAbsolute()); return target.makeRelativeTo(base); } /** * Calculates the absolute path from a base to a relative target location. * * @param base the base path * @param relativePath the relative path from the base to the target * @return the absolute path to the target location * @throws NullPointerException if an argument is {@code null} * @throws IllegalArgumentException if a) the base path does not denote an absolute path b) the * target path does not denote a relative path, or c) the relative path is invalid * (i.e. points above the root folder) */ public static IPath getAbsolutePath(IPath base, IPath relativePath) { Preconditions.checkNotNull(base); Preconditions.checkNotNull(relativePath); Preconditions.checkArgument(base.isAbsolute()); Preconditions.checkArgument(!relativePath.isAbsolute()); IPath result = base; for (String segment : relativePath.segments()) { IPath newResult = result.append(segment); // Appending a '..' segment to the root path does not fail but returns a new path object // see org.eclipse.core.runtime.Path.removeLastSegment(int) if (segment.equals("..") && newResult.segmentCount() >= result.segmentCount()) { throw new IllegalArgumentException(String.format("Relative path can't point beyond the root (base=%s, relativePath=%s).", base, relativePath)); } result = newResult; } return result; } }