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