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