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

devonfw / IDEasy / 21013659204

14 Jan 2026 11:29PM UTC coverage: 70.365% (+0.5%) from 69.904%
21013659204

Pull #1675

github

web-flow
Merge 7a3aa598b into fcadaae82
Pull Request #1675: #1298: support ide-extra-tools.json #1658: prevent Jackson reflection

4015 of 6292 branches covered (63.81%)

Branch coverage included in aggregate %.

10440 of 14251 relevant lines covered (73.26%)

3.17 hits per line

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

96.36
cli/src/main/java/com/devonfw/tools/ide/json/JsonMapping.java
1
package com.devonfw.tools.ide.json;
2

3
import java.io.IOException;
4

5
import com.devonfw.tools.ide.tool.custom.CustomTool;
6
import com.devonfw.tools.ide.tool.custom.CustomToolJsonDeserializer;
7
import com.devonfw.tools.ide.tool.custom.CustomToolJsonSerializer;
8
import com.devonfw.tools.ide.tool.custom.CustomTools;
9
import com.devonfw.tools.ide.tool.custom.CustomToolsJsonDeserializer;
10
import com.devonfw.tools.ide.tool.custom.CustomToolsJsonSerializer;
11
import com.devonfw.tools.ide.tool.extra.ExtraToolInstallation;
12
import com.devonfw.tools.ide.tool.extra.ExtraToolInstallationJsonDeserializer;
13
import com.devonfw.tools.ide.tool.extra.ExtraToolInstallationJsonSerializer;
14
import com.devonfw.tools.ide.tool.extra.ExtraTools;
15
import com.devonfw.tools.ide.tool.extra.ExtraToolsJsonDeserializer;
16
import com.devonfw.tools.ide.tool.extra.ExtraToolsJsonSerializer;
17
import com.devonfw.tools.ide.tool.npm.NpmJs;
18
import com.devonfw.tools.ide.tool.npm.NpmJsDist;
19
import com.devonfw.tools.ide.tool.npm.NpmJsDistJsonDeserializer;
20
import com.devonfw.tools.ide.tool.npm.NpmJsDistJsonSerializer;
21
import com.devonfw.tools.ide.tool.npm.NpmJsJsonDeserializer;
22
import com.devonfw.tools.ide.tool.npm.NpmJsJsonSerializer;
23
import com.devonfw.tools.ide.tool.npm.NpmJsVersion;
24
import com.devonfw.tools.ide.tool.npm.NpmJsVersionJsonDeserializer;
25
import com.devonfw.tools.ide.tool.npm.NpmJsVersionJsonSerializer;
26
import com.devonfw.tools.ide.tool.npm.NpmJsVersions;
27
import com.devonfw.tools.ide.tool.npm.NpmJsVersionsJsonDeserializer;
28
import com.devonfw.tools.ide.tool.npm.NpmJsVersionsJsonSerializer;
29
import com.devonfw.tools.ide.tool.pip.PypiObject;
30
import com.devonfw.tools.ide.tool.pip.PypiObjectJsonDeserializer;
31
import com.devonfw.tools.ide.tool.pip.PypiObjectJsonSerializer;
32
import com.devonfw.tools.ide.url.model.file.json.Cve;
33
import com.devonfw.tools.ide.url.model.file.json.CveJsonDeserializer;
34
import com.devonfw.tools.ide.url.model.file.json.CveJsonSerializer;
35
import com.devonfw.tools.ide.url.model.file.json.ToolDependency;
36
import com.devonfw.tools.ide.url.model.file.json.ToolDependencyDeserializer;
37
import com.devonfw.tools.ide.url.model.file.json.ToolSecurity;
38
import com.devonfw.tools.ide.url.model.file.json.ToolSecurityJsonDeserializer;
39
import com.devonfw.tools.ide.url.model.file.json.ToolSecurityJsonSerializer;
40
import com.devonfw.tools.ide.version.VersionIdentifier;
41
import com.devonfw.tools.ide.version.VersionIdentifierDeserializer;
42
import com.devonfw.tools.ide.version.VersionRange;
43
import com.devonfw.tools.ide.version.VersionRangeDeserializer;
44
import com.devonfw.tools.ide.version.VersionRangeKeyDeserializer;
45
import com.devonfw.tools.ide.version.VersionRangeSerializer;
46
import com.fasterxml.jackson.annotation.JsonInclude;
47
import com.fasterxml.jackson.core.JsonParser;
48
import com.fasterxml.jackson.core.JsonToken;
49
import com.fasterxml.jackson.databind.DeserializationFeature;
50
import com.fasterxml.jackson.databind.ObjectMapper;
51
import com.fasterxml.jackson.databind.SerializationFeature;
52
import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
53
import com.fasterxml.jackson.databind.module.SimpleModule;
54
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
55

56
/**
57
 * Simple factory for Jackson {@link ObjectMapper} to read and write JSON with centralized mapping configuration.
58
 */
59
public class JsonMapping {
×
60

61
  /**
62
   * @return a new instance of {@link ObjectMapper} pre-configured for reasonable JSON mapping.
63
   */
64
  public static ObjectMapper create() {
65
    return create(false);
3✔
66
  }
67

68
  /**
69
   * <b>ATTENTION:</b>
70
   * Never use this method directly inside IDEasy {@code cli} module!
71
   *
72
   * @return a new instance of {@link ObjectMapper} pre-configured for reasonable JSON mapping.
73
   */
74
  public static ObjectMapper createWithReflectionSupportForUrlUpdaters() {
75

76
    return create(true);
3✔
77
  }
78

79
  private static ObjectMapper create(boolean supportReflection) {
80

81
    ObjectMapper mapper;
82
    if (supportReflection) {
2✔
83
      mapper = new ObjectMapper();
5✔
84
    } else {
85
      mapper = new ObjectMapper(null, IdeasySerializerProvider.get(), new DefaultDeserializationContext.Impl(IdeasyDeserializerFactory.get()));
10✔
86
    }
87
    mapper = mapper.registerModule(new JavaTimeModule());
6✔
88
    mapper = mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
5✔
89
    mapper = mapper.enable(SerializationFeature.INDENT_OUTPUT);
4✔
90
    mapper = mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
4✔
91
    mapper = mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
5✔
92
    SimpleModule customModule = new SimpleModule();
4✔
93
    // version mappings
94
    customModule.addDeserializer(VersionIdentifier.class, new VersionIdentifierDeserializer());
7✔
95
    customModule.addDeserializer(VersionRange.class, new VersionRangeDeserializer());
7✔
96
    customModule.addSerializer(VersionRange.class, new VersionRangeSerializer());
7✔
97
    customModule.addKeyDeserializer(VersionRange.class, new VersionRangeKeyDeserializer());
7✔
98
    // dependency mapping
99
    customModule.addDeserializer(ToolDependency.class, new ToolDependencyDeserializer());
7✔
100
    // security mapping
101
    customModule.addSerializer(ToolSecurity.class, new ToolSecurityJsonSerializer());
7✔
102
    customModule.addDeserializer(ToolSecurity.class, new ToolSecurityJsonDeserializer());
7✔
103
    customModule.addSerializer(Cve.class, new CveJsonSerializer());
7✔
104
    customModule.addDeserializer(Cve.class, new CveJsonDeserializer());
7✔
105
    // pypi mapping
106
    customModule.addDeserializer(PypiObject.class, new PypiObjectJsonDeserializer());
7✔
107
    customModule.addSerializer(PypiObject.class, new PypiObjectJsonSerializer());
7✔
108
    // custom tools mapping
109
    customModule.addDeserializer(CustomTools.class, new CustomToolsJsonDeserializer());
7✔
110
    customModule.addSerializer(CustomTools.class, new CustomToolsJsonSerializer());
7✔
111
    customModule.addDeserializer(CustomTool.class, new CustomToolJsonDeserializer());
7✔
112
    customModule.addSerializer(CustomTool.class, new CustomToolJsonSerializer());
7✔
113
    // extra tools mapping
114
    customModule.addDeserializer(ExtraTools.class, new ExtraToolsJsonDeserializer());
7✔
115
    customModule.addSerializer(ExtraTools.class, new ExtraToolsJsonSerializer());
7✔
116
    customModule.addDeserializer(ExtraToolInstallation.class, new ExtraToolInstallationJsonDeserializer());
7✔
117
    customModule.addSerializer(ExtraToolInstallation.class, new ExtraToolInstallationJsonSerializer());
7✔
118
    // npmjs mapping
119
    customModule.addSerializer(NpmJs.class, new NpmJsJsonSerializer());
7✔
120
    customModule.addDeserializer(NpmJs.class, new NpmJsJsonDeserializer());
7✔
121
    customModule.addSerializer(NpmJsVersion.class, new NpmJsVersionJsonSerializer());
7✔
122
    customModule.addDeserializer(NpmJsVersion.class, new NpmJsVersionJsonDeserializer());
7✔
123
    customModule.addSerializer(NpmJsVersions.class, new NpmJsVersionsJsonSerializer());
7✔
124
    customModule.addDeserializer(NpmJsVersions.class, new NpmJsVersionsJsonDeserializer());
7✔
125
    customModule.addSerializer(NpmJsDist.class, new NpmJsDistJsonSerializer());
7✔
126
    customModule.addDeserializer(NpmJsDist.class, new NpmJsDistJsonDeserializer());
7✔
127
    mapper = mapper.registerModule(customModule);
4✔
128
    mapper.setDefaultPrettyPrinter(new JsonPrettyPrinter());
6✔
129
    return mapper;
2✔
130
  }
131

132
  /**
133
   * @param p the {@link JsonParser}.
134
   * @throws IOException in case of an error.
135
   */
136
  public static void skipCurrentField(JsonParser p, String property) throws IOException {
137

138
    if (property != null) {
2✔
139
      // currently cannot log here due to https://github.com/devonfw/IDEasy/issues/404
140
      //LOG.debug("Ignoring unexpected property {}", property);
141
    }
142
    JsonToken jsonToken = p.getCurrentToken();
3✔
143
    if ((jsonToken == JsonToken.START_OBJECT) || (jsonToken == JsonToken.START_ARRAY)) {
6!
144
      p.skipChildren();
3✔
145
    }
146
  }
1✔
147

148
}
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