/* * 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.axis2.deployment; import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.axis2.clustering.ClusteringAgent; import org.apache.axis2.clustering.ClusteringConstants; import org.apache.axis2.clustering.Member; import org.apache.axis2.clustering.management.GroupManagementAgent; import org.apache.axis2.clustering.management.NodeManager; import org.apache.axis2.clustering.state.StateManager; import org.apache.axis2.description.Parameter; import org.apache.axis2.engine.AxisConfiguration; import org.apache.axis2.i18n.Messages; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Builds the cluster configuration from the axis2.xml file */ public class ClusterBuilder extends DescriptionBuilder { private static final Log log = LogFactory.getLog(ClusterBuilder.class); public ClusterBuilder(AxisConfiguration axisConfig) { this.axisConfig = axisConfig; } /** * Build the cluster configuration * * @param clusterElement Cluster element * @throws DeploymentException If an error occurs while building the cluster configuration */ public void buildCluster(OMElement clusterElement) throws DeploymentException { if (!isEnabled(clusterElement)) { log.info("Clustering has been disabled"); return; } log.info("Clustering has been enabled"); OMAttribute classNameAttr = clusterElement.getAttribute(new QName(TAG_CLASS_NAME)); if (classNameAttr == null) { throw new DeploymentException(Messages.getMessage("classAttributeNotFound", TAG_CLUSTER)); } String className = classNameAttr.getAttributeValue(); ClusteringAgent clusteringAgent; try { Class clazz; try { clazz = Class.forName(className); } catch (ClassNotFoundException e) { throw new DeploymentException(Messages.getMessage("clusterImplNotFound", className)); } clusteringAgent = (ClusteringAgent) clazz.newInstance(); clusteringAgent.setConfigurationContext(configCtx); //loading the parameters. processParameters(clusterElement.getChildrenWithName(new QName(TAG_PARAMETER)), clusteringAgent, null); // loading the application domains loadGroupManagement(clusteringAgent, clusterElement); // loading the members loadWellKnownMembers(clusteringAgent, clusterElement); //loading the NodeManager loadNodeManager(clusterElement, clusteringAgent); // loading the StateManager loadStateManager(clusterElement, clusteringAgent); axisConfig.setClusteringAgent(clusteringAgent); } catch (InstantiationException e) { throw new DeploymentException(Messages.getMessage("cannotLoadClusterImpl")); } catch (IllegalAccessException e) { throw new DeploymentException(e); } } private boolean isEnabled(OMElement element) { boolean enabled = true; OMAttribute enableAttr = element.getAttribute(new QName("enable")); if (enableAttr != null) { enabled = Boolean.parseBoolean(enableAttr.getAttributeValue().trim()); } return enabled; } private void loadGroupManagement(ClusteringAgent clusteringAgent, OMElement clusterElement) throws DeploymentException { OMElement lbEle = clusterElement.getFirstChildWithName(new QName("groupManagement")); if (lbEle != null) { if (isEnabled(lbEle)) { log.info("Running in group management mode"); } else { log.info("Running in application mode"); return; } for (Iterator iter = lbEle.getChildrenWithName(new QName("applicationDomain")); iter.hasNext();) { OMElement omElement = (OMElement) iter.next(); String domainName = omElement.getAttributeValue(new QName("name")).trim(); String handlerClass = omElement.getAttributeValue(new QName("agent")).trim(); String descAttrib = omElement.getAttributeValue(new QName("description")); String description = "Description not found"; if (descAttrib != null) { description = descAttrib.trim(); } GroupManagementAgent eventHandler; try { eventHandler = (GroupManagementAgent) Class.forName(handlerClass).newInstance(); eventHandler.setDescription(description); } catch (Exception e) { String msg = "Could not instantiate GroupManagementAgent " + handlerClass + " for domain " + domainName; log.error(msg, e); throw new DeploymentException(msg, e); } clusteringAgent.addGroupManagementAgent(eventHandler, domainName); } } } private void loadWellKnownMembers(ClusteringAgent clusteringAgent, OMElement clusterElement) { clusteringAgent.setMembers(new ArrayList<Member>()); Parameter membershipSchemeParam = clusteringAgent.getParameter("membershipScheme"); if (membershipSchemeParam != null) { String membershipScheme = ((String) membershipSchemeParam.getValue()).trim(); if (membershipScheme.equals(ClusteringConstants.MembershipScheme.WKA_BASED)) { List<Member> members = new ArrayList<Member>(); OMElement membersEle = clusterElement.getFirstChildWithName(new QName("members")); if (membersEle != null) { for (Iterator iter = membersEle.getChildrenWithLocalName("member"); iter.hasNext();) { OMElement memberEle = (OMElement) iter.next(); String hostName = memberEle.getFirstChildWithName(new QName("hostName")).getText().trim(); String port = memberEle.getFirstChildWithName(new QName("port")).getText().trim(); members.add(new Member(replaceVariables(hostName), Integer.parseInt(replaceVariables(port)))); } } clusteringAgent.setMembers(members); } } } private String replaceVariables(String text) { int indexOfStartingChars; int indexOfClosingBrace; // The following condition deals with properties. // Properties are specified as ${system.property}, // and are assumed to be System properties if ((indexOfStartingChars = text.indexOf("${")) != -1 && (indexOfClosingBrace = text.indexOf("}")) != -1) { // Is a property used? String var = text.substring(indexOfStartingChars + 2, indexOfClosingBrace); String propValue = System.getProperty(var); if (propValue == null) { propValue = System.getenv(var); } if (propValue != null) { text = text.substring(0, indexOfStartingChars) + propValue + text.substring(indexOfClosingBrace + 1); } } return text; } private void loadStateManager(OMElement clusterElement, ClusteringAgent clusteringAgent) throws DeploymentException, InstantiationException, IllegalAccessException { OMElement contextManagerEle = clusterElement.getFirstChildWithName(new QName(TAG_STATE_MANAGER)); if (contextManagerEle != null) { if (!isEnabled(contextManagerEle)) { log.info("Clustering state management has been disabled"); return; } log.info("Clustering state management has been enabled"); // Load & set the StateManager class OMAttribute classNameAttr = contextManagerEle.getAttribute(new QName(ATTRIBUTE_CLASS)); if (classNameAttr == null) { throw new DeploymentException(Messages.getMessage("classAttributeNotFound", TAG_STATE_MANAGER)); } String className = classNameAttr.getAttributeValue(); Class clazz; try { clazz = Class.forName(className); } catch (ClassNotFoundException e) { throw new DeploymentException(Messages.getMessage("clusterImplNotFound", className)); } StateManager stateManager = (StateManager) clazz.newInstance(); clusteringAgent.setStateManager(stateManager); //loading the parameters. processParameters(contextManagerEle.getChildrenWithName(new QName(TAG_PARAMETER)), stateManager, null); // Load the replication patterns to be excluded. We load the following structure. /*<replication> <defaults> <exclude name="foo.bar.*"/> </defaults> <context class="org.apache.axis2.context.ConfigurationContext"> <exclude name="my.sandesha.*"/> </context> <context class="org.apache.axis2.context.ServiceGroupContext"> <exclude name="my.sandesha.*"/> </context> <context class="org.apache.axis2.context.ServiceContext"> <exclude name="my.sandesha.*"/> </context> </replication>*/ OMElement replicationEle = contextManagerEle.getFirstChildWithName(new QName(TAG_REPLICATION)); if (replicationEle != null) { // Process defaults OMElement defaultsEle = replicationEle.getFirstChildWithName(new QName(TAG_DEFAULTS)); if (defaultsEle != null) { List<String> defaults = new ArrayList<String>(); for (Iterator iter = defaultsEle.getChildrenWithName(new QName(TAG_EXCLUDE)); iter.hasNext();) { OMElement excludeEle = (OMElement) iter.next(); OMAttribute nameAtt = excludeEle.getAttribute(new QName(ATTRIBUTE_NAME)); defaults.add(nameAtt.getAttributeValue()); } stateManager.setReplicationExcludePatterns(TAG_DEFAULTS, defaults); } // Process specifics for (Iterator iter = replicationEle.getChildrenWithName(new QName(TAG_CONTEXT)); iter.hasNext();) { OMElement contextEle = (OMElement) iter.next(); String ctxClassName = contextEle.getAttribute(new QName(ATTRIBUTE_CLASS)).getAttributeValue(); List<String> excludes = new ArrayList<String>(); for (Iterator iter2 = contextEle.getChildrenWithName(new QName(TAG_EXCLUDE)); iter2.hasNext();) { OMElement excludeEle = (OMElement) iter2.next(); OMAttribute nameAtt = excludeEle.getAttribute(new QName(ATTRIBUTE_NAME)); excludes.add(nameAtt.getAttributeValue()); } stateManager.setReplicationExcludePatterns(ctxClassName, excludes); } } } } private void loadNodeManager(OMElement clusterElement, ClusteringAgent clusteringAgent) throws DeploymentException, InstantiationException, IllegalAccessException { OMElement configManagerEle = clusterElement.getFirstChildWithName(new QName(TAG_NODE_MANAGER)); if (configManagerEle != null) { if (!isEnabled(configManagerEle)) { log.info("Clustering configuration management has been disabled"); return; } log.info("Clustering configuration management has been enabled"); OMAttribute classNameAttr = configManagerEle.getAttribute(new QName(ATTRIBUTE_CLASS)); if (classNameAttr == null) { throw new DeploymentException(Messages.getMessage("classAttributeNotFound", TAG_NODE_MANAGER)); } String className = classNameAttr.getAttributeValue(); Class clazz; try { clazz = Class.forName(className); } catch (ClassNotFoundException e) { throw new DeploymentException(Messages.getMessage("clusterImplNotFound", className)); } NodeManager nodeManager = (NodeManager) clazz.newInstance(); clusteringAgent.setNodeManager(nodeManager); //updating the NodeManager with the new ConfigurationContext nodeManager.setConfigurationContext(configCtx); //loading the parameters. processParameters(configManagerEle.getChildrenWithName(new QName(TAG_PARAMETER)), nodeManager, null); } } }