001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.ha.framework.server.util;
023:
024: import java.util.ArrayList;
025: import java.util.Hashtable;
026:
027: import javax.naming.InitialContext;
028: import javax.naming.NamingException;
029: import javax.naming.Context;
030:
031: import org.jboss.system.ServiceMBeanSupport;
032: import org.jboss.logging.Logger;
033: import org.jboss.ha.framework.server.util.TopologyMonitorService.AddressPort;
034:
035: /** A utility MBean that can be used as the trigger target of the
036: * TopologyMonitorService to probe the state of JNDI on the cluster nodes.
037: *
038: * @author Scott.Stark@jboss.org
039: * @version $Revision: 57188 $
040: */
041: public class PingJndi extends ServiceMBeanSupport implements
042: PingJndiMBean {
043: private String urlPrefix;
044: private String urlSuffix;
045: private String urlPattern;
046: private String[] lookupNames;
047:
048: /** Get the names of JNDI bindings that should be queried on each host
049: * @return the array of target names to test
050: * @jmx:managed-attribute
051: */
052: public String[] getLookupNames() {
053: return lookupNames;
054: }
055:
056: /** Set the names of JNDI bindings that should be queried on each host
057: * @param names
058: * @jmx:managed-attribute
059: */
060: public void setLookupNames(String[] names) {
061: this .lookupNames = names;
062: }
063:
064: /** Get the Context.PROVIDER_URL regular expression.
065: * @return the regular expression containing the host, for example
066: * 'jnp://(host):1099/'
067: * @jmx:managed-attribute
068: */
069: public String getProviderURLPattern() {
070: return urlPattern;
071: }
072:
073: /** Set the regular expression containing the hostname/IP address of
074: * the JNDI provider. This expression is used to build the JNDI
075: * Context.PROVIDER_URL for each node in the cluster. The expression
076: * should contain a "(host)" component that will be replaced with the
077: * cluster node hostname.
078: *
079: * @param regex the regular expression containing the host, for example
080: * 'jnp://(host):1099/'
081: * @jmx:managed-attribute
082: */
083: public void setProviderURLPattern(String regex) {
084: this .urlPattern = regex;
085: this .urlPrefix = regex;
086: this .urlSuffix = "";
087: String hostExp = "{host}";
088: int hostIndex = regex.indexOf(hostExp);
089: if (hostIndex >= 0) {
090: urlPrefix = regex.substring(0, hostIndex);
091: int endIndex = hostIndex + hostExp.length();
092: urlSuffix = regex.substring(endIndex);
093: }
094: }
095:
096: /** The TopologyMonitorService trigger callback operation.
097: *
098: * @param removed ArrayList<AddressPort> of nodes that were removed
099: * @param added ArrayList<AddressPort> of nodes that were added
100: * @param members ArrayList<AddressPort> of nodes currently in the cluster
101: * @param logCategoryName the log4j category name used by the
102: * TopologyMonitorService. This is used for logging to integrate with
103: * the TopologyMonitorService output.
104: */
105: public void membershipChanged(ArrayList removed, ArrayList added,
106: ArrayList members, String logCategoryName) {
107: log.debug("membershipChanged");
108: Logger tmsLog = Logger.getLogger(logCategoryName);
109: Hashtable localEnv = null;
110: try {
111: InitialContext localCtx = new InitialContext();
112: localEnv = localCtx.getEnvironment();
113: } catch (NamingException e) {
114: tmsLog.error("Failed to obtain InitialContext env", e);
115: return;
116: }
117:
118: tmsLog.info("Checking removed hosts JNDI binding");
119: doLookups(localEnv, tmsLog, removed);
120: tmsLog.info("Checking added hosts JNDI binding");
121: doLookups(localEnv, tmsLog, added);
122: tmsLog.info("Checking members hosts JNDI binding");
123: doLookups(localEnv, tmsLog, members);
124: }
125:
126: private void doLookups(Hashtable localEnv, Logger tmsLog,
127: ArrayList nodes) {
128: for (int n = 0; n < nodes.size(); n++) {
129: AddressPort addrInfo = (AddressPort) nodes.get(n);
130: String providerURL = urlPrefix + addrInfo.getHostName()
131: + urlSuffix;
132: Hashtable env = new Hashtable(localEnv);
133: env.put(Context.PROVIDER_URL, providerURL);
134: tmsLog.info("Checking names on: " + addrInfo);
135: try {
136: InitialContext ctx = new InitialContext(env);
137: for (int s = 0; s < lookupNames.length; s++) {
138: String name = lookupNames[s];
139: Object value = ctx.lookup(name);
140: tmsLog.info("lookup(" + name + "): " + value);
141: }
142: } catch (Exception e) {
143: tmsLog.error("Failed lookups on: " + addrInfo, e);
144: }
145: }
146: }
147: }
|