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

devonfw / IDEasy / 22860792264

09 Mar 2026 03:25PM UTC coverage: 70.268% (-0.2%) from 70.481%
22860792264

push

github

web-flow
#404: #1713: advanced logging (#1714)

Co-authored-by: Kian <adasd>
Co-authored-by: KianRolf <kian.loroff@capgemini.com>
Co-authored-by: jan-vcapgemini <59438728+jan-vcapgemini@users.noreply.github.com>
Co-authored-by: jan-vcapgemini <jan-vincent.hoelzle@capgemini.com>

4068 of 6386 branches covered (63.7%)

Branch coverage included in aggregate %.

10604 of 14494 relevant lines covered (73.16%)

3.08 hits per line

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

39.29
cli/src/main/java/com/devonfw/tools/ide/merge/PropertiesMerger.java
1
package com.devonfw.tools.ide.merge;
2

3
import java.nio.file.Files;
4
import java.nio.file.Path;
5
import java.util.Properties;
6
import java.util.Set;
7

8
import org.slf4j.Logger;
9
import org.slf4j.LoggerFactory;
10

11
import com.devonfw.tools.ide.context.IdeContext;
12
import com.devonfw.tools.ide.environment.EnvironmentVariables;
13
import com.devonfw.tools.ide.environment.SortedProperties;
14
import com.devonfw.tools.ide.io.FileAccess;
15

16
/**
17
 * Implementation of {@link FileMerger} for {@link Properties} files.
18
 */
19
public class PropertiesMerger extends FileMerger {
20

21
  private static final Logger LOG = LoggerFactory.getLogger(PropertiesMerger.class);
4✔
22

23
  /**
24
   * The constructor.
25
   *
26
   * @param context the {@link #context}.
27
   */
28
  public PropertiesMerger(IdeContext context) {
29

30
    super(context);
3✔
31
  }
1✔
32

33
  @Override
34
  protected void doMerge(Path setup, Path update, EnvironmentVariables resolver, Path workspace) {
35

36
    FileAccess fileAccess = this.context.getFileAccess();
4✔
37
    SortedProperties properties = new SortedProperties();
4✔
38
    boolean updateFileExists = Files.exists(update);
5✔
39
    Path template = setup;
2✔
40
    if (Files.exists(workspace)) {
5✔
41
      if (!updateFileExists) {
2!
42
        LOG.trace("Nothing to do as update file does not exist: {}", update);
×
43
        return; // nothing to do ...
×
44
      }
45
      fileAccess.readProperties(workspace, properties);
5✔
46
    } else if (Files.exists(setup)) {
5✔
47
      fileAccess.readProperties(setup, properties);
4✔
48
    }
49
    if (updateFileExists) {
2!
50
      fileAccess.readProperties(update, properties);
4✔
51
      template = update;
2✔
52
    }
53
    resolve(properties, resolver, template.toString());
6✔
54
    fileAccess.writeProperties(properties, workspace, true);
5✔
55
    LOG.trace("Saved merged properties to: {}", workspace);
4✔
56
  }
1✔
57

58
  private void resolve(Properties properties, EnvironmentVariables variables, Object src) {
59

60
    Set<Object> keys = properties.keySet();
3✔
61
    for (Object key : keys) {
9✔
62
      String value = properties.getProperty(key.toString());
5✔
63
      properties.setProperty(key.toString(), variables.resolve(value, src, this.legacySupport));
11✔
64
    }
1✔
65
  }
1✔
66

67
  @Override
68
  public void inverseMerge(Path workspace, EnvironmentVariables variables, boolean addNewProperties, Path update) {
69

70
    if (!Files.exists(workspace)) {
×
71
      LOG.trace("Workspace file does not exist: {}", workspace);
×
72
      return;
×
73
    }
74
    if (!Files.exists(update)) {
×
75
      LOG.trace("Update file does not exist: {}", update);
×
76
      return;
×
77
    }
78
    Object src = workspace.getFileName();
×
79
    FileAccess fileAccess = this.context.getFileAccess();
×
80
    Properties updateProperties = fileAccess.readProperties(update);
×
81
    Properties workspaceProperties = fileAccess.readProperties(workspace);
×
82
    SortedProperties mergedProperties = new SortedProperties();
×
83
    mergedProperties.putAll(updateProperties);
×
84
    boolean updated = false;
×
85
    for (Object key : workspaceProperties.keySet()) {
×
86
      Object workspaceValue = workspaceProperties.get(key);
×
87
      Object updateValue = updateProperties.get(key);
×
88
      if ((updateValue != null) || addNewProperties) {
×
89
        String updateValueResolved = null;
×
90
        if (updateValue != null) {
×
91
          updateValueResolved = variables.resolve(updateValue.toString(), src, this.legacySupport);
×
92
        }
93
        if (!workspaceValue.equals(updateValueResolved)) {
×
94
          String workspaceValueInverseResolved = variables.inverseResolve(workspaceValue.toString(), src);
×
95
          mergedProperties.put(key, workspaceValueInverseResolved);
×
96
          updated = true;
×
97
        }
98
      }
99
    }
×
100
    if (updated) {
×
101
      fileAccess.writeProperties(mergedProperties, update);
×
102
      LOG.debug("Saved changes from: {} to: {}", workspace.getFileName(), update);
×
103
    } else {
104
      LOG.trace("No changes for: {}", update);
×
105
    }
106
  }
×
107

108
  @Override
109
  protected boolean doUpgrade(Path workspaceFile) throws Exception {
110

111
    return doUpgradeTextContent(workspaceFile);
×
112
  }
113
}
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