2222import java .util .Map ;
2323
2424import org .apache .cayenne .access .jdbc .ColumnDescriptor ;
25- import org .apache .cayenne .access .jdbc .RowDescriptor ;
2625import org .apache .cayenne .access .jdbc .reader .DefaultRowReaderFactory ;
2726import org .apache .cayenne .access .jdbc .reader .RowReader ;
2827import org .apache .cayenne .access .types .ExtendedType ;
@@ -60,80 +59,63 @@ public CryptoRowReaderFactoryDecorator(@Inject TransformerFactory transformerFac
6059 }
6160
6261 @ Override
63- public RowReader <?> rowReader (RowDescriptor descriptor , QueryMetadata queryMetadata , DbAdapter adapter ) {
64- RowDescriptor encryptedRowDescriptor = encryptedRowDescriptor (descriptor , adapter .getExtendedTypes ());
65- return super .rowReader (encryptedRowDescriptor , queryMetadata , adapter );
62+ public RowReader <?> rowReader (ColumnDescriptor [] columns , QueryMetadata queryMetadata , DbAdapter adapter ) {
63+ return super .rowReader (encryptedColumns (columns , adapter .getExtendedTypes ()), queryMetadata , adapter );
6664 }
6765
6866 @ Override
69- protected RowReader <?> createScalarRowReader (RowDescriptor descriptor , QueryMetadata queryMetadata ,
67+ protected RowReader <?> createScalarRowReader (ColumnDescriptor [] columns , QueryMetadata queryMetadata ,
7068 ScalarResultSegment segment ) {
7169 RowReader <?> scalarRowReader = super
72- .createScalarRowReader (descriptor , queryMetadata , segment );
73- return new DecoratedScalarRowReader (descriptor . getColumns () [segment .getColumnOffset ()], scalarRowReader );
70+ .createScalarRowReader (columns , queryMetadata , segment );
71+ return new DecoratedScalarRowReader (columns [segment .getColumnOffset ()], scalarRowReader );
7472 }
7573
7674 @ Override
77- protected RowReader <?> createEntityRowReader (RowDescriptor descriptor , QueryMetadata queryMetadata ,
75+ protected RowReader <?> createEntityRowReader (ColumnDescriptor [] columns , QueryMetadata queryMetadata ,
7876 EntityResultSegment resultMetadata ) {
7977 RowReader <?> entityRowReader = super
80- .createEntityRowReader (descriptor , queryMetadata , resultMetadata );
81- return new DecoratedEntityRowReader (descriptor , entityRowReader , resultMetadata );
78+ .createEntityRowReader (columns , queryMetadata , resultMetadata );
79+ return new DecoratedEntityRowReader (columns , entityRowReader , resultMetadata );
8280 }
8381
8482 @ Override
85- protected RowReader <?> createFullRowReader (RowDescriptor descriptor , QueryMetadata queryMetadata ) {
83+ protected RowReader <?> createFullRowReader (ColumnDescriptor [] columns , QueryMetadata queryMetadata ) {
8684 RowReader <?> fullRowReader = super
87- .createFullRowReader (descriptor , queryMetadata );
88- return new DecoratedFullRowReader (descriptor , fullRowReader );
85+ .createFullRowReader (columns , queryMetadata );
86+ return new DecoratedFullRowReader (columns , fullRowReader );
8987 }
9088
91- protected RowDescriptor encryptedRowDescriptor ( RowDescriptor descriptor , ExtendedTypeMap typeMap ) {
89+ protected ColumnDescriptor [] encryptedColumns ( ColumnDescriptor [] columns , ExtendedTypeMap typeMap ) {
9290
93- // need to tweak the original descriptor to ensure binary columns are read as binary, eben if the plain Java
94- // type is not a byte[]
91+ // need to tweak the columns to ensure encrypted columns are read as binary or char, even if the plain Java
92+ // type is not a byte[] / String
9593
96- ColumnDescriptor [] originalColumns = descriptor .getColumns ();
97- int len = originalColumns .length ;
94+ ColumnDescriptor [] encrypted = new ColumnDescriptor [columns .length ];
9895
99- ExtendedType [] originalConverters = descriptor .getConverters ();
100- ExtendedType [] encryptedConverters = new ExtendedType [len ];
96+ for (int i = 0 ; i < columns .length ; i ++) {
97+ ColumnDescriptor column = columns [i ];
98+ DbAttribute attribute = column .attribute ();
10199
102- for (int i = 0 ; i < len ; i ++) {
103- DbAttribute attribute = originalColumns [i ].attribute ();
104-
105- ExtendedType t = originalConverters [i ];
100+ ExtendedType type = column .type ();
106101
107102 if (attribute != null && columnMapper .isEncrypted (attribute )) {
108103
109104 // only char or binary columns can store encrypted data
110105 if (TypesMapping .isBinary (attribute .getType ())) {
111- t = typeMap .getRegisteredType (byte [].class );
106+ type = typeMap .getRegisteredType (byte [].class );
112107 } else if (TypesMapping .isCharacter (attribute .getType ())) {
113- t = typeMap .getRegisteredType (String .class );
108+ type = typeMap .getRegisteredType (String .class );
114109 }
115110 // else - warning?
116111 }
117112
118- encryptedConverters [i ] = t ;
119- }
120-
121- return new DecoratedRowDescriptor (descriptor , originalColumns , encryptedConverters );
122- }
123-
124- private static class DecoratedRowDescriptor extends RowDescriptor {
125-
126- private final RowDescriptor original ;
127-
128- DecoratedRowDescriptor (RowDescriptor rowDescriptor , ColumnDescriptor [] columns , ExtendedType [] converters ) {
129- this .original = rowDescriptor ;
130- this .columns = columns ;
131- this .converters = converters ;
113+ encrypted [i ] = type == column .type ()
114+ ? column
115+ : new ColumnDescriptor (column .name (), column .dataRowKey (), column .jdbcType (), type , attribute );
132116 }
133117
134- public RowDescriptor unwrap () {
135- return original ;
136- }
118+ return encrypted ;
137119 }
138120
139121 private class DecoratedScalarRowReader implements RowReader <Object > {
@@ -164,16 +146,16 @@ public Object readRow(ResultSet resultSet) {
164146
165147 private abstract class DecoratedEntityFullRowReader implements RowReader <Object > {
166148
167- final RowDescriptor descriptor ;
149+ final ColumnDescriptor [] columns ;
168150 final RowReader <?> delegateReader ;
169151 final EntityResultSegment resultMetadata ;
170152 boolean decryptorCompiled ;
171153 MapTransformer decryptor ;
172154
173- DecoratedEntityFullRowReader (RowDescriptor descriptor ,
155+ DecoratedEntityFullRowReader (ColumnDescriptor [] columns ,
174156 RowReader <?> delegateReader ,
175157 EntityResultSegment resultMetadata ) {
176- this .descriptor = descriptor ;
158+ this .columns = columns ;
177159 this .delegateReader = delegateReader ;
178160 this .resultMetadata = resultMetadata ;
179161 }
@@ -198,10 +180,10 @@ public Object readRow(ResultSet resultSet) {
198180
199181 private class DecoratedEntityRowReader extends DecoratedEntityFullRowReader {
200182
201- DecoratedEntityRowReader (RowDescriptor descriptor ,
183+ DecoratedEntityRowReader (ColumnDescriptor [] columns ,
202184 RowReader <?> delegateReader ,
203185 EntityResultSegment resultMetadata ) {
204- super (descriptor , delegateReader , resultMetadata );
186+ super (columns , delegateReader , resultMetadata );
205187 }
206188
207189 void ensureDecryptorCompiled (Object row ) {
@@ -211,7 +193,7 @@ void ensureDecryptorCompiled(Object row) {
211193 ColumnDescriptor [] columnDescriptors =
212194 new ColumnDescriptor [fieldsSize ];
213195 for (int i = offset , j = 0 ; i < offset + fieldsSize ; i ++) {
214- columnDescriptors [j ++] = descriptor . getColumns () [i ];
196+ columnDescriptors [j ++] = columns [i ];
215197 }
216198 decryptor = transformerFactory .decryptor (columnDescriptors , row );
217199 decryptorCompiled = true ;
@@ -226,14 +208,14 @@ public Object readRow(ResultSet resultSet) {
226208
227209 private class DecoratedFullRowReader extends DecoratedEntityFullRowReader {
228210
229- DecoratedFullRowReader (RowDescriptor descriptor ,
211+ DecoratedFullRowReader (ColumnDescriptor [] columns ,
230212 RowReader <?> delegateReader ) {
231- super (descriptor , delegateReader , null );
213+ super (columns , delegateReader , null );
232214 }
233215
234216 void ensureDecryptorCompiled (Object row ) {
235217 if (!decryptorCompiled ) {
236- decryptor = transformerFactory .decryptor (descriptor . getColumns () , row );
218+ decryptor = transformerFactory .decryptor (columns , row );
237219 decryptorCompiled = true ;
238220 }
239221 }
0 commit comments