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/04 14:26:41 UTC

[10/10] git commit: Apache Stratos Cloud Controller Component refactoring

Apache Stratos Cloud Controller Component refactoring

Signed-off-by: Isuru <is...@wso2.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/35006acc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/35006acc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/35006acc

Branch: refs/heads/master
Commit: 35006acc920acacd124408dddf47685edc3c8d5d
Parents: 64777ba
Author: udara <udara@udara-ThinkPad-T530.(none)>
Authored: Thu Jul 4 17:16:42 2013 +0530
Committer: Isuru <is...@wso2.com>
Committed: Thu Jul 4 17:50:54 2013 +0530

----------------------------------------------------------------------
 .../2.1.3/pom.xml                               |  338 +++++
 .../controller/axiom/AxiomXpathParser.java      | 1263 ++++++++++++++++++
 .../controller/concurrent/ThreadExecutor.java   |   53 +
 .../controller/consumers/TopologyBuilder.java   |  188 +++
 .../controller/deployers/CartridgeDeployer.java |  194 +++
 .../deployers/CloudControllerDeployer.java      |  110 ++
 .../controller/deployers/ServiceDeployer.java   |  152 +++
 .../exception/CloudControllerException.java     |   32 +
 .../exception/DeserializationException.java     |   32 +
 .../InvalidCartridgeDefinitionException.java    |   32 +
 .../exception/InvalidXMLException.java          |   36 +
 .../MalformedConfigurationFileException.java    |   32 +
 .../exception/NoInstanceFoundException.java     |   38 +
 .../exception/SerializationException.java       |   32 +
 .../UnregisteredCartridgeException.java         |   32 +
 .../exception/UnregisteredServiceException.java |   32 +
 .../hector/CassandraDataRetriever.java          |  181 +++
 .../controller/hive/HiveQueryExecutor.java      |  167 +++
 .../cloud/controller/iaases/AWSEC2Iaas.java     |  275 ++++
 .../controller/iaases/OpenstackNovaIaas.java    |  269 ++++
 .../cloud/controller/iaases/VCloudIaas.java     |  164 +++
 .../impl/CloudControllerServiceImpl.java        | 1123 ++++++++++++++++
 .../interfaces/CloudControllerService.java      |  194 +++
 .../cloud/controller/interfaces/Iaas.java       |   73 +
 .../internal/CloudControllerDSComponent.java    |   85 ++
 .../jcloud/ComputeServiceBuilderUtil.java       |  182 +++
 .../cloud/controller/persist/Deserializer.java  |   91 ++
 .../cloud/controller/persist/Serializer.java    |   85 ++
 .../CartridgeInstanceDataPublisherTask.java     |  476 +++++++
 .../controller/registry/RegistryManager.java    |  101 ++
 .../registry/RegistryManager.java.back          |   96 ++
 .../runtime/FasterLookUpDataHolder.java         |  425 ++++++
 .../topic/ConfigurationPublisher.java           |   65 +
 .../topic/TopologySynchronizerTask.java         |   79 ++
 .../stratos/cloud/controller/util/AppType.java  |   44 +
 .../cloud/controller/util/Cartridge.java        |  254 ++++
 .../cloud/controller/util/CartridgeInfo.java    |  162 +++
 .../controller/util/CartridgeInstanceData.java  |  129 ++
 .../util/CloudControllerConstants.java          |  216 +++
 .../controller/util/CloudControllerUtil.java    |  102 ++
 .../util/DeclarativeServiceReferenceHolder.java |   69 +
 .../cloud/controller/util/IaasContext.java      |  149 +++
 .../cloud/controller/util/IaasProvider.java     |  263 ++++
 .../cloud/controller/util/PortMapping.java      |   46 +
 .../cloud/controller/util/Properties.java       |   36 +
 .../stratos/cloud/controller/util/Property.java |   35 +
 .../cloud/controller/util/ServiceContext.java   |  283 ++++
 .../src/main/resources/META-INF/component.xml   |   36 +
 .../src/main/resources/META-INF/services.xml    |    9 +
 .../2.1.3/src/main/resources/cartridge.xsd      |  133 ++
 .../2.1.3/src/main/resources/cartridges.xsd     |  144 ++
 .../2.1.3/src/main/resources/service.xsd        |   46 +
 .../2.1.3/src/main/resources/services.xsd       |   51 +
 .../service/axiom/AxiomValidationTest.java      |  125 ++
 .../service/axiom/AxiomXpathParserTest.java     |   51 +
 .../service/util/ServiceContextTest.java        |   49 +
 .../2.1.3/src/test/resources/cartridges-1.xml   |   33 +
 .../2.1.3/src/test/resources/cartridges-2.xml   |   34 +
 .../2.1.3/src/test/resources/cartridges-3.xml   |   16 +
 .../2.1.3/src/test/resources/cartridges-4.xml   |   32 +
 .../2.1.3/src/test/resources/cartridges-5.xml   |   29 +
 .../2.1.3/src/test/resources/cartridges-6.xml   |   19 +
 .../2.1.3/src/test/resources/cartridges-7.xml   |   40 +
 .../2.1.3/src/test/resources/cartridges-8.xml   |   72 +
 .../2.1.3/src/test/resources/cartridges-9.xml   |   66 +
 .../src/test/resources/cloud-controller.xml     |   73 +
 components/pom.xml                              |    3 +-
 .../2.1.3/pom.xml                               |  324 -----
 .../controller/axiom/AxiomXpathParser.java      | 1263 ------------------
 .../controller/concurrent/ThreadExecutor.java   |   53 -
 .../controller/consumers/TopologyBuilder.java   |  189 ---
 .../controller/deployers/CartridgeDeployer.java |  194 ---
 .../deployers/CloudControllerDeployer.java      |  110 --
 .../controller/deployers/ServiceDeployer.java   |  153 ---
 .../exception/CloudControllerException.java     |   32 -
 .../exception/DeserializationException.java     |   32 -
 .../InvalidCartridgeDefinitionException.java    |   32 -
 .../exception/InvalidXMLException.java          |   36 -
 .../MalformedConfigurationFileException.java    |   32 -
 .../exception/NoInstanceFoundException.java     |   38 -
 .../exception/SerializationException.java       |   32 -
 .../UnregisteredCartridgeException.java         |   32 -
 .../exception/UnregisteredServiceException.java |   32 -
 .../hector/CassandraDataRetriever.java          |  181 ---
 .../controller/hive/HiveQueryExecutor.java      |  167 ---
 .../cloud/controller/iaases/AWSEC2Iaas.java     |  275 ----
 .../controller/iaases/OpenstackNovaIaas.java    |  269 ----
 .../cloud/controller/iaases/VCloudIaas.java     |  164 ---
 .../impl/CloudControllerServiceImpl.java        | 1123 ----------------
 .../interfaces/CloudControllerService.java      |  195 ---
 .../cloud/controller/interfaces/Iaas.java       |   73 -
 .../internal/CloudControllerDSComponent.java    |   85 --
 .../jcloud/ComputeServiceBuilderUtil.java       |  182 ---
 .../cloud/controller/persist/Deserializer.java  |   91 --
 .../cloud/controller/persist/Serializer.java    |   85 --
 .../CartridgeInstanceDataPublisherTask.java     |  476 -------
 .../controller/registry/RegistryManager.java    |  101 --
 .../registry/RegistryManager.java.back          |   96 --
 .../runtime/FasterLookUpDataHolder.java         |  425 ------
 .../topic/ConfigurationPublisher.java           |   65 -
 .../topic/TopologySynchronizerTask.java         |   78 --
 .../stratos/cloud/controller/util/AppType.java  |   44 -
 .../cloud/controller/util/Cartridge.java        |  254 ----
 .../cloud/controller/util/CartridgeInfo.java    |  162 ---
 .../controller/util/CartridgeInstanceData.java  |  129 --
 .../util/CloudControllerConstants.java          |  216 ---
 .../controller/util/CloudControllerUtil.java    |  102 --
 .../util/DeclarativeServiceReferenceHolder.java |   69 -
 .../cloud/controller/util/IaasContext.java      |  149 ---
 .../cloud/controller/util/IaasProvider.java     |  263 ----
 .../cloud/controller/util/PortMapping.java      |   46 -
 .../cloud/controller/util/Properties.java       |   36 -
 .../stratos/cloud/controller/util/Property.java |   35 -
 .../cloud/controller/util/ServiceContext.java   |  283 ----
 .../src/main/resources/META-INF/component.xml   |   36 -
 .../src/main/resources/META-INF/services.xml    |    9 -
 .../2.1.3/src/main/resources/cartridge.xsd      |  133 --
 .../2.1.3/src/main/resources/cartridges.xsd     |  144 --
 .../2.1.3/src/main/resources/service.xsd        |   46 -
 .../2.1.3/src/main/resources/services.xsd       |   51 -
 .../service/axiom/AxiomValidationTest.java      |  125 --
 .../service/axiom/AxiomXpathParserTest.java     |   51 -
 .../service/util/ServiceContextTest.java        |   49 -
 .../2.1.3/src/test/resources/cartridges-1.xml   |   33 -
 .../2.1.3/src/test/resources/cartridges-2.xml   |   34 -
 .../2.1.3/src/test/resources/cartridges-3.xml   |   16 -
 .../2.1.3/src/test/resources/cartridges-4.xml   |   32 -
 .../2.1.3/src/test/resources/cartridges-5.xml   |   29 -
 .../2.1.3/src/test/resources/cartridges-6.xml   |   19 -
 .../2.1.3/src/test/resources/cartridges-7.xml   |   40 -
 .../2.1.3/src/test/resources/cartridges-8.xml   |   72 -
 .../2.1.3/src/test/resources/cartridges-9.xml   |   66 -
 .../src/test/resources/cloud-controller.xml     |   73 -
 133 files changed, 9575 insertions(+), 9562 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/35006acc/components/org.apache.stratos.cloud.controller/2.1.3/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/2.1.3/pom.xml b/components/org.apache.stratos.cloud.controller/2.1.3/pom.xml
new file mode 100644
index 0000000..0626149
--- /dev/null
+++ b/components/org.apache.stratos.cloud.controller/2.1.3/pom.xml
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (c) 2009-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~      http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<!--
+    <parent>
+       <groupId>org.wso2.carbon</groupId>
+       <artifactId>stratos-components</artifactId>
+       <version>2.1.0</version>
+       <relativePath>../../pom.xml</relativePath>
+    </parent>
+-->
+    <parent>
+       <groupId>org.apache.stratos</groupId>
+       <artifactId>stratos-components-parent</artifactId>
+       <version>2.0.0</version>
+       <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.stratos</groupId>
+    <artifactId>org.apache.stratos.cloud.controller</artifactId>
+    <packaging>bundle</packaging>
+    <version>2.1.3</version>
+    <name>Apache - Stratos Cloud Controller</name>
+    <url>http://apache.org</url>
+
+    <build>
+        <plugins>
+            <!--plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>1.7.1</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <artifactSet>
+                                <includes>
+                                    <include>org.jclouds:*</include>
+                                    <include>org.jclouds.*:*</include>
+                                </includes>
+                            </artifactSet>
+                            <filtering>true</filtering>
+                            <filters>
+                                <filter>
+                                    <artifact>org.jclouds*:*</artifact>
+                                    <includes>
+                                        <include>META-INF/services/org.jclouds.apis.ApiMetadata</include>
+                                        <include>META-INF/services/org.jclouds.providers.ProviderMetadata</include>
+                                    </includes>
+                                </filter>
+                            </filters>
+                            <transformers>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin-->
+            <!--plugin>
+                <groupId>org.apache.axis2</groupId>
+                <artifactId>axis2-aar-maven-plugin</artifactId>
+                <version>1.4</version>
+                <extensions>true</extensions>
+            </plugin-->
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>1.4.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Name>${project.artifactId}</Bundle-Name>
+                        <Export-Package>
+                            og.apache.stratos.cloud.controller.interfaces.*,
+                            og.apache.stratos.cloud.controller.publisher.*,
+                            og.apache.stratos.cloud.controller.topic.*,
+                            og.apache.stratos.cloud.controller.iaases.*,
+                            og.apache.stratos.cloud.controller.util.*,
+				org.apache.stratos.cloud.controller.deployers.*,
+				org.apache.stratos.cloud.controller.exception.*,
+				org.apache.stratos.cloud.controller.*
+                        </Export-Package>
+                        <Private-Package>
+                            og.apache.stratos.cloud.controller.*,
+                            !og.apache.stratos.cloud.controller.interfaces,
+                            !og.apache.stratos.cloud.controller.publisher,
+                            !og.apache.stratos.cloud.controller.topic,
+                            !og.apache.stratos.cloud.controller.iaases 
+                        </Private-Package>
+                        <Import-Package>
+                        	  !org.apache.commons.logging,
+                            org.apache.commons.logging; version=0.0.0,
+                            org.wso2.carbon.utils.*,
+                            <!--org.jclouds.compute*;version="${jclouds.version}";resolution:=optional,
+                            org.jclouds*;version="${jclouds.version}",-->
+                            *; resolution:=optional
+                        </Import-Package>
+                        <DynamicImport-Package>*</DynamicImport-Package>
+                        
+                        <Axis2Deployer>CloudControllerDeployer</Axis2Deployer>
+                        
+                        <Axis2Deployer>CartridgeDeployer</Axis2Deployer>
+                        
+                        <Axis2Deployer>ServiceDeployer</Axis2Deployer>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.core</artifactId>
+	    <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.utils</artifactId>
+	    <version>4.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.stratos</groupId>
+            <artifactId>org.apache.stratos.lb.common</artifactId>
+            <version>4.1.3</version>
+        </dependency>
+
+
+<dependency>
+    <groupId>org.wso2.carbon</groupId>
+    <artifactId>org.wso2.carbon.securevault</artifactId>
+    <version>${wso2carbon.version}</version>
+</dependency>
+<dependency>
+    <groupId>org.hectorclient.wso2</groupId>
+    <artifactId>hector-core</artifactId>
+    <version>1.1.0.wso2v1</version>
+    <exclusions>
+        <exclusion>
+            <groupId>com.google.guava.wso2</groupId>
+            <artifactId>guava</artifactId>
+        </exclusion>
+    </exclusions>
+
+</dependency>
+<dependency>
+    <groupId>com.google.guava.wso2</groupId>
+    <artifactId>guava</artifactId>
+    <version>${google.guava.wso2.version}</version>
+</dependency>
+<dependency>
+        <groupId>org.wso2.andes.wso2</groupId>
+        <artifactId>andes-client</artifactId>
+        <version>0.13.wso2v3</version>
+    </dependency>
+<dependency>
+        <groupId>org.apache.geronimo.specs.wso2</groupId>
+        <artifactId>geronimo-jms_1.1_spec</artifactId>
+        <version>${orbit.version.geronimo-jms_1.1_spec}</version>
+    </dependency>
+
+<dependency>
+    <groupId>org.wso2.carbon</groupId>
+    <artifactId>org.wso2.carbon.analytics.hive.stub</artifactId>
+       <version>4.1.0</version>
+</dependency>
+
+<!--  Jclouds dependencies -->
+       <dependency>
+           <groupId>org.jclouds</groupId>
+           <artifactId>jclouds-core</artifactId>
+           <version>${jclouds.version}</version>
+          </dependency>
+        <dependency>
+           <groupId>org.jclouds</groupId>
+           <artifactId>jclouds-compute</artifactId>
+           <version>${jclouds.version}</version>
+         </dependency>
+<!--
+	 <dependency>
+            <groupId>org.jclouds.api</groupId>
+            <artifactId>vcloud</artifactId>
+            <version>1.6.0-wso2v1</version>
+        </dependency>
+-->
+         <dependency>
+           <groupId>org.jclouds.driver</groupId>
+           <artifactId>jclouds-bouncycastle</artifactId>
+           <version>${jclouds.version}</version>
+           <exclusions>
+              <exclusion>
+                 <groupId>org.bouncycastle</groupId>
+                 <artifactId>bcprov-jdk16</artifactId>
+              </exclusion>
+           </exclusions>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.driver</groupId>
+           <artifactId>jclouds-sshj</artifactId>
+           <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.driver</groupId>
+           <artifactId>jclouds-log4j</artifactId>
+           <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.driver</groupId>
+           <artifactId>jclouds-enterprise</artifactId>
+           <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.api</groupId>
+           <artifactId>ec2</artifactId>
+           <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.provider</groupId>
+           <artifactId>aws-ec2</artifactId>
+           <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.api</groupId>
+           <artifactId>openstack-nova</artifactId>
+           <version>${jclouds.wso2.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>org.jclouds.api</groupId>
+           <artifactId>openstack-keystone</artifactId>
+           <version>${jclouds.wso2.version}</version>
+         </dependency>
+         <dependency>
+          <groupId>org.jclouds</groupId>
+            <artifactId>jclouds-scriptbuilder</artifactId>
+              <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+          <groupId>org.jclouds.common</groupId>
+            <artifactId>aws-common</artifactId>
+              <version>${jclouds.version}</version>
+         </dependency>
+         <dependency>
+             <groupId>com.jamesmurty.utils.wso2</groupId>
+             <artifactId>java-xmlbuilder</artifactId>
+             <version>0.4.wso2v1</version>
+         </dependency>
+        <dependency>
+            <groupId>org.jclouds.api</groupId>
+            <artifactId>vcloud</artifactId>
+            <version>1.6.0-wso2v1</version>
+        </dependency>
+         <dependency>
+           <groupId>com.google.code.gson</groupId>
+           <artifactId>gson</artifactId>
+           <version>${gson2.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>com.google.guice.wso2</groupId>
+           <artifactId>guice</artifactId>
+           <version>${google.guice.wso2.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>com.google.guice.assistedinject.wso2</groupId>
+           <artifactId>guice-assistedinject</artifactId>
+           <version>${com.google.guice.assistedinject.wso2.version}</version>
+         </dependency>
+         <dependency>
+           <groupId>com.sun.jersey</groupId>
+           <artifactId>jersey-core</artifactId>
+           <version>${sun.jersey.version}</version>
+         </dependency>
+         <dependency>
+          <groupId>net.oauth.core</groupId>
+          <artifactId>oauth</artifactId>
+          <version>20100527</version>
+         </dependency>
+         <dependency>
+           <groupId>commons-io.wso2</groupId>
+           <artifactId>commons-io</artifactId>
+           <version>2.0.0.wso2v1</version>
+         </dependency>
+         <dependency>
+           <groupId>rhino.wso2</groupId>
+           <artifactId>js</artifactId>
+           <version>1.7.0.R1-wso2v3</version>
+         </dependency>
+         <dependency>
+           <groupId>org.wso2.carbon</groupId>
+           <artifactId>org.wso2.carbon.cartridge.messages</artifactId>
+           <version>2.1.1</version>
+         </dependency>
+         <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.databridge.agent.thrift</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.ntask.core</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+    </dependencies>
+    <properties>
+        <gson2.version>2.2</gson2.version>
+        <jclouds.version>1.5.0-beta.5</jclouds.version>
+        <jclouds.wso2.version>1.5.0-beta.5.wso2v1</jclouds.wso2.version>
+        <com.google.guice.assistedinject.wso2.version>3.0.wso2v1</com.google.guice.assistedinject.wso2.version>
+        <sun.jersey.version>1.12</sun.jersey.version>
+    </properties>
+</project>
+

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/35006acc/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/axiom/AxiomXpathParser.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/axiom/AxiomXpathParser.java b/components/org.apache.stratos.cloud.controller/2.1.3/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/2.1.3/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/35006acc/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java b/components/org.apache.stratos.cloud.controller/2.1.3/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/2.1.3/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/35006acc/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/consumers/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/consumers/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/2.1.3/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/2.1.3/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/35006acc/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/2.1.3/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java b/components/org.apache.stratos.cloud.controller/2.1.3/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/2.1.3/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"));
+		}
+    	
+    }
+
+}