From 37adefa6c6b70fc8b3c3b6bd8485e2f433866d62 Mon Sep 17 00:00:00 2001 From: Andrei Tuicu Date: Fri, 22 Jun 2018 12:13:05 +0300 Subject: [PATCH 1/2] SLING-7752 - Deserializing and serializing a feature model file suffles the configurations --- .../apache/sling/feature/Configuration.java | 5 +- .../sling/feature/impl/OrderedDictionary.java | 137 ++++++++++++++++++ 2 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java diff --git a/src/main/java/org/apache/sling/feature/Configuration.java b/src/main/java/org/apache/sling/feature/Configuration.java index 721badf..85b65df 100644 --- a/src/main/java/org/apache/sling/feature/Configuration.java +++ b/src/main/java/org/apache/sling/feature/Configuration.java @@ -16,8 +16,9 @@ */ package org.apache.sling.feature; +import org.apache.sling.feature.impl.OrderedDictionary; + import java.util.Dictionary; -import java.util.Hashtable; /** @@ -40,7 +41,7 @@ public class Configuration private final String factoryPid; /** The properties. */ - private final Dictionary properties = new Hashtable<>(); + private final Dictionary properties = new OrderedDictionary<>(); /** * Create a new configuration diff --git a/src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java b/src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java new file mode 100644 index 0000000..0a4b777 --- /dev/null +++ b/src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.sling.feature.impl; + +import java.util.*; + +/** + * A dictionary implementation with predictable iteration order. + * + * Actually this class is a simple adapter from the Dictionary interface + * to a synchronized LinkedHashMap + * + * @param + * @param + */ +public class OrderedDictionary extends Dictionary implements Map { + private static class EnumarationImpl implements Enumeration { + private final Iterator iterator; + + public EnumarationImpl(Iterator iterator) { + this.iterator = iterator; + } + + @Override + public boolean hasMoreElements() { + return iterator.hasNext(); + } + + @Override + public E nextElement() { + return iterator.next(); + } + } + + private Map map = Collections.synchronizedMap(new LinkedHashMap()); + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return map.containsValue(value); + } + + @Override + public Enumeration keys() { + return new EnumarationImpl<>(map.keySet().iterator()); + } + + @Override + public Enumeration elements() { + return new EnumarationImpl<>(map.values().iterator()); + } + + @Override + public V get(Object key) { + return (V) map.get(key); + } + + @Override + public V put(K key, V value) { + // Make sure the value is not null + if (value == null) { + throw new NullPointerException(); + } + + return (V) map.put(key, value); + } + + @Override + public V remove(Object key) { + return (V) map.remove(key); + } + + @Override + public void putAll(Map m) { + map.putAll(m); + } + + @Override + public void clear() { + map.clear(); + } + + @Override + public Set keySet() { + return map.entrySet(); + } + + @Override + public Collection values() { + return map.values(); + } + + @Override + public Set> entrySet() { + return map.entrySet(); + } + + @Override + public boolean equals(Object o) { + return map.equals(o); + } + + @Override + public int hashCode() { + return map.hashCode(); + } +} From 5155a9dd71d90dba07065839f2bae076dd86c06c Mon Sep 17 00:00:00 2001 From: Andrei Tuicu Date: Fri, 22 Jun 2018 17:28:07 +0300 Subject: [PATCH 2/2] SLING-7752 - Deserializing and serializing a feature model file suffles the configurations --- .../apache/sling/feature/Configuration.java | 9 +- .../org/apache/sling/feature/Feature.java | 7 +- .../sling/feature/builder/BuilderUtil.java | 7 +- .../sling/feature/impl/OrderedDictionary.java | 137 ------------------ .../apache/sling/feature/package-info.java | 2 +- 5 files changed, 13 insertions(+), 149 deletions(-) delete mode 100644 src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java diff --git a/src/main/java/org/apache/sling/feature/Configuration.java b/src/main/java/org/apache/sling/feature/Configuration.java index 85b65df..c267c09 100644 --- a/src/main/java/org/apache/sling/feature/Configuration.java +++ b/src/main/java/org/apache/sling/feature/Configuration.java @@ -16,9 +16,8 @@ */ package org.apache.sling.feature; -import org.apache.sling.feature.impl.OrderedDictionary; - -import java.util.Dictionary; +import java.util.LinkedHashMap; +import java.util.Map; /** @@ -41,7 +40,7 @@ public class Configuration private final String factoryPid; /** The properties. */ - private final Dictionary properties = new OrderedDictionary<>(); + private final Map properties = new LinkedHashMap<>(); /** * Create a new configuration @@ -136,7 +135,7 @@ public boolean isFactoryConfiguration() { * Get all properties of the configuration. * @return The properties */ - public Dictionary getProperties() { + public Map getProperties() { return this.properties; } diff --git a/src/main/java/org/apache/sling/feature/Feature.java b/src/main/java/org/apache/sling/feature/Feature.java index 98f1e0b..c701beb 100644 --- a/src/main/java/org/apache/sling/feature/Feature.java +++ b/src/main/java/org/apache/sling/feature/Feature.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Enumeration; +import java.util.Iterator; import java.util.List; /** @@ -301,9 +302,9 @@ public Feature copy(final ArtifactId id) { // configurations for(final Configuration cfg : this.getConfigurations()) { final Configuration c = cfg.isFactoryConfiguration() ? new Configuration(cfg.getFactoryPid(), cfg.getName()) : new Configuration(cfg.getPid()); - final Enumeration keyEnum = cfg.getProperties().keys(); - while ( keyEnum.hasMoreElements() ) { - final String key = keyEnum.nextElement(); + final Iterator keyEnum = cfg.getProperties().keySet().iterator(); + while ( keyEnum.hasNext() ) { + final String key = keyEnum.next(); c.getProperties().put(key, cfg.getProperties().get(key)); } result.getConfigurations().add(c); diff --git a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java index 0c1805e..9415e39 100644 --- a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java +++ b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java @@ -19,6 +19,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.util.Enumeration; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.stream.Stream; @@ -84,9 +85,9 @@ static void mergeConfigurations(final Configurations target, final Configuration if ( current.compareTo(cfg) == 0 ) { found = true; // merge / override properties - final Enumeration i = cfg.getProperties().keys(); - while ( i.hasMoreElements() ) { - final String key = i.nextElement(); + final Iterator i = cfg.getProperties().keySet().iterator(); + while ( i.hasNext() ) { + final String key = i.next(); current.getProperties().put(key, cfg.getProperties().get(key)); } break; diff --git a/src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java b/src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java deleted file mode 100644 index 0a4b777..0000000 --- a/src/main/java/org/apache/sling/feature/impl/OrderedDictionary.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.sling.feature.impl; - -import java.util.*; - -/** - * A dictionary implementation with predictable iteration order. - * - * Actually this class is a simple adapter from the Dictionary interface - * to a synchronized LinkedHashMap - * - * @param - * @param - */ -public class OrderedDictionary extends Dictionary implements Map { - private static class EnumarationImpl implements Enumeration { - private final Iterator iterator; - - public EnumarationImpl(Iterator iterator) { - this.iterator = iterator; - } - - @Override - public boolean hasMoreElements() { - return iterator.hasNext(); - } - - @Override - public E nextElement() { - return iterator.next(); - } - } - - private Map map = Collections.synchronizedMap(new LinkedHashMap()); - - @Override - public int size() { - return map.size(); - } - - @Override - public boolean isEmpty() { - return map.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return map.containsValue(value); - } - - @Override - public Enumeration keys() { - return new EnumarationImpl<>(map.keySet().iterator()); - } - - @Override - public Enumeration elements() { - return new EnumarationImpl<>(map.values().iterator()); - } - - @Override - public V get(Object key) { - return (V) map.get(key); - } - - @Override - public V put(K key, V value) { - // Make sure the value is not null - if (value == null) { - throw new NullPointerException(); - } - - return (V) map.put(key, value); - } - - @Override - public V remove(Object key) { - return (V) map.remove(key); - } - - @Override - public void putAll(Map m) { - map.putAll(m); - } - - @Override - public void clear() { - map.clear(); - } - - @Override - public Set keySet() { - return map.entrySet(); - } - - @Override - public Collection values() { - return map.values(); - } - - @Override - public Set> entrySet() { - return map.entrySet(); - } - - @Override - public boolean equals(Object o) { - return map.equals(o); - } - - @Override - public int hashCode() { - return map.hashCode(); - } -} diff --git a/src/main/java/org/apache/sling/feature/package-info.java b/src/main/java/org/apache/sling/feature/package-info.java index 3d70902..8201ca5 100644 --- a/src/main/java/org/apache/sling/feature/package-info.java +++ b/src/main/java/org/apache/sling/feature/package-info.java @@ -17,7 +17,7 @@ * under the License. */ -@org.osgi.annotation.versioning.Version("0.1.0") +@org.osgi.annotation.versioning.Version("0.2.0") package org.apache.sling.feature;