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.monitors; 028 029 030 031 import java.util.ArrayList; 032 import java.util.Collection; 033 import java.util.LinkedHashSet; 034 import java.util.TreeMap; 035 036 import org.opends.server.admin.std.server.ConnectionHandlerCfg; 037 import org.opends.server.admin.std.server.ClientConnectionMonitorProviderCfg; 038 import org.opends.server.api.ClientConnection; 039 import org.opends.server.api.ConnectionHandler; 040 import org.opends.server.api.MonitorProvider; 041 import org.opends.server.config.ConfigException; 042 import org.opends.server.core.DirectoryServer; 043 import org.opends.server.types.Attribute; 044 import org.opends.server.types.AttributeType; 045 import org.opends.server.types.AttributeValue; 046 import org.opends.server.types.InitializationException; 047 048 049 050 /** 051 * This class defines a Directory Server monitor provider that can be used to 052 * obtain information about the client connections established to the server. 053 * Note that the information reported is obtained with little or no locking, so 054 * it may not be entirely consistent, especially for active connections. 055 */ 056 public class ClientConnectionMonitorProvider 057 extends MonitorProvider<ClientConnectionMonitorProviderCfg> 058 { 059 /** 060 * Creates an instance of this monitor provider. 061 */ 062 public ClientConnectionMonitorProvider() 063 { 064 super("Client Connection Monitor Provider"); 065 066 // No initialization should be performed here. 067 } 068 069 070 071 /** 072 * {@inheritDoc} 073 */ 074 public void initializeMonitorProvider( 075 ClientConnectionMonitorProviderCfg configuration) 076 throws ConfigException, InitializationException 077 { 078 // No initialization is required. 079 } 080 081 082 083 /** 084 * Retrieves the name of this monitor provider. It should be unique among all 085 * monitor providers, including all instances of the same monitor provider. 086 * 087 * @return The name of this monitor provider. 088 */ 089 public String getMonitorInstanceName() 090 { 091 return "Client Connections"; 092 } 093 094 095 096 /** 097 * Retrieves the length of time in milliseconds that should elapse between 098 * calls to the <CODE>updateMonitorData()</CODE> method. A negative or zero 099 * return value indicates that the <CODE>updateMonitorData()</CODE> method 100 * should not be periodically invoked. 101 * 102 * @return The length of time in milliseconds that should elapse between 103 * calls to the <CODE>updateMonitorData()</CODE> method. 104 */ 105 public long getUpdateInterval() 106 { 107 // This monitor does not need to run periodically. 108 return 0; 109 } 110 111 112 113 /** 114 * Performs any processing periodic processing that may be desired to update 115 * the information associated with this monitor. Note that best-effort 116 * attempts will be made to ensure that calls to this method come 117 * <CODE>getUpdateInterval()</CODE> milliseconds apart, but no guarantees will 118 * be made. 119 */ 120 public void updateMonitorData() 121 { 122 // This monitor does not need to run periodically. 123 return; 124 } 125 126 127 128 /** 129 * Retrieves a set of attributes containing monitor data that should be 130 * returned to the client if the corresponding monitor entry is requested. 131 * 132 * @return A set of attributes containing monitor data that should be 133 * returned to the client if the corresponding monitor entry is 134 * requested. 135 */ 136 public ArrayList<Attribute> getMonitorData() 137 { 138 // Get information about all the available connections. 139 ArrayList<Collection<ClientConnection>> connCollections = 140 new ArrayList<Collection<ClientConnection>>(); 141 for (ConnectionHandler handler : DirectoryServer.getConnectionHandlers()) 142 { 143 ConnectionHandler<? extends ConnectionHandlerCfg> connHandler = 144 (ConnectionHandler<? extends ConnectionHandlerCfg>) handler; 145 connCollections.add(connHandler.getClientConnections()); 146 } 147 148 149 // Re-order the connections by connection ID. 150 TreeMap<Long,ClientConnection> connMap = 151 new TreeMap<Long,ClientConnection>(); 152 for (Collection<ClientConnection> collection : connCollections) 153 { 154 for (ClientConnection conn : collection) 155 { 156 connMap.put(conn.getConnectionID(), conn); 157 } 158 } 159 160 161 // Iterate through all the client connections and create a one-line summary 162 // of each. 163 AttributeType attrType = 164 DirectoryServer.getDefaultAttributeType("connection"); 165 LinkedHashSet<AttributeValue> values = 166 new LinkedHashSet<AttributeValue>(connMap.size()); 167 for (ClientConnection conn : connMap.values()) 168 { 169 values.add(new AttributeValue(attrType, conn.getMonitorSummary())); 170 } 171 172 173 ArrayList<Attribute> attrs = new ArrayList<Attribute>(1); 174 attrs.add(new Attribute(attrType, "connection", values)); 175 return attrs; 176 } 177 } 178