001 /* 002 * Licensed under the Apache License, Version 2.0 (the "License"); 003 * you may not use this file except in compliance with the License. 004 * You may obtain a copy of the License at 005 * 006 * http://www.apache.org/licenses/LICENSE-2.0 007 * 008 * Unless required by applicable law or agreed to in writing, software 009 * distributed under the License is distributed on an "AS IS" BASIS, 010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 011 * See the License for the specific language governing permissions and 012 * limitations under the License. 013 */ 014 package org.apache.commons.classscan.builtin; 015 016 import java.util.regex.Matcher; 017 import java.util.regex.Pattern; 018 019 /** 020 * Classname helper methods 021 */ 022 public final class ClassNameHelper { 023 private ClassNameHelper() { 024 } 025 026 private static final String IDENTIFIER_REGEX = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"; 027 private static final String FILE_REGEX = "(" + IDENTIFIER_REGEX + ")\\.class"; 028 029 private static final String PATH_REGEX = "((" + IDENTIFIER_REGEX + "/)*)" + FILE_REGEX; 030 private static Pattern pathPattern = Pattern.compile(PATH_REGEX); 031 032 /** 033 * Check if supplied path name is a valid pathed file name. The path must 034 * contain valid package names, the file name must be a valid Class name, 035 * and must be followed by ".class" 036 * 037 * @param path 038 * A file name with path 039 * @return The class name without the trailing ".class", with the dotted 040 * package prefix, or null if the supplied filename is invalid 041 */ 042 public static String getCannonicalClassNameFromPathName(String path) { 043 Matcher m = pathPattern.matcher(path); 044 if (m.matches()) { 045 String packagePrefix = m.group(1).replace('/', '.'); 046 String className = m.group(3); 047 return packagePrefix + className; 048 } 049 else { 050 return null; 051 } 052 } 053 054 private static Pattern IDENTIFIER_PACKAGE = Pattern.compile(IDENTIFIER_REGEX); 055 056 /** 057 * Check if supplied name is a valid java package name portion or class 058 * identifier. 059 * 060 * @param identifier 061 * The name of a package file 062 * @return true if the identifier is a valid part of a package or class name 063 */ 064 public static boolean isValidIdentifier(String identifier) { 065 Matcher ipm = IDENTIFIER_PACKAGE.matcher(identifier); 066 return ipm.matches(); 067 } 068 069 private static Pattern filePattern = Pattern.compile(FILE_REGEX); 070 071 /** 072 * Check if supplied file name is a valid class file name. The name must be 073 * a valid Class name followed by ".class" 074 * 075 * @param fileName 076 * The name of a file (without path) 077 * @return The class name without the trailing ".class", or null if the 078 * supplied filename is invalid 079 */ 080 public static String getClassNameFromFileName(String fileName) { 081 Matcher fpm = filePattern.matcher(fileName); 082 if (fpm.matches()) { 083 return fpm.group(1); 084 } 085 else { 086 return null; 087 } 088 } 089 090 /** 091 * Get the canonical name from the internal name 092 * 093 * @param internalName 094 * The internal name in the form Ljava/lang/Object; 095 * @return The canonical name in the form java.lang.Object 096 */ 097 public static String internalToCanonicalName(String internalName) { 098 return internalName.substring(1, internalName.length() - 1).replace('/', '.'); 099 } 100 }