loading table of contents...
4.3.1.2.2. Configuring the Default Settings Service via SettingsFinders

The Blueprint Base Modules not only defines the interface of how to evaluate settings but also provides an implementation and a Spring bean.

<beans>
  <bean id="settingsService"
        class="c.c.b.base.settings.impl.SettingsServiceImpl">
    <property name="settingsFinders" ref="settingsFinders"/>
  </bean>

  <util:map id="settingsFinders">
  </util:map>
</beans>

The plain SettingsService has no lookup logic for settings at all, but it must be configured with SettingsFinders. A SettingsFinder implements a strategy how to determine settings of a particular type of bean. CoreMedia DXP 8 provides some preconfigured SettingsFinders for popular beans like content objects. It can be modified and enhanced with custom SettingsFinders for arbitrary bean types. As you can see, the default settings service only needs one property, which is a map named settingsFinders. The keys of that map must be fully qualified Java class names and its values are references to concrete SettingsFinder beans.

          
<util:map id="settingsFinders">
  <entry key="com.coremedia.cap.content.Content"
         value-ref="cmlinkableSettingsFinder"/>
  <entry key="com.coremedia.cap.multisite.Site"
         value-ref="siteSettingsFinder"/>
</util:map>

<bean id="cmlinkableSettingsFinder"
      class="c.c.b.base.settings.CMLinkableSettingsFinder">
  <property name="cache" ref="cache"/>
  <property name="hierarchy" ref="navigationTreeRelation"/>
</bean>

<bean id="siteSettingsFinder"
      class="c.c.b.base.settings.SiteSettingsFinder"/>
        

Example 4.22. The Spring Bean Definition for the Map of Settings Finder


The example above shows a map with two settings finders. One is supposed to be used for target beans of type com.coremedia.cap.content.Content and the other for targets of type com.coremedia.cap.multisite.Site.

In order to determine the appropriate settings finder for a given target bean the settings service calculates the most specific classes among the keys of the settings finders map which match the target bean. For the above example this is trivial, since Content and Site are disjointed. The lookup gets more interesting with content beans which usually constitute a deeply nested class structure. Assume, you configured settings finders for CMLinkable and CMTaxonomy. If you invoke the settings service with a CMTaxonomyImpl bean, only the settings finder for CMTaxonomy is effective. There is no automatic fallback to the CMLinkable finder. If you need such a fallback, let your special settings finder extend the intended fallback finder and call its setting method explicitly.

The easiest way to provide a custom way of fetching settings for certain documents or even for objects that do not represent a CoreMedia document, is, to add a corresponding settings finder, that does the trick. Therefore, you should use CoreMedia's Spring bean customizer, that you can use anywhere within your Spring application context as follows:

          
<beans>
  <customize:append id="mySettingsFinders" bean="settingsFinders">
    <map>
      <entry key="example.org.MyClass" value-ref="mySettingsFinder"/>
    </map>
  </customize:append>
</beans>
        

Example 4.23. Adding Custom Settings Finder


Via Spring you can configure one settings finder per class. This is a tradeoff between flexibility and simplicity which is sufficient for most use cases. However, on the Java level the SettingsServiceImpl provides the method addSettingsFinder(Class<?>, SettingsFinder) which allows you to add multiple settings finders for a class.