You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by jg...@apache.org on 2009/06/16 23:55:58 UTC

svn commit: r785424 - in /ibatis/trunk/java/tools/ibator/core: build/ doc/ htmldoc/ src/org/apache/ibatis/ibator/api/dom/ src/org/apache/ibatis/ibator/api/dom/java/ test/org/apache/ibatis/ibator/api/ test/org/apache/ibatis/ibator/api/dom/ test/org/apac...

Author: jgbutler
Date: Tue Jun 16 21:55:57 2009
New Revision: 785424

URL: http://svn.apache.org/viewvc?rev=785424&view=rev
Log:
[Ibator] Fix for IBATIS-609 - incorrect parsing of Java generic types

Added:
    ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/
    ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/
    ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/
    ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java
Modified:
    ibatis/trunk/java/tools/ibator/core/build/version.properties
    ibatis/trunk/java/tools/ibator/core/doc/ReleaseNotes.txt
    ibatis/trunk/java/tools/ibator/core/htmldoc/whatsNew.html
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/OutputUtilities.java
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/CompilationUnit.java
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaType.java
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/Interface.java
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelClass.java
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelEnumeration.java

Modified: ibatis/trunk/java/tools/ibator/core/build/version.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/build/version.properties?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/build/version.properties (original)
+++ ibatis/trunk/java/tools/ibator/core/build/version.properties Tue Jun 16 21:55:57 2009
@@ -1,4 +1,4 @@
 #Ibator build version info
-#Mon Jun 08 17:15:58 CDT 2009
+#Tue Jun 16 16:44:16 CDT 2009
 version=1.2.2
-buildNum=742
+buildNum=744

Modified: ibatis/trunk/java/tools/ibator/core/doc/ReleaseNotes.txt
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/doc/ReleaseNotes.txt?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/doc/ReleaseNotes.txt (original)
+++ ibatis/trunk/java/tools/ibator/core/doc/ReleaseNotes.txt Tue Jun 16 21:55:57 2009
@@ -11,6 +11,7 @@
 3. Fixed NPE and incorrect calculation in generated equals when certain
    fields are null - thanks to Benjamin Klatt for finding this bug
 4. Fixed IBATIS-601 - improper validation of <generatedKey>
+5. Fixed IBATIS-609 - incorrect parsing of Java generic types
 
 Enhancements:
 1. IBATIS-569 - Make it easier to override IbatorRules in plugins

Modified: ibatis/trunk/java/tools/ibator/core/htmldoc/whatsNew.html
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/htmldoc/whatsNew.html?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/htmldoc/whatsNew.html (original)
+++ ibatis/trunk/java/tools/ibator/core/htmldoc/whatsNew.html Tue Jun 16 21:55:57 2009
@@ -60,6 +60,7 @@
       (from EqualsHashCodePlugin) when certain
       fields are null - thanks to Benjamin Klatt for finding this bug.</li>
   <li>IBATIS-601 - improper validation of &lt;generatedKey&gt;</li>
+  <li>IBATIS-609 - incorrect parsing of Java generic types</li>
 </ul>
 
 <h3>Enhancements</h3>

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/OutputUtilities.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/OutputUtilities.java?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/OutputUtilities.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/OutputUtilities.java Tue Jun 16 21:55:57 2009
@@ -15,6 +15,11 @@
  */
 package org.apache.ibatis.ibator.api.dom;
 
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.ibatis.ibator.api.dom.java.FullyQualifiedJavaType;
+
 /**
  * @author Jeff Butler
  */
@@ -75,4 +80,25 @@
     public static void newLine(StringBuilder sb) {
         sb.append(lineSeparator);
     }
+
+    /**
+     * returns a unique set of "import xxx;" Strings for the set of types  
+     * @param importedTypes
+     * @return
+     */
+    public static Set<String> calculateImports(Set<FullyQualifiedJavaType> importedTypes) {
+        StringBuilder sb = new StringBuilder();
+        Set<String> importStrings = new TreeSet<String>();
+        for (FullyQualifiedJavaType fqjt : importedTypes) {
+            for (String importString : fqjt.getImportList()) {
+                sb.setLength(0);
+                sb.append("import "); //$NON-NLS-1$
+                sb.append(importString);
+                sb.append(';');
+                importStrings.add(sb.toString());
+            }
+        }
+        
+        return importStrings;
+    }
 }

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/CompilationUnit.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/CompilationUnit.java?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/CompilationUnit.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/CompilationUnit.java Tue Jun 16 21:55:57 2009
@@ -19,7 +19,7 @@
 import java.util.Set;
 
 /**
- * This interface describes metods common to all Java compilation
+ * This interface describes methods common to all Java compilation
  * units (Java classes, interfaces, and enums).
  * 
  * @author Jeff Butler

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaType.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaType.java?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaType.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaType.java Tue Jun 16 21:55:57 2009
@@ -17,6 +17,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.StringTokenizer;
 
 /**
  * @author Jeff Butler
@@ -29,12 +30,16 @@
     private static FullyQualifiedJavaType dateInstance = null;
     private static FullyQualifiedJavaType criteriaInstance = null;
     
+    /**
+     * The short name without any generic arguments
+     */
     private String baseShortName;
     
-    //  this is the short name including the parameterized types and wildcards
-    private String calculatedShortName;
+    /**
+     * The fully qualified name without any generic arguments
+     */
+    private String baseQualifiedName;
     
-    private String fullyQualifiedName;
     private boolean explicitlyImported;
     private String packageName;
     private boolean primitive;
@@ -47,56 +52,10 @@
      * 
      * @param fullyQualifiedName
      */
-    public FullyQualifiedJavaType(String fullyQualifiedName) {
+    public FullyQualifiedJavaType(String fullTypeSpecification) {
         super();
         typeArguments = new ArrayList<FullyQualifiedJavaType>();
-        this.fullyQualifiedName = fullyQualifiedName;
-        
-        int lastIndex = fullyQualifiedName.lastIndexOf('.');
-        if (lastIndex == -1) {
-            baseShortName = fullyQualifiedName;
-            explicitlyImported = false;
-            packageName = ""; //$NON-NLS-1$
-            
-            if ("byte".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getByteInstance();
-            } else if ("short".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getShortInstance();
-            } else if ("int".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getIntegerInstance();
-            } else if ("long".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getLongInstance();
-            } else if ("char".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getCharacterInstance();
-            } else if ("float".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getFloatInstance();
-            } else if ("double".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getDoubleInstance();
-            } else if ("boolean".equals(fullyQualifiedName)) { //$NON-NLS-1$
-                primitive = true;
-                primitiveTypeWrapper = PrimitiveTypeWrapper.getBooleanInstance();
-            } else {
-                primitive = false;
-                primitiveTypeWrapper = null;
-            }
-        } else {
-            baseShortName = fullyQualifiedName.substring(lastIndex + 1);
-            packageName = fullyQualifiedName.substring(0, lastIndex);
-            if ("java.lang".equals(packageName)) { //$NON-NLS-1$
-                explicitlyImported = false;
-            } else {
-                explicitlyImported = true;
-            }
-        }
-        
-        calculatedShortName = baseShortName;
+        parse(fullTypeSpecification);
     }
     
     /**
@@ -106,14 +65,50 @@
         return explicitlyImported;
     }
     /**
-     * This method returns the fully qualified name that is suitable
-     * for an import statement (i.e. - without the generics specified)
+     * This method returns the fully qualified name  - including
+     * any generic type parameters
      * 
      * @return Returns the fullyQualifiedName.
      */
     public String getFullyQualifiedName() {
-        return fullyQualifiedName;
+        StringBuilder sb = new StringBuilder();
+        sb.append(baseQualifiedName);
+        if (typeArguments.size() > 0) {
+            boolean first = true;
+            sb.append('<');
+            for (FullyQualifiedJavaType fqjt : typeArguments) {
+                if (first) {
+                    first = false;
+                } else {
+                    sb.append(", "); //$NON-NLS-1$
+                }
+                sb.append(fqjt.getFullyQualifiedName());
+            
+            }
+            sb.append('>');
+        }
+        
+        return sb.toString();
     }
+    
+    /**
+     * Returns a list of Strings that are the fully qualified names
+     * of this type, and any generic type argument associated
+     * with this type.
+     */
+    public List<String> getImportList() {
+        List<String> answer = new ArrayList<String>();
+        if (isExplicitlyImported()) {
+            answer.add(baseQualifiedName);
+        }
+        
+        for (FullyQualifiedJavaType fqjt : typeArguments) {
+            answer.addAll(fqjt.getImportList());
+        }
+        
+        return answer;
+    }
+    
     /**
      * @return Returns the packageName.
      */
@@ -121,10 +116,27 @@
         return packageName;
     }
     /**
-     * @return Returns the shortName.
+     * @return Returns the shortName - including any type arguments.
      */
     public String getShortName() {
-        return calculatedShortName;
+        StringBuilder sb = new StringBuilder();
+        sb.append(baseShortName);
+        if (typeArguments.size() > 0) {
+            boolean first = true;
+            sb.append('<');
+            for (FullyQualifiedJavaType fqjt : typeArguments) {
+                if (first) {
+                    first = false;
+                } else {
+                    sb.append(", "); //$NON-NLS-1$
+                }
+                sb.append(fqjt.getShortName());
+            
+            }
+            sb.append('>');
+        }
+        
+        return sb.toString();
     }
     
     /* (non-Javadoc)
@@ -142,7 +154,7 @@
 
 		FullyQualifiedJavaType other = (FullyQualifiedJavaType) obj;
 		
-        return fullyQualifiedName.equals(other.fullyQualifiedName);
+        return getFullyQualifiedName().equals(other.getFullyQualifiedName());
     }
     
     /* (non-Javadoc)
@@ -150,7 +162,7 @@
      */
 	@Override
     public int hashCode() {
-        return fullyQualifiedName.hashCode();
+        return getFullyQualifiedName().hashCode();
     }
     
     /* (non-Javadoc)
@@ -158,7 +170,7 @@
      */
 	@Override
     public String toString() {
-        return fullyQualifiedName;
+        return getFullyQualifiedName();
     }
     
     /**
@@ -252,26 +264,77 @@
      * @see java.lang.Comparable#compareTo(java.lang.Object)
      */
     public int compareTo(FullyQualifiedJavaType other) {
-        return fullyQualifiedName.compareTo(other.fullyQualifiedName);
+        return getFullyQualifiedName().compareTo(other.getFullyQualifiedName());
     }
     
     public void addTypeArgument(FullyQualifiedJavaType type) {
         typeArguments.add(type);
-        
-        StringBuilder sb = new StringBuilder();
-        sb.append(baseShortName);
-        sb.append('<');
-        
-        boolean comma = false;
-        for (FullyQualifiedJavaType fqjt : typeArguments) {
-            if (comma) {
-                sb.append(", "); //$NON-NLS-1$
+    }
+    
+    private void parse(String fullTypeSpecification) {
+        int index = fullTypeSpecification.indexOf('<');
+        if (index == -1) {
+            simpleParse(fullTypeSpecification);
+        } else {
+            simpleParse(fullTypeSpecification.substring(0, index));
+            genericParse(fullTypeSpecification.substring(index));
+        }
+    }
+    
+    private void simpleParse(String typeSpecification) {
+        baseQualifiedName = typeSpecification.trim();
+        int lastIndex = baseQualifiedName.lastIndexOf('.');
+        if (lastIndex == -1) {
+            baseShortName = typeSpecification;
+            explicitlyImported = false;
+            packageName = ""; //$NON-NLS-1$
+            
+            if ("byte".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getByteInstance();
+            } else if ("short".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getShortInstance();
+            } else if ("int".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getIntegerInstance();
+            } else if ("long".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getLongInstance();
+            } else if ("char".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getCharacterInstance();
+            } else if ("float".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getFloatInstance();
+            } else if ("double".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getDoubleInstance();
+            } else if ("boolean".equals(baseQualifiedName)) { //$NON-NLS-1$
+                primitive = true;
+                primitiveTypeWrapper = PrimitiveTypeWrapper.getBooleanInstance();
+            } else {
+                primitive = false;
+                primitiveTypeWrapper = null;
+            }
+        } else {
+            baseShortName = baseQualifiedName.substring(lastIndex + 1);
+            packageName = baseQualifiedName.substring(0, lastIndex);
+            if ("java.lang".equals(packageName)) { //$NON-NLS-1$
+                explicitlyImported = false;
             } else {
-                comma = true;
+                explicitlyImported = true;
             }
-            sb.append(fqjt.getShortName());
         }
-        sb.append('>');
-        calculatedShortName = sb.toString();
+    }
+    
+    private void genericParse(String genericSpecification) {
+        int lastIndex = genericSpecification.lastIndexOf('>');
+        String argumentString = genericSpecification.substring(1, lastIndex);
+        StringTokenizer st = new StringTokenizer(argumentString, ","); //$NON-NLS-1$
+        while (st.hasMoreTokens()) {
+            String type = st.nextToken();
+            typeArguments.add(new FullyQualifiedJavaType(type));
+        }
     }
 }

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/Interface.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/Interface.java?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/Interface.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/Interface.java Tue Jun 16 21:55:57 2009
@@ -83,16 +83,13 @@
             OutputUtilities.newLine(sb);
         }
 
-        for (FullyQualifiedJavaType fqjt : importedTypes) {
-            if (fqjt.isExplicitlyImported()) {
-                sb.append("import "); //$NON-NLS-1$
-                sb.append(fqjt.getFullyQualifiedName());
-                sb.append(';');
-                OutputUtilities.newLine(sb);
-            }
+        Set<String> importStrings = OutputUtilities.calculateImports(importedTypes);
+        for (String importString : importStrings) {
+            sb.append(importString);
+            OutputUtilities.newLine(sb);
         }
 
-        if (importedTypes.size() > 0) {
+        if (importStrings.size() > 0) {
             OutputUtilities.newLine(sb);
         }
 

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelClass.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelClass.java?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelClass.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelClass.java Tue Jun 16 21:55:57 2009
@@ -75,16 +75,13 @@
             OutputUtilities.newLine(sb);
         }
 
-        for (FullyQualifiedJavaType fqjt : importedTypes) {
-            if (fqjt.isExplicitlyImported()) {
-                sb.append("import "); //$NON-NLS-1$
-                sb.append(fqjt.getFullyQualifiedName());
-                sb.append(';');
-                OutputUtilities.newLine(sb);
-            }
+        Set<String> importStrings = OutputUtilities.calculateImports(importedTypes);
+        for (String importString : importStrings) {
+            sb.append(importString);
+            OutputUtilities.newLine(sb);
         }
-        
-        if (importedTypes.size() > 0) {
+
+        if (importStrings.size() > 0) {
             OutputUtilities.newLine(sb);
         }
 

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelEnumeration.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelEnumeration.java?rev=785424&r1=785423&r2=785424&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelEnumeration.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/TopLevelEnumeration.java Tue Jun 16 21:55:57 2009
@@ -63,16 +63,13 @@
             OutputUtilities.newLine(sb);
         }
 
-        for (FullyQualifiedJavaType fqjt : importedTypes) {
-            if (fqjt.isExplicitlyImported()) {
-                sb.append("import "); //$NON-NLS-1$
-                sb.append(fqjt.getFullyQualifiedName());
-                sb.append(';');
-                OutputUtilities.newLine(sb);
-            }
+        Set<String> importStrings = OutputUtilities.calculateImports(importedTypes);
+        for (String importString : importStrings) {
+            sb.append(importString);
+            OutputUtilities.newLine(sb);
         }
-        
-        if (importedTypes.size() > 0) {
+
+        if (importStrings.size() > 0) {
             OutputUtilities.newLine(sb);
         }
 

Added: ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java?rev=785424&view=auto
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java (added)
+++ ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java Tue Jun 16 21:55:57 2009
@@ -0,0 +1,84 @@
+/*
+ *  Copyright 2009 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.ibatis.ibator.api.dom.java;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Jeff Butler
+ *
+ */
+public class FullyQualifiedJavaTypeTests extends TestCase {
+    
+    public void testJavaType() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.lang.String"); //$NON-NLS-1$
+        assertFalse(fqjt.isExplicitlyImported());
+        assertEquals("String", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.lang.String", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.lang", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(0, fqjt.getImportList().size());
+    }
+
+    public void testSimpleType() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("com.foo.Bar"); //$NON-NLS-1$
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("Bar", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("com.foo.Bar", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("com.foo", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(1, fqjt.getImportList().size());
+    }
+
+    public void testGenericType1() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.util.List<java.lang.String>"); //$NON-NLS-1$
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("List<String>", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.util.List<java.lang.String>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(1, fqjt.getImportList().size());
+    }
+
+
+    public void testGenericType2() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.util.Map<java.lang.String, java.util.List<java.lang.String>>"); //$NON-NLS-1$
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("Map<String, List<String>>", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.util.Map<java.lang.String, java.util.List<java.lang.String>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(2, fqjt.getImportList().size());
+    }
+
+
+    public void testGenericType3() {
+        FullyQualifiedJavaType listOfStrings = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
+        listOfStrings.addTypeArgument(new FullyQualifiedJavaType("java.lang.String")); //$NON-NLS-1$
+        
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.util.Map"); //$NON-NLS-1$
+        fqjt.addTypeArgument(new FullyQualifiedJavaType("java.lang.String")); //$NON-NLS-1$
+        fqjt.addTypeArgument(listOfStrings);
+        
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("Map<String, List<String>>", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.util.Map<java.lang.String, java.util.List<java.lang.String>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(2, fqjt.getImportList().size());
+    }
+}