2929import org .ehcache .config .builders .ResourcePoolsBuilder ;
3030import org .ehcache .config .units .EntryUnit ;
3131import org .ehcache .config .units .MemoryUnit ;
32- import org .ehcache .impl .config .SizedResourcePoolImpl ;
3332import org .ehcache .xml .exceptions .XmlConfigurationException ;
3433import org .ehcache .xml .model .CacheTemplate ;
3534import org .ehcache .xml .model .CacheType ;
5150import javax .xml .validation .Schema ;
5251import java .math .BigInteger ;
5352import java .util .ArrayList ;
54- import java .util .HashMap ;
53+ import java .util .Comparator ;
5554import java .util .List ;
56- import java .util .Map ;
5755import java .util .Set ;
5856
57+ import static org .ehcache .core .util .ClassLoading .classDistance ;
5958import static org .ehcache .xml .XmlConfiguration .CORE_SCHEMA_URL ;
6059import static org .ehcache .xml .XmlUtil .newSchema ;
6160
@@ -87,37 +86,34 @@ public ResourceConfigurationParser(Set<CacheResourceConfigurationParser> extensi
8786 public ResourcePools parse (CacheTemplate cacheTemplate , ResourcePoolsBuilder resourcePoolsBuilder , ClassLoader classLoader ) {
8887
8988 if (cacheTemplate .getHeap () != null ) {
90- resourcePoolsBuilder = resourcePoolsBuilder .with (parseHeapConfiguration (cacheTemplate .getHeap ()));
89+ ResourceTypeWithPropSubst heapResource = cacheTemplate .getHeap ().getValue ();
90+ resourcePoolsBuilder = resourcePoolsBuilder .heap (heapResource .getValue ().longValue (), parseUnit (heapResource ));
9191 } else if (!cacheTemplate .getResources ().isEmpty ()) {
9292 for (Element element : cacheTemplate .getResources ()) {
93- ResourcePool resourcePool ;
94- if (!CORE_SCHEMA_NS .equals (element .getNamespaceURI ())) {
95- resourcePool = parseResourceExtension (element , classLoader );
96- } else {
93+ if (CORE_SCHEMA_NS .equals (element .getNamespaceURI ())) {
9794 try {
9895 Unmarshaller unmarshaller = jaxbContext .createUnmarshaller ();
9996 unmarshaller .setEventHandler (new DefaultValidationEventHandler ());
10097 Object resource = unmarshaller .unmarshal (element );
10198 if (resource instanceof Heap ) {
102- resourcePool = parseHeapConfiguration ((Heap ) resource );
99+ ResourceTypeWithPropSubst heap = ((Heap ) resource ).getValue ();
100+ resourcePoolsBuilder = resourcePoolsBuilder .heap (heap .getValue ().longValue (), parseUnit (heap ));
103101 } else if (resource instanceof Offheap ) {
104- MemoryTypeWithPropSubst offheapResource = ((Offheap ) resource ).getValue ();
105- resourcePool = new SizedResourcePoolImpl <>(org .ehcache .config .ResourceType .Core .OFFHEAP ,
106- offheapResource .getValue ().longValue (), parseMemory (offheapResource ), false );
102+ MemoryTypeWithPropSubst offheap = ((Offheap ) resource ).getValue ();
103+ resourcePoolsBuilder = resourcePoolsBuilder .offheap (offheap .getValue ().longValue (), parseMemory (offheap ));
107104 } else if (resource instanceof Disk ) {
108- PersistableMemoryTypeWithPropSubst diskResource = ((Disk ) resource ).getValue ();
109- resourcePool = new SizedResourcePoolImpl <>(org .ehcache .config .ResourceType .Core .DISK ,
110- diskResource .getValue ().longValue (), parseMemory (diskResource ), diskResource .isPersistent ());
105+ PersistableMemoryTypeWithPropSubst disk = ((Disk ) resource ).getValue ();
106+ resourcePoolsBuilder = resourcePoolsBuilder .disk (disk .getValue ().longValue (), parseMemory (disk ), disk .isPersistent ());
111107 } else {
112108 // Someone updated the core resources without updating *this* code ...
113109 throw new AssertionError ("Unrecognized resource: " + element + " / " + resource .getClass ().getName ());
114110 }
115111 } catch (JAXBException e ) {
116112 throw new IllegalArgumentException ("Can't find parser for resource: " + element , e );
117113 }
114+ } else {
115+ resourcePoolsBuilder = resourcePoolsBuilder .with (parseResourceExtension (element , classLoader ));
118116 }
119-
120- resourcePoolsBuilder = resourcePoolsBuilder .with (resourcePool );
121117 }
122118 } else {
123119 throw new XmlConfigurationException ("No resources defined for the cache: " + cacheTemplate .id ());
@@ -126,12 +122,6 @@ public ResourcePools parse(CacheTemplate cacheTemplate, ResourcePoolsBuilder res
126122 return resourcePoolsBuilder .build ();
127123 }
128124
129- private ResourcePool parseHeapConfiguration (Heap heap ) {
130- ResourceTypeWithPropSubst heapResource = heap .getValue ();
131- return new SizedResourcePoolImpl <>(org .ehcache .config .ResourceType .Core .HEAP ,
132- heapResource .getValue ().longValue (), parseUnit (heapResource ), false );
133- }
134-
135125 private static ResourceUnit parseUnit (ResourceTypeWithPropSubst resourceType ) {
136126 if (resourceType .getUnit ().equals (org .ehcache .xml .model .ResourceUnit .ENTRIES )) {
137127 return EntryUnit .ENTRIES ;
@@ -190,14 +180,11 @@ public CacheType unparse(Document target, ResourcePools resourcePools, CacheType
190180 throw new XmlConfigurationException (e );
191181 }
192182 } else {
193- Map <Class <? extends ResourcePool >, CacheResourceConfigurationParser > parsers = new HashMap <>();
194- extensionParsers .forEach (parser -> parser .getResourceTypes ().forEach (rt -> parsers .put (rt , parser )));
195- CacheResourceConfigurationParser parser = parsers .get (resourcePool .getClass ());
196- if (parser != null ) {
197- resources .add (parser .unparse (target , resourcePool ));
198- } else {
199- throw new AssertionError ("Parser not found for resource type: " + resourceType );
200- }
183+ CacheResourceConfigurationParser parser = extensionParsers .stream ().min (Comparator .comparing (p -> p .getResourceTypes ().stream ()
184+ .mapToDouble (rt -> classDistance (rt , resourcePool .getClass ())).min ().orElse (Double .POSITIVE_INFINITY )))
185+ .orElseThrow (() -> new AssertionError ("Parser not found for resource type: " + resourceType ));
186+
187+ resources .add (parser .unparse (target , resourcePool ));
201188 }
202189 });
203190 return cacheType .withResources (OBJECT_FACTORY .createResourcesType ().withResource (resources ));
0 commit comments