1   package com.atlassian.plugins.codegen;
2   
3   import static com.google.common.base.Preconditions.checkNotNull;
4   
5   /**
6    * Simple wrapper for a fully qualified class name.
7    */
8   public final class ClassId
9   {
10      private final String packageName;
11      private final String className;
12      
13      public static ClassId packageAndClass(String packageName, String className)
14      {
15          return new ClassId(packageName, className); 
16      }
17      
18      public static ClassId fullyQualified(String fullyQualifiedClassName)
19      {
20          checkNotNull(fullyQualifiedClassName);
21          int lastDotPos = fullyQualifiedClassName.lastIndexOf(".");
22          if (lastDotPos > 0)
23          {
24              return new ClassId(fullyQualifiedClassName.substring(0, lastDotPos),
25                                 fullyQualifiedClassName.substring(lastDotPos + 1));
26          }
27          else
28          {
29              return new ClassId("", fullyQualifiedClassName);
30          }
31      }
32      
33      private ClassId(String packageName, String className)
34      {
35          this.packageName = checkNotNull(packageName, "packageName");
36          this.className = checkNotNull(className, "className");
37      }
38      
39      /**
40       * Returns a copy of this instance with the package name changed and the class name unchanged.
41       */
42      public ClassId packageName(String packageName)
43      {
44          return new ClassId(packageName, this.className);
45      }
46      
47      /**
48       * Returns a copy of this instance with a prefix added to the package name.
49       */
50      public ClassId packageNamePrefix(String prefix)
51      {
52          return new ClassId(packageName.equals("") ? prefix : (prefix + "." + packageName), className);
53      }
54      
55      /**
56       * Returns a copy of this instance with the class name changed and the package name unchanged.
57       */
58      public ClassId className(String className)
59      {
60          return new ClassId(this.packageName, className);
61      }
62  
63      /**
64       * Returns a copy of this instance with a suffix added to the class name.
65       */
66      public ClassId classNameSuffix(String suffix)
67      {
68          return new ClassId(this.packageName, this.className + suffix);
69      }
70      
71      public String getPackage()
72      {
73          return packageName;
74      }
75      
76      public String getName()
77      {
78          return className;
79      }
80  
81      public String getFullName()
82      {
83          return packageName.equals("") ? className : (packageName + "." + className);
84      }
85      
86      @Override
87      public String toString()
88      {
89          return getFullName();
90      }
91      
92      @Override
93      public boolean equals(Object other)
94      {
95          if (other instanceof ClassId)
96          {
97              ClassId c = (ClassId) other;
98              return className.equals(c.className) && packageName.equals(c.packageName);
99          }
100         return false;
101     }
102     
103     @Override
104     public int hashCode()
105     {
106         return getFullName().hashCode();
107     }
108 }