diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java index 26bed21ca5..899887f7ca 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java @@ -36,6 +36,8 @@ import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorag import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; +import org.wso2.carbon.device.application.mgt.core.exception.ParsingException; +import org.wso2.carbon.device.application.mgt.core.util.ArtifactsParser; 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.StorageManagementUtil; @@ -207,27 +209,11 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } if (ApplicationType.ANDROID.toString().equals(deviceType)) { - String prefix = "stream2file"; - String suffix = ".apk"; - File tempFile = File.createTempFile(prefix, suffix); - FileOutputStream out = new FileOutputStream(tempFile); - IOUtils.copy(binaryFile, out); - try (ApkFile apkFile = new ApkFile(tempFile)){ - ApkMeta apkMeta = apkFile.getApkMeta(); - applicationRelease.setVersion(apkMeta.getVersionName()); - Files.delete(tempFile.toPath()); - } - + ApkMeta apkMeta = ArtifactsParser.readAndroidManifestFile(binaryFile); + applicationRelease.setVersion(apkMeta.getVersionName()); } else if (ApplicationType.IOS.toString().equals(deviceType)) { - String prefix = "stream2file"; - String suffix = ".ipa"; - - File tempFile = File.createTempFile(prefix, suffix); - FileOutputStream out = new FileOutputStream(tempFile); - IOUtils.copy(binaryFile, out); - Map plistInfo = getIPAInfo(tempFile); - applicationRelease.setVersion(plistInfo.get("CFBundleVersion")); - Files.delete(tempFile.toPath()); + NSDictionary plistInfo = ArtifactsParser.readiOSManifestFile(binaryFile); + applicationRelease.setVersion(plistInfo.objectForKey(ArtifactsParser.IPA_BUNDLE_VERSION_KEY).toString()); } else { throw new ApplicationStorageManagementException("Application Type doesn't match with supporting " + "application types " + applicationRelease.getUuid()); @@ -249,6 +235,10 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager throw new ApplicationStorageManagementException( "IO Exception while saving the release artifacts in the server for the application UUID " + applicationRelease.getUuid(), e); + } catch (ParsingException e) { + throw new ApplicationStorageManagementException( + "Error occured while parsing the artifact file. Application release UUID is " + applicationRelease + .getUuid(), e); } return applicationRelease; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java index d619185ef9..f7fa79de60 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java @@ -28,7 +28,6 @@ import net.dongliu.apk.parser.bean.ApkMeta; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.io.IOUtils; -import org.json.JSONObject; import org.wso2.carbon.device.application.mgt.core.exception.ParsingException; import java.io.ByteArrayOutputStream; @@ -38,6 +37,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -55,19 +55,22 @@ public class ArtifactsParser { File tempFile = null; ApkMeta apkMeta; try { - tempFile = File.createTempFile("temp" + UUID.randomUUID(), ".apk"); try (FileOutputStream out = new FileOutputStream(tempFile)) { IOUtils.copy(inputStream, out); + try (ApkFile apkFile = new ApkFile(tempFile)) { + apkMeta = apkFile.getApkMeta(); + } } - - ApkFile apkFile = new ApkFile(tempFile); - apkMeta = apkFile.getApkMeta(); } catch (IOException e) { throw new ParsingException("Error while parsing the apk.", e); } finally { if (tempFile != null) { - tempFile.delete(); + try { + Files.delete(tempFile.toPath()); + } catch (IOException e) { + log.error("Error occured while deleting the temp file", e); + } } } return apkMeta; @@ -75,42 +78,37 @@ public class ArtifactsParser { public static NSDictionary readiOSManifestFile(InputStream inputStream) throws ParsingException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - File tempFile = null; NSDictionary rootDict; - ZipInputStream stream = null; - FileOutputStream out = null; - + File tempFile = null; try { tempFile = File.createTempFile("temp" + UUID.randomUUID(), ".ipa"); - out = new FileOutputStream(tempFile); - IOUtils.copy(inputStream, out); - stream = new ZipInputStream(new FileInputStream(tempFile)); - - ZipEntry entry; - while ((entry = stream.getNextEntry()) != null) { - if (entry.getName().matches("^(Payload/)(.)+(.app/Info.plist)$")) { - InputStream is = stream; - - int nRead; - byte[] data = new byte[16384]; - - while ((nRead = is.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); + try (FileOutputStream out = new FileOutputStream(tempFile)) { + IOUtils.copy(inputStream, out); + try (ZipInputStream stream = new ZipInputStream(new FileInputStream(tempFile))) { + ZipEntry entry; + while ((entry = stream.getNextEntry()) != null) { + if (entry.getName().matches("^(Payload/)(.)+(.app/Info.plist)$")) { + InputStream is = stream; + int nRead; + byte[] data = new byte[16384]; + + while ((nRead = is.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + buffer.flush(); + break; + } + } + try { + rootDict = (NSDictionary) BinaryPropertyListParser.parse(buffer.toByteArray()); + } catch (IllegalArgumentException e) { + log.debug("Uploaded file didn't have a Binary Plist"); + try { + rootDict = (NSDictionary) PropertyListParser.parse(buffer.toByteArray()); + } catch (Exception e1) { + throw new ParsingException("Error while parsing the non binary plist.", e1); + } } - - buffer.flush(); - break; - } - } - - try { - rootDict = (NSDictionary) BinaryPropertyListParser.parse(buffer.toByteArray()); - } catch (IllegalArgumentException e) { - log.debug("Uploaded file didn't have a Binary Plist"); - try { - rootDict = (NSDictionary) PropertyListParser.parse(buffer.toByteArray()); - } catch (Exception e1) { - throw new ParsingException("Error while parsing the non binary plist.", e1); } } } catch (PropertyListFormatException e1) { @@ -121,21 +119,13 @@ public class ArtifactsParser { throw new ParsingException("Error while parsing the file.", e); } finally { if (tempFile != null) { - tempFile.delete(); - } - try { - if (out != null) { - out.close(); - } - if (stream != null) { - - stream.close(); - + try { + Files.delete(tempFile.toPath()); + } catch (IOException e) { + log.error("Error occured while deleting the temp file", e); } - } catch (IOException e) { } } - return rootDict; } }