/* * Copyright (c) 2016 Red Hat, Inc. and others. 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 */ package org.opendaylight.yangtools.checkstyle; import java.io.File; import java.nio.file.Path; import java.util.Optional; /** * Utility to convert absolute file name to path relative to project. * * <p>Current implementation use a sad heuristic based on detecting a pom.xml. * This is of course sub-optimal to say the very least. Improvements welcome. * * @see <a href="https://groups.google.com/forum/#!topic/checkstyle-devel/Rfwx81YhVQk">checkstyle-devel list thread</a> */ public class FileNameUtil { private FileNameUtil() { } static File getPathRelativeToMavenProjectRootIfPossible(File absoluteFile) { return getOptionalPathRelativeToMavenProjectRoot(absoluteFile).orElse(absoluteFile); } static Optional<File> getOptionalPathRelativeToMavenProjectRoot(File absoluteFile) { if (!absoluteFile.isAbsolute()) { return Optional.of(absoluteFile); } File projectRoot = absoluteFile; while (!isProjectRootDir(projectRoot) && projectRoot.getParentFile() != null) { projectRoot = projectRoot.getParentFile(); } if (isProjectRootDir(projectRoot)) { Path absolutePath = absoluteFile.toPath(); Path basePath = projectRoot.toPath(); Path relativePath = basePath.relativize(absolutePath); return Optional.of(relativePath.toFile()); } return Optional.empty(); } private static boolean isProjectRootDir(File file) { return new File(file, "pom.xml").exists(); } }