Fixes #5316 - Review <Map> element in Jetty XML.

Added class attribute and element to Map.

Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
Simone Bordet 2020-09-23 17:00:45 +02:00
parent 90e61eb07f
commit 7fe9fe5dea
5 changed files with 31 additions and 5 deletions

View File

@ -64,7 +64,6 @@ import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.thread.AutoLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
@ -1071,11 +1070,16 @@ public class XmlConfiguration
*/
private Object newMap(Object obj, XmlParser.Node node) throws Exception
{
AttrOrElementNode aoeNode = new AttrOrElementNode(node, "Id", "Entry");
AttrOrElementNode aoeNode = new AttrOrElementNode(node, "Id", "Entry", "Class");
String id = aoeNode.getString("Id");
List<XmlParser.Node> entries = aoeNode.getNodes("Entry");
String clazz = aoeNode.getString("Class");
if (clazz == null)
clazz = HashMap.class.getName();
@SuppressWarnings("unchecked")
Class<? extends Map<Object, Object>> oClass = Loader.loadClass(clazz);
Map<Object, Object> map = new HashMap<>();
Map<Object, Object> map = oClass.getConstructor().newInstance();
if (id != null)
_configuration.getIdMap().put(id, map);

View File

@ -259,8 +259,8 @@ This is equivalent to:
Map m = new HashMap();
m.put("keyName", new String("value1"));
-->
<!ELEMENT Map (Id?,Entry*) >
<!ATTLIST Map %ID_ATTR; >
<!ELEMENT Map (Id?,Class?,Entry*) >
<!ATTLIST Map %ID_ATTR; %CLASS_ATTR; >
<!ELEMENT Entry (Item,Item) >

View File

@ -33,6 +33,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@ -172,6 +173,11 @@ public class XmlConfigurationTest
Map<String, String> map = (Map<String, String>)configuration.getIdMap().get("map");
assertEquals(map.get("key0"), "value0");
assertEquals(map.get("key1"), "value1");
@SuppressWarnings("unchecked")
Map<String, String> concurrentMap = (Map<String, String>)configuration.getIdMap().get("concurrentMap");
assertThat(concurrentMap, instanceOf(ConcurrentMap.class));
assertEquals(concurrentMap.get("KEY"), "ITEM");
}
@ParameterizedTest

View File

@ -132,6 +132,13 @@
</Entry>
</Map>
<Map id="concurrentMap" class="java.util.concurrent.ConcurrentHashMap">
<Entry>
<Item>KEY</Item>
<Item>ITEM</Item>
</Entry>
</Map>
</Configure>

View File

@ -172,6 +172,15 @@
</Entry>
</Map>
<Map>
<Id>concurrentMap</Id>
<Class>java.util.concurrent.ConcurrentHashMap</Class>
<Entry>
<Item>KEY</Item>
<Item>ITEM</Item>
</Entry>
</Map>
</Configure>