001 package org.kuali.common.util.log.log4j.model;
002
003 import java.util.Collections;
004 import java.util.List;
005
006 import javax.xml.bind.annotation.XmlAccessType;
007 import javax.xml.bind.annotation.XmlAccessorType;
008 import javax.xml.bind.annotation.XmlAttribute;
009 import javax.xml.bind.annotation.XmlElement;
010 import javax.xml.bind.annotation.XmlRootElement;
011 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
012
013 import org.kuali.common.util.Assert;
014 import org.kuali.common.util.CollectionUtils;
015 import org.kuali.common.util.ListUtils;
016 import org.kuali.common.util.log.log4j.jaxb.DebugAdapter;
017 import org.kuali.common.util.log.log4j.jaxb.RepositoryThresholdAdapter;
018 import org.kuali.common.util.xml.jaxb.adapter.OmitFalseAdapter;
019
020 @XmlRootElement(name = "log4j:configuration")
021 @XmlAccessorType(XmlAccessType.FIELD)
022 public final class Log4JConfiguration {
023
024 @XmlAttribute(name = "xmlns:log4j")
025 private final String namespace;
026
027 @XmlElement(name = "appender")
028 private final List<Appender> appenders;
029
030 @XmlElement
031 private final Logger root;
032
033 @XmlElement(name = "logger")
034 private final List<Logger> loggers;
035
036 @XmlAttribute
037 @XmlJavaTypeAdapter(OmitFalseAdapter.class)
038 private final Boolean reset;
039
040 @XmlAttribute
041 @XmlJavaTypeAdapter(DebugAdapter.class)
042 private final Debug debug;
043
044 @XmlAttribute
045 @XmlJavaTypeAdapter(RepositoryThresholdAdapter.class)
046 private final Threshold threshold;
047
048 // Only expose an unmodifiable version of our internal list
049 public List<Logger> getLoggers() {
050 return Collections.unmodifiableList(loggers);
051 }
052
053 // Only expose an unmodifiable version of our internal list
054 public List<Appender> getAppenders() {
055 return Collections.unmodifiableList(appenders);
056 }
057
058 public boolean getReset() {
059 return reset;
060 }
061
062 public Debug getDebug() {
063 return debug;
064 }
065
066 public Threshold getThreshold() {
067 return threshold;
068 }
069
070 public Logger getRoot() {
071 return root;
072 }
073
074 public String getNamespace() {
075 return namespace;
076 }
077
078 public static class Builder {
079
080 // Required
081 private final Logger root;
082
083 // Optional
084 private String namespace = "http://jakarta.apache.org/log4j/";
085 private List<Appender> appenders = Appender.EMPTY;
086 private List<Logger> loggers = Logger.EMPTY;
087 private boolean reset = false;
088 private Debug debug = Debug.DEFAULT_VALUE;
089 private Threshold threshold = Threshold.DEFAULT_REPOSITORY_VALUE;
090
091 public Builder(Logger root) {
092 Assert.noNulls(root);
093 this.root = root;
094 }
095
096 public Builder appenders(List<Appender> appenders) {
097 this.appenders = appenders;
098 return this;
099 }
100
101 public Builder appender(Appender appender) {
102 this.appenders = CollectionUtils.singletonList(appender);
103 return this;
104 }
105
106 public Builder namespace(String namespace) {
107 this.namespace = namespace;
108 return this;
109 }
110
111 public Builder logger(Logger logger) {
112 this.loggers = CollectionUtils.singletonList(logger);
113 return this;
114 }
115
116 public Builder loggers(List<Logger> loggers) {
117 this.loggers = loggers;
118 return this;
119 }
120
121 public Builder reset(boolean reset) {
122 this.reset = reset;
123 return this;
124 }
125
126 public Builder debug(Debug debug) {
127 this.debug = debug;
128 return this;
129 }
130
131 public Builder threshold(Threshold threshold) {
132 this.threshold = threshold;
133 return this;
134 }
135
136 private Builder finish() {
137
138 // Ensure we are being configured correctly
139 Assert.noNulls(root, appenders, loggers, debug, threshold);
140 Assert.isFalse(Logger.isThresholdNull(root), "root logging threshold is null");
141 Assert.noBlanks(namespace);
142
143 // Defensive copies of the 2 lists we were passed
144 this.appenders = ListUtils.newArrayList(appenders);
145 this.loggers = ListUtils.newArrayList(loggers);
146
147 // Return the fully configured Builder
148 return this;
149 }
150
151 public Log4JConfiguration build() {
152 finish(); // Finish setting things up
153 return new Log4JConfiguration(this);
154 }
155 }
156
157 // This is a concession to JAXB so it can unmarshal the object from XML
158 private Log4JConfiguration() {
159 this(new Builder(Logger.DEFAULT).finish());
160 }
161
162 private Log4JConfiguration(Builder builder) {
163 this.root = builder.root;
164 this.appenders = builder.appenders;
165 this.loggers = builder.loggers;
166 this.reset = builder.reset;
167 this.debug = builder.debug;
168 this.threshold = builder.threshold;
169 this.namespace = builder.namespace;
170 }
171
172 }