package com.airlock.iam.saml2.infrastructure.plugin.configuration;

import com.sun.identity.plugin.configuration.ConfigurationException;
import com.sun.identity.plugin.configuration.ConfigurationListener;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public abstract class InitializableConfiguration {
   private final String componentName;
   private final Set<ConfigurationListener> configListeners = new HashSet<>();
   private Map<String, Object> configMap = new HashMap<>();
   private boolean initialized;

   protected abstract void initializeConfiguration() throws ConfigurationException;

   public final synchronized void initialize() throws ConfigurationException {
      this.initializeConfiguration();
      this.initialized = true;
   }

   public void refreshConfig() throws ConfigurationException {
      this.configMap = new HashMap<>();
      this.initialize();
      this.configListeners.forEach(l -> l.configChanged(new ConfigurationUpdatedEvent(this.componentName)));
   }

   public String addListener(ConfigurationListener listener) {
      this.configListeners.add(listener);
      return String.valueOf(listener.hashCode());
   }

   @SuppressFBWarnings(justification = "generated code")
   public InitializableConfiguration(String componentName) {
      this.componentName = componentName;
   }

   @SuppressFBWarnings(justification = "generated code")
   public String getComponentName() {
      return this.componentName;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<ConfigurationListener> getConfigListeners() {
      return this.configListeners;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Map<String, Object> getConfigMap() {
      return this.configMap;
   }

   @SuppressFBWarnings(justification = "generated code")
   public boolean isInitialized() {
      return this.initialized;
   }
}
