/*
* Copyright 2005,2006 WSO2, Inc. http://wso2.com
*
* Licensed 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.synapse.commons.throttle.module;
import org.apache.axis2.AxisFault;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.*;
import org.apache.axis2.modules.Module;
import org.apache.axis2.util.PolicyUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.neethi.Assertion;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyEngine;
import org.apache.synapse.commons.throttle.core.*;
import java.io.InputStream;
import java.util.*;
public class ThrottleModule implements Module {
private static Log log = LogFactory.getLog(ThrottleModule.class.getName());
private Policy defaultPolicy = null;
private Throttle defaultThrottle = null;
private ConfigurationContext configctx;
/**
* initialize the module
*/
public void init(ConfigurationContext configContext, AxisModule module) throws AxisFault {
this.configctx = configContext;
initDefaultPolicy();
initDefaultThrottle();
Throttle throttle;
ThrottleObserver observer = new ThrottleObserver(configctx, defaultThrottle);
AxisConfiguration axisConfiguration = configctx.getAxisConfiguration();
axisConfiguration.addObservers(observer);
/**
* Global policy can be configured through the axis2.xml as well. If it is configured, we
* give priority to that policy over the one coming from the module.xml.
* This is done to allow user to modify the global policy without editing the module.xml
* of the throttle module.
*/
PolicySubject policySubject =
ThrottleEnguageUtils.readExternalGlobalPolicy(axisConfiguration);
if (policySubject == null) {
policySubject = module.getPolicySubject();
}
if (policySubject != null) {
List list = new ArrayList(policySubject.getAttachedPolicyComponents());
Policy policy = PolicyUtil.getMergedPolicy(list, null);
if (policy != null) {
try {
throttle = ThrottleFactory.createModuleThrottle(policy);
}
catch (ThrottleException e) {
log.error("Error was occurred when initiating throttle" +
" module " + e.getMessage());
log.info("Throttling will occur using default module policy");
String id = policy.getId();
policySubject.detachPolicyComponent(id);
defaultPolicy.setId(id);
policySubject.attachPolicy(defaultPolicy);
throttle = defaultThrottle;
}
if (throttle != null) {
Map throttles =
(Map) configctx.getPropertyNonReplicable(
ThrottleConstants.THROTTLES_MAP);
if (throttles == null) {
throttles = new HashMap();
configctx.setNonReplicableProperty(ThrottleConstants.THROTTLES_MAP,
throttles);
}
throttle.setId(ThrottleConstants.GLOBAL_THROTTLE_ID);
throttles.put(ThrottleConstants.GLOBAL_THROTTLE_KEY, throttle);
ConcurrentAccessController cac = throttle.getConcurrentAccessController();
if (cac != null) {
String cacKey = ThrottleConstants.THROTTLE_PROPERTY_PREFIX
+ ThrottleConstants.GLOBAL_THROTTLE_ID +
ThrottleConstants.CAC_SUFFIX;
configctx.setProperty(cacKey, cac);
}
}
}
}
}
public void engageNotify(AxisDescription axisDescription) throws AxisFault {
ThrottleEnguageUtils.enguage(axisDescription, configctx, defaultThrottle);
}
public void shutdown(ConfigurationContext configurationContext) throws AxisFault {
//Todo
}
public void applyPolicy(Policy policy, AxisDescription axisDescription) throws AxisFault {
// TODO
}
public boolean canSupportAssertion(Assertion assertion) {
// TODO
return true;
}
private void initDefaultPolicy() throws AxisFault {
InputStream inputStream =
this.getClass().getResourceAsStream("/resources/policy/default_module_policy.xml");
if (inputStream != null) {
defaultPolicy = PolicyEngine.getPolicy(inputStream);
} else {
throw new AxisFault("Couldn't load the default throttle policy.The module is invalid ");
}
}
private void initDefaultThrottle() throws AxisFault {
try {
if (defaultPolicy != null) {
defaultThrottle = ThrottleFactory.createModuleThrottle(defaultPolicy);
if (defaultThrottle == null) {
throw new AxisFault("Couldn't create the default throttle" +
".The module is invalid ");
}
} else {
throw new AxisFault("Couldn't find the default throttle policy " +
".the module is invalid ");
}
} catch (ThrottleException e) {
String msg = "Error during processing default throttle policy + system will not works" +
e.getMessage();
log.error(msg);
throw new AxisFault(msg);
}
}
/*
private Policy getThrottlePolicy(Collection components) throws AxisFault {
QName assertionName;
//Finds the policy for throttling
Iterator i = components.iterator();
while (i.hasNext()) {
Object comp = i.next();
// }
// for (Object comp : components) {
Policy policy = (Policy) comp;
for (Iterator iterator = policy.getAlternatives();
iterator.hasNext();) {
Object object = iterator.next();
if (object instanceof List) {
List list = (List) object;
Iterator j = list.iterator();
while (j.hasNext()) {
// for (Object assertObj : list) {
Object assertObj = j.next();
if (assertObj instanceof XmlPrimtiveAssertion) {
XmlPrimtiveAssertion primitiveAssertion = (XmlPrimtiveAssertion)
assertObj;
assertionName = primitiveAssertion.getName();
if (assertionName.equals(ThrottleConstants
.SERVICE_THROTTLE_ASSERTION_QNAME) || assertionName
.equals(ThrottleConstants.MODULE_THROTTLE_ASSERTION_QNAME)) {
if (log.isDebugEnabled()) {
log.debug("Existing ThrottleAssertion found");
}
return policy;
}
}
}
}
}
}
return null;
}
*/
}