Skip to content

Commit ebb8ac9

Browse files
marcospassoscowtowncoder
authored andcommitted
Cache record names to avoid hitting class loader
1 parent 0668a4f commit ebb8ac9

File tree

1 file changed

+49
-25
lines changed

1 file changed

+49
-25
lines changed

avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java

+49-25
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
public abstract class AvroSchemaHelper
2626
{
27+
private static final Map<String, String> SCHEMA_NAME_CACHE = new HashMap<>();
28+
2729
/**
2830
* Dedicated mapper for handling default values (String &lt;-&gt; JsonNode &lt;-&gt; Object)
2931
*
@@ -332,32 +334,54 @@ public static String getTypeId(Schema schema) {
332334
*/
333335
public static String getFullName(Schema schema) {
334336
switch (schema.getType()) {
335-
case RECORD:
336-
case ENUM:
337-
case FIXED:
338-
String namespace = schema.getNamespace();
339-
String name = schema.getName();
340-
if (namespace == null) {
341-
return schema.getName();
342-
}
343-
if (namespace.endsWith("$")) {
344-
return namespace + name;
345-
}
346-
StringBuilder sb = new StringBuilder(1 + namespace.length() + name.length());
347-
// 28-Feb-2020: [dataformats-binary#195] somewhat complicated logic of trying
348-
// to support differences between avro-lib 1.8 and 1.9...
349-
// Check if this is a nested class
350-
String nestedClassName = sb.append(namespace).append('$').append(name).toString();
351-
try {
352-
Class.forName(nestedClassName);
353-
return nestedClassName;
354-
} catch (ClassNotFoundException e) {
355-
// Could not find a nested class, must be a regular class
356-
sb.setLength(0);
357-
return sb.append(namespace).append('.').append(name).toString();
358-
}
337+
case RECORD:
338+
case ENUM:
339+
case FIXED:
340+
String namespace = schema.getNamespace();
341+
String name = schema.getName();
342+
String key = namespace + "." + name;
343+
String schemaName = SCHEMA_NAME_CACHE.get(key);
344+
345+
if (schemaName == null) {
346+
schemaName = resolveFullName(schema);
347+
SCHEMA_NAME_CACHE.put(key, schemaName);
348+
}
349+
350+
return schemaName;
351+
359352
default:
360-
return schema.getType().getName();
353+
return schema.getType().getName();
354+
}
355+
}
356+
357+
private static String resolveFullName(Schema schema) {
358+
String namespace = schema.getNamespace();
359+
String name = schema.getName();
360+
361+
if (namespace == null) {
362+
return schema.getName();
363+
}
364+
365+
if (namespace.endsWith("$")) {
366+
return namespace + name;
367+
}
368+
369+
StringBuilder sb = new StringBuilder(1 + namespace.length() + name.length());
370+
371+
// 28-Feb-2020: [dataformats-binary#195] somewhat complicated logic of trying
372+
// to support differences between avro-lib 1.8 and 1.9...
373+
// Check if this is a nested class
374+
String nestedClassName = sb.append(namespace).append('$').append(name).toString();
375+
376+
try {
377+
Class.forName(nestedClassName);
378+
379+
return nestedClassName;
380+
} catch (ClassNotFoundException e) {
381+
// Could not find a nested class, must be a regular class
382+
sb.setLength(0);
383+
384+
return sb.append(namespace).append('.').append(name).toString();
361385
}
362386
}
363387

0 commit comments

Comments
 (0)