You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2011/12/09 17:30:59 UTC
svn commit: r1212503 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-persistence-jdbc/src/test/java/...
Author: curtisr7
Date: Fri Dec 9 16:30:58 2011
New Revision: 1212503
URL: http://svn.apache.org/viewvc?rev=1212503&view=rev
Log:
OPENJPA-2068: Optimized calendar creation.
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/InstanceResultObjectProvider.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultShapePacker.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestCalendarField.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/LRSEntity.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/InstanceResultObjectProvider.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/InstanceResultObjectProvider.java?rev=1212503&r1=1212502&r2=1212503&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/InstanceResultObjectProvider.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/InstanceResultObjectProvider.java Fri Dec 9 16:30:58 2011
@@ -24,6 +24,7 @@ import org.apache.openjpa.jdbc.meta.Clas
import org.apache.openjpa.jdbc.sql.Result;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.jdbc.sql.SelectExecutor;
+import org.apache.openjpa.util.ProxyCalendar;
/**
* Object provider implementation wrapped around a {@link Select}.
@@ -56,6 +57,10 @@ public class InstanceResultObjectProvide
ClassMapping mapping = res.getBaseMapping();
if (mapping == null)
mapping = _mapping;
- return res.load(mapping, getStore(), getFetchConfiguration());
+ Object ret = res.load(mapping, getStore(), getFetchConfiguration());
+ if (ret != null && ret instanceof ProxyCalendar) {
+ ret = ((ProxyCalendar) ret).copy(ret);
+ }
+ return ret;
}
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?rev=1212503&r1=1212502&r2=1212503&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Fri Dec 9 16:30:58 2011
@@ -44,6 +44,7 @@ import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
+import java.text.DateFormatSymbols;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -51,6 +52,7 @@ import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
+import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -59,6 +61,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.TimeZone;
+import java.util.spi.TimeZoneNameProvider;
import javax.sql.DataSource;
@@ -118,6 +122,7 @@ import org.apache.openjpa.util.ObjectExi
import org.apache.openjpa.util.ObjectNotFoundException;
import org.apache.openjpa.util.OpenJPAException;
import org.apache.openjpa.util.OptimisticException;
+import org.apache.openjpa.util.ProxyManager;
import org.apache.openjpa.util.QueryException;
import org.apache.openjpa.util.ReferentialIntegrityException;
import org.apache.openjpa.util.Serialization;
@@ -420,7 +425,9 @@ public class DBDictionary
public final Map<Integer,Set<String>> sqlStateCodes =
new HashMap<Integer, Set<String>>();
-
+
+ protected ProxyManager _proxyManager;
+
public DBDictionary() {
fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
"BIGINT", "BIT", "BLOB", "CLOB", "DATE", "DECIMAL", "DISTINCT",
@@ -692,17 +699,22 @@ public class DBDictionary
* Convert the specified column of the SQL ResultSet to the proper
* java type. Converts the date from a {@link Timestamp} by default.
*/
- public Calendar getCalendar(ResultSet rs, int column)
- throws SQLException {
+ public Calendar getCalendar(ResultSet rs, int column) throws SQLException {
Date d = getDate(rs, column);
if (d == null)
return null;
-
- Calendar cal = Calendar.getInstance();
+ Calendar cal = (Calendar) getProxyManager().newCalendarProxy(GregorianCalendar.class, null);
cal.setTime(d);
return cal;
}
+ private ProxyManager getProxyManager() {
+ if (_proxyManager == null) {
+ _proxyManager = conf.getProxyManagerInstance();
+ }
+ return _proxyManager;
+ }
+
/**
* Convert the specified column of the SQL ResultSet to the proper
* java type.
@@ -5540,5 +5552,4 @@ public class DBDictionary
public String getIdentityColumnName() {
return null;
}
-
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultShapePacker.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultShapePacker.java?rev=1212503&r1=1212502&r2=1212503&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultShapePacker.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ResultShapePacker.java Fri Dec 9 16:30:58 2011
@@ -18,6 +18,10 @@
*/
package org.apache.openjpa.kernel;
+import java.util.Calendar;
+
+import org.apache.openjpa.util.ProxyCalendar;
+
/**
* Packs result by delegation to a ResultShape.
@@ -43,6 +47,18 @@ public class ResultShapePacker extends R
@Override
public Object pack(Object[] values) {
+ // Check for proxied calenders and cleanup if any are found.
+ if (_types != null) {
+ for (Class<?> t : _types) {
+ if (t.equals(Calendar.class)) {
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] instanceof ProxyCalendar) {
+ values[i] = ((ProxyCalendar) values[i]).copy((ProxyCalendar) values[i]);
+ }
+ }
+ }
+ }
+ }
if (_shape == null)
return super.pack(values);
return _shape.pack(values, _types, _aliases);
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java?rev=1212503&r1=1212502&r2=1212503&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java Fri Dec 9 16:30:58 2011
@@ -28,6 +28,7 @@ import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
+import java.util.TimeZone;
import org.apache.openjpa.conf.Compatibility;
import org.apache.openjpa.enhance.PersistenceCapable;
@@ -77,31 +78,34 @@ class SingleFieldManager extends Transfe
case JavaTypes.DATE:
if (objval == null)
return false;
- proxy = checkProxy();
+ proxy = checkProxy(fmd);
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
((Date) proxy).setTime(((Date) objval).getTime());
- if (proxy instanceof Timestamp
- && objval instanceof Timestamp)
- ((Timestamp) proxy).setNanos(((Timestamp) objval).
- getNanos());
+ if (proxy instanceof Timestamp && objval instanceof Timestamp)
+ ((Timestamp) proxy).setNanos(((Timestamp) objval).getNanos());
ret = true;
}
break;
case JavaTypes.CALENDAR:
if (objval == null)
return false;
- proxy = checkProxy();
+ proxy = checkProxy(fmd);
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
((Calendar) proxy).setTime(((Calendar) objval).getTime());
ret = true;
+ } else {
+ Object init = fmd.getInitializer();
+ if (init != null && init instanceof TimeZone) {
+ ((Calendar) proxy).setTimeZone((TimeZone)init);
+ }
}
break;
case JavaTypes.COLLECTION:
if (objval == null && !replaceNull)
return false;
- proxy = checkProxy();
+ proxy = checkProxy(fmd);
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
if (objval != null)
@@ -112,7 +116,7 @@ class SingleFieldManager extends Transfe
case JavaTypes.MAP:
if (objval == null && !replaceNull)
return false;
- proxy = checkProxy();
+ proxy = checkProxy(fmd);
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
if (objval != null)
@@ -123,7 +127,7 @@ class SingleFieldManager extends Transfe
case JavaTypes.OBJECT:
if (objval == null)
return false;
- proxy = checkProxy();
+ proxy = checkProxy(fmd);
if (proxy == null) {
proxy = getProxyManager().newCustomProxy(objval,
_sm.getBroker().getConfiguration().
@@ -152,13 +156,16 @@ class SingleFieldManager extends Transfe
/**
* If the current field is a usable proxy, return it; else return null.
*/
- private Proxy checkProxy() {
+ private Proxy checkProxy(FieldMetaData fmd) {
if (!(objval instanceof Proxy))
return null;
Proxy proxy = (Proxy) objval;
- if (proxy.getOwner() == null || Proxies.isOwner(proxy, _sm, field))
- return proxy;
+ if (proxy.getOwner() == null || Proxies.isOwner(proxy, _sm, field)) {
+ if(fmd.getProxyType().isAssignableFrom(proxy.getClass())){
+ return proxy;
+ }
+ }
return null;
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestCalendarField.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestCalendarField.java?rev=1212503&r1=1212502&r2=1212503&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestCalendarField.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestCalendarField.java Fri Dec 9 16:30:58 2011
@@ -20,14 +20,13 @@ package org.apache.openjpa.jdbc.meta;
import java.io.IOException;
import java.sql.SQLException;
-
import java.util.Calendar;
+import java.util.List;
import java.util.TimeZone;
-import org.apache.openjpa.persistence.OpenJPAPersistence;
-import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.simple.TemporalFieldTypes;
import org.apache.openjpa.persistence.test.SingleEMTestCase;
+import org.apache.openjpa.util.ProxyCalendar;
public class TestCalendarField extends SingleEMTestCase {
@@ -54,4 +53,24 @@ public class TestCalendarField extends S
tft = find(TemporalFieldTypes.class).get(0);
assertEquals(tz, tft.getCalendarTimeZoneField().getTimeZone());
}
+
+
+ public void testCalendarQuery() throws Exception {
+ persist(new TemporalFieldTypes());
+ persist(new TemporalFieldTypes());
+ persist(new TemporalFieldTypes());
+ em.clear();
+ Calendar cal =
+ em.createQuery("SELECT t.calendarTimeZoneField FROM TemporalFieldTypes t WHERE 1=1", Calendar.class)
+ .setMaxResults(1).getSingleResult();
+ assertFalse(cal instanceof ProxyCalendar);
+
+ List<Calendar> cals =
+ em.createQuery("SELECT t.calendarTimeZoneField FROM TemporalFieldTypes t WHERE 1=1", Calendar.class)
+ .setMaxResults(3).getResultList();
+ for (Calendar c : cals) {
+ assertFalse(c instanceof ProxyCalendar);
+ }
+ }
+
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/LRSEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/LRSEntity.java?rev=1212503&r1=1212502&r2=1212503&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/LRSEntity.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/LRSEntity.java Fri Dec 9 16:30:58 2011
@@ -40,7 +40,7 @@ public class LRSEntity {
@ManyToMany
@OrderBy("name ASC")
@LRS
- private Collection<BasicEntity> lrsList = new ArrayList<BasicEntity>();
+ private Collection<BasicEntity> lrsList;
public long getId() {
return id;
@@ -54,7 +54,10 @@ public class LRSEntity {
this.name = name;
}
- public Collection<BasicEntity> getLRSList() {
- return lrsList;
+ public Collection<BasicEntity> getLRSList() {
+ if (lrsList == null) {
+ lrsList = new ArrayList<BasicEntity>();
+ }
+ return lrsList;
}
}