mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
App publishing improvements
This commit is contained in:
parent
99e7d12ab7
commit
1576ef86d0
@ -25,16 +25,52 @@ public class ApplicationArtifact {
|
|||||||
private String installerName;
|
private String installerName;
|
||||||
|
|
||||||
private InputStream installerStream;
|
private InputStream installerStream;
|
||||||
|
private String installerPath;
|
||||||
|
|
||||||
private String bannerName;
|
private String bannerName;
|
||||||
|
|
||||||
private InputStream bannerStream;
|
private InputStream bannerStream;
|
||||||
|
private String bannerPath;
|
||||||
|
|
||||||
private String iconName;
|
private String iconName;
|
||||||
|
|
||||||
private InputStream iconStream;
|
private InputStream iconStream;
|
||||||
|
private String iconPath;
|
||||||
|
|
||||||
private Map<String , InputStream> screenshots;
|
private Map<String , InputStream> screenshots;
|
||||||
|
private Map<String, String> screenshotPaths;
|
||||||
|
|
||||||
|
public String getInstallerPath() {
|
||||||
|
return installerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstallerPath(String installerPath) {
|
||||||
|
this.installerPath = installerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBannerPath() {
|
||||||
|
return bannerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBannerPath(String bannerPath) {
|
||||||
|
this.bannerPath = bannerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIconPath() {
|
||||||
|
return iconPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIconPath(String iconPath) {
|
||||||
|
this.iconPath = iconPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getScreenshotPaths() {
|
||||||
|
return screenshotPaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScreenshotPaths(Map<String, String> screenshotPaths) {
|
||||||
|
this.screenshotPaths = screenshotPaths;
|
||||||
|
}
|
||||||
|
|
||||||
public String getInstallerName() {
|
public String getInstallerName() {
|
||||||
return installerName;
|
return installerName;
|
||||||
|
|||||||
@ -140,4 +140,14 @@ public interface ApplicationStorageManager {
|
|||||||
* @throws ApplicationStorageManagementException thrown if
|
* @throws ApplicationStorageManagementException thrown if
|
||||||
*/
|
*/
|
||||||
void deleteAppFolderOfTenant(int tenantId) throws ApplicationStorageManagementException;
|
void deleteAppFolderOfTenant(int tenantId) throws ApplicationStorageManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get absolute path of a file describe by hashVal, folder, file name and tenantId
|
||||||
|
* @param hashVal Hash value of the application release.
|
||||||
|
* @param folderName Folder name file resides.
|
||||||
|
* @param fileName File name of the file.
|
||||||
|
* @param tenantId Tenant ID
|
||||||
|
* @return Absolute path
|
||||||
|
*/
|
||||||
|
String getAbsolutePathOfFile(String hashVal, String folderName, String fileName, int tenantId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -102,11 +102,15 @@ import org.wso2.carbon.user.api.UserRealm;
|
|||||||
import org.wso2.carbon.user.api.UserStoreException;
|
import org.wso2.carbon.user.api.UserStoreException;
|
||||||
|
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -727,20 +731,23 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
throws ResourceManagementException, ApplicationManagementException {
|
throws ResourceManagementException, ApplicationManagementException {
|
||||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||||
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
|
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
|
||||||
byte[] content = getByteContentOfApp(applicationArtifact);
|
try {
|
||||||
String md5OfApp = generateMD5OfApp(applicationArtifact, content);
|
String md5OfApp = applicationStorageManager.getMD5(Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())));
|
||||||
validateReleaseBinaryFileHash(md5OfApp);
|
validateReleaseBinaryFileHash(md5OfApp);
|
||||||
releaseDTO.setUuid(UUID.randomUUID().toString());
|
releaseDTO.setUuid(UUID.randomUUID().toString());
|
||||||
releaseDTO.setAppHashValue(md5OfApp);
|
releaseDTO.setAppHashValue(md5OfApp);
|
||||||
releaseDTO.setInstallerName(applicationArtifact.getInstallerName());
|
releaseDTO.setInstallerName(applicationArtifact.getInstallerName());
|
||||||
|
|
||||||
try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) {
|
applicationStorageManager.uploadReleaseArtifact(releaseDTO, deviceType,
|
||||||
applicationStorageManager.uploadReleaseArtifact(releaseDTO, deviceType,
|
Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())), tenantId);
|
||||||
binaryDuplicate, tenantId);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
String msg = "Error occurred when uploading release artifact into the server";
|
String msg = "Error occurred when uploading release artifact into the server";
|
||||||
log.error(msg);
|
log.error(msg);
|
||||||
throw new ApplicationManagementException(msg, e);
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} catch (StorageManagementException e) {
|
||||||
|
String msg = "Error occurred while md5sum value retrieving process: application UUID "
|
||||||
|
+ releaseDTO.getUuid();
|
||||||
|
log.error(msg, e);
|
||||||
}
|
}
|
||||||
return addImageArtifacts(releaseDTO, applicationArtifact, tenantId);
|
return addImageArtifacts(releaseDTO, applicationArtifact, tenantId);
|
||||||
}
|
}
|
||||||
@ -856,82 +863,77 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
|
|
||||||
String uuid = UUID.randomUUID().toString();
|
String uuid = UUID.randomUUID().toString();
|
||||||
applicationReleaseDTO.setUuid(uuid);
|
applicationReleaseDTO.setUuid(uuid);
|
||||||
|
|
||||||
// The application executable artifacts such as apks are uploaded.
|
// The application executable artifacts such as apks are uploaded.
|
||||||
try {
|
try {
|
||||||
byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream());
|
|
||||||
applicationReleaseDTO.setInstallerName(applicationArtifact.getInstallerName());
|
applicationReleaseDTO.setInstallerName(applicationArtifact.getInstallerName());
|
||||||
try (ByteArrayInputStream binary = new ByteArrayInputStream(content)) {
|
if (!DeviceTypes.WINDOWS.toString().equalsIgnoreCase(deviceType)) {
|
||||||
if (!DeviceTypes.WINDOWS.toString().equalsIgnoreCase(deviceType)) {
|
ApplicationInstaller applicationInstaller = applicationStorageManager
|
||||||
ApplicationInstaller applicationInstaller = applicationStorageManager
|
.getAppInstallerData(Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())), deviceType);
|
||||||
.getAppInstallerData(binary, deviceType);
|
applicationReleaseDTO.setVersion(applicationInstaller.getVersion());
|
||||||
applicationReleaseDTO.setVersion(applicationInstaller.getVersion());
|
applicationReleaseDTO.setPackageName(applicationInstaller.getPackageName());
|
||||||
applicationReleaseDTO.setPackageName(applicationInstaller.getPackageName());
|
} else {
|
||||||
} else {
|
String windowsInstallerName = applicationArtifact.getInstallerName();
|
||||||
String windowsInstallerName = applicationArtifact.getInstallerName();
|
String extension = windowsInstallerName.substring(windowsInstallerName.lastIndexOf(".") + 1);
|
||||||
String extension = windowsInstallerName.substring(windowsInstallerName.lastIndexOf(".") + 1);
|
if (!extension.equalsIgnoreCase(Constants.MSI) &&
|
||||||
if (!extension.equalsIgnoreCase(Constants.MSI) &&
|
!extension.equalsIgnoreCase(Constants.APPX)) {
|
||||||
!extension.equalsIgnoreCase(Constants.APPX)) {
|
String msg = "Application Type doesn't match with supporting application types of " +
|
||||||
String msg = "Application Type doesn't match with supporting application types of " +
|
deviceType + "platform which are APPX and MSI";
|
||||||
deviceType + "platform which are APPX and MSI";
|
log.error(msg);
|
||||||
log.error(msg);
|
throw new BadRequestException(msg);
|
||||||
throw new BadRequestException(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String packageName = applicationReleaseDTO.getPackageName();
|
|
||||||
try {
|
|
||||||
ConnectionManagerUtil.openDBConnection();
|
|
||||||
if (!isNewRelease && applicationReleaseDAO
|
|
||||||
.isActiveReleaseExisitForPackageName(packageName, tenantId,
|
|
||||||
lifecycleStateManager.getEndState())) {
|
|
||||||
String msg = "Application release is already exist for the package name: " + packageName
|
|
||||||
+ ". Either you can delete all application releases for package " + packageName + " or "
|
|
||||||
+ "you can add this app release as an new application release, under the existing "
|
|
||||||
+ "application.";
|
|
||||||
log.error(msg);
|
|
||||||
throw new ApplicationManagementException(msg);
|
|
||||||
}
|
|
||||||
String md5OfApp = applicationStorageManager.getMD5(new ByteArrayInputStream(content));
|
|
||||||
if (md5OfApp == null) {
|
|
||||||
String msg = "Error occurred while md5sum value retrieving process: application UUID "
|
|
||||||
+ applicationReleaseDTO.getUuid();
|
|
||||||
log.error(msg);
|
|
||||||
throw new ApplicationStorageManagementException(msg);
|
|
||||||
}
|
|
||||||
if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) {
|
|
||||||
String msg =
|
|
||||||
"Application release exists for the uploaded binary file. Device Type: " + deviceType;
|
|
||||||
log.error(msg);
|
|
||||||
throw new BadRequestException(msg);
|
|
||||||
}
|
|
||||||
applicationReleaseDTO.setAppHashValue(md5OfApp);
|
|
||||||
|
|
||||||
try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) {
|
|
||||||
applicationStorageManager
|
|
||||||
.uploadReleaseArtifact(applicationReleaseDTO, deviceType, binaryDuplicate, tenantId);
|
|
||||||
}
|
|
||||||
} catch (StorageManagementException e) {
|
|
||||||
String msg = "Error occurred while md5sum value retrieving process: application UUID "
|
|
||||||
+ applicationReleaseDTO.getUuid();
|
|
||||||
log.error(msg, e);
|
|
||||||
throw new ApplicationStorageManagementException(msg, e);
|
|
||||||
} catch (DBConnectionException e) {
|
|
||||||
String msg = "Error occurred when getting database connection for verifying app release data.";
|
|
||||||
log.error(msg, e);
|
|
||||||
throw new ApplicationManagementException(msg, e);
|
|
||||||
} catch (ApplicationManagementDAOException e) {
|
|
||||||
String msg =
|
|
||||||
"Error occurred when executing the query for verifying application release existence for "
|
|
||||||
+ "the package.";
|
|
||||||
log.error(msg, e);
|
|
||||||
throw new ApplicationManagementException(msg, e);
|
|
||||||
} finally {
|
|
||||||
ConnectionManagerUtil.closeDBConnection();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String packageName = applicationReleaseDTO.getPackageName();
|
||||||
|
try {
|
||||||
|
ConnectionManagerUtil.openDBConnection();
|
||||||
|
if (!isNewRelease && applicationReleaseDAO
|
||||||
|
.isActiveReleaseExisitForPackageName(packageName, tenantId,
|
||||||
|
lifecycleStateManager.getEndState())) {
|
||||||
|
String msg = "Application release is already exist for the package name: " + packageName
|
||||||
|
+ ". Either you can delete all application releases for package " + packageName + " or "
|
||||||
|
+ "you can add this app release as an new application release, under the existing "
|
||||||
|
+ "application.";
|
||||||
|
log.error(msg);
|
||||||
|
throw new ApplicationManagementException(msg);
|
||||||
|
}
|
||||||
|
String md5OfApp = applicationStorageManager.getMD5(Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())));
|
||||||
|
if (md5OfApp == null) {
|
||||||
|
String msg = "Error occurred while md5sum value retrieving process: application UUID "
|
||||||
|
+ applicationReleaseDTO.getUuid();
|
||||||
|
log.error(msg);
|
||||||
|
throw new ApplicationStorageManagementException(msg);
|
||||||
|
}
|
||||||
|
if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) {
|
||||||
|
String msg =
|
||||||
|
"Application release exists for the uploaded binary file. Device Type: " + deviceType;
|
||||||
|
log.error(msg);
|
||||||
|
throw new BadRequestException(msg);
|
||||||
|
}
|
||||||
|
applicationReleaseDTO.setAppHashValue(md5OfApp);
|
||||||
|
|
||||||
|
applicationStorageManager
|
||||||
|
.uploadReleaseArtifact(applicationReleaseDTO, deviceType,
|
||||||
|
Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())), tenantId);
|
||||||
|
} catch (StorageManagementException e) {
|
||||||
|
String msg = "Error occurred while md5sum value retrieving process: application UUID "
|
||||||
|
+ applicationReleaseDTO.getUuid();
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationStorageManagementException(msg, e);
|
||||||
|
} catch (DBConnectionException e) {
|
||||||
|
String msg = "Error occurred when getting database connection for verifying app release data.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} catch (ApplicationManagementDAOException e) {
|
||||||
|
String msg =
|
||||||
|
"Error occurred when executing the query for verifying application release existence for "
|
||||||
|
+ "the package.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} finally {
|
||||||
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
String msg = "Error occurred when getting byte array of binary file. Installer name: " + applicationArtifact
|
String msg = "Error occurred when getting file input stream. Installer name: " + applicationArtifact
|
||||||
.getInstallerName();
|
.getInstallerName();
|
||||||
log.error(msg, e);
|
log.error(msg, e);
|
||||||
throw new ApplicationStorageManagementException(msg, e);
|
throw new ApplicationStorageManagementException(msg, e);
|
||||||
@ -957,73 +959,64 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
|
|
||||||
// The application executable artifacts such as apks are uploaded.
|
// The application executable artifacts such as apks are uploaded.
|
||||||
try {
|
try {
|
||||||
byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream());
|
String md5OfApp = applicationStorageManager.getMD5(Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())));
|
||||||
|
if (md5OfApp == null) {
|
||||||
|
String msg = "Error occurred while retrieving md5sum value from the binary file for application "
|
||||||
|
+ "release UUID " + applicationReleaseDTO.getUuid();
|
||||||
|
log.error(msg);
|
||||||
|
throw new ApplicationStorageManagementException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
try (ByteArrayInputStream binaryClone = new ByteArrayInputStream(content)) {
|
if (!applicationReleaseDTO.getAppHashValue().equals(md5OfApp)) {
|
||||||
String md5OfApp = applicationStorageManager.getMD5(binaryClone);
|
applicationReleaseDTO.setInstallerName(applicationArtifact.getInstallerName());
|
||||||
|
ApplicationInstaller applicationInstaller = applicationStorageManager
|
||||||
|
.getAppInstallerData(Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())), deviceType);
|
||||||
|
String packageName = applicationInstaller.getPackageName();
|
||||||
|
|
||||||
if (md5OfApp == null) {
|
try {
|
||||||
String msg = "Error occurred while retrieving md5sum value from the binary file for application "
|
ConnectionManagerUtil.getDBConnection();
|
||||||
+ "release UUID " + applicationReleaseDTO.getUuid();
|
if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) {
|
||||||
log.error(msg);
|
String msg = "Same binary file is in the server. Hence you can't add same file into the "
|
||||||
throw new ApplicationStorageManagementException(msg);
|
+ "server. Device Type: " + deviceType + " and package name: " + packageName;
|
||||||
}
|
log.error(msg);
|
||||||
if (!applicationReleaseDTO.getAppHashValue().equals(md5OfApp)) {
|
throw new BadRequestException(msg);
|
||||||
applicationReleaseDTO.setInstallerName(applicationArtifact.getInstallerName());
|
|
||||||
|
|
||||||
try (ByteArrayInputStream binary = new ByteArrayInputStream(content)) {
|
|
||||||
ApplicationInstaller applicationInstaller = applicationStorageManager
|
|
||||||
.getAppInstallerData(binary, deviceType);
|
|
||||||
String packageName = applicationInstaller.getPackageName();
|
|
||||||
|
|
||||||
try {
|
|
||||||
ConnectionManagerUtil.getDBConnection();
|
|
||||||
if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) {
|
|
||||||
String msg = "Same binary file is in the server. Hence you can't add same file into the "
|
|
||||||
+ "server. Device Type: " + deviceType + " and package name: " + packageName;
|
|
||||||
log.error(msg);
|
|
||||||
throw new BadRequestException(msg);
|
|
||||||
}
|
|
||||||
if (applicationReleaseDTO.getPackageName() == null){
|
|
||||||
String msg = "Found null value for application release package name for application "
|
|
||||||
+ "release which has UUID: " + applicationReleaseDTO.getUuid();
|
|
||||||
log.error(msg);
|
|
||||||
throw new ApplicationManagementException(msg);
|
|
||||||
}
|
|
||||||
if (!applicationReleaseDTO.getPackageName().equals(packageName)){
|
|
||||||
String msg = "Package name of the new artifact does not match with the package name of "
|
|
||||||
+ "the exiting application release. Package name of the existing app release "
|
|
||||||
+ applicationReleaseDTO.getPackageName() + " and package name of the new "
|
|
||||||
+ "application release " + packageName;
|
|
||||||
log.error(msg);
|
|
||||||
throw new BadRequestException(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationReleaseDTO.setVersion(applicationInstaller.getVersion());
|
|
||||||
applicationReleaseDTO.setPackageName(packageName);
|
|
||||||
String deletingAppHashValue = applicationReleaseDTO.getAppHashValue();
|
|
||||||
applicationReleaseDTO.setAppHashValue(md5OfApp);
|
|
||||||
try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) {
|
|
||||||
applicationStorageManager
|
|
||||||
.uploadReleaseArtifact(applicationReleaseDTO, deviceType, binaryDuplicate,
|
|
||||||
tenantId);
|
|
||||||
applicationStorageManager.copyImageArtifactsAndDeleteInstaller(deletingAppHashValue,
|
|
||||||
applicationReleaseDTO, tenantId);
|
|
||||||
}
|
|
||||||
} catch (DBConnectionException e) {
|
|
||||||
String msg = "Error occurred when getting database connection for verifying application "
|
|
||||||
+ "release existing for new app hash value.";
|
|
||||||
log.error(msg, e);
|
|
||||||
throw new ApplicationManagementException(msg, e);
|
|
||||||
} catch (ApplicationManagementDAOException e) {
|
|
||||||
String msg = "Error occurred when executing the query for verifying application release "
|
|
||||||
+ "existence for the new app hash value.";
|
|
||||||
log.error(msg, e);
|
|
||||||
throw new ApplicationManagementException(msg, e);
|
|
||||||
} finally {
|
|
||||||
ConnectionManagerUtil.closeDBConnection();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (applicationReleaseDTO.getPackageName() == null){
|
||||||
|
String msg = "Found null value for application release package name for application "
|
||||||
|
+ "release which has UUID: " + applicationReleaseDTO.getUuid();
|
||||||
|
log.error(msg);
|
||||||
|
throw new ApplicationManagementException(msg);
|
||||||
|
}
|
||||||
|
if (!applicationReleaseDTO.getPackageName().equals(packageName)){
|
||||||
|
String msg = "Package name of the new artifact does not match with the package name of "
|
||||||
|
+ "the exiting application release. Package name of the existing app release "
|
||||||
|
+ applicationReleaseDTO.getPackageName() + " and package name of the new "
|
||||||
|
+ "application release " + packageName;
|
||||||
|
log.error(msg);
|
||||||
|
throw new BadRequestException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
applicationReleaseDTO.setVersion(applicationInstaller.getVersion());
|
||||||
|
applicationReleaseDTO.setPackageName(packageName);
|
||||||
|
String deletingAppHashValue = applicationReleaseDTO.getAppHashValue();
|
||||||
|
applicationReleaseDTO.setAppHashValue(md5OfApp);
|
||||||
|
applicationStorageManager.uploadReleaseArtifact(applicationReleaseDTO, deviceType,
|
||||||
|
Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())),
|
||||||
|
tenantId);
|
||||||
|
applicationStorageManager.copyImageArtifactsAndDeleteInstaller(deletingAppHashValue,
|
||||||
|
applicationReleaseDTO, tenantId);
|
||||||
|
} catch (DBConnectionException e) {
|
||||||
|
String msg = "Error occurred when getting database connection for verifying application "
|
||||||
|
+ "release existing for new app hash value.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} catch (ApplicationManagementDAOException e) {
|
||||||
|
String msg = "Error occurred when executing the query for verifying application release "
|
||||||
|
+ "existence for the new app hash value.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} finally {
|
||||||
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (StorageManagementException e) {
|
} catch (StorageManagementException e) {
|
||||||
@ -1032,7 +1025,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
log.error(msg, e);
|
log.error(msg, e);
|
||||||
throw new ApplicationStorageManagementException(msg, e);
|
throw new ApplicationStorageManagementException(msg, e);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
String msg = "Error occurred when getting byte array of binary file. Installer name: " + applicationArtifact
|
String msg = "Error occurred when getting file input stream. Installer name: " + applicationArtifact
|
||||||
.getInstallerName();
|
.getInstallerName();
|
||||||
log.error(msg, e);
|
log.error(msg, e);
|
||||||
throw new ApplicationStorageManagementException(msg, e);
|
throw new ApplicationStorageManagementException(msg, e);
|
||||||
@ -3607,52 +3600,49 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
DeviceType deviceTypeObj = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId());
|
DeviceType deviceTypeObj = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId());
|
||||||
// The application executable artifacts such as deb are uploaded.
|
// The application executable artifacts such as deb are uploaded.
|
||||||
try {
|
try {
|
||||||
byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream());
|
String md5OfApp = applicationStorageManager.getMD5(
|
||||||
try (ByteArrayInputStream binaryClone = new ByteArrayInputStream(content)) {
|
Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())));
|
||||||
String md5OfApp = applicationStorageManager.getMD5(binaryClone);
|
if (md5OfApp == null) {
|
||||||
if (md5OfApp == null) {
|
String msg = "Error occurred while retrieving md5sum value from the binary file for "
|
||||||
String msg = "Error occurred while retrieving md5sum value from the binary file for "
|
+ "application release UUID " + applicationReleaseDTO.get().getUuid();
|
||||||
+ "application release UUID " + applicationReleaseDTO.get().getUuid();
|
log.error(msg);
|
||||||
log.error(msg);
|
throw new ApplicationStorageManagementException(msg);
|
||||||
throw new ApplicationStorageManagementException(msg);
|
}
|
||||||
}
|
|
||||||
if (!applicationReleaseDTO.get().getAppHashValue().equals(md5OfApp)) {
|
|
||||||
try {
|
|
||||||
ConnectionManagerUtil.getDBConnection();
|
|
||||||
if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) {
|
|
||||||
String msg =
|
|
||||||
"Same binary file is in the server. Hence you can't add same file into the "
|
|
||||||
+ "server. Device Type: " + deviceTypeObj.getName()
|
|
||||||
+ " and package name: " + applicationDTO.getApplicationReleaseDTOs()
|
|
||||||
.get(0).getPackageName();
|
|
||||||
log.error(msg);
|
|
||||||
throw new BadRequestException(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationReleaseDTO.get().setInstallerName(applicationArtifact.getInstallerName());
|
if (!applicationReleaseDTO.get().getAppHashValue().equals(md5OfApp)) {
|
||||||
String deletingAppHashValue = applicationReleaseDTO.get().getAppHashValue();
|
try {
|
||||||
applicationReleaseDTO.get().setAppHashValue(md5OfApp);
|
ConnectionManagerUtil.getDBConnection();
|
||||||
try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) {
|
if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) {
|
||||||
applicationStorageManager
|
|
||||||
.uploadReleaseArtifact(applicationReleaseDTO.get(), deviceTypeObj.getName(),
|
|
||||||
binaryDuplicate, tenantId);
|
|
||||||
applicationStorageManager.copyImageArtifactsAndDeleteInstaller(deletingAppHashValue,
|
|
||||||
applicationReleaseDTO.get(), tenantId);
|
|
||||||
}
|
|
||||||
} catch (DBConnectionException e) {
|
|
||||||
String msg = "Error occurred when getting database connection for verifying application"
|
|
||||||
+ " release existing for new app hash value.";
|
|
||||||
log.error(msg, e);
|
|
||||||
throw new ApplicationManagementException(msg, e);
|
|
||||||
} catch (ApplicationManagementDAOException e) {
|
|
||||||
String msg =
|
String msg =
|
||||||
"Error occurred when executing the query for verifying application release "
|
"Same binary file is in the server. Hence you can't add same file into the "
|
||||||
+ "existence for the new app hash value.";
|
+ "server. Device Type: " + deviceTypeObj.getName()
|
||||||
log.error(msg, e);
|
+ " and package name: " + applicationDTO.getApplicationReleaseDTOs()
|
||||||
throw new ApplicationManagementException(msg, e);
|
.get(0).getPackageName();
|
||||||
} finally {
|
log.error(msg);
|
||||||
ConnectionManagerUtil.closeDBConnection();
|
throw new BadRequestException(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applicationReleaseDTO.get().setInstallerName(applicationArtifact.getInstallerName());
|
||||||
|
String deletingAppHashValue = applicationReleaseDTO.get().getAppHashValue();
|
||||||
|
applicationReleaseDTO.get().setAppHashValue(md5OfApp);
|
||||||
|
applicationStorageManager.
|
||||||
|
uploadReleaseArtifact(applicationReleaseDTO.get(), deviceTypeObj.getName(),
|
||||||
|
Files.newInputStream(Paths.get(applicationArtifact.getInstallerPath())), tenantId);
|
||||||
|
applicationStorageManager.copyImageArtifactsAndDeleteInstaller(deletingAppHashValue,
|
||||||
|
applicationReleaseDTO.get(), tenantId);
|
||||||
|
} catch (DBConnectionException e) {
|
||||||
|
String msg = "Error occurred when getting database connection for verifying application"
|
||||||
|
+ " release existing for new app hash value.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} catch (ApplicationManagementDAOException e) {
|
||||||
|
String msg =
|
||||||
|
"Error occurred when executing the query for verifying application release "
|
||||||
|
+ "existence for the new app hash value.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new ApplicationManagementException(msg, e);
|
||||||
|
} finally {
|
||||||
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (StorageManagementException e) {
|
} catch (StorageManagementException e) {
|
||||||
|
|||||||
@ -37,6 +37,7 @@ import io.entgra.device.mgt.core.device.mgt.core.common.exception.StorageManagem
|
|||||||
import io.entgra.device.mgt.core.device.mgt.core.common.util.StorageManagementUtil;
|
import io.entgra.device.mgt.core.device.mgt.core.common.util.StorageManagementUtil;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static io.entgra.device.mgt.core.device.mgt.core.common.util.StorageManagementUtil.saveFile;
|
import static io.entgra.device.mgt.core.device.mgt.core.common.util.StorageManagementUtil.saveFile;
|
||||||
@ -155,13 +156,13 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
|
|||||||
public void uploadReleaseArtifact(ApplicationReleaseDTO applicationReleaseDTO,
|
public void uploadReleaseArtifact(ApplicationReleaseDTO applicationReleaseDTO,
|
||||||
String deviceType, InputStream binaryFile, int tenantId) throws ResourceManagementException {
|
String deviceType, InputStream binaryFile, int tenantId) throws ResourceManagementException {
|
||||||
try {
|
try {
|
||||||
byte [] content = IOUtils.toByteArray(binaryFile);
|
//byte [] content = IOUtils.toByteArray(binaryFile);
|
||||||
String artifactDirectoryPath =
|
String artifactDirectoryPath =
|
||||||
storagePath + tenantId + File.separator + applicationReleaseDTO.getAppHashValue() + File.separator
|
storagePath + tenantId + File.separator + applicationReleaseDTO.getAppHashValue() + File.separator
|
||||||
+ Constants.APP_ARTIFACT;
|
+ Constants.APP_ARTIFACT;
|
||||||
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
|
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
|
||||||
String artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName();
|
String artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName();
|
||||||
saveFile(new ByteArrayInputStream(content), artifactPath);
|
saveFile(binaryFile, artifactPath);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
String msg = "IO Exception while saving the release artifacts in the server for the application UUID "
|
String msg = "IO Exception while saving the release artifacts in the server for the application UUID "
|
||||||
+ applicationReleaseDTO.getUuid();
|
+ applicationReleaseDTO.getUuid();
|
||||||
@ -324,4 +325,12 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAbsolutePathOfFile(String hashVal, String folderName, String fileName, int tenantId) {
|
||||||
|
String filePath =
|
||||||
|
storagePath + tenantId + File.separator + hashVal + File.separator + folderName + File.separator
|
||||||
|
+ fileName;
|
||||||
|
return Paths.get(filePath).toAbsolutePath().toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -181,6 +181,7 @@ public class ApplicationManagementUtil {
|
|||||||
fileDescriptor = FileDownloaderServiceProvider.getFileDownloaderService(artifactLinkUrl).download(artifactLinkUrl);
|
fileDescriptor = FileDownloaderServiceProvider.getFileDownloaderService(artifactLinkUrl).download(artifactLinkUrl);
|
||||||
applicationArtifact.setInstallerName(fileDescriptor.getFullQualifiedName());
|
applicationArtifact.setInstallerName(fileDescriptor.getFullQualifiedName());
|
||||||
applicationArtifact.setInstallerStream(fileDescriptor.getFile());
|
applicationArtifact.setInstallerStream(fileDescriptor.getFile());
|
||||||
|
applicationArtifact.setInstallerPath(fileDescriptor.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iconLink != null) {
|
if (iconLink != null) {
|
||||||
@ -188,6 +189,7 @@ public class ApplicationManagementUtil {
|
|||||||
fileDescriptor = FileDownloaderServiceProvider.getFileDownloaderService(iconLinkUrl).download(iconLinkUrl);
|
fileDescriptor = FileDownloaderServiceProvider.getFileDownloaderService(iconLinkUrl).download(iconLinkUrl);
|
||||||
applicationArtifact.setIconName(fileDescriptor.getFullQualifiedName());
|
applicationArtifact.setIconName(fileDescriptor.getFullQualifiedName());
|
||||||
applicationArtifact.setIconStream(fileDescriptor.getFile());
|
applicationArtifact.setIconStream(fileDescriptor.getFile());
|
||||||
|
applicationArtifact.setIconPath(fileDescriptor.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bannerLink != null) {
|
if (bannerLink != null) {
|
||||||
@ -195,10 +197,12 @@ public class ApplicationManagementUtil {
|
|||||||
fileDescriptor = FileDownloaderServiceProvider.getFileDownloaderService(bannerLinkUrl).download(bannerLinkUrl);
|
fileDescriptor = FileDownloaderServiceProvider.getFileDownloaderService(bannerLinkUrl).download(bannerLinkUrl);
|
||||||
applicationArtifact.setBannerName(fileDescriptor.getFullQualifiedName());
|
applicationArtifact.setBannerName(fileDescriptor.getFullQualifiedName());
|
||||||
applicationArtifact.setBannerStream(fileDescriptor.getFile());
|
applicationArtifact.setBannerStream(fileDescriptor.getFile());
|
||||||
|
applicationArtifact.setBannerPath(fileDescriptor.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (screenshotLinks != null) {
|
if (screenshotLinks != null) {
|
||||||
Map<String, InputStream> screenshotData = new TreeMap<>();
|
Map<String, InputStream> screenshotData = new TreeMap<>();
|
||||||
|
Map<String, String> screenshotPaths = new TreeMap<>();
|
||||||
// This is to handle cases in which multiple screenshots have the same name
|
// This is to handle cases in which multiple screenshots have the same name
|
||||||
Map<String, Integer> screenshotNameCount = new HashMap<>();
|
Map<String, Integer> screenshotNameCount = new HashMap<>();
|
||||||
URL screenshotLinkUrl;
|
URL screenshotLinkUrl;
|
||||||
@ -209,6 +213,7 @@ public class ApplicationManagementUtil {
|
|||||||
screenshotNameCount.put(screenshotName, screenshotNameCount.getOrDefault(screenshotName, 0) + 1);
|
screenshotNameCount.put(screenshotName, screenshotNameCount.getOrDefault(screenshotName, 0) + 1);
|
||||||
screenshotName = FileUtil.generateDuplicateFileName(screenshotName, screenshotNameCount.get(screenshotName));
|
screenshotName = FileUtil.generateDuplicateFileName(screenshotName, screenshotNameCount.get(screenshotName));
|
||||||
screenshotData.put(screenshotName, fileDescriptor.getFile());
|
screenshotData.put(screenshotName, fileDescriptor.getFile());
|
||||||
|
screenshotPaths.put(screenshotName, fileDescriptor.getAbsolutePath());
|
||||||
}
|
}
|
||||||
applicationArtifact.setScreenshots(screenshotData);
|
applicationArtifact.setScreenshots(screenshotData);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,9 @@ import com.google.gson.Gson;
|
|||||||
import io.entgra.device.mgt.core.application.mgt.common.ChunkDescriptor;
|
import io.entgra.device.mgt.core.application.mgt.common.ChunkDescriptor;
|
||||||
import io.entgra.device.mgt.core.application.mgt.common.FileDescriptor;
|
import io.entgra.device.mgt.core.application.mgt.common.FileDescriptor;
|
||||||
import io.entgra.device.mgt.core.application.mgt.common.FileMetaEntry;
|
import io.entgra.device.mgt.core.application.mgt.common.FileMetaEntry;
|
||||||
|
import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationStorageManagementException;
|
||||||
import io.entgra.device.mgt.core.application.mgt.core.exception.FileTransferServiceHelperUtilException;
|
import io.entgra.device.mgt.core.application.mgt.core.exception.FileTransferServiceHelperUtilException;
|
||||||
|
import io.entgra.device.mgt.core.application.mgt.core.internal.DataHolder;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.NotFoundException;
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.NotFoundException;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -175,6 +177,12 @@ public class FileTransferServiceHelperUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String []urlPathSegments = downloadUrl.getPath().split("/");
|
String []urlPathSegments = downloadUrl.getPath().split("/");
|
||||||
|
|
||||||
|
FileDescriptor fileDescriptorResolvedFromRelease = resolve(urlPathSegments);
|
||||||
|
if (fileDescriptorResolvedFromRelease != null) {
|
||||||
|
return fileDescriptorResolvedFromRelease;
|
||||||
|
}
|
||||||
|
|
||||||
if (urlPathSegments.length < 2) {
|
if (urlPathSegments.length < 2) {
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("URL patch segments contain less than 2 segments");
|
log.debug("URL patch segments contain less than 2 segments");
|
||||||
@ -234,4 +242,53 @@ public class FileTransferServiceHelperUtil {
|
|||||||
throw new FileTransferServiceHelperUtilException("Error encountered while creating artifact file", e);
|
throw new FileTransferServiceHelperUtilException("Error encountered while creating artifact file", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static FileDescriptor resolve(String []urlSegments) throws FileTransferServiceHelperUtilException {
|
||||||
|
if (urlSegments.length < 4) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("URL path segments contain less than 2 segments");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tenantId;
|
||||||
|
try {
|
||||||
|
tenantId = Integer.parseInt(urlSegments[urlSegments.length - 4]);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("URL isn't pointing to a file resides in the default storage path");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String fileName = urlSegments[urlSegments.length - 1];
|
||||||
|
String folderName = urlSegments[urlSegments.length - 2];
|
||||||
|
String appHash = urlSegments[urlSegments.length - 3];
|
||||||
|
|
||||||
|
try {
|
||||||
|
InputStream fileStream = DataHolder.getInstance().
|
||||||
|
getApplicationStorageManager().getFileStream(appHash, folderName, fileName, tenantId);
|
||||||
|
if (fileStream == null) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Could not found the file " + fileName);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String []fileNameSegments = fileName.split("\\.(?=[^.]+$)");
|
||||||
|
if (fileNameSegments.length < 2) {
|
||||||
|
throw new FileTransferServiceHelperUtilException("Invalid full qualified name encountered :" + fileName);
|
||||||
|
}
|
||||||
|
FileDescriptor fileDescriptor = new FileDescriptor();
|
||||||
|
fileDescriptor.setFile(fileStream);
|
||||||
|
fileDescriptor.setFullQualifiedName(fileName);
|
||||||
|
fileDescriptor.setExtension(fileNameSegments[fileNameSegments.length - 1]);
|
||||||
|
fileDescriptor.setFileName(fileNameSegments[fileNameSegments.length - 2]);
|
||||||
|
fileDescriptor.setAbsolutePath(DataHolder.getInstance().
|
||||||
|
getApplicationStorageManager().getAbsolutePathOfFile(appHash, folderName, fileName, tenantId));
|
||||||
|
return fileDescriptor;
|
||||||
|
} catch (ApplicationStorageManagementException e) {
|
||||||
|
throw new FileTransferServiceHelperUtilException("Error encountered while getting file input stream", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,6 +23,8 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
import io.entgra.device.mgt.core.device.mgt.common.Base64File;
|
import io.entgra.device.mgt.core.device.mgt.common.Base64File;
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.common.exception.StorageManagementException;
|
import io.entgra.device.mgt.core.device.mgt.core.common.exception.StorageManagementException;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@ -31,6 +33,7 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a util class that handles Storage Management related tasks.
|
* This is a util class that handles Storage Management related tasks.
|
||||||
@ -87,13 +90,14 @@ public class StorageManagementUtil {
|
|||||||
* @param path Path the file need to be saved in.
|
* @param path Path the file need to be saved in.
|
||||||
*/
|
*/
|
||||||
public static void saveFile(InputStream inputStream, String path) throws IOException {
|
public static void saveFile(InputStream inputStream, String path) throws IOException {
|
||||||
try (OutputStream outStream = new FileOutputStream(new File(path))) {
|
try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(Files.newOutputStream(Paths.get(path)));
|
||||||
byte[] buffer = new byte[inputStream.available()];
|
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream)) {
|
||||||
if (inputStream.read(buffer) != -1) {
|
byte []buffer = new byte[8192];
|
||||||
outStream.write(buffer);
|
int n;
|
||||||
|
while ((n = bufferedInputStream.read(buffer)) != -1) {
|
||||||
|
bufferedOutputStream.write(buffer, 0, n);
|
||||||
}
|
}
|
||||||
} finally {
|
bufferedOutputStream.flush();
|
||||||
inputStream.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user