Pankraz76 commented on code in PR #2404: URL: https://github.com/apache/maven/pull/2404#discussion_r2113619155
########## src/mdo/java/WrapperProperties.java: ########## @@ -377,4 +369,131 @@ private Object writeReplace() throws java.io.ObjectStreamException { props.putAll(getter.get()); return props; } + + private class OrderedProperties extends Properties { + private final List<Object> keyOrder = new CopyOnWriteArrayList<>(); + + @Override + public synchronized void putAll(Map<?, ?> t) { + t.forEach(this::put); + } + + @Override + public Set<Object> keySet() { + return new KeySet(); + } + + @Override + public Set<Map.Entry<Object, Object>> entrySet() { + return new EntrySet(); + } + + @Override + public synchronized Object put(Object key, Object value) { + if (!keyOrder.contains(key)) { + keyOrder.add(key); + } + return super.put(key, value); + } + + @Override + public synchronized Object setProperty(String key, String value) { + if (!keyOrder.contains(key)) { + keyOrder.add(key); + } + return super.setProperty(key, value); + } + + @Override + public synchronized Object remove(Object key) { + keyOrder.remove(key); + return super.remove(key); + } + + @Override + public synchronized void forEach(BiConsumer<? super Object, ? super Object> action) { + entrySet().forEach(e -> action.accept(e.getKey(), e.getValue())); + } + + private class EntrySet extends AbstractSet<Map.Entry<Object, Object>> { Review Comment: this can stay internal in new dedicated `OrderedProperties` file. ########## src/mdo/java/WrapperProperties.java: ########## @@ -377,4 +369,131 @@ private Object writeReplace() throws java.io.ObjectStreamException { props.putAll(getter.get()); return props; } + + private class OrderedProperties extends Properties { + private final List<Object> keyOrder = new CopyOnWriteArrayList<>(); + + @Override + public synchronized void putAll(Map<?, ?> t) { + t.forEach(this::put); + } + + @Override + public Set<Object> keySet() { + return new KeySet(); + } + + @Override + public Set<Map.Entry<Object, Object>> entrySet() { + return new EntrySet(); + } + + @Override + public synchronized Object put(Object key, Object value) { + if (!keyOrder.contains(key)) { + keyOrder.add(key); + } + return super.put(key, value); + } + + @Override + public synchronized Object setProperty(String key, String value) { + if (!keyOrder.contains(key)) { + keyOrder.add(key); + } + return super.setProperty(key, value); + } + + @Override + public synchronized Object remove(Object key) { + keyOrder.remove(key); + return super.remove(key); + } + + @Override + public synchronized void forEach(BiConsumer<? super Object, ? super Object> action) { + entrySet().forEach(e -> action.accept(e.getKey(), e.getValue())); + } + + private class EntrySet extends AbstractSet<Map.Entry<Object, Object>> { + @Override + public Iterator<Map.Entry<Object, Object>> iterator() { + return new Iterator<Map.Entry<Object, Object>>() { + Iterator<Object> keyIterator = keyOrder.iterator(); + @Override + public boolean hasNext() { + return keyIterator.hasNext(); + } + + @Override + public Map.Entry<Object, Object> next() { + Object key = keyIterator.next(); + return new Map.Entry<>() { + @Override + public Object getKey() { + return key; + } + + @Override + public Object getValue() { + return get(key); + } + + @Override + public Object setValue(Object value) { + return WrapperProperties.this.put(key, value); + } + }; + } + }; + } + + @Override + public int size() { + return keyOrder.size(); + } + } + + private class KeySet extends AbstractSet<Object> { Review Comment: this can stay internal in new dedicated `OrderedProperties` file. ```suggestion private static class KeySet extends AbstractSet<Object> { ``` will work too, right? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@maven.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org