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/18 23:16:42 UTC

svn commit: r786289 - in /ibatis/trunk/java/tools/ibator/core: build/ src/org/apache/ibatis/ibator/api/dom/java/ src/org/apache/ibatis/ibator/generator/ibatis2/model/ src/org/apache/ibatis/ibator/internal/util/messages/ test/org/apache/ibatis/ibator/ap...

Author: jgbutler
Date: Thu Jun 18 21:16:40 2009
New Revision: 786289

URL: http://svn.apache.org/viewvc?rev=786289&view=rev
Log:
[Ibator] Further improvements to Java type parsing

Removed:
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/api/dom/java/JavaWildcardType.java
Modified:
    ibatis/trunk/java/tools/ibator/core/build/version.properties
    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/generator/ibatis2/model/ExampleGenerator.java
    ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/internal/util/messages/messages.properties
    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
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/build/version.properties?rev=786289&r1=786288&r2=786289&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/build/version.properties (original)
+++ ibatis/trunk/java/tools/ibator/core/build/version.properties Thu Jun 18 21:16:40 2009
@@ -1,4 +1,4 @@
 #Ibator build version info
-#Wed Jun 17 13:58:14 CDT 2009
+#Thu Jun 18 16:12:32 CDT 2009
 version=1.2.2
-buildNum=746
+buildNum=752

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=786289&r1=786288&r2=786289&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 Thu Jun 18 21:16:40 2009
@@ -19,6 +19,9 @@
 import java.util.List;
 import java.util.StringTokenizer;
 
+import org.apache.ibatis.ibator.internal.util.StringUtility;
+import org.apache.ibatis.ibator.internal.util.messages.Messages;
+
 /**
  * @author Jeff Butler
  */
@@ -46,6 +49,11 @@
     private PrimitiveTypeWrapper primitiveTypeWrapper;
     private List<FullyQualifiedJavaType> typeArguments;
     
+    // the following three values are used for dealing with wildcard types
+    private boolean wildcardType;
+    private boolean boundedWildcard;
+    private boolean extendsBoundedWildcard;
+    
     /**
      * Use this constructor to construct a generic type with the specified
      * type parameters
@@ -72,20 +80,33 @@
      */
     public String getFullyQualifiedName() {
         StringBuilder sb = new StringBuilder();
-        sb.append(baseQualifiedName);
-        if (typeArguments.size() > 0) {
-            boolean first = true;
-            sb.append('<');
-            for (FullyQualifiedJavaType fqjt : typeArguments) {
-                if (first) {
-                    first = false;
+        if (wildcardType) {
+            sb.append('?');
+            if (boundedWildcard) {
+                if (extendsBoundedWildcard) {
+                    sb.append(" extends ");
                 } else {
-                    sb.append(", "); //$NON-NLS-1$
+                    sb.append(" super ");
                 }
-                sb.append(fqjt.getFullyQualifiedName());
+                
+                sb.append(baseQualifiedName);
+            }
+        } else {
+            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('>');
             }
-            sb.append('>');
         }
         
         return sb.toString();
@@ -120,20 +141,33 @@
      */
     public String getShortName() {
         StringBuilder sb = new StringBuilder();
-        sb.append(baseShortName);
-        if (typeArguments.size() > 0) {
-            boolean first = true;
-            sb.append('<');
-            for (FullyQualifiedJavaType fqjt : typeArguments) {
-                if (first) {
-                    first = false;
+        if (wildcardType) {
+            sb.append('?');
+            if (boundedWildcard) {
+                if (extendsBoundedWildcard) {
+                    sb.append(" extends ");
                 } else {
-                    sb.append(", "); //$NON-NLS-1$
+                    sb.append(" super ");
                 }
-                sb.append(fqjt.getShortName());
+                
+                sb.append(baseShortName);
+            }
+        } else {
+            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('>');
             }
-            sb.append('>');
         }
         
         return sb.toString();
@@ -274,7 +308,12 @@
     private void parse(String fullTypeSpecification) {
         int index = fullTypeSpecification.indexOf('<');
         if (index == -1) {
-            simpleParse(fullTypeSpecification);
+            index = fullTypeSpecification.indexOf('?');
+            if (index == -1) {
+                simpleParse(fullTypeSpecification);
+            } else {
+                wildCardParse(fullTypeSpecification);
+            }
         } else {
             simpleParse(fullTypeSpecification.substring(0, index));
             genericParse(fullTypeSpecification.substring(index));
@@ -330,11 +369,64 @@
     
     private void genericParse(String genericSpecification) {
         int lastIndex = genericSpecification.lastIndexOf('>');
+        if (lastIndex == -1) {
+            throw new RuntimeException(Messages.getString("RuntimeError.22", genericSpecification)); //$NON-NLS-1$
+        }
         String argumentString = genericSpecification.substring(1, lastIndex);
-        StringTokenizer st = new StringTokenizer(argumentString, ","); //$NON-NLS-1$
+        // need to find "," outside of a <> bounds
+        StringTokenizer st = new StringTokenizer(argumentString, ",<>", true); //$NON-NLS-1$
+        int openCount = 0;
+        StringBuilder sb = new StringBuilder();
         while (st.hasMoreTokens()) {
-            String type = st.nextToken();
-            typeArguments.add(new FullyQualifiedJavaType(type));
+            String token = st.nextToken();
+            if ("<".equals(token)) {
+                sb.append(token);
+                openCount++;
+            } else if (">".equals(token)) {
+                sb.append(token);
+                openCount--;
+            } else if (",".equals(token)) {
+                if (openCount == 0) {
+                    typeArguments.add(new FullyQualifiedJavaType(sb.toString()));
+                    sb.setLength(0);
+                } else {
+                    sb.append(token);
+                }
+            } else {
+                sb.append(token);
+            }
+        }
+        
+        if (openCount != 0) {
+            throw new RuntimeException(Messages.getString("RuntimeError.22", genericSpecification)); //$NON-NLS-1$
+        }
+        
+        String finalType = sb.toString();
+        if (StringUtility.stringHasValue(finalType)) {
+            typeArguments.add(new FullyQualifiedJavaType(finalType));
+        }
+    }
+    
+    private void wildCardParse(String wildCardSpecification) {
+        StringTokenizer st = new StringTokenizer(wildCardSpecification, " "); //$NON-NLS-1$
+        int tokenCount = st.countTokens();
+        if (tokenCount != 1 && tokenCount != 3) {
+            throw new RuntimeException(Messages.getString("RuntimeError.22", wildCardSpecification)); //$NON-NLS-1$
+        }
+        
+        String token = st.nextToken();
+        if (!"?".equals(token)) {
+            throw new RuntimeException(Messages.getString("RuntimeError.22", wildCardSpecification)); //$NON-NLS-1$
+        }
+        
+        wildcardType = true;
+        
+        if (tokenCount == 1) {
+            boundedWildcard = false;
+        } else {
+            boundedWildcard = true;
+            extendsBoundedWildcard = "extends".equals(st.nextToken());
+            simpleParse(st.nextToken());
         }
     }
 }

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/generator/ibatis2/model/ExampleGenerator.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/generator/ibatis2/model/ExampleGenerator.java?rev=786289&r1=786288&r2=786289&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/generator/ibatis2/model/ExampleGenerator.java (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/generator/ibatis2/model/ExampleGenerator.java Thu Jun 18 21:16:40 2009
@@ -29,7 +29,6 @@
 import org.apache.ibatis.ibator.api.dom.java.FullyQualifiedJavaType;
 import org.apache.ibatis.ibator.api.dom.java.InnerClass;
 import org.apache.ibatis.ibator.api.dom.java.JavaVisibility;
-import org.apache.ibatis.ibator.api.dom.java.JavaWildcardType;
 import org.apache.ibatis.ibator.api.dom.java.Method;
 import org.apache.ibatis.ibator.api.dom.java.Parameter;
 import org.apache.ibatis.ibator.api.dom.java.TopLevelClass;
@@ -129,10 +128,11 @@
         field = new Field();
         field.setVisibility(JavaVisibility.PROTECTED);
 
-        FullyQualifiedJavaType fqjt = FullyQualifiedJavaType
-                .getNewListInstance();
+        FullyQualifiedJavaType fqjt;
         if (generateForJava5) {
-            fqjt.addTypeArgument(new FullyQualifiedJavaType("Criteria")); //$NON-NLS-1$
+            fqjt = new FullyQualifiedJavaType("java.util.List<Criteria>"); //$NON-NLS-1$
+        } else {
+            fqjt = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
         }
 
         field.setType(fqjt);
@@ -295,10 +295,11 @@
 
         field = new Field();
         field.setVisibility(JavaVisibility.PROTECTED);
-        FullyQualifiedJavaType listOfStrings = FullyQualifiedJavaType
-                .getNewListInstance();
+        FullyQualifiedJavaType listOfStrings;
         if (generateForJava5) {
-            listOfStrings.addTypeArgument(FullyQualifiedJavaType.getStringInstance());
+            listOfStrings = new FullyQualifiedJavaType("java.util.List<java.lang.String>"); //$NON-NLS-1$
+        } else {
+            listOfStrings = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
         }
         field.setType(listOfStrings);
         field.setName("criteriaWithoutValue"); //$NON-NLS-1$
@@ -312,13 +313,11 @@
         method.addBodyLine("return criteriaWithoutValue;"); //$NON-NLS-1$
         answer.addMethod(method);
 
-        FullyQualifiedJavaType listOfMaps = FullyQualifiedJavaType
-                .getNewListInstance();
+        FullyQualifiedJavaType listOfMaps;
         if (generateForJava5) {
-            FullyQualifiedJavaType mapStringObject = FullyQualifiedJavaType.getNewMapInstance();
-            mapStringObject.addTypeArgument(FullyQualifiedJavaType.getStringInstance());
-            mapStringObject.addTypeArgument(FullyQualifiedJavaType.getObjectInstance());
-            listOfMaps.addTypeArgument(mapStringObject);
+            listOfMaps = new FullyQualifiedJavaType("java.util.List<java.util.Map<java.lang.String, java.lang.Object>>"); //$NON-NLS-1$
+        } else {
+            listOfMaps = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
         }
 
         field = new Field();
@@ -400,11 +399,11 @@
         method.addBodyLine("criteriaWithSingleValue.add(map);"); //$NON-NLS-1$
         answer.addMethod(method);
 
-        FullyQualifiedJavaType listOfObjects = FullyQualifiedJavaType
-                .getNewListInstance();
+        FullyQualifiedJavaType listOfObjects;
         if (generateForJava5) {
-            JavaWildcardType extendsObject = new JavaWildcardType("java.lang.Object", true); //$NON-NLS-1$
-            listOfObjects.addTypeArgument(extendsObject);
+            listOfObjects = new FullyQualifiedJavaType("java.util.List<? extends java.lang.Object>"); //$NON-NLS-1$
+        } else {
+            listOfObjects = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
         }
 
         method = new Method();
@@ -463,10 +462,11 @@
         method.addBodyLine("criteriaWithBetweenValue.add(map);"); //$NON-NLS-1$
         answer.addMethod(method);
 
-        FullyQualifiedJavaType listOfDates = FullyQualifiedJavaType
-                .getNewListInstance();
+        FullyQualifiedJavaType listOfDates;
         if (generateForJava5) {
-            listOfDates.addTypeArgument(FullyQualifiedJavaType.getDateInstance());
+            listOfDates = new FullyQualifiedJavaType("java.util.List<java.util.Date>"); //$NON-NLS-1$
+        } else {
+            listOfDates = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
         }
 
         if (introspectedTable.hasJDBCDateColumns()) {
@@ -655,13 +655,11 @@
         StringBuilder sb = new StringBuilder();
 
         // add new private fields and public accessors in the class
-        FullyQualifiedJavaType listOfMaps = FullyQualifiedJavaType
-                .getNewListInstance();
+        FullyQualifiedJavaType listOfMaps;
         if (generateForJava5) {
-            FullyQualifiedJavaType mapStringObject = FullyQualifiedJavaType.getNewMapInstance();
-            mapStringObject.addTypeArgument(FullyQualifiedJavaType.getStringInstance());
-            mapStringObject.addTypeArgument(FullyQualifiedJavaType.getObjectInstance());
-            listOfMaps.addTypeArgument(mapStringObject);
+            listOfMaps = new FullyQualifiedJavaType("java.util.List<java.util.Map<java.lang.String, java.lang.Object>>"); //$NON-NLS-1$
+        } else {
+            listOfMaps = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
         }
 
         sb.setLength(0);

Modified: ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/internal/util/messages/messages.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/internal/util/messages/messages.properties?rev=786289&r1=786288&r2=786289&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/internal/util/messages/messages.properties (original)
+++ ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/internal/util/messages/messages.properties Thu Jun 18 21:16:40 2009
@@ -43,6 +43,7 @@
 RuntimeError.19=Value missing after {0}
 RuntimeError.20=Unknown argument: {0}
 RuntimeError.21=Error creating logger for class {0}.  Cause: {1}
+RuntimeError.22=Invalid Type Specification: {0}.
 
 Warning.0=There are no statements enabled for table {0}, this table will be ignored.
 Warning.1=Table {0} does not exist, this table will be ignored

Modified: 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=786289&r1=786288&r2=786289&view=diff
==============================================================================
--- ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java (original)
+++ ibatis/trunk/java/tools/ibator/core/test/org/apache/ibatis/ibator/api/dom/java/FullyQualifiedJavaTypeTests.java Thu Jun 18 21:16:40 2009
@@ -90,4 +90,37 @@
         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
         assertEquals(2, fqjt.getImportList().size());
     }
+    
+    @Test
+    public void testGenericType4() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.util.List<java.util.Map<java.lang.String, java.lang.Object>>"); //$NON-NLS-1$
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("List<Map<String, Object>>", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.util.List<java.util.Map<java.lang.String, java.lang.Object>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(2, fqjt.getImportList().size());
+    }
+    
+    @Test
+    public void testWildcardType1() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.util.Map<java.lang.String, ? extends com.foo.Bar>");
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("Map<String, ? extends Bar>", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.util.Map<java.lang.String, ? extends com.foo.Bar>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(2, fqjt.getImportList().size());
+    }
+
+    @Test
+    public void testWildcardType2() {
+        FullyQualifiedJavaType fqjt =
+            new FullyQualifiedJavaType("java.util.Map<java.lang.String, ?>");
+        assertTrue(fqjt.isExplicitlyImported());
+        assertEquals("Map<String, ?>", fqjt.getShortName()); //$NON-NLS-1$
+        assertEquals("java.util.Map<java.lang.String, ?>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
+        assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
+        assertEquals(1, fqjt.getImportList().size());
+    }
 }