Added:
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/QuerySortResult.java
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/util
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/util/MethodWrapper.java
Modified:
/trunk/pom.xml
/trunk/tapestry5-cayenne-core/pom.xml
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/PersistentManagerImpl.java
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/PersistentObjGridDataSource.java
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/QueryType.java
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/services/CayenneDataTypeAnalyzer.java
/trunk/tapestry5-cayenne-core/src/test/java/com/googlecode/tapestry5cayenne/internal/AnnotationFinderTest.java
/trunk/tapestry5-cayenne-server/pom.xml
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/TestUtils.java
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/integration/TestBlockContributions.java
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/internal/TestLabelOptionModel.java
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/internal/TestPersistentManagerImpl.java
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/services/TestCayenneDataTypeAnalyzer.java
=======================================
--- /dev/null
+++
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/QuerySortResult.java
Fri Mar 11 16:38:29 2011
@@ -0,0 +1,23 @@
+package com.googlecode.tapestry5cayenne.internal;
+
+import org.apache.cayenne.query.Ordering;
+
+/**
+ * Data Storage class for holding information about how the query sort
should take place.
+ * @author robertz
+ *
+ */
+//note that there still seem to be some quirks wrt tapestry's live service
reloading. Had to move this
+//class out. It works fine in a real app, but when testing against
PageTester, I was seeing access-related exceptions.
+public class QuerySortResult {
+ public QuerySortResult() {
+
+ }
+
+ public QuerySortResult(QuerySortType type, Ordering ordering) {
+ this.type=type;
+ this.ordering = ordering;
+ }
+ public QuerySortType type;
+ public Ordering ordering;
+}
=======================================
--- /dev/null
+++
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/util/MethodWrapper.java
Fri Mar 11 16:38:29 2011
@@ -0,0 +1,21 @@
+package com.googlecode.tapestry5cayenne.internal.util;
+
+import java.lang.reflect.Method;
+
+/**
+ * Apparently, somewhere between testng 5.8 and 5.12, testng decided that
@Test methods with a parameter of
+ * Method get the test method being run currently injected into them.
Stupid. @BeforeMethod, @Before, @After, @AfterMethod,
+ * and @DataProvider, yes, I can see the value there. Note that this isn't
documented behavior and is quite possibly a bug in
+ * testng. In any event, provide a wrapper class so we can make our
assertions correctly.
+ */
+public final class MethodWrapper {
+ private Method m;
+
+ public MethodWrapper(Method m) {
+ this.m = m;
+ }
+
+ public Method getMethod() {
+ return m;
+ }
+}
=======================================
--- /trunk/pom.xml Thu Mar 10 11:48:56 2011
+++ /trunk/pom.xml Fri Mar 11 16:38:29 2011
@@ -88,8 +88,7 @@
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
- <version>5.8</version>
- <classifier>jdk15</classifier>
+ <version>5.12.1</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -203,7 +202,7 @@
<properties>
<cayenne-release-version>3.0.1</cayenne-release-version>
- <tapestry-release-version>5.1.0.5</tapestry-release-version>
+ <tapestry-release-version>5.2.4</tapestry-release-version>
</properties>
<repositories>
=======================================
--- /trunk/tapestry5-cayenne-core/pom.xml Wed Mar 9 22:54:12 2011
+++ /trunk/tapestry5-cayenne-core/pom.xml Fri Mar 11 16:38:29 2011
@@ -26,7 +26,6 @@
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
- <classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
<dependency>
=======================================
---
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/PersistentManagerImpl.java
Tue Aug 24 10:51:09 2010
+++
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/PersistentManagerImpl.java
Fri Mar 11 16:38:29 2011
@@ -310,21 +310,3 @@
}
-/**
- * Data Storage class for holding information about how the query sort
should take place.
- * @author robertz
- *
- */
-class QuerySortResult {
-
- QuerySortResult() {
-
- }
-
- QuerySortResult(QuerySortType type, Ordering ordering) {
- this.type=type;
- this.ordering = ordering;
- }
- QuerySortType type;
- Ordering ordering;
-}
=======================================
---
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/PersistentObjGridDataSource.java
Tue Aug 24 10:51:09 2010
+++
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/PersistentObjGridDataSource.java
Fri Mar 11 16:38:29 2011
@@ -67,7 +67,6 @@
public void prepare(int startIndex, int endIndex,
List<SortConstraint> sortConstraints) {
- // TODO Auto-generated method stub
query = new SelectQuery(type);
this.startIndex = startIndex;
List<Ordering> orderings = new ArrayList<Ordering>();
=======================================
---
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/QueryType.java
Sat Mar 14 13:59:58 2009
+++
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/internal/QueryType.java
Fri Mar 11 16:38:29 2011
@@ -8,7 +8,7 @@
/**
* Enum representing the major (select) query types in cayenne.
* Allows us to utilize query-specific properties in a
query-type-independent manner.
- * @author robertz-
+ * @author robertz
*
*/
public enum QueryType {
@@ -16,7 +16,11 @@
/**
* Constant for EJBQLQueries.
*/
- EJBQL(EJBQLQuery.class),//TODO implement setPageSize for EJBQLQuery
when 3.0M6 is released
+ EJBQL(EJBQLQuery.class) {
+ public void setPageSize(Query q, int size) {
+ ((EJBQLQuery)q).setPageSize(size);
+ }
+ },
/**
* Constant for SQLTemplate queries.
*/
=======================================
---
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/services/CayenneDataTypeAnalyzer.java
Wed Mar 11 23:27:38 2009
+++
/trunk/tapestry5-cayenne-core/src/main/java/com/googlecode/tapestry5cayenne/services/CayenneDataTypeAnalyzer.java
Fri Mar 11 16:38:29 2011
@@ -47,15 +47,16 @@
EntityResolver er = _provider.currentContext().getEntityResolver();
Class<?> type =
_environment.peek(BeanModelTypeHolder.class).getType();
ObjEntity ent = er.lookupObjEntity(type);
-
+
String dt = _defaultAnalyzer.identifyDataType(adapter);
+
+ //fixes googlecode issue #39: unable to use POJO w/ String
properties w/ t5cayenne.
+ if (ent == null)
+ return dt;
+
if (dt != null && !dt.equals("")) {
return checkLongText(ent,adapter,dt);
}
-
- if (ent == null) {
- return null;
- }
//if we add any more "special cases" for datatypes, we should
refactor this into a chain of command
//that passes in the object entity and the adapter. Then we can
easily contribute new types.
=======================================
---
/trunk/tapestry5-cayenne-core/src/test/java/com/googlecode/tapestry5cayenne/internal/AnnotationFinderTest.java
Mon Jun 2 23:26:28 2008
+++
/trunk/tapestry5-cayenne-core/src/test/java/com/googlecode/tapestry5cayenne/internal/AnnotationFinderTest.java
Fri Mar 11 16:38:29 2011
@@ -4,15 +4,14 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
+
+import com.googlecode.tapestry5cayenne.internal.util.MethodWrapper;
import org.apache.tapestry5.ioc.annotations.Marker;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.googlecode.tapestry5cayenne.annotations.Cayenne;
import com.googlecode.tapestry5cayenne.annotations.Label;
-import com.googlecode.tapestry5cayenne.internal.AnnotationFinder;
@Test(groups="all")
public class AnnotationFinderTest {
@@ -20,14 +19,14 @@
@DataProvider(name="methoddata")
Object[][] methodData() throws Exception {
return new Object[][] {
- {AnnotatedBean.class,Cayenne.class,null},
-
{AnnotatedBean.class,Label.class,AnnotatedBean.class.getMethod("getTheLabel")},
+ {AnnotatedBean.class,Cayenne.class,new
MethodWrapper(null)},
+ {AnnotatedBean.class,Label.class,new
MethodWrapper(AnnotatedBean.class.getMethod("getTheLabel"))},
};
}
@Test(dataProvider="methoddata")
- public void testMethodForAnnotation(Class<?> type, Class<? extends
Annotation> query, Method result) {
-
assertEquals(AnnotationFinder.methodForAnnotation(query,type),result);
+ public void testMethodForAnnotation(Class<?> type, Class<? extends
Annotation> query, MethodWrapper result) {
+
assertEquals(AnnotationFinder.methodForAnnotation(query,type),result.getMethod());
}
@DataProvider(name="fielddata")
=======================================
--- /trunk/tapestry5-cayenne-server/pom.xml Wed Mar 9 22:54:12 2011
+++ /trunk/tapestry5-cayenne-server/pom.xml Fri Mar 11 16:38:29 2011
@@ -39,7 +39,6 @@
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
- <classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
<dependency>
=======================================
---
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/TestUtils.java
Sat Oct 3 08:17:52 2009
+++
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/TestUtils.java
Fri Mar 11 16:38:29 2011
@@ -109,7 +109,7 @@
*/
public static Registry setupRegistry(String appName,
Class<?>...modules) {
SymbolProvider provider = new
SingleKeySymbolProvider(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM, "com.googlecode.tapestry5cayenne.integration");
- TapestryAppInitializer initializer = new
TapestryAppInitializer(logger, provider, appName,
PageTesterModule.TEST_MODE);
+ TapestryAppInitializer initializer = new
TapestryAppInitializer(logger, provider, appName,
PageTesterModule.TEST_MODE, null);
if (modules.length > 0) {
initializer.addModules(modules);
=======================================
---
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/integration/TestBlockContributions.java
Tue Aug 24 10:51:09 2010
+++
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/integration/TestBlockContributions.java
Fri Mar 11 16:38:29 2011
@@ -54,7 +54,7 @@
public void testToOneEditor() {
Document doc = _tester.renderPage("TestToOneControl");
//Verify the label
- Element el = doc.getElementById("toOneList-label");
+ Element el =
doc.getRootElement().getElementByAttributeValue("for","toOneList");
assertEquals(el.getChildMarkup(),"Artist");
//Verify the select list.
@@ -119,8 +119,8 @@
//make sure the stylesheet shows up.
List<Element> els =
TestUtils.DOMFindAll(doc.getRootElement(), "head/link");
//should be 2: one for tapestry, one for t5cayenne
- assertEquals(els.size(), 3);
-
assertTrue(els.get(2).getAttribute("href").contains("ToManyViewer.css"));
+ assertEquals(els.size(), 2);
+
assertTrue(els.get(1).getAttribute("href").contains("ToManyViewer.css"));
//ok... make sure we have the right thing on the bean display...
return doc;
}
=======================================
---
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/internal/TestLabelOptionModel.java
Sat Jun 28 10:54:55 2008
+++
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/internal/TestLabelOptionModel.java
Fri Mar 11 16:38:29 2011
@@ -2,6 +2,7 @@
import java.lang.reflect.Method;
+import com.googlecode.tapestry5cayenne.internal.util.MethodWrapper;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -17,22 +18,23 @@
private Object[][] options() throws Exception {
Artist a = new Artist();
a.setName("Picasso");
- Method m = Artist.class.getMethod("getName");
+ MethodWrapper mname = new
MethodWrapper(Artist.class.getMethod("getName"));
+ MethodWrapper mnull = new MethodWrapper(null);
return new Object[][] {
- {null,null,""},
- {a,null,a.toString()},
- {a,m,"Picasso"},
- {null,m,""},
+ {null,mnull,""},
+ {a,mnull,a.toString()},
+ {a,mname,"Picasso"},
+ {null,mname,""},
};
}
@Test(dataProvider="options")
- public void test(Object obj, Method m, String label) {
- MethodLabelOptionModel model = new MethodLabelOptionModel(obj,m);
+ public void test(Object obj, MethodWrapper m, String label) {
+ MethodLabelOptionModel model = new
MethodLabelOptionModel(obj,m.getMethod());
assertEquals(model.getLabel(),label);
assertEquals(model.getValue(),obj);
assertEquals(model.isDisabled(),false);
- assertEquals(model.getAttributes(),null);
+ assertNull(model.getAttributes());
}
}
=======================================
---
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/internal/TestPersistentManagerImpl.java
Tue Aug 24 10:51:09 2010
+++
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/internal/TestPersistentManagerImpl.java
Fri Mar 11 16:38:29 2011
@@ -10,6 +10,7 @@
import java.util.Collections;
import java.util.List;
+import com.googlecode.tapestry5cayenne.internal.util.MethodWrapper;
import org.apache.cayenne.BaseContext;
import org.apache.cayenne.DataObjectUtils;
import org.apache.cayenne.ObjectContext;
@@ -20,6 +21,7 @@
import org.apache.cayenne.query.SelectQuery;
import org.apache.cayenne.query.SortOrder;
import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.ioc.services.Coercion;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -59,6 +61,9 @@
return (T) arg0;
}
public <S, T> String explain(Class<S> arg0, Class<T> arg1) {
return null; }
+ public <S, T> Coercion<S, T> getCoercion(Class<S> sourceType,
Class<T> targetType) {
+ return null;
+ }
};
_manager = new PersistentManagerImpl(new ObjectContextProvider() {
@@ -78,32 +83,32 @@
//prop is in model
{
new SelectQuery(Artist.class),
- Artist.class.getMethod("getName"),
+ new MethodWrapper(Artist.class.getMethod("getName")),
Artist.class,
new QuerySortResult(QuerySortType.QUERY,new
Ordering("name",SortOrder.ASCENDING))
},
//label is a javabeans prop, but not in model
{
new SelectQuery(Artist.class),
- Artist.class.getMethod("getNumPaintings"),
+ new
MethodWrapper(Artist.class.getMethod("getNumPaintings")),
Artist.class,
new QuerySortResult(QuerySortType.ORDERING,new
Ordering("numPaintings",SortOrder.ASCENDING))
},
{
new SelectQuery(Artist.class),
- Artist.class.getMethod("numPaintings"),
+ new
MethodWrapper(Artist.class.getMethod("numPaintings")),
Artist.class,
new QuerySortResult(QuerySortType.METHOD,null)
},
{
new SelectQuery(BigIntPKEntity.class),
- null,
+ new MethodWrapper(null),
BigIntPKEntity.class,
new QuerySortResult(QuerySortType.NOSORT,null)
},
{
new SelectQuery(Artist.class),
- null,
+ new MethodWrapper(null),
Artist.class,
new QuerySortResult(QuerySortType.COMPARABLE,null)
}
@@ -111,8 +116,8 @@
}
@Test(dataProvider="sorts")
- public void query_sort(SelectQuery sq, Method label, Class<?> type,
QuerySortResult expected) {
- QuerySortResult result = PersistentManagerImpl.querySort(sq,
label, BaseContext.getThreadObjectContext(), type,new Ordering[]{});
+ public void query_sort(SelectQuery sq, MethodWrapper label, Class<?>
type, QuerySortResult expected) {
+ QuerySortResult result = PersistentManagerImpl.querySort(sq,
label.getMethod(), BaseContext.getThreadObjectContext(), type,new
Ordering[]{});
assertEquals(result.type,expected.type);
if (expected.ordering == null) {
assertNull(result.ordering);
=======================================
---
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/services/TestCayenneDataTypeAnalyzer.java
Thu Mar 5 05:27:39 2009
+++
/trunk/tapestry5-cayenne-server/src/test/java/com/googlecode/tapestry5cayenne/services/TestCayenneDataTypeAnalyzer.java
Fri Mar 11 16:38:29 2011
@@ -56,7 +56,7 @@
assertEquals(type,"longtext");
EasyMock.verify(adaptor);
} catch (Exception e) {
- fail("Should not have been an exception identifying the data
type",e);
+ failOnException(e);
}
}
@@ -79,14 +79,43 @@
assertEquals(type,"text");
EasyMock.verify(adaptor);
} catch(Exception e) {
- fail("Should not have been an exception identifying the data
type",e);
+ failOnException(e);
}
}
+
+ /* google code ticket #39: basically, when you have a POJO with a
String property + t5cayenne, you get NPE.*/
+ public void test_text_datatype_on_pojo() {
+ _reg.getService(Environment.class).push(BeanModelTypeHolder.class,
new BeanModelTypeHolder(SomePOJO.class));
+ try {
+ PropertyAdapter adaptor =
EasyMock.createMock(PropertyAdapter.class);
+ EasyMock.expect(adaptor.getType()).andReturn(String.class);
+ EasyMock.replay(adaptor);
+ assertEquals("text", _analyzer.identifyDataType(adaptor));
+ EasyMock.verify(adaptor);
+ } catch(Exception e) {
+ failOnException(e);
+ }
+ }
+
+ private void failOnException(Exception e) {
+ fail("Should not have been an exception identifying the data
type", e);
+ }
}
class SomePOJO {
+ private String name;
+
public Artist getArtist() {
return new Artist();
}
-}
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}