• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

alibaba / jetcache / #447

23 May 2026 01:52AM UTC coverage: 88.921% (-0.4%) from 89.31%
#447

push

areyouok
feat: allow customize DecodeFilter for kryo decoder

54 of 59 new or added lines in 8 files covered. (91.53%)

24 existing lines in 8 files now uncovered.

4976 of 5596 relevant lines covered (88.92%)

0.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.71
/jetcache-core/src/main/java/com/alicp/jetcache/support/KryoClassResolver.java
1
package com.alicp.jetcache.support;
2

3
import com.esotericsoftware.kryo.Kryo;
4
import com.esotericsoftware.kryo.KryoException;
5
import com.esotericsoftware.kryo.Registration;
6
import com.esotericsoftware.kryo.io.Input;
7
import com.esotericsoftware.kryo.util.DefaultClassResolver;
8
import com.esotericsoftware.kryo.util.IntMap;
9
import com.esotericsoftware.kryo.util.ObjectMap;
10

11
/**
12
 * DecodeFilter-aware class resolver for the legacy Maven coordinate {@code com.esotericsoftware:kryo}.
13
 * <p>
14
 * Despite the class name, this is NOT for Kryo4. Since JetCache 2.8.0, the
15
 * {@code com.esotericsoftware:kryo} dependency is also 5.x (just a different Maven coordinate
16
 * from {@code com.esotericsoftware.kryo:kryo5}). This resolver handles the
17
 * {@code com.esotericsoftware.kryo} package path.
18
 * <p>
19
 * Filter check logic is in {@link KryoClassResolverUtil}.
20
 *
21
 * @author huangli
22
 */
23
class KryoClassResolver extends DefaultClassResolver {
24
    private final DecodeFilter decodeFilter;
25

26
    public KryoClassResolver(DecodeFilter decodeFilter) {
1✔
27
        this.decodeFilter = decodeFilter;
1✔
28
    }
1✔
29

30
    @Override
31
    public Registration readClass(Input input) {
32
        Registration registration = super.readClass(input);
1✔
33
        if (registration != null) {
1✔
34
            KryoClassResolverUtil.checkAllowed(registration.getType(), decodeFilter);
1✔
35
        }
36
        return registration;
1✔
37
    }
38

39
    // Copied from DefaultClassResolver.readName() (Kryo 5.x, com.esotericsoftware:kryo)
40
    // with filter check inserted after reading className string and after class loading.
41
    // If Kryo upgrades, this method must be reviewed for consistency.
42
    @Override
43
    protected Registration readName(Input input) {
44
        int nameId = input.readVarInt(true);
1✔
45
        if (nameIdToClass == null) {
1✔
46
            nameIdToClass = new IntMap<>();
1✔
47
        }
48

49
        Class<?> type = nameIdToClass.get(nameId);
1✔
50
        if (type == null) {
1✔
51
            String className = input.readString();
1✔
52
            KryoClassResolverUtil.checkAllowed(className, decodeFilter);
1✔
53
            type = super.getTypeByName(className);
1✔
54
            if (type == null) {
1✔
55
                try {
56
                    type = KryoClassResolverUtil.loadClass(className, kryo.getClassLoader(), Kryo.class.getClassLoader());
1✔
57
                } catch (ClassNotFoundException e) {
×
58
                    throw new KryoException("Unable to find class: " + className, e);
×
59
                }
1✔
60
                if (nameToClass == null) {
1✔
61
                    nameToClass = new ObjectMap<>();
1✔
62
                }
63
                nameToClass.put(className, type);
1✔
64
            }
65
            nameIdToClass.put(nameId, type);
1✔
66
        }
67
        KryoClassResolverUtil.checkAllowed(type, decodeFilter);
1✔
68
        return kryo.getRegistration(type);
1✔
69
    }
70

71
    @Override
72
    protected Class<?> getTypeByName(String className) {
NEW
73
        KryoClassResolverUtil.checkAllowed(className, decodeFilter);
×
74
        return super.getTypeByName(className);
×
75
    }
76
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc