<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>How to retrieve Factory Configuration?</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121768598" />
  <subtitle>How to retrieve Factory Configuration?</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=121768598</id>
  <updated>2026-04-04T03:38:23Z</updated>
  <dc:date>2026-04-04T03:38:23Z</dc:date>
  <entry>
    <title>RE: How to retrieve Factory Configuration?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122406360" />
    <author>
      <name>Vishal Shah</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122406360</id>
    <updated>2024-02-24T19:24:54Z</updated>
    <published>2024-02-19T07:12:59Z</published>
    <summary type="html">&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Using Liferay 7.3&lt;/p&gt;
&lt;p&gt;I employ a straightforward method for creating a factory of
  configurations, facilitating the addition of multiple entries for this
  configuration. Furthermore, it's possible to extend additional
  interfaces to enable the introduction of various types of
  configuration setups for different kinds of fields&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;@ExtendedObjectClassDefinition(category = &amp;quot;Sample
    Configuration Category&amp;quot;, factoryInstanceLabelAttribute =
    &lt;strong&gt;&amp;quot;sampleReminders&amp;quot;&lt;/strong&gt;)&lt;br&gt; @Meta.OCD(factory
    = true, id =
    &amp;quot;com.sample.configuration.SampleConfiguration&amp;quot;, name =
    &amp;quot;Sample Configuration&amp;quot;)&lt;br&gt; public interface
    SampleConfiguration {&lt;/p&gt;
  &lt;p&gt;    @Meta.AD(deflt = &amp;quot;0&amp;quot;, name = &amp;quot;Start Day&amp;quot;,
    required = false)&lt;br&gt;     public int startDay();&lt;/p&gt;
  &lt;p&gt;    @Meta.AD(deflt = &amp;quot;14&amp;quot;, name = &amp;quot;End Day&amp;quot;,
    required = false)&lt;br&gt;     public int endDay();&lt;/p&gt;
  &lt;p&gt;    @Meta.AD(deflt = &amp;quot;1&amp;quot;, name = &amp;quot;Job
    Interval&amp;quot;, required = false)&lt;br&gt;     public int jobInterval();&lt;/p&gt;
  &lt;p&gt;    @Meta.AD(deflt = &amp;quot;1&amp;quot;, name = &amp;quot;Sample
    Reminder&amp;quot;, required = false)&lt;br&gt;     public String
    &lt;strong&gt;sampleReminders&lt;/strong&gt;(); // TODO - same name to be
    provide on factoryInstanceLabelAttribute, for showing detail in
    list&lt;br&gt; }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am using this configuration in &lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;@Component(configurationPid =
    &amp;quot;com.sample.configuration.SampleConfiguration&amp;quot;, immediate
    = true, service = SampleMessageListner.class)&lt;br&gt; public class
    SampleMessageListner extends BaseMessageListener {&lt;/p&gt;
  &lt;p&gt;    private static final Log _log = LogFactoryUtil.getLog(SampleMessageListner.class);&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br&gt;     protected void doReceive(Message message)
    throws Exception {&lt;br&gt;         _log.info(&amp;quot;===== SAMPLE REMINDER
    START =====&amp;quot;);&lt;br&gt;         //TODO - Write Code&lt;/p&gt;
  &lt;p&gt;        _log.info(&amp;quot;===== SAMPLE REMINDER END =====&amp;quot;);&lt;br&gt;
        }&lt;/p&gt;
  &lt;p&gt;    @Activate&lt;br&gt;     @Modified&lt;br&gt;     protected void
    activate(Map&amp;lt;String, Object&amp;gt; properties) {&lt;/p&gt;
  &lt;p&gt;        SampleConfiguration = ConfigurableUtil&lt;br&gt;               
     .createConfigurable(SampleConfiguration.class, properties);&lt;/p&gt;
  &lt;p&gt;        List&amp;lt;Sample&amp;gt; samples = new ArrayList&amp;lt;&amp;gt;();&lt;/p&gt;
  &lt;p&gt;      //TODO - Set List&amp;lt;Sample&amp;gt; over Global and Use any of
    method as per requirment&lt;br&gt;         samples&lt;br&gt;               
     .add(new Sample(sampleConfiguration.dealerStartDay(),&lt;br&gt;       
                     sampleConfiguration.dealerEndDay(),&lt;br&gt;           
                 sampleConfiguration.dealerJobInterval(),&lt;br&gt;           
                 sampleConfiguration.Samples()));&lt;/p&gt;
  &lt;p&gt;        _log.info(samples);&lt;/p&gt;
  &lt;p&gt;     &lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Deactivate&lt;br&gt;     protected void deactivate() {&lt;br&gt;       
     schedulerEngineHelper.unregister(this);&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Reference&lt;br&gt;     private SchedulerEngineHelper schedulerEngineHelper;&lt;/p&gt;
  &lt;p&gt;    @Reference&lt;br&gt;     private TriggerFactory triggerFactory;&lt;/p&gt;
  &lt;p&gt;
    &lt;br&gt;     @Reference(target =
    ModuleServiceLifecycle.PORTAL_INITIALIZED)&lt;br&gt;     private
    ModuleServiceLifecycle moduleServiceLifecycle;&lt;/p&gt;
  &lt;p&gt;    private volatile SampleConfiguration sampleConfiguration;&lt;/p&gt;
  &lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can create POJO to set values&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;public class Sample {&lt;/p&gt;
  &lt;p&gt;   private String pid;&lt;/p&gt;
  &lt;p&gt;    private int startDay;&lt;/p&gt;
  &lt;p&gt;    public int endDay;&lt;/p&gt;
  &lt;p&gt;    public int jobInterval;&lt;/p&gt;
  &lt;p&gt;    public String reminder;&lt;/p&gt;
  &lt;p&gt;    public Sample(String pid, int startDay, int endDay, int
    jobInterval,&lt;br&gt;             String dealerAgreementReminder) {&lt;br&gt;  
          this.pid=pid; this.startDay = startDay;&lt;br&gt;       
     this.endDay = endDay;&lt;br&gt;         this.jobInterval =
    jobInterval;&lt;br&gt;         this.reminder = reminder;&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    //TODO -  Create Getter / Setter and ToString and eqauls /
    hashcode as per your requirment&lt;/p&gt;
  &lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Add ConfigurationBeanDeclaration&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;@Component(service = ConfigurationBeanDeclaration.class)&lt;br&gt; public
    class SampleConfigurationBeanDeclaration implements
    ConfigurationBeanDeclaration {&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br&gt;     public Class&amp;lt;?&amp;gt;
    getConfigurationBeanClass() {&lt;br&gt;         return
    SampleConfiguration.class;&lt;br&gt;     }&lt;br&gt; }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Create ManagedServiceFactory implementation logic for storing and
  processing configuration.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;@Component(property =
    &amp;quot;service.pid=com.sample.configuration.SampleConfiguration&amp;quot;,
    service = ManagedServiceFactory.class)&lt;br&gt; public class
    SampleConfigurationManagedServiceFactory implements
    ManagedServiceFactory {&lt;/p&gt;
  &lt;p&gt;    private static final Log _log = LogFactoryUtil&lt;br&gt;             .getLog(SampleConfigurationManagedServiceFactory.class);&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br&gt;     public String getName() {&lt;br&gt;         return
    StringPool.BLANK;&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br&gt;     public void updated(String pid,
    Dictionary&amp;lt;String, ?&amp;gt; properties) throws
    ConfigurationException {&lt;br&gt;         _log.info(&amp;quot;updated :&amp;quot;
    + pid);&lt;br&gt;         Dictionary&amp;lt;String, ?&amp;gt; oldProperties =
    SampleUtil.updateConfigurationPidsProperties(pid,&lt;br&gt;               
     properties);&lt;br&gt;         _rebuild();&lt;br&gt;         if (oldProperties
    != null) {&lt;br&gt;             _rebuild();&lt;br&gt;         }&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    @Override&lt;br&gt;     public void deleted(String pid) {&lt;br&gt;       
     _log.info(&amp;quot;deleted : &amp;quot; + pid);&lt;br&gt;       
     SampleUtil.removeConfigurationPidsProperties(pid);&lt;br&gt;         _rebuild();&lt;/p&gt;
  &lt;p&gt;    }&lt;/p&gt;
  &lt;p&gt;    private void _rebuild() {&lt;br&gt;       
     _mergeSampleConfiguration();&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    private void _mergeSampleConfiguration() {&lt;br&gt;       
     SampleUtil.getConfigurationPidsProperties().forEach((pid,
    properties) -&amp;gt; {&lt;br&gt;             SampleConfiguration
    sampleConfiguration = ConfigurableUtil&lt;br&gt;                   
     .createConfigurable(SampleConfiguration.class, properties);&lt;/p&gt;
  &lt;p&gt;            _log.info(sampleConfiguration.toString());&lt;/p&gt;
  &lt;p&gt;            _populateSamples(pid, sampleConfiguration);&lt;br&gt;       
     });&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    private void _populateSamples(String pid,&lt;br&gt;           
     SampleConfiguration sampleConfiguration) {&lt;/p&gt;
  &lt;p&gt;        Sample Sample = createSample(pid,&lt;br&gt;               
     sampleConfiguration);&lt;br&gt;         SampleUtil.addSample(Sample);&lt;br&gt;
        }&lt;/p&gt;
  &lt;p&gt;    private Sample createSample(String pid,&lt;br&gt;           
     SampleConfiguration sampleConfiguration) {&lt;br&gt;         return new
    Sample(pid, sampleConfiguration.startDay(),&lt;br&gt;               
     sampleConfiguration.endDay(),&lt;br&gt;               
     sampleConfiguration.jobInterval(),&lt;br&gt;               
     sampleConfiguration.sampleReminders());&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Create Util class for managing properties using pid and with
  processing of Sample class list.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;public class SampleUtil {&lt;/p&gt;
  &lt;p&gt;    private static final Map&amp;lt;String, Dictionary&amp;lt;String,
    ?&amp;gt;&amp;gt; _configurationPidsProperties = Collections&lt;br&gt;           
     .synchronizedMap(new LinkedHashMap&amp;lt;&amp;gt;());&lt;/p&gt;
  &lt;p&gt;    public static Map&amp;lt;String, Dictionary&amp;lt;String, ?&amp;gt;&amp;gt;
    getConfigurationPidsProperties() {&lt;/p&gt;
  &lt;p&gt;        return _configurationPidsProperties;&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    public static Collection&amp;lt;Dictionary&amp;lt;String, ?&amp;gt;&amp;gt;
    getValuesConfigurationPidsProperties() {&lt;/p&gt;
  &lt;p&gt;        return _configurationPidsProperties.values();&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    public static Dictionary&amp;lt;String, ?&amp;gt;
    removeConfigurationPidsProperties(String pid) {&lt;/p&gt;
  &lt;p&gt;        return _configurationPidsProperties.remove(pid);&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    public static Dictionary&amp;lt;String, ?&amp;gt;
    updateConfigurationPidsProperties(String pid,&lt;br&gt;           
     Dictionary&amp;lt;String, ?&amp;gt; properties) {&lt;/p&gt;
  &lt;p&gt;        return _configurationPidsProperties.put(pid,
    properties);&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    private static final Map&amp;lt;String, Sample&amp;gt; _samples =
    Collections&lt;br&gt;             .synchronizedMap(new LinkedHashMap&amp;lt;&amp;gt;());&lt;/p&gt;
  &lt;p&gt;    public static void addSample(Sample value) {&lt;/p&gt;
  &lt;p&gt;        _samples.put(value.getPid(), value);&lt;/p&gt;
  &lt;p&gt;    }&lt;/p&gt;
  &lt;p&gt;    public static void updateSamples(List&amp;lt;Sample&amp;gt; values)
    {&lt;br&gt;         values.stream().forEach(value -&amp;gt;
    addSample(value));&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    public static void removeSamples() {&lt;br&gt;       
     _samples.clear();&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    public static void removeSamples(Sample value) {&lt;br&gt;       
     _samples.remove(value.getPid());&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;    public static Collection&amp;lt;Sample&amp;gt; getSamples() {&lt;br&gt;   
         return _samples.values();&lt;br&gt;     }&lt;/p&gt;
  &lt;p&gt;}&lt;br&gt;  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can directly use SampleUtil method in any of class for fetching
  all configuration list using factory process. &lt;/p&gt;
&lt;p&gt;Hope you can implement based on this code.&lt;/p&gt;
&lt;p&gt;Support Link - &lt;a href="https://help.liferay.com/hc/en-us/articles/360028818632-Factory-Configurations"&gt;https://help.liferay.com/hc/en-us/articles/360028818632-Factory-Configurations&lt;/a&gt;&lt;/p&gt;</summary>
    <dc:creator>Vishal Shah</dc:creator>
    <dc:date>2024-02-19T07:12:59Z</dc:date>
  </entry>
  <entry>
    <title>How to retrieve Factory Configuration?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121768597" />
    <author>
      <name>David Wright</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=121768597</id>
    <updated>2023-05-05T15:44:47Z</updated>
    <published>2023-05-05T09:51:19Z</published>
    <summary type="html">&lt;p&gt;I would like to retrieve the configuration of an OpenID Provider
  inside a 6.2 style hook (I am running DXP 7.0.101).&lt;/p&gt;
&lt;p&gt;For simple configuration, I can use ConfigurationProviderUtil, but I
  cannot find any example for Factory Configuration.&lt;br&gt;  &lt;/p&gt;</summary>
    <dc:creator>David Wright</dc:creator>
    <dc:date>2023-05-05T09:51:19Z</dc:date>
  </entry>
</feed>
