You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/10/30 05:14:12 UTC

[48/50] [abbrv] Merge branch '4.0.0-grouping' into docker-grouping-merge

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
index 4a48a13,a3feb4d..7ac8334
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
@@@ -30,231 -26,295 +29,362 @@@ import org.apache.stratos.cloud.control
  import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
  import org.apache.stratos.messaging.broker.publish.EventPublisher;
  import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
 -import org.apache.stratos.messaging.domain.topology.*;
 +import org.apache.stratos.messaging.domain.topology.Cluster;
 +import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 +import org.apache.stratos.messaging.domain.topology.Port;
 +import org.apache.stratos.messaging.domain.topology.ServiceType;
 +import org.apache.stratos.messaging.domain.topology.Topology;
  import org.apache.stratos.messaging.event.Event;
  import org.apache.stratos.messaging.event.instance.status.InstanceStartedEvent;
 -import org.apache.stratos.messaging.event.topology.*;
 -import org.apache.stratos.messaging.util.Constants;
 +import org.apache.stratos.messaging.event.topology.ClusterCreatedEvent;
 +import org.apache.stratos.messaging.event.topology.ClusterMaintenanceModeEvent;
 +import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
 +import org.apache.stratos.messaging.event.topology.CompleteTopologyEvent;
 +import org.apache.stratos.messaging.event.topology.InstanceSpawnedEvent;
 +import org.apache.stratos.messaging.event.topology.MemberActivatedEvent;
 +import org.apache.stratos.messaging.event.topology.MemberMaintenanceModeEvent;
 +import org.apache.stratos.messaging.event.topology.MemberReadyToShutdownEvent;
 +import org.apache.stratos.messaging.event.topology.MemberStartedEvent;
 +import org.apache.stratos.messaging.event.topology.MemberTerminatedEvent;
 +import org.apache.stratos.messaging.event.topology.ServiceCreatedEvent;
 +import org.apache.stratos.messaging.event.topology.ServiceRemovedEvent;
 +import org.apache.stratos.messaging.util.Util;
  
+ import java.util.List;
+ import java.util.Properties;
+ import java.util.Set;
+ 
  /**
   * this is to send the relevant events from cloud controller to topology topic
   */
  public class TopologyEventPublisher {
 -    private static final Log log = LogFactory.getLog(TopologyEventPublisher.class);
 -
 -
 -    public static void sendServiceCreateEvent(List<Cartridge> cartridgeList) {
 -        ServiceCreatedEvent serviceCreatedEvent;
 -        for(Cartridge cartridge : cartridgeList) {
 -            serviceCreatedEvent = new ServiceCreatedEvent(cartridge.getType(), (cartridge.isMultiTenant() ? ServiceType.MultiTenant : ServiceType.SingleTenant));
 -
 -            // Add ports to the event
 -            Port port;
 -            List<PortMapping> portMappings = cartridge.getPortMappings();
 -            for(PortMapping portMapping : portMappings) {
 -                port = new Port(portMapping.getProtocol(),
 -                        Integer.parseInt(portMapping.getPort()),
 -                        Integer.parseInt(portMapping.getProxyPort()));
 -                serviceCreatedEvent.addPort(port);
 -            }
 -
 -            if(log.isInfoEnabled()) {
 -                log.info(String.format("Publishing service created event: [service] %s", cartridge.getType()));
 -            }
 -            publishEvent(serviceCreatedEvent);
 -        }
 -    }
 -
 -    public static void sendServiceRemovedEvent(List<Cartridge> cartridgeList) {
 -        ServiceRemovedEvent serviceRemovedEvent;
 -        for(Cartridge cartridge : cartridgeList) {
 -            serviceRemovedEvent = new ServiceRemovedEvent(cartridge.getType());
 -            if(log.isInfoEnabled()) {
 -                log.info(String.format("Publishing service removed event: [service] %s", serviceRemovedEvent.getServiceName()));
 -            }
 -            publishEvent(serviceRemovedEvent);
 -        }
 -    }
 -
 -    public static void sendClusterCreatedEvent(String appId, String serviceName, String clusterId) {
 -        ClusterCreatedEvent clusterCreatedEvent = new ClusterCreatedEvent(appId,serviceName, clusterId);
 -
 -        if(log.isInfoEnabled()) {
 -            log.info("Publishing cluster created event: " +clusterId);
 -        }
 -        publishEvent(clusterCreatedEvent);
 -    }
 +	private static final Log log = LogFactory
 +			.getLog(TopologyEventPublisher.class);
 +
 +	public static void sendServiceCreateEvent(List<Cartridge> cartridgeList) {
 +		ServiceCreatedEvent serviceCreatedEvent;
 +		for (Cartridge cartridge : cartridgeList) {
 +			serviceCreatedEvent = new ServiceCreatedEvent(cartridge.getType(),
 +					(cartridge.isMultiTenant() ? ServiceType.MultiTenant
 +							: ServiceType.SingleTenant));
 +
 +			// Add ports to the event
 +			Port port;
 +			List<PortMapping> portMappings = cartridge.getPortMappings();
 +			for (PortMapping portMapping : portMappings) {
 +				port = new Port(portMapping.getProtocol(),
 +						Integer.parseInt(portMapping.getPort()),
 +						Integer.parseInt(portMapping.getProxyPort()));
 +				serviceCreatedEvent.addPort(port);
 +			}
 +
 +			if (log.isInfoEnabled()) {
 +				log.info(String.format(
 +						"Publishing service created event: [service] %s",
 +						cartridge.getType()));
 +			}
 +			publishEvent(serviceCreatedEvent);
 +		}
 +	}
 +
 +	public static void sendServiceRemovedEvent(List<Cartridge> cartridgeList) {
 +		ServiceRemovedEvent serviceRemovedEvent;
 +		for (Cartridge cartridge : cartridgeList) {
 +			serviceRemovedEvent = new ServiceRemovedEvent(cartridge.getType());
 +			if (log.isInfoEnabled()) {
 +				log.info(String.format(
 +						"Publishing service removed event: [service] %s",
 +						serviceRemovedEvent.getServiceName()));
 +			}
 +			publishEvent(serviceRemovedEvent);
 +		}
 +	}
 +
 +	public static void sendClusterCreatedEvent(String serviceName,
 +			String clusterId, Cluster cluster) {
 +		ClusterCreatedEvent clusterCreatedEvent = new ClusterCreatedEvent(
 +				serviceName, clusterId, cluster);
 +
 +		if (log.isInfoEnabled()) {
 +			log.info("Publishing cluster created event: " + cluster.toString());
 +		}
 +		publishEvent(clusterCreatedEvent);
- 
 +	}
  
- 	public static void sendClusterRemovedEvent(ClusterContext ctxt,
- 			String deploymentPolicy) {
+     public static void sendApplicationCreatedEvent (ApplicationCreatedEvent applicationCreatedEvent) {
+ 
+         if(log.isInfoEnabled()) {
+             log.info("Publishing Application created event: " + applicationCreatedEvent.toString());
+         }
+ 
+         publishEvent(applicationCreatedEvent);
+     }
  
- 		ClusterRemovedEvent clusterRemovedEvent = new ClusterRemovedEvent(
- 				ctxt.getCartridgeType(), ctxt.getClusterId(), deploymentPolicy,
- 				ctxt.isLbCluster());
+     public static void sendApplicationUndeployedEvent (String applicationId, Set<ClusterDataHolder> clusterData) {
+ 
+         if (log.isInfoEnabled()) {
+             log.info("Publishing Application undeployed event for Application: " + applicationId);
+         }
+ 
+         publishEvent(new ApplicationUndeployedEvent(applicationId, clusterData));
+     }
+ 
+ //    public static void sendApplicationRemovedEvent(String applicationId, Set<ClusterDataHolder> clusterData,
+ //                                                   int tenantId, String tenantDomain) {
+ //
+ //        if(log.isInfoEnabled() || log.isDebugEnabled()) {
+ //            log.info("Publishing Application removed event: " + applicationId + " tenantId: " + tenantId);
+ //        }
+ //
+ //        publishEvent(new ApplicationRemovedEvent(applicationId, clusterData, tenantId, tenantDomain));
+ //    }
+ 
+     public static void sendClusterRemovedEvent(ClusterContext ctxt, String deploymentPolicy) {
  
 -        ClusterRemovedEvent clusterRemovedEvent = new ClusterRemovedEvent(ctxt.getCartridgeType(), ctxt.getClusterId(), deploymentPolicy, ctxt.isLbCluster());
 -
 -        if(log.isInfoEnabled()) {
 -            log.info(String.format("Publishing cluster removed event: [service] %s [cluster] %s", ctxt.getCartridgeType(), ctxt.getClusterId()));
 -        }
 -        publishEvent(clusterRemovedEvent);
 -
 -    }
 +		if (log.isInfoEnabled()) {
 +			log.info(String
 +					.format("Publishing cluster removed event: [service] %s [cluster] %s",
 +							ctxt.getCartridgeType(), ctxt.getClusterId()));
 +		}
 +		publishEvent(clusterRemovedEvent);
 +
 +	}
 +
 +	public static void sendClusterMaintenanceModeEvent(ClusterContext ctxt) {
 +
 +		ClusterMaintenanceModeEvent clusterMaintenanceModeEvent = new ClusterMaintenanceModeEvent(
 +				ctxt.getCartridgeType(), ctxt.getClusterId());
 +		clusterMaintenanceModeEvent.setStatus(ClusterStatus.In_Maintenance);
 +		if (log.isInfoEnabled()) {
 +			log.info(String
 +					.format("Publishing cluster maintenance mode event: [service] %s [cluster] %s",
 +							clusterMaintenanceModeEvent.getServiceName(),
 +							clusterMaintenanceModeEvent.getClusterId()));
 +		}
 +		publishEvent(clusterMaintenanceModeEvent);
 +
 +	}
 +
 +	public static void sendInstanceSpawnedEvent(String serviceName,
 +			String clusterId, String networkPartitionId, String partitionId,
 +			String memberId, String lbClusterId, String publicIp,
 +			String privateIp, MemberContext context) {
 +		
 +		long initTime = context.getInitTime();
 +		InstanceSpawnedEvent instanceSpawnedEvent = new InstanceSpawnedEvent(
 +				serviceName, clusterId, networkPartitionId, partitionId,
 +				memberId, initTime);
 +		instanceSpawnedEvent.setLbClusterId(lbClusterId);
 +		instanceSpawnedEvent.setMemberIp(privateIp);
 +		instanceSpawnedEvent.setMemberPublicIp(publicIp);
 +		instanceSpawnedEvent.setProperties(CloudControllerUtil
 +				.toJavaUtilProperties(context.getProperties()));
 +		if (log.isInfoEnabled()) {
 +			log.info(String
 +					.format("Publishing instance spawned event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [lb-cluster-id] %s [properties] %s",
 +							serviceName, clusterId, networkPartitionId,
 +							partitionId, memberId, lbClusterId, context.getProperties()));
 +		}
 +		publishEvent(instanceSpawnedEvent);
 +	}
  
- 	public static void sendMemberStartedEvent(
- 			InstanceStartedEvent instanceStartedEvent) {
- 		MemberStartedEvent memberStartedEventTopology = new MemberStartedEvent(
- 				instanceStartedEvent.getServiceName(),
- 				instanceStartedEvent.getClusterId(),
- 				instanceStartedEvent.getNetworkPartitionId(),
- 				instanceStartedEvent.getPartitionId(),
- 				instanceStartedEvent.getMemberId());
+     public static void sendInstanceSpawnedEvent(String serviceName, String clusterId, String networkPartitionId, String partitionId, String memberId,
+                                                 String lbClusterId, String publicIp, String privateIp, MemberContext context) {
+         InstanceSpawnedEvent instanceSpawnedEvent = new InstanceSpawnedEvent(serviceName, clusterId, networkPartitionId, partitionId, memberId);
+         instanceSpawnedEvent.setLbClusterId(lbClusterId);
+         instanceSpawnedEvent.setMemberIp(privateIp);
+         instanceSpawnedEvent.setMemberPublicIp(publicIp);
+         instanceSpawnedEvent.setProperties(CloudControllerUtil.toJavaUtilProperties(context.getProperties()));
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing instance spawned event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [lb-cluster-id] %s",
+                     serviceName, clusterId, networkPartitionId, partitionId, memberId, lbClusterId));
+         }
+         publishEvent(instanceSpawnedEvent);
+     }
  
+     public static void sendMemberStartedEvent(InstanceStartedEvent instanceStartedEvent) {
+         MemberStartedEvent memberStartedEventTopology = new MemberStartedEvent(instanceStartedEvent.getServiceName(),
+                 instanceStartedEvent.getClusterId(), instanceStartedEvent.getNetworkPartitionId(), instanceStartedEvent.getPartitionId(), instanceStartedEvent.getMemberId());
 -
 -        // grouping
 -        memberStartedEventTopology.setGroupId(instanceStartedEvent.getGroupId());
 -        if(log.isInfoEnabled()) {
 -            log.info(" Grouping member started event - adding groupID " + instanceStartedEvent.getGroupId() + " for cluster " +
 -                    instanceStartedEvent.getClusterId());
 -        }
 -
 -        if(log.isInfoEnabled()) {
 -            log.info(String.format("Publishing member started event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [groupId] %s",
 -                    memberStartedEventTopology.getServiceName(), memberStartedEventTopology.getClusterId(), memberStartedEventTopology.getNetworkPartitionId(),
 -                    memberStartedEventTopology.getPartitionId(), memberStartedEventTopology.getMemberId(), memberStartedEventTopology.getGroupId()));
 -        }
 -
 -        publishEvent(memberStartedEventTopology);
 -    }
 -
 -    public static void sendMemberActivatedEvent(MemberActivatedEvent memberActivatedEvent) {
 -        if(log.isInfoEnabled()) {
 -            log.info(String.format("Publishing member activated event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [groupId] %s",
 -                    memberActivatedEvent.getServiceName(), memberActivatedEvent.getClusterId(), memberActivatedEvent.getNetworkPartitionId(),
 -                    memberActivatedEvent.getPartitionId(), memberActivatedEvent.getMemberId(), memberActivatedEvent.getGroupId()));
 -        }
 -        publishEvent(memberActivatedEvent);
 -    }
 +		if (log.isInfoEnabled()) {
 +			log.info(String
 +					.format("Publishing member started event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s",
 +							instanceStartedEvent.getServiceName(),
 +							instanceStartedEvent.getClusterId(),
 +							instanceStartedEvent.getNetworkPartitionId(),
 +							instanceStartedEvent.getPartitionId(),
 +							instanceStartedEvent.getMemberId()));
 +		}
 +		publishEvent(memberStartedEventTopology);
 +	}
 +
 +	public static void sendMemberActivatedEvent(
 +			MemberActivatedEvent memberActivatedEvent) {
 +		if (log.isInfoEnabled()) {
 +			log.info(String
 +					.format("Publishing member activated event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s",
 +							memberActivatedEvent.getServiceName(),
 +							memberActivatedEvent.getClusterId(),
 +							memberActivatedEvent.getNetworkPartitionId(),
 +							memberActivatedEvent.getPartitionId(),
 +							memberActivatedEvent.getMemberId()));
 +		}
 +		publishEvent(memberActivatedEvent);
 +	}
  
- 	public static void sendMemberReadyToShutdownEvent(
- 			MemberReadyToShutdownEvent memberReadyToShutdownEvent) {
- 		if (log.isInfoEnabled()) {
- 			log.info(String
- 					.format("Publishing member Ready to shut down event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s",
- 							memberReadyToShutdownEvent.getServiceName(),
- 							memberReadyToShutdownEvent.getClusterId(),
- 							memberReadyToShutdownEvent.getNetworkPartitionId(),
- 							memberReadyToShutdownEvent.getPartitionId(),
- 							memberReadyToShutdownEvent.getMemberId()));
- 		}
- 		publishEvent(memberReadyToShutdownEvent);
- 	}
+     public static void sendMemberReadyToShutdownEvent(MemberReadyToShutdownEvent memberReadyToShutdownEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing member Ready to shut down event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [groupId] %s",
+                     memberReadyToShutdownEvent.getServiceName(), memberReadyToShutdownEvent.getClusterId(), memberReadyToShutdownEvent.getNetworkPartitionId(),
+                     memberReadyToShutdownEvent.getPartitionId(), memberReadyToShutdownEvent.getMemberId(), memberReadyToShutdownEvent.getGroupId()));
+         }
+         // grouping
+         memberReadyToShutdownEvent.setGroupId(memberReadyToShutdownEvent.getGroupId());
+         publishEvent(memberReadyToShutdownEvent);
+     }
  
- 	public static void sendMemberMaintenanceModeEvent(
- 			MemberMaintenanceModeEvent memberMaintenanceModeEvent) {
- 		if (log.isInfoEnabled()) {
- 			log.info(String
- 					.format("Publishing Maintenance mode event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s",
- 							memberMaintenanceModeEvent.getServiceName(),
- 							memberMaintenanceModeEvent.getClusterId(),
- 							memberMaintenanceModeEvent.getNetworkPartitionId(),
- 							memberMaintenanceModeEvent.getPartitionId(),
- 							memberMaintenanceModeEvent.getMemberId()));
- 		}
- 		publishEvent(memberMaintenanceModeEvent);
- 	}
+     public static void sendMemberMaintenanceModeEvent(MemberMaintenanceModeEvent memberMaintenanceModeEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing Maintenance mode event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [groupId] %s",
+                     memberMaintenanceModeEvent.getServiceName(), memberMaintenanceModeEvent.getClusterId(), memberMaintenanceModeEvent.getNetworkPartitionId(),
+                     memberMaintenanceModeEvent.getPartitionId(), memberMaintenanceModeEvent.getMemberId(), memberMaintenanceModeEvent.getGroupId()));
+         }
  
- 	public static void sendMemberTerminatedEvent(String serviceName,
- 			String clusterId, String networkPartitionId, String partitionId,
- 			String memberId, Properties properties) {
- 		MemberTerminatedEvent memberTerminatedEvent = new MemberTerminatedEvent(
- 				serviceName, clusterId, networkPartitionId, partitionId,
- 				memberId);
- 		memberTerminatedEvent.setProperties(properties);
- 		if (log.isInfoEnabled()) {
- 			log.info(String
- 					.format("Publishing member terminated event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s",
- 							serviceName, clusterId, networkPartitionId,
- 							partitionId, memberId));
- 		}
- 		publishEvent(memberTerminatedEvent);
- 	}
+         publishEvent(memberMaintenanceModeEvent);
+     }
  
- 	public static void sendCompleteTopologyEvent(Topology topology) {
- 		CompleteTopologyEvent completeTopologyEvent = new CompleteTopologyEvent(
- 				topology);
+     public static void sendGroupActivatedEvent(GroupActivatedEvent groupActivatedEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing group activated event: [appId] %s [group] %s",
+                     groupActivatedEvent.getAppId(), groupActivatedEvent.getGroupId()));
+         }
+         publishEvent(groupActivatedEvent);
+     }
  
- 		if (log.isDebugEnabled()) {
- 			log.debug(String.format("Publishing complete topology event"));
- 		}
- 		publishEvent(completeTopologyEvent);
- 	}
+     public static void sendClusterActivatedEvent(ClusterActivatedEvent clusterActivatedEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing cluster activated event: [service] %s [cluster] %s [appId] %s",
+                     clusterActivatedEvent.getServiceName(), clusterActivatedEvent.getClusterId() , clusterActivatedEvent.getAppId()));
+         }
+         publishEvent(clusterActivatedEvent);
+     }
+ 
+     public static void sendClusterInActivateEvent(ClusterInactivateEvent clusterInActiveEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing cluster in-active event: [service] %s [cluster] %s [appId] %s",
+                     clusterInActiveEvent.getServiceName(), clusterInActiveEvent.getClusterId() , clusterInActiveEvent.getAppId()));
+         }
+         publishEvent(clusterInActiveEvent);
+     }
+ 
+ 
+     public static void sendMemberTerminatedEvent(String serviceName, String clusterId, String networkPartitionId,
+                                                  String partitionId, String memberId, Properties properties, String groupId) {
+         MemberTerminatedEvent memberTerminatedEvent = new MemberTerminatedEvent(serviceName, clusterId, networkPartitionId, partitionId, memberId);
+         memberTerminatedEvent.setProperties(properties);
+         memberTerminatedEvent.setGroupId(groupId);
+ 
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing member terminated event: [service] %s [cluster] %s [network-partition] %s [partition] %s [member] %s [groupId] %s", serviceName, clusterId, networkPartitionId,
+                     partitionId, memberId, groupId));
+         }
+ 
+         publishEvent(memberTerminatedEvent);
+     }
+ 
+     public static void sendCompleteTopologyEvent(Topology topology) {
+         CompleteTopologyEvent completeTopologyEvent = new CompleteTopologyEvent(topology);
+ 
+         if(log.isDebugEnabled()) {
+             log.debug(String.format("Publishing complete topology event"));
+         }
+         publishEvent(completeTopologyEvent);
+     }
+ 
+     public static void sendApplicationActivatedEvent(ApplicationActivatedEvent applicationActivatedEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing application activated event: [appId] %s",
+                     applicationActivatedEvent.getAppId()));
+         }
+         publishEvent(applicationActivatedEvent);
+     }
+ 
+     public static void publishEvent(Event event) {
+         EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.TOPOLOGY_TOPIC);
+         eventPublisher.publish(event);
+     }
+ 
+     public static void sendApplicationInactivatedEvent(ApplicationInactivatedEvent applicationActivatedEvent1) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing application in activated event: [appId] %s",
+                     applicationActivatedEvent1.getAppId()));
+         }
+         publishEvent(applicationActivatedEvent1);
+     }
+ 
+     public static void sendApplicationTerminatingEvent(ApplicationTerminatingEvent applicationTerminatingEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing application terminating event: [appId] %s",
+                     applicationTerminatingEvent.getAppId()));
+         }
+         publishEvent(applicationTerminatingEvent);
+     }
+ 
+     public static void sendApplicationTerminatedEvent(ApplicationTerminatedEvent applicationTerminatedEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing application terminated event: [appId] %s",
+                     applicationTerminatedEvent.getAppId()));
+         }
+         publishEvent(applicationTerminatedEvent);
+     }
+ 
+     public static void sendGroupInActiveEvent(GroupInactivateEvent groupInActivateEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing group in-active event: [appId] %s",
+                     groupInActivateEvent.getAppId()));
+         }
+         publishEvent(groupInActivateEvent);
+     }
+ 
+ 
+     public static void sendGroupTerminatedEvent(GroupTerminatedEvent groupTerminatedTopologyEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing group terminated event: [appId] %s",
+                     groupTerminatedTopologyEvent.getAppId()));
+         }
+         publishEvent(groupTerminatedTopologyEvent);
+     }
+ 
+     public static void sendGroupTerminatingEvent(GroupTerminatingEvent groupTerminatingTopologyEvent) {
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing group terminating event: [appId] %s",
+                     groupTerminatingTopologyEvent.getAppId()));
+         }
+         publishEvent(groupTerminatingTopologyEvent);
+     }
+ 
+     public static void sendClusterTerminatingEvent (ClusterTerminatingEvent clusterTerminatingEvent) {
+ 
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing Cluster terminating event: [appId] %s [cluster id] %s",
+                     clusterTerminatingEvent.getAppId(), clusterTerminatingEvent.getClusterId()));
+         }
+ 
+         publishEvent(clusterTerminatingEvent);
+     }
+ 
+     public static void sendClusterTerminatedEvent (ClusterTerminatedEvent clusterTerminatedEvent) {
+ 
+         if(log.isInfoEnabled()) {
+             log.info(String.format("Publishing Cluster terminated event: [appId] %s [cluster id] %s",
+                     clusterTerminatedEvent.getAppId(), clusterTerminatedEvent.getClusterId()));
+         }
  
+         publishEvent(clusterTerminatedEvent);
+     }
 -}
++    
 +	public static void publishEvent(Event event) {
 +		String topic = Util.getMessageTopicName(event);
 +		EventPublisher eventPublisher = EventPublisherPool.getPublisher(topic);
 +		eventPublisher.publish(event);
 +	}
 +}

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
index fe2493d,0ad8488..5cea0b7
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
@@@ -161,12 -159,11 +161,16 @@@ public class CloudControllerUtil 
                  }
              }
          }
 +        
 +        // populate container
 +        if(config.getContainer() != null) {
 +        	cartridge.setContainer(config.getContainer());
 +        }
  
+         if(config.getExportingProperties() != null){
+             cartridge.setExportingProperties(config.getExportingProperties());
+         }
+ 
          return cartridge;
      }
  	  

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.manager.console/console/util/utility.jag
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.manager.console/console/util/utility.jag
index 916f265,083b330..c75c209
--- a/components/org.apache.stratos.manager.console/console/util/utility.jag
+++ b/components/org.apache.stratos.manager.console/console/util/utility.jag
@@@ -321,20 -321,14 +321,31 @@@ consoleAppUtil = new function()
          
          if (response.xhr.status >= 200 && response.xhr.status < 300) { //if success
             session.put("get-status", "succeeded");
 +        } else if (response.xhr.status >= 300 && response.xhr.status < 400) { //if redirects
 +           if(response.data != null && response.data != undefined) {
 +               session.put("get-status", parse(response.data).Error.errorMessage);
 +           }
 +        } else if (response.xhr.status >= 400 && response.xhr.status < 500) { //if client error
 +           if(response.data != null && response.data != undefined) {
 +               session.put("get-status", parse(response.data).Error.errorMessage);
 +           }
 +        } else if (response.xhr.status >= 500 && response.xhr.status < 600) { //if server error
 +           if(response.data != null && response.data != undefined) {
 +               session.put("get-status", parse(response.data).Error.errorMessage);
 +           }
 +        } else {
 +           session.put("get-status", "Unknown response!");
++        
++        if (response.xhr.status >= 200 && response.xhr.status < 300) { //if success
++           session.put("get-status", "succeeded");
+         } else if (response.xhr.status >= 400 && response.xhr.status < 500) { //if client error
+            if(response.data != null && response.data != undefined) {
+                session.put("get-status", parse(response.data).Error.errorMessage);
+            }
+         } else if (response.xhr.status >= 500 && response.xhr.status < 600) { //if server error
+            if(response.data != null && response.data != undefined) {
+                session.put("get-status", response.data); return;
+            }
          }
  
          log.debug("sent is: " + stringify(response));
@@@ -401,20 -395,14 +412,30 @@@
  
          if (response.xhr.status >= 200 && response.xhr.status < 300) { //if success
             session.put("deploy-status", "succeeded");
 +        } else if (response.xhr.status >= 300 && response.xhr.status < 400) { //if redirects   
 +           if(response.data != null && response.data != undefined) {
 +               session.put("deploy-status", parse(response.data).Error.errorMessage);
 +           }
 +        } else if (response.xhr.status >= 400 && response.xhr.status < 500) { //if client error
 +           if(response.data != null && response.data != undefined) {
 +               session.put("deploy-status", parse(response.data).Error.errorMessage);
 +           }
 +        } else if (response.xhr.status >= 500 && response.xhr.status < 600) { //if server error
 +           if(response.data != null && response.data != undefined) {         
 +               session.put("deploy-status", parse(response.data).Error.errorMessage);
 +           }
 +        } else {
 +           session.put("deploy-status", "Unknown response!");
++        if (response.xhr.status >= 200 && response.xhr.status < 300) { //if success
++           session.put("deploy-status", "succeeded");
+         } else if (response.xhr.status >= 400 && response.xhr.status < 500) { //if client error
+            if(response.data != null && response.data != undefined) {
+                session.put("deploy-status", parse(response.data).Error.errorMessage);
+            }
+         } else if (response.xhr.status >= 500 && response.xhr.status < 600) { //if server error
+            if(response.data != null && response.data != undefined) {         
+                session.put("deploy-status", response.data); return;             
+            }
          }
          
          log.debug("sent is: " + stringify(response));

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/internal/ADCManagementServerComponent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
index 539c983,0dd09a5..eedd1e5
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/manager/CartridgeSubscriptionManager.java
@@@ -35,13 -37,8 +37,10 @@@ import org.apache.stratos.manager.lb.ca
  import org.apache.stratos.manager.repository.Repository;
  import org.apache.stratos.manager.retriever.DataInsertionAndRetrievalManager;
  import org.apache.stratos.manager.subscriber.Subscriber;
- import org.apache.stratos.manager.subscription.CartridgeSubscription;
- import org.apache.stratos.manager.subscription.PersistenceContext;
- import org.apache.stratos.manager.subscription.SubscriptionData;
- import org.apache.stratos.manager.subscription.SubscriptionDomain;
+ import org.apache.stratos.manager.subscription.*;
  import org.apache.stratos.manager.subscription.factory.CartridgeSubscriptionFactory;
 +import org.apache.stratos.manager.subscription.filter.LBCreationSubscriptionFilter;
 +import org.apache.stratos.manager.subscription.filter.SubscriptionFilter;
  import org.apache.stratos.manager.subscription.tenancy.SubscriptionMultiTenantBehaviour;
  import org.apache.stratos.manager.subscription.tenancy.SubscriptionSingleTenantBehaviour;
  import org.apache.stratos.manager.subscription.tenancy.SubscriptionTenancyBehaviour;
@@@ -69,14 -66,202 +69,209 @@@ import java.util.*
  public class CartridgeSubscriptionManager {
  
      private static Log log = LogFactory.getLog(CartridgeSubscriptionManager.class);
+     //private static DataInsertionAndRetrievalManager dataInsertionAndRetrievalManager = new DataInsertionAndRetrievalManager();
+ 
+     public GroupSubscription createGroupSubscription (String groupName, String groupAlias, int tenantId)
+             throws GroupSubscriptionException {
+ 
+         DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
+         GroupSubscription groupSubscription;
+ 
+         try {
+             groupSubscription = dataInsertionAndRetrievalMgr.getGroupSubscription(tenantId, groupName, groupAlias);
+ 
+         } catch (PersistenceManagerException e) {
+             throw new GroupSubscriptionException(e);
+         }
+ 
+         if (groupSubscription != null) {
+             // Group Subscription already exists with same Group name and alias
+             throw new GroupSubscriptionException("Group Subscription already exists with name [ " + groupName + " ], alias [ " + groupAlias + " ]");
+         }
+ 
+         return new GroupSubscription(groupName, groupAlias);
+     }
+ 
+     public ApplicationSubscription createApplicationSubscription (String appId, int tenantId)  throws ApplicationSubscriptionException {
+ 
+     	if (log.isDebugEnabled()) {
+             log.debug("create Application Subscription for appId: " + appId + " and tenantId: " + tenantId);
+         }
+     	
+         DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
+         ApplicationSubscription appSubscription;
+ 
+         try {
+             appSubscription = dataInsertionAndRetrievalMgr.getApplicationSubscription(tenantId, appId);
+ 
+         } catch (PersistenceManagerException e) {
+             log.error("failed to retrieve application Subscription for appId: " + appId + " and tenantId: " + tenantId + " e:" + e);
+             throw new ApplicationSubscriptionException(e);
+         }
+ 
+         if (appSubscription != null) {
+             // Composite App Subscription already exists with same app id
+            log.error("app Id already exists, failed to createappSubscription for appId: " + appId + " and tenantId: " + tenantId);
+            throw new ApplicationSubscriptionException("Composite App Subscription already exists with Id [ " +  appId + " ]");
+         } else {
+         	
+         	if (log.isDebugEnabled()) {
+         		log.debug("creating new application subscription for app:" + appId );
+         	}
+         	
+         	appSubscription = new ApplicationSubscription(appId);
+         	// persist 
+         	try {
+ 				this.persistApplicationSubscription(appSubscription);
+ 			} catch (ADCException e) {
+ 				// TODO Auto-generated catch block
+ 				log.error("Failed to persist applicaiton subscription for appId: " + appId +
+ 																			" and tenantId: " + tenantId + " e:" + e);
+ 			}
+         }
+ 
+         return new ApplicationSubscription(appId);
+     }
+     
+     public void removeApplicationSubscription (String appId, int tenantId)  throws ApplicationSubscriptionException {
+ 
+     	if (log.isDebugEnabled()) {
+             log.debug("remove Application Subscription for appId: " + appId + " and tenantId: " + tenantId);
+         }
+     	
+         DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
+         ApplicationSubscription appSubscription = null;
+ 
+         try {
+         	appSubscription = dataInsertionAndRetrievalMgr.getApplicationSubscription(tenantId, appId);
+ 
+         } catch (PersistenceManagerException e) {
+             log.error("failed to retrieve Application Subscription for appId: " + appId + " and tenantId: " + tenantId + "with exception:" + e);
+             throw new ApplicationSubscriptionException(e);
+         }
+ 
+         if (appSubscription != null) {
+         	
+         	try {
+ 				dataInsertionAndRetrievalMgr.removeApplicationSubscription(tenantId, appId);
+ 			} catch (PersistenceManagerException e) {
+ 				log.error("failed to remove Application Subscription for appId: " + appId + " and tenantId: " + tenantId + " with exception:" + e);
+ 				throw new ApplicationSubscriptionException(e);
+ 			}
+         	
+         	if (log.isDebugEnabled()) {
+                 log.debug("successfully removed Application Subscription for appId: " + appId + " and tenantId: " + tenantId);
+             }
+         	
+         } 
+     }
+     
+     public ApplicationSubscription getApplicationSubscription (String appId, int tenantId)  throws ApplicationSubscriptionException {
+     	if (log.isDebugEnabled()) {
+             log.debug("get Application Subscription for appId: " + appId + " and tenantId: " + tenantId);
+         }
+     	
+         DataInsertionAndRetrievalManager dataInsertionAndRetrievalMgr = new DataInsertionAndRetrievalManager();
+         ApplicationSubscription appSubscription = null;
+ 
+         try {
+             appSubscription = dataInsertionAndRetrievalMgr.getApplicationSubscription(tenantId, appId);
+ 
+         } catch (PersistenceManagerException e) {
+             log.error("failed to Application Subscription for appId: " + appId + " and tenantId: " + tenantId + " e:" + e);
+             throw new ApplicationSubscriptionException(e);
+         }
+         
+         return appSubscription;
+     }
+ 
+     public CartridgeSubscription createCartridgeSubscription (SubscriptionData subscriptionData) throws ADCException,
+             InvalidCartridgeAliasException, DuplicateCartridgeAliasException, PolicyException, UnregisteredCartridgeException,
+             RepositoryRequiredException, RepositoryCredentialsRequiredException, RepositoryTransportException,
+             AlreadySubscribedException, InvalidRepositoryException {
+ 
+ 
+         CartridgeSubscriptionUtils.validateCartridgeAlias(subscriptionData.getTenantId(), subscriptionData.getCartridgeType(), subscriptionData.getCartridgeAlias());
+ 
+         CartridgeInfo cartridgeInfo;
+         try {
+             cartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(subscriptionData.getCartridgeType());
+ 
+         } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
+             String message = subscriptionData.getCartridgeType() + " is not a valid cartridgeSubscription type. Please try again with a valid cartridgeSubscription type.";
+             log.error(message);
+             throw new ADCException(message, e);
+ 
+         } catch (Exception e) {
+             String message = "Error getting info for " + subscriptionData.getCartridgeType();
+             log.error(message, e);
+             throw new ADCException(message, e);
+         }
+ 
+         // subscribe to relevant service cartridge
+         CartridgeSubscription serviceCartridgeSubscription = subscribe (subscriptionData, cartridgeInfo, null);
+ 
+         return serviceCartridgeSubscription;
+     }
+ 
+     public void persistCartridgeSubscription (CartridgeSubscription cartridgeSubscription) throws ADCException {
+ 
+         try {
+             new DataInsertionAndRetrievalManager().cacheAndPersistSubcription(cartridgeSubscription);
+ 
+         } catch (PersistenceManagerException e) {
+             String errorMsg = "Error saving subscription for tenant " +
+                     cartridgeSubscription.getSubscriber().getTenantDomain() + ", alias " + cartridgeSubscription.getType();
+             log.error(errorMsg);
+             throw new ADCException(errorMsg, e);
+         }
+ 
+         log.info("Successful Subscription: " + cartridgeSubscription.toString());
+ 
+         // Publish tenant subscribed event to message broker
+         Set<String> clusterIds = new HashSet<String>();
+         clusterIds.add(cartridgeSubscription.getCluster().getClusterDomain());
+         CartridgeSubscriptionUtils.publishTenantSubscribedEvent(cartridgeSubscription.getSubscriber().getTenantId(),
+                 cartridgeSubscription.getCartridgeInfo().getType(), clusterIds);
+     }
+ 
+     public void persistGroupSubscription (GroupSubscription groupSubscription) throws ADCException {
+ 
+         try {
+             new DataInsertionAndRetrievalManager().persistGroupSubscription(groupSubscription);
+ 
+         } catch (PersistenceManagerException e) {
+             throw new ADCException(e);
+         }
+     }
+ 
+     public void persistApplicationSubscription (ApplicationSubscription compositeAppSubscription) throws ADCException {
+ 
+         try {
+             new DataInsertionAndRetrievalManager().persistApplicationSubscription(compositeAppSubscription);
+ 
+         } catch (PersistenceManagerException e) {
+             throw new ADCException(e);
+         }
+     }
      
+     public SubscriptionInfo subscribeToCartridgeWithProperties(SubscriptionData subscriptionData)  throws ADCException,
+                                                                                             InvalidCartridgeAliasException,
+                                                                                             DuplicateCartridgeAliasException,
+                                                                                             PolicyException,
+                                                                                             UnregisteredCartridgeException,
+                                                                                             RepositoryRequiredException,
+                                                                                             RepositoryCredentialsRequiredException,
+                                                                                             RepositoryTransportException,
+                                                                                             AlreadySubscribedException,
+                                                                                             InvalidRepositoryException {
 +    /**
 +     * 
 +     * @param subscriptionData
 +     * @return
 +     * @throws Exception since the caller doesn't react upon specific exceptions, simply throw Generic Exception class.
 +     */
 +    public static SubscriptionInfo subscribeToCartridgeWithProperties(SubscriptionData subscriptionData)  throws Exception {
  
          // validate cartridge alias
          CartridgeSubscriptionUtils.validateCartridgeAlias(subscriptionData.getTenantId(), subscriptionData.getCartridgeType(), subscriptionData.getCartridgeAlias());

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.messaging/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
index 9d6b301,1f69fd6..97b4d99
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
@@@ -204,21 -209,53 +210,57 @@@ public class Cluster implements Seriali
          return partitionIds.keySet();
      }
  
+     @Override
+     public boolean isStateTransitionValid(ClusterStatus newState) {
+         return clusterStateManager.isStateTransitionValid(newState);
+     }
+ 
+     @Override
+     public Stack<ClusterStatus> getTransitionedStates() {
+         return clusterStateManager.getStateStack();
+     }
+ 
      public ClusterStatus getStatus() {
-         return status;
+         //return status;
+         return clusterStateManager.getCurrentState();
      }
  
 +    public void setStatus(ClusterStatus status) {
 +        this.status = status;
 +    }
 +
-     @Override
-     public String toString() {
-         return "Cluster [serviceName=" + serviceName + ", clusterId=" + clusterId + ", autoscalePolicyName="
-                 + autoscalePolicyName + ", deploymentPolicyName=" + deploymentPolicyName + ", hostNames=" + hostNames
-                 + ", tenantRange=" + tenantRange + ", isLbCluster=" + isLbCluster + ", isKubernetesCluster="
-                 + isKubernetesCluster + ", memberMap=" + memberMap + ", status=" + status
-                 + ", loadBalanceAlgorithmName=" + loadBalanceAlgorithmName + ", properties=" + properties + "]";
+     public void setStatus(ClusterStatus newStatus) {
+         clusterStateManager.changeState(newStatus);
+         //this.status = newStatus;
      }
+ 
+     public boolean equals(Object other) {
+         if (other == null || !(other instanceof Cluster)) {
+             return false;
+         }
+ 
+         if (this == other) {
+             return true;
+         }
+ 
+         Cluster that = (Cluster) other;
+         return this.clusterId.equals(that.clusterId);
+     }
+ 
+     public int hashCode() {
+         return clusterId.hashCode();
+     }
+ 
+     public String getAppId() {
+         return appId;
+     }
+ 
+ //    public ClusterStatus getTempStatus() {
+ //        return status;
+ //    }
+ //
+ //    public void setTempStatus(ClusterStatus status) {
+ //        this.status = status;
+ //    }
  }
  

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
index 70872c5,fbab2f6..989f079
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
@@@ -50,15 -49,16 +50,17 @@@ public class Member implements Serializ
      @XmlJavaTypeAdapter(MapAdapter.class)
      private Properties properties;
      private String lbClusterId;
+     private LifeCycleStateManager<MemberStatus> memberStateManager;
  
 -    public Member(String serviceName, String clusterId, String networkPartitionId, String partitionId, String memberId) {
 +    public Member(String serviceName, String clusterId, String networkPartitionId, String partitionId, String memberId, long initTime) {
          this.serviceName = serviceName;
          this.clusterId = clusterId;
          this.networkPartitionId = networkPartitionId;
          this.partitionId = partitionId;
          this.memberId = memberId;
          this.portMap = new HashMap<Integer, Port>();
 +        this.initTime = initTime;
+         this.memberStateManager = new LifeCycleStateManager<MemberStatus>(MemberStatus.Created, memberId);
      }
  
      public String getServiceName() {
@@@ -72,21 -72,28 +74,33 @@@
      public String getMemberId() {
          return memberId;
      }
 +    
 +    public long getInitTime() {
 +        return initTime;
 +    }
 +    
+ 
+     @Override
+     public boolean isStateTransitionValid(MemberStatus newState) {
+         return memberStateManager.isStateTransitionValid(newState);
+     }
+ 
+     @Override
      public MemberStatus getStatus() {
-         return status;
+         return memberStateManager.getCurrentState();
+     }
+ 
+     public Stack<MemberStatus> getTransitionedStates () {
+         return memberStateManager.getStateStack();
      }
  
-     public void setStatus(MemberStatus status) {
-         this.status = status;
+     @Override
+     public void setStatus(MemberStatus newState) {
+         this.memberStateManager.changeState(newState);
      }
  
-     public boolean isActive() {
-         return (this.status == MemberStatus.Activated);
+     public boolean isActive () {
+         return memberStateManager.getCurrentState().equals(MemberStatus.Activated);
      }
  
      public Collection<Port> getPorts() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberMaintenanceModeEvent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Constants.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
index 168ebe3,48905f3..c458f77
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/util/Util.java
@@@ -57,120 -56,102 +63,126 @@@ public class Util 
  		return props;
  	}
  
 -    /**
 -     * Validate tenant range.
 -     * Valid formats: Integer-Integer, Integer-*
 -     * Examples: 1-100, 101-200, 201-*
 -     * @param tenantRange
 -     */
 -    public static void validateTenantRange(String tenantRange) {
 -        boolean valid = false;
 -        if(tenantRange != null) {
 -            if(tenantRange.equals("*")) {
 -                valid = true;
 -            } else {
 -               String[] array = tenantRange.split(Constants.TENANT_RANGE_DELIMITER);
 -                if(array.length == 2) {
 -                    // Integer-Integer
 -                    if(isNumber(array[0]) && (isNumber(array[1]))){
 -                        valid = true;
 -                    }
 -                    // Integer-*
 -                    else if(isNumber(array[0]) && "*".equals(array[1])) {
 -                        valid = true;
 -                    }
 -                }
 -            }
 +	/**
 +	 * Validate tenant range.
 +	 * Valid formats: Integer-Integer, Integer-*
 +	 * Examples: 1-100, 101-200, 201-*
 +	 * 
 +	 * @param tenantRange
 +	 */
 +	public static void validateTenantRange(String tenantRange) {
 +		boolean valid = false;
 +		if (tenantRange != null) {
 +			if (tenantRange.equals("*")) {
 +				valid = true;
 +			} else {
 +				String[] array = tenantRange.split(Constants.TENANT_RANGE_DELIMITER);
 +				if (array.length == 2) {
 +					// Integer-Integer
 +					if (isNumber(array[0]) && (isNumber(array[1]))) {
 +						valid = true;
 +					}
 +					// Integer-*
 +					else if (isNumber(array[0]) && "*".equals(array[1])) {
 +						valid = true;
 +					}
 +				}
 +			}
  
 -        }
 -        if(!valid)
 -            throw new RuntimeException(String.format("Tenant range %s is not valid", tenantRange));
 -    }
 +		}
 +		if (!valid)
 +			throw new RuntimeException(String.format("Tenant range %s is not valid", tenantRange));
 +	}
  
- 	public static boolean isNumber(String s) {
- 		try {
- 			Integer.parseInt(s);
- 			return true;
- 		} catch (NumberFormatException e) {
- 			// Not a valid number
- 		}
- 		return false;
- 	}
- 
- 	/**
- 	 * Transform json into an object of given type.
- 	 * 
- 	 * @param json
- 	 * @param type
- 	 * @return
- 	 */
- 	public static Object jsonToObject(String json, Class type) {
- 		return (new JsonMessage(json, type)).getObject();
- 	}
+     public static boolean isNumber(String s) {
+         try {
+             Integer.parseInt(s);
+             return true;
+         }
+         catch (NumberFormatException e) {
+             // Not a valid number
+         }
+         return false;
+     }
+     
+     /**
+      * Transform json into an object of given type.
+      * @param json
+      * @param type
+      * @return
+      */
+     public static Object jsonToObject(String json, Class type) {
+         return (new JsonMessage(json, type)).getObject();
+     }
+     
+     public static String ObjectToJson(Object obj) {
+     	Gson gson = new Gson();
+     	String result = gson.toJson(obj);
+     	return result;
+     }
  
 +	// Time interval between each ping message sent to topic.
 +	private static int averagePingInterval;
 +
 +	// Time interval between each ping message after an error had occurred.
 +	private static int failoverPingInterval;
 +
 +	/**
 +	 * fetch value from system param
 +	 * 
 +	 * @return
 +	 */
 +	public static int getAveragePingInterval() {
 +		if (averagePingInterval <= 0) {
 +			averagePingInterval =
 +			                      Util.getNumericSystemProperty(Constants.DEFAULT_AVERAGE_PING_INTERVAL,
 +			                                                    Constants.AVERAGE_PING_INTERVAL_PROPERTY);
 +		}
 +		return averagePingInterval;
 +	}
  
 -    // Time interval between each ping message sent to topic.
 -    private static int averagePingInterval;
 +	/**
 +	 * fetch value from system param
 +	 * 
 +	 * @return
 +	 */
 +	public static int getFailoverPingInterval() {
 +		if (failoverPingInterval <= 0) {
 +			failoverPingInterval =
 +			                       Util.getNumericSystemProperty(Constants.DEFAULT_FAILOVER_PING_INTERVAL,
 +			                                                     Constants.FAILOVER_PING_INTERVAL_PROPERTY);
 +		}
 +		return failoverPingInterval;
 +	}
  
 -    // Time interval between each ping message after an error had occurred.
 -    private static int failoverPingInterval;
 +	/**
 +	 * Method to safely access numeric system properties
 +	 * 
 +	 * @param defaultValue
 +	 * @return
 +	 */
 +	public static Integer getNumericSystemProperty(Integer defaultValue, String propertyKey) {
 +		try {
 +			return Integer.valueOf(System.getProperty(propertyKey));
 +		} catch (NumberFormatException ex) {
 +			return defaultValue;
 +		}
 +	}
  
 -    /**
 -     * fetch value from system param
 -     * @return
 -     */
 -    public static int getAveragePingInterval() {
 -        if (averagePingInterval <= 0) {
 -            averagePingInterval = Util.getNumericSystemProperty(Constants.DEFAULT_AVERAGE_PING_INTERVAL,Constants.AVERAGE_PING_INTERVAL_PROPERTY);
 -        }
 -        return averagePingInterval;
 -    }
 +	public static String getMessageTopicName(Event event) {
 +		return event.getClass().getName().substring(BEGIN_INDEX).replace(".", "/");
 +	}
  
 -    /**
 -     * fetch value from system param
 -     * @return
 -     */
 -    public static int getFailoverPingInterval() {
 -        if (failoverPingInterval <= 0) {
 -            failoverPingInterval = Util.getNumericSystemProperty(Constants.DEFAULT_FAILOVER_PING_INTERVAL,Constants.FAILOVER_PING_INTERVAL_PROPERTY);
 -        }
 -        return failoverPingInterval;
 -    }
 +	public static String getEventNameForTopic(String arg0) {
 +		return "org.apache.stratos.messaging.event.".concat(arg0.replace("/", "."));
 +	}
  
 -    /**
 -     * Method to safely access numeric system properties
 -     * @param defaultValue
 -     * @return
 -     */
 -    public static Integer getNumericSystemProperty(Integer defaultValue, String propertyKey) {
 -        try {
 -            return Integer.valueOf(System.getProperty(propertyKey));
 -        } catch (NumberFormatException ex) {
 -            return defaultValue;
 -        }
 -    }
 +	public static String getRandomString(int len) {
 +		String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 +		Random rnd = new Random();
 +		StringBuilder sb = new StringBuilder(len);
 +		for (int i = 0; i < len; i++)
 +			sb.append(AB.charAt(rnd.nextInt(AB.length())));
 +		return sb.toString();
 +	}
  }

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/CartridgeDefinitionBean.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/CartridgeDefinitionBean.java
index c69659e,2a99610..56dbfcf
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/CartridgeDefinitionBean.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/CartridgeDefinitionBean.java
@@@ -59,17 -57,16 +59,20 @@@ public class CartridgeDefinitionBean 
      public String defaultDeploymentPolicy;
      
      public String serviceGroup;
 +    
 +    public ContainerBean container;
 +    
 +    public String deployerType;
  
+     private String[] exportingProperties;
+ 
      public String toString () {
  
          return "Type: " + type + ", Provider: " + provider + ", Host: " + host + ", Display Name: " + displayName +
 -                ", Description: " + description +  ", Version: " + version + ", Multitenant " + multiTenant + "\n" +
 +                ", Description: " + description +  ", Version: " + version + ", Multitenant " + multiTenant +", Public " + isPublic + "\n" +
                  getDeploymentDetails() + "\n PortMapping: " + getPortMappings() + "\n IaaS: " + getIaasProviders() +
-                 "\n LoadBalancer: " + getLoadBalancerInfo() + "\n Properties: " + getProperties() +"\n VolumeBean mappings "+ persistence.toString();
+                 "\n LoadBalancer: " + getLoadBalancerInfo() + "\n Properties: " + getProperties() +"\n VolumeBean mappings "+ persistence.toString()
+                 + "\n Exports " + exportingProperties.toString();
      }
  
  	private String getDeploymentDetails () {

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Cluster.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Cluster.java
index e7de37a,f2e5d73..e8a30f9
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Cluster.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Cluster.java
@@@ -19,13 -19,19 +19,13 @@@
  package org.apache.stratos.rest.endpoint.bean.topology;
  
  import javax.xml.bind.annotation.XmlRootElement;
 +import org.apache.stratos.rest.endpoint.bean.cartridge.definition.PropertyBean;
 +
  import java.util.List;
  
- @XmlRootElement
+ @XmlRootElement(name="clusters")
  public class Cluster {
  
 -    @Override
 -	public String toString() {
 -		return "Cluster [serviceName=" + serviceName + ", clusterId="
 -				+ clusterId + ", member=" + member + ", tenantRange="
 -				+ tenantRange + ", hostNames=" + hostNames + ", isLbCluster="
 -				+ isLbCluster + "]";
 -	}
 -
  	public String serviceName;
  
      public String clusterId;

http://git-wip-us.apache.org/repos/asf/stratos/blob/17cc86eb/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
index 40cc88d,cc3ae4a..871078f
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
@@@ -20,12 -20,23 +20,25 @@@
  package org.apache.stratos.rest.endpoint.bean.util.converter;
  
  import org.apache.commons.lang.StringUtils;
 +import org.apache.stratos.autoscaler.stub.kubernetes.PropertiesE;
 +import org.apache.stratos.autoscaler.stub.kubernetes.PropertyE;
+ import org.apache.commons.logging.Log;
+ import org.apache.commons.logging.LogFactory;
  import org.apache.stratos.cloud.controller.stub.pojo.*;
+ import org.apache.stratos.cloud.controller.stub.pojo.application.*;
+ import org.apache.stratos.manager.composite.application.beans.ApplicationDefinition;
+ import org.apache.stratos.manager.composite.application.beans.GroupDefinition;
+ import org.apache.stratos.manager.composite.application.beans.SubscribableDefinition;
+ import org.apache.stratos.manager.composite.application.beans.SubscribableInfo;
  import org.apache.stratos.manager.deploy.service.Service;
+ import org.apache.stratos.manager.grouping.definitions.DependencyDefinitions;
+ import org.apache.stratos.manager.grouping.definitions.ServiceGroupDefinition;
  import org.apache.stratos.manager.subscription.SubscriptionDomain;
+ import org.apache.stratos.messaging.domain.topology.Application;
  import org.apache.stratos.messaging.domain.topology.Cluster;
+ import org.apache.stratos.messaging.domain.topology.Group;
+ import org.apache.stratos.rest.endpoint.bean.ApplicationBean;
+ import org.apache.stratos.rest.endpoint.bean.GroupBean;
  import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.Partition;
  import org.apache.stratos.rest.endpoint.bean.autoscaler.partition.PartitionGroup;
  import org.apache.stratos.rest.endpoint.bean.autoscaler.policy.autoscale.*;
@@@ -95,23 -99,23 +108,36 @@@ public class PojoConverter 
              cartridgeConfig.setProperties(getProperties(cartridgeDefinitionBean.property));
          }
  
+         if(cartridgeDefinitionBean.getExportingProperties() != null)
+         {
+             cartridgeConfig.setExportingProperties(cartridgeDefinitionBean.getExportingProperties());
+         }
+         
 +        if (cartridgeDefinitionBean.container != null) {
 +            cartridgeConfig.setContainer(getContainer(cartridgeDefinitionBean.container));
 +        }
 +
          return cartridgeConfig;
      }
+     
+     public static ServiceGroup populateServiceGroupPojo (ServiceGroupDefinition serviceGroupDefinition ) {
+     	ServiceGroup servicegroup = new ServiceGroup();
+     	
+     	// implement conversion (mostly List -> Array)
+     	
+     	return servicegroup;
+     }
  
 -	private static LoadbalancerConfig getLBConfig(LoadBalancerBean loadBalancer) {
 +
 +    private static Container getContainer(ContainerBean container) {
 +        Container cn = new Container();
 +        cn.setDockerFileRepo(container.dockerfileRepo);
 +        cn.setImageName(container.imageName);
 +        //cn.setProperties(getProperties(container.property));
 +        return cn;
 +    }
 +
 +    private static LoadbalancerConfig getLBConfig(LoadBalancerBean loadBalancer) {
          LoadbalancerConfig lbConfig = new LoadbalancerConfig();
          lbConfig.setType(loadBalancer.type);
          if (loadBalancer.property != null && !loadBalancer.property.isEmpty()) {
@@@ -170,13 -174,14 +196,17 @@@
          return iaasConfigsArray;
      }
  
 +    public static Persistence getPersistence(PersistenceBean persistenceBean) {
+      public static Persistence getPersistence(PersistenceBean persistenceBean) {
+ 
          Persistence persistence = new Persistence();
          persistence.setPersistanceRequired(persistenceBean.isRequired);
          VolumeBean[] volumeBean = new VolumeBean[persistenceBean.volume.size()];
          persistenceBean.volume.toArray(volumeBean);
 +        Volume[] volumes = new Volume[persistenceBean.volume.size()];
 +        for (int i = 0; i < volumes.length; i++) {
+          Volume[] volumes = new Volume[persistenceBean.volume.size()];
+          for (int i = 0 ; i < volumes.length ; i++) {
              Volume volume = new Volume();
              volume.setId(volumeBean[i].id);
              volume.setVolumeId(volumeBean[i].volumeId);
@@@ -694,171 -674,141 +724,305 @@@
          for (Service service : services) {
              serviceDefinitionBeans.add(convertToServiceDefinitionBean(service));
          }
 -
          return serviceDefinitionBeans;
      }
 +
 +    public static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup convertToASKubernetesGroupPojo(KubernetesGroup kubernetesGroupBean) {
 +
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup kubernetesGroup = new
 +                org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup();
 +
 +        kubernetesGroup.setGroupId(kubernetesGroupBean.getGroupId());
 +        kubernetesGroup.setDescription(kubernetesGroupBean.getDescription());
 +        kubernetesGroup.setKubernetesMaster(convertToASKubernetesMasterPojo(kubernetesGroupBean.getKubernetesMaster()));
 +        kubernetesGroup.setPortRange(convertToASPortRange(kubernetesGroupBean.getPortRange()));
 +        kubernetesGroup.setKubernetesHosts(convertToASKubernetesHostsPojo(kubernetesGroupBean.getKubernetesHosts()));
 +        kubernetesGroup.setProperties((getASProperties(kubernetesGroupBean.getProperty())));
 +
 +        return kubernetesGroup;
 +    }
 +
 +    private static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[] convertToASKubernetesHostsPojo(List<KubernetesHost> kubernetesHosts) {
 +        if (kubernetesHosts == null || kubernetesHosts.isEmpty()) {
 +            return null;
 +        }
 +        int kubernetesHostCount = kubernetesHosts.size();
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[]
 +                kubernetesHostsArr = new org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[kubernetesHostCount];
 +        for (int i = 0; i < kubernetesHostCount; i++) {
 +            KubernetesHost kubernetesHostBean = kubernetesHosts.get(i);
 +            kubernetesHostsArr[i] = convertToASKubernetesHostPojo(kubernetesHostBean);
 +        }
 +        return kubernetesHostsArr;
 +    }
 +
 +
 +    private static org.apache.stratos.autoscaler.stub.kubernetes.PortRange convertToASPortRange(PortRange portRangeBean) {
 +        if (portRangeBean == null) {
 +            return null;
 +        }
 +        org.apache.stratos.autoscaler.stub.kubernetes.PortRange
 +                portRange = new org.apache.stratos.autoscaler.stub.kubernetes.PortRange();
 +        portRange.setLower(portRangeBean.getLower());
 +        portRange.setUpper(portRangeBean.getUpper());
 +        return portRange;
 +    }
 +
 +    public static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost convertToASKubernetesHostPojo(KubernetesHost kubernetesHostBean) {
 +        if (kubernetesHostBean == null) {
 +            return null;
 +        }
 +
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost
 +                kubernetesHost = new org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost();
 +        kubernetesHost.setHostId(kubernetesHostBean.getHostId());
 +        kubernetesHost.setHostIpAddress(kubernetesHostBean.getHostIpAddress());
 +        kubernetesHost.setHostname(kubernetesHostBean.getHostname());
 +        kubernetesHost.setProperties(getASProperties(kubernetesHostBean.getProperty()));
 +
 +        return kubernetesHost;
 +    }
 +
 +    public static org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster convertToASKubernetesMasterPojo(KubernetesMaster kubernetesMasterBean) {
 +        if (kubernetesMasterBean == null) {
 +            return null;
 +        }
 +
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster
 +                kubernetesMaster = new org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster();
 +        kubernetesMaster.setHostId(kubernetesMasterBean.getHostId());
 +        kubernetesMaster.setHostIpAddress(kubernetesMasterBean.getHostIpAddress());
 +        kubernetesMaster.setHostname(kubernetesMasterBean.getHostname());
 +        kubernetesMaster.setEndpoint(kubernetesMasterBean.getEndpoint());
 +        kubernetesMaster.setProperties(getASProperties(kubernetesMasterBean.getProperty()));
 +
 +        return kubernetesMaster;
 +    }
 +
 +    public static KubernetesGroup[] populateKubernetesGroupsPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup[] kubernetesGroups) {
 +
 +        if (kubernetesGroups == null){
 +            return null;
 +        }
 +        KubernetesGroup[] kubernetesGroupsBean = new KubernetesGroup[kubernetesGroups.length];
 +        for (int i = 0; i < kubernetesGroups.length; i++){
 +            kubernetesGroupsBean[i] = populateKubernetesGroupPojo(kubernetesGroups[i]);
 +        }
 +        return kubernetesGroupsBean;
 +    }
 +
 +    public static KubernetesGroup populateKubernetesGroupPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup kubernetesGroup) {
 +        if (kubernetesGroup == null){
 +            return null;
 +        }
 +        KubernetesGroup kubernetesGroupBean = new KubernetesGroup();
 +        kubernetesGroupBean.setGroupId(kubernetesGroup.getGroupId());
 +        kubernetesGroupBean.setDescription(kubernetesGroup.getDescription());
 +        kubernetesGroupBean.setPortRange(populatePortRangePojo(kubernetesGroup.getPortRange()));
 +        kubernetesGroupBean.setKubernetesHosts(populateKubernetesHostsPojo(kubernetesGroup.getKubernetesHosts()));
 +        kubernetesGroupBean.setKubernetesMaster(populateKubernetesMasterPojo(kubernetesGroup.getKubernetesMaster()));
 +        kubernetesGroupBean.setProperty(populateASProperties(kubernetesGroup.getProperties()));
 +        return kubernetesGroupBean;
 +    }
 +
 +    public static KubernetesMaster populateKubernetesMasterPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster kubernetesMaster) {
 +        if (kubernetesMaster == null){
 +            return null;
 +        }
 +        KubernetesMaster kubernetesMasterBean = new KubernetesMaster();
 +        kubernetesMasterBean.setHostId(kubernetesMaster.getHostId());
 +        kubernetesMasterBean.setHostname(kubernetesMaster.getHostname());
 +        kubernetesMasterBean.setHostIpAddress(kubernetesMaster.getHostIpAddress());
 +        kubernetesMasterBean.setProperty(populateASProperties(kubernetesMaster.getProperties()));
 +        kubernetesMasterBean.setEndpoint(kubernetesMaster.getEndpoint());
 +        return kubernetesMasterBean;
 +    }
 +
 +    public static List<KubernetesHost> populateKubernetesHostsPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[] kubernetesHosts) {
 +        if (kubernetesHosts == null){
 +            return null;
 +        }
 +        List<KubernetesHost> kubernetesHostList = new ArrayList<KubernetesHost>();
 +        for (int i = 0; i < kubernetesHosts.length; i++){
 +            kubernetesHostList.add(populateKubernetesHostPojo(kubernetesHosts[i]));
 +        }
 +        return kubernetesHostList;
 +    }
 +
 +    private static KubernetesHost populateKubernetesHostPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost kubernetesHost) {
 +        if (kubernetesHost == null){
 +            return null;
 +        }
 +        KubernetesHost kubernetesHostBean = new KubernetesHost();
 +        kubernetesHostBean.setHostId(kubernetesHost.getHostId());
 +        kubernetesHostBean.setHostname(kubernetesHost.getHostname());
 +        kubernetesHostBean.setHostIpAddress(kubernetesHost.getHostIpAddress());
 +        kubernetesHostBean.setProperty(populateASProperties(kubernetesHost.getProperties()));
 +        return kubernetesHostBean;
 +    }
 +
 +    private static List<PropertyBean> populateASProperties(PropertiesE properties) {
 +        if (properties == null || properties.getProperties() == null){
 +            return null;
 +        }
 +        List<PropertyBean> propertyBeanList = new ArrayList<PropertyBean>();
 +        for (int i = 0; i < properties.getProperties().length; i++){
 +            propertyBeanList.add(populateASProperty(properties.getProperties()[i]));
 +        }
 +        return propertyBeanList;
 +    }
 +
 +    private static PropertyBean populateASProperty(PropertyE propertyE) {
 +        if (propertyE == null){
 +            return null;
 +        }
 +        PropertyBean propertyBean = new PropertyBean();
 +        propertyBean.name = propertyE.getName();
 +        propertyBean.value = propertyE.getValue();
 +        return propertyBean;
 +    }
 +
 +    private static PortRange populatePortRangePojo(org.apache.stratos.autoscaler.stub.kubernetes.PortRange portRange) {
 +        if (portRange == null){
 +            return null;
 +        }
 +        PortRange portRangeBean = new PortRange();
 +        portRangeBean.setUpper(portRange.getUpper());
 +        portRangeBean.setLower(portRange.getLower());
 +        return portRangeBean;
 +    }
+     
+ 	private static Log log = LogFactory.getLog(PojoConverter.class);
+ 
+     public static ApplicationContext convertApplicationBeanToApplicationContext (ApplicationDefinition compositeAppDefinition) {
+ 
+         ApplicationContext applicationContext = new ApplicationContext();
+         applicationContext.setApplicationId(compositeAppDefinition.getApplicationId());
+         applicationContext.setAlias(compositeAppDefinition.getAlias());
+ 
+         // convert and set components
+         if (compositeAppDefinition.getComponents() != null) {
+             ComponentContext componentContext = new ComponentContext();
+             // top level subscribables
+             if (compositeAppDefinition.getComponents().getSubscribables() != null) {
+                 componentContext.setSubscribableContexts(getSubscribableContextArrayFromSubscribableDefinitions(
+                         compositeAppDefinition.getComponents().getSubscribables()));
+             }
+             // top level Groups
+             if (compositeAppDefinition.getComponents().getGroups() != null) {
+                 componentContext.setGroupContexts(getgroupContextArrayFromGroupDefinitions(compositeAppDefinition.getComponents().getGroups()));
+             }
+             // top level dependency information
+             if (compositeAppDefinition.getComponents().getDependencies() != null) {
+                 componentContext.setDependencyContext(getDependencyContextFromDependencyDefinition(compositeAppDefinition.getComponents().getDependencies()));
+             }
+ 
+             applicationContext.setComponents(componentContext);
+         }
+ 
+         // subscribable information
+         applicationContext.setSubscribableInfoContext(getSubscribableInfoContextArrFromSubscribableInfoDefinition(compositeAppDefinition.getSubscribableInfo()));
+ 
+         return applicationContext;
+     }
+ 
+     private static SubscribableInfoContext[] getSubscribableInfoContextArrFromSubscribableInfoDefinition (List<SubscribableInfo> subscribableInfos) {
+ 
+         SubscribableInfoContext[] subscribableInfoContexts = new SubscribableInfoContext[subscribableInfos.size()];
+         int i = 0;
+         for (SubscribableInfo subscribableInfo : subscribableInfos) {
+             SubscribableInfoContext subscribableInfoContext = new SubscribableInfoContext();
+             subscribableInfoContext.setAlias(subscribableInfo.getAlias());
+             subscribableInfoContext.setAutoscalingPolicy(subscribableInfo.getAutoscalingPolicy());
+             subscribableInfoContext.setDeploymentPolicy(subscribableInfo.getDeploymentPolicy());
+             subscribableInfoContext.setRepoUrl(subscribableInfo.getRepoUrl());
+             subscribableInfoContext.setPrivateRepo(subscribableInfo.isPrivateRepo());
+             subscribableInfoContext.setRepoUsername(subscribableInfo.getRepoUsername());
+             subscribableInfoContext.setRepoPassword(subscribableInfo.getRepoPassword());
+             subscribableInfoContext.setDependencyAliases(subscribableInfo.getDependencyAliases());
+             subscribableInfoContexts[i++] =  subscribableInfoContext;
+ 
+         }
+ 
+         return subscribableInfoContexts;
+     }
+ 
+     private static DependencyContext getDependencyContextFromDependencyDefinition (DependencyDefinitions dependencyDefinitions) {
+ 
+         DependencyContext dependencyContext = new DependencyContext();
+         dependencyContext.setKillBehaviour(dependencyDefinitions.getKillBehaviour());
+         
+         if (dependencyDefinitions != null && dependencyDefinitions.getStartupOrders() != null) {
+         	String [] startupOrders = new String [dependencyDefinitions.getStartupOrders().size()];
+         	startupOrders = dependencyDefinitions.getStartupOrders().toArray(startupOrders);
+         	dependencyContext.setStartupOrdersContexts(startupOrders);
+         }
+ 
+         return dependencyContext;
+     }
+ 
+     private static GroupContext[] getgroupContextArrayFromGroupDefinitions (List<GroupDefinition> groupDefinitions) {
+ 
+         GroupContext[] groupContexts = new GroupContext[groupDefinitions.size()];
+         int i = 0;
+         for (GroupDefinition groupDefinition : groupDefinitions) {
+             GroupContext groupContext = new GroupContext();
+             groupContext.setName(groupDefinition.getName());
+             groupContext.setAlias(groupDefinition.getAlias());
+             groupContext.setDeploymentPolicy(groupDefinition.getDeploymentPolicy());
+             groupContext.setAutoscalingPolicy(groupDefinition.getAutoscalingPolicy());
+             // nested Subscribables
+             if (groupDefinition.getSubscribables() != null) {
+                 groupContext.setSubscribableContexts(getSubscribableContextArrayFromSubscribableDefinitions(groupDefinition.getSubscribables()));
+             }
+             // nested Groups
+             if (groupDefinition.getSubGroups() != null) {
+                 groupContext.setGroupContexts(getgroupContextArrayFromGroupDefinitions(groupDefinition.getSubGroups()));
+             }
+             groupContexts[i++] = groupContext;
+         }
+ 
+         return groupContexts;
+     }
+ 
+     private static SubscribableContext [] getSubscribableContextArrayFromSubscribableDefinitions(List<SubscribableDefinition> subscribableDefinitions) {
+ 
+         SubscribableContext[] subscribableContexts = new SubscribableContext[subscribableDefinitions.size()];
+         int i = 0;
+         for (SubscribableDefinition subscribableDefinition : subscribableDefinitions) {
+             SubscribableContext subscribableContext = new SubscribableContext();
+             subscribableContext.setType(subscribableDefinition.getType());
+             subscribableContext.setAlias(subscribableDefinition.getAlias());
+             subscribableContexts[i++] = subscribableContext;
+         }
+ 
+         return subscribableContexts;
+     }
+ 
+ 
+     public static ApplicationBean applicationToBean(Application application) {
+ 
+         if(application == null){
+             return null;
+         }
+ 
+         ApplicationBean applicationBean = new ApplicationBean();
+         applicationBean.setId(application.getUniqueIdentifier());
+         applicationBean.setTenantDomain(application.getTenantDomain());
+         applicationBean.setTenantAdminUsername(application.getTenantAdminUserName());
+         return applicationBean;
+     }
+ 
+     public static GroupBean toGroupBean(Group group) {
+         if(group == null){
+             return null;
+         }
+ 
+         GroupBean groupBean = new GroupBean();
+         groupBean.setAlias(group.getUniqueIdentifier());
+         groupBean.setDeploymentPolicy(group.getDeploymentPolicy());
+         groupBean.setAutoScalingPolicy(group.getAutoscalingPolicy());
+         return groupBean;
+     }
+ 	
  }