📄 client.java
字号:
package jndi;import javax.naming.InitialContext;import javax.naming.Context;import javax.naming.NamingEnumeration;import javax.naming.NameNotFoundException;import javax.naming.NamingException;import javax.naming.directory.DirContext;import javax.naming.directory.Attribute;import javax.naming.directory.BasicAttribute;import javax.naming.directory.Attributes;import javax.naming.directory.BasicAttributes;import javax.naming.directory.DirContext;import javax.naming.directory.Attribute;import javax.naming.directory.Attributes;import javax.naming.directory.SearchResult;import javax.naming.directory.SearchControls;import javax.naming.ldap.InitialLdapContext;import javax.management.remote.*;import javax.management.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;import java.util.List;import java.util.ArrayList;import java.util.HashMap;import java.util.Hashtable;import java.util.Set;import java.util.Iterator;import java.util.Locale;import java.util.Vector;import java.io.IOException;import java.io.Serializable;/** * This class demonstrates how to use an LDAP directory as a lookup service * for JSR 160 connectors. It shows how to lookup a JMXServiceURL * from the LDAP directory. * <p> * See README file and {@link #main(String[])} for more details. * <p> * Make sure to read the section "Binding with Lookup Services" of * the JMX Remote API 1.0 Specification before looking at this example. */public class Client { private static boolean debug = false; /** * List all the attributes of an LDAP node. * * @param root The root DirContext. * @param dn The DN of the node, relative to the root DirContext. */ public static void listAttributes(DirContext root, String dn) throws NamingException { final Attributes attrs = root.getAttributes(dn); System.out.println("dn: " + dn); System.out.println("attributes: " + attrs); } /** * Get a pointer to the root context of the directory tree * under which this server is supposed to register itself. * All LDAP DNs will be considered to be relative to that root. * <p> * Note that this root is not part of the JSR 160 specification, * since the actual location where a JMX Agent will register * its connectors is left completely open by the specification. * The specification only discuss what the JMX Agent must/may * put in the directory - but not where. * <p> * This method assumes that the root of the directory is * will be passed in a the {@link Context#PROVIDER_URL * Context.PROVIDER_URL} System property. * <p> * This method will transfer a fixed set of System Properties to * the Hashtable given to the JNDI InitialContext: * <ul><li>{@link Context#INITIAL_CONTEXT_FACTORY * Context.INITIAL_CONTEXT_FACTORY} - default is * <code>"com.sun.jndi.ldap.LdapCtxFactory"</code></li> * <li>{@link Context#PROVIDER_URL * Context.PROVIDER_URL}</li> * <li>{@link Context#SECURITY_PRINCIPAL * Context.SECURITY_PRINCIPAL} - default is * <code>"cn=Directory Manager"</code></li> * <li>{@link Context#SECURITY_CREDENTIALS * Context.SECURITY_CREDENTIALS}</li> * </ul> * * @return a pointer to the LDAP Directory. */ public static DirContext getRootContext() throws NamingException { // Prepare environment // final Hashtable env = new Hashtable(); // The Initial Context Factory must be provided, and // must point to an LDAP Context Factory // final String factory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // The LDAP Provider URL must be provided, and // must point to a running LDAP directory server // final String ldapServerUrl = System.getProperty(Context.PROVIDER_URL); // The LDAP user must be provided, and // must have write access to the subpart of the directory // where the agent will be registered. // final String ldapUser = System.getProperty(Context.SECURITY_PRINCIPAL, "cn=Directory Manager"); // Credentials must be provided, so that the user may // write to the directory. // final String ldapPasswd = System.getProperty(Context.SECURITY_CREDENTIALS); // Debug info: print provided values: // debug(Context.PROVIDER_URL + "=" + ldapServerUrl); debug(Context.SECURITY_PRINCIPAL + "=" + ldapUser); if (debug) { System.out.print(Context.SECURITY_CREDENTIALS + "="); final int len = (ldapPasswd==null)?0:ldapPasswd.length(); for (int i=0;i<len;i++) System.out.print("*"); System.out.println(); } // Put provided value in the environment table. // env.put(Context.INITIAL_CONTEXT_FACTORY,factory); env.put(Context.SECURITY_PRINCIPAL, ldapUser); if (ldapServerUrl != null) env.put(Context.PROVIDER_URL, ldapServerUrl); if (ldapPasswd != null) env.put(Context.SECURITY_CREDENTIALS, ldapPasswd); // Create initial context // InitialContext root = new InitialLdapContext(env,null); // Now return the root directory context. // return (DirContext)(root.lookup("")); } /** * Parses the expirationDate in order to determined whether * the associated URL has expired. * * @param expirationDate an X.208 GeneralizedTime, local or GMT. * Only yyyyMMddHHmmss.S (local time) and yyyyMMddHHmmss.SZ * (GMT time) formats are recognized. * @return true if the expirationDate could be parsed and is past, * false otherwise. */ public static boolean hasExpired(String expirationDate) { if (expirationDate == null) return false; try { final Date localExpDate = getLocalDate(expirationDate); final Date now = new Date(); if (localExpDate.before(now)) return true; } catch (java.text.ParseException x) { x.printStackTrace(System.out); } return false; } /** * Returns a date in the local time zone parsed from an X.208 * formatted date. Only yyyyMMddHHmmss.S (local time) and * yyyyMMddHHmmss.SZ (GMT time) formats are recognized. * * @param expirationDate an X.208 GeneralizedTime, local or GMT. * @return the corresponding Date in the local time zone. */ public static Date getLocalDate(String expirationDate) throws java.text.ParseException { final SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss.S"); Date localDate = fmt.parse(expirationDate); if (expirationDate.endsWith("Z")) { final Date date = new Date(); if (fmt.getCalendar().getTimeZone().inDaylightTime(date)) localDate = new Date(localDate.getTime() + fmt.getCalendar().getTimeZone().getRawOffset() + fmt.getCalendar().getTimeZone().getDSTSavings()); else localDate = new Date(localDate.getTime() + fmt.getCalendar().getTimeZone().getRawOffset()); } return localDate; } /** * Lookup JMXConnectors in the LDAP directory. * * @param root A pointer to the LDAP directory, * returned by {@link #getRootContext()}. * @param protocolType The protocol type of the JMX Connectors * we want to retrieve. If <var>protocolType</var> is null, * then the jmxProtocolType attribute is ignored. Otherwise, * only those agents that have registered a matching * jmxProtocolType attribute will be returned. * @param name the AgentName of the JMXConnectors that should * be returned. If <var>name</var> is null, then * the JMXConnectors for all agents are returned * (null is an equivalent for a wildcard). * @return The list of matching JMXConnectors retrieved from * the LDAP directory. */ public static List lookup(DirContext root, String protocolType, String name) throws IOException, NamingException { final ArrayList list = new ArrayList(); // If protocolType is not null, include it in the filter. // String queryProtocol = (protocolType==null)?"":"(jmxProtocolType="+protocolType+")"; // Set the LDAPv3 query string // // Only those node that have the jmxConnector object class are // of interest to us, so we specify (objectClass=jmxConnector) // in the filter. // // We specify the jmxAgentName attribute in the filter so that the // query will return only those services for which the AgentName // attribute was registered. Since JSR 160 specifies that // the AgentName attribute is mandatory, this makes it possible // to filter out all the services that do not conform // to the spec. // If <name> is null, it is replaced by "*", so that all // services for which the AgentName attribute was specified match, // regardless of the value of that attribute. // Otherwise, only those services for which AgentName matches the // name or pattern specified by <name> will be returned. // // We also specify (jmxServiceURL=*) so that only those node // for which the jmxServiceURL attribute is present will be // returned. Thus, we filter out all those node corresponding // to agents that are not currently available. // String query =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -