You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ma...@apache.org on 2014/07/08 09:41:59 UTC

[09/14] Clustering changes for stratos

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
index 0e3982b..7954dc9 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
@@ -21,15 +21,18 @@ package org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cartridge.agent.CartridgeAgent;
 import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.RepositoryInformation;
 import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.internal.CustomJschConfigSessionFactory;
 import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.internal.GitDeploymentSynchronizerConstants;
 import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.internal.RepositoryContext;
 import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.util.Utilities;
-import org.apache.stratos.cartridge.agent.util.ExtensionUtils;
+import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
+import org.apache.stratos.cartridge.agent.extensions.ExtensionHandler;
 import org.eclipse.jgit.api.*;
 import org.eclipse.jgit.api.errors.*;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.storage.file.FileRepository;
 import org.eclipse.jgit.transport.SshSessionFactory;
@@ -38,33 +41,32 @@ import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
 import java.io.File;
 import java.io.IOException;
 import java.util.Iterator;
-import java.util.Map.Entry;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.*;
 
 /**
  * Git based artifact repository.
- * 
- * 
  */
 public class GitBasedArtifactRepository {
 
     private static final int SUPER_TENANT_ID = -1234;
 
-	private static final Log log = LogFactory.getLog(GitBasedArtifactRepository.class);
+    private static final Log log = LogFactory.getLog(GitBasedArtifactRepository.class);
+    private final ExtensionHandler extensionHandler;
 
     //Map to keep track of git context per tenant (remote urls, jgit git objects, etc.)
     private static ConcurrentHashMap<Integer, RepositoryContext>
-    					tenantToRepoContextMap = new ConcurrentHashMap<Integer, RepositoryContext>();
+            tenantToRepoContextMap = new ConcurrentHashMap<Integer, RepositoryContext>();
     private static volatile GitBasedArtifactRepository gitBasedArtifactRepository;
-    private static String SUPER_TENANT_APP_PATH = "/repository/deployment/server/";
-    private static String TENANT_PATH = "/repository/tenants/";
-
-    private GitBasedArtifactRepository () {
+    private static String SUPER_TENANT_REPO_PATH = "/repository/deployment/server/";
+    private static String TENANT_REPO_PATH = "/repository/tenants/";
 
+    private GitBasedArtifactRepository() {
+        extensionHandler = CartridgeAgent.getExtensionHandler();
     }
 
-    public static GitBasedArtifactRepository getInstance () {
+    public static GitBasedArtifactRepository getInstance() {
 
         if (gitBasedArtifactRepository == null) {
             synchronized (GitBasedArtifactRepository.class) {
@@ -80,40 +82,38 @@ public class GitBasedArtifactRepository {
      * initializes and populates the git context with relevant data
      *
      * @param repositoryInformation id of the tenant
-     *
      */
-    private void initGitContext (RepositoryInformation repositoryInformation)  {
+    private void initGitContext(RepositoryInformation repositoryInformation) {
+
+
+        log.info("Initializing git context.");
 
-    	
-    	log.info("Initializing git context.");
-    	
-    	int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
-    	String gitLocalRepoPath = repositoryInformation.getRepoPath();
+        int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+        String gitLocalRepoPath = repositoryInformation.getRepoPath();
         RepositoryContext gitRepoCtx = new RepositoryContext();
         String gitRemoteRepoUrl = repositoryInformation.getRepoUrl();
         boolean isMultitenant = repositoryInformation.isMultitenant();
-        
+
         log.info("local path " + gitLocalRepoPath);
         log.info("remote url " + gitRemoteRepoUrl);
         log.info("tenant " + tenantId);
-        
+
         gitRepoCtx.setTenantId(tenantId);
-        gitRepoCtx.setGitLocalRepoPath(getRepoPathForTenantId(tenantId,gitLocalRepoPath,isMultitenant));        
+        gitRepoCtx.setGitLocalRepoPath(getRepoPathForTenantId(tenantId, gitLocalRepoPath, isMultitenant));
         gitRepoCtx.setGitRemoteRepoUrl(gitRemoteRepoUrl);
-		
-		gitRepoCtx.setRepoUsername(repositoryInformation.getRepoUsername());
-		gitRepoCtx.setRepoPassword(repositoryInformation.getRepoPassword());
+
+        gitRepoCtx.setRepoUsername(repositoryInformation.getRepoUsername());
+        gitRepoCtx.setRepoPassword(repositoryInformation.getRepoPassword());
 
         try {
-			if(isKeyBasedAuthentication(gitRemoteRepoUrl, tenantId)) {
-			    gitRepoCtx.setKeyBasedAuthentication(true);
-			    initSSHAuthentication();
-			}
-			else
-			    gitRepoCtx.setKeyBasedAuthentication(false);
-		} catch (Exception e1) {
-			log.error("Exception occurred.. " + e1.getMessage(), e1);
-		}
+            if (isKeyBasedAuthentication(gitRemoteRepoUrl, tenantId)) {
+                gitRepoCtx.setKeyBasedAuthentication(true);
+                initSSHAuthentication();
+            } else
+                gitRepoCtx.setKeyBasedAuthentication(false);
+        } catch (Exception e1) {
+            log.error("Exception occurred.. " + e1.getMessage(), e1);
+        }
 
         FileRepository localRepo = null;
         try {
@@ -133,54 +133,66 @@ public class GitBasedArtifactRepository {
     }
 
 
-
     // If tenant id is "-1234", then its super tenant, else tenant
     private static String getRepoPathForTenantId(int tenantId,
-                       String gitLocalRepoPath, boolean isMultitenant) {
-               
-    	
-		StringBuilder repoPathBuilder = new StringBuilder();
-		String repoPath = null;
-
-		if (isMultitenant) {
-			if (tenantId == SUPER_TENANT_ID) {
-				repoPathBuilder.append(gitLocalRepoPath).append(
-						SUPER_TENANT_APP_PATH);
-			} else {
-				// create folder with tenant id
-				createTenantDir(tenantId, gitLocalRepoPath);
-				repoPathBuilder.append(gitLocalRepoPath).append(TENANT_PATH)
-						.append(tenantId);
-			}
-
-			repoPath = repoPathBuilder.toString();
-		} else {
-			repoPath = gitLocalRepoPath;
-		}
-		log.info("Repo path returned : " + repoPath);
-		return repoPath;
-       }
+                                                 String gitLocalRepoPath, boolean isMultitenant) {
 
-       private static void createTenantDir(int tenantId, String path) {
-               String dirPathName = path+TENANT_PATH+tenantId;
-               boolean dirStatus = new File(dirPathName).mkdir();
-               if(dirStatus){
-                       log.info("Successfully created directory ["+dirPathName+"] ");
-               }else {
-                       log.error("Directory creating failed in ["+dirPathName+"] ");
-               }       
-       }
 
+        StringBuilder repoPathBuilder = new StringBuilder();
+        String repoPath = null;
+
+        if (isMultitenant) {
+            if (tenantId == SUPER_TENANT_ID) {
+                //check if the relevant path is set as a startup param
+                String superTenantRepoPath = CartridgeAgentConfiguration.getInstance().getSuperTenantRepositoryPath();
+
+                if (superTenantRepoPath != null && !superTenantRepoPath.isEmpty()) {
+                    superTenantRepoPath = superTenantRepoPath.startsWith("/") ? superTenantRepoPath : "/".concat(superTenantRepoPath);
+                    repoPathBuilder.append(gitLocalRepoPath).append(superTenantRepoPath);
+
+                } else {
+                    repoPathBuilder.append(gitLocalRepoPath).append(SUPER_TENANT_REPO_PATH);
+                }
+            } else {
+                // create folder with tenant id
+                createTenantDir(tenantId, gitLocalRepoPath);
+                //check if the relevant path is set as a startup param
+                String tenantRepoPath = CartridgeAgentConfiguration.getInstance().getTenantRepositoryPath();
+
+                if (tenantRepoPath != null && !tenantRepoPath.isEmpty()) {
+                    tenantRepoPath = tenantRepoPath.startsWith("/") ? tenantRepoPath : "/".concat(tenantRepoPath);
+                    tenantRepoPath = tenantRepoPath.endsWith("/") ? tenantRepoPath : tenantRepoPath.concat("/");
+
+                    repoPathBuilder.append(gitLocalRepoPath).append(tenantRepoPath).append(tenantId);
+                } else {
+                    repoPathBuilder.append(gitLocalRepoPath).append(TENANT_REPO_PATH).append(tenantId);
+                }
+            }
 
+            repoPath = repoPathBuilder.toString();
+        } else {
+            repoPath = gitLocalRepoPath;
+        }
+        log.info("Repo path returned : " + repoPath);
+        return repoPath;
+    }
 
+    private static void createTenantDir(int tenantId, String path) {
+        String dirPathName = path + TENANT_REPO_PATH + tenantId;
+        boolean dirStatus = new File(dirPathName).mkdir();
+        if (dirStatus) {
+            log.info("Successfully created directory [" + dirPathName + "] ");
+        } else {
+            log.error("Directory creating failed in [" + dirPathName + "] ");
+        }
+    }
 
 
     /**
      * Checks if key based authentication (SSH) is required
      *
-     * @param url git repository url for the tenant
+     * @param url      git repository url for the tenant
      * @param tenantId id of the tenant
-     *
      * @return true if SSH authentication is required, else false
      */
     private boolean isKeyBasedAuthentication(String url, int tenantId) {
@@ -189,20 +201,14 @@ public class GitBasedArtifactRepository {
                 url.startsWith(GitDeploymentSynchronizerConstants.GIT_HTTPS_REPO_URL_PREFIX)) {//http or https url
             // authentication with username and password, not key based
             return false;
-        }
-
-        else if (url.startsWith(GitDeploymentSynchronizerConstants.GITHUB_READ_ONLY_REPO_URL_PREFIX)) { //github read-only repo url
+        } else if (url.startsWith(GitDeploymentSynchronizerConstants.GITHUB_READ_ONLY_REPO_URL_PREFIX)) { //github read-only repo url
             // no authentication required
             return false;
-        }
-
-        else if (url.startsWith(GitDeploymentSynchronizerConstants.GIT_REPO_SSH_URL_PREFIX) ||
+        } else if (url.startsWith(GitDeploymentSynchronizerConstants.GIT_REPO_SSH_URL_PREFIX) ||
                 url.contains(GitDeploymentSynchronizerConstants.GIT_REPO_SSH_URL_SUBSTRING)) { //other repo, needs ssh authentication
             // key based authentication
             return true;
-        }
-
-        else {
+        } else {
             log.error("Invalid git URL provided for tenant " + tenantId);
             throw new RuntimeException("Invalid git URL provided for tenant " + tenantId);
         }
@@ -211,7 +217,7 @@ public class GitBasedArtifactRepository {
     /**
      * Initializes SSH authentication
      */
-    private void initSSHAuthentication () {
+    private void initSSHAuthentication() {
 
         SshSessionFactory.setInstance(new CustomJschConfigSessionFactory());
     }
@@ -219,24 +225,23 @@ public class GitBasedArtifactRepository {
     /**
      * Caches RepositoryContext against tenant repository path
      *
-     * @param tenantId tenant repository path
+     * @param tenantId   tenant repository path
      * @param gitRepoCtx RepositoryContext instance for tenant
      */
     private void cacheGitRepoContext(int tenantId, RepositoryContext gitRepoCtx) {
 
-    	log.info("caching repo context");
-        tenantToRepoContextMap.put(tenantId, gitRepoCtx);
-    }
+        log.info("caching repo context");
 
+    tenantToRepoContextMap.put(tenantId, gitRepoCtx);
+}
     /**
      * Retrieve cached RepositoryContext relevant to the tenant's local repo path
      *
      * @param tenantId
-     *
      * @return corresponding RepositoryContext instance for the
      * tenant's local repo if available, else null
      */
-    private RepositoryContext retrieveCachedGitContext (int tenantId) {
+    private RepositoryContext retrieveCachedGitContext(int tenantId) {
 
         return tenantToRepoContextMap.get(tenantId);
     }
@@ -245,66 +250,55 @@ public class GitBasedArtifactRepository {
      * Commits any changes in the local repository to the relevant remote repository
      *
      * @return
-     *      
      */
-    public boolean commit() {
-    	// TODO implement later, this is applicable for management node.
-
-		for (Entry<Integer, RepositoryContext> tenantMap : tenantToRepoContextMap
-				.entrySet()) {
-
-			int tenantId = tenantMap.getKey();
-			//log.info("map count has values..tenant Id : " + tenantId);
-			
-			RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
-			if (gitRepoCtx == null) {
-				
-					log.info("No git repository context information found for tenant "
-							+ tenantId);
-
-				return false;
-			}
-
-			Git git = gitRepoCtx.getGit();
-			StatusCommand statusCmd = git.status();
-			Status status = null;
-			try {
-				status = statusCmd.call();
-
-			} catch (GitAPIException e) {
-				log.error(
-						"Git status operation for tenant "
-								+ gitRepoCtx.getTenantId() + " failed, ", e);
-				return false;
-			}
-			//log.info("status : " + status.toString());
-			if (status.isClean()) {// no changes, nothing to commit
-				
-					log.debug("No changes detected in the local repository for tenant "
-							+ tenantId);
-				return false;
-			}
-			
-			addArtifacts(gitRepoCtx, getNewArtifacts(status));
-			addArtifacts(gitRepoCtx, getModifiedArtifacts(status));
-			removeArtifacts(gitRepoCtx, getRemovedArtifacts(status));
-			commitToLocalRepo(gitRepoCtx);
-			pushToRemoteRepo(gitRepoCtx);
-
-			return false;
-
-		}
-		return false;
+    public void commit(RepositoryInformation repoInfo) {
+        // TODO implement later, this is applicable for management node.
+
+       // for (Entry<Integer, RepositoryContext> tenantMap : tenantToRepoContextMap
+       //         .entrySet()) {
+
+            int tenantId = Integer.parseInt(repoInfo.getTenantId());
+            //log.info("map count has values..tenant Id : " + tenantId);
+
+            RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+            Git git = gitRepoCtx.getGit();
+            StatusCommand statusCmd = git.status();
+            Status status = null;
+            try {
+                status = statusCmd.call();
+
+            } catch (GitAPIException e) {
+                log.error(
+                        "Git status operation for tenant "
+                                + gitRepoCtx.getTenantId() + " failed, ", e);
+
+            }
+            //log.info("status : " + status.toString());
+            if (status.isClean()) {// no changes, nothing to commit
+                if (log.isDebugEnabled()) {
+                    log.debug("No changes detected in the local repository for tenant " + tenantId);
+                }
+
+                return;
+            }
+
+            addArtifacts(gitRepoCtx, getNewArtifacts(status));
+            addArtifacts(gitRepoCtx, getModifiedArtifacts(status));
+            removeArtifacts(gitRepoCtx, getRemovedArtifacts(status));
+            commitToLocalRepo(gitRepoCtx);
+            pushToRemoteRepo(gitRepoCtx);
+
+        //}
+        //return false;
     }
 
     /**
      * Returns the newly added artifact set relevant to the current status of the repository
      *
      * @param status git status
-     *
      * @return artifact names set
      */
-    private Set<String> getNewArtifacts (Status status) {
+    private Set<String> getNewArtifacts(Status status) {
 
         return status.getUntracked();
     }
@@ -313,10 +307,9 @@ public class GitBasedArtifactRepository {
      * Returns the removed (undeployed) artifact set relevant to the current status of the repository
      *
      * @param status git status
-     *
      * @return artifact names set
      */
-    private Set<String> getRemovedArtifacts (Status status) {
+    private Set<String> getRemovedArtifacts(Status status) {
 
         return status.getMissing();
     }
@@ -325,10 +318,9 @@ public class GitBasedArtifactRepository {
      * Return the modified artifacts set relevant to the current status of the repository
      *
      * @param status git status
-     *
      * @return artifact names set
      */
-    private Set<String> getModifiedArtifacts (Status status) {
+    private Set<String> getModifiedArtifacts(Status status) {
 
         return status.getModified();
     }
@@ -337,36 +329,40 @@ public class GitBasedArtifactRepository {
      * Adds the artifacts to the local staging area
      *
      * @param gitRepoCtx RepositoryContext instance
-     * @param artifacts set of artifacts
+     * @param artifacts  set of artifacts
      */
-    private void addArtifacts (RepositoryContext gitRepoCtx, Set<String> artifacts) {
+    private void addArtifacts(RepositoryContext gitRepoCtx, Set<String> artifacts) {
 
-        if(artifacts.isEmpty())
+        if (artifacts.isEmpty())
             return;
 
         AddCommand addCmd = gitRepoCtx.getGit().add();
         Iterator<String> it = artifacts.iterator();
-        while(it.hasNext())
+        while (it.hasNext())
             addCmd.addFilepattern(it.next());
 
         try {
             addCmd.call();
+            if (log.isDebugEnabled()) {
+                log.debug("Added artifacts for tenant : " + gitRepoCtx.getTenantId());
+            }
 
         } catch (GitAPIException e) {
             log.error("Adding artifact to the local repository at " + gitRepoCtx.getGitLocalRepoPath() + "failed", e);
-            e.printStackTrace();
+            log.error(e);
         }
+
     }
 
     /**
      * Removes the set of artifacts from local repo
      *
      * @param gitRepoCtx RepositoryContext instance
-     * @param artifacts Set of artifact names to remove
+     * @param artifacts  Set of artifact names to remove
      */
-    private void removeArtifacts (RepositoryContext gitRepoCtx, Set<String> artifacts) {
+    private void removeArtifacts(RepositoryContext gitRepoCtx, Set<String> artifacts) {
 
-        if(artifacts.isEmpty())
+        if (artifacts.isEmpty())
             return;
 
         RmCommand rmCmd = gitRepoCtx.getGit().rm();
@@ -377,10 +373,13 @@ public class GitBasedArtifactRepository {
 
         try {
             rmCmd.call();
+            if (log.isDebugEnabled()) {
+                log.debug("Removed artifacts for tenant : " + gitRepoCtx.getTenantId());
+            }
 
         } catch (GitAPIException e) {
             log.error("Removing artifact from the local repository at " + gitRepoCtx.getGitLocalRepoPath() + "failed", e);
-            e.printStackTrace();
+            log.error(e);
         }
     }
 
@@ -389,7 +388,7 @@ public class GitBasedArtifactRepository {
      *
      * @param gitRepoCtx RepositoryContext instance for the tenant
      */
-    private void commitToLocalRepo (RepositoryContext gitRepoCtx) {
+    private void commitToLocalRepo(RepositoryContext gitRepoCtx) {
 
         CommitCommand commitCmd = gitRepoCtx.getGit().commit();
         commitCmd.setMessage("tenant " + gitRepoCtx.getTenantId() + "'s artifacts committed to local repo at " +
@@ -397,10 +396,12 @@ public class GitBasedArtifactRepository {
 
         try {
             commitCmd.call();
+            if (log.isDebugEnabled()) {
+                log.debug("Committed artifacts for tenant : " + gitRepoCtx.getTenantId());
+            }
 
         } catch (GitAPIException e) {
             log.error("Committing artifacts to local repository failed for tenant " + gitRepoCtx.getTenantId(), e);
-            e.printStackTrace();
         }
     }
 
@@ -412,7 +413,7 @@ public class GitBasedArtifactRepository {
     private void pushToRemoteRepo(RepositoryContext gitRepoCtx) {
 
         PushCommand pushCmd = gitRepoCtx.getGit().push();
-        if(!gitRepoCtx.getKeyBasedAuthentication()) {
+        if (!gitRepoCtx.getKeyBasedAuthentication()) {
             UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
             if (credentialsProvider != null)
                 pushCmd.setCredentialsProvider(credentialsProvider);
@@ -420,47 +421,173 @@ public class GitBasedArtifactRepository {
 
         try {
             pushCmd.call();
+            if (log.isDebugEnabled()) {
+                log.debug("Pushed artifacts for tenant : " + gitRepoCtx.getTenantId());
+            }
 
         } catch (GitAPIException e) {
             log.error("Pushing artifacts to remote repository failed for tenant " + gitRepoCtx.getTenantId(), e);
-            e.printStackTrace();
+
         }
     }
 
-    public boolean checkout(RepositoryInformation repositoryInformation) {
-        /*if(log.isInfoEnabled()) {
-    	    log.info("Executing checkout");
-        }*/
+   /* public boolean checkout(RepositoryInformation repositoryInformation) {
+
 
         if (log.isDebugEnabled()) {
             log.debug("Artifact checkout done by thread " + Thread.currentThread().getName() + " - " +
-                Thread.currentThread().getId());
+                    Thread.currentThread().getId());
         }
 
-    	int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
-    	
-    	// if context for tenant is not initialized
-    	if(tenantToRepoContextMap.get(tenantId) == null)
-	    	initGitContext(repositoryInformation);
-    	
-        
-		RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
-        if(gitRepoCtx == null) { //to handle super tenant scenario
-           // if(log.isDebugEnabled())
-                log.info("No git repository context information found for deployment synchronizer");
+        int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+
+        // if context for tenant is not initialized
+        if (tenantToRepoContextMap.get(tenantId) == null)
+            initGitContext(repositoryInformation);
+
+
+        RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+        if (gitRepoCtx == null) { //to handle super tenant scenario
+            // if(log.isDebugEnabled())
+            log.info("No git repository context information found for deployment synchronizer");
 
             return true;
         }
 
         synchronized (gitRepoCtx) {
-            if(!gitRepoCtx.cloneExists())
+            if (!gitRepoCtx.cloneExists())
                 cloneRepository(gitRepoCtx);
 
             return pullArtifacts(gitRepoCtx);
         }
+    } */
+   public boolean checkout (RepositoryInformation repositoryInformation) throws Exception {
+
+       int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+
+       // if context for tenant is not initialized
+       if (tenantToRepoContextMap.get(tenantId) == null) {
+           initGitContext(repositoryInformation);
+       }
+
+       RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+
+       File gitRepoDir = new File(gitRepoCtx.getGitLocalRepoPath());
+       if (!gitRepoDir.exists()) {
+           return cloneRepository(gitRepoCtx);
+       }
+       else {
+           if (isValidGitRepo(gitRepoCtx)) {
+               if (log.isDebugEnabled()) {
+                   log.debug("Existing git repository detected for tenant " + gitRepoCtx.getTenantId() + ", no clone required");
+               }
+
+               return pullAndHandleErrors(gitRepoCtx);
+
+           } else {
+               // not a valid git repo, check if the directory is non-empty
+               if (gitRepoDir.list().length > 0) {
+                   // directory is non empty. sync existing artifacts with the remote repository
+                   if (syncInitialLocalArtifacts(gitRepoCtx)) {
+                       log.info("Existing local artifacts for tenant [" + gitRepoCtx.getTenantId() + "] synchronized with remote repository successfully");
+                       // pull any changes from the remote repo
+                       return pullAndHandleErrors(gitRepoCtx);
+                   }
+                   return false;
+
+               } else {
+                   // directory is empty, clone
+                   return cloneRepository(gitRepoCtx);
+               }
+           }
+       }
+   }
+
+    private boolean pullAndHandleErrors (RepositoryContext gitRepoCtx) {
+
+        try {
+            return pullArtifacts(gitRepoCtx);
+
+        } catch (CheckoutConflictException e) {
+            // checkout from remote HEAD
+            return checkoutFromRemoteHead(gitRepoCtx, e.getConflictingPaths());
+            // pull again
+            /*try {
+                return pullArtifacts(gitRepoCtx);
+
+            } catch (GitAPIException e1) {
+                //cannot happen here
+                log.error("Git pull failed for tenant " + gitRepoCtx.getTenantId(), e1);
+                return false;
+            }*/
+        }
+    }
+
+    private boolean checkoutFromRemoteHead(RepositoryContext gitRepoCtx, List<String> paths) {
+
+        boolean checkoutSuccess = false;
+
+        CheckoutCommand checkoutCmd = gitRepoCtx.getGit().checkout();
+        for(String path : paths) {
+            checkoutCmd.addPath(path);
+            if(log.isDebugEnabled()) {
+                log.debug("Added the file path " + path + " to checkout from the remote repository");
+            }
+        }
+        // specify the start point as the HEAD of remote repository
+        checkoutCmd.setStartPoint(GitDeploymentSynchronizerConstants.REMOTES_ORIGIN_MASTER);
+
+        try {
+            checkoutCmd.call();
+            checkoutSuccess = true;
+            log.info("Checked out the conflicting files from the remote repository successfully");
+
+        } catch (GitAPIException e) {
+            log.error("Checking out artifacts from index failed", e);
+        }
+
+        return checkoutSuccess;
     }
-    
-    public void scheduleSyncTask (RepositoryInformation repoInformation, long delay) {
+
+    private void resetToRemoteHead (RepositoryContext gitRepoCtx, List<String> paths) {
+
+        ResetCommand resetCmd = gitRepoCtx.getGit().reset();
+
+        // reset type is HARD, to remote master branch
+        resetCmd.setMode(ResetCommand.ResetType.HARD).
+                setRef(GitDeploymentSynchronizerConstants.ORIGIN + "/" + GitDeploymentSynchronizerConstants.MASTER);
+
+        // add paths
+        for(String path : paths) {
+            resetCmd.addPath(path);
+            if(log.isDebugEnabled()) {
+                log.debug("Added the file path " + path + " to reset");
+            }
+        }
+
+        try {
+            resetCmd.call();
+            log.info("Reset the local branch to origin master successfully");
+
+        } catch (GitAPIException e) {
+            log.error("Reset to origin master failed", e);
+        }
+
+    }
+
+    private boolean syncInitialLocalArtifacts(RepositoryContext gitRepoCtx) throws Exception {
+
+        boolean syncedLocalArtifacts;
+
+        //initialize repository
+        InitGitRepository(new File(gitRepoCtx.getGitLocalRepoPath()));
+        //add the remote repository (origin)
+        syncedLocalArtifacts = addRemote(gitRepoCtx.getLocalRepo(), gitRepoCtx.getGitRemoteRepoUrl());
+
+        return syncedLocalArtifacts;
+    }
+
+    public void scheduleSyncTask(RepositoryInformation repoInformation, boolean autoCheckout, boolean autoCommit, long delay) {
 
         int tenantId = Integer.parseInt(repoInformation.getTenantId());
 
@@ -471,37 +598,38 @@ public class GitBasedArtifactRepository {
         }
 
         if (repoCtxt.getArtifactSyncSchedular() == null) {
-           synchronized (repoCtxt) {
-               if (repoCtxt.getArtifactSyncSchedular() == null) {
-                   // create a new ScheduledExecutorService instance
-                   final ScheduledExecutorService artifactSyncScheduler = Executors.newScheduledThreadPool(1,
-                           new ArtifactSyncTaskThreadFactory(repoCtxt.getGitLocalRepoPath()));
+            synchronized (repoCtxt) {
+                if (repoCtxt.getArtifactSyncSchedular() == null) {
+                    // create a new ScheduledExecutorService instance
+                    final ScheduledExecutorService artifactSyncScheduler = Executors.newScheduledThreadPool(1,
+                            new ArtifactSyncTaskThreadFactory(repoCtxt.getGitLocalRepoPath()));
 
-                   // schedule at the given interval
-                   artifactSyncScheduler.scheduleAtFixedRate(new ArtifactSyncTask(repoInformation), delay, delay, TimeUnit.SECONDS);
-                   // cache
-                   repoCtxt.setArtifactSyncSchedular(artifactSyncScheduler);
+                    // schedule at the given interval
+                    artifactSyncScheduler.scheduleAtFixedRate(new ArtifactSyncTask(repoInformation, autoCheckout, autoCommit), delay, delay, TimeUnit.SECONDS);
+                    // cache
+                    repoCtxt.setArtifactSyncSchedular(artifactSyncScheduler);
 
-                   log.info("Scheduled Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath());
+                    log.info("Scheduled Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath());
 
-               } else {
-                   log.info("Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath() + " already scheduled");
-               }
-           }
+                } else {
+                    log.info("Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath() + " already scheduled");
+                }
+            }
         }
     }
-    
+
     public boolean cloneExists(RepositoryInformation repositoryInformation) {
-    	
-    	int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
-    	
-    	// if context for tenant is not initialized
-    	if(tenantToRepoContextMap.get(tenantId) == null)
-	    	initGitContext(repositoryInformation);
-    	
-        
-		RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
-        if(gitRepoCtx == null) { 
+
+        int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+
+        // if context for tenant is not initialized
+        if (tenantToRepoContextMap.get(tenantId) == null) {
+            initGitContext(repositoryInformation);
+        }
+
+
+        RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+        if (gitRepoCtx == null) {
             return false;
         }
 
@@ -515,16 +643,15 @@ public class GitBasedArtifactRepository {
      * will call 'RepositoryInformationService' for credentials.
      *
      * @param gitRepoCtx RepositoryContext instance for tenant
-     *
      * @return true if success, else false
      */
-    private boolean pullArtifacts (RepositoryContext gitRepoCtx) {
-        if(log.isDebugEnabled())  {
-    	    log.debug("Pulling artifacts");
+    /*private boolean pullArtifacts(RepositoryContext gitRepoCtx) {
+        if (log.isDebugEnabled()) {
+            log.debug("Pulling artifacts");
         }
         PullCommand pullCmd = gitRepoCtx.getGit().pull();
 
-        if(!gitRepoCtx.getKeyBasedAuthentication()) {
+        if (!gitRepoCtx.getKeyBasedAuthentication()) {
             UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
             if (credentialsProvider != null)
                 pullCmd.setCredentialsProvider(credentialsProvider);
@@ -540,7 +667,7 @@ public class GitBasedArtifactRepository {
                 }
 
                 // execute artifact update extension
-                ExtensionUtils.executeArtifactsUpdatedExtension();
+                extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
             }
 
         } catch (InvalidConfigurationException e) {
@@ -550,7 +677,7 @@ public class GitBasedArtifactRepository {
             Utilities.deleteFolderStructure(new File(gitRepoCtx.getGitLocalRepoPath()));
             cloneRepository(gitRepoCtx);
             // execute artifact update extension
-            ExtensionUtils.executeArtifactsUpdatedExtension();
+            extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
             return true;
 
         } catch (JGitInternalException e) {
@@ -567,7 +694,7 @@ public class GitBasedArtifactRepository {
             Utilities.deleteFolderStructure(new File(gitRepoCtx.getGitLocalRepoPath()));
             cloneRepository(gitRepoCtx);
             // execute artifact update extension
-            ExtensionUtils.executeArtifactsUpdatedExtension();
+            extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
             return true;
 
         } catch (GitAPIException e) {
@@ -576,6 +703,62 @@ public class GitBasedArtifactRepository {
             return false;
         }
         return true;
+    }*/
+
+    private boolean pullArtifacts (RepositoryContext gitRepoCtx) throws CheckoutConflictException {
+
+        PullCommand pullCmd = gitRepoCtx.getGit().pull();
+
+        UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
+
+        if (credentialsProvider == null) {
+            log.warn ("Remote repository credentials not available for tenant " + gitRepoCtx.getTenantId() +
+                    ", aborting pull");
+            return false;
+        }
+        pullCmd.setCredentialsProvider(credentialsProvider);
+
+        try {
+            PullResult pullResult = pullCmd.call();
+            // check if we have received any updates
+            if (!pullResult.getFetchResult().getTrackingRefUpdates().isEmpty()) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Artifacts were updated as a result of the pull operation, thread: " + Thread.currentThread().getName() + " - " +
+                            Thread.currentThread().getId());
+                }
+
+                // execute artifact update extension
+                extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
+            }
+
+        } catch (InvalidConfigurationException e) {
+            log.warn("Git pull unsuccessful for tenant " + gitRepoCtx.getTenantId() + ", invalid configuration. " + e.getMessage());
+            // FileUtilities.deleteFolderStructure(new File(gitRepoCtx.getLocalRepoPath()));
+            //cloneRepository(gitRepoCtx);
+            Utilities.deleteFolderStructure(new File(gitRepoCtx.getGitLocalRepoPath()));
+            cloneRepository(gitRepoCtx);
+            // execute artifact update extension
+            extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
+            return true;
+
+        } catch (JGitInternalException e) {
+            log.warn("Git pull unsuccessful for tenant " + gitRepoCtx.getTenantId() + ", " + e.getMessage());
+            return false;
+
+        } catch (TransportException e) {
+            log.error("Accessing remote git repository " + gitRepoCtx.getGitRemoteRepoUrl() + " failed for tenant " + gitRepoCtx.getTenantId(), e);
+            return false;
+
+        } catch (CheckoutConflictException e) {
+            log.warn("Git pull unsuccessful for tenant " + gitRepoCtx.getTenantId() + ", conflicts detected");
+            throw e;
+
+        } catch (GitAPIException e) {
+            log.error("Git pull operation for tenant " + gitRepoCtx.getTenantId() + " failed", e);
+            return false;
+        }
+
+        return true;
     }
 
     /**
@@ -583,30 +766,30 @@ public class GitBasedArtifactRepository {
      *
      * @param gitRepoCtx RepositoryContext instance of the tenant
      */
-    private void handleInvalidConfigurationError (RepositoryContext gitRepoCtx) {
+    private void handleInvalidConfigurationError(RepositoryContext gitRepoCtx) {
 
         StoredConfig storedConfig = gitRepoCtx.getLocalRepo().getConfig();
         boolean modifiedConfig = false;
-        if(storedConfig != null) {
+        if (storedConfig != null) {
 
-            if(storedConfig.getString("branch", "master", "remote") == null ||
+            if (storedConfig.getString("branch", "master", "remote") == null ||
                     storedConfig.getString("branch", "master", "remote").isEmpty()) {
 
                 storedConfig.setString("branch", "master", "remote", "origin");
                 modifiedConfig = true;
             }
 
-            if(storedConfig.getString("branch", "master", "merge") == null ||
+            if (storedConfig.getString("branch", "master", "merge") == null ||
                     storedConfig.getString("branch", "master", "merge").isEmpty()) {
 
                 storedConfig.setString("branch", "master", "merge", "refs/heads/master");
                 modifiedConfig = true;
             }
 
-            if(modifiedConfig) {
+            if (modifiedConfig) {
                 try {
                     storedConfig.save();
-                   // storedConfig.load();
+                    // storedConfig.load();
 
                 } catch (IOException e) {
                     log.error("Error saving git configuration file in local repo at " + gitRepoCtx.getGitLocalRepoPath(), e);
@@ -623,27 +806,26 @@ public class GitBasedArtifactRepository {
      *
      * @param gitRepoCtx RepositoryContext for the tenant
      */
-    private static void cloneRepository (RepositoryContext gitRepoCtx) { //should happen only at the beginning
+    /*private static void cloneRepository(RepositoryContext gitRepoCtx) { //should happen only at the beginning
 
         File gitRepoDir = new File(gitRepoCtx.getGitLocalRepoPath());
         if (gitRepoDir.exists()) {
-            if(isValidGitRepo(gitRepoCtx)) { //check if a this is a valid git repo
+            if (isValidGitRepo(gitRepoCtx)) { //check if a this is a valid git repo
                 log.info("Existing git repository detected for tenant " + gitRepoCtx.getTenantId() + ", no clone required");
                 gitRepoCtx.setCloneExists(true);
                 return;
-            }
-            else {
-                if(log.isDebugEnabled())
+            } else {
+                if (log.isDebugEnabled())
                     log.debug("Repository for tenant " + gitRepoCtx.getTenantId() + " is not a valid git repo");
                 Utilities.deleteFolderStructure(gitRepoDir); //if not a valid git repo but non-empty, delete it (else the clone will not work)
             }
         }
 
-        CloneCommand cloneCmd =  gitRepoCtx.getGit().cloneRepository().
-                        setURI(gitRepoCtx.getGitRemoteRepoUrl()).
-                        setDirectory(gitRepoDir);
+        CloneCommand cloneCmd = gitRepoCtx.getGit().cloneRepository().
+                setURI(gitRepoCtx.getGitRemoteRepoUrl()).
+                setDirectory(gitRepoDir);
 
-        if(!gitRepoCtx.getKeyBasedAuthentication()) {
+        if (!gitRepoCtx.getKeyBasedAuthentication()) {
             UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
             if (credentialsProvider != null)
                 cloneCmd.setCredentialsProvider(credentialsProvider);
@@ -662,6 +844,42 @@ public class GitBasedArtifactRepository {
             log.error("Git clone operation for tenant " + gitRepoCtx.getTenantId() + " failed", e);
             e.printStackTrace();
         }
+    }*/
+
+    private boolean cloneRepository (RepositoryContext gitRepoCtx) { //should happen only at the beginning
+
+        boolean cloneSuccess = false;
+
+        File gitRepoDir = new File(gitRepoCtx.getGitLocalRepoPath());
+
+        CloneCommand cloneCmd =  Git.cloneRepository().
+                setURI(gitRepoCtx.getGitRemoteRepoUrl()).
+                setDirectory(gitRepoDir).
+                setBranch(GitDeploymentSynchronizerConstants.GIT_REFS_HEADS_MASTER);
+
+        UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
+
+        if (credentialsProvider == null) {
+            log.warn ("Remote repository credentials not available for tenant " + gitRepoCtx.getTenantId() +
+                    ", aborting clone");
+            return false;
+        }
+        cloneCmd.setCredentialsProvider(credentialsProvider);
+
+        try {
+            cloneCmd.call();
+            log.info("Git clone operation for tenant " + gitRepoCtx.getTenantId() + " successful");
+            gitRepoCtx.setCloneExists(true);
+            cloneSuccess = true;
+
+        } catch (TransportException e) {
+            log.error("Accessing remote git repository failed for tenant " + gitRepoCtx.getTenantId(), e);
+
+        } catch (GitAPIException e) {
+            log.error("Git clone operation for tenant " + gitRepoCtx.getTenantId() + " failed", e);
+        }
+
+        return cloneSuccess;
     }
 
     /**
@@ -669,11 +887,10 @@ public class GitBasedArtifactRepository {
      * and creates a UsernamePasswordCredentialsProvider from a valid username and a password
      *
      * @param gitRepoCtx RepositoryContext instance
-     *
      * @return UsernamePasswordCredentialsProvider instance or null if service invocation failed or
      * username/password is not valid
      */
-    private static UsernamePasswordCredentialsProvider createCredentialsProvider (RepositoryContext gitRepoCtx) {
+    private static UsernamePasswordCredentialsProvider createCredentialsProvider(RepositoryContext gitRepoCtx) {
         return new UsernamePasswordCredentialsProvider(gitRepoCtx.getRepoUsername(), gitRepoCtx.getRepoPassword());
     }
 
@@ -681,10 +898,15 @@ public class GitBasedArtifactRepository {
      * Checks if an existing local repository is a valid git repository
      *
      * @param gitRepoCtx RepositoryContext instance
-     *
      * @return true if a valid git repo, else false
      */
-    private static boolean isValidGitRepo (RepositoryContext gitRepoCtx) {
+    private static boolean isValidGitRepo(RepositoryContext gitRepoCtx) {
+
+        // check if has been marked as cloned before
+        if(gitRepoCtx.cloneExists()) {
+            // repo is valid
+            return true;
+        }
 
         for (Ref ref : gitRepoCtx.getLocalRepo().getAllRefs().values()) { //check if has been previously cloned successfully, not empty
             if (ref.getObjectId() == null)
@@ -695,6 +917,55 @@ public class GitBasedArtifactRepository {
         return false;
     }
 
+    public static void InitGitRepository (File gitRepoDir) throws Exception {
+
+        try {
+            Git.init().setDirectory(gitRepoDir).setBare(false).call();
+
+        } catch (GitAPIException e) {
+            String errorMsg = "Initializing local repo at " + gitRepoDir.getPath() + " failed";
+            log.error(errorMsg, e);
+            throw new Exception(errorMsg, e);
+        }
+    }
+
+    public static boolean addRemote (Repository repository, String remoteUrl) {
+
+        boolean remoteAdded = false;
+
+        StoredConfig config = repository.getConfig();
+        config.setString(GitDeploymentSynchronizerConstants.REMOTE,
+                GitDeploymentSynchronizerConstants.ORIGIN,
+                GitDeploymentSynchronizerConstants.URL,
+                remoteUrl);
+
+        config.setString(GitDeploymentSynchronizerConstants.REMOTE,
+                GitDeploymentSynchronizerConstants.ORIGIN,
+                GitDeploymentSynchronizerConstants.FETCH,
+                GitDeploymentSynchronizerConstants.FETCH_LOCATION);
+
+        config.setString(GitDeploymentSynchronizerConstants.BRANCH,
+                GitDeploymentSynchronizerConstants.MASTER,
+                GitDeploymentSynchronizerConstants.REMOTE,
+                GitDeploymentSynchronizerConstants.ORIGIN);
+
+        config.setString(GitDeploymentSynchronizerConstants.BRANCH,
+                GitDeploymentSynchronizerConstants.MASTER,
+                GitDeploymentSynchronizerConstants.MERGE,
+                GitDeploymentSynchronizerConstants.GIT_REFS_HEADS_MASTER);
+
+        try {
+            config.save();
+            remoteAdded = true;
+
+        } catch (IOException e) {
+            log.error("Error in adding remote origin " + remoteUrl + " for local repository " +
+                    repository.toString(), e);
+        }
+
+        return remoteAdded;
+    }
+
 
     public void cleanupAutoCheckout() {
 
@@ -705,17 +976,30 @@ public class GitBasedArtifactRepository {
         return null;
     }
 
-	private class ArtifactSyncTask implements Runnable {
+    private class ArtifactSyncTask implements Runnable {
 
         private RepositoryInformation repositoryInformation;
+        private boolean autoCheckout;
+        private boolean autoCommit;
 
-        public ArtifactSyncTask (RepositoryInformation repositoryInformation) {
+        public ArtifactSyncTask(RepositoryInformation repositoryInformation, boolean autoCheckout, boolean autoCommit) {
             this.repositoryInformation = repositoryInformation;
+            this.autoCheckout = autoCheckout;
+            this.autoCommit = autoCommit;
         }
 
         @Override
         public void run() {
-            checkout(repositoryInformation);
+            try {
+                if (autoCheckout) {
+                    checkout(repositoryInformation);
+                }
+            } catch (Exception e) {
+                log.error(e);
+            }
+            if (autoCommit) {
+                commit(repositoryInformation);
+            }
         }
     }
 
@@ -723,7 +1007,7 @@ public class GitBasedArtifactRepository {
 
         private String localRepoPath;
 
-        public ArtifactSyncTaskThreadFactory (String localRepoPath) {
+        public ArtifactSyncTaskThreadFactory(String localRepoPath) {
             this.localRepoPath = localRepoPath;
         }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
index 19c104d..dcada46 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
@@ -58,4 +58,16 @@ public class GitDeploymentSynchronizerConstants {
     public static final String USERNAME_REGEX = "username:(.*?),";
     public static final String PASSWORD_REGEX = "password:(.*?)}";
 
+    //Git based constants
+    public static final String GIT_REFS_HEADS_MASTER = "refs/heads/master";
+    public static final String REMOTES_ORIGIN_MASTER = "remotes/origin/master";
+    public static final String REMOTE = "remote";
+    public static final String ORIGIN = "origin";
+    public static final String URL = "url";
+    public static final String FETCH = "fetch";
+    public static final String BRANCH = "branch";
+    public static final String MASTER = "master";
+    public static final String MERGE = "merge";
+    public static final String FETCH_LOCATION = "+refs/heads/*:refs/remotes/origin/*";
+
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
index a6c2f4b..6d9bec6 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
@@ -64,6 +64,9 @@ public class Utilities {
 
         try {
             FileUtils.deleteDirectory(existingDir);
+            if(log.isDebugEnabled()) {
+            	log.debug(" Directory [" + existingDir + "] deleted. ");
+            }
 
         } catch (IOException e) {
             log.error("Deletion of existing non-git repository structure failed");

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
index 7c378f6..947329d 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
@@ -28,11 +28,7 @@ import org.apache.stratos.cartridge.agent.util.CartridgeAgentConstants;
 import org.apache.stratos.cartridge.agent.util.CartridgeAgentUtils;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
+import java.util.*;
 
 /**
  * Cartridge agent configuration.
@@ -41,7 +37,7 @@ public class CartridgeAgentConfiguration {
 
     private static final Log log = LogFactory.getLog(CartridgeAgentConfiguration.class);
     private static volatile CartridgeAgentConfiguration instance;
-
+    private final String serviceGroup;
     private final String serviceName;
     private final String clusterId;
     private final String networkPartitionId;
@@ -52,16 +48,32 @@ public class CartridgeAgentConfiguration {
     private final String repoUrl;
     private final List<Integer> ports;
     private final List<String> logFilePaths;
+    private final boolean isCommitsEnabled;
+    private final boolean isCheckoutEnabled;
+    private final String listenAddress;
+    private final String lbClusterId;
+    private final String tenantId;
+    private final String isClustered;
+    private final String minCount;
     private Map<String, String> parameters;
     private boolean isMultitenant;
     private String persistenceMappings;
-    private final boolean isCommitsEnabled;
-    private final String listenAddress;
+    private boolean isInternalRepo;
+    private String isPrimary;
+    private String lbPrivateIp;
+    private String lbPublicIp;
+    private String deployment;
+    private String managerServiceName;
+    private String workerServiceName;
+    private String superTenantRepositoryPath;
+    private String tenantRepositoryPath;
 
     private CartridgeAgentConfiguration() {
-    	parameters = loadParametersFile();
+        parameters = loadParametersFile();
 
         try {
+            serviceGroup = readServiceGroup();
+            isClustered = readClustering();
             serviceName = readParameterValue(CartridgeAgentConstants.SERVICE_NAME);
             clusterId = readParameterValue(CartridgeAgentConstants.CLUSTER_ID);
             networkPartitionId = readParameterValue(CartridgeAgentConstants.NETWORK_PARTITION_ID);
@@ -73,19 +85,34 @@ public class CartridgeAgentConfiguration {
             ports = readPorts();
             logFilePaths = readLogFilePaths();
             isMultitenant = readMultitenant(CartridgeAgentConstants.MULTITENANT);
-            persistenceMappings = readPersisenceMapping();
-            isCommitsEnabled = readCommitsEnabled(CartridgeAgentConstants.COMMIT_ENABLED);
-            listenAddress = System.getProperty(CartridgeAgentConstants.LISTEN_ADDRESS);
+            persistenceMappings = readPersistenceMapping();
+            isCommitsEnabled = readCommitParameterValue();
+            isCheckoutEnabled = Boolean.parseBoolean(System.getProperty(CartridgeAgentConstants.AUTO_CHECKOUT));
 
+            listenAddress = System.getProperty(CartridgeAgentConstants.LISTEN_ADDRESS);
+            isInternalRepo = readInternalRepo(CartridgeAgentConstants.PROVIDER);
+            tenantId = readParameterValue(CartridgeAgentConstants.TENANT_ID);
+            lbClusterId = readParameterValue(CartridgeAgentConstants.LB_CLUSTER_ID);
+            minCount = readParameterValue(CartridgeAgentConstants.MIN_INSTANCE_COUNT);
+            // not mandatory
+            lbPrivateIp = System.getProperty(CartridgeAgentConstants.LB_PRIVATE_IP);
+            lbPublicIp = System.getProperty(CartridgeAgentConstants.LB_PUBLIC_IP);
+            tenantRepositoryPath =  System.getProperty(CartridgeAgentConstants.TENANT_REPO_PATH);
+            superTenantRepositoryPath = System.getProperty(CartridgeAgentConstants.SUPER_TENANT_REPO_PATH);
+
+            deployment = readDeployment();
+            managerServiceName = readManagerServiceType();
+            workerServiceName = readWorkerServiceType();
+            isPrimary = readIsPrimary();
         } catch (ParameterNotFoundException e) {
             throw new RuntimeException(e);
         }
 
-        if(log.isInfoEnabled()) {
+        if (log.isInfoEnabled()) {
             log.info("Cartridge agent configuration initialized");
         }
 
-        if(log.isDebugEnabled()) {
+        if (log.isDebugEnabled()) {
             log.debug(String.format("service-name: %s", serviceName));
             log.debug(String.format("cluster-id: %s", clusterId));
             log.debug(String.format("network-partition-id: %s", networkPartitionId));
@@ -95,26 +122,76 @@ public class CartridgeAgentConfiguration {
             log.debug(String.format("app-path: %s", appPath));
             log.debug(String.format("repo-url: %s", repoUrl));
             log.debug(String.format("ports: %s", ports.toString()));
+            log.debug(String.format("lb-private-ip: %s", lbPrivateIp));
+            log.debug(String.format("lb-public-ip: %s", lbPublicIp));
         }
     }
 
-    private boolean readCommitsEnabled(String commitEnabled) {
-    	boolean isCommitEnabled = false;
-    	try {
-    		isCommitEnabled = Boolean.parseBoolean(readParameterValue(commitEnabled));
-		} catch (ParameterNotFoundException e) {
-			// Missing commits enabled flag is not an exception
-			log.error(" Commits enabled payload parameter is not found");
-		}
-		return isCommitEnabled;
-	}
+    private String readDeployment(){
+        if (parameters.containsKey(CartridgeAgentConstants.DEPLOYMENT)) {
+            return parameters.get(CartridgeAgentConstants.DEPLOYMENT);
+        }
+        return null;
+    }
 
-	private boolean readMultitenant(String multitenant) throws ParameterNotFoundException {
-    	String multitenantStringValue = readParameterValue(multitenant);
-    	return Boolean.parseBoolean(multitenantStringValue);
-	}
+    private String readManagerServiceType(){
+
+        if (deployment == null) {
+            return null;
+        }
+
+        if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_MANAGER)) {
+            // if this is a manager, manager service type = service name
+            return serviceName;
+
+        } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_WORKER)) {
+            // if a worker, need to read the manager service type sent by payload
+            if (parameters.containsKey(CartridgeAgentConstants.MANAGER_SERVICE_TYPE)) {
+                return parameters.get(CartridgeAgentConstants.MANAGER_SERVICE_TYPE);
+            }
+
+        } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_DEFAULT)) {
+            // for default deployment, no manager service type
+            return null;
+
+        }
+
+        return null;
+    }
+
+    private String readWorkerServiceType(){
+
+        if (deployment == null) {
+            return null;
+        }
+
+        if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_WORKER)) {
+            // if this is a worker, worker service type = service name
+            return serviceName;
+
+        } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_MANAGER)) {
+            // if a manager, need to read the worker service type sent by payload
+            if (parameters.containsKey(CartridgeAgentConstants.WORKER_SERVICE_TYPE)) {
+                return parameters.get(CartridgeAgentConstants.WORKER_SERVICE_TYPE);
+            }
 
-	/**
+        } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_DEFAULT)) {
+            // for default deployment, no worker service type
+            return null;
+
+        }
+
+        return null;
+    }
+
+    private String readIsPrimary(){
+        if (parameters.containsKey(CartridgeAgentConstants.CLUSTERING_PRIMARY_KEY)) {
+            return parameters.get(CartridgeAgentConstants.CLUSTERING_PRIMARY_KEY);
+        }
+        return null;
+    }
+
+    /**
      * Get cartridge agent configuration singleton instance.
      *
      * @return
@@ -130,7 +207,40 @@ public class CartridgeAgentConfiguration {
         return instance;
     }
 
-    private String readPersisenceMapping() {
+    private boolean readCommitsEnabled(String commitEnabled) {
+        boolean isCommitEnabled = false;
+        try {
+            isCommitEnabled = Boolean.parseBoolean(readParameterValue(commitEnabled));
+
+        } catch (ParameterNotFoundException e) {
+            // Missing commits enabled flag is not an exception
+            log.error(" Commits enabled payload parameter is not found");
+        }
+        return isCommitEnabled;
+    }
+
+    private boolean readMultitenant(String multitenant) throws ParameterNotFoundException {
+        String multitenantStringValue = readParameterValue(multitenant);
+        return Boolean.parseBoolean(multitenantStringValue);
+    }
+
+    private boolean readInternalRepo(String internalRepo) {
+        String internalRepoStringValue = null;
+        try {
+            internalRepoStringValue = readParameterValue(internalRepo);
+        } catch (ParameterNotFoundException e) {
+            // Missing INTERNAL parameter is not an exception
+            log.info(" INTERNAL payload parameter is not found");
+        }
+
+        if(internalRepoStringValue.equals(CartridgeAgentConstants.INTERNAL)) {
+            return true;
+        } else{
+            return false;
+        }
+    }
+
+    private String readPersistenceMapping() {
         String persistenceMapping = null;
         try {
             persistenceMapping = readParameterValue("PERSISTENCE_MAPPING");
@@ -145,14 +255,14 @@ public class CartridgeAgentConfiguration {
         return persistenceMapping;
     }
 
-    
+
     private Map<String, String> loadParametersFile() {
-    	Map<String, String> parameters = new HashMap<String, String>();
-    	try {
+        Map<String, String> parameters = new HashMap<String, String>();
+        try {
 
             // read launch params
             File file = new File(System.getProperty(CartridgeAgentConstants.PARAM_FILE_PATH));
-            if(!file.exists()) {
+            if (!file.exists()) {
                 log.warn(String.format("File not found: %s", CartridgeAgentConstants.PARAM_FILE_PATH));
                 return parameters;
             }
@@ -161,48 +271,81 @@ public class CartridgeAgentConfiguration {
                 String line = scanner.nextLine();
                 String[] params = line.split(",");
                 for (String string : params) {
-					if (string != null) {
-						String[] var = string.split("=");
-						if (var.length >= 2) {
-							parameters.put(var[0], var[1]);
-						}
-					}
+                    if (string != null) {
+                        String[] var = string.split("=");
+                        if (var.length >= 2) {
+                            parameters.put(var[0], var[1]);
+                        }
+                    }
                 }
             }
             scanner.close();
         } catch (Exception e) {
-        	String message = "Could not read launch parameter file, hence trying to read from System properties.";
-        	log.warn(message, e);
+            String message = "Could not read launch parameter file, hence trying to read from System properties.";
+            log.warn(message, e);
+        }
+
+        return parameters;
+    }
+
+    private String readServiceGroup() {
+        if (parameters.containsKey(CartridgeAgentConstants.SERVICE_GROUP)) {
+            return parameters.get(CartridgeAgentConstants.SERVICE_GROUP);
+        } else {
+            return null;
+        }
+    }
+
+    private String readClustering() {
+        if (parameters.containsKey(CartridgeAgentConstants.CLUSTERING)) {
+            return parameters.get(CartridgeAgentConstants.CLUSTERING);
+        } else {
+            return null;
         }
-    	
-    	return parameters;
     }
 
-	private String readParameterValue(String parameterName) throws ParameterNotFoundException{
+    private String readParameterValue(String parameterName) throws ParameterNotFoundException {
 
-		if (parameters.containsKey(parameterName)) {
-			return parameters.get(parameterName);
-		}
+        if (parameters.containsKey(parameterName)) {
+            return parameters.get(parameterName);
+        }
 
-		if (System.getProperty(parameterName) != null) {
-			return System.getProperty(parameterName);
-		}
+        if (System.getProperty(parameterName) != null) {
+            return System.getProperty(parameterName);
+        }
 
-		String message = "Cannot find the value of required parameter: "+parameterName;
-		throw new ParameterNotFoundException(message);
-	}
+        String message = "Cannot find the value of required parameter: " + parameterName;
+        throw new ParameterNotFoundException(message);
+    }
+
+    private boolean readCommitParameterValue() throws ParameterNotFoundException {
+
+        if (parameters.containsKey(CartridgeAgentConstants.COMMIT_ENABLED)) {
+            return Boolean.parseBoolean(parameters.get(CartridgeAgentConstants.COMMIT_ENABLED));
+        }
+
+        if (System.getProperty(CartridgeAgentConstants.COMMIT_ENABLED) != null) {
+            return Boolean.parseBoolean(System.getProperty(CartridgeAgentConstants.COMMIT_ENABLED));
+        }
+
+        if (System.getProperty(CartridgeAgentConstants.AUTO_COMMIT) != null) {
+            return Boolean.parseBoolean(System.getProperty(CartridgeAgentConstants.AUTO_COMMIT));
+        }
+        log.info(CartridgeAgentConstants.COMMIT_ENABLED + " is not found and setting it to false");
+        return false;
+    }
 
     private List<Integer> readPorts() throws ParameterNotFoundException {
         List<Integer> ports = new ArrayList<Integer>();
         String portsStr = readParameterValue(CartridgeAgentConstants.PORTS);
         List<String> portsStrList = CartridgeAgentUtils.splitUsingTokenizer(portsStr, "|");
-        for(String port : portsStrList) {
+        for (String port : portsStrList) {
             ports.add(Integer.parseInt(port));
         }
         return ports;
     }
 
-    private List<String> readLogFilePaths () {
+    private List<String> readLogFilePaths() {
 
         String logFileStr = null;
         try {
@@ -258,20 +401,99 @@ public class CartridgeAgentConfiguration {
         return logFilePaths;
     }
 
-	public boolean isMultitenant() {
-		return isMultitenant;
-	}
+    public boolean isMultitenant() {
+        return isMultitenant;
+    }
 
     public String getPersistenceMappings() {
         return persistenceMappings;
     }
 
-	public boolean isCommitsEnabled() {
-		return isCommitsEnabled;
-	}
-
+    public boolean isCommitsEnabled() {
+        return isCommitsEnabled;
+    }
 
     public String getListenAddress() {
         return listenAddress;
     }
+
+    public boolean isInternalRepo() {
+        return isInternalRepo;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public String getLbClusterId() {
+        return lbClusterId;
+    }
+
+    public String getServiceGroup() {
+        return serviceGroup;
+    }
+
+    public String getIsClustered() {
+        return isClustered;
+    }
+
+    public String getMinCount() {
+        return minCount;
+    }
+
+    public String getIsPrimary() {
+        return isPrimary;
+    }
+
+	public String getLbPublicIp() {
+		return lbPublicIp;
+	}
+
+	public void setLbPublicIp(String lbPublicIp) {
+		this.lbPublicIp = lbPublicIp;
+	}
+
+	public String getLbPrivateIp() {
+		return lbPrivateIp;
+	}
+
+	public void setLbPrivateIp(String lbPrivateIp) {
+		this.lbPrivateIp = lbPrivateIp;
+	}
+
+    public String getDeployment() {
+        return deployment;
+    }
+
+    public void setDeployment(String deployment) {
+        this.deployment = deployment;
+    }
+
+    public String getManagerServiceName() {
+        return managerServiceName;
+    }
+
+    public void setManagerServiceName(String managerServiceName) {
+        this.managerServiceName = managerServiceName;
+    }
+
+    public String getWorkerServiceName() {
+        return workerServiceName;
+    }
+
+    public void setWorkerServiceName(String workerServiceName) {
+        this.workerServiceName = workerServiceName;
+    }
+
+    public String getSuperTenantRepositoryPath() {
+        return superTenantRepositoryPath;
+    }
+
+    public String getTenantRepositoryPath() {
+        return tenantRepositoryPath;
+    }
+
+    public boolean isCheckoutEnabled() {
+        return isCheckoutEnabled;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
index 072734d..838dfd7 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
@@ -23,8 +23,6 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
-import org.wso2.carbon.utils.CarbonUtils;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -38,7 +36,7 @@ public class JndiConfigurator {
     private static final Log log = LogFactory.getLog(JndiConfigurator.class);
 
     public static void configure() {
-        if(log.isDebugEnabled()) {
+        if (log.isDebugEnabled()) {
             log.debug("Configuring jndi.properties file");
         }
         generateJndiPropertiesFile();
@@ -46,26 +44,25 @@ public class JndiConfigurator {
 
     private static void generateJndiPropertiesFile() {
         String mbIp = System.getProperty("mb.ip");
-        if(StringUtils.isBlank(mbIp)) {
+        if (StringUtils.isBlank(mbIp)) {
             throw new RuntimeException("System property not found: mb.ip");
         }
         String mbPort = System.getProperty("mb.port");
-        if(StringUtils.isBlank(mbPort)) {
+        if (StringUtils.isBlank(mbPort)) {
             throw new RuntimeException("System property not found: mb.port");
         }
-        String templateFilePath =  System.getProperty("jndi.properties.template.file.path");
-        if(StringUtils.isBlank(templateFilePath)) {
+        String templateFilePath = System.getProperty("jndi.properties.template.file.path");
+        if (StringUtils.isBlank(templateFilePath)) {
             throw new RuntimeException("System property not found: jndi.properties.template.file.path");
         }
         String jndiFileDir = System.getProperty("jndi.properties.dir");
-        if(StringUtils.isBlank(jndiFileDir)) {
+        if (StringUtils.isBlank(jndiFileDir)) {
             throw new RuntimeException("System property not found: jndi.properties.dir");
         }
         String jndiFilePath = null;
-        if(jndiFileDir.endsWith("/")) {
+        if (jndiFileDir.endsWith("/")) {
             jndiFilePath = jndiFileDir + "jndi.properties";
-        }
-        else {
+        } else {
             jndiFilePath = jndiFileDir + "/" + "jndi.properties";
         }
 
@@ -83,7 +80,7 @@ public class JndiConfigurator {
 
             // Write jndi.properties file
             writeFileContent(content, jndiFilePath);
-            if(log.isDebugEnabled()) {
+            if (log.isDebugEnabled()) {
                 log.debug(String.format("jndi.properties file written to: %s", jndiFilePath));
             }
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
index 8a721fc..067961d 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
@@ -26,4 +26,17 @@ public class Constants {
     public static String TAIL_COMMAND = "tail -n 100 -F ";
     public static String MEMBER_ID = "memberId";
     public static String LOG_EVENT = "logEvent";
+    
+    public static String DATE_FORMATTER = "yyyy-MM-dd";
+    public static String DATE_TIME_FORMATTER = "yyyy-MM-dd HH:mm:ss,SSS";
+    public static String TENANT_ID = "tenantID";
+    public static String SERVER_NAME = "serverName";
+    public static String APP_NAME = "appName";
+    public static String LOG_TIME = "logTime";
+    public static String PRIORITY = "priority";
+    public static String MESSAGE = "message";
+    public static String LOGGER = "logger";
+    public static String IP = "ip";  
+    public static String INSTANCE = "instance";
+    public static String STACKTRACE = "stacktrace";
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
index f75aa27..01e681e 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
@@ -39,9 +39,9 @@ public class FileBasedLogPublisher extends LogPublisher implements Runnable {
     private Process process;
     private Scanner scanner;
 
-    public FileBasedLogPublisher(DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId) {
+    public FileBasedLogPublisher(DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId, String tenantId, String alias, Long datetime) {
 
-        super(dataPublisherConfig, streamDefinition, filePath, memberId);
+    	super(dataPublisherConfig, streamDefinition, filePath, memberId, tenantId, alias, datetime);
         this.executorService = Executors.newSingleThreadExecutor(new FileBasedLogPublisherTaskThreadFactory(filePath));
     }
 
@@ -88,7 +88,7 @@ public class FileBasedLogPublisher extends LogPublisher implements Runnable {
             // set the relevant data
             dataContext.setCorrelationData(null);
             dataContext.setMetaData(new Object[] {memberId});
-            dataContext.setPayloadData(new Object[] {scanner.nextLine()});
+            dataContext.setPayloadData(new Object[] {tenantId, alias, "", datetime, "", scanner.nextLine(), "","",memberId, ""});
             // publish data
             publish(dataContext);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
index 306f109..ae7412c 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
@@ -31,12 +31,19 @@ public abstract class LogPublisher extends DataPublisher {
 
     protected String memberId;
     protected String filePath;
+    protected String tenantId;
+    protected String alias;
+    protected Long datetime;
+    protected String serverName;
 
-    public LogPublisher (DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId) {
+    public LogPublisher (DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId, String tenantId, String alias, Long datetime) {
 
         super(dataPublisherConfig, streamDefinition);
         this.filePath = filePath;
         this.memberId = memberId;
+        this.tenantId = tenantId;
+        this.alias = alias;
+        this.datetime = datetime;
     }
 
     public void start () {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
index 02b8e63..5ca3c89 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
@@ -19,21 +19,25 @@
 
 package org.apache.stratos.cartridge.agent.data.publisher.log;
 
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
 import org.apache.stratos.cartridge.agent.data.publisher.DataPublisherConfiguration;
 import org.apache.stratos.cartridge.agent.data.publisher.exception.DataPublisherException;
 import org.apache.stratos.cartridge.agent.util.CartridgeAgentUtils;
+import org.wso2.carbon.base.MultitenantConstants;
 import org.wso2.carbon.databridge.commons.Attribute;
 import org.wso2.carbon.databridge.commons.AttributeType;
 import org.wso2.carbon.databridge.commons.StreamDefinition;
 import org.wso2.carbon.databridge.commons.exception.MalformedStreamDefinitionException;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
 public class LogPublisherManager {
 
     private static final Log log = LogFactory.getLog(LogPublisherManager.class);
@@ -58,7 +62,7 @@ public class LogPublisherManager {
 
         // stream definition identifier = {log.publisher.<cluster id>}
         try {
-            streamDefinition = new StreamDefinition(Constants.LOG_PUBLISHER_STREAM_PREFIX + CartridgeAgentConfiguration.getInstance().getClusterId(),
+        	streamDefinition = new StreamDefinition(Constants.LOG_PUBLISHER_STREAM_PREFIX + getValidTenantId(CartridgeAgentConfiguration.getInstance().getTenantId()) + "." + getAlias(CartridgeAgentConfiguration.getInstance().getClusterId()) + "." + getCurrentDate(),
                     Constants.LOG_PUBLISHER_STREAM_VERSION);
 
         } catch (MalformedStreamDefinitionException e) {
@@ -71,8 +75,17 @@ public class LogPublisherManager {
         metaDataDefinition.add(new Attribute(Constants.MEMBER_ID, AttributeType.STRING));
 
         List<Attribute> payloadDataDefinition = new ArrayList<Attribute>();
-        payloadDataDefinition.add(new Attribute(Constants.LOG_EVENT, AttributeType.STRING));
-
+        payloadDataDefinition.add(new Attribute(Constants.TENANT_ID, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.SERVER_NAME, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.APP_NAME, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.LOG_TIME, AttributeType.LONG));
+        payloadDataDefinition.add(new Attribute(Constants.PRIORITY, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.MESSAGE, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.LOGGER, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.IP, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.INSTANCE, AttributeType.STRING));
+        payloadDataDefinition.add(new Attribute(Constants.STACKTRACE, AttributeType.STRING));
+                 
         streamDefinition.setMetaData(metaDataDefinition);
         streamDefinition.setPayloadData(payloadDataDefinition);
     }
@@ -85,7 +98,10 @@ public class LogPublisherManager {
         }
 
         LogPublisher fileBasedLogPublisher = new FileBasedLogPublisher(dataPublisherConfig, streamDefinition, filePath,
-               CartridgeAgentConfiguration.getInstance().getMemberId());
+        		CartridgeAgentConfiguration.getInstance().getMemberId(),
+        		getValidTenantId(CartridgeAgentConfiguration.getInstance().getTenantId()),
+        		getAlias(CartridgeAgentConfiguration.getInstance().getClusterId()),
+        		getDateTime());
 
         fileBasedLogPublisher.initialize();
         fileBasedLogPublisher.start();
@@ -102,4 +118,37 @@ public class LogPublisherManager {
            }
        }
     }
+    
+	private String getCurrentDate() {
+		Date now = new Date();
+		DateFormat formatter = new SimpleDateFormat(Constants.DATE_FORMATTER);
+		String formattedDate = formatter.format(now);
+		return formattedDate.replace("-", ".");
+	}
+
+	private String getAlias(String clusterId) {
+		String alias;
+		try {
+			alias = clusterId.split("\\.")[0];
+		} catch (Exception e) {
+			e.printStackTrace();
+			alias = clusterId;
+		}
+		return alias;
+	}
+
+	private Long getDateTime() {
+		Date date = new Date();
+		return date.getTime();
+	}
+
+	private String getValidTenantId(String tenantId) {
+		if (tenantId.equals(String
+				.valueOf(MultitenantConstants.INVALID_TENANT_ID))
+				|| tenantId.equals(String
+						.valueOf(MultitenantConstants.SUPER_TENANT_ID))) {
+			return "0";
+		}
+		return tenantId;
+	}
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
index 9c2e21f..1046482 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
@@ -25,7 +25,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
 import org.apache.stratos.cartridge.agent.statistics.publisher.HealthStatisticsNotifier;
-import org.apache.stratos.cartridge.agent.util.ExtensionUtils;
 import org.apache.stratos.messaging.broker.publish.EventPublisher;
 import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
 import org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent;
@@ -63,7 +62,6 @@ public class CartridgeAgentEventPublisher {
                 log.info("Instance started event published");
             }
 
-            ExtensionUtils.executeInstanceStartedExtension();
         } else {
             if (log.isWarnEnabled()) {
                 log.warn("Instance already started");
@@ -81,7 +79,8 @@ public class CartridgeAgentEventPublisher {
                     CartridgeAgentConfiguration.getInstance().getClusterId(),
                     CartridgeAgentConfiguration.getInstance().getNetworkPartitionId(),
                     CartridgeAgentConfiguration.getInstance().getPartitionId(),
-                    CartridgeAgentConfiguration.getInstance().getMemberId());
+                    CartridgeAgentConfiguration.getInstance().getMemberId()
+            );
 
             // Event publisher connection will
             EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.INSTANCE_STATUS_TOPIC);
@@ -90,8 +89,6 @@ public class CartridgeAgentEventPublisher {
                 log.info("Instance activated event published");
             }
 
-            ExtensionUtils.executeInstanceActivatedExtension();
-
             if (log.isInfoEnabled()) {
                 log.info("Starting health statistics notifier");
             }
@@ -108,7 +105,7 @@ public class CartridgeAgentEventPublisher {
         }
     }
 
-     public static void publishInstanceReadyToShutdownEvent() {
+    public static void publishInstanceReadyToShutdownEvent() {
         if (!isReadyToShutdown()) {
             if (log.isInfoEnabled()) {
                 log.info("Publishing instance activated event");
@@ -133,7 +130,7 @@ public class CartridgeAgentEventPublisher {
         }
     }
 
-     public static void publishMaintenanceModeEvent() {
+    public static void publishMaintenanceModeEvent() {
         if (!isMaintenance()) {
             if (log.isInfoEnabled()) {
                 log.info("Publishing instance maintenance mode event");