Config.java

package org.flasby.christmas;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.flasby.christmas.monitor.PollingRunner;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Configuration
@ConfigurationProperties(prefix = "org.flasby.config") // this is the prefix within the properties file used to build the config
public class Config {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Login {
        private int lifetimeindays = 31;
        Login copy() {
            return new Login(this.lifetimeindays);
        }
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class App {
        private String name = "define me in application.properties";
        private String login = "define me in application.properties";
        App copy() {
            return new App(this.name, this.login);
        }
    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    public static class About {
        private String url = "define me in application.properties";
        private String wibble = "123 Wibble";
        @Override
        protected About clone() {
            return new About(this.url, this.wibble);
        }
        public void setUrl(String url) {
            this.url = url;
        }
        public void setWibble(String wibble) {
            this.wibble = wibble;
        }
        
    }

    @NoArgsConstructor
    public static class Run {
        private Integer rate = 30;  // Default to 30 second updates
        private Map<Integer, Class<? extends PollingRunner>> runners = new HashMap<>();
        private Map<Integer, String[]> params = new HashMap<>();
        
        public Run(Integer rate, Map<Integer, Class<? extends PollingRunner>> runners, Map<Integer, String[]> params) {
            this.rate = rate;
            setRunners(runners);
            setParams(params);
        }
        
        public Map<Integer, String[]> getParams() {
            return Collections.unmodifiableMap(params);
        }
        public Map<Integer, Class<? extends PollingRunner>> getRunners() {
            return Collections.unmodifiableMap(runners);
        }
        @Override
        protected Run clone() {
            return new Run(rate,runners,params);
        }

        public Integer getRate() {
            return rate;
        }

        public void setRate(Integer rate) {
            this.rate = rate;
        }

        public void setRunners(Map<Integer, Class<? extends PollingRunner>> runners) {
            this.runners = Collections.unmodifiableMap(runners);
        }

        public void setParams(Map<Integer, String[]> params) {
            this.params = Collections.unmodifiableMap(params);
        }
    }
 
    private Login login = new Login();
    private App app = new App();
    private About about = new About();
    
    public Login getLogin() { return login.copy(); } 
    public void setLogin(Login login) { this.login = login.copy(); } 
    public App getApp() { return app.copy(); }
    public void setApp(App app) { this.app = app.copy(); }
    public About getAbout() { return about.clone(); }
    public void setAbout(About about) { this.about = about.clone(); }
    
    // private Run run = new Run();
    // public Run getRun() { return run.clone(); }
    // public void setRun(Run run) { this.run = run.clone(); }
}