1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 19 package org.apache.catalina.startup; 20 21 22 import org.apache.tomcat.util.digester.Digester; 23 import org.apache.tomcat.util.digester.RuleSetBase; 24 import java.lang.reflect.Constructor; 25 26 import org.apache.juli.logging.Log; 27 import org.apache.juli.logging.LogFactory; 28 29 import java.lang.reflect.InvocationTargetException; 30 public class ClusterRuleSetFactory { 31 32 public static Log log = LogFactory.getLog(ClusterRuleSetFactory.class); 33 34 public static RuleSetBase getClusterRuleSet(String prefix) { 35 36 //OLD CLUSTER 1 37 //first try the same classloader as this class server/lib 38 try { 39 return loadRuleSet(prefix,"org.apache.catalina.cluster.ClusterRuleSet",ClusterRuleSetFactory.class.getClassLoader()); 40 } catch ( Exception x ) { 41 //display warning 42 if ( log.isDebugEnabled() ) log.debug("Unable to load ClusterRuleSet (org.apache.catalina.cluster.ClusterRuleSet), falling back on context classloader"); 43 } 44 //try to load it from the context class loader 45 try { 46 return loadRuleSet(prefix,"org.apache.catalina.cluster.ClusterRuleSet",Thread.currentThread().getContextClassLoader()); 47 } catch ( Exception x ) { 48 //display warning 49 if ( log.isDebugEnabled() ) log.debug("Unable to load ClusterRuleSet (org.apache.catalina.cluster.ClusterRuleSet), will try to load the HA cluster"); 50 } 51 52 //NEW CLUSTER 2 53 //first try the same classloader as this class server/lib 54 try { 55 return loadRuleSet(prefix,"org.apache.catalina.ha.ClusterRuleSet",ClusterRuleSetFactory.class.getClassLoader()); 56 } catch ( Exception x ) { 57 //display warning 58 if ( log.isDebugEnabled() ) log.debug("Unable to load HA ClusterRuleSet (org.apache.catalina.ha.ClusterRuleSet), falling back on context classloader"); 59 } 60 //try to load it from the context class loader 61 try { 62 return loadRuleSet(prefix,"org.apache.catalina.ha.ClusterRuleSet",Thread.currentThread().getContextClassLoader()); 63 } catch ( Exception x ) { 64 //display warning 65 if ( log.isDebugEnabled() ) log.debug("Unable to load HA ClusterRuleSet (org.apache.catalina.ha.ClusterRuleSet), falling back on DefaultClusterRuleSet"); 66 } 67 68 log.info("Unable to find a cluster rule set in the classpath. Will load the default rule set."); 69 return new DefaultClusterRuleSet(prefix); 70 } 71 72 73 protected static RuleSetBase loadRuleSet(String prefix, String className, ClassLoader cl) 74 throws ClassNotFoundException, InstantiationException, 75 NoSuchMethodException,IllegalAccessException, 76 InvocationTargetException { 77 Class clazz = Class.forName(className,true,cl); 78 Constructor cons = clazz.getConstructor(new Class[] {String.class}); 79 return (RuleSetBase)cons.newInstance(prefix); 80 } 81 82 /** 83 * <p><strong>RuleSet</strong> for processing the contents of a 84 * Cluster definition element. </p> 85 * 86 * @author Filip Hanik 87 * @author Peter Rossbach 88 * @version $Revision: 467222 $ $Date: 2006-10-24 05:17:11 +0200 (Tue, 24 Oct 2006) $ 89 */ 90 91 public static class DefaultClusterRuleSet extends RuleSetBase { 92 93 94 // ----------------------------------------------------- Instance Variables 95 96 97 /** 98 * The matching pattern prefix to use for recognizing our elements. 99 */ 100 protected String prefix = null; 101 102 103 // ------------------------------------------------------------ Constructor 104 105 106 /** 107 * Construct an instance of this <code>RuleSet</code> with the default 108 * matching pattern prefix. 109 */ 110 public DefaultClusterRuleSet() { 111 112 this(""); 113 114 } 115 116 117 /** 118 * Construct an instance of this <code>RuleSet</code> with the specified 119 * matching pattern prefix. 120 * 121 * @param prefix Prefix for matching pattern rules (including the 122 * trailing slash character) 123 */ 124 public DefaultClusterRuleSet(String prefix) { 125 super(); 126 this.namespaceURI = null; 127 this.prefix = prefix; 128 } 129 130 131 // --------------------------------------------------------- Public Methods 132 133 134 /** 135 * <p>Add the set of Rule instances defined in this RuleSet to the 136 * specified <code>Digester</code> instance, associating them with 137 * our namespace URI (if any). This method should only be called 138 * by a Digester instance.</p> 139 * 140 * @param digester Digester instance to which the new Rule instances 141 * should be added. 142 */ 143 public void addRuleInstances(Digester digester) { 144 //Cluster configuration start 145 digester.addObjectCreate(prefix + "Membership", 146 null, // MUST be specified in the element 147 "className"); 148 digester.addSetProperties(prefix + "Membership"); 149 digester.addSetNext(prefix + "Membership", 150 "setMembershipService", 151 "org.apache.catalina.cluster.MembershipService"); 152 153 digester.addObjectCreate(prefix + "Sender", 154 null, // MUST be specified in the element 155 "className"); 156 digester.addSetProperties(prefix + "Sender"); 157 digester.addSetNext(prefix + "Sender", 158 "setClusterSender", 159 "org.apache.catalina.cluster.ClusterSender"); 160 161 digester.addObjectCreate(prefix + "Receiver", 162 null, // MUST be specified in the element 163 "className"); 164 digester.addSetProperties(prefix + "Receiver"); 165 digester.addSetNext(prefix + "Receiver", 166 "setClusterReceiver", 167 "org.apache.catalina.cluster.ClusterReceiver"); 168 169 digester.addObjectCreate(prefix + "Valve", 170 null, // MUST be specified in the element 171 "className"); 172 digester.addSetProperties(prefix + "Valve"); 173 digester.addSetNext(prefix + "Valve", 174 "addValve", 175 "org.apache.catalina.Valve"); 176 177 digester.addObjectCreate(prefix + "Deployer", 178 null, // MUST be specified in the element 179 "className"); 180 digester.addSetProperties(prefix + "Deployer"); 181 digester.addSetNext(prefix + "Deployer", 182 "setClusterDeployer", 183 "org.apache.catalina.cluster.ClusterDeployer"); 184 185 digester.addObjectCreate(prefix + "Listener", 186 null, // MUST be specified in the element 187 "className"); 188 digester.addSetProperties(prefix + "Listener"); 189 digester.addSetNext(prefix + "Listener", 190 "addLifecycleListener", 191 "org.apache.catalina.LifecycleListener"); 192 193 digester.addObjectCreate(prefix + "ClusterListener", 194 null, // MUST be specified in the element 195 "className"); 196 digester.addSetProperties(prefix + "ClusterListener"); 197 digester.addSetNext(prefix + "ClusterListener", 198 "addClusterListener", 199 "org.apache.catalina.cluster.MessageListener"); 200 //Cluster configuration end 201 } 202 203 204 } 205 }