| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.jk.status; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.tomcat.util.digester.Digester; |
| |
| /** |
| * mod_jk 1.2.19 document:<br/> |
| * <code> |
| * |
| * <?xml version="1.0" encoding="UTF-8" ?> |
| * <jk:status xmlns:jk="http://tomcat.apache.org"> |
| * <jk:server name="localhost" port="2010" software="Apache/2.0.58 (Unix) mod_jk/1.2.19-dev" version="1.2.19" /> |
| * <jk:balancers> |
| * <jk:balancer id="0" name="loadbalancer" type="lb" sticky="True" stickyforce="False" retries="2" recover="60" > |
| * <jk:member id="0" name="node01" type="ajp13" host="localhost" port="20012" address="127.0.0.1:20012" activation="ACT" state="N/A" distance="0" lbfactor="1" lbmult="1" lbvalue="0" elected="0" errors="0" transferred="0" readed="0" busy="0" maxbusy="0" jvm_route="node01" /> |
| * <jk:member id="1" name="node02" type="ajp13" host="localhost" port="20022" address="127.0.0.1:20022" activation="ACT" state="N/A" distance="0" lbfactor="1" lbmult="1" lbvalue="0" elected="0" errors="0" transferred="0" readed="0" busy="0" maxbusy="0" jvm_route="node02" /> |
| * <jk:map type="Wildchar" uri="/ClusterSession*" context="/ClusterSession*" /> |
| * <jk:map type="Wildchar" uri="/ClusterTest*" context="/ClusterTest*" /> |
| * <jk:map type="Wildchar" uri="/test*" context="/test*" /> |
| * </jk:balancer> |
| * </jk:balancers> |
| * </jk:status> |
| * </code> |
| * <br/> |
| * mod_jk 1.2.20 document:<br/> |
| * <code> |
| * <?xml version="1.0" encoding="UTF-8" ?> |
| * <jk:status xmlns:jk="http://tomcat.apache.org"> |
| * <jk:server |
| * name="127.0.0.1" |
| * port="2080" |
| * software="Apache/2.0.59 (Unix) mod_jk/1.2.20-dev" |
| * version="1.2.20"/> |
| * <jk:balancers> |
| * <jk:balancer |
| * name="loadbalancer" |
| * type="lb" |
| * sticky="True" |
| * stickyforce="False" |
| * retries="2" |
| * recover="60" |
| * method="Request" |
| * lock="Optimistic" |
| * good="2" |
| * degraded="0" |
| * bad="0" |
| * busy="0" |
| * max_busy="0"> |
| * <jk:member |
| * name="node01" |
| * type="ajp13" |
| * host="localhost" |
| * port="7309" |
| * address="127.0.0.1:7309" |
| * activation="ACT" |
| * lbfactor="1" |
| * jvm_route="node01" |
| * redirect="" |
| * domain="" |
| * distance="0" |
| * state="N/A" |
| * lbmult="1" |
| * lbvalue="0" |
| * elected="0" |
| * errors="0" |
| * clienterrors="0" |
| * transferred="0" |
| * readed="0" |
| * busy="0" |
| * maxbusy="0" |
| * time-to-recover="0"/> |
| * <jk:member |
| * name="node02" |
| * type="ajp13" |
| * host="localhost" |
| * port="7409" |
| * address="127.0.0.1:7409" |
| * activation="ACT" |
| * lbfactor="1" |
| * jvm_route="node02" |
| * redirect="" |
| * domain="" |
| * distance="0" |
| * state="N/A" |
| * lbmult="1" |
| * lbvalue="0" |
| * elected="0" |
| * errors="0" |
| * clienterrors="0" |
| * transferred="0" |
| * readed="0" |
| * busy="0" |
| * maxbusy="0" |
| * time-to-recover="0"/> |
| * <jk:map |
| * type="Wildchar" |
| * uri="/ClusterTest*" |
| * source="JkMount"/> |
| * <jk:map |
| * type="Wildchar" |
| * uri="/myapps*" |
| * source="JkMount"/> |
| * <jk:map |
| * type="Wildchar" |
| * uri="/last*" |
| * source="JkMount"/> |
| * </jk:balancer> |
| * </jk:balancers> |
| * </jk:status> |
| * |
| * |
| * </code> |
| * <br/> |
| * mod_jk 1.2.24 runtime state N/A changed to OK/IDLE:<br/> |
| * <code> |
| * state="OK/IDLE" |
| * </code> |
| * @author Peter Rossbach |
| * @version $Revision$ $Date$ |
| * @since 5.5.10 |
| */ |
| public class JkStatusParser { |
| private static Log log = LogFactory.getLog(JkStatusParser.class); |
| |
| /** |
| * The descriptive information about this implementation. |
| */ |
| private static final String info = "org.apache.jk.status.JkStatusParser/1.1"; |
| |
| /** |
| * Return descriptive information about this implementation and the |
| * corresponding version number, in the format |
| * <code><description>/<version></code>. |
| */ |
| public String getInfo() { |
| |
| return (info); |
| |
| } |
| |
| /** |
| * The <code>Digester</code> instance used to parse registry descriptors. |
| */ |
| public static final Digester digester = createDigester(); |
| |
| public static Digester getDigester() { |
| return digester; |
| } |
| |
| /** |
| * Create and configure the Digester we will be using for setup mod_jk jk status page. |
| */ |
| public static Digester createDigester() { |
| long t1 = System.currentTimeMillis(); |
| // Initialize the digester |
| Digester digester = new Digester(); |
| digester.setValidating(false); |
| digester.setClassLoader(JkStatus.class.getClassLoader()); |
| |
| // parse status |
| digester.addObjectCreate("jk:status", "org.apache.jk.status.JkStatus", |
| "className"); |
| digester.addSetProperties("jk:status"); |
| |
| digester.addObjectCreate("jk:status/jk:server", |
| "org.apache.jk.status.JkServer", "className"); |
| digester.addSetProperties("jk:status/jk:server"); |
| digester.addSetNext("jk:status/jk:server", "setServer", |
| "org.apache.jk.status.JkServer"); |
| |
| digester.addObjectCreate("jk:status/jk:software", |
| "org.apache.jk.status.JkSoftware", "className"); |
| digester.addSetProperties("jk:status/jk:software"); |
| digester.addSetNext("jk:status/jk:software", "setSoftware", |
| "org.apache.jk.status.JkSoftware"); |
| |
| digester.addObjectCreate("jk:status/jk:result", |
| "org.apache.jk.status.JkResult", "className"); |
| digester.addSetProperties("jk:status/jk:result"); |
| digester.addSetNext("jk:status/jk:result", "setResult", |
| "org.apache.jk.status.JkResult"); |
| |
| digester.addObjectCreate("jk:status/jk:balancers/jk:balancer", |
| "org.apache.jk.status.JkBalancer", "className"); |
| digester.addSetProperties("jk:status/jk:balancers/jk:balancer"); |
| digester.addSetNext("jk:status/jk:balancers/jk:balancer", |
| "addBalancer", "org.apache.jk.status.JkBalancer"); |
| |
| digester.addObjectCreate( |
| "jk:status/jk:balancers/jk:balancer/jk:member", |
| "org.apache.jk.status.JkBalancerMember", "className"); |
| digester |
| .addSetProperties("jk:status/jk:balancers/jk:balancer/jk:member"); |
| digester.addSetNext("jk:status/jk:balancers/jk:balancer/jk:member", |
| "addBalancerMember", "org.apache.jk.status.JkBalancerMember"); |
| |
| digester.addObjectCreate("jk:status/jk:balancers/jk:balancer/jk:map", |
| "org.apache.jk.status.JkBalancerMapping", "className"); |
| digester.addSetProperties("jk:status/jk:balancers/jk:balancer/jk:map"); |
| digester.addSetNext("jk:status/jk:balancers/jk:balancer/jk:map", |
| "addBalancerMapping", "org.apache.jk.status.JkBalancerMapping"); |
| |
| long t2 = System.currentTimeMillis(); |
| if (log.isDebugEnabled()) |
| log.debug("Digester for apache mod_jk jkstatus page is created " |
| + (t2 - t1)); |
| return (digester); |
| |
| } |
| |
| } |