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.lang.reflect.Method; 033 import java.util.ArrayList; 034 import java.util.List; 035 036 import org.opends.server.admin.ClassPropertyDefinition; 037 import org.opends.server.admin.server.ConfigurationChangeListener; 038 import org.opends.server.admin.std.meta.WorkQueueCfgDefn; 039 import org.opends.server.admin.std.server.WorkQueueCfg; 040 import org.opends.server.admin.std.server.RootCfg; 041 import org.opends.server.admin.server.ServerManagementContext; 042 import org.opends.server.api.WorkQueue; 043 import org.opends.server.config.ConfigException; 044 import org.opends.server.types.ConfigChangeResult; 045 import org.opends.server.types.InitializationException; 046 import org.opends.server.types.ResultCode; 047 048 import static org.opends.messages.ConfigMessages.*; 049 050 import static org.opends.server.util.StaticUtils.*; 051 052 053 054 /** 055 * This class defines a utility that will be used to manage the Directory Server 056 * work queue. 057 */ 058 public class WorkQueueConfigManager 059 implements ConfigurationChangeListener<WorkQueueCfg> 060 { 061 /** 062 * Creates a new instance of this work queue config manager. 063 */ 064 public WorkQueueConfigManager() 065 { 066 // No implementation is required. 067 } 068 069 070 071 /** 072 * Initializes the Directory Server's work queue. This should only be called 073 * at server startup. 074 * 075 * @return WorkQueue The initialized work queue that should be used by the 076 * server. 077 * 078 * @throws ConfigException If a configuration problem causes the work queue 079 * initialization process to fail. 080 * 081 * @throws InitializationException If a problem occurs while initializing 082 * the work queue that is not related to the 083 * server configuration. 084 */ 085 public WorkQueue initializeWorkQueue() 086 throws ConfigException, InitializationException 087 { 088 // Get the root configuration object. 089 ServerManagementContext managementContext = 090 ServerManagementContext.getInstance(); 091 RootCfg rootConfiguration = 092 managementContext.getRootConfiguration(); 093 094 095 // Get the work queue configuration and register with it as a change 096 // listener. 097 WorkQueueCfg workQueueConfig = rootConfiguration.getWorkQueue(); 098 workQueueConfig.addChangeListener(this); 099 100 101 // Get the work queue class, and load and instantiate an instance of it 102 // using that configuration. 103 WorkQueueCfgDefn definition = WorkQueueCfgDefn.getInstance(); 104 ClassPropertyDefinition propertyDefinition = 105 definition.getJavaClassPropertyDefinition(); 106 Class<? extends WorkQueue> workQueueClass = 107 propertyDefinition.loadClass(workQueueConfig.getJavaClass(), 108 WorkQueue.class); 109 110 try 111 { 112 WorkQueue workQueue = workQueueClass.newInstance(); 113 114 Method method = workQueue.getClass().getMethod("initializeWorkQueue", 115 workQueueConfig.configurationClass()); 116 method.invoke(workQueue, workQueueConfig); 117 118 return workQueue; 119 } 120 catch (Exception e) 121 { 122 Message message = ERR_CONFIG_WORK_QUEUE_INITIALIZATION_FAILED. 123 get(workQueueConfig.getJavaClass(), 124 String.valueOf(workQueueConfig.dn()), 125 stackTraceToSingleLineString(e)); 126 throw new InitializationException(message, e); 127 } 128 } 129 130 131 132 /** 133 * {@inheritDoc} 134 */ 135 public boolean isConfigurationChangeAcceptable(WorkQueueCfg configuration, 136 List<Message> unacceptableReasons) 137 { 138 // Changes to the work queue configuration will always be acceptable to this 139 // generic implementation. 140 return true; 141 } 142 143 144 145 /** 146 * {@inheritDoc} 147 */ 148 public ConfigChangeResult applyConfigurationChange(WorkQueueCfg configuration) 149 { 150 ResultCode resultCode = ResultCode.SUCCESS; 151 boolean adminActionRequired = false; 152 ArrayList<Message> messages = new ArrayList<Message>(); 153 154 155 // If the work queue class has been changed, then we should warn the user 156 // that it won't take effect until the server is restarted. 157 WorkQueue workQueue = DirectoryServer.getWorkQueue(); 158 String workQueueClass = configuration.getJavaClass(); 159 if (! workQueueClass.equals(workQueue.getClass().getName())) 160 { 161 162 messages.add(INFO_CONFIG_WORK_QUEUE_CLASS_CHANGE_REQUIRES_RESTART.get( 163 workQueue.getClass().getName(), 164 workQueueClass)); 165 166 adminActionRequired = true; 167 } 168 169 170 return new ConfigChangeResult(resultCode, adminActionRequired, messages); 171 } 172 } 173