Skip to content

Commit 2d1989e

Browse files
committed
Unifying ParameterBinding hierarchy into a single class and reducing its mutability
1 parent a49929e commit 2d1989e

63 files changed

Lines changed: 466 additions & 500 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
****************************************************************/
1919
package org.apache.cayenne.crypto.batch;
2020

21-
import org.apache.cayenne.access.translator.DbAttributeBinding;
21+
import org.apache.cayenne.access.translator.ParameterBinding;
2222
import org.apache.cayenne.access.translator.batch.BatchTranslator;
2323
import org.apache.cayenne.access.translator.batch.BatchTranslatorFactory;
2424
import org.apache.cayenne.crypto.transformer.BindingsTransformer;
@@ -65,16 +65,16 @@ public String getSql() {
6565
}
6666

6767
@Override
68-
public DbAttributeBinding[] getBindings() {
68+
public ParameterBinding[] getBindings() {
6969
return delegateTranslator.getBindings();
7070
}
7171

7272
@Override
73-
public DbAttributeBinding[] updateBindings(BatchQueryRow row) {
73+
public ParameterBinding[] updateBindings(BatchQueryRow row) {
7474

7575
ensureEncryptorCompiled();
7676

77-
DbAttributeBinding[] bindings = delegateTranslator.updateBindings(row);
77+
ParameterBinding[] bindings = delegateTranslator.updateBindings(row);
7878

7979
if (encryptor != null) {
8080
encryptor.transform(bindings);

cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/BindingsTransformer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
****************************************************************/
1919
package org.apache.cayenne.crypto.transformer;
2020

21-
import org.apache.cayenne.access.translator.DbAttributeBinding;
21+
import org.apache.cayenne.access.translator.ParameterBinding;
2222

2323
/**
2424
* @since 4.0
2525
*/
2626
public interface BindingsTransformer {
2727

28-
void transform(DbAttributeBinding[] bindings);
28+
void transform(ParameterBinding[] bindings);
2929
}

cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
****************************************************************/
1919
package org.apache.cayenne.crypto.transformer;
2020

21-
import org.apache.cayenne.access.translator.DbAttributeBinding;
21+
import org.apache.cayenne.access.translator.ParameterBinding;
2222
import org.apache.cayenne.access.types.ExtendedType;
2323
import org.apache.cayenne.access.types.ExtendedTypeMap;
2424
import org.apache.cayenne.crypto.transformer.bytes.BytesEncryptor;
@@ -45,20 +45,19 @@ public DefaultBindingsTransformer(int[] positions,
4545
}
4646

4747
@Override
48-
public void transform(DbAttributeBinding[] bindings) {
48+
public void transform(ParameterBinding[] bindings) {
4949

5050
int len = positions.length;
5151

5252
for (int i = 0; i < len; i++) {
53-
DbAttributeBinding b = bindings[positions[i]];
53+
ParameterBinding b = bindings[positions[i]];
5454
Object transformed = transformers[i].encrypt(encryptor, b.getValue());
55-
b.setValue(transformed);
5655

5756
ExtendedType extendedType = transformed != null
5857
? extendedTypeMap.getRegisteredType(transformed.getClass())
5958
: extendedTypeMap.getDefaultType();
6059

61-
b.setExtendedType(extendedType);
60+
b.include(b.getStatementPosition(), transformed, extendedType);
6261
}
6362
}
6463

cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
package org.apache.cayenne.crypto.transformer;
2020

2121
import org.apache.cayenne.access.jdbc.ColumnDescriptor;
22-
import org.apache.cayenne.access.translator.DbAttributeBinding;
22+
import org.apache.cayenne.access.translator.ParameterBinding;
2323
import org.apache.cayenne.access.types.ExtendedTypeMap;
2424
import org.apache.cayenne.crypto.map.ColumnMapper;
2525
import org.apache.cayenne.crypto.transformer.bytes.BytesTransformerFactory;
@@ -91,7 +91,7 @@ public MapTransformer decryptor(ColumnDescriptor[] columns, Object sampleRow) {
9191
}
9292

9393
@Override
94-
public BindingsTransformer encryptor(DbAttributeBinding[] bindings, ExtendedTypeMap extendedTypeMap) {
94+
public BindingsTransformer encryptor(ParameterBinding[] bindings, ExtendedTypeMap extendedTypeMap) {
9595
int len = bindings.length;
9696
List<Integer> cryptoColumns = null;
9797

@@ -116,7 +116,7 @@ public BindingsTransformer encryptor(DbAttributeBinding[] bindings, ExtendedType
116116

117117
for (int i = 0; i < dlen; i++) {
118118
int pos = cryptoColumns.get(i);
119-
DbAttributeBinding b = bindings[pos];
119+
ParameterBinding b = bindings[pos];
120120
positions[i] = pos;
121121
transformers[i] = transformerFactory.encryptor(b.getAttribute());
122122
}

cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
package org.apache.cayenne.crypto.transformer;
2020

2121
import org.apache.cayenne.access.jdbc.ColumnDescriptor;
22-
import org.apache.cayenne.access.translator.DbAttributeBinding;
22+
import org.apache.cayenne.access.translator.ParameterBinding;
2323
import org.apache.cayenne.access.types.ExtendedTypeMap;
2424

2525
/**
@@ -30,7 +30,7 @@
3030
*/
3131
public interface TransformerFactory {
3232

33-
BindingsTransformer encryptor(DbAttributeBinding[] bindings, ExtendedTypeMap extendedTypeMap);
33+
BindingsTransformer encryptor(ParameterBinding[] bindings, ExtendedTypeMap extendedTypeMap);
3434

3535
MapTransformer decryptor(ColumnDescriptor[] columns, Object sampleRow);
3636
}

cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ public class DefaultValueForNullProvider implements ValueForNullProvider {
3333
private Map<String, ParameterBinding> values = new HashMap<>();
3434

3535
public void set(DbEntity entity, DbAttribute column, Object value, int type) {
36-
values.put(createKey(entity, column), new ParameterBinding(value, type, column
37-
.getAttributePrecision()));
36+
// the binding is only ever read for its value (inlined into the UPDATE below), never bound to a
37+
// statement, so the position is irrelevant here
38+
ParameterBinding binding = new ParameterBinding(type, column.getAttributePrecision())
39+
.include(1, value, null);
40+
values.put(createKey(entity, column), binding);
3841
}
3942

4043
protected ParameterBinding get(DbEntity entity, DbAttribute column) {

cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ protected ParameterBinding get(DbEntity entity, DbAttribute column) {
105105
int type = column.getType();
106106
switch (type) {
107107
case Types.VARCHAR:
108-
return new ParameterBinding(DEFAULT_VALUE_STRING, type, -1);
108+
return new ParameterBinding(type, -1).include(1, DEFAULT_VALUE_STRING, null);
109109
default:
110110
throw new AssertionError("should not get here");
111111
}

cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import java.util.Iterator;
2626

2727
import org.apache.cayenne.access.translator.ParameterBinding;
28+
import org.apache.cayenne.access.types.ExtendedType;
29+
import org.apache.cayenne.access.types.ExtendedTypeMap;
30+
import org.apache.cayenne.dba.DbAdapter;
2831
import org.apache.cayenne.dba.TypesMapping;
2932
import org.apache.cayenne.util.ConversionUtil;
3033
import org.apache.velocity.context.InternalContextAdapter;
@@ -130,12 +133,26 @@ protected void render(InternalContextAdapter context, Writer writer, Node node,
130133
+ ") at line " + node.getLine() + ", column " + node.getColumn());
131134
}
132135

133-
render(context, writer, new ParameterBinding(value, jdbcType, scale));
136+
render(context, writer, new ParameterBinding(preferredBindingType(context, jdbcType), scale), value);
134137
}
135138

136-
protected void render(InternalContextAdapter context, Writer writer, ParameterBinding binding) throws IOException {
139+
/**
140+
* Resolves the JDBC type the target adapter prefers for binding.
141+
*
142+
* @since 5.0
143+
*/
144+
protected int preferredBindingType(InternalContextAdapter context, int jdbcType) {
145+
return adapter(context).preferredBindingType(jdbcType);
146+
}
147+
148+
private static DbAdapter adapter(InternalContextAdapter context) {
149+
return (DbAdapter) context.getInternalUserContext().get(VelocitySQLTemplateTranslator.ADAPTER_KEY);
150+
}
151+
152+
protected void render(InternalContextAdapter context, Writer writer, ParameterBinding binding, Object value)
153+
throws IOException {
137154

138-
bind(context, binding);
155+
bind(context, binding, value);
139156
writer.write('?');
140157
}
141158

@@ -146,14 +163,24 @@ protected Object getChild(InternalContextAdapter context, Node node, int i) thro
146163
/**
147164
* Adds value to the list of bindings in the context.
148165
*/
149-
protected void bind(InternalContextAdapter context, ParameterBinding binding) {
166+
protected void bind(InternalContextAdapter context, ParameterBinding binding, Object value) {
150167

151168
@SuppressWarnings("unchecked")
152169
Collection<ParameterBinding> bindings = (Collection<ParameterBinding>)
153170
context.getInternalUserContext().get(VelocitySQLTemplateTranslator.BINDINGS_LIST_KEY);
154171

155172
if (bindings != null) {
173+
// a binding's statement position is its 1-based ordinal among the bound parameters; the
174+
// ExtendedType is resolved from the value via the adapter
175+
binding.include(bindings.size() + 1, value, extendedType(context, value));
156176
bindings.add(binding);
157177
}
158178
}
179+
180+
private ExtendedType<?> extendedType(InternalContextAdapter context, Object value) {
181+
ExtendedTypeMap extendedTypes = adapter(context).getExtendedTypes();
182+
return value != null
183+
? extendedTypes.getRegisteredType(value.getClass())
184+
: extendedTypes.getDefaultType();
185+
}
159186
}

cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindEqualDirective.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ public String getName() {
4343
protected void render(
4444
InternalContextAdapter context,
4545
Writer writer,
46-
ParameterBinding binding)
46+
ParameterBinding binding,
47+
Object value)
4748
throws IOException {
4849

49-
if (binding.getValue() != null) {
50-
bind(context, binding);
50+
if (value != null) {
51+
bind(context, binding, value);
5152
writer.write("= ?");
5253
}
5354
else {

cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindNotEqualDirective.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ public String getName() {
4343
protected void render(
4444
InternalContextAdapter context,
4545
Writer writer,
46-
ParameterBinding binding) throws IOException {
46+
ParameterBinding binding,
47+
Object value) throws IOException {
4748

48-
if (binding.getValue() != null) {
49-
bind(context, binding);
49+
if (value != null) {
50+
bind(context, binding, value);
5051
writer.write("<> ?");
5152
}
5253
else {

0 commit comments

Comments
 (0)