1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.maven.cling.invoker; 20 21 import java.nio.file.Files; 22 import java.nio.file.Path; 23 import java.util.function.Supplier; 24 25 import org.apache.maven.api.annotations.Nonnull; 26 27 import static java.util.Objects.requireNonNull; 28 29 /** 30 * A thin wrapper for a {@link Path} that serves as "current working directory" value. Hence, this class 31 * is mutable (as CWD may be changed), but allows transition only to existing directories. 32 */ 33 public final class CWD implements Supplier<Path> { 34 /** 35 * Creates instance out of {@link Path}. 36 */ 37 public static CWD create(Path path) { 38 return new CWD(Utils.getCanonicalPath(path)); 39 } 40 41 private Path directory; 42 43 private CWD(Path directory) { 44 this.directory = directory; 45 } 46 47 @Nonnull 48 @Override 49 public Path get() { 50 return directory; 51 } 52 53 /** 54 * Resolves against current cwd, resulting path is normalized. 55 * 56 * @throws NullPointerException if {@code seg} is {@code null}. 57 */ 58 @Nonnull 59 public Path resolve(String seg) { 60 requireNonNull(seg, "seg"); 61 return directory.resolve(seg).normalize(); 62 } 63 64 /** 65 * Changes current cwd, if the new path is existing directory. 66 * 67 * @throws NullPointerException if {@code seg} is {@code null}. 68 * @throws IllegalArgumentException if {@code seg} leads to non-existent directory. 69 */ 70 public void change(String seg) { 71 Path newCwd = resolve(seg); 72 if (Files.isDirectory(newCwd)) { 73 this.directory = newCwd; 74 } else { 75 throw new IllegalArgumentException("Directory '" + directory + "' does not exist"); 76 } 77 } 78 }