/
SerialisedPCMapping.java
121 lines (109 loc) · 4.79 KB
/
SerialisedPCMapping.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**********************************************************************
Copyright (c) 2005 Andy Jefferson and others. All rights reserved.
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.
Contributors:
...
**********************************************************************/
package org.datanucleus.store.rdbms.mapping.java;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.datanucleus.ExecutionContext;
import org.datanucleus.state.ObjectProvider;
/**
* Mapping for a serialised persistable object.
* Extends ObjectMapping since that provides the basic serialisation mechanism,
* adding on the addition of StateManagers to the serialised object whenever it is required.
*/
public class SerialisedPCMapping extends SerialisedMapping
{
/**
* Method to populate parameter positions in a PreparedStatement with this object
* @param ec The ExecutionContext
* @param ps The Prepared Statement
* @param exprIndex The parameter positions to populate
* @param value The value of the PC to use in populating the parameter positions
*/
public void setObject(ExecutionContext ec, PreparedStatement ps, int[] exprIndex, Object value)
{
setObject(ec, ps, exprIndex, value, null, mmd.getAbsoluteFieldNumber());
}
/**
* Method to populate parameter positions in a PreparedStatement with this object
* @param ec The ExecutionContext
* @param ps The Prepared Statement
* @param exprIndex The parameter positions to populate
* @param value The value of the PC to use in populating the parameter positions
* @param ownerOP ObjectProvider for the owning object
* @param fieldNumber field number of this object in the owning object
*/
public void setObject(ExecutionContext ec, PreparedStatement ps, int[] exprIndex, Object value,
ObjectProvider ownerOP, int fieldNumber)
{
if (value != null)
{
// Assign a StateManager to the serialised object if none present
ObjectProvider embSM = ec.findObjectProvider(value);
if (embSM == null || ec.getApiAdapter().getExecutionContext(value) == null)
{
embSM = ec.getNucleusContext().getObjectProviderFactory().newForEmbedded(ec, value, false, ownerOP, fieldNumber);
}
}
ObjectProvider sm = null;
if (value != null)
{
// Find SM for serialised object
sm = ec.findObjectProvider(value);
}
if (sm != null)
{
sm.setStoringPC();
}
getDatastoreMapping(0).setObject(ps, exprIndex[0], value);
if (sm != null)
{
sm.unsetStoringPC();
}
}
/**
* Method to extract the value of the persistable from a ResultSet.
* @param ec The ExecutionContext
* @param resultSet The ResultSet
* @param exprIndex The parameter positions in the result set to use.
* @return The (deserialised) persistable object
*/
public Object getObject(ExecutionContext ec, ResultSet resultSet, int[] exprIndex)
{
return getObject(ec, resultSet, exprIndex, null, mmd.getAbsoluteFieldNumber());
}
/**
* Method to extract the value of the persistable from a ResultSet.
* @param ec The ExecutionContext
* @param resultSet The ResultSet
* @param exprIndex The parameter positions in the result set to use.
* @param ownerOP ObjectProvider for the owning object
* @param fieldNumber Absolute number of field in owner object
* @return The (deserialised) persistable object
*/
public Object getObject(ExecutionContext ec, ResultSet resultSet, int[] exprIndex, ObjectProvider ownerOP, int fieldNumber)
{
Object obj = getDatastoreMapping(0).getObject(resultSet, exprIndex[0]);
if (obj != null)
{
// Assign a StateManager to the serialised object if none present
ObjectProvider embSM = ec.findObjectProvider(obj);
if (embSM == null || ec.getApiAdapter().getExecutionContext(obj) == null)
{
ec.getNucleusContext().getObjectProviderFactory().newForEmbedded(ec, obj, false, ownerOP, fieldNumber);
}
}
return obj;
}
}