1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.lang3; 18 19 import java.util.Objects; 20 21 /** 22 * Operations regarding the classpath. 23 * 24 * <p> 25 * The methods of this class do not allow {@code null} inputs. 26 * </p> 27 * 28 * @since 3.3 29 */ 30 //@Immutable 31 public class ClassPathUtils { 32 33 /** 34 * Converts a package name to a Java path ('/'). 35 * 36 * @param path the source path. 37 * @return a package name. 38 * @throws NullPointerException if {@code path} is null. 39 * @since 3.13.0 40 */ 41 public static String packageToPath(final String path) { 42 return Objects.requireNonNull(path, "path").replace('.', '/'); 43 } 44 45 /** 46 * Converts a Java path ('/') to a package name. 47 * 48 * @param path the source path. 49 * @return a package name. 50 * @throws NullPointerException if {@code path} is null. 51 * @since 3.13.0 52 */ 53 public static String pathToPackage(final String path) { 54 return Objects.requireNonNull(path, "path").replace('/', '.'); 55 } 56 57 /** 58 * Returns the fully qualified name for the resource with name {@code resourceName} relative to the given context. 59 * 60 * <p> 61 * Note that this method does not check whether the resource actually exists. It only constructs the name. Null inputs are not allowed. 62 * </p> 63 * 64 * <pre> 65 * ClassPathUtils.toFullyQualifiedName(StringUtils.class, "StringUtils.properties") = "org.apache.commons.lang3.StringUtils.properties" 66 * </pre> 67 * 68 * @param context The context for constructing the name. 69 * @param resourceName the resource name to construct the fully qualified name for. 70 * @return the fully qualified name of the resource with name {@code resourceName}. 71 * @throws NullPointerException if either {@code context} or {@code resourceName} is null. 72 */ 73 public static String toFullyQualifiedName(final Class<?> context, final String resourceName) { 74 Objects.requireNonNull(context, "context"); 75 Objects.requireNonNull(resourceName, "resourceName"); 76 return toFullyQualifiedName(context.getPackage(), resourceName); 77 } 78 79 /** 80 * Returns the fully qualified name for the resource with name {@code resourceName} relative to the given context. 81 * 82 * <p> 83 * Note that this method does not check whether the resource actually exists. It only constructs the name. Null inputs are not allowed. 84 * </p> 85 * 86 * <pre> 87 * ClassPathUtils.toFullyQualifiedName(StringUtils.class.getPackage(), "StringUtils.properties") = "org.apache.commons.lang3.StringUtils.properties" 88 * </pre> 89 * 90 * @param context The context for constructing the name. 91 * @param resourceName the resource name to construct the fully qualified name for. 92 * @return the fully qualified name of the resource with name {@code resourceName}. 93 * @throws NullPointerException if either {@code context} or {@code resourceName} is null. 94 */ 95 public static String toFullyQualifiedName(final Package context, final String resourceName) { 96 Objects.requireNonNull(context, "context"); 97 Objects.requireNonNull(resourceName, "resourceName"); 98 return context.getName() + "." + resourceName; 99 } 100 101 /** 102 * Returns the fully qualified path for the resource with name {@code resourceName} relative to the given context. 103 * 104 * <p> 105 * Note that this method does not check whether the resource actually exists. It only constructs the path. Null inputs are not allowed. 106 * </p> 107 * 108 * <pre> 109 * ClassPathUtils.toFullyQualifiedPath(StringUtils.class, "StringUtils.properties") = "org/apache/commons/lang3/StringUtils.properties" 110 * </pre> 111 * 112 * @param context The context for constructing the path. 113 * @param resourceName the resource name to construct the fully qualified path for. 114 * @return the fully qualified path of the resource with name {@code resourceName}. 115 * @throws NullPointerException if either {@code context} or {@code resourceName} is null. 116 */ 117 public static String toFullyQualifiedPath(final Class<?> context, final String resourceName) { 118 Objects.requireNonNull(context, "context"); 119 Objects.requireNonNull(resourceName, "resourceName"); 120 return toFullyQualifiedPath(context.getPackage(), resourceName); 121 } 122 123 /** 124 * Returns the fully qualified path for the resource with name {@code resourceName} relative to the given context. 125 * 126 * <p> 127 * Note that this method does not check whether the resource actually exists. It only constructs the path. Null inputs are not allowed. 128 * </p> 129 * 130 * <pre> 131 * ClassPathUtils.toFullyQualifiedPath(StringUtils.class.getPackage(), "StringUtils.properties") = "org/apache/commons/lang3/StringUtils.properties" 132 * </pre> 133 * 134 * @param context The context for constructing the path. 135 * @param resourceName the resource name to construct the fully qualified path for. 136 * @return the fully qualified path of the resource with name {@code resourceName}. 137 * @throws NullPointerException if either {@code context} or {@code resourceName} is null. 138 */ 139 public static String toFullyQualifiedPath(final Package context, final String resourceName) { 140 Objects.requireNonNull(context, "context"); 141 Objects.requireNonNull(resourceName, "resourceName"); 142 return packageToPath(context.getName()) + "/" + resourceName; 143 } 144 145 /** 146 * {@link ClassPathUtils} instances should NOT be constructed in standard programming. Instead, the class should be used as 147 * {@code ClassPathUtils.toFullyQualifiedName(MyClass.class, "MyClass.properties");}. 148 * 149 * <p> 150 * This constructor is public to permit tools that require a JavaBean instance to operate. 151 * </p> 152 * 153 * @deprecated TODO Make private in 4.0. 154 */ 155 @Deprecated 156 public ClassPathUtils() { 157 // empty 158 } 159 160 }