package com.intrbiz.bergamot.compat.config.model; import java.io.File; import java.util.LinkedList; import java.util.List; import java.util.function.Function; import com.intrbiz.bergamot.compat.config.builder.metadata.ParameterName; import com.intrbiz.bergamot.compat.config.parser.model.ObjectParameter; public abstract class ConfigObject<P extends ConfigObject<P>> { private List<String> inherits = new LinkedList<String>(); private List<P> inheritedObjects = new LinkedList<P>(); private String name; private Boolean register = true; private File loadedFrom; public ConfigObject() { super(); } public File getLoadedFrom() { return loadedFrom; } public void setLoadedFrom(File loadedFrom) { this.loadedFrom = loadedFrom; } public List<P> getInheritedObjects() { return inheritedObjects; } public void setInheritedObjects(List<P> inheritedObjects) { this.inheritedObjects = inheritedObjects; } public void addInheritedObject(P inheritedObject) { if (this.getClass() != inheritedObject.getClass()) throw new IllegalArgumentException("Cannot inheirt from an object of a different type"); this.inheritedObjects.add(inheritedObject); } public List<String> getInherits() { return inherits; } @ParameterName("use") public void setInherits(List<String> inherits) { this.inherits = inherits; } public void addInherit(String inherit) { this.inherits.add(inherit); } public Boolean isRegister() { return register; } @ParameterName("register") public void setRegister(Boolean register) { this.register = register; } public String getName() { return name; } @ParameterName("name") public void setName(String name) { this.name = name; } public boolean unhandledObjectParameter(ObjectParameter parameter) { return false; } /** * Resolve a parameter based on the inheritance hierarchy * * @param accessor * @return */ @SuppressWarnings("unchecked") public <T> T resolveProperty(Function<P, T> accessor) { T r = accessor.apply((P) this); if (r == null) { // iterate and recurse up the tree for (P parent : this.getInheritedObjects()) { r = parent.resolveProperty(accessor); if (r != null) break; } } return r; } }