001 // Copyright 2007 Google Inc. All Rights Reserved. 002 003 package org.shiftone.jrat.core; 004 005 import java.io.Serializable; 006 import java.util.*; 007 008 /** 009 * @author jeff@shiftone.org (Jeff Drost) 010 */ 011 public class ClassKey implements Serializable, Comparable { 012 private static final long serialVersionUID = 1; 013 private String packageName; 014 private String className; 015 private int hashCode; 016 017 private static final Map CACHE = new HashMap(); //<String, ClassKey> 018 019 public static ClassKey getInstance(String fullyQualifiedClassName) { 020 ClassKey classKey = (ClassKey) CACHE.get(fullyQualifiedClassName); 021 if (classKey == null) { 022 classKey = new ClassKey(fullyQualifiedClassName); 023 } 024 return classKey; 025 } 026 027 private ClassKey(String fullyQualifiedClassName) { 028 029 int dot = fullyQualifiedClassName.lastIndexOf('.'); 030 this.packageName = (dot == -1) 031 ? "" 032 : fullyQualifiedClassName.substring(0, dot).intern(); 033 034 this.className = (dot == -1) 035 ? fullyQualifiedClassName 036 : fullyQualifiedClassName.substring(dot + 1); 037 038 hashCode = packageName.hashCode(); 039 hashCode = (29 * hashCode) + className.hashCode(); 040 } 041 042 043 /** 044 * Gets the package's name in pieces. 045 */ 046 public String[] getPackageNameParts() { 047 String[] result = new String[0]; 048 if (packageName.length() != 0) { 049 StringTokenizer st = new StringTokenizer(packageName, "."); 050 List parts = new ArrayList(); 051 while (st.hasMoreTokens()) { 052 parts.add(st.nextToken()); 053 } 054 result = (String[]) parts.toArray(new String[parts.size()]); 055 } 056 return result; 057 } 058 059 public String getPackageName() { 060 return packageName; 061 } 062 063 public final String getFullyQualifiedClassName() { 064 return (packageName.length() == 0) 065 ? className 066 : packageName + "." + className; 067 } 068 069 public String getClassName() { 070 return className; 071 } 072 073 public final boolean equals(Object o) { 074 075 if (this == o) { 076 return true; 077 } 078 079 if (!(o instanceof ClassKey)) { 080 return false; 081 } 082 083 final ClassKey other = (ClassKey) o; 084 085 if (!other.equals(other)) { 086 return false; 087 } 088 089 if (!className.equals(other.className)) { 090 return false; 091 } 092 093 if (!packageName.equals(other.packageName)) { 094 return false; 095 } 096 097 return true; 098 } 099 100 public int hashCode() { 101 return hashCode; 102 } 103 104 public int compareTo(Object o) { 105 ClassKey other = (ClassKey) o; 106 int c = packageName.compareTo(other.packageName); 107 if (c == 0) { 108 c = className.compareTo(other.className); 109 } 110 return c; 111 } 112 113 }