Merge branch 'application-mgt-new' of https://gitlab.com/tcdlpds/carbon-device-mgt into application-mgt-new

feature/appm-store/pbac
Jayasanka 6 years ago
commit e1589575e9

2
.gitignore vendored

@ -29,7 +29,9 @@ components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/r
components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package-lock.json components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package-lock.json
components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/npm-debug.log components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/npm-debug.log
components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/dist/ components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/dist/
components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/tmp/
components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/node_modules/ components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/node_modules/
components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/dist/ components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/dist/
components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package-lock.json components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package-lock.json
components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/tmp/

@ -80,5 +80,4 @@ public interface ConfigRetrieveAPI {
response = ErrorResponse.class) response = ErrorResponse.class)
}) })
Response getUiConfig(); Response getUiConfig();
} }

@ -21,6 +21,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.api.services.ConfigRetrieveAPI; import org.wso2.carbon.device.application.mgt.api.services.ConfigRetrieveAPI;
import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler; import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler;
import org.wso2.carbon.device.application.mgt.core.util.APIUtil; import org.wso2.carbon.device.application.mgt.core.util.APIUtil;
@ -46,7 +47,11 @@ public class ConfigRetrieveAPIImpl implements ConfigRetrieveAPI {
public Response getUiConfig() { public Response getUiConfig() {
AppmDataHandler dataHandler = APIUtil.getDataHandler(); AppmDataHandler dataHandler = APIUtil.getDataHandler();
UIConfiguration uiConfiguration = dataHandler.getUIConfiguration(); UIConfiguration uiConfiguration = dataHandler.getUIConfiguration();
if (uiConfiguration == null){
String msg = "UI configuration is not initiated.";
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
return Response.status(Response.Status.OK).entity(uiConfiguration).build(); return Response.status(Response.Status.OK).entity(uiConfiguration).build();
} }
} }

@ -23,6 +23,6 @@ package org.wso2.carbon.device.application.mgt.common;
* States of the Application. * States of the Application.
*/ */
public enum AppLifecycleState { public enum AppLifecycleState {
CREATED, IN_REVIEW, PUBLISHED, APPROVED, UNPUBLISHED, REJECTED, DEPRECATED, REMOVED CREATED, IN_REVIEW, PUBLISHED, APPROVED, BLOCKED, REJECTED, DEPRECATED, RETIRED
} }

@ -1,4 +1,4 @@
package org.wso2.carbon.device.application.mgt.core.lifecycle.config; package org.wso2.carbon.device.application.mgt.common.config;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
@ -19,6 +19,7 @@ public class LifecycleState {
private boolean isAppUpdatable; private boolean isAppUpdatable;
private boolean isInitialState; private boolean isInitialState;
private boolean isEndState; private boolean isEndState;
private boolean isDeletableState;
@XmlAttribute(name = "name") @XmlAttribute(name = "name")
public String getName() { public String getName() {
@ -84,4 +85,8 @@ public class LifecycleState {
this.isEndState = isEndState; this.isEndState = isEndState;
} }
@XmlElement(name = "IsDeletableState")
public boolean isDeletableState() { return isDeletableState; }
public void setDeletableState(boolean deletableState) { isDeletableState = deletableState; }
} }

@ -86,7 +86,7 @@ public class ApplicationDTO {
@ApiModelProperty(name = "status", @ApiModelProperty(name = "status",
value = "Application status", value = "Application status",
required = true, required = true,
example = "REMOVED, ACTIVE") example = "RETIRED, ACTIVE")
private String status; private String status;
@ApiModelProperty(name = "applicationReleaseDTOs", @ApiModelProperty(name = "applicationReleaseDTOs",

@ -0,0 +1,68 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.application.mgt.common.dto;
import java.sql.Timestamp;
public class DeviceSubscriptionDTO {
private int id;
private String subscribedBy;
private Timestamp subscribedTimestamp;
private boolean isUnsubscribed;
private String unsubscribedBy;
private Timestamp unsubscribedTimestapm;
private String subscribedFrom;
private int deviceId;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getSubscribedBy() { return subscribedBy; }
public void setSubscribedBy(String subscribedBy) { this.subscribedBy = subscribedBy; }
public Timestamp getSubscribedTimestamp() { return subscribedTimestamp; }
public void setSubscribedTimestamp(Timestamp subscribedTimestamp) {
this.subscribedTimestamp = subscribedTimestamp;
}
public boolean isUnsubscribed() { return isUnsubscribed; }
public void setUnsubscribed(boolean unsubscribed) { isUnsubscribed = unsubscribed; }
public String getUnsubscribedBy() { return unsubscribedBy; }
public void setUnsubscribedBy(String unsubscribedBy) { this.unsubscribedBy = unsubscribedBy; }
public Timestamp getUnsubscribedTimestapm() { return unsubscribedTimestapm; }
public void setUnsubscribedTimestapm(Timestamp unsubscribedTimestapm) {
this.unsubscribedTimestapm = unsubscribedTimestapm;
}
public String getSubscribedFrom() { return subscribedFrom; }
public void setSubscribedFrom(String subscribedFrom) { this.subscribedFrom = subscribedFrom; }
public int getDeviceId() { return deviceId; }
public void setDeviceId(int deviceId) { this.deviceId = deviceId; }
}

@ -69,14 +69,21 @@ public interface ApplicationManager {
*/ */
void deleteApplication(int applicationId) throws ApplicationManagementException; void deleteApplication(int applicationId) throws ApplicationManagementException;
/**
* Retire an application identified by the unique ID.
*
* @param applicationId ID for tha application
* @throws ApplicationManagementException ApplicationDTO Management Exception
*/
void retireApplication(int applicationId) throws ApplicationManagementException;
/** /**
* Delete an application identified by the unique ID. * Delete an application identified by the unique ID.
* *
* @param applicationId ID of tha application
* @param releaseUuid UUID of tha application release * @param releaseUuid UUID of tha application release
* @throws ApplicationManagementException ApplicationDTO Management Exception * @throws ApplicationManagementException ApplicationDTO Management Exception
*/ */
String deleteApplicationRelease(int applicationId, String releaseUuid) throws ApplicationManagementException; void deleteApplicationRelease(String releaseUuid) throws ApplicationManagementException;
/** /**
* To get the applications based on the search filter. * To get the applications based on the search filter.

@ -17,10 +17,13 @@
package org.wso2.carbon.device.application.mgt.common.services; package org.wso2.carbon.device.application.mgt.common.services;
import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map;
public interface AppmDataHandler { public interface AppmDataHandler {
/** /**
@ -30,5 +33,7 @@ public interface AppmDataHandler {
*/ */
UIConfiguration getUIConfiguration(); UIConfiguration getUIConfiguration();
Map<String, LifecycleState> getLifecycleConfiguration() throws LifecycleManagementException;
InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException; InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException;
} }

@ -20,7 +20,7 @@ package org.wso2.carbon.device.application.mgt.core.config;
import org.wso2.carbon.device.application.mgt.common.config.RatingConfiguration; import org.wso2.carbon.device.application.mgt.common.config.RatingConfiguration;
import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
import org.wso2.carbon.device.application.mgt.core.lifecycle.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import java.util.List; import java.util.List;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;

@ -176,7 +176,7 @@ public interface ApplicationDAO {
* @param appId ID of the application. * @param appId ID of the application.
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/ */
void deleteApplication(int appId) throws ApplicationManagementDAOException; void retireApplication(int appId) throws ApplicationManagementDAOException;
/** /**
* To get the application count that satisfies gives search query. * To get the application count that satisfies gives search query.

@ -19,7 +19,6 @@
package org.wso2.carbon.device.application.mgt.core.dao; package org.wso2.carbon.device.application.mgt.core.dao;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.ApplicationReleaseArtifactPaths;
import org.wso2.carbon.device.application.mgt.common.Rating; import org.wso2.carbon.device.application.mgt.common.Rating;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
@ -112,10 +111,9 @@ public interface ApplicationReleaseDAO {
* To delete a particular release. * To delete a particular release.
* *
* @param id ID of the ApplicationDTO which the release need to be deleted. * @param id ID of the ApplicationDTO which the release need to be deleted.
* @param version Version of the ApplicationDTO Release
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/ */
void deleteRelease(int id, String version) throws ApplicationManagementDAOException; void deleteRelease(int id) throws ApplicationManagementDAOException;
/** /**
* To get release details of a specific application. * To get release details of a specific application.

@ -69,12 +69,12 @@ public interface LifecycleStateDAO {
throws LifeCycleManagementDAOException; throws LifeCycleManagementDAOException;
/** /**
* To delete a specific lifecycle state for application release. * To delete lifecycle state data of specific application release.
* @param identifier Id of the LifecycleStateDTO. * @param releaseId Id of the LifecycleStateDTO.
* *
* @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception.
*/ */
void deleteLifecycleState(int identifier) throws LifeCycleManagementDAOException; void deleteLifecycleStateByReleaseId(int releaseId) throws LifeCycleManagementDAOException;
/*** /***
* *

@ -20,6 +20,7 @@ package org.wso2.carbon.device.application.mgt.core.dao;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup;
@ -86,4 +87,8 @@ public interface SubscriptionDAO {
*/ */
void subscribeGroupToApplication(int tenantId, String subscribedBy, List<DeviceGroup> groupList, int appId, void subscribeGroupToApplication(int tenantId, String subscribedBy, List<DeviceGroup> groupList, int appId,
int releaseId) throws ApplicationManagementDAOException; int releaseId) throws ApplicationManagementDAOException;
List<DeviceSubscriptionDTO> getDeviceSubscriptions(int appReleaseId, int tenantId) throws
ApplicationManagementDAOException;
} }

@ -26,6 +26,7 @@ import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
@ -94,6 +95,31 @@ public class Util {
return applications; return applications;
} }
/**
* To create list of device subscription objects from the result set retrieved from the Database.
*
* @param rs ResultSet
* @return List of device subscriptions that is retrieved from the Database.
* @throws SQLException SQL Exception
* @throws JSONException JSONException.
*/
public static List<DeviceSubscriptionDTO> loadDeviceSubscriptions(ResultSet rs) throws SQLException {
List<DeviceSubscriptionDTO> deviceSubscriptionDTOS = new ArrayList<>();
while (rs.next()) {
DeviceSubscriptionDTO deviceSubscriptionDTO = new DeviceSubscriptionDTO();
deviceSubscriptionDTO.setId(rs.getInt("ID"));
deviceSubscriptionDTO.setSubscribedBy(rs.getString("SUBSCRIBED_BY"));
deviceSubscriptionDTO.setSubscribedTimestamp(rs.getTimestamp("SUBSCRIBED_AT"));
deviceSubscriptionDTO.setUnsubscribed(rs.getBoolean("IS_UNSUBSCRIBED"));
deviceSubscriptionDTO.setUnsubscribedBy(rs.getString("UNSUBSCRIBED_BY"));
deviceSubscriptionDTO.setUnsubscribedTimestapm(rs.getTimestamp("UNSUBSCRIBED_AT"));
deviceSubscriptionDTO.setSubscribedFrom(rs.getString("SUBSCRIBED_FROM"));
deviceSubscriptionDTO.setDeviceId(rs.getInt("DEVICE_ID"));
deviceSubscriptionDTOS.add(deviceSubscriptionDTO);
}
return deviceSubscriptionDTOS;
}
/** /**
* Populates {@link ApplicationReleaseDTO} object with the result obtained from the database. * Populates {@link ApplicationReleaseDTO} object with the result obtained from the database.
* *

@ -456,7 +456,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setString(1, releaseUuid); stmt.setString(1, releaseUuid);
stmt.setInt(2, tenantId); stmt.setInt(2, tenantId);
stmt.setString(3, AppLifecycleState.REMOVED.toString()); stmt.setString(3, AppLifecycleState.RETIRED.toString());
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
@ -619,14 +619,14 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
@Override @Override
public void deleteApplication(int appId) throws ApplicationManagementDAOException { public void retireApplication(int appId) throws ApplicationManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null; PreparedStatement stmt = null;
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
String sql = "UPDATE AP_APP SET STATUS = ? WHERE ID = ? "; String sql = "UPDATE AP_APP SET STATUS = ? WHERE ID = ? ";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setString(1, AppLifecycleState.REMOVED.toString()); stmt.setString(1, AppLifecycleState.RETIRED.toString());
stmt.setInt(2, appId); stmt.setInt(2, appId);
stmt.executeUpdate(); stmt.executeUpdate();

@ -490,30 +490,25 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
return applicationReleaseDTO; return applicationReleaseDTO;
} }
/** @Override
* To delete an application release. public void deleteRelease(int id) throws ApplicationManagementDAOException {
*
* @param id Id of the application Release.
* @param version version name of the application release.
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/
@Override public void deleteRelease(int id, String version) throws ApplicationManagementDAOException {
Connection connection; Connection connection;
PreparedStatement statement = null; PreparedStatement statement = null;
String sql = "DELETE FROM AP_APP_RELEASE WHERE ID = ? AND VERSION = ?"; String sql = "DELETE "
+ "FROM AP_APP_RELEASE "
+ "WHERE ID = ?";
try { try {
connection = this.getDBConnection(); connection = this.getDBConnection();
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
statement.setInt(1, id); statement.setInt(1, id);
statement.setString(2, version);
statement.executeUpdate(); statement.executeUpdate();
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException( throw new ApplicationManagementDAOException(
"Database connection exception while trying to delete the release with version " + version, e); "Database connection exception while trying to delete the release fore release ID: " + id, e);
} catch (SQLException e) { } catch (SQLException e) {
throw new ApplicationManagementDAOException( throw new ApplicationManagementDAOException(
"SQL exception while deleting the release with version " + version + ",while executing the query " "SQL exception while deleting the release for release ID: " + id + ",while executing the query sql"
+ "sql", e); , e);
} finally { } finally {
Util.cleanupResources(statement, null); Util.cleanupResources(statement, null);
} }

@ -193,23 +193,22 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif
} }
@Override @Override
public void deleteLifecycleState(int identifier) throws LifeCycleManagementDAOException { public void deleteLifecycleStateByReleaseId(int releaseId) throws LifeCycleManagementDAOException {
Connection conn = null; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
String sql = "DELETE FROM AP_APP_LIFECYCLE_STATE WHERE ID = ?"; String sql = "DELETE FROM " +
stmt = conn.prepareStatement(sql); "AP_APP_LIFECYCLE_STATE " +
stmt.setInt(1, identifier); "WHERE AP_APP_RELEASE_ID = ?";
stmt.executeUpdate(); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, releaseId);
stmt.executeUpdate();
}
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (SQLException e) { } catch (SQLException e) {
throw new LifeCycleManagementDAOException("Error occurred while deleting lifecycle: " + identifier, e); throw new LifeCycleManagementDAOException("Error occurred while deleting lifecycle for application "
} finally { + "release ID: " + releaseId, e);
Util.cleanupResources(stmt, rs);
} }
} }

@ -19,16 +19,21 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.subscription;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException;
import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO;
import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.common.Util;
import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException;
import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
@ -44,7 +49,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
conn = this.getDBConnection(); conn = this.getDBConnection();
long time = System.currentTimeMillis() / 1000; long time = System.currentTimeMillis() / 1000;
String sql = "INSERT INTO AP_DEVICE_SUBSCRIPTION(TENANT_ID, SUBSCRIBED_BY, SUBSCRIBED_TIMESTAMP, " String sql = "INSERT INTO AP_DEVICE_SUBSCRIPTION(TENANT_ID, SUBSCRIBED_BY, SUBSCRIBED_TIMESTAMP, "
+ "DM_DEVICE_ID, AP_APP_RELEASE_ID, AP_APP_ID, INSTALL_STATUS) VALUES (?, ?, ?, ?, ?, ?)"; + "DM_DEVICE_ID, AP_APP_RELEASE_ID, AP_APP_ID, INSTALL_STATUS) VALUES (?, ?, ?, ?, ?, ?, ?)";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
for (Device device : deviceList) { for (Device device : deviceList) {
stmt.setInt(1, tenantId); stmt.setInt(1, tenantId);
@ -168,4 +173,50 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc
Util.cleanupResources(stmt, null); Util.cleanupResources(stmt, null);
} }
} }
@Override
public List<DeviceSubscriptionDTO> getDeviceSubscriptions(int appReleaseId, int tenantId) throws
ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Getting device subscriptions for the application release id " + appReleaseId
+ " from the database");
}
Connection conn;
try {
conn = this.getDBConnection();
String sql = "SELECT "
+ "DS.ID AS ID, "
+ "DS.SUBSCRIBED_BY AS SUBSCRIBED_BY, "
+ "DS.SUBSCRIBED_TIMESTAMP AS SUBSCRIBED_AT, "
+ "DS.UNSUBSCRIBED AS IS_UNSUBSCRIBED, "
+ "DS.UNSUBSCRIBED_BY AS UNSUBSCRIBED_BY, "
+ "DS.UNSUBSCRIBED_TIMESTAMP AS UNSUBSCRIBED_AT, "
+ "DS.SUBSCRIBED_FROM AS SUBSCRIBED_FROM, "
+ "DS.DM_DEVICE_ID AS DEVICE_ID "
+ "FROM AP_DEVICE_SUBSCRIPTION DS "
+ "WHERE DS.AP_APP_RELEASE_ID = ? AND DS.TENANT_ID=?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, appReleaseId);
stmt.setInt(2, tenantId);
try (ResultSet rs = stmt.executeQuery()) {
if (log.isDebugEnabled()) {
log.debug("Successfully retrieved device subscriptions for application release id "
+ appReleaseId);
}
return Util.loadDeviceSubscriptions(rs);
}
}
} catch (SQLException e) {
String msg =
"Error occurred while getting device subscription data for application ID: " + appReleaseId + ".";
log.error(msg);
throw new ApplicationManagementDAOException(msg, e);
} catch (DBConnectionException e) {
String msg =
"Error occurred while obtaining the DB connection for getting device subscription for applicationID: "
+ appReleaseId + ".";
log.error(msg);
throw new ApplicationManagementDAOException(msg, e);
}
}
} }

@ -21,7 +21,7 @@ import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManage
/** /**
* Exception thrown during the ApplicationDTO Management DAO operations. * Exception thrown during the ApplicationDTO Management DAO operations.
*/ */
public class ApplicationManagementDAOException extends ApplicationManagementException { public class ApplicationManagementDAOException extends Exception {
public ApplicationManagementDAOException(String message, Throwable throwable) { public ApplicationManagementDAOException(String message, Throwable throwable) {
super(message, throwable); super(message, throwable);

@ -27,7 +27,6 @@ import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.CarbonConstants;
import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.CarbonContext;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.AppLifecycleState;
import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact; import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact;
import org.wso2.carbon.device.application.mgt.common.ApplicationInstaller; import org.wso2.carbon.device.application.mgt.common.ApplicationInstaller;
import org.wso2.carbon.device.application.mgt.common.Pagination; import org.wso2.carbon.device.application.mgt.common.Pagination;
@ -39,6 +38,7 @@ import org.wso2.carbon.device.application.mgt.common.ApplicationSubscriptionType
import org.wso2.carbon.device.application.mgt.common.ApplicationType; import org.wso2.carbon.device.application.mgt.common.ApplicationType;
import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO; import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO;
import org.wso2.carbon.device.application.mgt.common.Filter; import org.wso2.carbon.device.application.mgt.common.Filter;
import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO;
import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
@ -59,6 +59,7 @@ import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO;
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO;
import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO; import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO;
import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO;
import org.wso2.carbon.device.application.mgt.core.dao.VisibilityDAO; import org.wso2.carbon.device.application.mgt.core.dao.VisibilityDAO;
import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.common.Util;
@ -109,6 +110,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
private ApplicationDAO applicationDAO; private ApplicationDAO applicationDAO;
private ApplicationReleaseDAO applicationReleaseDAO; private ApplicationReleaseDAO applicationReleaseDAO;
private LifecycleStateDAO lifecycleStateDAO; private LifecycleStateDAO lifecycleStateDAO;
private SubscriptionDAO subscriptionDAO;
private LifecycleStateManager lifecycleStateManager; private LifecycleStateManager lifecycleStateManager;
public ApplicationManagerImpl() { public ApplicationManagerImpl() {
@ -121,6 +123,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO(); this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO();
this.lifecycleStateDAO = ApplicationManagementDAOFactory.getLifecycleStateDAO(); this.lifecycleStateDAO = ApplicationManagementDAOFactory.getLifecycleStateDAO();
this.applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO(); this.applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO();
this.subscriptionDAO = ApplicationManagementDAOFactory.getSubscriptionDAO();
} }
/*** /***
@ -869,6 +872,10 @@ public class ApplicationManagerImpl implements ApplicationManager {
String msg = "User-store exception while getting application with the application id " + appId; String msg = "User-store exception while getting application with the application id " + appId;
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg, e); throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
String msg = "Error occured when getting, either application tags or application categories";
log.error(msg);
throw new ApplicationManagementException(msg);
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -915,6 +922,9 @@ public class ApplicationManagerImpl implements ApplicationManager {
String msg = "User-store exception while getting application with the application release UUID: " + uuid; String msg = "User-store exception while getting application with the application release UUID: " + uuid;
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg, e); throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -957,6 +967,9 @@ public class ApplicationManagerImpl implements ApplicationManager {
} catch (UserStoreException e) { } catch (UserStoreException e) {
throw new ApplicationManagementException( throw new ApplicationManagementException(
"User-store exception while getting application with the application release UUID " + uuid); "User-store exception while getting application with the application release UUID " + uuid);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -1053,6 +1066,9 @@ public class ApplicationManagerImpl implements ApplicationManager {
} catch (UserStoreException e) { } catch (UserStoreException e) {
throw new ApplicationManagementException( throw new ApplicationManagementException(
"User-store exception while getting application with the " + "application name " + appName); "User-store exception while getting application with the " + "application name " + appName);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -1074,6 +1090,9 @@ public class ApplicationManagerImpl implements ApplicationManager {
} catch (UserStoreException e) { } catch (UserStoreException e) {
throw new ApplicationManagementException( throw new ApplicationManagementException(
"User-store exception while getting application with the application UUID " + appReleaseUUID); "User-store exception while getting application with the application UUID " + appReleaseUUID);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -1088,7 +1107,14 @@ public class ApplicationManagerImpl implements ApplicationManager {
log.debug("Request is received to retrieve all the releases related with the application " + application log.debug("Request is received to retrieve all the releases related with the application " + application
.toString()); .toString());
} }
applicationReleases = this.applicationReleaseDAO.getReleases(application.getId(), tenantId); //todo
applicationReleases = null;
try {
applicationReleases = this.applicationReleaseDAO.getReleases(application.getId(), tenantId);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
}
for (ApplicationReleaseDTO applicationRelease : applicationReleases) { for (ApplicationReleaseDTO applicationRelease : applicationReleases) {
LifecycleStateDTO lifecycleState = null; LifecycleStateDTO lifecycleState = null;
try { try {
@ -1165,7 +1191,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
log.error(msg); log.error(msg);
throw new ForbiddenException(msg); throw new ForbiddenException(msg);
} }
this.applicationDAO.deleteApplication(applicationId); this.applicationDAO.retireApplication(applicationId);
ConnectionManagerUtil.commitDBTransaction(); ConnectionManagerUtil.commitDBTransaction();
applicationStorageManager.deleteAllApplicationReleaseArtifacts(storedLocations); applicationStorageManager.deleteAllApplicationReleaseArtifacts(storedLocations);
} catch (ApplicationManagementDAOException e) { } catch (ApplicationManagementDAOException e) {
@ -1182,6 +1208,45 @@ public class ApplicationManagerImpl implements ApplicationManager {
} }
} }
@Override
public void retireApplication(int applicationId) throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
ApplicationDTO applicationDTO;
if (log.isDebugEnabled()) {
log.debug("Request is received to delete applications which are related with the application id "
+ applicationId);
}
try {
ConnectionManagerUtil.beginDBTransaction();
applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId);
if (applicationDTO == null) {
throw new NotFoundException("Couldn't found an application for Application ID: " + applicationId);
}
List<ApplicationReleaseDTO> applicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs();
List<ApplicationReleaseDTO> activeApplicationReleaseDTOs = new ArrayList<>();
for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) {
if (!applicationReleaseDTO.getCurrentState().equals(lifecycleStateManager.getEndState())) {
activeApplicationReleaseDTOs.add(applicationReleaseDTO);
}
}
if (!activeApplicationReleaseDTOs.isEmpty()) {
String msg = "There are application releases which are not in the state " + lifecycleStateManager
.getEndState() + ". Hence you are not allowed to delete the application";
log.error(msg);
throw new ForbiddenException(msg);
}
this.applicationDAO.retireApplication(applicationId);
ConnectionManagerUtil.commitDBTransaction();
} catch (ApplicationManagementDAOException e) {
String msg = "Error occurred when getting application data for application id: " + applicationId;
log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
private List<String> searchLifecycleStateFlow(String start, String finish) throws ApplicationManagementException { private List<String> searchLifecycleStateFlow(String start, String finish) throws ApplicationManagementException {
Map<String, String> nextNodeMap = new HashMap<>(); Map<String, String> nextNodeMap = new HashMap<>();
List<String> directions = new LinkedList<>(); List<String> directions = new LinkedList<>();
@ -1197,7 +1262,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (currentNode.equals(finish)) { if (currentNode.equals(finish)) {
break; break;
} else { } else {
Set<String> nextStates = lifecycleStateManager.getNextLifecycleStates(currentNode); List<String> nextStates = lifecycleStateManager.getNextLifecycleStates(currentNode);
if (nextStates.contains(finish)) { if (nextStates.contains(finish)) {
queue = new LinkedList<>(); queue = new LinkedList<>();
queue.add(finish); queue.add(finish);
@ -1230,86 +1295,52 @@ public class ApplicationManagerImpl implements ApplicationManager {
} }
@Override @Override
public String deleteApplicationRelease(int applicationId, String releaseUuid) public void deleteApplicationRelease(String releaseUuid)
throws ApplicationManagementException { throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
ApplicationDTO application;
try { try {
ConnectionManagerUtil.beginDBTransaction(); ConnectionManagerUtil.beginDBTransaction();
application = this.applicationDAO.getApplicationById(applicationId, tenantId); ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO
if (application == null) { .getReleaseByUUID(releaseUuid, tenantId);
throw new NotFoundException("Couldn't find an application for application ID: " + applicationId); if (applicationReleaseDTO == null) {
String msg = "Couldn't find an application release for application release UUID: " + releaseUuid;
log.error(msg);
throw new NotFoundException(msg);
} }
if (!isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION) && !application
.getUnrestrictedRoles().isEmpty() && hasUserRole(application.getUnrestrictedRoles(), userName)) { if (!lifecycleStateManager.isDeletableState(applicationReleaseDTO.getCurrentState())) {
throw new ForbiddenException( String msg = "Application state is not in the deletable state. Therefore you are not permitted to "
"You don't have permission for deleting application release. ApplicationDTO id: " + applicationId + "delete the application release.";
+ " and release UUID: " + releaseUuid); log.error(msg);
} throw new ForbiddenException(msg);
}
ApplicationReleaseDTO applicationRelease = this.applicationReleaseDAO List<DeviceSubscriptionDTO> deviceSubscriptionDTOS = subscriptionDAO
.getReleaseByIds(applicationId, releaseUuid, tenantId); .getDeviceSubscriptions(applicationReleaseDTO.getId(), tenantId);
if (applicationRelease == null) { for (DeviceSubscriptionDTO deviceSubscriptionDTO : deviceSubscriptionDTOS) {
throw new NotFoundException("Couldn't find an application release for application ID: " + applicationId if (!deviceSubscriptionDTO.isUnsubscribed()) {
+ " and release UUID: " + releaseUuid); String msg = "This application is subscribed to device/s. Therefore you are not permitted to delete "
} + "the application release.";
LifecycleStateDTO appLifecycleState = this.lifecycleStateDAO log.error(msg);
.getLatestLifeCycleState(applicationId, releaseUuid); throw new ForbiddenException(msg);
if (appLifecycleState == null) {
throw new NotFoundException(
"Couldn't find an lifecycle sate for application ID: " + applicationId + " and UUID: "
+ releaseUuid);
}
String currentState = appLifecycleState.getCurrentState();
if (AppLifecycleState.DEPRECATED.toString().equals(currentState) || AppLifecycleState.REJECTED.toString()
.equals(currentState) || AppLifecycleState.UNPUBLISHED.toString().equals(currentState)) {
LifecycleStateDTO newAppLifecycleState = getLifecycleStateInstance(AppLifecycleState.REMOVED.toString(),
appLifecycleState.getCurrentState());
if (lifecycleStateManager.isValidStateChange(newAppLifecycleState.getPreviousState(),
newAppLifecycleState.getCurrentState(), userName, tenantId)) {
this.lifecycleStateDAO
.addLifecycleState(newAppLifecycleState, applicationId, applicationRelease.getUuid(),
tenantId);
ConnectionManagerUtil.commitDBTransaction();
} else {
List<String> lifecycleFlow = searchLifecycleStateFlow(currentState,
AppLifecycleState.REMOVED.toString());
for (String nextState : lifecycleFlow) {
LifecycleStateDTO lifecycleState = getLifecycleStateInstance(nextState, currentState);
if (lifecycleStateManager.isValidStateChange(currentState, nextState, userName, tenantId)) {
this.lifecycleStateDAO
.addLifecycleState(lifecycleState, applicationId, applicationRelease.getUuid(),
tenantId);
} else {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Can't delete the application release, You have to move the "
+ "lifecycle state from " + currentState + " to " + nextState);
}
currentState = nextState;
}
} }
} else {
throw new ApplicationManagementException(
"Can't delete the application release, You have to move the " + "lifecycle state from "
+ currentState + " to acceptable " + "state");
} }
return applicationRelease.getAppHashValue(); applicationStorageManager.deleteApplicationReleaseArtifacts(applicationReleaseDTO.getAppHashValue());
lifecycleStateDAO.deleteLifecycleStateByReleaseId(applicationReleaseDTO.getId());
applicationReleaseDAO.deleteRelease(applicationReleaseDTO.getId());
} catch (ApplicationManagementDAOException e) { } catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction(); ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementDAOException( String msg = "Error occurred when application release data for application release UUID: " + releaseUuid;
"Error ocured when getting application data or application release data for application id of " throw new ApplicationManagementException(msg, e);
+ applicationId + " application release UUID of the " + releaseUuid); } catch (ApplicationStorageManagementException e) {
String msg = "Error occurred when deleting the application release artifact from the file system. "
+ "Application release UUID: " + releaseUuid;
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (LifeCycleManagementDAOException e) { } catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction(); ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException( String msg = "Error occurred when dleting lifecycle data for application release UUID: " + releaseUuid;
"Error occured when deleting application release for application ID of " + applicationId throw new ApplicationManagementException(msg, e);
+ " and application release UUID of " + releaseUuid, e);
} catch (UserStoreException e) {
throw new ApplicationManagementException(
"Error occured when checking permission for executing application release update. ApplicationDTO ID: "
+ applicationId + " and ApplicationDTO UUID: " + releaseUuid);
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -1587,6 +1618,9 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new ApplicationManagementException( throw new ApplicationManagementException(
"Failed to add lifecycle state. ApplicationDTO Id: " + applicationId + " ApplicationDTO release UUID: " "Failed to add lifecycle state. ApplicationDTO Id: " + applicationId + " ApplicationDTO release UUID: "
+ releaseUuid, e); + releaseUuid, e);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }

@ -20,8 +20,10 @@ package org.wso2.carbon.device.application.mgt.core.impl;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler; import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler;
import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
@ -30,19 +32,26 @@ import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagem
import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.common.Util;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager;
import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil;
import org.wso2.carbon.device.application.mgt.core.util.Constants; import org.wso2.carbon.device.application.mgt.core.util.Constants;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map;
public class AppmDataHandlerImpl implements AppmDataHandler { public class AppmDataHandlerImpl implements AppmDataHandler {
private UIConfiguration uiConfiguration;
private static final Log log = LogFactory.getLog(AppmDataHandlerImpl.class); private static final Log log = LogFactory.getLog(AppmDataHandlerImpl.class);
private UIConfiguration uiConfiguration;
private LifecycleStateManager lifecycleStateManager;
public AppmDataHandlerImpl(UIConfiguration config) { public AppmDataHandlerImpl(UIConfiguration config) {
this.uiConfiguration = config; this.uiConfiguration = config;
lifecycleStateManager = DataHolder.getInstance().getLifecycleStateManager();
} }
@Override @Override
@ -50,6 +59,11 @@ public class AppmDataHandlerImpl implements AppmDataHandler {
return this.uiConfiguration; return this.uiConfiguration;
} }
@Override
public Map<String, LifecycleState> getLifecycleConfiguration() throws LifecycleManagementException {
return lifecycleStateManager.getLifecycleConfig();
}
@Override @Override
public InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException { public InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);

@ -28,6 +28,7 @@ import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager
import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager;
import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO;
import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil;
import org.wso2.carbon.device.application.mgt.core.util.HelperUtil; import org.wso2.carbon.device.application.mgt.core.util.HelperUtil;
@ -109,6 +110,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
subscriptionDAO.subscribeUserToApplication(tenantId, subscriber, userList, application.getId(), subscriptionDAO.subscribeUserToApplication(tenantId, subscriber, userList, application.getId(),
applicationReleaseId); applicationReleaseId);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -150,6 +154,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
subscriptionDAO.subscribeRoleToApplication(tenantId, subscriber, roleList, application.getId(), subscriptionDAO.subscribeRoleToApplication(tenantId, subscriber, roleList, application.getId(),
applicationReleaseId); applicationReleaseId);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -194,6 +201,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
subscriptionDAO.subscribeGroupToApplication(tenantId, subscriber, groupList, application.getId(), subscriptionDAO.subscribeGroupToApplication(tenantId, subscriber, groupList, application.getId(),
applicationReleaseId); applicationReleaseId);
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -252,6 +262,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
} }
subscriptionDAO.subscribeDeviceToApplication(tenantId, subscriber, deviceList, application.getId(), subscriptionDAO.subscribeDeviceToApplication(tenantId, subscriber, deviceList, application.getId(),
applicationReleaseId, String.valueOf(AppOperation.InstallState.UNINSTALLED)); applicationReleaseId, String.valueOf(AppOperation.InstallState.UNINSTALLED));
} catch (ApplicationManagementDAOException e) {
//todo
throw new ApplicationManagementException("");
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }

@ -32,7 +32,7 @@ import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
import org.wso2.carbon.device.application.mgt.core.impl.AppmDataHandlerImpl; import org.wso2.carbon.device.application.mgt.core.impl.AppmDataHandlerImpl;
import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager; import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager;
import org.wso2.carbon.device.application.mgt.core.lifecycle.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil; import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.ndatasource.core.DataSourceService; import org.wso2.carbon.ndatasource.core.DataSourceService;

@ -21,7 +21,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
import org.wso2.carbon.device.application.mgt.core.lifecycle.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import org.wso2.carbon.device.mgt.common.permission.mgt.PermissionManagementException; import org.wso2.carbon.device.mgt.common.permission.mgt.PermissionManagementException;
import org.wso2.carbon.device.mgt.core.permission.mgt.PermissionUtils; import org.wso2.carbon.device.mgt.core.permission.mgt.PermissionUtils;
import org.wso2.carbon.device.mgt.core.search.mgt.Constants; import org.wso2.carbon.device.mgt.core.search.mgt.Constants;
@ -32,59 +32,64 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* This class represents the activities related to lifecycle management * This class represents the activities related to lifecycle management
*/ */
public class LifecycleStateManager { public class LifecycleStateManager {
private Map<String, State> lifecycleStates; private Map<String, LifecycleState> lifecycleStates;
private static Log log = LogFactory.getLog(LifecycleStateManager.class); private static Log log = LogFactory.getLog(LifecycleStateManager.class);
public void init(List<LifecycleState> states) throws LifecycleManagementException { public void init(List<LifecycleState> states) throws LifecycleManagementException {
lifecycleStates = new HashMap<>(); lifecycleStates = new HashMap<>();
for (LifecycleState s : states) { for (LifecycleState lifecycleState : states) {
if (s.getProceedingStates() != null) { if (lifecycleState.getProceedingStates() != null) {
s.getProceedingStates().replaceAll(String::toUpperCase); lifecycleState.getProceedingStates().replaceAll(String::toUpperCase);
} }
lifecycleStates.put(s.getName().toUpperCase(), new State(s.getName().toUpperCase(), lifecycleStates.put(lifecycleState.getName(), lifecycleState);
s.getProceedingStates(), s.getPermission(), s.isAppUpdatable(), s.isAppInstallable(),
s.isInitialState(), s.isEndState()));
try { try {
PermissionUtils.putPermission(s.getPermission()); PermissionUtils.putPermission(lifecycleState.getPermission());
} catch (PermissionManagementException e) { } catch (PermissionManagementException e) {
String msg = "Error when adding permission " + s.getPermission() + " related to the state: " String msg =
+ s.getName(); "Error when adding permission " + lifecycleState.getPermission() + " related to the state: "
+ lifecycleState.getName();
log.error(msg, e); log.error(msg, e);
throw new LifecycleManagementException(msg, e); throw new LifecycleManagementException(msg, e);
} }
} }
} }
public Map<String, LifecycleState> getLifecycleConfig() throws LifecycleManagementException {
if (lifecycleStates == null) {
String msg = "Lifecycle configuration in not initialized.";
log.error(msg);
throw new LifecycleManagementException(msg);
}
return lifecycleStates;
}
public Set<String> getNextLifecycleStates(String currentLifecycleState) { public List<String> getNextLifecycleStates(String currentLifecycleState) {
return lifecycleStates.get(currentLifecycleState.toUpperCase()).getProceedingStates(); return lifecycleStates.get(currentLifecycleState.toUpperCase()).getProceedingStates();
} }
public boolean isValidStateChange(String currentState, String nextState, String username, int tenantId) throws public boolean isValidStateChange(String currentState, String nextState, String username, int tenantId)
LifecycleManagementException { throws LifecycleManagementException {
UserRealm userRealm; UserRealm userRealm;
String permission = getPermissionForStateChange(nextState); String permission = getPermissionForStateChange(nextState);
if (permission != null) { if (permission != null) {
try { try {
userRealm = DataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId); userRealm = DataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId);
if (userRealm != null && userRealm.getAuthorizationManager() != null && if (userRealm != null && userRealm.getAuthorizationManager() != null && userRealm
userRealm.getAuthorizationManager().isUserAuthorized(username, .getAuthorizationManager()
PermissionUtils.getAbsolutePermissionPath(permission), .isUserAuthorized(username, PermissionUtils.getAbsolutePermissionPath(permission),
Constants.UI_EXECUTE)) { Constants.UI_EXECUTE)) {
if (currentState.equalsIgnoreCase(nextState)) { if (currentState.equalsIgnoreCase(nextState)) {
return true; return true;
} }
State state = getMatchingState(currentState); LifecycleState matchingState = getMatchingState(currentState);
if (state != null) { if (matchingState != null) {
return getMatchingNextState(state.getProceedingStates(), nextState); return getMatchingNextState(matchingState.getProceedingStates(), nextState);
} }
return false; return false;
} }
@ -95,24 +100,22 @@ public class LifecycleStateManager {
+ nextState + " with username : " + username + " and tenant Id : " + tenantId, e); + nextState + " with username : " + username + " and tenant Id : " + tenantId, e);
} }
} else { } else {
throw new LifecycleManagementException( throw new LifecycleManagementException("Required permissions cannot be found for the state : " + nextState);
"Required permissions cannot be found for the state : " + nextState);
} }
} }
private State getMatchingState(String currentState) { private LifecycleState getMatchingState(String currentState) {
for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) { for (Map.Entry<String, LifecycleState> lifecycyleState : lifecycleStates.entrySet()) {
if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) { if (lifecycyleState.getKey().equalsIgnoreCase(currentState)) {
return lifecycleStates.get(stringStateEntry.getKey()); return lifecycyleState.getValue();
} }
} }
return null; return null;
} }
private boolean getMatchingNextState(List<String> proceedingStates, String nextState) {
private boolean getMatchingNextState(Set<String> proceedingStates, String nextState) { for (String stateName : proceedingStates) {
for (String state : proceedingStates) { if (stateName.equalsIgnoreCase(nextState)) {
if (state.equalsIgnoreCase(nextState)) {
return true; return true;
} }
} }
@ -121,7 +124,7 @@ public class LifecycleStateManager {
private String getPermissionForStateChange(String nextState) { private String getPermissionForStateChange(String nextState) {
Iterator it = lifecycleStates.entrySet().iterator(); Iterator it = lifecycleStates.entrySet().iterator();
State nextLifecycleState; LifecycleState nextLifecycleState;
while (it.hasNext()) { while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next(); Map.Entry pair = (Map.Entry) it.next();
if (pair.getKey().toString().equalsIgnoreCase(nextState)) { if (pair.getKey().toString().equalsIgnoreCase(nextState)) {
@ -133,8 +136,19 @@ public class LifecycleStateManager {
return null; return null;
} }
public boolean isDeletableState(String state) throws LifecycleManagementException {
LifecycleState currentState = getMatchingState(state);
if (currentState != null) {
return currentState.isDeletableState();
} else {
String msg = "Couldn't find a lifecycle state that matches with " + state + " state.";
log.error(msg);
throw new LifecycleManagementException(msg);
}
}
public boolean isUpdatableState(String state) throws LifecycleManagementException { public boolean isUpdatableState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state); LifecycleState currentState = getMatchingState(state);
if (currentState != null) { if (currentState != null) {
return currentState.isAppUpdatable(); return currentState.isAppUpdatable();
} else { } else {
@ -145,7 +159,7 @@ public class LifecycleStateManager {
} }
public boolean isInstallableState(String state) throws LifecycleManagementException { public boolean isInstallableState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state); LifecycleState currentState = getMatchingState(state);
if (currentState != null) { if (currentState != null) {
return currentState.isAppInstallable(); return currentState.isAppInstallable();
} else { } else {
@ -156,7 +170,7 @@ public class LifecycleStateManager {
} }
public boolean isInitialState(String state) throws LifecycleManagementException { public boolean isInitialState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state); LifecycleState currentState = getMatchingState(state);
if (currentState != null) { if (currentState != null) {
return currentState.isInitialState(); return currentState.isInitialState();
} else { } else {
@ -167,7 +181,7 @@ public class LifecycleStateManager {
} }
public boolean isEndState(String state) throws LifecycleManagementException { public boolean isEndState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state); LifecycleState currentState = getMatchingState(state);
if (currentState != null) { if (currentState != null) {
return currentState.isEndState(); return currentState.isEndState();
} else { } else {
@ -178,58 +192,55 @@ public class LifecycleStateManager {
} }
public String getInitialState() throws LifecycleManagementException { public String getInitialState() throws LifecycleManagementException {
String initialState = null; String initialState;
for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) { for (Map.Entry<String, LifecycleState> lifecycleState : lifecycleStates.entrySet()) {
if (stringStateEntry.getValue().isInitialState()) { if (lifecycleState.getValue().isInitialState()) {
initialState = stringStateEntry.getKey(); initialState = lifecycleState.getKey();
break; return initialState;
} }
} }
if (initialState == null){ String msg = "Haven't defined the initial state in the application-manager.xml. Please add initial state "
String msg = "Haven't defined the initial state in the application-manager.xml. Please add initial state " + "to the <LifecycleStates> section in the app-manager.xml";
+ "to the <LifecycleStates> section in the app-manager.xml"; log.error(msg);
log.error(msg); throw new LifecycleManagementException(msg);
throw new LifecycleManagementException(msg);
}
return initialState;
} }
public String getEndState() throws LifecycleManagementException { public String getEndState() throws LifecycleManagementException {
String endState = null; String endState = null;
for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) { for (Map.Entry<String, LifecycleState> stringStateEntry : lifecycleStates.entrySet()) {
if (stringStateEntry.getValue().isEndState()) { if (stringStateEntry.getValue().isEndState()) {
endState = stringStateEntry.getKey(); endState = stringStateEntry.getKey();
break; break;
} }
} }
if (endState == null){ if (endState == null) {
String msg = "Haven't defined the end state in the application-manager.xml. Please add end state " String msg = "Haven't defined the end state in the application-manager.xml. Please add end state "
+ "to the <LifecycleStates> section in the app-manager.xml"; + "to the <LifecycleStates> section in the app-manager.xml";
log.error(msg); log.error(msg);
throw new LifecycleManagementException(msg); throw new LifecycleManagementException(msg);
} }
return endState; return endState;
} }
public String getInstallableState() throws LifecycleManagementException { public String getInstallableState() throws LifecycleManagementException {
String installableState = null; String installableState = null;
for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) { for (Map.Entry<String, LifecycleState> stringStateEntry : lifecycleStates.entrySet()) {
if (stringStateEntry.getValue().isAppInstallable()) { if (stringStateEntry.getValue().isAppInstallable()) {
installableState = stringStateEntry.getKey(); installableState = stringStateEntry.getKey();
break; break;
} }
} }
if (installableState == null){ if (installableState == null) {
String msg = "Haven't defined the installable state in the application-manager.xml. Please add installable " String msg = "Haven't defined the installable state in the application-manager.xml. Please add installable "
+ "state to the <LifecycleStates> section in the app-manager.xml"; + "state to the <LifecycleStates> section in the app-manager.xml";
log.error(msg); log.error(msg);
throw new LifecycleManagementException(msg); throw new LifecycleManagementException(msg);
} }
return installableState; return installableState;
} }
public boolean isStateExist(String currentState) { public boolean isStateExist(String currentState) {
for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) { for (Map.Entry<String, LifecycleState> stringStateEntry : lifecycleStates.entrySet()) {
if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) { if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) {
return true; return true;
} }
@ -237,8 +248,7 @@ public class LifecycleStateManager {
return false; return false;
} }
public void setLifecycleStates(Map<String, LifecycleState> lifecycleStates) {
public void setLifecycleStates(Map<String, State> lifecycleStates) {
this.lifecycleStates = lifecycleStates; this.lifecycleStates = lifecycleStates;
} }
} }

@ -1,51 +0,0 @@
package org.wso2.carbon.device.application.mgt.core.lifecycle;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* This class represents the state of the lifecycle
*/
public class State {
private Set<String> proceedingStates;
private String stateName;
private String permission;
private boolean isAppUpdatable;
private boolean isAppInstallable;
private boolean isInitialState;
private boolean isEndState;
public State(String stateName, List<String> states, String permission, boolean isAppUpdatable,
boolean isAppInstallable, boolean isInitialState, boolean isEndState) {
this.stateName = stateName;
this.permission = permission;
this.isAppUpdatable=isAppUpdatable;
this.isAppInstallable=isAppInstallable;
this.isInitialState=isInitialState;
this.isEndState=isEndState;
if (states != null && !states.isEmpty()) {
proceedingStates = new HashSet<>(states);
}
}
public String getState() {
return stateName;
}
public Set<String> getProceedingStates() {
return proceedingStates;
}
public String getPermission(){ return permission;}
public boolean isAppUpdatable(){ return isAppUpdatable;}
public boolean isAppInstallable(){ return isAppInstallable;}
public boolean isInitialState(){ return isInitialState;}
public boolean isEndState(){ return isEndState;}
}

@ -21,7 +21,7 @@ import org.junit.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import org.wso2.carbon.device.application.mgt.core.config.Configuration; import org.wso2.carbon.device.application.mgt.core.config.Configuration;
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.lifecycle.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import java.util.List; import java.util.List;

@ -1,25 +1,22 @@
package org.wso2.carbon.device.application.mgt.core; package org.wso2.carbon.device.application.mgt.core;
import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager; import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager;
import org.wso2.carbon.device.application.mgt.core.lifecycle.State; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import org.wso2.carbon.device.application.mgt.core.lifecycle.config.LifecycleState;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
public class LifeCycleStateManagerTest extends LifecycleStateManager { class LifeCycleStateManagerTest extends LifecycleStateManager {
public void initializeLifeCycleDetails(List<LifecycleState> states) { void initializeLifeCycleDetails(List<LifecycleState> lifecycleStates) {
HashMap<String, State> lifecycleStates = new HashMap<>(); HashMap<String, LifecycleState> lifecycleStatesMap = new HashMap<>();
for (LifecycleState s : states) { for (LifecycleState lifecycleState : lifecycleStates) {
if (s.getProceedingStates() != null) { if (lifecycleState.getProceedingStates() != null) {
s.getProceedingStates().replaceAll(String::toUpperCase); lifecycleState.getProceedingStates().replaceAll(String::toUpperCase);
} }
lifecycleStates.put(s.getName().toUpperCase(), new State(s.getName().toUpperCase(), lifecycleStatesMap.put(lifecycleState.getName().toUpperCase(), lifecycleState);
s.getProceedingStates(), s.getPermission(), s.isAppUpdatable(), s.isAppInstallable(),
s.isInitialState(), s.isEndState()));
} }
setLifecycleStates(lifecycleStates); setLifecycleStates(lifecycleStatesMap);
} }
} }

@ -7,10 +7,9 @@ import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManageme
import org.wso2.carbon.device.application.mgt.core.config.Configuration; import org.wso2.carbon.device.application.mgt.core.config.Configuration;
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager; import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager;
import org.wso2.carbon.device.application.mgt.core.lifecycle.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState;
import java.util.List; import java.util.List;
import java.util.Set;
public class LifecycleManagementTest { public class LifecycleManagementTest {
@ -19,17 +18,16 @@ public class LifecycleManagementTest {
private final String CURRENT_STATE = "Approved"; private final String CURRENT_STATE = "Approved";
private final String NEXT_STATE = "Published"; private final String NEXT_STATE = "Published";
private final String BOGUS_STATE = "Removed"; private final String BOGUS_STATE = "Retired";
private final String UPDATABLE_STATE = "Created"; private final String UPDATABLE_STATE = "Created";
private final String NON_UPDATABLE_STATE = "Removed"; private final String NON_UPDATABLE_STATE = "Retired";
private final String INSTALLABLE_STATE = "Published"; private final String INSTALLABLE_STATE = "Published";
private final String UNINSTALlABLE_STATE = "Removed";
private final String INITIAL_STATE = "Created"; private final String INITIAL_STATE = "Created";
private final String END_STATE = "Removed"; private final String END_STATE = "Retired";
@BeforeClass @BeforeClass
public void init() throws LifecycleManagementException { public void init() {
ConfigurationManager configurationManager = ConfigurationManager.getInstance(); ConfigurationManager configurationManager = ConfigurationManager.getInstance();
Configuration configuration = configurationManager.getConfiguration(); Configuration configuration = configurationManager.getConfiguration();
lifecycleStates = configuration.getLifecycleStates(); lifecycleStates = configuration.getLifecycleStates();
@ -39,14 +37,14 @@ public class LifecycleManagementTest {
@Test @Test
public void checkValidNextLifecycleState() { public void checkValidNextLifecycleState() {
Set<String> proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); List<String> proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE);
Assert.assertTrue("Invalid proceeding state of: " + CURRENT_STATE, Assert.assertTrue("Invalid proceeding state of: " + CURRENT_STATE,
proceedingStates.contains(NEXT_STATE.toUpperCase())); proceedingStates.contains(NEXT_STATE.toUpperCase()));
} }
@Test @Test
public void checkInvalidNextLifecycleState() { public void checkInvalidNextLifecycleState() {
Set<String> proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); List<String> proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE);
Assert.assertFalse("Invalid proceeding state of: " + CURRENT_STATE, Assert.assertFalse("Invalid proceeding state of: " + CURRENT_STATE,
proceedingStates.contains(BOGUS_STATE.toUpperCase())); proceedingStates.contains(BOGUS_STATE.toUpperCase()));
} }
@ -70,12 +68,6 @@ public class LifecycleManagementTest {
Assert.assertTrue("Installable state: " + INSTALLABLE_STATE, isInstallable); Assert.assertTrue("Installable state: " + INSTALLABLE_STATE, isInstallable);
} }
@Test
public void CheckUnInstallableState() throws LifecycleManagementException {
boolean isInstallable = lifecycleStateManager.isInstallableState(UNINSTALlABLE_STATE);
Assert.assertFalse("UnInstallable state: " + UNINSTALlABLE_STATE, isInstallable);
}
@Test @Test
public void CheckGetInitialState() throws LifecycleManagementException { public void CheckGetInitialState() throws LifecycleManagementException {
boolean isInitialState = lifecycleStateManager.getInitialState().equalsIgnoreCase(INITIAL_STATE); boolean isInitialState = lifecycleStateManager.getInitialState().equalsIgnoreCase(INITIAL_STATE);
@ -126,7 +118,7 @@ public class LifecycleManagementTest {
@Test @Test
public void check() { public void check() {
Set<String> proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); List<String> proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE);
Assert.assertFalse("Invalid proceeding state of: " + CURRENT_STATE, Assert.assertFalse("Invalid proceeding state of: " + CURRENT_STATE,
proceedingStates.contains(BOGUS_STATE.toUpperCase())); proceedingStates.contains(BOGUS_STATE.toUpperCase()));
} }

@ -76,58 +76,59 @@
<LifecycleState name="Created"> <LifecycleState name="Created">
<IsAppUpdatable>true</IsAppUpdatable> <IsAppUpdatable>true</IsAppUpdatable>
<IsInitialState>true</IsInitialState> <IsInitialState>true</IsInitialState>
<Permission>/device-mgt/applications/life-cycle/create</Permission> <IsDeletableState>true</IsDeletableState>
<Permission>/app-mgt/life-cycle/application/create</Permission>
<ProceedingStates> <ProceedingStates>
<State>In-Review</State> <State>In-Review</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="In-Review"> <LifecycleState name="In-Review">
<Permission>/device-mgt/applications/life-cycle/in-review</Permission> <Permission>/app-mgt/life-cycle/application/review</Permission>
<ProceedingStates> <ProceedingStates>
<State>Rejected</State> <State>Rejected</State>
<State>Approved</State> <State>Approved</State>
<State>Created</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Approved"> <LifecycleState name="Approved">
<Permission>/device-mgt/applications/life-cycle/approve</Permission> <Permission>/app-mgt/life-cycle/application/approve</Permission>
<ProceedingStates> <ProceedingStates>
<State>In-Review</State>
<State>Published</State> <State>Published</State>
<State>Created</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Rejected"> <LifecycleState name="Rejected">
<Permission>/device-mgt/applications/life-cycle/reject</Permission> <IsDeletableState>true</IsDeletableState>
<Permission>/app-mgt/life-cycle/application/reject</Permission>
<ProceedingStates> <ProceedingStates>
<State>Created</State> <State>In-Review</State>
<State>Removed</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Published"> <LifecycleState name="Published">
<IsAppInstallable>true</IsAppInstallable> <IsAppInstallable>true</IsAppInstallable>
<Permission>/device-mgt/applications/life-cycle/publish</Permission> <Permission>/app-mgt/life-cycle/application/publish</Permission>
<ProceedingStates> <ProceedingStates>
<State>Unpublished</State> <State>Blocked</State>
<State>Deprecated</State> <State>Deprecated</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Unpublished"> <LifecycleState name="Blocked">
<Permission>/device-mgt/applications/life-cycle/unpublish</Permission> <Permission>/app-mgt/life-cycle/application/block</Permission>
<ProceedingStates> <ProceedingStates>
<State>Published</State> <State>Published</State>
<State>In-Review</State> <State>Deprecated</State>
<State>Removed</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Deprecated"> <LifecycleState name="Deprecated">
<Permission>/device-mgt/applications/life-cycle/deprecate</Permission> <Permission>/app-mgt/life-cycle/application/deprecate</Permission>
<ProceedingStates> <ProceedingStates>
<State>Removed</State> <State>Published</State>
<State>In-Review</State> <State>Retired</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Removed"> <LifecycleState name="Retired">
<IsEndState>true</IsEndState> <IsEndState>true</IsEndState>
<Permission>/device-mgt/applications/life-cycle/remove</Permission> <Permission>/app-mgt/life-cycle/application/retire</Permission>
</LifecycleState> </LifecycleState>
</LifecycleStates> </LifecycleStates>

@ -40,5 +40,5 @@ public class HandlerConstants {
public static final String TOKEN_IS_EXPIRED = "ACCESS_TOKEN_IS_EXPIRED"; public static final String TOKEN_IS_EXPIRED = "ACCESS_TOKEN_IS_EXPIRED";
public static final int INTERNAL_ERROR_CODE = 500; public static final int INTERNAL_ERROR_CODE = 500;
public static final long TIMEOUT = 300; public static final long TIMEOUT = 1200;
} }

@ -45,7 +45,6 @@ import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
import java.util.List; import java.util.List;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
@ -416,15 +415,15 @@ public interface ApplicationManagementPublisherAPI {
@Multipart(value = "screenshot3") Attachment screenshot3 @Multipart(value = "screenshot3") Attachment screenshot3
); );
@DELETE @PUT
@Consumes("application/json") @Consumes("application/json")
@Path("/{appId}") @Path("/retire/{appId}")
@ApiOperation( @ApiOperation(
consumes = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "DELETE", httpMethod = "PUT",
value = "Delete the application with the given UUID", value = "Retire the application with the given UUID",
notes = "This will delete the application with the given UUID", notes = "This will retire the application with the given UUID",
tags = "ApplicationDTO Management", tags = "ApplicationDTO Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ -449,8 +448,7 @@ public interface ApplicationManagementPublisherAPI {
code = 404, code = 404,
message = "Application not found"), message = "Application not found"),
}) })
//todo add new scope and permission Response retireApplication(
Response deleteApplication(
@ApiParam( @ApiParam(
name = "UUID", name = "UUID",
value = "Unique identifier of the ApplicationDTO", value = "Unique identifier of the ApplicationDTO",
@ -592,7 +590,7 @@ public interface ApplicationManagementPublisherAPI {
httpMethod = "PUT", httpMethod = "PUT",
value = "Update an application release", value = "Update an application release",
notes = "This will update a new application release", notes = "This will update a new application release",
tags = "ApplicationDTO Management", tags = "Application Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update")
@ -750,4 +748,39 @@ public interface ApplicationManagementPublisherAPI {
required = true) required = true)
@QueryParam("action") String action @QueryParam("action") String action
); );
@GET
@Path("/lifecycle-config")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "get application management UI configuration",
notes = "This will get all UI configuration of application management",
tags = "Application Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully got Lifecycle Config.",
response = ApplicationList.class),
@ApiResponse(
code = 404,
message = "Not Found. There doesn't have an defined <LifecycleStates> in app management "
+ "configuration file." +
"query."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while getting the lifecycle config.",
response = ErrorResponse.class)
})
Response getLifecycleConfig();
} }

@ -28,33 +28,18 @@ import io.swagger.annotations.ExtensionProperty;
import io.swagger.annotations.Info; import io.swagger.annotations.Info;
import io.swagger.annotations.SwaggerDefinition; import io.swagger.annotations.SwaggerDefinition;
import io.swagger.annotations.Tag; import io.swagger.annotations.Tag;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.wso2.carbon.apimgt.annotations.api.Scope; import org.wso2.carbon.apimgt.annotations.api.Scope;
import org.wso2.carbon.apimgt.annotations.api.Scopes; import org.wso2.carbon.apimgt.annotations.api.Scopes;
import org.wso2.carbon.device.application.mgt.common.ApplicationList; import org.wso2.carbon.device.application.mgt.common.ApplicationList;
import org.wso2.carbon.device.application.mgt.common.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.ErrorResponse;
import org.wso2.carbon.device.application.mgt.common.Filter;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationUpdateWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.List;
/** /**
* APIs to handle application management related tasks. * APIs to handle application management related tasks.
@ -92,19 +77,19 @@ public interface ApplicationManagementPublisherAdminAPI {
String SCOPE = "scope"; String SCOPE = "scope";
@DELETE @DELETE
@Path("/{appid}/{uuid}") @Path("/release/{uuid}")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@ApiOperation( @ApiOperation(
consumes = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "GET", httpMethod = "DELETE",
value = "get all applications", value = "Delete application release.",
notes = "This will get all applications", notes = "This will delete application release for given UUID",
tags = "ApplicationDTO Management", tags = "Application Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:publisher:view") @ExtensionProperty(name = SCOPE, value = "perm:admin:app:publisher:update")
}) })
} }
) )
@ -112,22 +97,17 @@ public interface ApplicationManagementPublisherAdminAPI {
value = { value = {
@ApiResponse( @ApiResponse(
code = 200, code = 200,
message = "OK. \n Successfully delete application releaset.", message = "OK. \n Successfully delete application release.",
response = ApplicationList.class), response = ApplicationList.class),
@ApiResponse( @ApiResponse(
code = 404, code = 404,
message = "Not Found. There doesn't have an application release with UUID" + message = "Not Found. There doesn't have an application release for UUID" +
"query."), "query."),
@ApiResponse( @ApiResponse(
code = 500, code = 500,
message = "Internal Server Error. \n Error occurred while deleting application release.", message = "Internal Server Error. \n Error occurred while deleting application release.",
response = ErrorResponse.class) response = ErrorResponse.class)
}) Response deleteApplicationRelease( }) Response deleteApplicationRelease(
@ApiParam(
name = "appId",
value = "application Id",
required = true)
@PathParam("appid") int applicationId,
@ApiParam( @ApiParam(
name = "uuid", name = "uuid",
value = "application release UUID", value = "application release UUID",

@ -24,10 +24,11 @@ import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.wso2.carbon.device.application.mgt.common.*; import org.wso2.carbon.device.application.mgt.common.*;
import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException;
import org.wso2.carbon.device.application.mgt.common.response.Application; import org.wso2.carbon.device.application.mgt.common.response.Application;
import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease; import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationUpdateWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationUpdateWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
@ -37,7 +38,6 @@ import org.wso2.carbon.device.application.mgt.core.util.APIUtil;
import org.wso2.carbon.device.application.mgt.publisher.api.services.ApplicationManagementPublisherAPI; import org.wso2.carbon.device.application.mgt.publisher.api.services.ApplicationManagementPublisherAPI;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
import java.io.IOException; import java.io.IOException;
@ -49,7 +49,6 @@ import java.util.Map;
import javax.activation.DataHandler; import javax.activation.DataHandler;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
@ -433,12 +432,13 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem
} }
@DELETE @PUT
@Path("/{appId}") @Path("/retire/{appId}")
public Response deleteApplication(@PathParam("appId") int applicationId) { public Response retireApplication(
@PathParam("appId") int applicationId) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
try { try {
applicationManager.deleteApplication(applicationId); applicationManager.retireApplication(applicationId);
return Response.status(Response.Status.OK) return Response.status(Response.Status.OK)
.entity("Successfully deleted the application for application ID: " + applicationId).build(); .entity("Successfully deleted the application for application ID: " + applicationId).build();
} catch (NotFoundException e) { } catch (NotFoundException e) {
@ -513,6 +513,21 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem
return Response.status(Response.Status.CREATED).entity("Lifecycle state added successfully.").build(); return Response.status(Response.Status.CREATED).entity("Lifecycle state added successfully.").build();
} }
@GET
@Override
@Consumes("application/json")
@Path("/lifecycle-config")
public Response getLifecycleConfig() {
AppmDataHandler dataHandler = APIUtil.getDataHandler();
try {
return Response.status(Response.Status.OK).entity(dataHandler.getLifecycleConfiguration()).build();
} catch (LifecycleManagementException e) {
String msg = "Error Occurred while accessing lifecycle manager.";
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
/*** /***
* *
* @param binaryFile binary file of the application release * @param binaryFile binary file of the application release

@ -74,34 +74,27 @@ public class ApplicationManagementPublisherAdminAPIImpl implements ApplicationMa
private static Log log = LogFactory.getLog(ApplicationManagementPublisherAdminAPIImpl.class); private static Log log = LogFactory.getLog(ApplicationManagementPublisherAdminAPIImpl.class);
@DELETE @DELETE
@Path("/{appid}/{uuid}") @Path("/release/{uuid}")
public Response deleteApplicationRelease( public Response deleteApplicationRelease(
@PathParam("appid") int applicationId,
@PathParam("uuid") String releaseUuid) { @PathParam("uuid") String releaseUuid) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
try { try {
String storedLocation = applicationManager.deleteApplicationRelease(applicationId, releaseUuid); applicationManager.deleteApplicationRelease(releaseUuid);
applicationStorageManager.deleteApplicationReleaseArtifacts(storedLocation); String responseMsg = "Successfully deleted the application release for uuid: " + releaseUuid + "";
String responseMsg = "Successfully deleted the application release of: " + applicationId + "";
return Response.status(Response.Status.OK).entity(responseMsg).build(); return Response.status(Response.Status.OK).entity(responseMsg).build();
} catch (NotFoundException e) { } catch (NotFoundException e) {
String msg = "Couldn't found application release which is having application id: " + applicationId String msg =
+ " and application release UUID:" + releaseUuid; "Couldn't found application release which is having application release UUID:" + releaseUuid;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
} catch (ForbiddenException e) { } catch (ForbiddenException e) {
String msg = String msg = "You don't have require permission to delete the application release which has UUID "
"You don't have require permission to delete the application release which has UUID " + releaseUuid + releaseUuid;
+ " and application ID " + applicationId;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); return Response.status(Response.Status.FORBIDDEN).entity(msg).build();
}catch (ApplicationManagementException e) { } catch (ApplicationManagementException e) {
String msg = "Error occurred while deleting the application: " + applicationId; String msg = "Error occurred while deleting the application release for application release UUID:: "
log.error(msg, e); + releaseUuid;
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (ApplicationStorageManagementException e) {
String msg = "Error occurred while deleting the application storage: " + applicationId;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }

@ -51,45 +51,88 @@
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>com.github.eirslett</groupId>
<artifactId>exec-maven-plugin</artifactId> <artifactId>frontend-maven-plugin</artifactId>
<version>1.5.0</version> <version>${frontend.mave.version}</version>
<configuration>
<workingDirectory>${npm.working.dir}</workingDirectory>
<!-- where to install npm -->
<installDirectory>${npm.install.dir}</installDirectory>
</configuration>
<executions> <executions>
<execution> <execution>
<id>npm install (initialize)</id> <id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<nodeVersion>${node.version}</nodeVersion>
<npmVersion>${npm.version}</npmVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals> <goals>
<goal>exec</goal> <goal>npm</goal>
</goals> </goals>
<phase>initialize</phase> <!-- Optional configuration which provides for running any npm command -->
<configuration> <configuration>
<workingDirectory>react-app</workingDirectory> <arguments>install</arguments>
<executable>${npm.executable}</executable>
<arguments>
<argument>install</argument>
<argument>--silent</argument>
</arguments>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
<id>npm run build (compile)</id> <id>prod</id>
<goals> <goals>
<goal>exec</goal> <goal>npm</goal>
</goals> </goals>
<phase>compile</phase>
<configuration> <configuration>
<workingDirectory>react-app</workingDirectory> <arguments>run-script ${npm.build.command}</arguments>
<executable>${npm.executable}</executable>
<arguments>
<argument>run</argument>
<argument>${npm.build.command}</argument>
</arguments>
</configuration> </configuration>
<phase>generate-resources</phase>
</execution> </execution>
</executions> </executions>
<configuration>
<workingDirectory>${npm.working.dir}</workingDirectory>
</configuration>
</plugin> </plugin>
<!-- <plugin>-->
<!-- <groupId>org.codehaus.mojo</groupId>-->
<!-- <artifactId>exec-maven-plugin</artifactId>-->
<!-- <version>1.5.0</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>npm install (initialize)</id>-->
<!-- <goals>-->
<!-- <goal>exec</goal>-->
<!-- </goals>-->
<!-- <phase>initialize</phase>-->
<!-- <configuration>-->
<!-- <workingDirectory>react-app</workingDirectory>-->
<!-- <executable>${npm.executable}</executable>-->
<!-- <arguments>-->
<!-- <argument>install</argument>-->
<!-- <argument>&#45;&#45;silent</argument>-->
<!-- </arguments>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- <execution>-->
<!-- <id>npm run build (compile)</id>-->
<!-- <goals>-->
<!-- <goal>exec</goal>-->
<!-- </goals>-->
<!-- <phase>compile</phase>-->
<!-- <configuration>-->
<!-- <workingDirectory>react-app</workingDirectory>-->
<!-- <executable>${npm.executable}</executable>-->
<!-- <arguments>-->
<!-- <argument>run</argument>-->
<!-- <argument>${npm.build.command}</argument>-->
<!-- </arguments>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- <configuration>-->
<!-- <workingDirectory>${npm.working.dir}</workingDirectory>-->
<!-- </configuration>-->
<!-- </plugin>-->
</plugins> </plugins>
</build> </build>
<profiles> <profiles>
@ -111,6 +154,7 @@
<npm.executable>npm</npm.executable> <npm.executable>npm</npm.executable>
<npm.build.command>build_prod</npm.build.command> <npm.build.command>build_prod</npm.build.command>
<npm.working.dir>./react-app</npm.working.dir> <npm.working.dir>./react-app</npm.working.dir>
<npm.install.dir>./react-app/tmp</npm.install.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<npm.output.directory>react-app</npm.output.directory> <npm.output.directory>react-app</npm.output.directory>
</properties> </properties>

@ -54,45 +54,88 @@
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>com.github.eirslett</groupId>
<artifactId>exec-maven-plugin</artifactId> <artifactId>frontend-maven-plugin</artifactId>
<version>1.5.0</version> <version>${frontend.mave.version}</version>
<configuration>
<workingDirectory>${npm.working.dir}</workingDirectory>
<!-- where to install npm -->
<installDirectory>${npm.install.dir}</installDirectory>
</configuration>
<executions> <executions>
<execution> <execution>
<id>npm install (initialize)</id> <id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<nodeVersion>${node.version}</nodeVersion>
<npmVersion>${npm.version}</npmVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals> <goals>
<goal>exec</goal> <goal>npm</goal>
</goals> </goals>
<phase>initialize</phase> <!-- Optional configuration which provides for running any npm command -->
<configuration> <configuration>
<workingDirectory>react-app</workingDirectory> <arguments>install</arguments>
<executable>${npm.executable}</executable>
<arguments>
<argument>install</argument>
<argument>--silent</argument>
</arguments>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
<id>npm run build (compile)</id> <id>prod</id>
<goals> <goals>
<goal>exec</goal> <goal>npm</goal>
</goals> </goals>
<phase>compile</phase>
<configuration> <configuration>
<workingDirectory>react-app</workingDirectory> <arguments>run-script ${npm.build.command}</arguments>
<executable>${npm.executable}</executable>
<arguments>
<argument>run</argument>
<argument>${npm.build.command}</argument>
</arguments>
</configuration> </configuration>
<phase>generate-resources</phase>
</execution> </execution>
</executions> </executions>
<configuration>
<workingDirectory>${npm.working.dir}</workingDirectory>
</configuration>
</plugin> </plugin>
<!-- <plugin>-->
<!-- <groupId>org.codehaus.mojo</groupId>-->
<!-- <artifactId>exec-maven-plugin</artifactId>-->
<!-- <version>1.5.0</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>npm install (initialize)</id>-->
<!-- <goals>-->
<!-- <goal>exec</goal>-->
<!-- </goals>-->
<!-- <phase>initialize</phase>-->
<!-- <configuration>-->
<!-- <workingDirectory>react-app</workingDirectory>-->
<!-- <executable>${npm.executable}</executable>-->
<!-- <arguments>-->
<!-- <argument>install</argument>-->
<!-- <argument>&#45;&#45;silent</argument>-->
<!-- </arguments>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- <execution>-->
<!-- <id>npm run build (compile)</id>-->
<!-- <goals>-->
<!-- <goal>exec</goal>-->
<!-- </goals>-->
<!-- <phase>compile</phase>-->
<!-- <configuration>-->
<!-- <workingDirectory>react-app</workingDirectory>-->
<!-- <executable>${npm.executable}</executable>-->
<!-- <arguments>-->
<!-- <argument>run</argument>-->
<!-- <argument>${npm.build.command}</argument>-->
<!-- </arguments>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- <configuration>-->
<!-- <workingDirectory>${npm.working.dir}</workingDirectory>-->
<!-- </configuration>-->
<!-- </plugin>-->
</plugins> </plugins>
</build> </build>
<profiles> <profiles>
@ -114,6 +157,7 @@
<npm.executable>npm</npm.executable> <npm.executable>npm</npm.executable>
<npm.build.command>build_prod</npm.build.command> <npm.build.command>build_prod</npm.build.command>
<npm.working.dir>./react-app</npm.working.dir> <npm.working.dir>./react-app</npm.working.dir>
<npm.install.dir>./react-app/tmp</npm.install.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<npm.output.directory>react-app</npm.output.directory> <npm.output.directory>react-app</npm.output.directory>
</properties> </properties>

@ -76,58 +76,59 @@
<LifecycleState name="Created"> <LifecycleState name="Created">
<IsAppUpdatable>true</IsAppUpdatable> <IsAppUpdatable>true</IsAppUpdatable>
<IsInitialState>true</IsInitialState> <IsInitialState>true</IsInitialState>
<Permission>/device-mgt/applications/life-cycle/create</Permission> <IsDeletableState>true</IsDeletableState>
<Permission>/app-mgt/life-cycle/application/create</Permission>
<ProceedingStates> <ProceedingStates>
<State>In-Review</State> <State>In-Review</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="In-Review"> <LifecycleState name="In-Review">
<Permission>/device-mgt/applications/life-cycle/in-review</Permission> <Permission>/app-mgt/life-cycle/application/review</Permission>
<ProceedingStates> <ProceedingStates>
<State>Rejected</State> <State>Rejected</State>
<State>Approved</State> <State>Approved</State>
<State>Created</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Approved"> <LifecycleState name="Approved">
<Permission>/device-mgt/applications/life-cycle/approve</Permission> <Permission>/app-mgt/life-cycle/application/approve</Permission>
<ProceedingStates> <ProceedingStates>
<State>In-Review</State>
<State>Published</State> <State>Published</State>
<State>Created</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Rejected"> <LifecycleState name="Rejected">
<Permission>/device-mgt/applications/life-cycle/reject</Permission> <IsDeletableState>true</IsDeletableState>
<Permission>/app-mgt/life-cycle/application/reject</Permission>
<ProceedingStates> <ProceedingStates>
<State>Created</State> <State>In-Review</State>
<State>Removed</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Published"> <LifecycleState name="Published">
<IsAppInstallable>true</IsAppInstallable> <IsAppInstallable>true</IsAppInstallable>
<Permission>/device-mgt/applications/life-cycle/publish</Permission> <Permission>/app-mgt/life-cycle/application/publish</Permission>
<ProceedingStates> <ProceedingStates>
<State>Unpublished</State> <State>Blocked</State>
<State>Deprecated</State> <State>Deprecated</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Unpublished"> <LifecycleState name="Blocked">
<Permission>/device-mgt/applications/life-cycle/unpublish</Permission> <Permission>/app-mgt/life-cycle/application/block</Permission>
<ProceedingStates> <ProceedingStates>
<State>Published</State> <State>Published</State>
<State>In-Review</State> <State>Deprecated</State>
<State>Removed</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Deprecated"> <LifecycleState name="Deprecated">
<Permission>/device-mgt/applications/life-cycle/deprecate</Permission> <Permission>/app-mgt/life-cycle/application/deprecate</Permission>
<ProceedingStates> <ProceedingStates>
<State>Removed</State> <State>Published</State>
<State>In-Review</State> <State>Retired</State>
</ProceedingStates> </ProceedingStates>
</LifecycleState> </LifecycleState>
<LifecycleState name="Removed"> <LifecycleState name="Retired">
<IsEndState>true</IsEndState> <IsEndState>true</IsEndState>
<Permission>/device-mgt/applications/life-cycle/remove</Permission> <Permission>/app-mgt/life-cycle/application/retire</Permission>
</LifecycleState> </LifecycleState>
</LifecycleStates> </LifecycleStates>

@ -157,7 +157,7 @@ VALUES ('PUBLISHED', 'PUBLISHED', 'State in which Application is in published st
/ /
INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION)
VALUES ('UNPUBLISHED', 'UNPUBLISHED', 'State in which Application is in un published state.') VALUES ('BLOCKED', 'BLOCKED', 'State in which Application is in un published state.')
/ /
INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION)

@ -87,7 +87,7 @@ VALUES ('REJECTED', 'REJECTED', 'State in which Application is rejected after re
INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION)
VALUES ('PUBLISHED', 'PUBLISHED', 'State in which Application is in published state.'); VALUES ('PUBLISHED', 'PUBLISHED', 'State in which Application is in published state.');
INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION)
VALUES ('UNPUBLISHED', 'UNPUBLISHED', 'State in which Application is in un published state.'); VALUES ('BLOCKED', 'BLOCKED', 'State in which Application is in un published state.');
INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION)
VALUES ('RETIRED', 'RETIRED', 'Retiring an application to indicate end of life state,'); VALUES ('RETIRED', 'RETIRED', 'Retiring an application to indicate end of life state,');

@ -2230,6 +2230,9 @@
<!-- app management related versions --> <!-- app management related versions -->
<googlecode.plist.version>1.21</googlecode.plist.version> <googlecode.plist.version>1.21</googlecode.plist.version>
<net.dongliu.version>2.6.5</net.dongliu.version> <net.dongliu.version>2.6.5</net.dongliu.version>
<frontend.mave.version>1.7.6</frontend.mave.version>
<node.version>v10.15.3</node.version>
<npm.version>6.9.0</npm.version>
<!--websocket related lib versions--> <!--websocket related lib versions-->
<tomcat.websocket.version>7.0.85</tomcat.websocket.version> <tomcat.websocket.version>7.0.85</tomcat.websocket.version>

Loading…
Cancel
Save