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);
+    }
+
+}