Package org.apache.stratos.manager.utils

Source Code of org.apache.stratos.manager.utils.PolicyHolder

/*
* 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.stratos.manager.utils;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.om.impl.dom.DOOMAbstractFactory;
import org.apache.axiom.om.impl.dom.ElementImpl;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.manager.dto.Policy;
import org.apache.stratos.manager.dto.PolicyDefinition;
import org.jaxen.JaxenException;
import org.w3c.dom.Element;
import org.wso2.carbon.utils.CarbonUtils;
import org.xml.sax.SAXException;

import com.google.gson.Gson;

public class PolicyHolder {

  private static Log log = LogFactory.getLog(PolicyHolder.class);

  private static final String POLICIES_ELEMENT = "policies";
  private static final String POLICY_ELEMENT = "policy";

  private static final String POLICIES_ELEMENT_XPATH = "/" + POLICIES_ELEMENT + "/" + POLICY_ELEMENT;

  private static final String NAME_ATTR = "name";
  private static final String IS_DEFAULT_ATTR = "isDefault";
  private static final String DESCRIPTION_ELEMENT = "description";
  private static final String MIN_APP_INSTANCES_ELEMENT = "min_app_instances";
  private static final String MAX_APP_INSTANCES_ELEMENT = "max_app_instances";
  private static final String MAX_REQUESTS_PER_SECOND_ELEMENT = "max_requests_per_second";
  private static final String ALARMING_UPPER_RATE_ELEMENT = "alarming_upper_rate";
  private static final String ALARMING_LOWER_RATE_ELEMENT = "alarming_lower_rate";
  private static final String SCALE_DOWN_FACTOR_ELEMENT = "scale_down_factor";
  private static final String ROUNDS_TO_AVERAGE_ELEMENT = "rounds_to_average";

  private Map<String, Policy> policyMap = new HashMap<String, Policy>();

  private Policy defaultPolicy;

  private List<PolicyDefinition> policyDefinitions = new ArrayList<PolicyDefinition>();

  private PolicyHolder(File policiesSchema, File policiesXML) {
    try {
      readPolicies(policiesSchema, policiesXML);
    } catch (Exception e) {
      log.error("Error reading policies", e);
    }
  }

  private static class SingletonHolder {
    private final static PolicyHolder INSTANCE = new PolicyHolder(new File(CarbonUtils.getCarbonConfigDirPath()
        + File.separator + "etc" + File.separator, "policies.xsd"), new File(
        CarbonUtils.getCarbonConfigDirPath(), "policies.xml"));
  }

  public static PolicyHolder getInstance() {
    return SingletonHolder.INSTANCE;
  }

  public Policy getPolicy(String policyName) {
    return policyMap.get(policyName);
  }

  public Policy getDefaultPolicy() {
    return defaultPolicy;
  }

  public List<PolicyDefinition> getPolicyDefinitions() {
    return policyDefinitions;
  }

  private void readPolicies(File policiesSchema, File policiesXML) throws XMLStreamException, JaxenException,
      SAXException, IOException {
    if (log.isDebugEnabled()) {
      log.debug("Policies schema: " + policiesSchema.getPath());
      log.debug("Loading policies from file: " + policiesXML.getPath());
    }
    OMElement documentElement;
    if (policiesXML.exists()) {
      documentElement = new StAXOMBuilder(policiesXML.getPath()).getDocumentElement();
    } else {
      throw new IllegalStateException("Policies file cannot be found : " + policiesXML.getPath());
    }

    // Validate XML
    validate(documentElement, policiesSchema);
   
    String xpath = POLICIES_ELEMENT_XPATH;

    AXIOMXPath axiomXpath;
    axiomXpath = new AXIOMXPath(xpath);
    @SuppressWarnings("unchecked")
    List<OMNode> policyNodes = axiomXpath.selectNodes(documentElement);

    if (policyNodes == null || policyNodes.isEmpty()) {
      log.warn("No policies found in the file : " + policiesXML.getPath());
      return;
    }

    for (OMNode policyNode : policyNodes) {

      if (policyNode.getType() == OMNode.ELEMENT_NODE) {

        OMElement policyElement = (OMElement) policyNode;

        try {
          readPolicy(policyElement);
        } catch (Exception e) {
          log.error("Error reading policy", e);
        }
      }
    }
  }

  private void readPolicy(OMElement policyElement) {
    // retrieve attributes
    String name = policyElement.getAttributeValue(new QName(NAME_ATTR));
    boolean isDefault = Boolean.valueOf(policyElement.getAttributeValue(new QName(IS_DEFAULT_ATTR)));

    Policy policy = new Policy();
    policy.setName(name);
    policy.setDefaultPolicy(isDefault);

    // read description
    Iterator<?> it = policyElement.getChildrenWithName(new QName(DESCRIPTION_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setDescription(element.getText());
    }

    // read min_app_instances
    it = policyElement.getChildrenWithName(new QName(MIN_APP_INSTANCES_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setMinAppInstances(Integer.parseInt(element.getText()));
    }

    // read max_app_instances
    it = policyElement.getChildrenWithName(new QName(MAX_APP_INSTANCES_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setMaxAppInstances(Integer.parseInt(element.getText()));
    }

    // read max_requests_per_second
    it = policyElement.getChildrenWithName(new QName(MAX_REQUESTS_PER_SECOND_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setMaxRequestsPerSecond(Integer.parseInt(element.getText()));
    }

    // read rounds_to_average
    it = policyElement.getChildrenWithName(new QName(ROUNDS_TO_AVERAGE_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setRoundsToAverage(Integer.parseInt(element.getText()));
    }

    // read alarming_upper_rate
    it = policyElement.getChildrenWithName(new QName(ALARMING_UPPER_RATE_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setAlarmingUpperRate(new BigDecimal(element.getText()));
    }

    // read alarming_lower_rate
    it = policyElement.getChildrenWithName(new QName(ALARMING_LOWER_RATE_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setAlarmingLowerRate(new BigDecimal(element.getText()));
    }

    // read scale_down_factor
    it = policyElement.getChildrenWithName(new QName(SCALE_DOWN_FACTOR_ELEMENT));

    if (it.hasNext()) {
      OMElement element = (OMElement) it.next();
      policy.setScaleDownFactor(new BigDecimal(element.getText()));
    }
    if (log.isDebugEnabled()) {
      log.debug("Policy: " + new Gson().toJson(policy));
    }

    policyMap.put(policy.getName(), policy);
    PolicyDefinition policyDefinition = new PolicyDefinition();
    policyDefinition.setName(policy.getName());
    policyDefinition.setDescription(policy.getDescription());
    policyDefinition.setDefaultPolicy(policy.isDefaultPolicy());
    policyDefinitions.add(policyDefinition);
   
    // Set first default policy
    if (defaultPolicy == null && policy.isDefaultPolicy()) {
      defaultPolicy = policy;
    }
  }
 
  // TODO Following code is copied from
  // org.wso2.carbon.stratos.cloud.controller.axiom.AxiomXpathParser
  // There should be a common util to validate XML using a schema.
  public void validate(final OMElement omElement, final File schemaFile) throws SAXException, IOException {

    Element sourceElement;

    // if the OMElement is created using DOM implementation use it
    if (omElement instanceof ElementImpl) {
      sourceElement = (Element) omElement;
    } else { // else convert from llom to dom
      sourceElement = getDOMElement(omElement);
    }

    // Create a SchemaFactory capable of understanding WXS schemas.

    // Load a WXS schema, represented by a Schema subscription.
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Source source = new StreamSource(schemaFile);

    // Create a Validator object, which can be used to validate
    // an subscription document.
    Schema schema = factory.newSchema(source);
    Validator validator = schema.newValidator();

    // Validate the DOM tree.
    validator.validate(new DOMSource(sourceElement));
  }

  private Element getDOMElement(final OMElement omElement) {

    // Get the StAX reader from the created element
    XMLStreamReader llomReader = omElement.getXMLStreamReader();

    // Create the DOOM OMFactory
    OMFactory doomFactory = DOOMAbstractFactory.getOMFactory();

    // Create the new builder
    StAXOMBuilder doomBuilder = new StAXOMBuilder(doomFactory, llomReader);

    // Get the document element
    OMElement newElem = doomBuilder.getDocumentElement();

    return newElem instanceof Element ? (Element) newElem : null;
  }
}
TOP

Related Classes of org.apache.stratos.manager.utils.PolicyHolder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.