• 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/Kryo5ClassResolver.java
1
package com.alicp.jetcache.support;
2

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

11
/**
12
 * DecodeFilter-aware Kryo5 class resolver.
13
 * <p>
14
 * Filter check logic is in {@link KryoClassResolverUtil}.
15
 *
16
 * @author huangli
17
 */
18
class Kryo5ClassResolver extends DefaultClassResolver {
19

20
    private final DecodeFilter decodeFilter;
21

22
    public Kryo5ClassResolver(DecodeFilter decodeFilter) {
1✔
23
        this.decodeFilter = decodeFilter;
1✔
24
    }
1✔
25

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

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

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

67
    @Override
68
    protected Class<?> getTypeByName(String className) {
NEW
69
        KryoClassResolverUtil.checkAllowed(className, decodeFilter);
×
70
        return super.getTypeByName(className);
×
71
    }
72
}
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