[prev in list] [next in list] [prev in thread] [next in thread] 

List:       esb-java-dev
Subject:    [Dev] Fwd: [Commits] [Carbon-platform] svn commit r144202 - in carbon/platform/branches/4.0.0/compon
From:       Nirmal Fernando <nirmal () wso2 ! com>
Date:       2012-09-28 18:26:27
Message-ID: CAJ+w7FnsO93t03G0SqkqpnD50uAn=NLDB3M_One_fT_ryWCxZg () mail ! gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


Hi,

Your commits to
"carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1"
 breaking the build. I guess you wanted to commit to 1.0.2.

---------- Forwarded message ----------
From: <ramith@wso2.com>
Date: Fri, Sep 28, 2012 at 3:05 PM
Subject: [Commits] [Carbon-platform] svn commit r144202 - in
carbon/platform/branches/4.0.0/components/appfactory:
org.wso2.carbon.appfactory.application.mgt/1.0.2
org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal
 org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service
 org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util
 org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build
 org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal
 org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service
 org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core
org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build
 org.wso2.carbon.appfactory.cor
To: commits@wso2.org


Author: ramith
Date: Fri Sep 28 05:35:12 2012
New Revision: 144202
URL: http://wso2.org/svn/browse/wso2?view=rev&revision=144202

Log:
Adding changes in AF svn branch to 4.0.2

Added:

 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java

 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java
 Modified:

 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.appli \
cation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.appli \
cation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.appli \
cation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java

 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.jenki \
ns.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repos \
itory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repos \
itory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repos \
itory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java


 carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.utili \
ties/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java


Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml
  Fri Sep 28 05:35:12 2012
@@ -60,6 +60,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.appfactory.utilities</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
             <version>1.1.1</version>

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfacto \
ry/application/mgt/internal/ApplicationManagementServiceComponent.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java
  Fri Sep 28 05:35:12 2012
@@ -23,6 +23,7 @@
 import
org.wso2.carbon.appfactory.application.mgt.service.ApplicationManagementService;
 import org.wso2.carbon.appfactory.application.mgt.util.Util;
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
 import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;
 import org.wso2.carbon.registry.core.service.RegistryService;
 import org.wso2.carbon.user.core.service.RealmService;
@@ -54,6 +55,12 @@
  *               cardinality="0..1" policy="dynamic"
  *               bind="setContinuousIntegrationSystemDriver"
  *               unbind="unsetContinuousIntegrationSystemDriver"
+ *
+ @scr.reference name="appfactory.application.events.listener"
+ *
interface="org.wso2.carbon.appfactory.core.ApplicationEventsListener"
+ *               cardinality="0..n" policy="dynamic"
+ *               bind="setApplicationEventsListener"
+ *               unbind="unsetApplicationEventsListener"
  */
 public class ApplicationManagementServiceComponent {
     private static Log log =
LogFactory.getLog(ApplicationManagementServiceComponent.class);
@@ -119,4 +126,12 @@
    public static void
unsetContinuousIntegrationSystemDriver(ContinuousIntegrationSystemDriver
continuousIntegrationSystemDriver) {
        Util.setContinuousIntegrationSystemDriver(null);
    }
+
+    public static void
setApplicationEventsListener(ApplicationEventsListener
applicationEventsListener) {
+        Util.addApplicationEventsListener(applicationEventsListener);
+    }
+
+    public static void
unsetApplicationEventsListener(ApplicationEventsListener
applicationEventsListener) {
+        Util.removeApplicationEventsListener(applicationEventsListener);
+    }
 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfacto \
ry/application/mgt/service/ApplicationManagementService.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java
  Fri Sep 28 05:35:12 2012
@@ -1,27 +1,35 @@
 /*
  * Copyright 2005-2011 WSO2, Inc. (http://wso2.com)
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */

 package org.wso2.carbon.appfactory.application.mgt.service;

+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;

 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.wso2.carbon.CarbonConstants;
 import org.wso2.carbon.appfactory.application.mgt.util.Util;
 import org.wso2.carbon.appfactory.common.AppFactoryException;
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
+import org.wso2.carbon.appfactory.core.dto.Application;
+import org.wso2.carbon.appfactory.core.dto.UserInfo;
+import org.wso2.carbon.appfactory.core.dto.Version;
+import org.wso2.carbon.appfactory.utilities.project.ProjectUtils;
 import org.wso2.carbon.base.MultitenantConstants;
 import org.wso2.carbon.core.AbstractAdmin;
 import org.wso2.carbon.user.api.Tenant;
@@ -29,10 +37,6 @@
 import org.wso2.carbon.user.api.UserRealm;
 import org.wso2.carbon.user.api.UserStoreException;

-import java.util.ArrayList;
-import java.util.List;
-
-
 public class ApplicationManagementService extends AbstractAdmin {
     private static Log log =
LogFactory.getLog(ApplicationManagementService.class);

@@ -40,54 +44,54 @@
     public static String FIRST_NAME_CLAIM_URI = "
http://wso2.org/claims/givenname";
     public static String LAST_NAME_CLAIM_URI = "
http://wso2.org/claims/lastname";

-
-    public String createApplication(ApplicationInfoBean application) {
-        return application.getApplicationKey();
-    }
-
-
     public boolean addUserToApplication(String applicationId, String
userName, String[] roles)
-            throws ApplicationManagementException {
+
                   throws ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         try {
-            UserRealm realm =
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));
+            UserRealm realm =
+                              Util.getRealmService()
+
 .getTenantUserRealm(tenantManager.getTenantId(applicationId));
             String[] newRolesForUser = removeRolesUserAlreadyIn(userName,
roles, realm);
             realm.getUserStoreManager().updateRoleListOfUser(userName,
null, newRolesForUser);
-
+
+
         } catch (UserStoreException e) {
             String msg = "Error while adding user " + userName + " to
application " + applicationId;
             log.error(msg, e);
             throw new ApplicationManagementException(msg, e);
         }

-        try {
-            if ( log.isDebugEnabled()){
-                log.debug("Creating a continuous integration job for
application id: " + applicationId + "using trunk");
+        // Notify the event listener about the user addition
+        Iterator<ApplicationEventsListener> appEventListeners =
+
 Util.getApplicationEventsListeners()
+
 .iterator();
+        try {
+            Application app =
ProjectUtils.getApplicationInfo(applicationId);
+            UserInfo user = new UserInfo(userName);
+            while (appEventListeners.hasNext()) {
+                ApplicationEventsListener listener =
appEventListeners.next();
+                listener.onUserAddition(app, user);
             }

-            if ( Util.getContinuousIntegrationSystemDriver() != null){
-
 Util.getContinuousIntegrationSystemDriver().createApplicationAccount(applicationId,
new String[]{userName});
-
 Util.getContinuousIntegrationSystemDriver().createJob(applicationId,
"trunk", null);
-            }
-
-        } catch (AppFactoryException ex) {
-             String msg = "Error occured while creating a job in
continuous integration system";
-             log.error(msg, ex);
-             throw new ApplicationManagementException(msg,ex);
+        } catch (Exception ex) {
+            String errorMsg = "Unable to publish user addition event due
to " + ex.getMessage();
+            log.error(errorMsg, ex);
+            throw new ApplicationManagementException(errorMsg, ex);
         }
-
+
         return true;
     }

-    //If user is going to be added to a role that he is already having,
remove that role from 'newRoles'
+    // If user is going to be added to a role that he is already having,
remove
+    // that role from 'newRoles'
     private String[] removeRolesUserAlreadyIn(String userName, String[]
newRoles, UserRealm realm)
-            throws UserStoreException {
+
                       throws UserStoreException {

         ArrayList<String> newRolesArray = new ArrayList<String>();
-        for(String newRole : newRoles) {
+        for (String newRole : newRoles) {
             newRolesArray.add(newRole);
         }
-        for(String role :
realm.getUserStoreManager().getRoleListOfUser(userName)) {
+        for (String role :
realm.getUserStoreManager().getRoleListOfUser(userName)) {
             if (newRolesArray.contains(role)) {
                 newRolesArray.remove(role);
             }
@@ -95,35 +99,47 @@
         return newRolesArray.toArray(new String[newRolesArray.size()]);
     }

-    public boolean updateRolesOfUserForApplication (String applicationId,
String userName, String[] rolesToDelete, String[] newRoles)
-            throws ApplicationManagementException {
+    public boolean updateRolesOfUserForApplication(String applicationId,
String userName,
+                                                   String[] rolesToDelete,
String[] newRoles)
+
                  throws ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         try {
-            UserRealm realm =
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));
+            UserRealm realm =
+                              Util.getRealmService()
+
 .getTenantUserRealm(tenantManager.getTenantId(applicationId));
             realm.getUserStoreManager().updateRoleListOfUser(userName,
rolesToDelete, newRoles);
             return true;
         } catch (UserStoreException e) {
-            String msg = "Error while updating roles for user: " +
userName + " of application " + applicationId;
+            String msg =
+                         "Error while updating roles for user: " +
userName + " of application " +
+                                 applicationId;
             log.error(msg, e);
             throw new ApplicationManagementException(msg, e);
-        }
-   }
+        }
+    }

-    public String[] getUsersOfApplication(String applicationId ) throws
ApplicationManagementException {
+    public String[] getUsersOfApplication(String applicationId)
+                                                               throws
ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         ArrayList<String> userList = new ArrayList<String>();
         try {
-            UserRealm realm =
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));
+            UserRealm realm =
+                              Util.getRealmService()
+
 .getTenantUserRealm(tenantManager.getTenantId(applicationId));
             String[] roles = realm.getUserStoreManager().getRoleNames();
             if (roles.length > 0) {
                 for (String roleName : roles) {
-                    if
(!Util.getRealmService().getBootstrapRealmConfiguration().getEveryOneRoleName().equals(roleName))
 {
-                        String[] usersOfRole =
realm.getUserStoreManager().getUserListOfRole(roleName);
+                    if
(!Util.getRealmService().getBootstrapRealmConfiguration()
+                             .getEveryOneRoleName().equals(roleName)) {
+                        String[] usersOfRole =
+                                               realm.getUserStoreManager()
+
 .getUserListOfRole(roleName);
                         if (usersOfRole != null && usersOfRole.length > 0)
{
                             for (String userName : usersOfRole) {
                                 if (!userList.contains(userName) &&
-
 !Util.getRealmService().getBootstrapRealmConfiguration().getAdminUserName().equals(userName)
                
-                                    &&
!CarbonConstants.REGISTRY_ANONNYMOUS_USERNAME.equals(userName)) {
+
 !Util.getRealmService().getBootstrapRealmConfiguration()
+
.getAdminUserName().equals(userName) &&
+
 !CarbonConstants.REGISTRY_ANONNYMOUS_USERNAME.equals(userName)) {
                                     userList.add(userName);
                                 }
                             }
@@ -141,35 +157,78 @@
     }

     public boolean removeUserFromApplication(String applicationId, String
userName)
-            throws ApplicationManagementException {
+
        throws ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         try {
-            UserRealm realm =
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));
+            UserRealm realm =
+                              Util.getRealmService()
+
 .getTenantUserRealm(tenantManager.getTenantId(applicationId));
             realm.getUserStoreManager().deleteUser(userName);
-            return true;
+
         } catch (UserStoreException e) {
-            String msg = "Error while removing user " + userName + " from
application " + applicationId;
+            String msg =
+                         "Error while removing user " + userName + " from
application " +
+                                 applicationId;
             log.error(msg, e);
             throw new ApplicationManagementException(msg, e);
         }
+
+        //Notify listeners about removing the user from application.
+        Iterator<ApplicationEventsListener> appEventListeners =
+
 Util.getApplicationEventsListeners()
+
 .iterator();
+        try {
+            Application app =
ProjectUtils.getApplicationInfo(applicationId);
+            UserInfo user = new UserInfo(userName);
+            while (appEventListeners.hasNext()) {
+                ApplicationEventsListener listener =
appEventListeners.next();
+                listener.onUserDeletion(app, user);
+            }
+
+        } catch (Exception ex) {
+            String errorMsg = "Unable to publish user deletion event due
to " + ex.getMessage();
+            log.error(errorMsg, ex);
+            throw new ApplicationManagementException(errorMsg, ex);
+        }
+
+        return true;
+
     }

-
     public boolean revokeApplication(String applicationId) throws
ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         try {

 tenantManager.deleteTenant(tenantManager.getTenantId(applicationId));
-            return true;
+
         } catch (UserStoreException e) {
             String msg = "Error while revoking application " +
applicationId;
             log.error(msg, e);
             throw new ApplicationManagementException(msg, e);
         }
-    }

+        // Notify listeners about the revoke
+        Iterator<ApplicationEventsListener> appEventListeners =
+
 Util.getApplicationEventsListeners()
+
 .iterator();
+
+        try {
+            Application application =
ProjectUtils.getApplicationInfo(applicationId);
+            while (appEventListeners.hasNext()) {
+                ApplicationEventsListener listener =
appEventListeners.next();
+                listener.onRevoke(application);
+            }
+        } catch (AppFactoryException ex) {
+            String errorMsg = "Unable to notify revoke application event
due to " + ex.getMessage();
+            log.error(errorMsg, ex);
+            throw new ApplicationManagementException(errorMsg, ex);
+        }
+
+
+        return true;
+    }

     public boolean isApplicationIdAvailable(String applicationKey)
-            throws ApplicationManagementException {
+                                                                  throws
ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         int tenantID;
         try {
@@ -182,17 +241,23 @@
         return tenantID < 0;
     }

-
     public UserInfoBean getUserInfoBean(String userName) throws
ApplicationManagementException {

         try {
-            UserRealm realm =
Util.getRealmService().getTenantUserRealm(MultitenantConstants.SUPER_TENANT_ID);
-            String email =
realm.getUserStoreManager().getUserClaimValue(userName,
-
EMAIL_CLAIM_URI, null);
-            String firstName =
realm.getUserStoreManager().getUserClaimValue(userName,
-
  FIRST_NAME_CLAIM_URI, null);
-            String lastName =
realm.getUserStoreManager().getUserClaimValue(userName,
-
 LAST_NAME_CLAIM_URI, null);
+            UserRealm realm =
+                              Util.getRealmService()
+
 .getTenantUserRealm(MultitenantConstants.SUPER_TENANT_ID);
+            String email =
+
realm.getUserStoreManager().getUserClaimValue(userName, EMAIL_CLAIM_URI,
+
null);
+            String firstName =
+
realm.getUserStoreManager().getUserClaimValue(userName,
+
  FIRST_NAME_CLAIM_URI,
+
  null);
+            String lastName =
+
 realm.getUserStoreManager().getUserClaimValue(userName,
+
 LAST_NAME_CLAIM_URI,
+
 null);
             return new UserInfoBean(userName, firstName, lastName, email);
         } catch (UserStoreException e) {
             String msg = "Error while getting info for user " + userName;
@@ -204,18 +269,20 @@
     public UserInfoBean[] getUserInfo(String applicationId) throws
ApplicationManagementException {
         String[] users = getUsersOfApplication(applicationId);
         ArrayList<UserInfoBean> userInfoList = new
ArrayList<UserInfoBean>();
-        if (users != null && users.length >0 ) {
-            for(int i = 0 ; i < users.length; i++ ) {
+        if (users != null && users.length > 0) {
+            for (int i = 0; i < users.length; i++) {
                 try {
                     userInfoList.add(getUserInfoBean(users[i]));
                 } catch (ApplicationManagementException e) {
-                    String msg = "Error while getting info for user " +
users[i]+ "\n Continue getting other users information";
+                    String msg =
+                                 "Error while getting info for user " +
users[i] +
+                                         "\n Continue getting other users
information";
                     log.error(msg, e);
                 }
             }
         }
         return userInfoList.toArray(new UserInfoBean[userInfoList.size()]);
-    }
+    }

     public String[] getAllApplications(String userName) throws
ApplicationManagementException {
         String apps[] = new String[0];
@@ -227,7 +294,8 @@
             for (Tenant tenant : tenants) {
                 UserRealm realm =
Util.getRealmService().getTenantUserRealm(tenant.getId());
                 // every user in everyone role
-                if (realm != null &&
realm.getUserStoreManager().getRoleListOfUser(userName).length > 1) {
+                if (realm != null &&
+
 realm.getUserStoreManager().getRoleListOfUser(userName).length > 1) {
                     list.add(tenant.getDomain());
                 }
             }
@@ -245,18 +313,21 @@
     }

     public String[] getRolesOfUserPerApplication(String appId, String
userName)
-            throws ApplicationManagementException {
+
    throws ApplicationManagementException {
         TenantManager tenantManager =
Util.getRealmService().getTenantManager();
         org.wso2.carbon.user.api.UserStoreManager userStoreManager;
         userStoreManager = null;
         ArrayList<String> roleList = new ArrayList<String>();
         String roles[];
         try {
-            UserRealm realm =
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(appId));
+            UserRealm realm =
+                              Util.getRealmService()
+
 .getTenantUserRealm(tenantManager.getTenantId(appId));
             userStoreManager = realm.getUserStoreManager();
             roles = userStoreManager.getRoleListOfUser(userName);
-            for(String role : roles) {
-
 if(!Util.getRealmService().getBootstrapRealmConfiguration().getEveryOneRoleName().equals(role))
 {
+            for (String role : roles) {
+                if
(!Util.getRealmService().getBootstrapRealmConfiguration().getEveryOneRoleName()
+                         .equals(role)) {
                     roleList.add(role);
                 }
             }
@@ -267,26 +338,72 @@
         }
         return roleList.toArray(new String[roleList.size()]);
     }
-
-    public boolean configureContinuousIntegrationForApplication(String
applicationId, String[] initialUserNames)
-        throws ApplicationManagementException{
-
-        try {
-            if ( log.isDebugEnabled()){
-                log.debug("configure a continuous integration system for
application id: " + applicationId);
+
+    public void publishApplicationCreation(String applicationId)
+                                                                throws
ApplicationManagementException {
+        Iterator<ApplicationEventsListener> appEventListeners =
+
 Util.getApplicationEventsListeners()
+
 .iterator();
+        try {
+            Application application =
ProjectUtils.getApplicationInfo(applicationId);
+            if (application == null) {
+                String errorMsg =
+                                  String.format("Unable to load
application information for id ",
+                                                applicationId);
+                throw new ApplicationManagementException(errorMsg);
             }
-
-            if ( Util.getContinuousIntegrationSystemDriver() != null){
-
 Util.getContinuousIntegrationSystemDriver().createApplicationAccount(applicationId,
initialUserNames);
-
 Util.getContinuousIntegrationSystemDriver().createJob(applicationId,
"trunk", null);
+
+            while (appEventListeners.hasNext()) {
+                ApplicationEventsListener listener =
appEventListeners.next();
+                listener.onCreation(application);
             }
+        } catch (AppFactoryException ex) {
+            String errorMsg = "Unable to publish application creation due
to : " + ex.getMessage();
+            log.error(errorMsg, ex);
+            throw new ApplicationManagementException(errorMsg, ex);
+        }
+    }
+
+    public void publishApplicationVersionCreation(String applicationId,
String sourceVersion, String targetVersion)
+
               throws ApplicationManagementException {
+        try {
+
+            Iterator<ApplicationEventsListener> appEventListeners =
+                    Util.getApplicationEventsListeners()
+                        .iterator();
+
+            Application application =
ProjectUtils.getApplicationInfo(applicationId);
+
+            Version[] versions = ProjectUtils.getVersions(applicationId);

+            //find the versions.
+            Version source = null;
+            Version target = null;
+            for (Version v : versions) {
+                if ( v.getId().equals(sourceVersion)){
+                    source = v;
+                }
+
+                if (v.getId().equals(targetVersion)) {
+                    target = v;
+                }
+
+                if ( source != null && target != null){
+                    // both version are found. no need to traverse more
+                    break;
+                }
+
+            }
+
+            while (appEventListeners.hasNext()) {
+                ApplicationEventsListener listener =
appEventListeners.next();
+                listener.onVersionCreation(application, source, target);
+            }
+
         } catch (AppFactoryException ex) {
-             String msg = "Error occured while configuring in continuous
integration system for : " + applicationId;
-             log.error(msg, ex);
-             throw new ApplicationManagementException(msg,ex);
+            String errorMsg = "Unable to publish version creation due to "
+ ex.getMessage();
+            log.error(errorMsg, ex);
+            throw new ApplicationManagementException(errorMsg, ex);
         }
-
-        return true;
     }
 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.applic \
ation.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java
  Fri Sep 28 05:35:12 2012
@@ -17,10 +17,17 @@
 package org.wso2.carbon.appfactory.application.mgt.util;


+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
+import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;
 import org.wso2.carbon.registry.api.RegistryService;
 import org.wso2.carbon.user.core.service.RealmService;
-import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;

 /**
  *
@@ -32,6 +39,16 @@
     private static AppFactoryConfiguration configuration;
     private static ContinuousIntegrationSystemDriver
continuousIntegrationSystemDriver;

+    /**
+     * This set needs be a {@link SortedSet} ( e.g.{@link TreeSet} ) to
preserve natural
+     * ordering among {@link ApplicationEventsListener}s.
+     * Refer
+     * {@link
ApplicationEventsListener#compareTo(ApplicationEventsListener)} to find out
+     * how natural ordering occurs
+     */
+    private static Set<ApplicationEventsListener>
applicationEventsListeners =
+
    Collections.synchronizedSet(new TreeSet<ApplicationEventsListener>());
+
     public static AppFactoryConfiguration getConfiguration() {
         return configuration;
     }
@@ -71,4 +88,16 @@
     }


+    public static void
addApplicationEventsListener(ApplicationEventsListener
applicationEventsListener){
+       applicationEventsListeners.add(applicationEventsListener);
+    }
+
+    public static void
removeApplicationEventsListener(ApplicationEventsListener
applicationEventsListener) {
+        applicationEventsListeners.remove(applicationEventsListener);
+    }
+
+    public static Set<ApplicationEventsListener>
getApplicationEventsListeners() {
+        return applicationEventsListeners;
+    }
+
 }

Added:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java?pathrev=144202
 ==============================================================================
--- (empty file)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java
  Fri Sep 28 05:35:12 2012
@@ -0,0 +1,109 @@
+package org.wso2.carbon.appfactory.jenkins.build;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.appfactory.common.AppFactoryException;
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
+import org.wso2.carbon.appfactory.core.dto.Application;
+import org.wso2.carbon.appfactory.core.dto.UserInfo;
+import org.wso2.carbon.appfactory.core.dto.Version;
+import org.wso2.carbon.appfactory.jenkins.build.internal.ServiceContainer;
+import org.wso2.carbon.appfactory.utilities.project.ProjectUtils;
+
+/**
+ * Listens to Application events (such as creation, user addition etc) and
makes
+ * relevant changes on Jenkins CI server.
+ *
+ */
+public class JenkinsApplicationEventsListener extends
ApplicationEventsListener {
+
+    private static Log log =
LogFactory.getLog(JenkinsApplicationEventsListener.class);
+
+    private int priority;
+
+    /**
+     * Creates a listener instance with given priority.
+     *
+     * @param priority
+     *            The Priority
+     */
+    public JenkinsApplicationEventsListener(int priority) {
+
+        this.priority = priority;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onCreation(Application application) throws
AppFactoryException {
+
+        log.info("Application Creation event recieved for : " +
application.getId() + " " +
+                 application.getName());
+
 ServiceContainer.getJenkinsCISystemDriver().setupApplicationAccount(application.getId());
 +
+        Version[] versions = ProjectUtils.getVersions(application.getId());
+
+        if (ArrayUtils.isNotEmpty(versions)) {
+
 ServiceContainer.getJenkinsCISystemDriver().createJob(application.getId(),
+
 versions[0].getId(), "");
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onUserAddition(Application application, UserInfo user)
throws AppFactoryException {
+
+        log.info("User Addition event recieved for : " +
application.getId() + " " +
+                 application.getName() + " User Name : " +
user.getUserName());
+
+        ServiceContainer.getJenkinsCISystemDriver()
+                        .addUsersToApplication(application.getId(),
+                                               new String[] {
user.getUserName() });
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onRevoke(Application application) throws
AppFactoryException {
+        // Improvement : remove the jobs from jenkins
+        // Improvement : Remore roles (since appfactory uses role strategy
+        // plugin) associated with the app
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onVersionCreation(Application application, Version source,
Version target)
+
               throws AppFactoryException {
+
+        log.info("Version Creation event recieved for : " +
application.getId() + " " +
+                 application.getName() + " Version : " + target.getId());
+
+
 ServiceContainer.getJenkinsCISystemDriver().createJob(application.getId(),
target.getId(),
+                                                              "");
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onUserDeletion(Application application, UserInfo user)
throws AppFactoryException {
+        // Improvement : remove the user from project role created for
+        // application and the global roles assigned to him.
+    }
+
+    /**
+     * {@inheritDoc}.
+     */
+    public int getPriority() {
+        return priority;
+    }
+}

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java \
URL: http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfact \
ory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java  \
(original) +++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java  \
Fri Sep 28 05:35:12 2012 @@ -33,7 +33,9 @@
     public static final String AUTHENTICATE_CONFIG_SELECTOR =

 "ContinuousIntegrationProvider.jenkins.Property.Authenticate";
     public static final String DEFAULT_GLOBAL_ROLES_CONFIG_SELECTOR =
"ContinuousIntegrationProvider.jenkins.Property.DefaultGlobalRoles";
-
+
+    public static final String LISTENER_PRIORITY_CONFIG_SELECTOR =
"ContinuousIntegrationProvider.jenkins.Property.ListenerPriority";
+
     public static final String SVN_REPOSITORY = "svn.repository";
     public static final String SVN_REPOSITORY_XPATH_SELECTOR =

"/*/scm/locations/hudson.scm.SubversionSCM_-ModuleLocation/remote";

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java
  Fri Sep 28 05:35:12 2012
@@ -1,21 +1,25 @@
 /*
  * Copyright 2005-2011 WSO2, Inc. (http://wso2.com)
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */

 package org.wso2.carbon.appfactory.jenkins.build;

+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.wso2.carbon.appfactory.common.AppFactoryConstants;
@@ -25,15 +29,28 @@
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryMgtException;
 import org.wso2.carbon.appfactory.utilities.project.ProjectUtils;

-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+/**
+ * This driver integrates Jenkins CI and Appfactory. Refer
+ * {@link ContinuousIntegrationSystemDriver} for more information.
+ *
+ */
 public class JenkinsCISystemDriver implements
ContinuousIntegrationSystemDriver {

+    /**
+     * Used to connect to jenkins server
+     */
     private RestBasedJenkinsCIConnector connector;
+
+    /**
+     * These global roles names should be defined in role based strategy (
+     * jenkins ci) plugin.
+     * Any user added to jenkins will be assigned with these roles.
+     * Typical usage of having such roles is to control access at a global
level
+     * ( e.g. defining slaves, admin access)
+     *
+     */
     private String[] defaultGlobalRoles;
-
+
     private static final Log log =
LogFactory.getLog(JenkinsCISystemDriver.class);

     public JenkinsCISystemDriver(RestBasedJenkinsCIConnector connector,
String[] defaultGlobalRoles) {
@@ -41,6 +58,9 @@
         this.defaultGlobalRoles = defaultGlobalRoles;
     }

+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void createJob(String applicationId, String version, String
revision)

     throws AppFactoryException {
@@ -78,59 +98,101 @@

         parameters.put(JenkinsCIConstants.SVN_CREDENTIALS_USERNAME,
                        ServiceContainer.getAppFactoryConfiguration()
-
 .getFirstProperty(AppFactoryConstants.SERVER_ADMIN_NAME));
+
.getFirstProperty(AppFactoryConstants.SERVER_ADMIN_NAME));
         parameters.put(JenkinsCIConstants.SVN_CREDENTIALS_PASSWORD,
                        ServiceContainer.getAppFactoryConfiguration()
-
 .getFirstProperty(AppFactoryConstants.SERVER_ADMIN_PASSWORD));
+
.getFirstProperty(AppFactoryConstants.SERVER_ADMIN_PASSWORD));

         parameters.put(JenkinsCIConstants.APPLICATION_ID, applicationId);
         parameters.put(JenkinsCIConstants.APPLICATION_VERSION, version);
-
-        // TODO : Hard coded application extension here. in future this
could be either 'car'or 'war'
+
+        // TODO : Hard coded application extension here. in future this
could be
+        // either 'car'or 'war'
         // and will be selected by user
         parameters.put(JenkinsCIConstants.APPLICATION_EXTENSION, "car");

-
         this.connector.createJob(getJobName(applicationId, version,
revision), parameters);

     }

+    /**
+     * {@inheritDoc}
+     */
     public void deleteJob(String jobName) throws AppFactoryException {
         connector.deleteJob(jobName);
     }

+    /**
+     * {@inheritDoc}
+     */
     public List<String> getAllJobNames() throws AppFactoryException {
         return connector.getAllJobs();
     }

+    /**
+     * {@inheritDoc}
+     */
     public void startBuild(String jobName) throws AppFactoryException {
         connector.startBuild(jobName);
     }

-    public boolean isJobExists(String jobName) throws AppFactoryException{
-       return connector.isJobExists(jobName);
-    }
-
-
-
-    public String getJobName(String applicationId, String version, String
revision){
-      //Job name will be '<ApplicationId>-<version>-default'
-        return new StringBuilder(applicationId).append('-').append(version)
-                   .append('-').append("default").toString();
-    }
-
-    public void createApplicationAccount(String applicationId, String[]
initialUserIds) throws AppFactoryException {
-       String applicationSelectorRegEx = new
StringBuilder(applicationId).append(".*").toString();
-       connector.createRole(applicationId, applicationSelectorRegEx);
-       if ( initialUserIds != null){
-          assignUsersApplication(applicationId, initialUserIds);
-       }
-    }
-
-    public void assignUsersApplication(String applicationId, String[]
userIds)
-
   throws AppFactoryException {
-        connector.assignUsers(userIds, new String[]{applicationId},
defaultGlobalRoles);
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isJobExists(String jobName) throws AppFactoryException {
+        return connector.isJobExists(jobName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getJobName(String applicationId, String version, String
revision) {
+        // Job name will be '<ApplicationId>-<version>-default'
+        return new
StringBuilder(applicationId).append('-').append(version).append('-')
+
.append("default").toString();
+    }
+
+    /**
+     * Additional method to be used by {@link
JenkinsApplicationEventsListener}.
+     * Method will add a role (in role strategy plugin) to match jobs
created
+     * for specified application.
+     * (when a user is added/invited to a application,
+     * {@link JenkinsApplicationEventsListener} will assign
+     * the role associated with application to user.
+     * <p>
+     * <b>NOTE: This method assumes role-strategy plugin is correctly
installed
+     * in jenkins server
+     * </p>
+     *
+     * @param applicationId
+     *            application Id
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
+    public void setupApplicationAccount(String applicationId) throws
AppFactoryException {
+        String applicationSelectorRegEx = new
StringBuilder(applicationId).append(".*").toString();
+        connector.createRole(applicationId, applicationSelectorRegEx);
+    }
+
+    /**
+     * Configures given list of users in jenkins server ( role strategy
plugin)
+     * by assigning correct application specific roles and set of global
roles.
+     * These role should be already defined in jenkins server.
+     * <p>
+     * <b>NOTE: This method assumes role-strategy plugin is correctly
installed
+     * in jenkins server
+     * </p>
+     *
+     * @param applicationId
+     *            Application Id
+     * @param userIds
+     *            set of users (Ids)
+     * @throws AppFactoryException
+     *             if a error occurs
+     */
+    public void addUsersToApplication(String applicationId, String[]
userIds)
+
  throws AppFactoryException {
+        connector.assignUsers(userIds, new String[] { applicationId },
defaultGlobalRoles);
     }
-
-
+
 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java
 (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java
 Fri Sep 28 05:35:12 2012
@@ -44,14 +44,27 @@
 import org.apache.commons.logging.LogFactory;
 import org.wso2.carbon.appfactory.common.AppFactoryException;

+/**
+ * Connects to a jenkins server using its 'Remote API'.
+ *
+ */
 public class RestBasedJenkinsCIConnector {

     private static final Log log =
LogFactory.getLog(RestBasedJenkinsCIConnector.class);

+    /**
+     * The http client used to connect jenkins.
+     */
     private HttpClient httpClient;

+    /**
+     * Base url of the jenkins
+     */
     private String jenkinsUrl;

+    /**
+     * Flag weather this connector needs to authenticate it self.
+     */
     private boolean authenticate;

     public RestBasedJenkinsCIConnector(String jenkinsUrl, boolean
authenticate, String userName,
@@ -84,6 +97,20 @@
         this.jenkinsUrl = jenkinsUrl;
     }

+    /**
+     * Creates a project/job role in jenkins server
+     * <p>
+     * <b>NOTE: this method assumes a modified version (by WSO2) of
+     * 'role-strategy' plugin is installed in jenkins server</b>
+     * </p>
+     *
+     * @param roleName
+     *            Name of the role.
+     * @param pattern
+     *            a regular expression to match jobs (e.g. app1.*)
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
     public void createRole(String roleName, String pattern) throws
AppFactoryException {
         String createRoleUrl =

"/descriptorByName/com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy/createProjectRoleSubmit";
 @@ -126,7 +153,24 @@

     }

-    public void assignUsers(String[] userIds, String[] projectRoleNames,
String[] globalRoleNames) throws AppFactoryException{
+    /**
+     * Assigns a set of global and/or project roles(s) to a specified
user(s)
+     * <p>
+     * <b>NOTE: this method assumes a modified version (by WSO2) of
+     * 'role-strategy' plugin is installed in jenkins server</b>
+     * </p>
+     *
+     * @param userIds
+     *            list of user Ids
+     * @param projectRoleNames
+     *            list of project roles
+     * @param globalRoleNames
+     *            list of global roles
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
+    public void assignUsers(String[] userIds, String[] projectRoleNames,
String[] globalRoleNames)
+
                       throws AppFactoryException {

         String assignURL =

"/descriptorByName/com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy/assignRolesSubmit";
 @@ -176,6 +220,13 @@

     }

+    /**
+     * Returns all the jobs defined in jenkins server
+     *
+     * @return list of job names
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
     public List<String> getAllJobs() throws AppFactoryException {

         List<String> jobNames = null;
@@ -218,6 +269,16 @@
         return jobNames;
     }

+    /**
+     * Create a job in Jenkins
+     *
+     * @param jobName
+     *            name of the job
+     * @param jobParams
+     *            Job configuration parameters
+     * @throws AppFactoryException
+     *             if an error occures.
+     */
     public void createJob(String jobName, Map<String, String> jobParams)
throws AppFactoryException {

         OMElement jobConfiguration = new
JobConfigurator(jobParams).configure();
@@ -272,6 +333,15 @@
         }
     }

+    /**
+     * Checks weather a job exists in Jenkins server
+     *
+     * @param jobName
+     *            name of the job.
+     * @return true if job exits, false otherwise.
+     * @throws AppFactoryException
+     *             if an error occurs.
+     */
     public boolean isJobExists(String jobName) throws AppFactoryException {

         final String wrapperTag = "JobNames";
@@ -315,6 +385,15 @@
         return isExists;
     }

+    /**
+     * Deletes a job
+     *
+     * @param jobName
+     *            name of the job
+     * @return true if job exited on Jenkins and successfully deleted.
+     * @throws AppFactoryException
+     *             if an error occures.
+     */
     public boolean deleteJob(String jobName) throws AppFactoryException {
         PostMethod deleteJobMethod =

createPost(String.format("/job/%s/doDelete", jobName), null,
@@ -342,6 +421,14 @@

     }

+    /**
+     * Starts a build job available in Jenkins
+     *
+     * @param jobName
+     *            Name of the job
+     * @throws AppFactoryException
+     *             if an error occurs.
+     */
     public void startBuild(String jobName) throws AppFactoryException {
         PostMethod startBuildMethod =

 createPost(String.format("/job/%s/build", jobName), null,
@@ -385,6 +472,12 @@

     }

+    /**
+     * Logs out of the jenkins server
+     *
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
     public void logout() throws AppFactoryException {
         GetMethod logoutMethod = createGet("/logout", null);
         try {
@@ -400,6 +493,21 @@

     }

+    /**
+     * A convenient methods to pass credentials of a svn repository
(specified
+     * in the job)
+     *
+     * @param jobName
+     *            Name of job
+     * @param userName
+     *            svn username
+     * @param password
+     *            password
+     * @param svnRepo
+     *            repo url
+     * @throws AppFactoryException
+     *             if an error occurs.
+     */
     private void setSvnCredentials(String jobName, String userName, String
password, String svnRepo)

                         throws AppFactoryException {
         final String setCredentialsURL =
@@ -448,6 +556,15 @@
         }
     }

+    /**
+     * Util method to create a http GET method.
+     *
+     * @param urlFragment
+     *            Url fragments
+     * @param queryParameters
+     *            query parameters.
+     * @return a {@link GetMethod}
+     */
     private GetMethod createGet(String urlFragment, NameValuePair[]
queryParameters) {
         GetMethod get = new GetMethod(getJenkinsUrl() + urlFragment);
         if (authenticate) {
@@ -459,6 +576,17 @@
         return get;
     }

+    /**
+     * Util method to create a POST method
+     *
+     * @param urlFragment
+     *            Url fragments.
+     * @param queryParameters
+     *            Query parameters.
+     * @param requestEntity
+     *            A request entity
+     * @return a {@link PostMethod}
+     */
     private PostMethod createPost(String urlFragment, NameValuePair[]
queryParameters,
                                   RequestEntity requestEntity) {
         PostMethod post = new PostMethod(getJenkinsUrl() + urlFragment);

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins \
/build/internal/JenkinsBuildServiceComponent.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java
  Fri Sep 28 05:35:12 2012
@@ -16,13 +16,14 @@

 package org.wso2.carbon.appfactory.jenkins.build.internal;

-import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
 import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;
+import
org.wso2.carbon.appfactory.jenkins.build.JenkinsApplicationEventsListener;
 import org.wso2.carbon.appfactory.jenkins.build.JenkinsCIConstants;
 import org.wso2.carbon.appfactory.jenkins.build.JenkinsCISystemDriver;
 import
org.wso2.carbon.appfactory.jenkins.build.RestBasedJenkinsCIConnector;
@@ -65,7 +66,7 @@
     protected void activate(ComponentContext context) {

         if (log.isDebugEnabled()) {
-            log.info("**************Jenkins build service bundle is
activated*************");
+            log.debug("Jenkins build service bundle is activated");
         }
         try {

@@ -83,18 +84,20 @@
                 String jenkinsUrl =

 ServiceContainer.getAppFactoryConfiguration()

 .getFirstProperty(JenkinsCIConstants.BASE_URL_CONFIG_SELECTOR);
-                String jenkinsDefaultGlobalRoles  =
-
 ServiceContainer.getAppFactoryConfiguration()
-
 .getFirstProperty(JenkinsCIConstants.DEFAULT_GLOBAL_ROLES_CONFIG_SELECTOR);
-
-
+                String jenkinsDefaultGlobalRoles =
+
ServiceContainer.getAppFactoryConfiguration()
+
.getFirstProperty(JenkinsCIConstants.DEFAULT_GLOBAL_ROLES_CONFIG_SELECTOR);
+                String listenerPriority =
+
 ServiceContainer.getAppFactoryConfiguration()
+
 .getFirstProperty(JenkinsCIConstants.LISTENER_PRIORITY_CONFIG_SELECTOR);
+
                 if (log.isDebugEnabled()) {
                     log.debug(String.format("Authenticate : %b",
authenticate));
                     log.debug(String.format("Jenkins user name : %s",
userName));
                     log.debug(String.format("Jenkins api key : %s",
apiKey));
                     log.debug(String.format("Jenkins url : %s",
jenkinsUrl));
                     log.debug(String.format("Default Global Roles : %s",
jenkinsDefaultGlobalRoles));
-
+                    log.debug(String.format("Listener Priority : %s",
listenerPriority));
                 }

                 RestBasedJenkinsCIConnector connector =
@@ -104,11 +107,22 @@

             userName,

             apiKey);
                 String[] globalRoles =
jenkinsDefaultGlobalRoles.split(",");
-                if (globalRoles == null){
-                    globalRoles = new String[]{};
+                if (globalRoles == null) {
+                    globalRoles = new String[] {};
+                }
+
+                int jenkinsListnerPriority = -1;
+                try {
+                    jenkinsListnerPriority =
Integer.parseInt(listenerPriority);
+                } catch (NumberFormatException nef) {
+                    throw new IllegalArgumentException(
+                                                       "Invalid priority
specified for jenkins application event listener. Please provide a number",
+                                                       nef);
                 }
-
-                JenkinsCISystemDriver jenkinsCISystemDriver = new
JenkinsCISystemDriver(connector, globalRoles);
+
+                JenkinsCISystemDriver jenkinsCISystemDriver =
+                                                              new
JenkinsCISystemDriver(connector,
+
             globalRoles);

 ServiceContainer.setJenkinsCISystemDriver(jenkinsCISystemDriver);
                 BundleContext bundleContext = context.getBundleContext();
                 // Note: register the service only if its enabled in the
@@ -116,6 +130,10 @@
                 // configuration file.

 bundleContext.registerService(ContinuousIntegrationSystemDriver.class.getName(),
                                               jenkinsCISystemDriver, null);
+
+                // Registering the Jenkins application event listener.
+
 bundleContext.registerService(ApplicationEventsListener.class.getName(),
+                                              new
JenkinsApplicationEventsListener(jenkinsListnerPriority), null);
             } else {
                 log.info("Jenkins is not enabled");
             }
@@ -144,7 +162,7 @@

     protected void deactivate(ComponentContext ctxt) {
         if (log.isDebugEnabled()) {
-            log.info("************* Jenkins build service bundle is
deactivated*************");
+            log.debug("Jenkins build service bundle is deactivated");
         }
     }
 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins \
/build/service/JenkinsCISystemDriverService.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.build/ \
1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java
  Fri Sep 28 05:35:12 2012
@@ -50,15 +50,4 @@
         return
ServiceContainer.getJenkinsCISystemDriver().getJobName(applicationId,
version,

 revision);
     }
-
-    public void createApplicationAccount(String applicationId, String[]
initialUserIds) throws AppFactoryException {
-
-
 ServiceContainer.getJenkinsCISystemDriver().createApplicationAccount(applicationId,
initialUserIds);
-    }
-
-    public void assignUsersApplication(String applicationId, String[]
userIds)
-
   throws AppFactoryException {
-
 ServiceContainer.getJenkinsCISystemDriver().assignUsersApplication(applicationId,
userIds);
-    }
-
 }

Added:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java \
URL: http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfact \
ory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java?pathrev=144202
 ==============================================================================
--- (empty file)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java  \
Fri Sep 28 05:35:12 2012 @@ -0,0 +1,92 @@
+/*
+ * Copyright 2005-2011 WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wso2.carbon.appfactory.core;
+
+import org.wso2.carbon.appfactory.common.AppFactoryException;
+import org.wso2.carbon.appfactory.core.dto.Application;
+import org.wso2.carbon.appfactory.core.dto.UserInfo;
+import org.wso2.carbon.appfactory.core.dto.Version;
+
+public abstract class ApplicationEventsListener implements
Comparable<ApplicationEventsListener> {
+
+    /**
+     * Invoked after a application is created
+     *
+     * @param application
+     * @throws AppFactoryException
+     */
+    public abstract void onCreation(Application application) throws
AppFactoryException;
+
+    /**
+     * Invoked after adding a user to a application
+     *
+     * @param application
+     * @param user
+     * @throws AppFactoryException
+     */
+    public abstract void onUserAddition(Application application, UserInfo
user) throws AppFactoryException;
+
+    /**
+     * Invoked after removing a user from an application.
+     *
+     * @param application
+     * @param user
+     * @throws AppFactoryException
+     */
+    public abstract void onUserDeletion(Application application, UserInfo
user) throws AppFactoryException;
+
+    /**
+     * Invoked after revoking an application
+     *
+     * @param application
+     * @throws AppFactoryException
+     */
+    public abstract void onRevoke(Application application) throws
AppFactoryException;
+
+    /**
+     * Invoked after creating a new application version using an existing.
+     *
+     * @param application
+     *            The Application.
+     * @param source
+     *            source version.
+     * @param target
+     *            target/new version
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
+    public abstract void onVersionCreation(Application application,
Version source, Version target)
+
                 throws AppFactoryException;
+
+    /**
+     * The priority given to Listener.
+     * <p>
+     * e.g. If listener X has priority 10 and Y has 20. Listner Y will
given
+     * program control before X when application event occurs.
+     *
+     * @return The priority
+     */
+    public abstract int getPriority();
+
+    public int compareTo(ApplicationEventsListener o) {
+
+        return (this.getPriority() < o.getPriority() ? -1
+                                                    : (this.getPriority()
== this.getPriority() ? 0
+
                    : 1));
+    }
+
+}

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java
  Fri Sep 28 05:35:12 2012
@@ -8,19 +8,19 @@
  * Listens to the events of the BuildDriver
  */
 public interface BuildDriverListener {
-
-       /**
-        * Called upon successful build
-        *
-        * @param applicationId
-        * @param version
-        * @param revision
-        * @param file
-        * @throws AppFactoryException
-        */
-    public void onBuildSuccessful(String applicationId, String version,
-            String revision, File file)  throws AppFactoryException;
-
+
+    /**
+     * Called upon successful build
+     *
+     * @param applicationId
+     * @param version
+     * @param revision
+     * @param file
+     * @throws AppFactoryException
+     */
+    public void onBuildSuccessful(String applicationId, String version,
String revision, File file)
+
                        throws AppFactoryException;
+
     /**
      * Called upon build failure
      *
@@ -30,7 +30,7 @@
      * @param file
      * @throws AppFactoryException
      */
-    public void onBuildFailure(String applicationId, String version,
-                                  String revision, String errorMessage)
 throws AppFactoryException;
+    public void onBuildFailure(String applicationId, String version,
String revision,
+                               String errorMessage) throws
AppFactoryException;

 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java
  Fri Sep 28 05:35:12 2012
@@ -5,27 +5,81 @@
 import org.wso2.carbon.appfactory.common.AppFactoryException;

 /**
- * Continuous build system driver
+ * Defines the contact what needs to be implemented by any CI Driver (i.e.
+ * Jenkins, Bambo)
+ *
  *
  */
 public interface ContinuousIntegrationSystemDriver {

+    /**
+     * Setup CI job for given application and versions
+     *
+     * @param applicationId
+     *            Id of the application
+     * @param version
+     *            version id
+     * @param revision
+     *            revision (This parameters is deprecated and need to be
removed
+     *            in future)
+     * @throws AppFactoryException
+     *             if a error occurs
+     */
     public void createJob(String applicationId, String version, String
revision)

     throws AppFactoryException;

+    /**
+     * Removes a specified job from CI System.
+     *
+     * @param jobName
+     *            Name of the job
+     * @throws AppFactoryException
+     *             If a error occurs
+     */
     public void deleteJob(String jobName) throws AppFactoryException;

+    /**
+     * Returns jobs available in CI System.
+     *
+     * @return A {@link List} of job names
+     * @throws AppFactoryException
+     *             If an error occurs
+     */
     public List<String> getAllJobNames() throws AppFactoryException;

+    /**
+     * Starts building the specified CI job.
+     *
+     * @param jobName
+     *            Name of the CI Job
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
     public void startBuild(String jobName) throws AppFactoryException;

+    /**
+     * Checks weather a specified job is available on CI system.
+     *
+     * @param jobName
+     *            Name of the job
+     * @return true if job is available, false otherwise
+     * @throws AppFactoryException
+     *             if error occurs
+     */
     public boolean isJobExists(String jobName) throws AppFactoryException;
-
-    public String getJobName(String applicationId, String version, String
revision);
-
-    public void createApplicationAccount(String applicationId, String[]
initialUserIds) throws AppFactoryException;
-
-    public void assignUsersApplication(String applicationId, String[]
userIds)
-                                                               throws
AppFactoryException;

+    /**
+     * Constructs a job name based on supplied parameter. Rational of this
+     * method is to enable CI driver to have control over the job naming
scheme.
+     *
+     * @param applicationId
+     *            application Id
+     * @param version
+     *            version Id
+     * @param revision
+     *            revision id - this parameter is deprecated and will be
removed
+     *            in future
+     * @return name of the job
+     */
+    public String getJobName(String applicationId, String version, String
revision);
 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java
 (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java
 Fri Sep 28 05:35:12 2012
@@ -30,6 +30,9 @@
     public void createArtifact(String applicationId, String version,
String revision)

          throws AppFactoryException {
         if (ServiceHolder.getContinuousIntegrationSystemDriver() != null) {
+            // Since the CI system is enabled appfactory will give the
preference to it. Appfactory will start
+            // the job if it exists. Once the build is completed
'appfactory-post-build-notifier-plugin' will upload the
+            // artifact onto artifact storage.
             String jobName =

ServiceHolder.getContinuousIntegrationSystemDriver()
                                           .getJobName(applicationId,
version, revision);
@@ -37,6 +40,7 @@

 ServiceHolder.getContinuousIntegrationSystemDriver().startBuild(jobName);
             }
         } else {
+            // Default builder will build the Application locally.
             DefaultRevisionControlDriverListener listener =
                                                             new
DefaultRevisionControlDriverListener();
             RevisionControlDriver revisionControlDriver =
ServiceHolder.getRevisionControlDriver();

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/bui \
ld/DefaultRevisionControlDriverListener.java?rev=144202&r1=144201&r2=144202&view=diff \
                ==============================================================================
                
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java
  Fri Sep 28 05:35:12 2012
@@ -7,10 +7,11 @@

 public class DefaultRevisionControlDriverListener implements
RevisionControlDriverListener {

-       public void onGetSourceCompleted(String applicationId, String
version, String revision)  throws AppFactoryException{
-               BuildDriver buildDriver = ServiceHolder.getBuildDriver();
-               DefaultBuildDriverListener listener = new
DefaultBuildDriverListener();
-               buildDriver.buildArtifact(applicationId, version, revision,
listener);
-       }
+    public void onGetSourceCompleted(String applicationId, String version,
String revision)
+
                throws AppFactoryException {
+        BuildDriver buildDriver = ServiceHolder.getBuildDriver();
+        DefaultBuildDriverListener listener = new
DefaultBuildDriverListener();
+        buildDriver.buildArtifact(applicationId, version, revision,
listener);
+    }

 }

Added:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java?pathrev=144202
 ==============================================================================
--- (empty file)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java
  Fri Sep 28 05:35:12 2012
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2005-2011 WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wso2.carbon.appfactory.core.dto;
+
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
+
+/**
+ * Holds information about an Application. Refer {@link
ApplicationEventsListener} for usage.
+ */
+public class Application {
+
+    /**
+     * Name of the application
+     */
+    private String name;
+
+    /**
+     * Description of the application
+     */
+    private String description;
+
+    /**
+     * The application Id
+     */
+    private String id;
+
+    private Version[] versions;
+
+    /**
+     * Type of the application (e.g. car, war)
+     */
+    private String type;
+
+    public Application() {
+
+    }
+
+    public Application(String id, String name, String type, String
description) {
+        this.name = name;
+        this.description = description;
+        this.id = id;
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+}

Added:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java?pathrev=144202
 ==============================================================================
--- (empty file)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java
  Fri Sep 28 05:35:12 2012
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2005-2011 WSO2, Inc. (http://wso2.com)
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+package org.wso2.carbon.appfactory.core.dto;
+
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
+
+/**
+ * Holds information about a user. Refer {@link ApplicationEventsListener}
for usage.
+ */
+public class UserInfo {
+    /**
+     * User id of the User
+     */
+    private String userName;
+
+
+    public UserInfo(){
+
+    }
+
+    public UserInfo(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((userName == null) ? 0 :
userName.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        UserInfo other = (UserInfo) obj;
+        if (userName == null) {
+            if (other.userName != null)
+                return false;
+        } else if (!userName.equals(other.userName))
+            return false;
+        return true;
+    }
+
+
+}

Added:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java?pathrev=144202
 ==============================================================================
--- (empty file)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java
  Fri Sep 28 05:35:12 2012
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2005-2011 WSO2, Inc. (http://wso2.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wso2.carbon.appfactory.core.dto;
+
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;
+
+/**
+ * Holds information about a version. Refer {@link
ApplicationEventsListener} for usage.
+ */
+public class Version {
+    private String id;
+
+    public Version() {
+    }
+
+    public Version(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setVersion(String version) {
+        this.id = version;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((id == null) ? 0 : id.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Version other = (Version) obj;
+        if (id == null) {
+            if (other.id != null)
+                return false;
+        } else if (!id.equals(other.id))
+            return false;
+        return true;
+    }
+
+}

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.jenkin \
s.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.jenkins.build/1.0.2/src/main/java/org/wso2/carbon/appfactory \
/jenkins/build/JenkinsCISystemDriver.java?rev=144202&r1=144201&r2=144202&view=diff \
                ==============================================================================
                
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.jenkin \
s.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.jenkin \
s.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java
  Fri Sep 28 05:35:12 2012
@@ -88,7 +88,7 @@

         // TODO : Hard coded application extension here. in future this
could be either 'car'or 'war'
         // and will be selected by user
-
+
         this.connector.createJob(getJobName(applicationId, version,
revision), parameters);

     }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml
  Fri Sep 28 05:35:12 2012
@@ -70,7 +70,7 @@
             <groupId>org.apache.ws.commons.axiom.wso2</groupId>
             <artifactId>axiom</artifactId>
             <version>1.2.11.wso2v2</version>
-                       <scope>provided</scope>
+           <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>commons-httpclient.wso2</groupId>
@@ -102,6 +102,11 @@
             <artifactId>maven-invoker</artifactId>
             <version>2.0.11.wso2v1</version>
         </dependency>
+        <dependency>
+            <groupId>org.wso2.carbon</groupId>
+            <artifactId>org.wso2.carbon.appfactory.utilities</artifactId>
+            <version>1.0.2</version>
+        </dependency>
     </dependencies>
     <repositories>
         <repository>

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/a \
ppfactory/repository/mgt/client/SCMClient.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java
  Fri Sep 28 05:35:12 2012
@@ -17,6 +17,9 @@

 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
@@ -35,12 +38,16 @@
 import
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.embed.Embedder;
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryMgtException;
+import
org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor;
 import org.wso2.carbon.utils.CarbonUtils;
 import  org.apache.commons.io.FileUtils;

 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;

 /**
  * Repository client that wrapping maven SCM plugin
@@ -146,6 +153,8 @@
         try {
             CheckOutScmResult checkOutScmResult =
scmManager.checkOut(repository,
                                       new ScmFileSet(checkOutDirectory),
new ScmRevision(revision));
+            AppVersionStrategyExecutor exec =
org.wso2.carbon.appfactory.repository.mgt.util.Util.getVersionStrategyExecutor();
+            exec.doVersion(version, checkOutDirectory);
             if (checkOutScmResult.getProviderMessage() == null) {
                 result = scmManager.branch(repository, new
ScmFileSet(checkOutDirectory), version);

@@ -160,8 +169,6 @@
         return processResult(result,checkOutDirectory);
     }

-
-
     public boolean tag(String baseURL, String version, String revision)
             throws RepositoryMgtException {
         TagScmResult result = null;

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/a \
ppfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java
  Fri Sep 28 05:35:12 2012
@@ -28,21 +28,27 @@
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryProvider;
 import
org.wso2.carbon.appfactory.repository.mgt.service.RepositoryAuthenticationService;
 import org.wso2.carbon.appfactory.repository.mgt.util.Util;
+import
org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor;
 import org.wso2.carbon.user.core.service.RealmService;

 import java.lang.reflect.Constructor;

 /**
- * @scr.component name="org.wso2.carbon.appfactory.repository.mgt"
immediate="true"
+ * @scr.component name="org.wso2.carbon.appfactory.repository.mgt"
+ *                immediate="true"
  * @scr.reference name="appfactory.configuration" interface=
- * "org.wso2.carbon.appfactory.common.AppFactoryConfiguration"
- * cardinality="1..1" policy="dynamic"
- * bind="setAppFactoryConfiguration"
- * unbind="unsetAppFactoryConfiguration"
+ *
 "org.wso2.carbon.appfactory.common.AppFactoryConfiguration"
+ *                cardinality="1..1" policy="dynamic"
+ *                bind="setAppFactoryConfiguration"
+ *                unbind="unsetAppFactoryConfiguration"
  * @scr.reference name="user.realmservice.default"
- * interface="org.wso2.carbon.user.core.service.RealmService"
- * cardinality="1..1" policy="dynamic" bind="setRealmService"
- * unbind="unsetRealmService"
+ *
 interface="org.wso2.carbon.user.core.service.RealmService"
+ *                cardinality="1..1" policy="dynamic"
bind="setRealmService"
+ *                unbind="unsetRealmService"
+ * @scr.reference name="appversion.executor"
+ *
 interface="org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor"
+ *                cardinality="1..1" policy="dynamic"
bind="setAppVersionStrategyExecutor"
+ *                unbind="unsetAppVersionStrategyExecutor"
  */
 public class RepositoryMgtServiceComponent {
     Log log = LogFactory.getLog(RepositoryMgtServiceComponent.class);
@@ -65,6 +71,14 @@
         Util.setRealmService(null);
     }

+    protected void
setAppVersionStrategyExecutor(AppVersionStrategyExecutor versionExecutor) {
+        Util.setVersionStrategyExecutor(versionExecutor);
+    }
+
+    protected void
unsetAppVersionStrategyExecutor(AppVersionStrategyExecutor versionExecutor)
{
+        Util.setVersionStrategyExecutor(null);
+    }
+
     protected void activate(ComponentContext context) {

          if (log.isDebugEnabled()) {

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java
 (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.reposi \
tory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java
 Fri Sep 28 05:35:12 2012
@@ -17,8 +17,8 @@
 package org.wso2.carbon.appfactory.repository.mgt.util;

 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;
-import org.wso2.carbon.appfactory.core.RevisionControlDriver;
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryProvider;
+import
org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor;
 import org.wso2.carbon.user.core.service.RealmService;

 import java.util.HashMap;
@@ -31,6 +31,7 @@
 public class Util {
     private static AppFactoryConfiguration  configuration=null;
     private  static RealmService realmService;
+    private static AppVersionStrategyExecutor versionStrategyExecutor;
     private static Map<String,RepositoryProvider>
repositoryProviderMap=new HashMap<String, RepositoryProvider>();;

     public static AppFactoryConfiguration getConfiguration() {
@@ -55,4 +56,15 @@
     public static void setRepositoryProvider(String
type,RepositoryProvider provider) {
         Util.repositoryProviderMap.put(type,provider);
     }
+
+       public static AppVersionStrategyExecutor
getVersionStrategyExecutor() {
+               return versionStrategyExecutor;
+       }
+
+       public static void setVersionStrategyExecutor(
+                       AppVersionStrategyExecutor versionStrategyExecutor)
{
+               Util.versionStrategyExecutor = versionStrategyExecutor;
+       }
+
+
 }

Modified:
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.utilit \
ies/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java
 URL:
http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/components/appfactory/o \
rg.wso2.carbon.appfactory.utilities/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java?rev=144202&r1=144201&r2=144202&view=diff
 ==============================================================================
---
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.utilit \
ies/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java
  (original)
+++
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.utilit \
ies/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java
  Fri Sep 28 05:35:12 2012
@@ -13,14 +13,19 @@
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;
 import org.wso2.carbon.appfactory.common.AppFactoryConstants;
 import org.wso2.carbon.appfactory.common.AppFactoryException;
+import org.wso2.carbon.appfactory.core.dto.Application;
+import org.wso2.carbon.appfactory.core.dto.Version;
 import
org.wso2.carbon.appfactory.utilities.internal.ServiceReferenceHolder;
+import org.wso2.carbon.governance.api.exception.GovernanceException;
 import org.wso2.carbon.governance.api.generic.GenericArtifactManager;
 import
org.wso2.carbon.governance.api.generic.dataobjects.GenericArtifactImpl;
 import org.wso2.carbon.governance.api.util.GovernanceUtils;
+import org.wso2.carbon.registry.core.Collection;
 import org.wso2.carbon.registry.core.Resource;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 import org.wso2.carbon.registry.core.service.RegistryService;
 import org.wso2.carbon.registry.core.session.UserRegistry;
+import org.wso2.carbon.registry.core.utils.RegistryUtils;

 import java.io.File;
 import java.util.ArrayList;
@@ -143,22 +148,180 @@
         return optsBuilder.toString();*/
     }

-    public static String getApplicationType(String applicationId) throws
AppFactoryException{
+    /**
+     * Returns the type of the application given the application Id
+     *
+     * @param applicationId
+     *            Id of the application
+     * @return the type
+     * @throws AppFactoryException
+     *             if an error occurs.
+     */
+    public static String getApplicationType(String applicationId) throws
AppFactoryException {
+
+        GenericArtifactImpl artifact =
getApplicationArtifact(applicationId);
+
+        if (artifact == null) {
+            String errorMsg =
+                              String.format("Unable to find applcation
information for id : %s",
+                                            applicationId);
+            log.error(errorMsg);
+            throw new AppFactoryException(errorMsg);
+
+        }
+
+        try {
+            return artifact.getAttribute("application_type");
+        } catch (RegistryException e) {
+            String errorMsg =
+                              String.format("Unable to find the
application type for applicaiton id: %s",
+                                            applicationId);
+            log.error(errorMsg, e);
+            throw new AppFactoryException(errorMsg, e);
+        }
+    }
+
+    /**
+     * Provides information about an application.
+     *
+     * @param applicationId
+     *            id of the application
+     * @return {@link Application}
+     * @throws AppFactoryException
+     *             if an error occurs
+     */
+    public static Application getApplicationInfo(String applicationId)
throws AppFactoryException {
+
+        GenericArtifactImpl artifact =
getApplicationArtifact(applicationId);
+
+        if (artifact == null) {
+            String errorMsg =
+                              String.format("Unable to find applcation
information for id : %s",
+                                            applicationId);
+            log.error(errorMsg);
+            throw new AppFactoryException(errorMsg);
+
+        }
+        Application appInfo = null;
+
+        try {
+            appInfo =
+                      new
Application(artifact.getAttribute("application_key"),
+
 artifact.getAttribute("application_name"),
+
 artifact.getAttribute("application_type"),
+
 artifact.getAttribute("application_description"));
+        } catch (GovernanceException e) {
+            String errorMsg =
+                              String.format("Unable to extract information
for application id : %s",
+                                            applicationId);
+            log.error(errorMsg);
+            throw new AppFactoryException(errorMsg);
+        }
+
+        return appInfo;
+    }
+
+    /**
+     * Returns all available versions of a application
+     *
+     * @param applicationId
+     *            Id of the application
+     * @return an Array of {@link Version}
+     * @throws AppFactoryException
+     *             if an error occurres
+     */
+    public static Version[] getVersions(String applicationId) throws
AppFactoryException {
+        List<Version> versions = new ArrayList<Version>();
         try {
-            RegistryService registryService =
ServiceReferenceHolder.getInstance().getRegistryService();
+            RegistryService registryService =
+
 ServiceReferenceHolder.getInstance()
+
 .getRegistryService();
             UserRegistry userRegistry =
registryService.getGovernanceSystemRegistry();
-            Resource resource =
userRegistry.get(AppFactoryConstants.REGISTRY_APPLICATION_PATH +
-                                                 File.separator +
applicationId + File.separator + "appinfo");
+            // child nodes of this will contains folders for all life
cycles (
+            // e.g. QA, Dev, Prod)
+            Resource application =
+
userRegistry.get(AppFactoryConstants.REGISTRY_APPLICATION_PATH +
+                                                    File.separator +
applicationId);
+
+            if (application != null && application instanceof Collection) {
+
+                // Contains paths to life cycles (.e.g .../<appid>/dev,
+                // .../<appid>/qa , .../<appid>/prod )
+                String[] definedLifeCyclePaths = ((Collection)
application).getChildren();
+
+                for (String lcPath : definedLifeCyclePaths) {
+
+                    Resource versionsInLCResource =
userRegistry.get(lcPath);
+                    if (versionsInLCResource != null &&
versionsInLCResource instanceof Collection) {
+
+                        // contains paths to a versions (e.g.
+                        // .../<appid>/<lifecycle>/trunk,
+                        // .../<appid>/<lifecycle>/1.0.1 )
+                        String[] versionPaths = ((Collection)
versionsInLCResource).getChildren();
+
+                        for (String versionPath : versionPaths) {
+                            // extract the name of the resource ( which
will be
+                            // the version id)
+                            String versionId =
RegistryUtils.getResourceName(versionPath);
+                            Version version = new Version(versionId);
+                            versions.add(version);
+                        }
+                    }
+
+                }
+
+            }
+
+        } catch (RegistryException e) {
+            String errorMsg =
+                              String.format("Unable to load the
application information for applicaiton id: %s",
+                                            applicationId);
+            log.error(errorMsg, e);
+            throw new AppFactoryException(errorMsg, e);
+        }
+
+        return versions.toArray(new Version[versions.size()]);
+    }
+
+    /**
+     * A Util method to load an Application artifact from the registry.
+     *
+     * @param applicationId
+     *            the application Id
+     * @return a {@link GenericArtifactImpl} representing the application
or
+     *         null if application (by the id is not in registry)
+     * @throws AppFactoryException
+     *             if an error occurs.
+     */
+    private static GenericArtifactImpl getApplicationArtifact(String
applicationId)
+
        throws AppFactoryException {
+        GenericArtifactImpl artifact = null;
+        try {
+
+            RegistryService registryService =
+
 ServiceReferenceHolder.getInstance()
+
 .getRegistryService();
+            UserRegistry userRegistry =
registryService.getGovernanceSystemRegistry();
+            Resource resource =
+
 userRegistry.get(AppFactoryConstants.REGISTRY_APPLICATION_PATH +
+                                                 File.separator +
applicationId + File.separator +
+                                                 "appinfo");
             GovernanceUtils.loadGovernanceArtifacts(userRegistry);
-            GenericArtifactManager artifactManager = new
GenericArtifactManager(userRegistry, "application");
-            //GenericArtifact artifact =
artifactManager.getGenericArtifact(resource.getUUID());
-            GenericArtifactImpl artifact = (GenericArtifactImpl)
artifactManager.getGenericArtifact(resource.getUUID());
-            return artifact.getAttribute("application_type");
+            GenericArtifactManager artifactManager =
+                                                     new
GenericArtifactManager(userRegistry,
+
     "application");
+            // GenericArtifact artifact =
+            // artifactManager.getGenericArtifact(resource.getUUID());
+            artifact = (GenericArtifactImpl)
artifactManager.getGenericArtifact(resource.getUUID());
+
         } catch (RegistryException e) {
             String errorMsg =
-                    String.format("Unable to find the application type for
applicaiton id: %s", applicationId);
+                              String.format("Unable to load the
application information for applicaiton id: %s",
+                                            applicationId);
             log.error(errorMsg, e);
             throw new AppFactoryException(errorMsg, e);
         }
+
+        return artifact;
     }
 }
_______________________________________________
Commits mailing list
Commits@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/commits



-- 

Thanks & regards,
Nirmal

Software Engineer- Platform Technologies Team, WSO2 Inc.
Mobile: +94715779733
Blog: http://nirmalfdo.blogspot.com/


[Attachment #5 (text/html)]

Hi,<br><br>Your commits to \
&quot;carbon/platform/branches/4.0.0/components/appfactory/<span \
class="il">org</span>.wso2.carbon.appfactory.repository.mgt.service/1.0.1&quot; \
breaking the build. I guess you wanted to commit to 1.0.2. <br>

<br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b \
class="gmail_sendername"></b> <span dir="ltr">&lt;<a \
href="mailto:ramith@wso2.com">ramith@wso2.com</a>&gt;</span><br>Date: Fri, Sep 28, \
2012 at 3:05 PM<br>

Subject: [Commits] [Carbon-platform] svn commit r144202 - in \
carbon/platform/branches/4.0.0/components/appfactory: \
org.wso2.carbon.appfactory.application.mgt/1.0.2 \
org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal \
org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service \
org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util \
org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build \
org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal \
org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service \
org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core \
org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build \
org.wso2.carbon.appfactory.cor<br>

To: <a href="mailto:commits@wso2.org">commits@wso2.org</a><br><br><br>Author: \
                ramith<br>
Date: Fri Sep 28 05:35:12 2012<br>
New Revision: 144202<br>
URL: <a href="http://wso2.org/svn/browse/wso2?view=rev&amp;revision=144202" \
target="_blank">http://wso2.org/svn/browse/wso2?view=rev&amp;revision=144202</a><br> \
<br> Log:<br>
Adding changes in AF svn branch to 4.0.2<br>
<br>
Added:<br>
   carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bui \
ld/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java<br>
 Modified:<br>
   carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.appl \
ication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.appl \
ication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.appl \
ication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.buil \
d/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.buil \
d/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.buil \
d/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.buil \
d/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.buil \
d/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java<br>  \
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core \
/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java<br>  \
carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1 \
.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.jenk \
ins.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repo \
sitory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repo \
sitory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repo \
sitory.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java<br>
  carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.util \
ities/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java<br>
 <br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/pom.xml \
Fri Sep 28 05:35:12 2012<br> @@ -60,6 +60,11 @@<br>
             &lt;version&gt;${project.version}&lt;/version&gt;<br>
         &lt;/dependency&gt;<br>
         &lt;dependency&gt;<br>
+            &lt;groupId&gt;org.wso2.carbon&lt;/groupId&gt;<br>
+            &lt;artifactId&gt;org.wso2.carbon.appfactory.utilities&lt;/artifactId&gt;<br>
 +            &lt;version&gt;${project.version}&lt;/version&gt;<br>
+        &lt;/dependency&gt;<br>
+        &lt;dependency&gt;<br>
             &lt;groupId&gt;commons-logging&lt;/groupId&gt;<br>
             &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;<br>
             &lt;version&gt;1.1.1&lt;/version&gt;<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java<br>



URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/c \
arbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2 \
/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ap \
plication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java \
(original)<br>


+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ap \
plication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/internal/ApplicationManagementServiceComponent.java \
Fri Sep 28 05:35:12 2012<br>


@@ -23,6 +23,7 @@<br>
 import org.wso2.carbon.appfactory.application.mgt.service.ApplicationManagementService;<br>
  import org.wso2.carbon.appfactory.application.mgt.util.Util;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
 import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;<br>
 import org.wso2.carbon.registry.core.service.RegistryService;<br>
 import org.wso2.carbon.user.core.service.RealmService;<br>
@@ -54,6 +55,12 @@<br>
  *               cardinality=&quot;0..1&quot; policy=&quot;dynamic&quot;<br>
  *               bind=&quot;setContinuousIntegrationSystemDriver&quot;<br>
  *               unbind=&quot;unsetContinuousIntegrationSystemDriver&quot;<br>
+ *<br>
+ @scr.reference name=&quot;appfactory.application.events.listener&quot;<br>
+ *               interface=&quot;org.wso2.carbon.appfactory.core.ApplicationEventsListener&quot;<br>
 + *               cardinality=&quot;0..n&quot; policy=&quot;dynamic&quot;<br>
+ *               bind=&quot;setApplicationEventsListener&quot;<br>
+ *               unbind=&quot;unsetApplicationEventsListener&quot;<br>
  */<br>
 public class ApplicationManagementServiceComponent {<br>
     private static Log log = \
LogFactory.getLog(ApplicationManagementServiceComponent.class);<br> @@ -119,4 +126,12 \
@@<br>  public static void \
unsetContinuousIntegrationSystemDriver(ContinuousIntegrationSystemDriver \
continuousIntegrationSystemDriver) {<br>  \
Util.setContinuousIntegrationSystemDriver(null);<br>  }<br>
+<br>
+    public static void setApplicationEventsListener(ApplicationEventsListener \
applicationEventsListener) {<br> +        \
Util.addApplicationEventsListener(applicationEventsListener);<br> +    }<br>
+<br>
+    public static void unsetApplicationEventsListener(ApplicationEventsListener \
applicationEventsListener) {<br> +        \
Util.removeApplicationEventsListener(applicationEventsListener);<br> +    }<br>
 }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/c \
arbon/appfactory/application/mgt/service/ApplicationManagementService.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2 \
/carbon/appfactory/application/mgt/service/ApplicationManagementService.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ap \
plication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java \
(original)<br>


+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ap \
plication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/service/ApplicationManagementService.java \
Fri Sep 28 05:35:12 2012<br>


@@ -1,27 +1,35 @@<br>
 /*<br>
  * Copyright 2005-2011 WSO2, Inc. (<a href="http://wso2.com" \
                target="_blank">http://wso2.com</a>)<br>
- *<br>
- *    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
- *    you may not use this file except in compliance with the License.<br>
- *    You may obtain a copy of the License at<br>
- *<br>
- *    <a href="http://www.apache.org/licenses/LICENSE-2.0" \
                target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br>
- *<br>
- *    Unless required by applicable law or agreed to in writing, software<br>
- *    distributed under the License is distributed on an &quot;AS IS&quot; \
                BASIS,<br>
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
- *    See the License for the specific language governing permissions and<br>
- *    limitations under the License.<br>
+ *<br>
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at<br>
+ *<br>
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0" \
target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br> + *<br>
+ * Unless required by applicable law or agreed to in writing, software<br>
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+ * See the License for the specific language governing permissions and<br>
+ * limitations under the License.<br>
  */<br>
<br>
 package org.wso2.carbon.appfactory.application.mgt.service;<br>
<br>
+import java.util.ArrayList;<br>
+import java.util.Iterator;<br>
+import java.util.List;<br>
<br>
 import org.apache.commons.logging.Log;<br>
 import org.apache.commons.logging.LogFactory;<br>
 import org.wso2.carbon.CarbonConstants;<br>
 import org.wso2.carbon.appfactory.application.mgt.util.Util;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryException;<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
+import org.wso2.carbon.appfactory.core.dto.Application;<br>
+import org.wso2.carbon.appfactory.core.dto.UserInfo;<br>
+import org.wso2.carbon.appfactory.core.dto.Version;<br>
+import org.wso2.carbon.appfactory.utilities.project.ProjectUtils;<br>
 import org.wso2.carbon.base.MultitenantConstants;<br>
 import org.wso2.carbon.core.AbstractAdmin;<br>
 import org.wso2.carbon.user.api.Tenant;<br>
@@ -29,10 +37,6 @@<br>
 import org.wso2.carbon.user.api.UserRealm;<br>
 import org.wso2.carbon.user.api.UserStoreException;<br>
<br>
-import java.util.ArrayList;<br>
-import java.util.List;<br>
-<br>
-<br>
 public class ApplicationManagementService extends AbstractAdmin {<br>
     private static Log log = \
LogFactory.getLog(ApplicationManagementService.class);<br> <br>
@@ -40,54 +44,54 @@<br>
     public static String FIRST_NAME_CLAIM_URI = &quot;<a \
href="http://wso2.org/claims/givenname" \
                target="_blank">http://wso2.org/claims/givenname</a>&quot;;<br>
     public static String LAST_NAME_CLAIM_URI = &quot;<a \
href="http://wso2.org/claims/lastname" \
target="_blank">http://wso2.org/claims/lastname</a>&quot;;<br> <br>
-<br>
-    public String createApplication(ApplicationInfoBean application) {<br>
-        return application.getApplicationKey();<br>
-    }<br>
-<br>
-<br>
     public boolean addUserToApplication(String applicationId, String userName, \
                String[] roles)<br>
-            throws ApplicationManagementException {<br>
+                                                                                     \
                throws ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         try {<br>
-            UserRealm realm = \
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
 +            UserRealm realm =<br>
+                              Util.getRealmService()<br>
+                                  \
                .getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
             String[] newRolesForUser = removeRolesUserAlreadyIn(userName, roles, \
                realm);<br>
             realm.getUserStoreManager().updateRoleListOfUser(userName, null, \
                newRolesForUser);<br>
-<br>
+<br>
+<br>
         } catch (UserStoreException e) {<br>
             String msg = &quot;Error while adding user &quot; + userName + &quot; to \
application &quot; + applicationId;<br>  log.error(msg, e);<br>
             throw new ApplicationManagementException(msg, e);<br>
         }<br>
<br>
-        try {<br>
-            if ( log.isDebugEnabled()){<br>
-                log.debug(&quot;Creating a continuous integration job for \
application id: &quot; + applicationId + &quot;using trunk&quot;);<br> +        // \
Notify the event listener about the user addition<br> +        \
Iterator&lt;ApplicationEventsListener&gt; appEventListeners =<br> +                   \
Util.getApplicationEventsListeners()<br> +                                            \
.iterator();<br> +        try {<br>
+            Application app = ProjectUtils.getApplicationInfo(applicationId);<br>
+            UserInfo user = new UserInfo(userName);<br>
+            while (appEventListeners.hasNext()) {<br>
+                ApplicationEventsListener listener = appEventListeners.next();<br>
+                listener.onUserAddition(app, user);<br>
             }<br>
<br>
-            if ( Util.getContinuousIntegrationSystemDriver() != null){<br>
-                Util.getContinuousIntegrationSystemDriver().createApplicationAccount(applicationId, \
                new String[]{userName});<br>
-                Util.getContinuousIntegrationSystemDriver().createJob(applicationId, \
                &quot;trunk&quot;, null);<br>
-            }<br>
-<br>
-        } catch (AppFactoryException ex) {<br>
-             String msg = &quot;Error occured while creating a job in continuous \
                integration system&quot;;<br>
-             log.error(msg, ex);<br>
-             throw new ApplicationManagementException(msg,ex);<br>
+        } catch (Exception ex) {<br>
+            String errorMsg = &quot;Unable to publish user addition event due to \
&quot; + ex.getMessage();<br> +            log.error(errorMsg, ex);<br>
+            throw new ApplicationManagementException(errorMsg, ex);<br>
         }<br>
-<br>
+<br>
         return true;<br>
     }<br>
<br>
-    //If user is going to be added to a role that he is already having, remove that \
role from &#39;newRoles&#39;<br> +    // If user is going to be added to a role that \
he is already having, remove<br> +    // that role from &#39;newRoles&#39;<br>
     private String[] removeRolesUserAlreadyIn(String userName, String[] newRoles, \
                UserRealm realm)<br>
-            throws UserStoreException {<br>
+                                                                                     \
throws UserStoreException {<br> <br>
         ArrayList&lt;String&gt; newRolesArray = new ArrayList&lt;String&gt;();<br>
-        for(String newRole : newRoles) {<br>
+        for (String newRole : newRoles) {<br>
             newRolesArray.add(newRole);<br>
         }<br>
-        for(String role : realm.getUserStoreManager().getRoleListOfUser(userName)) \
{<br> +        for (String role : \
realm.getUserStoreManager().getRoleListOfUser(userName)) {<br>  if \
(newRolesArray.contains(role)) {<br>  newRolesArray.remove(role);<br>
             }<br>
@@ -95,35 +99,47 @@<br>
         return newRolesArray.toArray(new String[newRolesArray.size()]);<br>
     }<br>
<br>
-    public boolean updateRolesOfUserForApplication (String applicationId, String \
                userName, String[] rolesToDelete, String[] newRoles)<br>
-            throws ApplicationManagementException {<br>
+    public boolean updateRolesOfUserForApplication(String applicationId, String \
userName,<br> +                                                   String[] \
rolesToDelete, String[] newRoles)<br> +                                               \
                throws ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         try {<br>
-            UserRealm realm = \
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
 +            UserRealm realm =<br>
+                              Util.getRealmService()<br>
+                                  \
                .getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
             realm.getUserStoreManager().updateRoleListOfUser(userName, \
rolesToDelete, newRoles);<br>  return true;<br>
         } catch (UserStoreException e) {<br>
-            String msg = &quot;Error while updating roles for user: &quot; + \
userName + &quot; of application &quot; + applicationId;<br> +            String msg \
=<br> +                         &quot;Error while updating roles for user: &quot; + \
userName + &quot; of application &quot; +<br> +                                 \
applicationId;<br>  log.error(msg, e);<br>
             throw new ApplicationManagementException(msg, e);<br>
-        }<br>
-   }<br>
+        }<br>
+    }<br>
<br>
-    public String[] getUsersOfApplication(String applicationId ) throws \
ApplicationManagementException {<br> +    public String[] \
getUsersOfApplication(String applicationId)<br> +                                     \
                throws ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         ArrayList&lt;String&gt; userList = new ArrayList&lt;String&gt;();<br>
         try {<br>
-            UserRealm realm = \
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
 +            UserRealm realm =<br>
+                              Util.getRealmService()<br>
+                                  \
                .getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
             String[] roles = realm.getUserStoreManager().getRoleNames();<br>
             if (roles.length &gt; 0) {<br>
                 for (String roleName : roles) {<br>
-                    if \
(!Util.getRealmService().getBootstrapRealmConfiguration().getEveryOneRoleName().equals(roleName)) \
                {<br>
-                        String[] usersOfRole = \
realm.getUserStoreManager().getUserListOfRole(roleName);<br> +                    if \
(!Util.getRealmService().getBootstrapRealmConfiguration()<br> +                       \
.getEveryOneRoleName().equals(roleName)) {<br> +                        String[] \
usersOfRole =<br> +                                               \
realm.getUserStoreManager()<br> +                                                    \
                .getUserListOfRole(roleName);<br>
                         if (usersOfRole != null &amp;&amp; usersOfRole.length &gt; \
0) {<br>  for (String userName : usersOfRole) {<br>
                                 if (!userList.contains(userName) &amp;&amp;<br>
-                                    \
!Util.getRealmService().getBootstrapRealmConfiguration().getAdminUserName().equals(userName)<br>
                
-                                    &amp;&amp; \
!CarbonConstants.REGISTRY_ANONNYMOUS_USERNAME.equals(userName)) {<br> +               \
!Util.getRealmService().getBootstrapRealmConfiguration()<br> +                        \
.getAdminUserName().equals(userName) &amp;&amp;<br> +                                 \
!CarbonConstants.REGISTRY_ANONNYMOUS_USERNAME.equals(userName)) {<br>  \
userList.add(userName);<br>  }<br>
                             }<br>
@@ -141,35 +157,78 @@<br>
     }<br>
<br>
     public boolean removeUserFromApplication(String applicationId, String \
                userName)<br>
-            throws ApplicationManagementException {<br>
+                                                                                   \
                throws ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         try {<br>
-            UserRealm realm = \
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>
 +            UserRealm realm =<br>
+                              Util.getRealmService()<br>
+                                  \
.getTenantUserRealm(tenantManager.getTenantId(applicationId));<br>  \
                realm.getUserStoreManager().deleteUser(userName);<br>
-            return true;<br>
+<br>
         } catch (UserStoreException e) {<br>
-            String msg = &quot;Error while removing user &quot; + userName + &quot; \
from application &quot; + applicationId;<br> +            String msg =<br>
+                         &quot;Error while removing user &quot; + userName + &quot; \
from application &quot; +<br> +                                 applicationId;<br>
             log.error(msg, e);<br>
             throw new ApplicationManagementException(msg, e);<br>
         }<br>
+<br>
+        //Notify listeners about removing the user from application.<br>
+        Iterator&lt;ApplicationEventsListener&gt; appEventListeners =<br>
+                                                                \
Util.getApplicationEventsListeners()<br> +                                            \
.iterator();<br> +        try {<br>
+            Application app = ProjectUtils.getApplicationInfo(applicationId);<br>
+            UserInfo user = new UserInfo(userName);<br>
+            while (appEventListeners.hasNext()) {<br>
+                ApplicationEventsListener listener = appEventListeners.next();<br>
+                listener.onUserDeletion(app, user);<br>
+            }<br>
+<br>
+        } catch (Exception ex) {<br>
+            String errorMsg = &quot;Unable to publish user deletion event due to \
&quot; + ex.getMessage();<br> +            log.error(errorMsg, ex);<br>
+            throw new ApplicationManagementException(errorMsg, ex);<br>
+        }<br>
+<br>
+        return true;<br>
+<br>
     }<br>
<br>
-<br>
     public boolean revokeApplication(String applicationId) throws \
                ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         try {<br>
             tenantManager.deleteTenant(tenantManager.getTenantId(applicationId));<br>
                
-            return true;<br>
+<br>
         } catch (UserStoreException e) {<br>
             String msg = &quot;Error while revoking application &quot; + \
applicationId;<br>  log.error(msg, e);<br>
             throw new ApplicationManagementException(msg, e);<br>
         }<br>
-    }<br>
<br>
+        // Notify listeners about the revoke<br>
+        Iterator&lt;ApplicationEventsListener&gt; appEventListeners =<br>
+                                                                \
Util.getApplicationEventsListeners()<br> +                                            \
.iterator();<br> +<br>
+        try {<br>
+            Application application = \
ProjectUtils.getApplicationInfo(applicationId);<br> +            while \
(appEventListeners.hasNext()) {<br> +                ApplicationEventsListener \
listener = appEventListeners.next();<br> +                \
listener.onRevoke(application);<br> +            }<br>
+        } catch (AppFactoryException ex) {<br>
+            String errorMsg = &quot;Unable to notify revoke application event due to \
&quot; + ex.getMessage();<br> +            log.error(errorMsg, ex);<br>
+            throw new ApplicationManagementException(errorMsg, ex);<br>
+        }<br>
+<br>
+<br>
+        return true;<br>
+    }<br>
<br>
     public boolean isApplicationIdAvailable(String applicationKey)<br>
-            throws ApplicationManagementException {<br>
+                                                                  throws \
                ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         int tenantID;<br>
         try {<br>
@@ -182,17 +241,23 @@<br>
         return tenantID &lt; 0;<br>
     }<br>
<br>
-<br>
     public UserInfoBean getUserInfoBean(String userName) throws \
ApplicationManagementException {<br> <br>
         try {<br>
-            UserRealm realm = \
                Util.getRealmService().getTenantUserRealm(MultitenantConstants.SUPER_TENANT_ID);<br>
                
-            String email = \
                realm.getUserStoreManager().getUserClaimValue(userName,<br>
-                                                                         \
                EMAIL_CLAIM_URI, null);<br>
-            String firstName = \
                realm.getUserStoreManager().getUserClaimValue(userName,<br>
-                                                                             \
                FIRST_NAME_CLAIM_URI, null);<br>
-            String lastName = \
                realm.getUserStoreManager().getUserClaimValue(userName,<br>
-                                                                            \
LAST_NAME_CLAIM_URI, null);<br> +            UserRealm realm =<br>
+                              Util.getRealmService()<br>
+                                  \
.getTenantUserRealm(MultitenantConstants.SUPER_TENANT_ID);<br> +            String \
email =<br> +                           \
realm.getUserStoreManager().getUserClaimValue(userName, EMAIL_CLAIM_URI,<br> +        \
null);<br> +            String firstName =<br>
+                               \
realm.getUserStoreManager().getUserClaimValue(userName,<br> +                         \
FIRST_NAME_CLAIM_URI,<br> +                                                           \
null);<br> +            String lastName =<br>
+                              \
realm.getUserStoreManager().getUserClaimValue(userName,<br> +                         \
LAST_NAME_CLAIM_URI,<br> +                                                            \
                null);<br>
             return new UserInfoBean(userName, firstName, lastName, email);<br>
         } catch (UserStoreException e) {<br>
             String msg = &quot;Error while getting info for user &quot; + \
userName;<br> @@ -204,18 +269,20 @@<br>
     public UserInfoBean[] getUserInfo(String applicationId) throws \
ApplicationManagementException {<br>  String[] users = \
                getUsersOfApplication(applicationId);<br>
         ArrayList&lt;UserInfoBean&gt; userInfoList = new \
                ArrayList&lt;UserInfoBean&gt;();<br>
-        if (users != null &amp;&amp; users.length &gt;0 ) {<br>
-            for(int i = 0 ; i &lt; users.length; i++ ) {<br>
+        if (users != null &amp;&amp; users.length &gt; 0) {<br>
+            for (int i = 0; i &lt; users.length; i++) {<br>
                 try {<br>
                     userInfoList.add(getUserInfoBean(users[i]));<br>
                 } catch (ApplicationManagementException e) {<br>
-                    String msg = &quot;Error while getting info for user &quot; + \
users[i]+ &quot;\n Continue getting other users information&quot;;<br> +              \
String msg =<br> +                                 &quot;Error while getting info for \
user &quot; + users[i] +<br> +                                         &quot;\n \
Continue getting other users information&quot;;<br>  log.error(msg, e);<br>
                 }<br>
             }<br>
         }<br>
         return userInfoList.toArray(new UserInfoBean[userInfoList.size()]);<br>
-    }<br>
+    }<br>
<br>
     public String[] getAllApplications(String userName) throws \
ApplicationManagementException {<br>  String apps[] = new String[0];<br>
@@ -227,7 +294,8 @@<br>
             for (Tenant tenant : tenants) {<br>
                 UserRealm realm = \
Util.getRealmService().getTenantUserRealm(tenant.getId());<br>  // every user in \
                everyone role<br>
-                if (realm != null &amp;&amp; \
realm.getUserStoreManager().getRoleListOfUser(userName).length &gt; 1) {<br> +        \
if (realm != null &amp;&amp;<br> +                    \
realm.getUserStoreManager().getRoleListOfUser(userName).length &gt; 1) {<br>  \
list.add(tenant.getDomain());<br>  }<br>
             }<br>
@@ -245,18 +313,21 @@<br>
     }<br>
<br>
     public String[] getRolesOfUserPerApplication(String appId, String userName)<br>
-            throws ApplicationManagementException {<br>
+                                                                               \
                throws ApplicationManagementException {<br>
         TenantManager tenantManager = Util.getRealmService().getTenantManager();<br>
         org.wso2.carbon.user.api.UserStoreManager userStoreManager;<br>
         userStoreManager = null;<br>
         ArrayList&lt;String&gt; roleList = new ArrayList&lt;String&gt;();<br>
         String roles[];<br>
         try {<br>
-            UserRealm realm = \
Util.getRealmService().getTenantUserRealm(tenantManager.getTenantId(appId));<br> +    \
UserRealm realm =<br> +                              Util.getRealmService()<br>
+                                  \
.getTenantUserRealm(tenantManager.getTenantId(appId));<br>  userStoreManager = \
realm.getUserStoreManager();<br>  roles = \
                userStoreManager.getRoleListOfUser(userName);<br>
-            for(String role : roles) {<br>
-                if(!Util.getRealmService().getBootstrapRealmConfiguration().getEveryOneRoleName().equals(role)) \
{<br> +            for (String role : roles) {<br>
+                if (!Util.getRealmService().getBootstrapRealmConfiguration().getEveryOneRoleName()<br>
 +                         .equals(role)) {<br>
                     roleList.add(role);<br>
                 }<br>
             }<br>
@@ -267,26 +338,72 @@<br>
         }<br>
         return roleList.toArray(new String[roleList.size()]);<br>
     }<br>
-<br>
-    public boolean configureContinuousIntegrationForApplication(String \
                applicationId, String[] initialUserNames)<br>
-        throws ApplicationManagementException{<br>
-<br>
-        try {<br>
-            if ( log.isDebugEnabled()){<br>
-                log.debug(&quot;configure a continuous integration system for \
application id: &quot; + applicationId);<br> +<br>
+    public void publishApplicationCreation(String applicationId)<br>
+                                                                throws \
ApplicationManagementException {<br> +        \
Iterator&lt;ApplicationEventsListener&gt; appEventListeners =<br> +                   \
Util.getApplicationEventsListeners()<br> +                                            \
.iterator();<br> +        try {<br>
+            Application application = \
ProjectUtils.getApplicationInfo(applicationId);<br> +            if (application == \
null) {<br> +                String errorMsg =<br>
+                                  String.format(&quot;Unable to load application \
information for id &quot;,<br> +                                                \
applicationId);<br> +                throw new \
ApplicationManagementException(errorMsg);<br>  }<br>
-<br>
-            if ( Util.getContinuousIntegrationSystemDriver() != null){<br>
-                Util.getContinuousIntegrationSystemDriver().createApplicationAccount(applicationId, \
                initialUserNames);<br>
-                Util.getContinuousIntegrationSystemDriver().createJob(applicationId, \
&quot;trunk&quot;, null);<br> +<br>
+            while (appEventListeners.hasNext()) {<br>
+                ApplicationEventsListener listener = appEventListeners.next();<br>
+                listener.onCreation(application);<br>
             }<br>
+        } catch (AppFactoryException ex) {<br>
+            String errorMsg = &quot;Unable to publish application creation due to : \
&quot; + ex.getMessage();<br> +            log.error(errorMsg, ex);<br>
+            throw new ApplicationManagementException(errorMsg, ex);<br>
+        }<br>
+    }<br>
+<br>
+    public void publishApplicationVersionCreation(String applicationId, String \
sourceVersion, String targetVersion)<br> +                                            \
throws ApplicationManagementException {<br> +        try {<br>
+<br>
+            Iterator&lt;ApplicationEventsListener&gt; appEventListeners =<br>
+                    Util.getApplicationEventsListeners()<br>
+                        .iterator();<br>
+<br>
+            Application application = \
ProjectUtils.getApplicationInfo(applicationId);<br> +<br>
+            Version[] versions = ProjectUtils.getVersions(applicationId);<br>
<br>
+            //find the versions.<br>
+            Version source = null;<br>
+            Version target = null;<br>
+            for (Version v : versions) {<br>
+                if ( v.getId().equals(sourceVersion)){<br>
+                    source = v;<br>
+                }<br>
+<br>
+                if (v.getId().equals(targetVersion)) {<br>
+                    target = v;<br>
+                }<br>
+<br>
+                if ( source != null &amp;&amp; target != null){<br>
+                    // both version are found. no need to traverse more<br>
+                    break;<br>
+                }<br>
+<br>
+            }<br>
+<br>
+            while (appEventListeners.hasNext()) {<br>
+                ApplicationEventsListener listener = appEventListeners.next();<br>
+                listener.onVersionCreation(application, source, target);<br>
+            }<br>
+<br>
         } catch (AppFactoryException ex) {<br>
-             String msg = &quot;Error occured while configuring in continuous \
                integration system for : &quot; + applicationId;<br>
-             log.error(msg, ex);<br>
-             throw new ApplicationManagementException(msg,ex);<br>
+            String errorMsg = &quot;Unable to publish version creation due to &quot; \
+ ex.getMessage();<br> +            log.error(errorMsg, ex);<br>
+            throw new ApplicationManagementException(errorMsg, ex);<br>
         }<br>
-<br>
-        return true;<br>
     }<br>
 }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.application.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2/c \
arbon/appfactory/application/mgt/util/Util.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.application.mgt/1.0.2/src/main/java/org/wso2 \
/carbon/appfactory/application/mgt/util/Util.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ap \
plication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ap \
plication.mgt/1.0.2/src/main/java/org/wso2/carbon/appfactory/application/mgt/util/Util.java \
Fri Sep 28 05:35:12 2012<br> @@ -17,10 +17,17 @@<br>
 package org.wso2.carbon.appfactory.application.mgt.util;<br>
<br>
<br>
+import java.util.Collections;<br>
+import java.util.HashSet;<br>
+import java.util.Set;<br>
+import java.util.SortedSet;<br>
+import java.util.TreeSet;<br>
+<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
+import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;<br>
 import org.wso2.carbon.registry.api.RegistryService;<br>
 import org.wso2.carbon.user.core.service.RealmService;<br>
-import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;<br>
<br>
 /**<br>
  *<br>
@@ -32,6 +39,16 @@<br>
     private static AppFactoryConfiguration configuration;<br>
     private static ContinuousIntegrationSystemDriver \
continuousIntegrationSystemDriver;<br> <br>
+    /**<br>
+     * This set needs be a {@link SortedSet} ( e.g.{@link TreeSet} ) to preserve \
natural<br> +     * ordering among {@link ApplicationEventsListener}s.<br>
+     * Refer<br>
+     * {@link ApplicationEventsListener#compareTo(ApplicationEventsListener)} to \
find out<br> +     * how natural ordering occurs<br>
+     */<br>
+    private static Set&lt;ApplicationEventsListener&gt; applicationEventsListeners \
=<br> +                                                                               \
Collections.synchronizedSet(new TreeSet&lt;ApplicationEventsListener&gt;());<br> \
+<br>  public static AppFactoryConfiguration getConfiguration() {<br>
         return configuration;<br>
     }<br>
@@ -71,4 +88,16 @@<br>
     }<br>
<br>
<br>
+    public static void addApplicationEventsListener(ApplicationEventsListener \
applicationEventsListener){<br> +       \
applicationEventsListeners.add(applicationEventsListener);<br> +    }<br>
+<br>
+    public static void removeApplicationEventsListener(ApplicationEventsListener \
applicationEventsListener) {<br> +        \
applicationEventsListeners.remove(applicationEventsListener);<br> +    }<br>
+<br>
+    public static Set&lt;ApplicationEventsListener&gt; \
getApplicationEventsListeners() {<br> +        return applicationEventsListeners;<br>
+    }<br>
+<br>
 }<br>
<br>
Added: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory \
.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java?pathrev=144202" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/ap \
pfactory/jenkins/build/JenkinsApplicationEventsListener.java?pathrev=144202</a><br>


==============================================================================<br>
--- (empty file)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsApplicationEventsListener.java \
Fri Sep 28 05:35:12 2012<br>


@@ -0,0 +1,109 @@<br>
+package org.wso2.carbon.appfactory.jenkins.build;<br>
+<br>
+import org.apache.commons.lang.ArrayUtils;<br>
+import org.apache.commons.logging.Log;<br>
+import org.apache.commons.logging.LogFactory;<br>
+import org.wso2.carbon.appfactory.common.AppFactoryException;<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
+import org.wso2.carbon.appfactory.core.dto.Application;<br>
+import org.wso2.carbon.appfactory.core.dto.UserInfo;<br>
+import org.wso2.carbon.appfactory.core.dto.Version;<br>
+import org.wso2.carbon.appfactory.jenkins.build.internal.ServiceContainer;<br>
+import org.wso2.carbon.appfactory.utilities.project.ProjectUtils;<br>
+<br>
+/**<br>
+ * Listens to Application events (such as creation, user addition etc) and makes<br>
+ * relevant changes on Jenkins CI server.<br>
+ *<br>
+ */<br>
+public class JenkinsApplicationEventsListener extends ApplicationEventsListener \
{<br> +<br>
+    private static Log log = \
LogFactory.getLog(JenkinsApplicationEventsListener.class);<br> +<br>
+    private int priority;<br>
+<br>
+    /**<br>
+     * Creates a listener instance with given priority.<br>
+     *<br>
+     * @param priority<br>
+     *            The Priority<br>
+     */<br>
+    public JenkinsApplicationEventsListener(int priority) {<br>
+<br>
+        this.priority = priority;<br>
+    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    @Override<br>
+    public void onCreation(Application application) throws AppFactoryException {<br>
+<br>
+        <a href="http://log.info" target="_blank">log.info</a>(&quot;Application \
Creation event recieved for : &quot; + application.getId() + &quot; &quot; +<br> +    \
application.getName());<br> +        \
ServiceContainer.getJenkinsCISystemDriver().setupApplicationAccount(application.getId());<br>
 +<br>
+        Version[] versions = ProjectUtils.getVersions(application.getId());<br>
+<br>
+        if (ArrayUtils.isNotEmpty(versions)) {<br>
+            ServiceContainer.getJenkinsCISystemDriver().createJob(application.getId(),<br>
 +                                                                  \
versions[0].getId(), &quot;&quot;);<br> +        }<br>
+<br>
+    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    @Override<br>
+    public void onUserAddition(Application application, UserInfo user) throws \
AppFactoryException {<br> +<br>
+        <a href="http://log.info" target="_blank">log.info</a>(&quot;User Addition \
event recieved for : &quot; + application.getId() + &quot; &quot; +<br> +             \
application.getName() + &quot; User Name : &quot; + user.getUserName());<br> +<br>
+        ServiceContainer.getJenkinsCISystemDriver()<br>
+                        .addUsersToApplication(application.getId(),<br>
+                                               new String[] { user.getUserName() \
});<br> +    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    @Override<br>
+    public void onRevoke(Application application) throws AppFactoryException {<br>
+        // Improvement : remove the jobs from jenkins<br>
+        // Improvement : Remore roles (since appfactory uses role strategy<br>
+        // plugin) associated with the app<br>
+    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    @Override<br>
+    public void onVersionCreation(Application application, Version source, Version \
target)<br> +                                                                         \
throws AppFactoryException {<br> +<br>
+        <a href="http://log.info" target="_blank">log.info</a>(&quot;Version \
Creation event recieved for : &quot; + application.getId() + &quot; &quot; +<br> +    \
application.getName() + &quot; Version : &quot; + target.getId());<br> +<br>
+        ServiceContainer.getJenkinsCISystemDriver().createJob(application.getId(), \
target.getId(),<br> +                                                              \
&quot;&quot;);<br> +<br>
+    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    @Override<br>
+    public void onUserDeletion(Application application, UserInfo user) throws \
AppFactoryException {<br> +        // Improvement : remove the user from project role \
created for<br> +        // application and the global roles assigned to him.<br>
+    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}.<br>
+     */<br>
+    public int getPriority() {<br>
+        return priority;<br>
+    }<br>
+}<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appf \
actory/jenkins/build/JenkinsCIConstants.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/ap \
pfactory/jenkins/build/JenkinsCIConstants.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCIConstants.java \
Fri Sep 28 05:35:12 2012<br> @@ -33,7 +33,9 @@<br>
     public static final String AUTHENTICATE_CONFIG_SELECTOR =<br>
                                                               \
                &quot;ContinuousIntegrationProvider.jenkins.Property.Authenticate&quot;;<br>
                
     public static final String DEFAULT_GLOBAL_ROLES_CONFIG_SELECTOR = \
                &quot;ContinuousIntegrationProvider.jenkins.Property.DefaultGlobalRoles&quot;;<br>
                
-<br>
+<br>
+    public static final String LISTENER_PRIORITY_CONFIG_SELECTOR = \
&quot;ContinuousIntegrationProvider.jenkins.Property.ListenerPriority&quot;;<br> \
                +<br>
     public static final String SVN_REPOSITORY = &quot;svn.repository&quot;;<br>
     public static final String SVN_REPOSITORY_XPATH_SELECTOR =<br>
                                                                \
&quot;/*/scm/locations/hudson.scm.SubversionSCM_-ModuleLocation/remote&quot;;<br> \
                <br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appf \
actory/jenkins/build/JenkinsCISystemDriver.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/ap \
pfactory/jenkins/build/JenkinsCISystemDriver.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java \
Fri Sep 28 05:35:12 2012<br> @@ -1,21 +1,25 @@<br>
 /*<br>
  * Copyright 2005-2011 WSO2, Inc. (<a href="http://wso2.com" \
                target="_blank">http://wso2.com</a>)<br>
- *<br>
- *    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
- *    you may not use this file except in compliance with the License.<br>
- *    You may obtain a copy of the License at<br>
- *<br>
- *    <a href="http://www.apache.org/licenses/LICENSE-2.0" \
                target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br>
- *<br>
- *    Unless required by applicable law or agreed to in writing, software<br>
- *    distributed under the License is distributed on an &quot;AS IS&quot; \
                BASIS,<br>
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
- *    See the License for the specific language governing permissions and<br>
- *    limitations under the License.<br>
+ *<br>
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at<br>
+ *<br>
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0" \
target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br> + *<br>
+ * Unless required by applicable law or agreed to in writing, software<br>
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+ * See the License for the specific language governing permissions and<br>
+ * limitations under the License.<br>
  */<br>
<br>
 package org.wso2.carbon.appfactory.jenkins.build;<br>
<br>
+import java.util.HashMap;<br>
+import java.util.List;<br>
+import java.util.Map;<br>
+<br>
 import org.apache.commons.logging.Log;<br>
 import org.apache.commons.logging.LogFactory;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConstants;<br>
@@ -25,15 +29,28 @@<br>
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryMgtException;<br>
 import org.wso2.carbon.appfactory.utilities.project.ProjectUtils;<br>
<br>
-import java.util.HashMap;<br>
-import java.util.List;<br>
-import java.util.Map;<br>
-<br>
+/**<br>
+ * This driver integrates Jenkins CI and Appfactory. Refer<br>
+ * {@link ContinuousIntegrationSystemDriver} for more information.<br>
+ *<br>
+ */<br>
 public class JenkinsCISystemDriver implements ContinuousIntegrationSystemDriver \
{<br> <br>
+    /**<br>
+     * Used to connect to jenkins server<br>
+     */<br>
     private RestBasedJenkinsCIConnector connector;<br>
+<br>
+    /**<br>
+     * These global roles names should be defined in role based strategy (<br>
+     * jenkins ci) plugin.<br>
+     * Any user added to jenkins will be assigned with these roles.<br>
+     * Typical usage of having such roles is to control access at a global level<br>
+     * ( e.g. defining slaves, admin access)<br>
+     *<br>
+     */<br>
     private String[] defaultGlobalRoles;<br>
-<br>
+<br>
     private static final Log log = \
LogFactory.getLog(JenkinsCISystemDriver.class);<br> <br>
     public JenkinsCISystemDriver(RestBasedJenkinsCIConnector connector, String[] \
defaultGlobalRoles) {<br> @@ -41,6 +58,9 @@<br>
         this.defaultGlobalRoles = defaultGlobalRoles;<br>
     }<br>
<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
     @Override<br>
     public void createJob(String applicationId, String version, String revision)<br>
                                                                                 \
throws AppFactoryException {<br> @@ -78,59 +98,101 @@<br>
<br>
         parameters.put(JenkinsCIConstants.SVN_CREDENTIALS_USERNAME,<br>
                        ServiceContainer.getAppFactoryConfiguration()<br>
-                                    \
.getFirstProperty(AppFactoryConstants.SERVER_ADMIN_NAME));<br> +                      \
.getFirstProperty(AppFactoryConstants.SERVER_ADMIN_NAME));<br>  \
parameters.put(JenkinsCIConstants.SVN_CREDENTIALS_PASSWORD,<br>  \
                ServiceContainer.getAppFactoryConfiguration()<br>
-                                    \
.getFirstProperty(AppFactoryConstants.SERVER_ADMIN_PASSWORD));<br> +                  \
.getFirstProperty(AppFactoryConstants.SERVER_ADMIN_PASSWORD));<br> <br>
         parameters.put(JenkinsCIConstants.APPLICATION_ID, applicationId);<br>
         parameters.put(JenkinsCIConstants.APPLICATION_VERSION, version);<br>
-<br>
-        // TODO : Hard coded application extension here. in future this could be \
either &#39;car&#39;or &#39;war&#39;<br> +<br>
+        // TODO : Hard coded application extension here. in future this could be<br>
+        // either &#39;car&#39;or &#39;war&#39;<br>
         // and will be selected by user<br>
         parameters.put(JenkinsCIConstants.APPLICATION_EXTENSION, \
&quot;car&quot;);<br> <br>
-<br>
         this.connector.createJob(getJobName(applicationId, version, revision), \
parameters);<br> <br>
     }<br>
<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
     public void deleteJob(String jobName) throws AppFactoryException {<br>
         connector.deleteJob(jobName);<br>
     }<br>
<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
     public List&lt;String&gt; getAllJobNames() throws AppFactoryException {<br>
         return connector.getAllJobs();<br>
     }<br>
<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
     public void startBuild(String jobName) throws AppFactoryException {<br>
         connector.startBuild(jobName);<br>
     }<br>
<br>
-    public boolean isJobExists(String jobName) throws AppFactoryException{<br>
-       return connector.isJobExists(jobName);<br>
-    }<br>
-<br>
-<br>
-<br>
-    public String getJobName(String applicationId, String version, String \
                revision){<br>
-      //Job name will be &#39;&lt;ApplicationId&gt;-&lt;version&gt;-default&#39;<br>
-        return new StringBuilder(applicationId).append(&#39;-&#39;).append(version)<br>
                
-                   .append(&#39;-&#39;).append(&quot;default&quot;).toString();<br>
-    }<br>
-<br>
-    public void createApplicationAccount(String applicationId, String[] \
                initialUserIds) throws AppFactoryException {<br>
-       String applicationSelectorRegEx = new \
                StringBuilder(applicationId).append(&quot;.*&quot;).toString();<br>
-       connector.createRole(applicationId, applicationSelectorRegEx);<br>
-       if ( initialUserIds != null){<br>
-          assignUsersApplication(applicationId, initialUserIds);<br>
-       }<br>
-    }<br>
-<br>
-    public void assignUsersApplication(String applicationId, String[] userIds)<br>
-                                                                              throws \
                AppFactoryException {<br>
-        connector.assignUsers(userIds, new String[]{applicationId}, \
defaultGlobalRoles);<br> +    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    public boolean isJobExists(String jobName) throws AppFactoryException {<br>
+        return connector.isJobExists(jobName);<br>
+    }<br>
+<br>
+    /**<br>
+     * {@inheritDoc}<br>
+     */<br>
+    public String getJobName(String applicationId, String version, String revision) \
{<br> +        // Job name will be \
&#39;&lt;ApplicationId&gt;-&lt;version&gt;-default&#39;<br> +        return new \
StringBuilder(applicationId).append(&#39;-&#39;).append(version).append(&#39;-&#39;)<br>
 +                                               \
.append(&quot;default&quot;).toString();<br> +    }<br>
+<br>
+    /**<br>
+     * Additional method to be used by {@link JenkinsApplicationEventsListener}.<br>
+     * Method will add a role (in role strategy plugin) to match jobs created<br>
+     * for specified application.<br>
+     * (when a user is added/invited to a application,<br>
+     * {@link JenkinsApplicationEventsListener} will assign<br>
+     * the role associated with application to user.<br>
+     * &lt;p&gt;<br>
+     * &lt;b&gt;NOTE: This method assumes role-strategy plugin is correctly \
installed<br> +     * in jenkins server<br>
+     * &lt;/p&gt;<br>
+     *<br>
+     * @param applicationId<br>
+     *            application Id<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
+    public void setupApplicationAccount(String applicationId) throws \
AppFactoryException {<br> +        String applicationSelectorRegEx = new \
StringBuilder(applicationId).append(&quot;.*&quot;).toString();<br> +        \
connector.createRole(applicationId, applicationSelectorRegEx);<br> +    }<br>
+<br>
+    /**<br>
+     * Configures given list of users in jenkins server ( role strategy plugin)<br>
+     * by assigning correct application specific roles and set of global roles.<br>
+     * These role should be already defined in jenkins server.<br>
+     * &lt;p&gt;<br>
+     * &lt;b&gt;NOTE: This method assumes role-strategy plugin is correctly \
installed<br> +     * in jenkins server<br>
+     * &lt;/p&gt;<br>
+     *<br>
+     * @param applicationId<br>
+     *            Application Id<br>
+     * @param userIds<br>
+     *            set of users (Ids)<br>
+     * @throws AppFactoryException<br>
+     *             if a error occurs<br>
+     */<br>
+    public void addUsersToApplication(String applicationId, String[] userIds)<br>
+                                                                             throws \
AppFactoryException {<br> +        connector.assignUsers(userIds, new String[] { \
applicationId }, defaultGlobalRoles);<br>  }<br>
-<br>
-<br>
+<br>
 }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appf \
actory/jenkins/build/RestBasedJenkinsCIConnector.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/ap \
pfactory/jenkins/build/RestBasedJenkinsCIConnector.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/RestBasedJenkinsCIConnector.java \
Fri Sep 28 05:35:12 2012<br> @@ -44,14 +44,27 @@<br>
 import org.apache.commons.logging.LogFactory;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryException;<br>
<br>
+/**<br>
+ * Connects to a jenkins server using its &#39;Remote API&#39;.<br>
+ *<br>
+ */<br>
 public class RestBasedJenkinsCIConnector {<br>
<br>
     private static final Log log = \
LogFactory.getLog(RestBasedJenkinsCIConnector.class);<br> <br>
+    /**<br>
+     * The http client used to connect jenkins.<br>
+     */<br>
     private HttpClient httpClient;<br>
<br>
+    /**<br>
+     * Base url of the jenkins<br>
+     */<br>
     private String jenkinsUrl;<br>
<br>
+    /**<br>
+     * Flag weather this connector needs to authenticate it self.<br>
+     */<br>
     private boolean authenticate;<br>
<br>
     public RestBasedJenkinsCIConnector(String jenkinsUrl, boolean authenticate, \
String userName,<br> @@ -84,6 +97,20 @@<br>
         this.jenkinsUrl = jenkinsUrl;<br>
     }<br>
<br>
+    /**<br>
+     * Creates a project/job role in jenkins server<br>
+     * &lt;p&gt;<br>
+     * &lt;b&gt;NOTE: this method assumes a modified version (by WSO2) of<br>
+     * &#39;role-strategy&#39; plugin is installed in jenkins server&lt;/b&gt;<br>
+     * &lt;/p&gt;<br>
+     *<br>
+     * @param roleName<br>
+     *            Name of the role.<br>
+     * @param pattern<br>
+     *            a regular expression to match jobs (e.g. app1.*)<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
     public void createRole(String roleName, String pattern) throws \
AppFactoryException {<br>  String createRoleUrl =<br>
                                \
&quot;/descriptorByName/com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy/createProjectRoleSubmit&quot;;<br>
 @@ -126,7 +153,24 @@<br>
<br>
     }<br>
<br>
-    public void assignUsers(String[] userIds, String[] projectRoleNames, String[] \
globalRoleNames) throws AppFactoryException{<br> +    /**<br>
+     * Assigns a set of global and/or project roles(s) to a specified user(s)<br>
+     * &lt;p&gt;<br>
+     * &lt;b&gt;NOTE: this method assumes a modified version (by WSO2) of<br>
+     * &#39;role-strategy&#39; plugin is installed in jenkins server&lt;/b&gt;<br>
+     * &lt;/p&gt;<br>
+     *<br>
+     * @param userIds<br>
+     *            list of user Ids<br>
+     * @param projectRoleNames<br>
+     *            list of project roles<br>
+     * @param globalRoleNames<br>
+     *            list of global roles<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
+    public void assignUsers(String[] userIds, String[] projectRoleNames, String[] \
globalRoleNames)<br> +                                                                \
throws AppFactoryException {<br> <br>
         String assignURL =<br>
                            \
&quot;/descriptorByName/com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy/assignRolesSubmit&quot;;<br>
 @@ -176,6 +220,13 @@<br>
<br>
     }<br>
<br>
+    /**<br>
+     * Returns all the jobs defined in jenkins server<br>
+     *<br>
+     * @return list of job names<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
     public List&lt;String&gt; getAllJobs() throws AppFactoryException {<br>
<br>
         List&lt;String&gt; jobNames = null;<br>
@@ -218,6 +269,16 @@<br>
         return jobNames;<br>
     }<br>
<br>
+    /**<br>
+     * Create a job in Jenkins<br>
+     *<br>
+     * @param jobName<br>
+     *            name of the job<br>
+     * @param jobParams<br>
+     *            Job configuration parameters<br>
+     * @throws AppFactoryException<br>
+     *             if an error occures.<br>
+     */<br>
     public void createJob(String jobName, Map&lt;String, String&gt; jobParams) \
throws AppFactoryException {<br> <br>
         OMElement jobConfiguration = new JobConfigurator(jobParams).configure();<br>
@@ -272,6 +333,15 @@<br>
         }<br>
     }<br>
<br>
+    /**<br>
+     * Checks weather a job exists in Jenkins server<br>
+     *<br>
+     * @param jobName<br>
+     *            name of the job.<br>
+     * @return true if job exits, false otherwise.<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs.<br>
+     */<br>
     public boolean isJobExists(String jobName) throws AppFactoryException {<br>
<br>
         final String wrapperTag = &quot;JobNames&quot;;<br>
@@ -315,6 +385,15 @@<br>
         return isExists;<br>
     }<br>
<br>
+    /**<br>
+     * Deletes a job<br>
+     *<br>
+     * @param jobName<br>
+     *            name of the job<br>
+     * @return true if job exited on Jenkins and successfully deleted.<br>
+     * @throws AppFactoryException<br>
+     *             if an error occures.<br>
+     */<br>
     public boolean deleteJob(String jobName) throws AppFactoryException {<br>
         PostMethod deleteJobMethod =<br>
                                      \
createPost(String.format(&quot;/job/%s/doDelete&quot;, jobName), null,<br> @@ -342,6 \
+421,14 @@<br> <br>
     }<br>
<br>
+    /**<br>
+     * Starts a build job available in Jenkins<br>
+     *<br>
+     * @param jobName<br>
+     *            Name of the job<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs.<br>
+     */<br>
     public void startBuild(String jobName) throws AppFactoryException {<br>
         PostMethod startBuildMethod =<br>
                                       \
createPost(String.format(&quot;/job/%s/build&quot;, jobName), null,<br> @@ -385,6 \
+472,12 @@<br> <br>
     }<br>
<br>
+    /**<br>
+     * Logs out of the jenkins server<br>
+     *<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
     public void logout() throws AppFactoryException {<br>
         GetMethod logoutMethod = createGet(&quot;/logout&quot;, null);<br>
         try {<br>
@@ -400,6 +493,21 @@<br>
<br>
     }<br>
<br>
+    /**<br>
+     * A convenient methods to pass credentials of a svn repository (specified<br>
+     * in the job)<br>
+     *<br>
+     * @param jobName<br>
+     *            Name of job<br>
+     * @param userName<br>
+     *            svn username<br>
+     * @param password<br>
+     *            password<br>
+     * @param svnRepo<br>
+     *            repo url<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs.<br>
+     */<br>
     private void setSvnCredentials(String jobName, String userName, String password, \
                String svnRepo)<br>
                                                                                      \
throws AppFactoryException {<br>  final String setCredentialsURL =<br>
@@ -448,6 +556,15 @@<br>
         }<br>
     }<br>
<br>
+    /**<br>
+     * Util method to create a http GET method.<br>
+     *<br>
+     * @param urlFragment<br>
+     *            Url fragments<br>
+     * @param queryParameters<br>
+     *            query parameters.<br>
+     * @return a {@link GetMethod}<br>
+     */<br>
     private GetMethod createGet(String urlFragment, NameValuePair[] queryParameters) \
{<br>  GetMethod get = new GetMethod(getJenkinsUrl() + urlFragment);<br>
         if (authenticate) {<br>
@@ -459,6 +576,17 @@<br>
         return get;<br>
     }<br>
<br>
+    /**<br>
+     * Util method to create a POST method<br>
+     *<br>
+     * @param urlFragment<br>
+     *            Url fragments.<br>
+     * @param queryParameters<br>
+     *            Query parameters.<br>
+     * @param requestEntity<br>
+     *            A request entity<br>
+     * @return a {@link PostMethod}<br>
+     */<br>
     private PostMethod createPost(String urlFragment, NameValuePair[] \
queryParameters,<br>  RequestEntity requestEntity) {<br>
         PostMethod post = new PostMethod(getJenkinsUrl() + urlFragment);<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appf \
actory/jenkins/build/internal/JenkinsBuildServiceComponent.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/ap \
pfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/internal/JenkinsBuildServiceComponent.java \
Fri Sep 28 05:35:12 2012<br>


@@ -16,13 +16,14 @@<br>
<br>
 package org.wso2.carbon.appfactory.jenkins.build.internal;<br>
<br>
-import org.apache.commons.lang.StringUtils;<br>
 import org.apache.commons.logging.Log;<br>
 import org.apache.commons.logging.LogFactory;<br>
 import org.osgi.framework.BundleContext;<br>
 import org.osgi.service.component.ComponentContext;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
 import org.wso2.carbon.appfactory.core.ContinuousIntegrationSystemDriver;<br>
+import org.wso2.carbon.appfactory.jenkins.build.JenkinsApplicationEventsListener;<br>
  import org.wso2.carbon.appfactory.jenkins.build.JenkinsCIConstants;<br>
 import org.wso2.carbon.appfactory.jenkins.build.JenkinsCISystemDriver;<br>
 import org.wso2.carbon.appfactory.jenkins.build.RestBasedJenkinsCIConnector;<br>
@@ -65,7 +66,7 @@<br>
     protected void activate(ComponentContext context) {<br>
<br>
         if (log.isDebugEnabled()) {<br>
-            <a href="http://log.info" \
target="_blank">log.info</a>(&quot;**************Jenkins build service bundle is \
activated*************&quot;);<br> +            log.debug(&quot;Jenkins build service \
bundle is activated&quot;);<br>  }<br>
         try {<br>
<br>
@@ -83,18 +84,20 @@<br>
                 String jenkinsUrl =<br>
                                     \
                ServiceContainer.getAppFactoryConfiguration()<br>
                                                     \
                .getFirstProperty(JenkinsCIConstants.BASE_URL_CONFIG_SELECTOR);<br>
-                String jenkinsDefaultGlobalRoles  =<br>
-                                    \
                ServiceContainer.getAppFactoryConfiguration()<br>
-                                                    \
                .getFirstProperty(JenkinsCIConstants.DEFAULT_GLOBAL_ROLES_CONFIG_SELECTOR);<br>
                
-<br>
-<br>
+                String jenkinsDefaultGlobalRoles =<br>
+                                                   \
ServiceContainer.getAppFactoryConfiguration()<br> +                                   \
.getFirstProperty(JenkinsCIConstants.DEFAULT_GLOBAL_ROLES_CONFIG_SELECTOR);<br> +     \
String listenerPriority =<br> +                                          \
ServiceContainer.getAppFactoryConfiguration()<br> +                                   \
.getFirstProperty(JenkinsCIConstants.LISTENER_PRIORITY_CONFIG_SELECTOR);<br> +<br>
                 if (log.isDebugEnabled()) {<br>
                     log.debug(String.format(&quot;Authenticate : %b&quot;, \
                authenticate));<br>
                     log.debug(String.format(&quot;Jenkins user name : %s&quot;, \
                userName));<br>
                     log.debug(String.format(&quot;Jenkins api key : %s&quot;, \
                apiKey));<br>
                     log.debug(String.format(&quot;Jenkins url : %s&quot;, \
                jenkinsUrl));<br>
                     log.debug(String.format(&quot;Default Global Roles : %s&quot;, \
                jenkinsDefaultGlobalRoles));<br>
-<br>
+                    log.debug(String.format(&quot;Listener Priority : %s&quot;, \
listenerPriority));<br>  }<br>
<br>
                 RestBasedJenkinsCIConnector connector =<br>
@@ -104,11 +107,22 @@<br>
                                                                                      \
                userName,<br>
                                                                                      \
                apiKey);<br>
                 String[] globalRoles = \
                jenkinsDefaultGlobalRoles.split(&quot;,&quot;);<br>
-                if (globalRoles == null){<br>
-                    globalRoles = new String[]{};<br>
+                if (globalRoles == null) {<br>
+                    globalRoles = new String[] {};<br>
+                }<br>
+<br>
+                int jenkinsListnerPriority = -1;<br>
+                try {<br>
+                    jenkinsListnerPriority = Integer.parseInt(listenerPriority);<br>
+                } catch (NumberFormatException nef) {<br>
+                    throw new IllegalArgumentException(<br>
+                                                       &quot;Invalid priority \
specified for jenkins application event listener. Please provide a number&quot;,<br> \
+                                                       nef);<br>  }<br>
-<br>
-                JenkinsCISystemDriver jenkinsCISystemDriver = new \
JenkinsCISystemDriver(connector, globalRoles);<br> +<br>
+                JenkinsCISystemDriver jenkinsCISystemDriver =<br>
+                                                              new \
JenkinsCISystemDriver(connector,<br> +                                                \
                globalRoles);<br>
                 ServiceContainer.setJenkinsCISystemDriver(jenkinsCISystemDriver);<br>
                
                 BundleContext bundleContext = context.getBundleContext();<br>
                 // Note: register the service only if its enabled in the<br>
@@ -116,6 +130,10 @@<br>
                 // configuration file.<br>
                 bundleContext.registerService(ContinuousIntegrationSystemDriver.class.getName(),<br>
                
                                               jenkinsCISystemDriver, null);<br>
+<br>
+                // Registering the Jenkins application event listener.<br>
+                bundleContext.registerService(ApplicationEventsListener.class.getName(),<br>
 +                                              new \
JenkinsApplicationEventsListener(jenkinsListnerPriority), null);<br>  } else {<br>
                 <a href="http://log.info" target="_blank">log.info</a>(&quot;Jenkins \
is not enabled&quot;);<br>  }<br>
@@ -144,7 +162,7 @@<br>
<br>
     protected void deactivate(ComponentContext ctxt) {<br>
         if (log.isDebugEnabled()) {<br>
-            <a href="http://log.info" \
target="_blank">log.info</a>(&quot;************* Jenkins build service bundle is \
deactivated*************&quot;);<br> +            log.debug(&quot;Jenkins build \
service bundle is deactivated&quot;);<br>  }<br>
     }<br>
 }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/appf \
actory/jenkins/build/service/JenkinsCISystemDriverService.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.build/1.0.2/src/main/java/org/wso2/carbon/ap \
pfactory/jenkins/build/service/JenkinsCISystemDriverService.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.bu \
ild/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/service/JenkinsCISystemDriverService.java \
Fri Sep 28 05:35:12 2012<br>


@@ -50,15 +50,4 @@<br>
         return ServiceContainer.getJenkinsCISystemDriver().getJobName(applicationId, \
                version,<br>
                                                                       revision);<br>
     }<br>
-<br>
-    public void createApplicationAccount(String applicationId, String[] \
                initialUserIds) throws AppFactoryException {<br>
-<br>
-        ServiceContainer.getJenkinsCISystemDriver().createApplicationAccount(applicationId, \
                initialUserIds);<br>
-    }<br>
-<br>
-    public void assignUsersApplication(String applicationId, String[] userIds)<br>
-                                                                              throws \
                AppFactoryException {<br>
-        ServiceContainer.getJenkinsCISystemDriver().assignUsersApplication(applicationId, \
                userIds);<br>
-    }<br>
-<br>
 }<br>
<br>
Added: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory \
.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java?pathrev=144202" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java?pathrev=144202</a><br>



==============================================================================<br>
--- (empty file)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ApplicationEventsListener.java \
Fri Sep 28 05:35:12 2012<br> @@ -0,0 +1,92 @@<br>
+/*<br>
+ * Copyright 2005-2011 WSO2, Inc. (<a href="http://wso2.com" \
target="_blank">http://wso2.com</a>)<br> + *<br>
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at<br>
+ *<br>
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0" \
target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br> + *<br>
+ * Unless required by applicable law or agreed to in writing, software<br>
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+ * See the License for the specific language governing permissions and<br>
+ * limitations under the License.<br>
+ */<br>
+<br>
+package org.wso2.carbon.appfactory.core;<br>
+<br>
+import org.wso2.carbon.appfactory.common.AppFactoryException;<br>
+import org.wso2.carbon.appfactory.core.dto.Application;<br>
+import org.wso2.carbon.appfactory.core.dto.UserInfo;<br>
+import org.wso2.carbon.appfactory.core.dto.Version;<br>
+<br>
+public abstract class ApplicationEventsListener implements \
Comparable&lt;ApplicationEventsListener&gt; {<br> +<br>
+    /**<br>
+     * Invoked after a application is created<br>
+     *<br>
+     * @param application<br>
+     * @throws AppFactoryException<br>
+     */<br>
+    public abstract void onCreation(Application application) throws \
AppFactoryException;<br> +<br>
+    /**<br>
+     * Invoked after adding a user to a application<br>
+     *<br>
+     * @param application<br>
+     * @param user<br>
+     * @throws AppFactoryException<br>
+     */<br>
+    public abstract void onUserAddition(Application application, UserInfo user) \
throws AppFactoryException;<br> +<br>
+    /**<br>
+     * Invoked after removing a user from an application.<br>
+     *<br>
+     * @param application<br>
+     * @param user<br>
+     * @throws AppFactoryException<br>
+     */<br>
+    public abstract void onUserDeletion(Application application, UserInfo user) \
throws AppFactoryException;<br> +<br>
+    /**<br>
+     * Invoked after revoking an application<br>
+     *<br>
+     * @param application<br>
+     * @throws AppFactoryException<br>
+     */<br>
+    public abstract void onRevoke(Application application) throws \
AppFactoryException;<br> +<br>
+    /**<br>
+     * Invoked after creating a new application version using an existing.<br>
+     *<br>
+     * @param application<br>
+     *            The Application.<br>
+     * @param source<br>
+     *            source version.<br>
+     * @param target<br>
+     *            target/new version<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
+    public abstract void onVersionCreation(Application application, Version source, \
Version target)<br> +                                                                 \
throws AppFactoryException;<br> +<br>
+    /**<br>
+     * The priority given to Listener.<br>
+     * &lt;p&gt;<br>
+     * e.g. If listener X has priority 10 and Y has 20. Listner Y will given<br>
+     * program control before X when application event occurs.<br>
+     *<br>
+     * @return The priority<br>
+     */<br>
+    public abstract int getPriority();<br>
+<br>
+    public int compareTo(ApplicationEventsListener o) {<br>
+<br>
+        return (this.getPriority() &lt; o.getPriority() ? -1<br>
+                                                    : (this.getPriority() == \
this.getPriority() ? 0<br> +                                                          \
: 1));<br> +    }<br>
+<br>
+}<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfa \
ctory/core/BuildDriverListener.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/app \
factory/core/BuildDriverListener.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/BuildDriverListener.java \
Fri Sep 28 05:35:12 2012<br> @@ -8,19 +8,19 @@<br>
  * Listens to the events of the BuildDriver<br>
  */<br>
 public interface BuildDriverListener {<br>
-<br>
-       /**<br>
-        * Called upon successful build<br>
-        *<br>
-        * @param applicationId<br>
-        * @param version<br>
-        * @param revision<br>
-        * @param file<br>
-        * @throws AppFactoryException<br>
-        */<br>
-    public void onBuildSuccessful(String applicationId, String version,<br>
-            String revision, File file)  throws AppFactoryException;<br>
-<br>
+<br>
+    /**<br>
+     * Called upon successful build<br>
+     *<br>
+     * @param applicationId<br>
+     * @param version<br>
+     * @param revision<br>
+     * @param file<br>
+     * @throws AppFactoryException<br>
+     */<br>
+    public void onBuildSuccessful(String applicationId, String version, String \
revision, File file)<br> +                                                            \
throws AppFactoryException;<br> +<br>
     /**<br>
      * Called upon build failure<br>
      *<br>
@@ -30,7 +30,7 @@<br>
      * @param file<br>
      * @throws AppFactoryException<br>
      */<br>
-    public void onBuildFailure(String applicationId, String version,<br>
-                                  String revision, String errorMessage)  throws \
AppFactoryException;<br> +    public void onBuildFailure(String applicationId, String \
version, String revision,<br> +                               String errorMessage) \
throws AppFactoryException;<br> <br>
 }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfa \
ctory/core/ContinuousIntegrationSystemDriver.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/app \
factory/core/ContinuousIntegrationSystemDriver.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/ContinuousIntegrationSystemDriver.java \
Fri Sep 28 05:35:12 2012<br> @@ -5,27 +5,81 @@<br>
 import org.wso2.carbon.appfactory.common.AppFactoryException;<br>
<br>
 /**<br>
- * Continuous build system driver<br>
+ * Defines the contact what needs to be implemented by any CI Driver (i.e.<br>
+ * Jenkins, Bambo)<br>
+ *<br>
  *<br>
  */<br>
 public interface ContinuousIntegrationSystemDriver {<br>
<br>
+    /**<br>
+     * Setup CI job for given application and versions<br>
+     *<br>
+     * @param applicationId<br>
+     *            Id of the application<br>
+     * @param version<br>
+     *            version id<br>
+     * @param revision<br>
+     *            revision (This parameters is deprecated and need to be removed<br>
+     *            in future)<br>
+     * @throws AppFactoryException<br>
+     *             if a error occurs<br>
+     */<br>
     public void createJob(String applicationId, String version, String revision)<br>
                                                                                 \
throws AppFactoryException;<br> <br>
+    /**<br>
+     * Removes a specified job from CI System.<br>
+     *<br>
+     * @param jobName<br>
+     *            Name of the job<br>
+     * @throws AppFactoryException<br>
+     *             If a error occurs<br>
+     */<br>
     public void deleteJob(String jobName) throws AppFactoryException;<br>
<br>
+    /**<br>
+     * Returns jobs available in CI System.<br>
+     *<br>
+     * @return A {@link List} of job names<br>
+     * @throws AppFactoryException<br>
+     *             If an error occurs<br>
+     */<br>
     public List&lt;String&gt; getAllJobNames() throws AppFactoryException;<br>
<br>
+    /**<br>
+     * Starts building the specified CI job.<br>
+     *<br>
+     * @param jobName<br>
+     *            Name of the CI Job<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
     public void startBuild(String jobName) throws AppFactoryException;<br>
<br>
+    /**<br>
+     * Checks weather a specified job is available on CI system.<br>
+     *<br>
+     * @param jobName<br>
+     *            Name of the job<br>
+     * @return true if job is available, false otherwise<br>
+     * @throws AppFactoryException<br>
+     *             if error occurs<br>
+     */<br>
     public boolean isJobExists(String jobName) throws AppFactoryException;<br>
-<br>
-    public String getJobName(String applicationId, String version, String \
                revision);<br>
-<br>
-    public void createApplicationAccount(String applicationId, String[] \
                initialUserIds) throws AppFactoryException;<br>
-<br>
-    public void assignUsersApplication(String applicationId, String[] userIds)<br>
-                                                               throws \
AppFactoryException;<br> <br>
+    /**<br>
+     * Constructs a job name based on supplied parameter. Rational of this<br>
+     * method is to enable CI driver to have control over the job naming scheme.<br>
+     *<br>
+     * @param applicationId<br>
+     *            application Id<br>
+     * @param version<br>
+     *            version Id<br>
+     * @param revision<br>
+     *            revision id - this parameter is deprecated and will be removed<br>
+     *            in future<br>
+     * @return name of the job<br>
+     */<br>
+    public String getJobName(String applicationId, String version, String \
revision);<br>  }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfa \
ctory/core/build/ArtifactCreator.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/app \
factory/core/build/ArtifactCreator.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/ArtifactCreator.java Fri \
Sep 28 05:35:12 2012<br> @@ -30,6 +30,9 @@<br>
     public void createArtifact(String applicationId, String version, String \
                revision)<br>
                                                                                      \
                throws AppFactoryException {<br>
         if (ServiceHolder.getContinuousIntegrationSystemDriver() != null) {<br>
+            // Since the CI system is enabled appfactory will give the preference to \
it. Appfactory will start<br> +            // the job if it exists. Once the build is \
completed &#39;appfactory-post-build-notifier-plugin&#39; will upload the<br> +       \
// artifact onto artifact storage.<br>  String jobName =<br>
                              \
                ServiceHolder.getContinuousIntegrationSystemDriver()<br>
                                           .getJobName(applicationId, version, \
revision);<br> @@ -37,6 +40,7 @@<br>
                 ServiceHolder.getContinuousIntegrationSystemDriver().startBuild(jobName);<br>
  }<br>
         } else {<br>
+            // Default builder will build the Application locally.<br>
             DefaultRevisionControlDriverListener listener =<br>
                                                             new \
                DefaultRevisionControlDriverListener();<br>
             RevisionControlDriver revisionControlDriver = \
ServiceHolder.getRevisionControlDriver();<br> <br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfa \
ctory/core/build/DefaultRevisionControlDriverListener.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/app \
factory/core/build/DefaultRevisionControlDriverListener.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.co \
re/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/build/DefaultRevisionControlDriverListener.java \
Fri Sep 28 05:35:12 2012<br>


@@ -7,10 +7,11 @@<br>
<br>
 public class DefaultRevisionControlDriverListener implements \
RevisionControlDriverListener {<br> <br>
-       public void onGetSourceCompleted(String applicationId, String version, String \
                revision)  throws AppFactoryException{<br>
-               BuildDriver buildDriver = ServiceHolder.getBuildDriver();<br>
-               DefaultBuildDriverListener listener = new \
                DefaultBuildDriverListener();<br>
-               buildDriver.buildArtifact(applicationId, version, revision, \
                listener);<br>
-       }<br>
+    public void onGetSourceCompleted(String applicationId, String version, String \
revision)<br> +                                                                       \
throws AppFactoryException {<br> +        BuildDriver buildDriver = \
ServiceHolder.getBuildDriver();<br> +        DefaultBuildDriverListener listener = \
new DefaultBuildDriverListener();<br> +        \
buildDriver.buildArtifact(applicationId, version, revision, listener);<br> +    }<br>
<br>
 }<br>
<br>
Added: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory \
                .core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java?pathrev=144202" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java?pathrev=144202</a><br>



==============================================================================<br>
--- (empty file)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Application.java \
Fri Sep 28 05:35:12 2012<br> @@ -0,0 +1,91 @@<br>
+/*<br>
+ * Copyright 2005-2011 WSO2, Inc. (<a href="http://wso2.com" \
target="_blank">http://wso2.com</a>)<br> + *<br>
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at<br>
+ *<br>
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0" \
target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br> + *<br>
+ * Unless required by applicable law or agreed to in writing, software<br>
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+ * See the License for the specific language governing permissions and<br>
+ * limitations under the License.<br>
+ */<br>
+<br>
+package org.wso2.carbon.appfactory.core.dto;<br>
+<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
+<br>
+/**<br>
+ * Holds information about an Application. Refer {@link ApplicationEventsListener} \
for usage.<br> + */<br>
+public class Application {<br>
+<br>
+    /**<br>
+     * Name of the application<br>
+     */<br>
+    private String name;<br>
+<br>
+    /**<br>
+     * Description of the application<br>
+     */<br>
+    private String description;<br>
+<br>
+    /**<br>
+     * The application Id<br>
+     */<br>
+    private String id;<br>
+<br>
+    private Version[] versions;<br>
+<br>
+    /**<br>
+     * Type of the application (e.g. car, war)<br>
+     */<br>
+    private String type;<br>
+<br>
+    public Application() {<br>
+<br>
+    }<br>
+<br>
+    public Application(String id, String name, String type, String description) \
{<br> +        <a href="http://this.name" target="_blank">this.name</a> = name;<br>
+        this.description = description;<br>
+        <a href="http://this.id" target="_blank">this.id</a> = id;<br>
+        this.type = type;<br>
+    }<br>
+<br>
+    public String getName() {<br>
+        return name;<br>
+    }<br>
+<br>
+    public void setName(String name) {<br>
+        <a href="http://this.name" target="_blank">this.name</a> = name;<br>
+    }<br>
+<br>
+    public String getDescription() {<br>
+        return description;<br>
+    }<br>
+<br>
+    public void setDescription(String description) {<br>
+        this.description = description;<br>
+    }<br>
+<br>
+    public String getId() {<br>
+        return id;<br>
+    }<br>
+<br>
+    public void setId(String id) {<br>
+        <a href="http://this.id" target="_blank">this.id</a> = id;<br>
+    }<br>
+<br>
+    public String getType() {<br>
+        return type;<br>
+    }<br>
+<br>
+    public void setType(String type) {<br>
+        this.type = type;<br>
+    }<br>
+<br>
+}<br>
<br>
Added: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java?pathrev=144202" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java?pathrev=144202</a><br>



==============================================================================<br>
--- (empty file)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/UserInfo.java \
Fri Sep 28 05:35:12 2012<br> @@ -0,0 +1,73 @@<br>
+/*<br>
+ * Copyright 2005-2011 WSO2, Inc. (<a href="http://wso2.com" \
target="_blank">http://wso2.com</a>)<br> + *<br>
+ *    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+ *    you may not use this file except in compliance with the License.<br>
+ *    You may obtain a copy of the License at<br>
+ *<br>
+ *    <a href="http://www.apache.org/licenses/LICENSE-2.0" \
target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br> + *<br>
+ *    Unless required by applicable law or agreed to in writing, software<br>
+ *    distributed under the License is distributed on an &quot;AS IS&quot; \
BASIS,<br> + *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or \
implied.<br> + *    See the License for the specific language governing permissions \
and<br> + *    limitations under the License.<br>
+ */<br>
+<br>
+package org.wso2.carbon.appfactory.core.dto;<br>
+<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
+<br>
+/**<br>
+ * Holds information about a user. Refer {@link ApplicationEventsListener} for \
usage.<br> + */<br>
+public class UserInfo {<br>
+    /**<br>
+     * User id of the User<br>
+     */<br>
+    private String userName;<br>
+<br>
+<br>
+    public UserInfo(){<br>
+<br>
+    }<br>
+<br>
+    public UserInfo(String userName) {<br>
+        this.userName = userName;<br>
+    }<br>
+<br>
+    public String getUserName() {<br>
+        return userName;<br>
+    }<br>
+<br>
+    public void setUserName(String userName) {<br>
+        this.userName = userName;<br>
+    }<br>
+<br>
+    @Override<br>
+    public int hashCode() {<br>
+        final int prime = 31;<br>
+        int result = 1;<br>
+        result = prime * result + ((userName == null) ? 0 : \
userName.hashCode());<br> +        return result;<br>
+    }<br>
+<br>
+    @Override<br>
+    public boolean equals(Object obj) {<br>
+        if (this == obj)<br>
+            return true;<br>
+        if (obj == null)<br>
+            return false;<br>
+        if (getClass() != obj.getClass())<br>
+            return false;<br>
+        UserInfo other = (UserInfo) obj;<br>
+        if (userName == null) {<br>
+            if (other.userName != null)<br>
+                return false;<br>
+        } else if (!userName.equals(other.userName))<br>
+            return false;<br>
+        return true;<br>
+    }<br>
+<br>
+<br>
+}<br>
<br>
Added: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java?pathrev=144202" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java?pathrev=144202</a><br>



==============================================================================<br>
--- (empty file)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.core/1.0.2/src/main/java/org/wso2/carbon/appfactory/core/dto/Version.java \
Fri Sep 28 05:35:12 2012<br> @@ -0,0 +1,67 @@<br>
+/*<br>
+ * Copyright 2005-2011 WSO2, Inc. (<a href="http://wso2.com" \
target="_blank">http://wso2.com</a>)<br> + *<br>
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at<br>
+ *<br>
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0" \
target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br> + *<br>
+ * Unless required by applicable law or agreed to in writing, software<br>
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+ * See the License for the specific language governing permissions and<br>
+ * limitations under the License.<br>
+ */<br>
+<br>
+package org.wso2.carbon.appfactory.core.dto;<br>
+<br>
+import org.wso2.carbon.appfactory.core.ApplicationEventsListener;<br>
+<br>
+/**<br>
+ * Holds information about a version. Refer {@link ApplicationEventsListener} for \
usage.<br> + */<br>
+public class Version {<br>
+    private String id;<br>
+<br>
+    public Version() {<br>
+    }<br>
+<br>
+    public Version(String id) {<br>
+        <a href="http://this.id" target="_blank">this.id</a> = id;<br>
+    }<br>
+<br>
+    public String getId() {<br>
+        return id;<br>
+    }<br>
+<br>
+    public void setVersion(String version) {<br>
+        <a href="http://this.id" target="_blank">this.id</a> = version;<br>
+    }<br>
+<br>
+    @Override<br>
+    public int hashCode() {<br>
+        final int prime = 31;<br>
+        int result = 1;<br>
+        result = prime * result + ((id == null) ? 0 : id.hashCode());<br>
+        return result;<br>
+    }<br>
+<br>
+    @Override<br>
+    public boolean equals(Object obj) {<br>
+        if (this == obj)<br>
+            return true;<br>
+        if (obj == null)<br>
+            return false;<br>
+        if (getClass() != obj.getClass())<br>
+            return false;<br>
+        Version other = (Version) obj;<br>
+        if (id == null) {<br>
+            if (<a href="http://other.id" target="_blank">other.id</a> != null)<br>
+                return false;<br>
+        } else if (!id.equals(<a href="http://other.id" \
target="_blank">other.id</a>))<br> +            return false;<br>
+        return true;<br>
+    }<br>
+<br>
+}<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.jenkins.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.jenkins.build/1.0.2/src/main/java/org/wso2/car \
bon/appfactory/jenkins/build/JenkinsCISystemDriver.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.jenkins.build/1.0.2/src/main/java/org/wso2/c \
arbon/appfactory/jenkins/build/JenkinsCISystemDriver.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.je \
nkins.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.je \
nkins.build/1.0.2/src/main/java/org/wso2/carbon/appfactory/jenkins/build/JenkinsCISystemDriver.java \
Fri Sep 28 05:35:12 2012<br>


@@ -88,7 +88,7 @@<br>
<br>
         // TODO : Hard coded application extension here. in future this could be \
either &#39;car&#39;or &#39;war&#39;<br>  // and will be selected by user<br>
-<br>
+<br>
         this.connector.createJob(getJobName(applicationId, version, revision), \
parameters);<br> <br>
     }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/pom.xml \
Fri Sep 28 05:35:12 2012<br> @@ -70,7 +70,7 @@<br>
             &lt;groupId&gt;org.apache.ws.commons.axiom.wso2&lt;/groupId&gt;<br>
             &lt;artifactId&gt;axiom&lt;/artifactId&gt;<br>
             &lt;version&gt;1.2.11.wso2v2&lt;/version&gt;<br>
-                       &lt;scope&gt;provided&lt;/scope&gt;<br>
+           &lt;scope&gt;provided&lt;/scope&gt;<br>
         &lt;/dependency&gt;<br>
         &lt;dependency&gt;<br>
             &lt;groupId&gt;commons-httpclient.wso2&lt;/groupId&gt;<br>
@@ -102,6 +102,11 @@<br>
             &lt;artifactId&gt;maven-invoker&lt;/artifactId&gt;<br>
             &lt;version&gt;2.0.11.wso2v1&lt;/version&gt;<br>
         &lt;/dependency&gt;<br>
+        &lt;dependency&gt;<br>
+            &lt;groupId&gt;org.wso2.carbon&lt;/groupId&gt;<br>
+            &lt;artifactId&gt;org.wso2.carbon.appfactory.utilities&lt;/artifactId&gt;<br>
 +            &lt;version&gt;1.0.2&lt;/version&gt;<br>
+        &lt;/dependency&gt;<br>
     &lt;/dependencies&gt;<br>
     &lt;repositories&gt;<br>
         &lt;repository&gt;<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.repository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/org \
/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/o \
rg/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.re \
pository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.re \
pository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/client/SCMClient.java \
Fri Sep 28 05:35:12 2012<br>


@@ -17,6 +17,9 @@<br>
<br>
 import org.apache.commons.logging.Log;<br>
 import org.apache.commons.logging.LogFactory;<br>
+import org.apache.maven.model.Model;<br>
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;<br>
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;<br>
 import org.apache.maven.scm.ScmException;<br>
 import org.apache.maven.scm.ScmFileSet;<br>
 import org.apache.maven.scm.ScmResult;<br>
@@ -35,12 +38,16 @@<br>
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;<br>
  import org.codehaus.plexus.embed.Embedder;<br>
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryMgtException;<br>
+import org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor;<br>
 import org.wso2.carbon.utils.CarbonUtils;<br>
 import  org.apache.commons.io.FileUtils;<br>
<br>
 import java.io.File;<br>
+import java.io.FileInputStream;<br>
+import java.io.FileWriter;<br>
 import java.io.IOException;<br>
 import java.util.ArrayList;<br>
+import java.util.List;<br>
<br>
 /**<br>
  * Repository client that wrapping maven SCM plugin<br>
@@ -146,6 +153,8 @@<br>
         try {<br>
             CheckOutScmResult checkOutScmResult = \
                scmManager.checkOut(repository,<br>
                                       new ScmFileSet(checkOutDirectory), new \
ScmRevision(revision));<br> +            AppVersionStrategyExecutor exec = \
org.wso2.carbon.appfactory.repository.mgt.util.Util.getVersionStrategyExecutor();<br> \
+            exec.doVersion(version, checkOutDirectory);<br>  if \
                (checkOutScmResult.getProviderMessage() == null) {<br>
                 result = scmManager.branch(repository, new \
ScmFileSet(checkOutDirectory), version);<br> <br>
@@ -160,8 +169,6 @@<br>
         return processResult(result,checkOutDirectory);<br>
     }<br>
<br>
-<br>
-<br>
     public boolean tag(String baseURL, String version, String revision)<br>
             throws RepositoryMgtException {<br>
         TagScmResult result = null;<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.repository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java<br>



URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/org \
/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/o \
rg/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.re \
pository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java \
(original)<br>


+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.re \
pository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/internal/RepositoryMgtServiceComponent.java \
Fri Sep 28 05:35:12 2012<br>


@@ -28,21 +28,27 @@<br>
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryProvider;<br>
 import org.wso2.carbon.appfactory.repository.mgt.service.RepositoryAuthenticationService;<br>
  import org.wso2.carbon.appfactory.repository.mgt.util.Util;<br>
+import org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor;<br>
 import org.wso2.carbon.user.core.service.RealmService;<br>
<br>
 import java.lang.reflect.Constructor;<br>
<br>
 /**<br>
- * @scr.component name=&quot;org.wso2.carbon.appfactory.repository.mgt&quot; \
immediate=&quot;true&quot;<br> + * @scr.component \
name=&quot;org.wso2.carbon.appfactory.repository.mgt&quot;<br> + *                \
                immediate=&quot;true&quot;<br>
  * @scr.reference name=&quot;appfactory.configuration&quot; interface=<br>
- * &quot;org.wso2.carbon.appfactory.common.AppFactoryConfiguration&quot;<br>
- * cardinality=&quot;1..1&quot; policy=&quot;dynamic&quot;<br>
- * bind=&quot;setAppFactoryConfiguration&quot;<br>
- * unbind=&quot;unsetAppFactoryConfiguration&quot;<br>
+ *                &quot;org.wso2.carbon.appfactory.common.AppFactoryConfiguration&quot;<br>
 + *                cardinality=&quot;1..1&quot; policy=&quot;dynamic&quot;<br>
+ *                bind=&quot;setAppFactoryConfiguration&quot;<br>
+ *                unbind=&quot;unsetAppFactoryConfiguration&quot;<br>
  * @scr.reference name=&quot;user.realmservice.default&quot;<br>
- * interface=&quot;org.wso2.carbon.user.core.service.RealmService&quot;<br>
- * cardinality=&quot;1..1&quot; policy=&quot;dynamic&quot; \
                bind=&quot;setRealmService&quot;<br>
- * unbind=&quot;unsetRealmService&quot;<br>
+ *                interface=&quot;org.wso2.carbon.user.core.service.RealmService&quot;<br>
 + *                cardinality=&quot;1..1&quot; policy=&quot;dynamic&quot; \
bind=&quot;setRealmService&quot;<br> + *                \
unbind=&quot;unsetRealmService&quot;<br> + * @scr.reference \
name=&quot;appversion.executor&quot;<br> + *                \
interface=&quot;org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor&quot;<br>
 + *                cardinality=&quot;1..1&quot; policy=&quot;dynamic&quot; \
bind=&quot;setAppVersionStrategyExecutor&quot;<br> + *                \
                unbind=&quot;unsetAppVersionStrategyExecutor&quot;<br>
  */<br>
 public class RepositoryMgtServiceComponent {<br>
     Log log = LogFactory.getLog(RepositoryMgtServiceComponent.class);<br>
@@ -65,6 +71,14 @@<br>
         Util.setRealmService(null);<br>
     }<br>
<br>
+    protected void setAppVersionStrategyExecutor(AppVersionStrategyExecutor \
versionExecutor) {<br> +        Util.setVersionStrategyExecutor(versionExecutor);<br>
+    }<br>
+<br>
+    protected void unsetAppVersionStrategyExecutor(AppVersionStrategyExecutor \
versionExecutor) {<br> +        Util.setVersionStrategyExecutor(null);<br>
+    }<br>
+<br>
     protected void activate(ComponentContext context) {<br>
<br>
          if (log.isDebugEnabled()) {<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.repository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/org \
/wso2/carbon/appfactory/repository/mgt/util/Util.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.repository.mgt.service/1.0.1/src/main/java/o \
rg/wso2/carbon/appfactory/repository/mgt/util/Util.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.re \
pository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.re \
pository.mgt.service/1.0.1/src/main/java/org/wso2/carbon/appfactory/repository/mgt/util/Util.java \
Fri Sep 28 05:35:12 2012<br> @@ -17,8 +17,8 @@<br>
 package org.wso2.carbon.appfactory.repository.mgt.util;<br>
<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;<br>
-import org.wso2.carbon.appfactory.core.RevisionControlDriver;<br>
 import org.wso2.carbon.appfactory.repository.mgt.RepositoryProvider;<br>
+import org.wso2.carbon.appfactory.utilities.version.AppVersionStrategyExecutor;<br>
 import org.wso2.carbon.user.core.service.RealmService;<br>
<br>
 import java.util.HashMap;<br>
@@ -31,6 +31,7 @@<br>
 public class Util {<br>
     private static AppFactoryConfiguration  configuration=null;<br>
     private  static RealmService realmService;<br>
+    private static AppVersionStrategyExecutor versionStrategyExecutor;<br>
     private static Map&lt;String,RepositoryProvider&gt; repositoryProviderMap=new \
HashMap&lt;String, RepositoryProvider&gt;();;<br> <br>
     public static AppFactoryConfiguration getConfiguration() {<br>
@@ -55,4 +56,15 @@<br>
     public static void setRepositoryProvider(String type,RepositoryProvider \
provider) {<br>  Util.repositoryProviderMap.put(type,provider);<br>
     }<br>
+<br>
+       public static AppVersionStrategyExecutor getVersionStrategyExecutor() {<br>
+               return versionStrategyExecutor;<br>
+       }<br>
+<br>
+       public static void setVersionStrategyExecutor(<br>
+                       AppVersionStrategyExecutor versionStrategyExecutor) {<br>
+               Util.versionStrategyExecutor = versionStrategyExecutor;<br>
+       }<br>
+<br>
+<br>
 }<br>
<br>
Modified: carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfact \
ory.utilities/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java<br>
                
URL: <a href="http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/component \
s/appfactory/org.wso2.carbon.appfactory.utilities/1.0.2/src/main/java/org/wso2/carbon/ \
appfactory/utilities/project/ProjectUtils.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff" \
target="_blank">http://wso2.org/svn/browse/wso2/carbon/platform/branches/4.0.0/compone \
nts/appfactory/org.wso2.carbon.appfactory.utilities/1.0.2/src/main/java/org/wso2/carbo \
n/appfactory/utilities/project/ProjectUtils.java?rev=144202&amp;r1=144201&amp;r2=144202&amp;view=diff</a><br>



==============================================================================<br>
--- carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ut \
ilities/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java \
                (original)<br>
+++ carbon/platform/branches/4.0.0/components/appfactory/org.wso2.carbon.appfactory.ut \
ilities/1.0.2/src/main/java/org/wso2/carbon/appfactory/utilities/project/ProjectUtils.java \
Fri Sep 28 05:35:12 2012<br> @@ -13,14 +13,19 @@<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConfiguration;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryConstants;<br>
 import org.wso2.carbon.appfactory.common.AppFactoryException;<br>
+import org.wso2.carbon.appfactory.core.dto.Application;<br>
+import org.wso2.carbon.appfactory.core.dto.Version;<br>
 import org.wso2.carbon.appfactory.utilities.internal.ServiceReferenceHolder;<br>
+import org.wso2.carbon.governance.api.exception.GovernanceException;<br>
 import org.wso2.carbon.governance.api.generic.GenericArtifactManager;<br>
 import org.wso2.carbon.governance.api.generic.dataobjects.GenericArtifactImpl;<br>
 import org.wso2.carbon.governance.api.util.GovernanceUtils;<br>
+import org.wso2.carbon.registry.core.Collection;<br>
 import org.wso2.carbon.registry.core.Resource;<br>
 import org.wso2.carbon.registry.core.exceptions.RegistryException;<br>
 import org.wso2.carbon.registry.core.service.RegistryService;<br>
 import org.wso2.carbon.registry.core.session.UserRegistry;<br>
+import org.wso2.carbon.registry.core.utils.RegistryUtils;<br>
<br>
 import java.io.File;<br>
 import java.util.ArrayList;<br>
@@ -143,22 +148,180 @@<br>
         return optsBuilder.toString();*/<br>
     }<br>
<br>
-    public static String getApplicationType(String applicationId) throws \
AppFactoryException{<br> +    /**<br>
+     * Returns the type of the application given the application Id<br>
+     *<br>
+     * @param applicationId<br>
+     *            Id of the application<br>
+     * @return the type<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs.<br>
+     */<br>
+    public static String getApplicationType(String applicationId) throws \
AppFactoryException {<br> +<br>
+        GenericArtifactImpl artifact = getApplicationArtifact(applicationId);<br>
+<br>
+        if (artifact == null) {<br>
+            String errorMsg =<br>
+                              String.format(&quot;Unable to find applcation \
information for id : %s&quot;,<br> +                                            \
applicationId);<br> +            log.error(errorMsg);<br>
+            throw new AppFactoryException(errorMsg);<br>
+<br>
+        }<br>
+<br>
+        try {<br>
+            return artifact.getAttribute(&quot;application_type&quot;);<br>
+        } catch (RegistryException e) {<br>
+            String errorMsg =<br>
+                              String.format(&quot;Unable to find the application \
type for applicaiton id: %s&quot;,<br> +                                            \
applicationId);<br> +            log.error(errorMsg, e);<br>
+            throw new AppFactoryException(errorMsg, e);<br>
+        }<br>
+    }<br>
+<br>
+    /**<br>
+     * Provides information about an application.<br>
+     *<br>
+     * @param applicationId<br>
+     *            id of the application<br>
+     * @return {@link Application}<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs<br>
+     */<br>
+    public static Application getApplicationInfo(String applicationId) throws \
AppFactoryException {<br> +<br>
+        GenericArtifactImpl artifact = getApplicationArtifact(applicationId);<br>
+<br>
+        if (artifact == null) {<br>
+            String errorMsg =<br>
+                              String.format(&quot;Unable to find applcation \
information for id : %s&quot;,<br> +                                            \
applicationId);<br> +            log.error(errorMsg);<br>
+            throw new AppFactoryException(errorMsg);<br>
+<br>
+        }<br>
+        Application appInfo = null;<br>
+<br>
+        try {<br>
+            appInfo =<br>
+                      new \
Application(artifact.getAttribute(&quot;application_key&quot;),<br> +                 \
artifact.getAttribute(&quot;application_name&quot;),<br> +                            \
artifact.getAttribute(&quot;application_type&quot;),<br> +                            \
artifact.getAttribute(&quot;application_description&quot;));<br> +        } catch \
(GovernanceException e) {<br> +            String errorMsg =<br>
+                              String.format(&quot;Unable to extract information for \
application id : %s&quot;,<br> +                                            \
applicationId);<br> +            log.error(errorMsg);<br>
+            throw new AppFactoryException(errorMsg);<br>
+        }<br>
+<br>
+        return appInfo;<br>
+    }<br>
+<br>
+    /**<br>
+     * Returns all available versions of a application<br>
+     *<br>
+     * @param applicationId<br>
+     *            Id of the application<br>
+     * @return an Array of {@link Version}<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurres<br>
+     */<br>
+    public static Version[] getVersions(String applicationId) throws \
AppFactoryException {<br> +        List&lt;Version&gt; versions = new \
ArrayList&lt;Version&gt;();<br>  try {<br>
-            RegistryService registryService = \
ServiceReferenceHolder.getInstance().getRegistryService();<br> +            \
RegistryService registryService =<br> +                                              \
ServiceReferenceHolder.getInstance()<br> +                                            \
                .getRegistryService();<br>
             UserRegistry userRegistry = \
                registryService.getGovernanceSystemRegistry();<br>
-            Resource resource = \
                userRegistry.get(AppFactoryConstants.REGISTRY_APPLICATION_PATH +<br>
-                                                 File.separator + applicationId + \
File.separator + &quot;appinfo&quot;);<br> +            // child nodes of this will \
contains folders for all life cycles (<br> +            // e.g. QA, Dev, Prod)<br>
+            Resource application =<br>
+                                   \
userRegistry.get(AppFactoryConstants.REGISTRY_APPLICATION_PATH +<br> +                \
File.separator + applicationId);<br> +<br>
+            if (application != null &amp;&amp; application instanceof Collection) \
{<br> +<br>
+                // Contains paths to life cycles (.e.g .../&lt;appid&gt;/dev,<br>
+                // .../&lt;appid&gt;/qa , .../&lt;appid&gt;/prod )<br>
+                String[] definedLifeCyclePaths = ((Collection) \
application).getChildren();<br> +<br>
+                for (String lcPath : definedLifeCyclePaths) {<br>
+<br>
+                    Resource versionsInLCResource = userRegistry.get(lcPath);<br>
+                    if (versionsInLCResource != null &amp;&amp; versionsInLCResource \
instanceof Collection) {<br> +<br>
+                        // contains paths to a versions (e.g.<br>
+                        // .../&lt;appid&gt;/&lt;lifecycle&gt;/trunk,<br>
+                        // .../&lt;appid&gt;/&lt;lifecycle&gt;/1.0.1 )<br>
+                        String[] versionPaths = ((Collection) \
versionsInLCResource).getChildren();<br> +<br>
+                        for (String versionPath : versionPaths) {<br>
+                            // extract the name of the resource ( which will be<br>
+                            // the version id)<br>
+                            String versionId = \
RegistryUtils.getResourceName(versionPath);<br> +                            Version \
version = new Version(versionId);<br> +                            \
versions.add(version);<br> +                        }<br>
+                    }<br>
+<br>
+                }<br>
+<br>
+            }<br>
+<br>
+        } catch (RegistryException e) {<br>
+            String errorMsg =<br>
+                              String.format(&quot;Unable to load the application \
information for applicaiton id: %s&quot;,<br> +                                       \
applicationId);<br> +            log.error(errorMsg, e);<br>
+            throw new AppFactoryException(errorMsg, e);<br>
+        }<br>
+<br>
+        return versions.toArray(new Version[versions.size()]);<br>
+    }<br>
+<br>
+    /**<br>
+     * A Util method to load an Application artifact from the registry.<br>
+     *<br>
+     * @param applicationId<br>
+     *            the application Id<br>
+     * @return a {@link GenericArtifactImpl} representing the application or<br>
+     *         null if application (by the id is not in registry)<br>
+     * @throws AppFactoryException<br>
+     *             if an error occurs.<br>
+     */<br>
+    private static GenericArtifactImpl getApplicationArtifact(String \
applicationId)<br> +                                                                  \
throws AppFactoryException {<br> +        GenericArtifactImpl artifact = null;<br>
+        try {<br>
+<br>
+            RegistryService registryService =<br>
+                                              \
ServiceReferenceHolder.getInstance()<br> +                                            \
.getRegistryService();<br> +            UserRegistry userRegistry = \
registryService.getGovernanceSystemRegistry();<br> +            Resource resource \
=<br> +                                \
userRegistry.get(AppFactoryConstants.REGISTRY_APPLICATION_PATH +<br> +                \
File.separator + applicationId + File.separator +<br> +                               \
&quot;appinfo&quot;);<br>  GovernanceUtils.loadGovernanceArtifacts(userRegistry);<br>
-            GenericArtifactManager artifactManager = new \
                GenericArtifactManager(userRegistry, &quot;application&quot;);<br>
-            //GenericArtifact artifact = \
                artifactManager.getGenericArtifact(resource.getUUID());<br>
-            GenericArtifactImpl artifact = (GenericArtifactImpl) \
                artifactManager.getGenericArtifact(resource.getUUID());<br>
-            return artifact.getAttribute(&quot;application_type&quot;);<br>
+            GenericArtifactManager artifactManager =<br>
+                                                     new \
GenericArtifactManager(userRegistry,<br> +                                            \
&quot;application&quot;);<br> +            // GenericArtifact artifact =<br>
+            // artifactManager.getGenericArtifact(resource.getUUID());<br>
+            artifact = (GenericArtifactImpl) \
artifactManager.getGenericArtifact(resource.getUUID());<br> +<br>
         } catch (RegistryException e) {<br>
             String errorMsg =<br>
-                    String.format(&quot;Unable to find the application type for \
applicaiton id: %s&quot;, applicationId);<br> +                              \
String.format(&quot;Unable to load the application information for applicaiton id: \
%s&quot;,<br> +                                            applicationId);<br>
             log.error(errorMsg, e);<br>
             throw new AppFactoryException(errorMsg, e);<br>
         }<br>
+<br>
+        return artifact;<br>
     }<br>
 }<br>
_______________________________________________<br>
Commits mailing list<br>
<a href="mailto:Commits@wso2.org">Commits@wso2.org</a><br>
<a href="http://wso2.org/cgi-bin/mailman/listinfo/commits" \
target="_blank">http://wso2.org/cgi-bin/mailman/listinfo/commits</a><br> \
</div><br><br clear="all"><br>-- <br><br>Thanks &amp; \
regards,<br>Nirmal<br><br>Software Engineer- Platform Technologies Team, WSO2 \
Inc.<br>Mobile: +94715779733<br>Blog: <a href="http://nirmalfdo.blogspot.com/" \
target="_blank">http://nirmalfdo.blogspot.com/</a><br>



_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic