001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.core;
028 import org.opends.messages.Message;
029
030
031
032 import java.util.*;
033
034 import org.opends.server.config.ConfigException;
035 import org.opends.server.types.*;
036
037 import org.opends.server.loggers.debug.DebugLogger;
038 import org.opends.server.loggers.ErrorLogger;
039 import org.opends.server.loggers.AccessLogger;
040 import static org.opends.messages.ConfigMessages.*;
041 import static org.opends.server.loggers.ErrorLogger.*;
042
043 import org.opends.server.admin.std.server.*;
044 import org.opends.server.admin.server.ConfigurationAddListener;
045 import org.opends.server.admin.server.ConfigurationDeleteListener;
046 import org.opends.server.admin.server.ServerManagementContext;
047
048
049 /**
050 * This class defines a utility that will be used to manage the set of loggers
051 * used in the Directory Server. It will perform the logger initialization when
052 * the server is starting, and then will manage any additions, removals, or
053 * modifications of any loggers while the server is running.
054 */
055 public class LoggerConfigManager implements
056 ConfigurationAddListener<LogPublisherCfg>,
057 ConfigurationDeleteListener<LogPublisherCfg>
058 {
059
060 /**
061 * Initializes all the log publishers.
062 *
063 * @throws ConfigException
064 * If an unrecoverable problem arises in the process of
065 * performing the initialization as a result of the server
066 * configuration.
067 * @throws InitializationException
068 * If a problem occurs during initialization that is not
069 * related to the server configuration.
070 */
071 public void initializeLoggerConfig()
072 throws ConfigException, InitializationException
073 {
074 // Create an internal server management context and retrieve
075 // the root configuration which has the log publisher relation.
076 ServerManagementContext context = ServerManagementContext.getInstance();
077 RootCfg root = context.getRootConfiguration();
078
079 root.addLogPublisherAddListener(this);
080 root.addLogPublisherDeleteListener(this);
081
082 List<DebugLogPublisherCfg> debugPublisherCfgs =
083 new ArrayList<DebugLogPublisherCfg>();
084
085 List<AccessLogPublisherCfg> accessPublisherCfgs =
086 new ArrayList<AccessLogPublisherCfg>();
087
088 List<ErrorLogPublisherCfg> errorPublisherCfgs =
089 new ArrayList<ErrorLogPublisherCfg>();
090
091 for (String name : root.listLogPublishers())
092 {
093 LogPublisherCfg config = root.getLogPublisher(name);
094
095 if(config instanceof DebugLogPublisherCfg)
096 {
097 debugPublisherCfgs.add((DebugLogPublisherCfg)config);
098 }
099 else if(config instanceof AccessLogPublisherCfg)
100 {
101 accessPublisherCfgs.add((AccessLogPublisherCfg)config);
102 }
103 else if(config instanceof ErrorLogPublisherCfg)
104 {
105 errorPublisherCfgs.add((ErrorLogPublisherCfg)config);
106 }
107 else
108 {
109 Message message = ERR_CONFIG_LOGGER_INVALID_OBJECTCLASS.get(
110 String.valueOf(config.dn()));
111 throw new ConfigException(message);
112 }
113 }
114
115 // See if there are active loggers in all categories. If not, then log a
116 // message.
117 if (accessPublisherCfgs.isEmpty())
118 {
119 logError(WARN_CONFIG_LOGGER_NO_ACTIVE_ACCESS_LOGGERS.get());
120 }
121 if (errorPublisherCfgs.isEmpty())
122 {
123 logError(WARN_CONFIG_LOGGER_NO_ACTIVE_ERROR_LOGGERS.get());
124 }
125
126 DebugLogger.getInstance().initializeDebugLogger(debugPublisherCfgs);
127 AccessLogger.getInstance().initializeAccessLogger(accessPublisherCfgs);
128 ErrorLogger.getInstance().initializeErrorLogger(errorPublisherCfgs);
129 }
130
131 /**
132 * {@inheritDoc}
133 */
134 public boolean isConfigurationAddAcceptable(LogPublisherCfg config,
135 List<Message> unacceptableReasons)
136 {
137 if(config instanceof DebugLogPublisherCfg)
138 {
139 return DebugLogger.getInstance().isConfigurationAddAcceptable(
140 (DebugLogPublisherCfg)config, unacceptableReasons);
141 }
142 else if(config instanceof AccessLogPublisherCfg)
143 {
144 return AccessLogger.getInstance().isConfigurationAddAcceptable(
145 (AccessLogPublisherCfg)config, unacceptableReasons);
146 }
147 else if(config instanceof ErrorLogPublisherCfg)
148 {
149 return ErrorLogger.getInstance().isConfigurationAddAcceptable(
150 (ErrorLogPublisherCfg)config, unacceptableReasons);
151 }
152 else
153 {
154
155 unacceptableReasons.add(ERR_CONFIG_LOGGER_INVALID_OBJECTCLASS.get(
156 String.valueOf(config.dn())));
157 return false;
158 }
159 }
160
161 /**
162 * {@inheritDoc}
163 */
164 public ConfigChangeResult applyConfigurationAdd(LogPublisherCfg config)
165 {
166 if(config instanceof DebugLogPublisherCfg)
167 {
168 return DebugLogger.getInstance().applyConfigurationAdd(
169 (DebugLogPublisherCfg)config);
170 }
171 else if(config instanceof AccessLogPublisherCfg)
172 {
173 return AccessLogger.getInstance().applyConfigurationAdd(
174 (AccessLogPublisherCfg)config);
175 }
176 else if(config instanceof ErrorLogPublisherCfg)
177 {
178 return ErrorLogger.getInstance().applyConfigurationAdd(
179 (ErrorLogPublisherCfg)config);
180 }
181 else
182 {
183 ArrayList<Message> messages = new ArrayList<Message>();
184 messages.add(ERR_CONFIG_LOGGER_INVALID_OBJECTCLASS.
185 get(String.valueOf(config.dn())));
186 boolean adminActionRequired = false;
187 ResultCode resultCode = ResultCode.UNWILLING_TO_PERFORM;
188 return new ConfigChangeResult(resultCode, adminActionRequired, messages);
189 }
190 }
191
192 /**
193 * {@inheritDoc}
194 */
195 public boolean isConfigurationDeleteAcceptable(LogPublisherCfg config,
196 List<Message> unacceptableReasons)
197 {
198 if(config instanceof DebugLogPublisherCfg)
199 {
200 return DebugLogger.getInstance().isConfigurationDeleteAcceptable(
201 (DebugLogPublisherCfg)config, unacceptableReasons);
202 }
203 else if(config instanceof AccessLogPublisherCfg)
204 {
205 return AccessLogger.getInstance().isConfigurationDeleteAcceptable(
206 (AccessLogPublisherCfg)config, unacceptableReasons);
207 }
208 else if(config instanceof ErrorLogPublisherCfg)
209 {
210 return ErrorLogger.getInstance().isConfigurationDeleteAcceptable(
211 (ErrorLogPublisherCfg)config, unacceptableReasons);
212 }
213 else
214 {
215 unacceptableReasons.add(ERR_CONFIG_LOGGER_INVALID_OBJECTCLASS.get(
216 String.valueOf(config.dn())));
217 return false;
218 }
219 }
220
221 /**
222 * {@inheritDoc}
223 */
224 public ConfigChangeResult applyConfigurationDelete(LogPublisherCfg config)
225 {
226 if(config instanceof DebugLogPublisherCfg)
227 {
228 return DebugLogger.getInstance().applyConfigurationDelete(
229 (DebugLogPublisherCfg)config);
230 }
231 else if(config instanceof AccessLogPublisherCfg)
232 {
233 return AccessLogger.getInstance().applyConfigurationDelete(
234 (AccessLogPublisherCfg)config);
235 }
236 else if(config instanceof ErrorLogPublisherCfg)
237 {
238 return ErrorLogger.getInstance().applyConfigurationDelete(
239 (ErrorLogPublisherCfg)config);
240 }
241 else
242 {
243 ArrayList<Message> messages = new ArrayList<Message>();
244 messages.add(ERR_CONFIG_LOGGER_INVALID_OBJECTCLASS.get(
245 String.valueOf(config.dn())));
246 boolean adminActionRequired = false;
247 ResultCode resultCode = ResultCode.UNWILLING_TO_PERFORM;
248 return new ConfigChangeResult(resultCode, adminActionRequired, messages);
249 }
250 }
251 }
252