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 <generatedKey></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()); + } +}