Merge branch 'master' of https://github.com/Thanu/stratos. This closes #505
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
index 1d93a0e..b5d9296 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
@@ -28,6 +28,7 @@
 import org.apache.stratos.autoscaler.applications.ClusterInformation;
 import org.apache.stratos.autoscaler.applications.MTClusterInformation;
 import org.apache.stratos.autoscaler.applications.STClusterInformation;
+import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import org.apache.stratos.autoscaler.applications.payload.PayloadData;
 import org.apache.stratos.autoscaler.applications.pojo.*;
 import org.apache.stratos.autoscaler.client.IdentityApplicationManagementServiceClient;
@@ -270,7 +271,19 @@
                                                    Map<String, SubscribableInfoContext> subscribableInfoCtxts)
             throws ApplicationDefinitionException, CartridgeGroupNotFoundException, CartridgeNotFoundException {
 
-        Application application = new Application(applicationContext.getApplicationId());
+        Application application;
+
+        // check if application already exists, and get existing key if true
+        ApplicationHolder.acquireReadLock();
+        Applications persistedApplications = ApplicationHolder.getApplications();
+        if (persistedApplications != null && persistedApplications.applicationExists(applicationContext.getApplicationId())) {
+            String existingKey = persistedApplications.getApplication(applicationContext.getApplicationId()).getKey();
+            application = new Application(applicationContext.getApplicationId(), existingKey);
+        } else {
+            application = new Application(applicationContext.getApplicationId());
+        }
+
+        ApplicationHolder.releaseReadLock();
 
         // Set tenant information
         application.setTenantId(applicationContext.getTenantId());
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/application/Application.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/application/Application.java
index 5dcea72..9c49883 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/application/Application.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/application/Application.java
@@ -61,6 +61,13 @@
         this.setInstanceIdToInstanceContextMap(new HashMap<String, ApplicationInstance>());
     }
 
+    public Application(String id, String key) {
+        super();
+        this.id = id;
+        this.key = key;
+        this.setInstanceIdToInstanceContextMap(new HashMap<String, ApplicationInstance>());
+    }
+
     public String getUniqueIdentifier() {
         return id;
     }