/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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.wso2.carbon.mediator.throttle.client; import org.wso2.carbon.mediators.throttle.admin.stub.ThrottleAdminServiceStub; import org.wso2.carbon.mediators.throttle.admin.stub.ThrottleComponentExceptionException; import org.wso2.carbon.mediators.throttle.admin.stub.types.InternalData; import org.wso2.carbon.mediators.throttle.admin.stub.types.ThrottlePolicy; import org.wso2.carbon.ui.CarbonUIMessage; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.AxisFault; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.*; import java.rmi.RemoteException; import javax.servlet.http.HttpServletRequest; public class ThrottleClient { private ThrottleAdminServiceStub stub; private ResourceBundle bundle; private static final String BUNDLE = "org.wso2.carbon.mediator.throttle.ui.i18n.Resources"; private static final Log log = LogFactory.getLog(ThrottleClient.class); public ThrottleClient(String cookie, String backendServerURL, ConfigurationContext configCtx, Locale locale) throws AxisFault { String serviceURL = backendServerURL + "ThrottleAdminService"; bundle = ResourceBundle.getBundle(BUNDLE, locale); stub = new ThrottleAdminServiceStub(configCtx, serviceURL); ServiceClient client = stub._getServiceClient(); Options option = client.getOptions(); option.setManageSession(true); option.setProperty(org.apache.axis2.transport.http.HTTPConstants.COOKIE_STRING, cookie); } public void updateBackEnd(HttpServletRequest request) throws AxisFault, NumberFormatException { String service = request.getParameter("serviceName"); String operation = request.getParameter("opName"); String policyID = request.getParameter("policyID"); boolean global = false; boolean operationLevel = false; boolean mediator = policyID != null && !"".equals(policyID); boolean engagedAtHigherLevel = false; if (!mediator) { if (service == null) { global = true; } else if (service != null && operation != null) { operationLevel = true; } } /** * If throttling is enabled on the UI, fill the configs in to an * Array of InternalData */ try { if ("Yes".equals(request.getParameter("enable"))) { ArrayList<InternalData> list = new ArrayList<InternalData>(); String value = ""; int i = 0; while (value != null) { i++; InternalData temp = new InternalData(); if (request.getParameter("data" + i + "1") == null) { break; } for (int j = 1; j < 7; j++) { value = request.getParameter("data" + i + "" + j); if (value != null && !value.equals("")) { switch (j) { case 1: temp.setRange(value); break; case 2: temp.setMaxRequestCount(Integer.parseInt(value)); break; case 3: temp.setUnitTime(Integer.parseInt(value)); break; case 4: temp.setProhibitTimePeriod(Integer.parseInt(value)); break; case 5: if (value.equals("Control")) { temp.setAccessLevel(0); } else if (value.equals("Deny")) { temp.setAccessLevel(1); } else { temp.setAccessLevel(2); } break; case 6: temp.setRangeType(value); break; default: } } } list.add(temp); } InternalData[] data = new InternalData[list.size()]; for (int p = 0; p < list.size(); p++) { data[p] = list.get(p); } //Create a ThrottlePolicy object to be sent ThrottlePolicy policy = new ThrottlePolicy(); policy.setEngaged(true); policy.setInternalConfigs(data); if (request.getParameter("maxAccess") != null && !request.getParameter("maxAccess").equals("")) { policy.setMaxConcurrentAccesses(Integer.parseInt(request.getParameter("maxAccess"))); } if (global) { stub.globallyEngageThrottling(policy); } else if (operationLevel) { engagedAtHigherLevel = stub.engageThrottlingForOperation(policy, service, operation); } else if (mediator) { String policyXMl = stub.throttlePolicyToString(policy); if (policyXMl != null && !"".equals(policyXMl)) { Map policyXMLMap = (Map) request.getSession().getAttribute("throttle_policy_map"); if (policyXMLMap == null) { policyXMLMap = new HashMap(); } policyXMLMap.put(policyID, policyXMl); request.getSession().setAttribute("throttle_policy_map", policyXMLMap); } } else { stub.enableThrottling(service, policy); } } else { //If throttling is not enabled, send a disable call if (global) { stub.disengageGlobalThrottling(); } else if (operationLevel) { engagedAtHigherLevel = stub.disengageThrottlingForOperation(service, operation); } else { stub.disableThrottling(service); } } String msg; if (engagedAtHigherLevel) { msg = bundle.getString("throttling.applied.at.higher.level"); CarbonUIMessage.sendCarbonUIMessage(msg, CarbonUIMessage.WARNING, request); } else { msg = bundle.getString("throttling.successfully.applied"); CarbonUIMessage.sendCarbonUIMessage(msg, CarbonUIMessage.INFO, request); } } catch (NumberFormatException e) { String msg = bundle.getString("throttling.numbers.invalid"); log.error(msg); CarbonUIMessage.sendCarbonUIMessage(msg, CarbonUIMessage.WARNING, request); throw e; } catch (Exception e) { String msg = bundle.getString("throttling.error.while.communication.with.back.end"); handleException(msg, e); } } public ThrottlePolicy getExistingConfigs(HttpServletRequest request, boolean global, boolean operationLevel) throws AxisFault { ThrottlePolicy policy = null; try { String service = request.getParameter("serviceName"); String operation = request.getParameter("opName"); String loadDef = request.getParameter("loadDefault"); ThrottlePolicy defThrottlePolicy= getDefaultThrottlePolicy(); if (loadDef != null && loadDef.equals("true")) { //Set a default policy defThrottlePolicy.setEngaged(true); policy = defThrottlePolicy; } else { if (global) { policy = stub.getGlobalPolicyConfigs(); } else if (operationLevel) { policy = stub.getOperationPolicyConfigs(service, operation); } else { policy = stub.getPolicyConfigs(service); } if (!policy.getEngaged() && policy.getMaxConcurrentAccesses() == 0 && (policy.getInternalConfigs() == null || policy.getInternalConfigs()[0] == null)) { policy = defThrottlePolicy; } } } catch (Exception e) { String msg = bundle.getString("throttling.cannot.get.existing.data"); handleException(msg, e); } return policy; } public ThrottlePolicy toThrottlePolicy(String xml, String loadDefault) throws RemoteException, ThrottleComponentExceptionException { if (xml == null || "".equals(xml) || "true".equals(loadDefault)) { return getDefaultThrottlePolicy(); } else { return stub.toThrottlePolicy(xml); } } public String throttlePolicyToString(ThrottlePolicy throttlePolicy) throws RemoteException, ThrottleComponentExceptionException { return stub.throttlePolicyToString(throttlePolicy); } private ThrottlePolicy getDefaultThrottlePolicy() { ThrottlePolicy defThrottlePolicy = new ThrottlePolicy(); InternalData[] defData = new InternalData[2]; defThrottlePolicy.setInternalConfigs(defData); defData[0] = new InternalData(); defData[0].setRange("other"); defData[0].setRangeType("IP"); defData[0].setAccessLevel(2); defData[1] = new InternalData(); defData[1].setRange("other"); defData[1].setRangeType("DOMAIN"); defData[1].setAccessLevel(2); return defThrottlePolicy; } private void handleException(String msg, Exception e) throws AxisFault { log.error(msg, e); throw new AxisFault(msg, e); } }