You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2013/07/10 13:12:20 UTC
[05/14] versions of components are set to 3.0.0-SNAPSHOT
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/axiom/AxiomXpathParser.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/axiom/AxiomXpathParser.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/axiom/AxiomXpathParser.java
new file mode 100644
index 0000000..92ca7d0
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/axiom/AxiomXpathParser.java
@@ -0,0 +1,1263 @@
+/*
+ * Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.axiom;
+
+import java.io.File;
+import java.util.ArrayList;
+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.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.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.AppType;
+import org.apache.stratos.cloud.controller.util.Cartridge;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.PortMapping;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jaxen.JaxenException;
+import org.w3c.dom.Element;
+import org.apache.stratos.cloud.controller.exception.MalformedConfigurationFileException;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.cloud.controller.util.IaasProvider;
+import org.apache.stratos.cloud.controller.util.ServiceContext;
+import org.wso2.securevault.SecretResolver;
+import org.wso2.securevault.SecretResolverFactory;
+
+/**
+ * This class is parsing configuration files using Axiom Xpath.
+ */
+public class AxiomXpathParser {
+
+ private static final Log log = LogFactory.getLog(AxiomXpathParser.class);
+ private OMElement documentElement;
+ private final File xmlSource;
+
+ public AxiomXpathParser(final File xmlFile) {
+ xmlSource = xmlFile;
+ }
+
+ /**
+ * @param cartridgeElement Cartridges section as a {@link String}
+ * @param aCartridge {@link org.apache.stratos.cloud.controller.util.Cartridge} instance.
+ * @param appTypesNodes nodes of App types.
+ */
+ private void getAppTypes(String cartridgeElementString, Cartridge aCartridge,
+ List<?> appTypesNodes) {
+ Object nodeObj;
+ if (!appTypesNodes.isEmpty()) {
+ if ((nodeObj = appTypesNodes.get(0)) instanceof OMNode) {
+ OMNode appTypeNode = (OMNode) nodeObj;
+
+ if (appTypeNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement appTypesElt = (OMElement) appTypeNode;
+
+ for (Iterator<?> iterator =
+ appTypesElt.getChildrenWithName(new QName(
+ CloudControllerConstants.APP_TYPE_ELEMENT)); iterator.hasNext();) {
+ OMElement appElt = (OMElement) iterator.next();
+
+ String name =
+ appElt.getAttributeValue(new QName(
+ CloudControllerConstants.NAME_ATTR));
+ String appSpecificMapping =
+ appElt.getAttributeValue(new QName(
+ CloudControllerConstants.APP_SPECIFIC_MAPPING_ATTR));
+
+ AppType appType;
+
+ if (appSpecificMapping == null) {
+ appType = new AppType(name);
+ } else {
+ appType =
+ new AppType(name,
+ Boolean.valueOf(appSpecificMapping));
+ }
+
+ aCartridge.addAppType(appType);
+ }
+
+ } else {
+ String msg =
+ "Essential '" + CloudControllerConstants.APP_TYPE_ELEMENT +
+ "' element cannot" + " be found in " +
+ cartridgeElementString + " of " +
+ xmlSource;
+ handleException(msg);
+ }
+
+ }
+ }
+ }
+
+ /**
+ * @return a List of {@link Cartridge}s.
+ */
+ public List<Cartridge> getCartridgesList() {
+
+ FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+
+ List<IaasProvider> iaasProviders = dataHolder.getIaasProviders();
+
+ if (iaasProviders == null) {
+ dataHolder.setIaasProviders((iaasProviders = new ArrayList<IaasProvider>()));
+ }
+
+ List<Cartridge> cartridges = new ArrayList<Cartridge>();
+
+ String xpath = CloudControllerConstants.CARTRIDGES_ELEMENT_XPATH;
+
+ // cartridges can be found from this XPATH
+ List<?> cartridgeNodes = getMatchingNodes(xpath, documentElement);
+
+ if (cartridgeNodes == null || cartridgeNodes.isEmpty()) {
+ // or from this XPATH
+ xpath = CloudControllerConstants.CARTRIDGE_ELEMENT_XPATH;
+ cartridgeNodes = getMatchingNodes(xpath, documentElement);
+ }
+
+ if (cartridgeNodes == null || cartridgeNodes.isEmpty()) {
+ log.warn("No cartridge found in this configuration file : " + xmlSource.getPath());
+ return cartridges;
+ }
+
+ for (Object obj : cartridgeNodes) {
+
+ if (obj instanceof OMNode) {
+ OMNode cartridgeNode = (OMNode) obj;
+
+ if (cartridgeNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement cartridgeElement = (OMElement) cartridgeNode;
+
+ // retrieve Attributes of a Cartridge definition
+ String type = cartridgeElement.getAttributeValue(new QName(
+ CloudControllerConstants.TYPE_ATTR));
+ String host = cartridgeElement.getAttributeValue(new QName(
+ CloudControllerConstants.HOST_ATTR));
+ String provider = cartridgeElement.getAttributeValue(new QName(
+ CloudControllerConstants.PROVIDER_ATTR));
+
+ String version =
+ cartridgeElement.getAttributeValue(new QName(
+ CloudControllerConstants.VERSION_ATTR));
+
+ boolean multiTenant = Boolean.valueOf(cartridgeElement.getAttributeValue(new QName(
+ CloudControllerConstants.MULTI_TENANT_ATTR)));
+
+ Cartridge aCartridge;
+
+ if ((aCartridge = dataHolder.getCartridge(type)) == null) {
+
+ aCartridge = new Cartridge(type, host, provider, version, multiTenant);
+ }
+
+ // read displayName
+ Iterator<?> itName =
+ cartridgeElement.getChildrenWithName(new QName(
+ CloudControllerConstants.DISPLAY_NAME_ELEMENT));
+
+ if (itName.hasNext()) {
+ OMElement name = (OMElement) itName.next();
+
+ aCartridge.setDisplayName(name.getText());
+ }
+
+ // read description
+ Iterator<?> it =
+ cartridgeElement.getChildrenWithName(new QName(
+ CloudControllerConstants.DESCRIPTION_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement desc = (OMElement) it.next();
+
+ aCartridge.setDescription(desc.getText());
+ }
+
+ // load properties of this cartridge
+ loadProperties(cartridgeElement, aCartridge.getProperties());
+
+ // retrieve the list of IaaS providers
+ List<?> iaasProviderNodes = getMatchingNodes(xpath + CloudControllerConstants.IAAS_PROVIDER_ELEMENT_XPATH,
+ cartridgeElement);
+
+ getIaasProviders(iaasProviders, cartridgeElement.toString(), aCartridge, iaasProviderNodes);
+
+ // load dirs
+ List<?> deploymentNodes = getMatchingNodes(xpath + CloudControllerConstants.DEPLOYMENT_ELEMENT_XPATH,
+ cartridgeElement);
+ setDeploymentDirs(cartridgeElement.toString(), aCartridge, deploymentNodes);
+
+ // load port mappings
+ List<?> portMappingNodes =
+ getMatchingNodes(xpath +
+ CloudControllerConstants.PORT_MAPPING_ELEMENT_XPATH,
+ cartridgeElement);
+ getPortMappings(cartridgeElement.toString(), aCartridge, portMappingNodes);
+
+ // load appTypes
+ List<?> appTypesNodes =
+ getMatchingNodes(xpath +
+ CloudControllerConstants.APP_TYPES_ELEMENT_XPATH,
+ cartridgeElement);
+ getAppTypes(cartridgeElement.toString(), aCartridge, appTypesNodes);
+
+ cartridges.add(aCartridge);
+
+ if (dataHolder.getCartridge(type) == null) {
+ dataHolder.addCartridge(aCartridge);
+ }
+ }
+ }
+ }
+
+ return cartridges;
+
+ }
+
+ /**
+ * @param iaasProviders
+ * @param cartridgeElementString
+ * @param aCartridge
+ * @param iaasProviderNodes
+ */
+ private void getIaasProviders(List<IaasProvider> iaasProviders,
+ String cartridgeElementString, Cartridge aCartridge,
+ List<?> iaasProviderNodes) {
+ for (Object nodeObj : iaasProviderNodes) {
+ if (nodeObj instanceof OMNode) {
+ OMNode iaasProviderNode = (OMNode) nodeObj;
+
+ if (iaasProviderNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement iaasElt = (OMElement) iaasProviderNode;
+
+ // add the IaasProvider to this cartridge
+ aCartridge.addIaasProvider(getIaasProvider(iaasElt, iaasProviders));
+
+ } else {
+ String msg =
+ "Essential '" +
+ CloudControllerConstants.IAAS_PROVIDER_ELEMENT +
+ "' element cannot" + " be found in " +
+ cartridgeElementString + " of " +
+ xmlSource;
+ handleException(msg);
+ }
+
+ }
+ }
+ }
+
+ 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;
+ }
+
+ private OMElement getElement(final Object obj) {
+ OMNode node;
+ if ((obj instanceof OMNode) && (node = (OMNode) obj).getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement element = (OMElement) node;
+
+ return element;
+
+ }
+
+ return null;
+ }
+
+ private OMElement getElement(final OMElement rootElt, final String eltStr, final String xpath) {
+ List<?> nodes = getMatchingNodes(xpath, rootElt);
+ neglectingWarn(eltStr, nodes.size());
+ OMElement element = getElement(nodes.get(0));
+ return element;
+ }
+
+ private OMElement getFirstChildElement(final OMElement root, final String childName) {
+ Iterator<?> it = root.getChildrenWithName(new QName(childName));
+ if (it.hasNext()) {
+ return (OMElement) it.next();
+ }
+
+ return null;
+ }
+
+ /**
+ *
+ * @param xpath
+ * XPATH expression to be read.
+ * @param elt
+ * OMElement to be used for the search.
+ * @return List matching OMNode list
+ */
+ @SuppressWarnings("unchecked")
+ public OMNode getFirstMatchingNode(final String xpath, final OMElement elt) {
+
+ AXIOMXPath axiomXpath;
+ List<OMNode> nodeList = null;
+ try {
+ axiomXpath = new AXIOMXPath(xpath);
+ nodeList = axiomXpath.selectNodes(elt);
+ } catch (JaxenException e) {
+ String msg = "Error occurred while reading the Xpath (" + xpath + ")";
+ log.error(msg, e);
+ throw new CloudControllerException(msg, e);
+ }
+
+ return nodeList != null ? nodeList.get(0) : null;
+ }
+
+ private IaasProvider getIaasProvider(final OMNode item, List<IaasProvider> iaases) {
+
+ IaasProvider iaas = null;
+
+ if (item.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement iaasElt = (OMElement) item;
+
+ if (iaases != null) {
+ // check whether this is a reference to a predefined IaaS.
+ for (IaasProvider iaasProvider : iaases) {
+ if (iaasProvider.getType()
+ .equals(iaasElt.getAttribute(new QName(
+ CloudControllerConstants.TYPE_ATTR))
+ .getAttributeValue())) {
+ iaas = new IaasProvider(iaasProvider);
+ break;
+ }
+ }
+ }
+
+ if (iaas == null) {
+ iaas = new IaasProvider();
+ }
+
+ if (iaas.getType() == null) {
+ iaas.setType(iaasElt.getAttribute(new QName(CloudControllerConstants.TYPE_ATTR))
+ .getAttributeValue());
+ }
+
+ if ("".equals(iaas.getType())) {
+ String msg =
+ "'" + CloudControllerConstants.IAAS_PROVIDER_ELEMENT + "' element's '" +
+ CloudControllerConstants.TYPE_ATTR +
+ "' attribute should be specified!";
+
+ handleException(msg);
+
+ }
+
+ // this is not mandatory
+ String name =
+ (iaasElt.getAttribute(new QName(CloudControllerConstants.NAME_ATTR)) == null)
+ ? iaas.getName()
+ : iaasElt.getAttributeValue(new QName(
+ CloudControllerConstants.NAME_ATTR));
+
+ iaas.setName(name);
+
+ String xpath = CloudControllerConstants.IAAS_PROVIDER_ELEMENT_XPATH;
+
+ // load other elements
+ loadClassName(iaas, iaasElt);
+ loadMaxInstanceLimit(iaas, iaasElt);
+ loadProperties(iaasElt, iaas.getProperties());
+ loadTemplate(iaas, iaasElt);
+ loadScalingOrders(iaas, iaasElt);
+ loadProvider(iaas, iaasElt);
+ loadIdentity(iaas, iaasElt);
+ loadCredentials(iaas, iaasElt, xpath);
+ }
+
+ return iaas;
+ }
+
+ /**
+ *
+ * @param xpath
+ * XPATH expression to be read.
+ * @return List matching OMNode list
+ */
+ @SuppressWarnings("unchecked")
+ public List<OMNode> getMatchingNodes(final String xpath) {
+
+ AXIOMXPath axiomXpath;
+ List<OMNode> nodeList = null;
+ try {
+ axiomXpath = new AXIOMXPath(xpath);
+ nodeList = axiomXpath.selectNodes(documentElement);
+ } catch (JaxenException e) {
+ String msg = "Error occurred while reading the Xpath (" + xpath + ")";
+ log.error(msg, e);
+ throw new CloudControllerException(msg, e);
+ }
+
+ return nodeList;
+ }
+
+ /**
+ *
+ * @param xpath
+ * XPATH expression to be read.
+ * @param elt
+ * OMElement to be used for the search.
+ * @return List matching OMNode list
+ */
+ @SuppressWarnings("unchecked")
+ public List<OMNode> getMatchingNodes(final String xpath, final OMElement elt) {
+
+ AXIOMXPath axiomXpath;
+ List<OMNode> nodeList = null;
+ try {
+ axiomXpath = new AXIOMXPath(xpath);
+ nodeList = axiomXpath.selectNodes(elt);
+ } catch (JaxenException e) {
+ String msg = "Error occurred while reading the Xpath (" + xpath + ")";
+ log.error(msg, e);
+ throw new CloudControllerException(msg, e);
+ }
+
+ return nodeList;
+ }
+
+ /**
+ * @param cartridgeElement Cartridges section as a {@link String}
+ * @param aCartridge {@link Cartridge} instance.
+ * @param portMappingNodes nodes of port mapping elements
+ */
+ private void getPortMappings(String cartridgeElementString, Cartridge aCartridge,
+ List<?> portMappingNodes) {
+ Object nodeObj;
+ if (!portMappingNodes.isEmpty()) {
+ if ((nodeObj = portMappingNodes.get(0)) instanceof OMNode) {
+ OMNode portMappingNode = (OMNode) nodeObj;
+
+ if (portMappingNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement portMappingElt = (OMElement) portMappingNode;
+
+ for (Iterator<?> iterator =
+ portMappingElt.getChildrenWithName(new QName(
+ CloudControllerConstants.HTTP_ELEMENT)); iterator.hasNext();) {
+ OMElement httpElt = (OMElement) iterator.next();
+
+ String port =
+ httpElt.getAttributeValue(new QName(
+ CloudControllerConstants.PORT_ATTR));
+ String proxyPort =
+ httpElt.getAttributeValue(new QName(
+ CloudControllerConstants.PROXY_PORT_ATTR));
+
+ PortMapping mapping =
+ new PortMapping(
+ CloudControllerConstants.HTTP_ELEMENT,
+ port, proxyPort);
+
+ aCartridge.addPortMapping(mapping);
+ }
+
+ for (Iterator<?> iterator =
+ portMappingElt.getChildrenWithName(new QName(
+ CloudControllerConstants.HTTPS_ELEMENT)); iterator.hasNext();) {
+ OMElement httpsElt = (OMElement) iterator.next();
+
+ String port =
+ httpsElt.getAttributeValue(new QName(
+ CloudControllerConstants.PORT_ATTR));
+ String proxyPort =
+ httpsElt.getAttributeValue(new QName(
+ CloudControllerConstants.PROXY_PORT_ATTR));
+
+ PortMapping mapping =
+ new PortMapping(
+ CloudControllerConstants.HTTPS_ELEMENT,
+ port, proxyPort);
+
+ aCartridge.addPortMapping(mapping);
+ }
+
+ } else {
+ String msg =
+ "Essential '" +
+ CloudControllerConstants.PORT_MAPPING_ELEMENT +
+ "' element cannot" + " be found in " +
+ cartridgeElementString + " of " +
+ xmlSource;
+ handleException(msg);
+ }
+
+ }
+ }
+ }
+
+ public List<ServiceContext> getServiceContexts() {
+
+ List<ServiceContext> serviceContextList = new ArrayList<ServiceContext>();
+
+ // services can be found from this XPATH
+ String xpath = CloudControllerConstants.SERVICES_ELEMENT_XPATH;
+ List<?> serviceNodes = getMatchingNodes(xpath, documentElement);
+
+ if (serviceNodes == null || serviceNodes.isEmpty()) {
+ // or from this XPATH
+ xpath = CloudControllerConstants.SERVICE_ELEMENT_XPATH;
+ serviceNodes = getMatchingNodes(xpath, documentElement);
+ }
+
+ if (serviceNodes == null || serviceNodes.isEmpty()) {
+ log.warn("No service found in this configuration file : " + xmlSource.getPath());
+ return serviceContextList;
+ }
+
+ for (Object obj : serviceNodes) {
+ ServiceContext serviceCtxt = new ServiceContext();
+
+ // set the definition file
+ serviceCtxt.setFile(xmlSource);
+
+ if (obj instanceof OMNode) {
+ OMNode serviceNode = (OMNode) obj;
+
+ if (serviceNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement node = (OMElement) serviceNode;
+
+ if (node.getAttribute(new QName(CloudControllerConstants.SERVICE_DOMAIN_ATTR)) == null) {
+ String msg =
+ "Essential '" + CloudControllerConstants.SERVICE_DOMAIN_ATTR + "' " +
+ "attribute of '" + CloudControllerConstants.SERVICE_ELEMENT +
+ "' element cannot be found in " + xmlSource;
+
+ handleException(msg);
+ }
+
+ // set domain name
+ serviceCtxt.setDomainName(node.getAttribute(new QName(
+ CloudControllerConstants.SERVICE_DOMAIN_ATTR))
+ .getAttributeValue());
+
+ // set sub domain
+ serviceCtxt.setSubDomainName(node.getAttribute(new QName(
+ CloudControllerConstants.SERVICE_SUB_DOMAIN_ATTR))
+ .getAttributeValue());
+
+ // set tenant range
+ serviceCtxt.setTenantRange(node.getAttribute(new QName(
+ CloudControllerConstants.SERVICE_TENANT_RANGE_ATTR))
+ .getAttributeValue());
+
+ OMNode cartridgeNode =
+ getFirstMatchingNode(xpath +
+ CloudControllerConstants.CARTRIDGE_ELEMENT_XPATH,
+ node);
+
+ if (cartridgeNode != null && cartridgeNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement cartridgeElt = (OMElement) cartridgeNode;
+
+ String type =
+ cartridgeElt.getAttribute(new QName(CloudControllerConstants.TYPE_ATTR))
+ .getAttributeValue();
+
+ if ("".equals(type)) {
+ String msg =
+ "Essential '" + CloudControllerConstants.TYPE_ATTR + "' " +
+ " attribute of '" +
+ CloudControllerConstants.CARTRIDGE_ELEMENT + "' of '" +
+ CloudControllerConstants.SERVICE_ELEMENT +
+ "' element cannot be found in " + xmlSource;
+
+ handleException(msg);
+ }
+
+ // set Cartridge type
+ serviceCtxt.setCartridgeType(type);
+
+ }
+ if (serviceCtxt.getCartridgeType() == null) {
+ String msg =
+ "Essential '" + CloudControllerConstants.CARTRIDGE_ELEMENT +
+ "' element" + " has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ // load payload
+ loadPayload(getMatchingNodes(xpath + CloudControllerConstants.PAYLOAD_ELEMENT_XPATH,
+ node), serviceCtxt);
+
+ // load host name
+ loadHostName(getMatchingNodes(xpath + CloudControllerConstants.HOST_ELEMENT_XPATH,
+ node), serviceCtxt);
+
+ // load properties
+ loadProperties(node, serviceCtxt.getProperties());
+
+ }
+ }
+
+ FasterLookUpDataHolder.getInstance().addServiceContext(serviceCtxt);
+ // add each domain specific template to list
+ serviceContextList.add(serviceCtxt);
+ }
+
+ return serviceContextList;
+
+ }
+
+ public File getXmlSource() {
+ return xmlSource;
+ }
+
+ private void handleException(final String msg) {
+ log.error(msg);
+ throw new MalformedConfigurationFileException(msg);
+ }
+
+ private void handleException(final String msg, final Exception e) {
+ log.error(msg, e);
+ throw new MalformedConfigurationFileException(msg, e);
+ }
+
+ private void loadClassName(final IaasProvider iaas, final OMElement iaasElt) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(
+ CloudControllerConstants.CLASS_NAME_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement classNameElt = (OMElement) it.next();
+ iaas.setClassName(classNameElt.getText());
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " +
+ CloudControllerConstants.CLASS_NAME_ELEMENT + " elements!" +
+ " Elements other than the first will be neglected.");
+ }
+
+ if (iaas.getClassName() == null) {
+ String msg =
+ "Essential '" + CloudControllerConstants.CLASS_NAME_ELEMENT + "' element " +
+ "has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ }
+
+ private void loadCredentials(final IaasProvider iaas, final OMElement iaasElt,
+ final String xpath) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(
+ CloudControllerConstants.CREDENTIAL_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement credentialElt = (OMElement) it.next();
+
+ // retrieve the value using secure vault
+ SecretResolver secretResolver = SecretResolverFactory.create(documentElement, false);
+ String alias =
+ credentialElt.getAttributeValue(new QName(
+ CloudControllerConstants.ALIAS_ATTRIBUTE));
+
+ // retrieve the secured password
+ if (secretResolver != null && secretResolver.isInitialized() &&
+ secretResolver.isTokenProtected(alias)) {
+
+ iaas.setCredential(secretResolver.resolve(alias));
+
+ }
+
+ // if we still cannot find a value, we try to assign the value which
+ // is specified
+ // in the element, if any
+ if (iaas.getCredential() == null) {
+ log.warn("Unable to find a value for " + CloudControllerConstants.CREDENTIAL_ELEMENT +
+ " element from Secure Vault." +
+ "Hence we will try to assign the plain text value (if specified).");
+ iaas.setCredential(credentialElt.getText());
+ }
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " +
+ CloudControllerConstants.CREDENTIAL_ELEMENT + " elements!" +
+ " Elements other than the first will be neglected.");
+ }
+
+ if (iaas.getCredential() == null) {
+ String msg =
+ "Essential '" + CloudControllerConstants.CREDENTIAL_ELEMENT + "' element" +
+ " has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ }
+
+ private void loadHostName(final List<OMNode> nodes, final ServiceContext serviceCtxt) {
+
+ if (nodes == null || nodes.isEmpty()) {
+ return;
+ }
+
+ // read host element
+ if (nodes.get(0).getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement node = (OMElement) nodes.get(0);
+
+ if (node.getText() != null) {
+ serviceCtxt.setHostName(node.getText());
+ }
+
+ }
+ }
+
+ private void loadIdentity(final IaasProvider iaas, final OMElement iaasElt) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(CloudControllerConstants.IDENTITY_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement identityElt = (OMElement) it.next();
+
+ // retrieve the value using secure vault
+ SecretResolver secretResolver = SecretResolverFactory.create(documentElement, false);
+ String alias =
+ identityElt.getAttributeValue(new QName(
+ CloudControllerConstants.ALIAS_ATTRIBUTE));
+
+ // retrieve the secured password
+ if (secretResolver != null && secretResolver.isInitialized() &&
+ secretResolver.isTokenProtected(alias)) {
+
+ iaas.setIdentity(secretResolver.resolve(alias));
+
+ }
+
+ // if we still cannot find a value, we try to assign the value which
+ // is specified
+ // in the element, if any
+ if (iaas.getIdentity() == null) {
+ log.warn("Unable to find a value for " + CloudControllerConstants.IDENTITY_ELEMENT +
+ " element from Secure Vault." +
+ "Hence we will try to assign the plain text value (if specified).");
+ iaas.setIdentity(identityElt.getText());
+ }
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " + CloudControllerConstants.IDENTITY_ELEMENT +
+ " elements!" + " Elements other than the first will be neglected.");
+ }
+
+ if (iaas.getIdentity() == null) {
+ String msg =
+ "Essential '" + CloudControllerConstants.IDENTITY_ELEMENT + "' element" +
+ " has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ }
+
+ private void loadMaxInstanceLimit(IaasProvider iaas, final OMElement iaasElt) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(
+ CloudControllerConstants.MAX_INSTANCE_LIMIT_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement maxInstanceLimitElt = (OMElement) it.next();
+
+ try {
+ iaas.setMaxInstanceLimit(Integer.parseInt(maxInstanceLimitElt.getText()));
+ } catch (NumberFormatException e) {
+ String msg =
+ CloudControllerConstants.MAX_INSTANCE_LIMIT_ELEMENT +
+ " element contained" + " in " + xmlSource + "" +
+ " has a value which is not an Integer value.";
+ handleException(msg, e);
+ }
+
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " +
+ CloudControllerConstants.MAX_INSTANCE_LIMIT_ELEMENT + " elements!" +
+ " Elements other than the first will be neglected.");
+ }
+
+ }
+
+ private void loadPayload(final List<OMNode> nodes, final ServiceContext serviceCtxt) {
+
+ if (nodes == null || nodes.isEmpty()) {
+ return;
+ }
+
+ // read payload element
+ if (nodes.get(0).getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement node = (OMElement) nodes.get(0);
+
+ if (node.getText() != null) {
+ byte[] payload = CloudControllerUtil.getBytesFromFile(node.getText());
+ serviceCtxt.setPayload(payload);
+
+ }
+
+ }
+
+ }
+
+ private void loadProperties(final OMElement iaasElt, final Map<String, String> propertyMap) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(CloudControllerConstants.PROPERTY_ELEMENT));
+
+ while (it.hasNext()) {
+ OMElement prop = (OMElement) it.next();
+
+ if (prop.getAttribute(new QName(CloudControllerConstants.PROPERTY_NAME_ATTR)) == null ||
+ prop.getAttribute(new QName(CloudControllerConstants.PROPERTY_VALUE_ATTR)) == null) {
+
+ String msg =
+ "Property element's, name and value attributes should be specified " +
+ "in " + xmlSource;
+
+ handleException(msg);
+ }
+
+ propertyMap.put(prop.getAttribute(new QName(CloudControllerConstants.PROPERTY_NAME_ATTR))
+ .getAttributeValue(),
+ prop.getAttribute(new QName(CloudControllerConstants.PROPERTY_VALUE_ATTR))
+ .getAttributeValue());
+ }
+
+ }
+
+ private void loadProvider(final IaasProvider iaas, final OMElement iaasElt) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(CloudControllerConstants.PROVIDER_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement providerElt = (OMElement) it.next();
+ iaas.setProvider(providerElt.getText());
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " + CloudControllerConstants.PROVIDER_ELEMENT +
+ " elements!" + " Elements other than the first will be neglected.");
+ }
+
+ if (iaas.getProvider() == null) {
+ String msg =
+ "Essential '" + CloudControllerConstants.PROVIDER_ELEMENT + "' element " +
+ "has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ }
+
+ private void loadScalingOrders(final IaasProvider iaas, final OMElement iaasElt) {
+ // set scale up order
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(
+ CloudControllerConstants.SCALE_UP_ORDER_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement scaleUpOrderElt = (OMElement) it.next();
+
+ try {
+ iaas.setScaleUpOrder(Integer.parseInt(scaleUpOrderElt.getText()));
+ } catch (NumberFormatException e) {
+ String msg =
+ CloudControllerConstants.SCALE_UP_ORDER_ELEMENT + " element contained" +
+ " in " + xmlSource + "" +
+ " has a value which is not an Integer value.";
+ handleException(msg, e);
+ }
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " +
+ CloudControllerConstants.SCALE_UP_ORDER_ELEMENT + " elements!" +
+ " Elements other than the first will be neglected.");
+ }
+
+ if (iaas.getScaleUpOrder() == -1) {
+ String msg =
+ "Essential '" + CloudControllerConstants.SCALE_UP_ORDER_ELEMENT + "' element" +
+ " has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ // set scale down order
+ it = iaasElt.getChildrenWithName(new QName(CloudControllerConstants.SCALE_DOWN_ORDER_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement scaleDownElt = (OMElement) it.next();
+
+ try {
+ iaas.setScaleDownOrder(Integer.parseInt(scaleDownElt.getText()));
+ } catch (NumberFormatException e) {
+ String msg =
+ CloudControllerConstants.SCALE_DOWN_ORDER_ELEMENT + " element contained" +
+ " in " + xmlSource + "" +
+ " has a value which is not an Integer value.";
+ handleException(msg, e);
+ }
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " +
+ CloudControllerConstants.SCALE_DOWN_ORDER_ELEMENT + " elements!" +
+ " Elements other than the first will be neglected.");
+ }
+
+ if (iaas.getScaleDownOrder() == -1) {
+ String msg =
+ "Essential '" + CloudControllerConstants.SCALE_DOWN_ORDER_ELEMENT + "' element" +
+ " has not specified in " + xmlSource;
+ handleException(msg);
+ }
+
+ }
+
+ private void loadTemplate(final IaasProvider iaas, final OMElement iaasElt) {
+
+ Iterator<?> it =
+ iaasElt.getChildrenWithName(new QName(CloudControllerConstants.IMAGE_ID_ELEMENT));
+
+ if (it.hasNext()) {
+ OMElement imageElt = (OMElement) it.next();
+ iaas.setImage(imageElt.getText());
+ }
+
+ if (it.hasNext()) {
+ log.warn(xmlSource + " contains more than one " + CloudControllerConstants.IMAGE_ID_ELEMENT +
+ " elements!" + " Elements other than the first will be neglected.");
+ }
+
+ }
+
+ private void neglectingWarn(final String elt, final int size) {
+ if (size > 1) {
+ log.warn(xmlSource + " contains more than one " + elt + " elements!" +
+ " Elements other than the first will be neglected.");
+ }
+ }
+
+ public void parse() {
+
+ if (xmlSource.exists()) {
+ try {
+ documentElement = new StAXOMBuilder(xmlSource.getPath()).getDocumentElement();
+
+ } catch (Exception ex) {
+ String msg = "Error occurred when parsing the " + xmlSource.getPath() + ".";
+ handleException(msg, ex);
+ }
+ } else {
+ String msg = "Configuration file cannot be found : " + xmlSource.getPath();
+ handleException(msg);
+ }
+ }
+
+ private void plainTextWarn(final String elt) {
+ log.warn("Unable to find a value for " + elt + " element from Secure Vault." +
+ "Hence we will try to assign the plain text value (if specified).");
+ }
+
+ private String resolveSecret(final OMElement elt) {
+ // retrieve the value using secure vault
+ SecretResolver secretResolver = SecretResolverFactory.create(documentElement, false);
+
+ String alias = elt.getAttributeValue(new QName(CloudControllerConstants.ALIAS_ATTRIBUTE));
+
+ // retrieve the secured password
+ if (secretResolver != null && secretResolver.isInitialized() &&
+ secretResolver.isTokenProtected(alias)) {
+
+ return secretResolver.resolve(alias);
+
+ }
+
+ return null;
+ }
+
+ public void setDataPublisherRelatedData() {
+
+ String eltStr = CloudControllerConstants.DATA_PUBLISHER_ELEMENT;
+ // get dataPublisher element
+ OMElement element =
+ getElement(documentElement, eltStr,
+ CloudControllerConstants.DATA_PUBLISHER_XPATH);
+
+ if (element == null) {
+ return;
+ }
+
+ FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+ // get enable attribute
+ boolean isEnable =
+ Boolean.parseBoolean(element.getAttributeValue(new QName(
+ CloudControllerConstants.ENABLE_ATTR)));
+ dataHolder.setEnableBAMDataPublisher(isEnable);
+
+ if (isEnable) {
+ // get bam server info
+ OMElement childElement =
+ getFirstChildElement(element,
+ CloudControllerConstants.BAM_SERVER_ELEMENT);
+ OMElement elt;
+
+ if (childElement != null) {
+ // set bam user name
+ elt =
+ getFirstChildElement(childElement,
+ CloudControllerConstants.BAM_SERVER_ADMIN_USERNAME_ELEMENT);
+ if (elt != null) {
+ dataHolder.setBamUsername(elt.getText());
+ }
+ // set bam password
+ elt =
+ getFirstChildElement(childElement,
+ CloudControllerConstants.BAM_SERVER_ADMIN_PASSWORD_ELEMENT);
+ if (elt != null) {
+ String password = resolveSecret(elt);
+ if (password == null) {
+ plainTextWarn(CloudControllerConstants.BAM_SERVER_ADMIN_PASSWORD_ELEMENT);
+ password = elt.getText();
+ }
+
+ if (password != null) {
+ dataHolder.setBamPassword(password);
+ }
+ }
+ }
+
+ // set cron
+ childElement = getFirstChildElement(element, CloudControllerConstants.CRON_ELEMENT);
+ if (childElement != null) {
+ dataHolder.setDataPublisherCron(childElement.getText());
+ }
+
+ // set cassandra info
+ childElement = getFirstChildElement(element, CloudControllerConstants.CASSANDRA_INFO_ELEMENT);
+
+ if (childElement != null) {
+ // set connection url
+ elt = getFirstChildElement(childElement, CloudControllerConstants.CONNECTION_URL_ELEMENT);
+ if (elt != null) {
+ dataHolder.setCassandraConnUrl(elt.getText());
+ }
+
+ // set user name
+ elt = getFirstChildElement(childElement, CloudControllerConstants.USER_NAME_ELEMENT);
+ if (elt != null) {
+ dataHolder.setCassandraUser(elt.getText());
+ }
+ // set password
+ elt = getFirstChildElement(childElement, CloudControllerConstants.PASSWORD_ELEMENT);
+ if (elt != null) {
+ String password = resolveSecret(elt);
+ if (password == null) {
+ plainTextWarn(CloudControllerConstants.PASSWORD_ELEMENT);
+ password = elt.getText();
+ }
+
+ if (password != null) {
+ dataHolder.setCassandraPassword(password);
+ }
+ }
+ }
+
+ }
+
+ }
+
+ /**
+ * @param cartridgeElement Cartridges section as a {@link String}
+ * @param aCartridge {@link Cartridge} instance.
+ * @param deploymentNodes list of deployment directory nodes
+ */
+ private void setDeploymentDirs(String cartridgeElementString, Cartridge aCartridge,
+ List<?> deploymentNodes) {
+ Object nodeObj;
+ if ((nodeObj = deploymentNodes.get(0)) instanceof OMNode) {
+ OMNode deploymentNode = (OMNode) nodeObj;
+
+ if (deploymentNode.getType() == OMNode.ELEMENT_NODE) {
+
+ OMElement deployElt = (OMElement) deploymentNode;
+
+ if (deployElt.getAttributeValue(new QName(
+ CloudControllerConstants.BASE_DIR_ATTR)) != null) {
+
+ aCartridge.setBaseDir(deployElt.getAttributeValue(new QName(
+ CloudControllerConstants.BASE_DIR_ATTR)));
+ }
+
+ for (Iterator<?> iterator =
+ deployElt.getChildrenWithName(new QName(
+ CloudControllerConstants.DIRECTORY_ELEMENT)); iterator.hasNext();) {
+ OMElement dir = (OMElement) iterator.next();
+ aCartridge.addDeploymentDir(dir.getText());
+ }
+
+ } else {
+ String msg =
+ "Essential '" + CloudControllerConstants.DEPLOYMENT_ELEMENT +
+ "' element cannot" + " be found in " +
+ cartridgeElementString + " of " + xmlSource;
+ handleException(msg);
+ }
+
+ }
+ }
+
+ public void setIaasProvidersList() {
+
+ List<IaasProvider> iaasProviders = FasterLookUpDataHolder.getInstance().getIaasProviders();
+
+ if (iaasProviders == null) {
+ FasterLookUpDataHolder.getInstance()
+ .setIaasProviders((iaasProviders = new ArrayList<IaasProvider>()));
+ }
+
+ List<OMNode> nodeList = getMatchingNodes(CloudControllerConstants.IAAS_PROVIDER_XPATH);
+
+ // this is a valid scenario. User can have 0..1 iaas provider elements
+ // in cloud-controller xml.
+ if (nodeList == null || nodeList.isEmpty()) {
+ return;
+ }
+
+ for (OMNode node : nodeList) {
+ iaasProviders.add(getIaasProvider(node, iaasProviders));
+ }
+
+ }
+
+
+ public void setTopologySyncRelatedData() {
+
+ String eltStr = CloudControllerConstants.TOPOLOGY_SYNC_ELEMENT;
+ // get topologySync element
+ OMElement element =
+ getElement(documentElement, eltStr,
+ CloudControllerConstants.TOPOLOGY_SYNC_XPATH);
+
+ if (element == null) {
+ return;
+ }
+
+ // get enable attribute
+ boolean isEnable =
+ Boolean.parseBoolean(element.getAttributeValue(new QName(
+ CloudControllerConstants.ENABLE_ATTR)));
+
+ FasterLookUpDataHolder dataHolder = FasterLookUpDataHolder.getInstance();
+ dataHolder.setEnableTopologySync(isEnable);
+
+ if (isEnable) {
+ // get MB server info
+ OMElement childElement =
+ getFirstChildElement(element,
+ CloudControllerConstants.MB_SERVER_ELEMENT);
+
+ if (childElement != null) {
+ // set MB server IP
+ dataHolder.setMBServerUrl(childElement.getText());
+ }
+
+ // set cron
+ childElement = getFirstChildElement(element, CloudControllerConstants.CRON_ELEMENT);
+ if (childElement != null) {
+ dataHolder.setTopologySynchronizerCron(childElement.getText());
+ }
+
+ }
+
+ }
+
+ public boolean validate(final File schemaFile) throws Exception {
+ validate(documentElement, schemaFile);
+ return true;
+ }
+
+ public void validate(final OMElement omElement, final File schemaFile) throws Exception {
+
+ 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 instance.
+ 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 instance document.
+ Schema schema = factory.newSchema(source);
+ Validator validator = schema.newValidator();
+
+ // Validate the DOM tree.
+ validator.validate(new DOMSource(sourceElement));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java
new file mode 100644
index 0000000..ac4eeae
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * This class can be used to create a thread pool, and hand over new jobs to the pool.
+ */
+public class ThreadExecutor {
+ private ExecutorService executor;
+
+ public ThreadExecutor(int poolSize) {
+ executor = Executors.newFixedThreadPool(poolSize);
+ }
+
+ public void execute(Runnable job){
+ executor.execute(job);
+ }
+
+ public void executeAll(Runnable[] jobs){
+ for (Runnable job : jobs) {
+
+ executor.execute(job);
+ }
+ }
+
+ public void shutdown() {
+ // This will make the executor accept no new threads
+ // and finish all existing threads in the queue
+ executor.shutdown();
+ // Wait until all threads are finished
+ while (!executor.isTerminated()) {}
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/consumers/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/consumers/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/consumers/TopologyBuilder.java
new file mode 100644
index 0000000..c6d191d
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/consumers/TopologyBuilder.java
@@ -0,0 +1,188 @@
+package org.apache.stratos.cloud.controller.consumers;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.lb.common.conf.structure.Node;
+import org.apache.stratos.lb.common.conf.structure.NodeBuilder;
+import org.apache.stratos.lb.common.conf.util.Constants;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.DeclarativeServiceReferenceHolder;
+import org.apache.stratos.cloud.controller.util.ServiceContext;
+
+/**
+ * This class is responsible for generating the service topology and
+ * publishing it to a topic.
+ */
+public class TopologyBuilder implements Runnable {
+
+ private BlockingQueue<List<ServiceContext>> sharedQueue;
+ private static File topologyFile, backup;
+ private static final Log log = LogFactory.getLog(TopologyBuilder.class);
+ private static DeclarativeServiceReferenceHolder data = DeclarativeServiceReferenceHolder.getInstance();
+
+ public TopologyBuilder(BlockingQueue<List<ServiceContext>> queue){
+
+ sharedQueue = queue;
+ topologyFile = new File(CloudControllerConstants.TOPOLOGY_FILE_PATH);
+ backup = new File(CloudControllerConstants.TOPOLOGY_FILE_PATH+".back");
+
+ }
+
+ @Override
+ public void run() {
+
+ while(true){
+ try {
+ Object obj = sharedQueue.take();
+ boolean isAdded = false;
+
+ if(obj instanceof List<?>){
+ @SuppressWarnings("unchecked")
+ List<ServiceContext> ctxts = (List<ServiceContext>) obj;
+
+ for (ServiceContext serviceContext : ctxts) {
+
+ Node newNode = serviceContext.toNode();
+
+ if(!topologyFile.exists()){
+ FileUtils.writeStringToFile(topologyFile, "services {\n}");
+ }
+
+ String currentContent = FileUtils.readFileToString(topologyFile);
+ Node currentNode = NodeBuilder.buildNode(currentContent);
+
+ for (Node aNode : currentNode.getChildNodes()) {
+ // similar service element is present
+ if(aNode.getName().equals(newNode.getName())){
+ // hence, we should not override, but append
+ Node domainsNode = aNode.findChildNodeByName(Constants.DOMAIN_ELEMENT);
+
+ if(domainsNode == null){
+ // existing node is useless
+ currentNode.removeChildNode(aNode.getName());
+ currentNode.appendChild(newNode);
+ break;
+ }
+
+ // append the new node/s
+ for (Node serNode : newNode.findChildNodeByName(Constants.DOMAIN_ELEMENT).getChildNodes()) {
+
+ for (Node currentSerNode : domainsNode.getChildNodes()) {
+ String prop = Constants.SUB_DOMAIN_ELEMENT;
+ if(serNode.getName().equals(currentSerNode.getName()) &&
+ serNode.getProperty(prop).equals(currentSerNode.getProperty(prop))){
+ // if domain and sub domain, are not unique, we shouldn't append, but override
+ domainsNode.removeChildNode(currentSerNode.getName());
+ break;
+ }
+ }
+
+ domainsNode.appendChild(serNode);
+ }
+ isAdded = true;
+ break;
+ }
+ }
+
+ if (!isAdded) {
+ currentNode.appendChild(newNode);
+ }
+
+ if (topologyFile.exists()) {
+ backup.delete();
+ topologyFile.renameTo(backup);
+ }
+
+ // overwrite the topology file
+ FileUtils.writeStringToFile(topologyFile, currentNode.toString());
+
+ // publish to the topic - to sync immediately
+ data.getConfigPub().publish(CloudControllerConstants.TOPIC_NAME, currentNode.toString());
+
+ }
+ }
+
+ } catch (InterruptedException ignore) {
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ throw new CloudControllerException(e.getMessage(), e);
+ }
+ }
+
+ }
+
+ public static void removeTopologyAndPublish(ServiceContext serviceContext){
+
+ Node currentNodeToBeRemoved = null;
+ Node nodeToBeRemoved = serviceContext.toNode();
+
+ if(!topologyFile.exists()){
+ return;
+ }
+ try{
+ String currentContent = FileUtils.readFileToString(topologyFile);
+ Node currentNode = NodeBuilder.buildNode(currentContent);
+
+ for (Node aNode : currentNode.getChildNodes()) {
+ // similar service element is present
+ if(aNode.getName().equals(nodeToBeRemoved.getName())){
+ // let's check whether the domain node exists
+
+ Node domainsNode = aNode.findChildNodeByName(Constants.DOMAIN_ELEMENT);
+
+ if(domainsNode == null){
+ continue;
+ }
+
+ for (Node serNode : nodeToBeRemoved.findChildNodeByName(Constants.DOMAIN_ELEMENT).getChildNodes()) {
+
+ for (Node currentSerNode : domainsNode.getChildNodes()) {
+ String prop = Constants.SUB_DOMAIN_ELEMENT;
+ if(serNode.getName().equals(currentSerNode.getName()) &&
+ serNode.getProperty(prop).equals(currentSerNode.getProperty(prop))){
+ // if domain and sub domain, are matching, we should remove the node.
+ domainsNode.removeChildNode(currentSerNode.getName());
+ if(domainsNode.getChildNodes().size() == 0){
+ // if no cluster definitions remain, we shouldn't keep the node
+ currentNodeToBeRemoved = aNode;
+ }
+ break;
+ }
+ }
+
+ }
+
+ }
+ }
+
+ if(currentNodeToBeRemoved != null){
+ // remove the node with empty clusters
+ currentNode.removeChildNode(currentNodeToBeRemoved);
+ }
+
+ if (topologyFile.exists()) {
+ backup.delete();
+ topologyFile.renameTo(backup);
+ }
+
+ // overwrite the topology file
+ FileUtils.writeStringToFile(topologyFile, currentNode.toString());
+
+ // publish to the topic - to sync immediately
+ data.getConfigPub().publish(CloudControllerConstants.TOPIC_NAME, currentNode.toString());
+
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ throw new CloudControllerException(e.getMessage(), e);
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java
new file mode 100644
index 0000000..a130f4e
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.deployers;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.deployment.AbstractDeployer;
+import org.apache.axis2.deployment.DeploymentException;
+import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.stratos.cloud.controller.axiom.AxiomXpathParser;
+import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor;
+import org.apache.stratos.cloud.controller.exception.CloudControllerException;
+import org.apache.stratos.cloud.controller.interfaces.Iaas;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.Cartridge;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.util.IaasProvider;
+import org.wso2.carbon.utils.CarbonUtils;
+
+/**
+ * All the {@link org.apache.stratos.cloud.controller.util.Cartridge}s will get deployed / undeployed / updated via this class.
+ */
+public class CartridgeDeployer extends AbstractDeployer{
+
+ private static final Log log = LogFactory.getLog(CartridgeDeployer.class);
+
+ private FasterLookUpDataHolder serviceContextLookUpStructure;
+ private Map<String, List<Cartridge>> fileToCartridgeListMap;
+ private File cartridgesSchema, cartridgeSchema;
+
+ public void init(ConfigurationContext arg0) {
+ fileToCartridgeListMap = new ConcurrentHashMap<String, List<Cartridge>>();
+ String etcDir = CarbonUtils.getCarbonConfigDirPath() + File.separator + "etc" + File.separator;
+ cartridgesSchema = new File(etcDir+"cartridges.xsd");
+ cartridgeSchema = new File(etcDir+"cartridge.xsd");
+ }
+
+ public void setDirectory(String arg0) {
+ // component xml handles this
+ }
+
+ public void setExtension(String arg0) {
+ // component xml handles this
+ }
+
+ public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
+
+ log.debug("Started to deploy the deployment artifact: "+deploymentFileData.getFile());
+
+ AxiomXpathParser parser = new AxiomXpathParser(deploymentFileData.getFile());
+ parser.parse();
+
+ try {
+ // validate
+ validateCartridge(parser);
+
+ // deploy - grab cartridges
+ List<Cartridge> cartridges = parser.getCartridgesList();
+
+ ThreadExecutor exec = new ThreadExecutor(3);
+ // create Jclouds objects, for each IaaS
+ for (Cartridge cartridge : cartridges) {
+ // jclouds object building is time consuming, hence I use Java executor framework
+ exec.execute(new JcloudsObjectBuilder(cartridge, deploymentFileData));
+ }
+ exec.shutdown();
+ // update map
+ fileToCartridgeListMap.put(deploymentFileData.getAbsolutePath(),
+ new ArrayList<Cartridge>(cartridges));
+
+ log.info("Successfully deployed the Cartridge definition specified at "+deploymentFileData.getAbsolutePath());
+
+ } catch (Exception e) {
+ String msg = "Invalid deployment artefact at "+deploymentFileData.getAbsolutePath();
+ // back up the file
+ File f = deploymentFileData.getFile();
+ f.renameTo(new File(deploymentFileData.getAbsolutePath()+".back"));
+ log.error(msg, e);
+ throw new DeploymentException(msg, e);
+ }
+
+
+ }
+
+ private void validateCartridge(AxiomXpathParser parser) throws Exception {
+ boolean validated = false;
+ Exception firstException = null;
+
+ try{
+ // first try to validate using cartridges schema
+ parser.validate(cartridgesSchema);
+ validated = true;
+
+ }catch (Exception e) {
+ firstException = e;
+ }
+
+ if(!validated){
+ try{
+ // Now try to validate using cartridge schema
+ parser.validate(cartridgeSchema);
+ validated = true;
+ log.debug("Cartridge validation was successful.");
+
+ }catch (Exception e) {
+ String msg = "Cartridge XML validation failed. Invalid Cartridge XML: "+parser.getXmlSource().getAbsolutePath();
+ log.error(msg, firstException);
+ throw firstException;
+ }
+ }
+
+
+ }
+
+ public void undeploy(String file) throws DeploymentException {
+
+ serviceContextLookUpStructure = FasterLookUpDataHolder.getInstance();
+
+ // grab the entry from Map
+ if(fileToCartridgeListMap.containsKey(file)){
+ // remove 'em
+ serviceContextLookUpStructure.removeCartridges(fileToCartridgeListMap.get(file));
+
+ log.info("Successfully undeployed the Cartridge definition specified at "+file);
+ }
+
+ }
+
+ private void handleException(String msg, Exception e) {
+ log.fatal(msg, e);
+ throw new CloudControllerException(msg, e);
+ }
+
+ /**
+ * JcloudsObjectBuilder job
+ *
+ */
+ class JcloudsObjectBuilder implements Runnable{
+
+ private Cartridge cartridge;
+ private DeploymentFileData file;
+
+ public JcloudsObjectBuilder (Cartridge cartridge, DeploymentFileData file){
+ this.cartridge = cartridge;
+ this.file = file;
+ }
+
+ @Override
+ public void run() {
+
+ for (IaasProvider iaasProvider : cartridge.getIaases()) {
+ try {
+ Iaas iaas = (Iaas) Class.forName(iaasProvider.getClassName()).newInstance();
+ iaas.buildComputeServiceAndTemplate(iaasProvider);
+ iaasProvider.setIaas(iaas);
+
+ } catch (Exception e) {
+ rename();
+ handleException(e.getMessage(), e);
+ }
+ }
+
+ }
+
+ private void rename(){
+ // back up the file
+ File f = file.getFile();
+ f.renameTo(new File(file.getAbsolutePath()+".back"));
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CloudControllerDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CloudControllerDeployer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CloudControllerDeployer.java
new file mode 100644
index 0000000..79987b0
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CloudControllerDeployer.java
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.deployers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.deployment.AbstractDeployer;
+import org.apache.axis2.deployment.DeploymentException;
+import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.stratos.cloud.controller.axiom.AxiomXpathParser;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.util.IaasProvider;
+
+/**
+ * All the {@link IaasProvider}s will get deployed / undeployed / updated via this class.
+ */
+public class CloudControllerDeployer extends AbstractDeployer{
+
+ private static final Log log = LogFactory.getLog(CloudControllerDeployer.class);
+ private static final String FILE_NAME = "cloud-controller";
+ private Map<String, List<IaasProvider>> fileToIaasProviderListMap;
+
+ @Override
+ public void init(ConfigurationContext arg0) {
+ fileToIaasProviderListMap = new ConcurrentHashMap<String, List<IaasProvider>>();
+ }
+
+ @Override
+ public void setDirectory(String arg0) {
+ // component xml handles this
+
+ }
+
+ @Override
+ public void setExtension(String arg0) {
+ // component xml handles this
+ }
+
+ public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
+
+ log.debug("Started to deploy the deployment artifact: "+deploymentFileData.getFile());
+
+ // since cloud-controller.xml resides in repository/conf
+ if (deploymentFileData.getName().contains(FILE_NAME)) {
+
+ AxiomXpathParser parser = new AxiomXpathParser(deploymentFileData.getFile());
+
+ // parse the file
+ parser.parse();
+
+ // deploy iaases
+ parser.setIaasProvidersList();
+ parser.setDataPublisherRelatedData();
+ parser.setTopologySyncRelatedData();
+
+ // update map
+ fileToIaasProviderListMap.put(deploymentFileData.getAbsolutePath(),
+ new ArrayList<IaasProvider>(
+ FasterLookUpDataHolder.getInstance()
+ .getIaasProviders()));
+
+ log.info("Successfully deployed the cloud-controller XML file specified at " +
+ deploymentFileData.getAbsolutePath());
+ }
+
+ }
+
+
+ public void undeploy(String file) throws DeploymentException {
+
+ if (file.contains(FILE_NAME)) {
+ // reset
+ FasterLookUpDataHolder.getInstance().setSerializationDir("");
+
+ // grab the entry from Map
+ if(fileToIaasProviderListMap.containsKey(file)){
+ // remove 'em
+ FasterLookUpDataHolder.getInstance().getIaasProviders().removeAll(fileToIaasProviderListMap.get(file));
+
+ log.info("Successfully undeployed the cloud-controller XML file specified at "+file);
+ }
+ // only one cloud-controller file, hence delete 'em all
+// FasterLookUpDataHolder.getInstance().setIaasProviders(new ArrayList<IaasProvider>());
+
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/ServiceDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/ServiceDeployer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/ServiceDeployer.java
new file mode 100644
index 0000000..2e37bef
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/ServiceDeployer.java
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.deployers;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.deployment.AbstractDeployer;
+import org.apache.axis2.deployment.DeploymentException;
+import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.stratos.cloud.controller.axiom.AxiomXpathParser;
+import org.apache.stratos.cloud.controller.consumers.TopologyBuilder;
+import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
+import org.apache.stratos.cloud.controller.util.ServiceContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.utils.CarbonUtils;
+
+/**
+ * All the {@link org.apache.stratos.cloud.controller.util.Cartridge}s will get deployed / undeployed / updated via this class.
+ */
+public class ServiceDeployer extends AbstractDeployer{
+
+ private static final Log log = LogFactory.getLog(ServiceDeployer.class);
+
+ private FasterLookUpDataHolder serviceContextLookUpStructure;
+ private Map<String, List<ServiceContext>> fileToServiceContextListMap;
+ private File servicesSchema, serviceSchema;
+
+ @Override
+ public void init(ConfigurationContext arg0) {
+ fileToServiceContextListMap = new ConcurrentHashMap<String, List<ServiceContext>>();
+ String etcDir = CarbonUtils.getCarbonConfigDirPath() + File.separator + "etc" + File.separator;
+ servicesSchema = new File(etcDir+"services.xsd");
+ serviceSchema = new File(etcDir+"service.xsd");
+ }
+
+ @Override
+ public void setDirectory(String arg0) {
+ // component xml handles this
+ }
+
+ @Override
+ public void setExtension(String arg0) {
+ // component xml handles this
+ }
+
+ public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
+
+ log.debug("Started to deploy the deployment artefact: "+deploymentFileData.getFile());
+ serviceContextLookUpStructure = FasterLookUpDataHolder.getInstance();
+
+ AxiomXpathParser parser = new AxiomXpathParser(deploymentFileData.getFile());
+ parser.parse();
+
+ // validate
+ try {
+ validateService(parser);
+
+ } catch (Exception e) {
+ String msg = "Invalid deployment artefact at "+deploymentFileData.getAbsolutePath();
+ // back up the file
+ File f = deploymentFileData.getFile();
+ f.renameTo(new File(deploymentFileData.getAbsolutePath()+".back"));
+ log.error(msg, e);
+ throw new DeploymentException(msg, e);
+ }
+
+ // deploy
+ List<ServiceContext> services = parser.getServiceContexts();
+
+ // notify consumer by adding the diff
+ try {
+ serviceContextLookUpStructure.getSharedTopologyDiffQueue().put(services);
+ } catch (InterruptedException ignore) {
+ }
+
+ // update map
+ fileToServiceContextListMap.put(deploymentFileData.getAbsolutePath(), new ArrayList<ServiceContext>(services));
+
+ log.info("Successfully deployed the Service definition specified at "+deploymentFileData.getAbsolutePath());
+ }
+
+ private void validateService(AxiomXpathParser parser) throws Exception {
+ boolean validated = false;
+ Exception firstException = null;
+
+ try{
+ // first try to validate using services schema
+ parser.validate(servicesSchema);
+ validated = true;
+ log.debug("Service validation was successful.");
+
+ }catch (Exception e) {
+ firstException = e;
+ }
+
+ if(!validated){
+ try{
+ // Now try to validate using service schema
+ parser.validate(serviceSchema);
+ validated = true;
+ log.debug("Service validation was successful.");
+
+ }catch (Exception e) {
+ String msg = "Service XML validation failed. Invalid Service XML: "+parser.getXmlSource().getAbsolutePath();
+ log.error(msg, firstException);
+ throw firstException;
+ }
+ }
+
+
+ }
+
+ public void undeploy(String file) throws DeploymentException {
+
+ serviceContextLookUpStructure = FasterLookUpDataHolder.getInstance();
+
+ // grab the entry from Map
+ if(fileToServiceContextListMap.containsKey(file)){
+ // remove 'em all
+ for (ServiceContext ctxt : fileToServiceContextListMap.get(file)) {
+ serviceContextLookUpStructure.removeServiceContext(ctxt);
+ // remove from the topology
+ TopologyBuilder.removeTopologyAndPublish(ctxt);
+ }
+
+ log.info("Successfully undeployed the Service definition specified at "+file);
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CloudControllerException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CloudControllerException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CloudControllerException.java
new file mode 100644
index 0000000..08e57f5
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/CloudControllerException.java
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+public class CloudControllerException extends RuntimeException {
+
+ private static final long serialVersionUID = -6326227079367867222L;
+
+ public CloudControllerException(String msg) {
+ super(msg);
+ }
+
+ public CloudControllerException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/DeserializationException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/DeserializationException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/DeserializationException.java
new file mode 100644
index 0000000..33ec80b
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/DeserializationException.java
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+public class DeserializationException extends RuntimeException {
+
+ private static final long serialVersionUID = -2426068347954381831L;
+
+ public DeserializationException(String msg) {
+ super(msg);
+ }
+
+ public DeserializationException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCartridgeDefinitionException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCartridgeDefinitionException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCartridgeDefinitionException.java
new file mode 100644
index 0000000..363dc38
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidCartridgeDefinitionException.java
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+public class InvalidCartridgeDefinitionException extends Exception {
+
+ private static final long serialVersionUID = -6326227079367867222L;
+
+ public InvalidCartridgeDefinitionException(String msg) {
+ super(msg);
+ }
+
+ public InvalidCartridgeDefinitionException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidXMLException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidXMLException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidXMLException.java
new file mode 100644
index 0000000..d0bab7e
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/InvalidXMLException.java
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+public class InvalidXMLException extends RuntimeException {
+
+ private static final long serialVersionUID = -6326227079367867222L;
+
+ public InvalidXMLException(String msg) {
+ super(msg);
+ }
+
+ public InvalidXMLException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+
+ public InvalidXMLException(Exception ex) {
+ super(ex);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/MalformedConfigurationFileException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/MalformedConfigurationFileException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/MalformedConfigurationFileException.java
new file mode 100644
index 0000000..db268f2
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/MalformedConfigurationFileException.java
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+public class MalformedConfigurationFileException extends RuntimeException {
+
+ private static final long serialVersionUID = -1662095377704279326L;
+
+ public MalformedConfigurationFileException(String msg) {
+ super(msg);
+ }
+
+ public MalformedConfigurationFileException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/NoInstanceFoundException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/NoInstanceFoundException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/NoInstanceFoundException.java
new file mode 100644
index 0000000..c85d47a
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/NoInstanceFoundException.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+/**
+ * This will throw when no instance is found
+ */
+public class NoInstanceFoundException extends Exception {
+
+ /**
+ * For serializing requirement
+ */
+ private static final long serialVersionUID = -435060299292679892L;
+
+
+ public NoInstanceFoundException(String msg) {
+ super(msg);
+ }
+
+ public NoInstanceFoundException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/e8c32dac/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/SerializationException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/SerializationException.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/SerializationException.java
new file mode 100644
index 0000000..b2e2302
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/exception/SerializationException.java
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2005-2011, 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.apache.stratos.cloud.controller.exception;
+
+public class SerializationException extends RuntimeException {
+
+ private static final long serialVersionUID = -3701458642228072331L;
+
+ public SerializationException(String msg) {
+ super(msg);
+ }
+
+ public SerializationException(String msg, Exception ex) {
+ super(msg, ex);
+ }
+
+}