Skip to content

Commit d4040e2

Browse files
committed
Remove Avro reflection
See `DISCUSS` on dev-list: https://lists.apache.org/thread/c91s61tqkbbrc7xj180xh2rx89yx8pfk
1 parent 00b6bab commit d4040e2

File tree

3 files changed

+1
-107
lines changed

3 files changed

+1
-107
lines changed

parquet-avro/src/main/java/org/apache/parquet/avro/AvroConverters.java

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,11 @@
1818
*/
1919
package org.apache.parquet.avro;
2020

21-
import java.lang.reflect.Constructor;
22-
import java.lang.reflect.InvocationTargetException;
2321
import java.nio.ByteBuffer;
24-
import java.util.Arrays;
25-
import java.util.List;
2622
import org.apache.avro.Schema;
2723
import org.apache.avro.generic.GenericData;
2824
import org.apache.avro.util.Utf8;
2925
import org.apache.parquet.column.Dictionary;
30-
import org.apache.parquet.io.ParquetDecodingException;
3126
import org.apache.parquet.io.api.Binary;
3227
import org.apache.parquet.io.api.GroupConverter;
3328
import org.apache.parquet.io.api.PrimitiveConverter;
@@ -266,58 +261,6 @@ public Utf8 convert(Binary binary) {
266261
}
267262
}
268263

269-
static final class FieldStringableConverter extends BinaryConverter<Object> {
270-
private final String stringableName;
271-
private final Constructor<?> ctor;
272-
273-
public FieldStringableConverter(ParentValueContainer parent, Class<?> stringableClass) {
274-
super(parent);
275-
checkSecurity(stringableClass);
276-
stringableName = stringableClass.getName();
277-
try {
278-
this.ctor = stringableClass.getConstructor(String.class);
279-
} catch (NoSuchMethodException e) {
280-
throw new ParquetDecodingException("Unable to get String constructor for " + stringableName, e);
281-
}
282-
}
283-
284-
@Override
285-
public Object convert(Binary binary) {
286-
try {
287-
return ctor.newInstance(binary.toStringUsingUTF8());
288-
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
289-
throw new ParquetDecodingException("Cannot convert binary to " + stringableName, e);
290-
}
291-
}
292-
293-
private void checkSecurity(Class<?> clazz) throws SecurityException {
294-
List<String> trustedPackages = Arrays.asList(SERIALIZABLE_PACKAGES);
295-
296-
boolean trustAllPackages = trustedPackages.size() == 1 && "*".equals(trustedPackages.get(0));
297-
if (trustAllPackages || clazz.isPrimitive()) {
298-
return;
299-
}
300-
301-
boolean found = false;
302-
Package thePackage = clazz.getPackage();
303-
if (thePackage != null) {
304-
for (String trustedPackage : trustedPackages) {
305-
if (thePackage.getName().equals(trustedPackage)
306-
|| thePackage.getName().startsWith(trustedPackage + ".")) {
307-
found = true;
308-
break;
309-
}
310-
}
311-
if (!found) {
312-
throw new SecurityException("Forbidden " + clazz
313-
+ "! This class is not trusted to be included in Avro schema using java-class."
314-
+ " Please set org.apache.parquet.avro.SERIALIZABLE_PACKAGES system property"
315-
+ " with the packages you trust.");
316-
}
317-
}
318-
}
319-
}
320-
321264
static final class FieldEnumConverter extends BinaryConverter<Object> {
322265
private final Schema schema;
323266
private final GenericData model;

parquet-avro/src/main/java/org/apache/parquet/avro/AvroRecordConverter.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,10 @@
5252
import org.apache.avro.reflect.AvroIgnore;
5353
import org.apache.avro.reflect.AvroName;
5454
import org.apache.avro.reflect.ReflectData;
55-
import org.apache.avro.reflect.Stringable;
5655
import org.apache.avro.specific.SpecificData;
5756
import org.apache.avro.util.ClassUtils;
5857
import org.apache.parquet.Preconditions;
5958
import org.apache.parquet.avro.AvroConverters.FieldStringConverter;
60-
import org.apache.parquet.avro.AvroConverters.FieldStringableConverter;
6159
import org.apache.parquet.io.InvalidRecordException;
6260
import org.apache.parquet.io.api.Converter;
6361
import org.apache.parquet.io.api.GroupConverter;
@@ -144,18 +142,6 @@ public void add(Object value) {
144142
converters[parquetFieldIndex] =
145143
newConverter(nonNullSchema, parquetField, this.model, fieldClass, container);
146144

147-
// @Stringable doesn't affect the reflected schema; must be enforced here
148-
if (recordClass != null && converters[parquetFieldIndex] instanceof FieldStringConverter) {
149-
try {
150-
Field field = recordClass.getDeclaredField(avroField.name());
151-
if (field.isAnnotationPresent(Stringable.class)) {
152-
converters[parquetFieldIndex] = new FieldStringableConverter(container, field.getType());
153-
}
154-
} catch (NoSuchFieldException e) {
155-
// must not be stringable
156-
}
157-
}
158-
159145
parquetFieldIndex += 1;
160146
}
161147

@@ -411,7 +397,7 @@ private static Converter newStringConverter(Schema schema, GenericData model, Pa
411397
} else if (stringableClass == CharSequence.class) {
412398
return new AvroConverters.FieldUTF8Converter(parent);
413399
}
414-
return new FieldStringableConverter(parent, stringableClass);
400+
return null;
415401
}
416402

417403
private static Class<?> getStringableClass(Schema schema, GenericData model) {

parquet-avro/src/test/java/org/apache/parquet/avro/TestReflectReadWrite.java

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.apache.avro.util.Utf8;
3838
import org.apache.hadoop.conf.Configuration;
3939
import org.apache.hadoop.fs.Path;
40-
import org.apache.parquet.UntrustedStringableClass;
4140
import org.apache.parquet.hadoop.ParquetReader;
4241
import org.apache.parquet.hadoop.ParquetWriter;
4342
import org.apache.parquet.hadoop.metadata.CompressionCodecName;
@@ -77,40 +76,6 @@ public void testWriteReflectReadGeneric() throws IOException {
7776
}
7877
}
7978

80-
@Test(expected = SecurityException.class)
81-
public void testUntrustedStringableClass() {
82-
new AvroConverters.FieldStringableConverter(
83-
new ParentValueContainer() {
84-
@Override
85-
public void add(Object value) {}
86-
87-
@Override
88-
public void addBoolean(boolean value) {}
89-
90-
@Override
91-
public void addInt(int value) {}
92-
93-
@Override
94-
public void addLong(long value) {}
95-
96-
@Override
97-
public void addFloat(float value) {}
98-
99-
@Override
100-
public void addDouble(double value) {}
101-
102-
@Override
103-
public void addChar(char value) {}
104-
105-
@Override
106-
public void addByte(byte value) {}
107-
108-
@Override
109-
public void addShort(short value) {}
110-
},
111-
UntrustedStringableClass.class);
112-
}
113-
11479
private GenericRecord getGenericPojoUtf8() {
11580
Schema schema = ReflectData.get().getSchema(Pojo.class);
11681
GenericData.Record record = new GenericData.Record(schema);

0 commit comments

Comments
 (0)