blob: 87f4d94510b5ac99ec66741cc30c827ff608d7c4 [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.ClusterManager;
import org.apache.axis2.clustering.ClusteringConstants;
import org.apache.axis2.clustering.Member;
import org.apache.axis2.clustering.LoadBalanceEventHandler;
import org.apache.axis2.clustering.configuration.ConfigurationManager;
import org.apache.axis2.clustering.configuration.ConfigurationManagerListener;
import org.apache.axis2.clustering.context.ContextManager;
import org.apache.axis2.clustering.context.ContextManagerListener;
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();
ClusterManager clusterManager;
try {
Class clazz;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage("clusterImplNotFound",
className));
}
clusterManager = (ClusterManager) clazz.newInstance();
clusterManager.setConfigurationContext(configCtx);
//loading the parameters.
processParameters(clusterElement.getChildrenWithName(new QName(TAG_PARAMETER)),
clusterManager,
null);
// loading the application domains
loadApplicationDomains(clusterManager, clusterElement);
// loading the members
loadWellKnownMembers(clusterManager, clusterElement);
//loading the ConfigurationManager
loadConfigManager(clusterElement, clusterManager);
// loading the ContextManager
loadContextManager(clusterElement, clusterManager);
axisConfig.setClusterManager(clusterManager);
} 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 loadApplicationDomains(ClusterManager clusterManager,
OMElement clusterElement) throws DeploymentException {
OMElement lbEle = clusterElement.getFirstChildWithName(new QName("loadBalancer"));
if (lbEle != null) {
if (isEnabled(lbEle)) {
log.info("Running in load balance 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("handler")).trim();
LoadBalanceEventHandler eventHandler;
try {
eventHandler = (LoadBalanceEventHandler) Class.forName(handlerClass).newInstance();
} catch (Exception e) {
String msg = "Could not instantiate LoadBalanceEventHandler " + handlerClass +
" for domain " + domainName;
log.error(msg, e);
throw new DeploymentException(msg, e);
}
clusterManager.addLoadBalanceEventHandler(eventHandler, domainName);
}
}
}
private void loadWellKnownMembers(ClusterManager clusterManager, OMElement clusterElement) {
clusterManager.setMembers(new ArrayList<Member>());
Parameter membershipSchemeParam = clusterManager.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))));
}
}
clusterManager.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 loadContextManager(OMElement clusterElement,
ClusterManager clusterManager) throws DeploymentException,
InstantiationException,
IllegalAccessException {
OMElement contextManagerEle =
clusterElement.getFirstChildWithName(new QName(TAG_CONTEXT_MANAGER));
if (contextManagerEle != null) {
if (!isEnabled(contextManagerEle)) {
log.info("Clustering context management has been disabled");
return;
}
log.info("Clustering context management has been enabled");
// Load & set the ContextManager class
OMAttribute classNameAttr =
contextManagerEle.getAttribute(new QName(ATTRIBUTE_CLASS));
if (classNameAttr == null) {
throw new DeploymentException(Messages.getMessage("classAttributeNotFound",
TAG_CONTEXT_MANAGER));
}
String className = classNameAttr.getAttributeValue();
Class clazz;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage("clusterImplNotFound",
className));
}
ContextManager contextManager = (ContextManager) clazz.newInstance();
clusterManager.setContextManager(contextManager);
// Load & set the ContextManagerListener
OMElement listenerEle =
contextManagerEle.getFirstChildWithName(new QName(TAG_LISTENER));
if (listenerEle != null) {
classNameAttr = listenerEle.getAttribute(new QName(TAG_CLASS_NAME));
if (classNameAttr == null) {
throw new DeploymentException(Messages.getMessage("classAttributeNotFound",
TAG_LISTENER));
}
className = classNameAttr.getAttributeValue();
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage("clusterImplNotFound",
className));
}
ContextManagerListener listener = (ContextManagerListener) clazz.newInstance();
contextManager.setContextManagerListener(listener);
} else {
throw new DeploymentException(Messages.getMessage("contextManagerListenerIsNull"));
}
//loading the parameters.
processParameters(contextManagerEle.getChildrenWithName(new QName(TAG_PARAMETER)),
contextManager,
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 defaults = new ArrayList();
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());
}
contextManager.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 excludes = new ArrayList();
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());
}
contextManager.setReplicationExcludePatterns(ctxClassName, excludes);
}
}
}
}
private void loadConfigManager(OMElement clusterElement,
ClusterManager clusterManager) throws DeploymentException,
InstantiationException,
IllegalAccessException {
OMElement configManagerEle =
clusterElement.getFirstChildWithName(new QName(TAG_CONFIGURATION_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_CONFIGURATION_MANAGER));
}
String className = classNameAttr.getAttributeValue();
Class clazz;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage("clusterImplNotFound",
className));
}
ConfigurationManager configurationManager =
(ConfigurationManager) clazz.newInstance();
clusterManager.setConfigurationManager(configurationManager);
OMElement listenerEle =
configManagerEle.getFirstChildWithName(new QName(TAG_LISTENER));
if (listenerEle != null) {
classNameAttr = listenerEle.getAttribute(new QName(TAG_CLASS_NAME));
if (classNameAttr == null) {
throw new DeploymentException(Messages.getMessage("clusterImplNotFound",
TAG_LISTENER));
}
className = classNameAttr.getAttributeValue();
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage("configurationManagerListenerIsNull"));
}
ConfigurationManagerListener listener = (ConfigurationManagerListener) clazz
.newInstance();
listener.setConfigurationContext(configCtx);
configurationManager.setConfigurationManagerListener(listener);
} else {
throw new DeploymentException(Messages.getMessage("configurationManagerListenerIsNull"));
}
//updating the ConfigurationManager with the new ConfigurationContext
configurationManager.setConfigurationContext(configCtx);
//loading the parameters.
processParameters(configManagerEle.getChildrenWithName(new QName(TAG_PARAMETER)),
configurationManager,
null);
}
}
}