blob: ea6019d53b64553dad0f1189a56dd2b73fa8bf65 [file] [log] [blame]
/*
* 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);
}
}
}