public class CliInstall {
private static final String DISTRIBUTION_INFO = "distribution.info";
private static final String ESSENTIAL_COMPONENT = "ESSENTIAL-COMPONENT";
- private static final int NETWORK_RETRY_COUNT = 10;
- private static final int NETWORK_RETRY_COUNT_FOR_TEST = 200;
private static ViewController controller = null;
private static ProxyType proxyType = ProxyType.AUTOMATIC;
private static String proxyHost = "";
private static String proxyPort = "";
-
/**
* Works for command line installation
}
}
- public static boolean downloadOnConsole(List<String> packageNames) throws IMExitException {
- System.out.println("");
- System.out.println("*******************************************");
- System.out.println("******** Start package downloading ********");
- System.out.println("*******************************************");
-
- PackageManager pm = PackageManager.getInstance();
-
- String targetDir = getTargetDir();
-
- if (packageNames.contains("all")) {
- if (checkAvailableSize(getAllPackages(), targetDir)) {
- Log.log("Installmanager will download all packages.");
- return downloadPackages(getAllPackages(), targetDir);
- }
- } else if (!validateDownloadPkgs(pm, packageNames)) {
- return false;
- }
-
- PackageSet downloadPkgs = pm.getPackagesByNames(packageNames);
-
- if (checkAvailableSize(downloadPkgs, targetDir)) {
- return downloadPackages(downloadPkgs, targetDir);
- } else {
- return false;
- }
-
- }
-
/**
* Get installable meta packages which are filtered by installed, updatable and installable.
* @param pm PackageManager object
}
}
- private static boolean validateDownloadPkgs(PackageManager pm, Collection<String> pkgNames) {
- ArrayList<String> wrongNames = new ArrayList<String>();
-
- for (String name : pkgNames) {
- Package pkg = pm.getPackageByName(name);
- if (pkg == null) {
- wrongNames.add(name);
- }
- }
-
- if (wrongNames.isEmpty()) {
- Log.log("All input packages are valid.");
- return true;
- } else {
- Log.err("Wrong input package name(s) : " + wrongNames);
- System.out.println("Wrong input package name(s) : " + wrongNames);
- return false;
- }
- }
-
/**
* Validate repository url.
* @return If repository does not work or is not correct, return false. otherwise return true.
private static boolean installPackages(PackageSet installablePackages, String targetDir)
throws IMExitException {
- int repeatCount = 0;
- if (Options.doTest) {
- repeatCount = NETWORK_RETRY_COUNT_FOR_TEST;
- } else {
- repeatCount = NETWORK_RETRY_COUNT;
- }
+ int repeatCount = installablePackages.size();
for (int i = repeatCount; i > 0; i--) {
try {
if (InstallManager.getInstance().install(installablePackages, targetDir, null)) {
}
} catch (IMNetworkException e) {
Log.ExceptionLog(e);
- ErrorController.setNetworkRetryCount(repeatCount - i + 1);
- System.out.println("Network error has occured. retry the download => " + (repeatCount - i + 1));
+ System.out.println("Network error has occured. retry the download => " + repeatCount);
continue;
}
}
return false;
}
-
- private static boolean downloadPackages(PackageSet downloadPkgs, String targetDir)
- throws IMExitException {
- // download packages from repository
- for (int i = NETWORK_RETRY_COUNT; i > 0; i--) {
- try {
- for (Package pkg : downloadPkgs) {
- if (!InstallManager.getInstance().downloadPackage(pkg,
- PathUtil.addURLPath(targetDir, pkg.getFileName()), null)) {
- Log.err("Fail to download package. ==> " + pkg);
- return false;
- }
- }
- return true;
- } catch (IMNetworkException e) {
- Log.ExceptionLog(e);
- ErrorController.setNetworkRetryCount(NETWORK_RETRY_COUNT - i + 1);
- System.out.println("Network error has occured. retry the download => " + (NETWORK_RETRY_COUNT - i + 1));
- continue;
- }
- }
- return false;
- }
}
import org.tizen.installmanager.core.Config;
import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.InstallManagerConstants;
import org.tizen.installmanager.lib.Log;
import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.Registry;
import org.tizen.installmanager.pkg.lib.PackageManager;
import org.tizen.installmanager.util.PathUtil;
import org.tizen.installmanager.util.ResourceHandler;
final static int BUF_SIZE = 65536;
final static int EMPTY_SIZE = 0;
- public enum UNZIP_FILE_STYLE {IMAGE, PATCH};
public enum UNZIP_RESULT {FAIL, ERROR, SUCCESS};
- public CliUnzipImage(File file) {
+ protected CliUnzipImage(File file) {
imageFile = file;
totalWork = getEntryCount(file);
}
/**
* Unzip SDK ImageFile.
*
- * @param imageFile SDK Image or Patch File.
+ * @param imageFile SDK Image File.
* @return if success to unzip is 1, not -1 or 0.
*/
- public String unzipSDKImageFile(final File imageFile, UNZIP_FILE_STYLE style) {
- String unzipTargetDir = null;
-
- if (style == UNZIP_FILE_STYLE.IMAGE) {
- if (!validation(imageFile.getAbsolutePath(), style)) {
- Log.err("This SDK image is corrupted or broken.");
- System.out.println("SDK image file does not have a package list file.");
- throw new IMFatalException("SDK image file does not have a package list file.");
- }
- Log.log("Start to unzip SDK Image File. => " + imageFile.getAbsolutePath());
-
- unzipTargetDir = PathUtil.get(Config.INSTALL_MANAGER_TEMP_DIRECTORY,
- Config.INSTALL_MANAGER_DOWNLOAD_DIRECTORY_NAME, imageFile.getName());
- } else if (style == UNZIP_FILE_STYLE.PATCH) {
- if (!validation(imageFile.getAbsolutePath(), style)) {
- Log.err("This SDK patch is corrupted or broken.");
- System.out.println("SDK patch file does not have a pkginfo.manifest file.");
- throw new IMFatalException("SDK patch file does not have a pkginfo.manifest file.");
- }
- System.out.println("*** Extracting ***");
- Log.log("Start to unzip SDK Patch File. => " + imageFile.getAbsolutePath());
-
- unzipTargetDir = PathUtil.get(Registry.getInstalledPath(), InstallManagerConstants.SDK_PATCH_TEMP_NAME);
+ public String unzipSDKImageFile(final File imageFile) {
+ if (!validation(imageFile.getAbsolutePath())) {
+ Log.err("This SDK image is corrupted or broken.");
+ System.out.println("SDK image file does not have a package list file.");
+ throw new IMFatalException("SDK image file does not have a package list file.");
}
+ Log.log("Start to unzip SDK Image File. => " + imageFile.getAbsolutePath());
+
+ String unzipTargetDir = PathUtil.get(Config.INSTALL_MANAGER_TEMP_DIRECTORY,
+ Config.INSTALL_MANAGER_DOWNLOAD_DIRECTORY_NAME, imageFile.getName());
+
Log.log("unzip to " + unzipTargetDir);
// Remove directory or file as 'binary' just in case.
ZipInputStream zis = null;
ZipEntry zipEntry = null;
int work = 1;
- int cnt = 0;
try {
fis = new FileInputStream(imageFile);
}
} else { // File case
// Make parent directory
-// File parent = new File(targetFile.getParent());
- File parent = PathUtil.makeParent(targetFile.getAbsolutePath());
-
- if (parent != null) {
- if (!parent.getAbsolutePath().equalsIgnoreCase(sdkTempDir)) {
- cnt = PathUtil.getParentCnt(fileNameToUnzip);
- }
- }
-
+ File parent = new File(targetFile.getParent());
+ parent.mkdir();
if (0 > unzipEntry(zis, targetFile)) {
System.out.println(zipEntry.getName() + " ..... done.");
- if (cnt == 0) {
- work++;
- } else {
- work = work + cnt;
- }
+ work++;
} else {
System.out.println(zipEntry.getName() + " ..... fail.");
}
if (work == totalWork) {
setUnzipResult(UNZIP_RESULT.SUCCESS);
- Log.log("Success to extract SDK image or patch properly.");
+ Log.log("Success to extract SDK image properly.");
} else {
- Log.err("InstallManager cannot extract SDK image or patch properly. (Total entry : " + totalWork
+ Log.err("InstallManager cannot extract SDK image properly. (Total entry : " + totalWork
+ " Extracted entry : " + work);
setUnzipResult(UNZIP_RESULT.ERROR);
}
}
@SuppressWarnings("unused")
- private boolean validation(String strDir, UNZIP_FILE_STYLE style) {
+ private boolean validation(String strDir) {
ZipFile zipFile = null;
ZipEntry entry = null;
}
if (zipFile != null) {
- if (style == UNZIP_FILE_STYLE.IMAGE) {
- String packageList = PackageManager.getInstance().getPackageListFileName();
- Log.log("This platform must have package list file as '" + packageList + "'");
- entry = zipFile.getEntry(packageList);
- } else if (style == UNZIP_FILE_STYLE.PATCH) {
- String scriptFile = InstallManagerConstants.SDK_PATCH_PKG_INFO;
- Log.log("Patch must have pkginfo.manifest file.");
- entry = zipFile.getEntry(scriptFile);
- }
+ String packageList = PackageManager.getInstance().getPackageListFileName();
+ Log.log("This platform must have package list file as '" + packageList + "'");
+
+ entry = zipFile.getEntry(packageList);
try {
zipFile.close();
import java.util.ArrayList;
import java.util.List;
-import org.tizen.installmanager.cli.CliUnzipImage.UNZIP_FILE_STYLE;
import org.tizen.installmanager.cli.CliUnzipImage.UNZIP_RESULT;
import org.tizen.installmanager.core.Config;
import org.tizen.installmanager.core.IMExitException;
import org.tizen.installmanager.core.Options;
import org.tizen.installmanager.core.Config.ServerType;
import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Patch;
import org.tizen.installmanager.lib.Registry;
import org.tizen.installmanager.ui.InstallManagerWindow;
unzipSDKImage();
}
- if (!Registry.getInstalledPath().equals("")) {
+ if (Registry.getInstalledPath() != "") {
List<String> all = new ArrayList<String>();
all.add("all");
if (cliUninstall(all)) {
String imgFilePath = CliInstall.getReformedPath(Options.imageFilePath, false);
File imageFile = new File(imgFilePath);
CliUnzipImage cui = new CliUnzipImage(imageFile);
- String unzipTargetDir = cui.unzipSDKImageFile(imageFile, UNZIP_FILE_STYLE.IMAGE);
+ String unzipTargetDir = cui.unzipSDKImageFile(imageFile);
if (cui.getUnzipResult() == UNZIP_RESULT.SUCCESS) {
Options.repository = unzipTargetDir;
}
public static boolean cliNetworkInstall(List<String> packageNames) throws IMExitException {
- if (!Registry.getInstalledPath().equals("")) {
+ if (Registry.getInstalledPath() != "") {
String installRepo = Config.getInstance().getConfigFile().getRepository();
String installDist = Config.getInstance().getConfigFile().getDistribution();
String remoteRepo = Options.repository;
}
public static boolean cliUninstall(List<String> packageNames) throws IMExitException {
- if (Registry.getInstalledPath().equals("")) {
+ if (Registry.getInstalledPath() == "") {
System.out.println("Tizen SDK was not installed.");
return false;
} else {
}
}
- public static boolean cliDownload(List<String> packageNames) throws IMExitException {
- CliInstall.refresh(); // Refresh installation environment.
-
- if (!CliInstall.validateRepository(true)) {
- return false;
- }
-
- boolean result = false;
-
- if (CliInstall.downloadOnConsole(packageNames)) {
- result = true;
- Log.log("Success to download packages as cli.");
- } else {
- result = false;
- Log.err("Fail to download packages as cli.");
- }
- return result;
-
- }
-
public static void cliShowHelp() {
System.out.println("Usage");
System.out.println("Network install : InstallManager.bin(exe, sh) -install" +
public static void cliShowPackageList() {
CliShowInformation.showRepoPackages();
}
-
- public static void cliSDKPatch() {
- System.out.println("****************************************");
- System.out.println("*********** Start SDK patch ************");
- System.out.println("****************************************");
-
- Patch patch = new Patch();
- if (patch.patchSDK()) {
- System.out.println("Success to SDK patch process.");
- } else {
- System.out.println("Fail to SDK patch process.");
- }
- }
}
-/*
- * InstallManager
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact:
- * Wooyoung Cho <wooyoung1.cho@samsung.com>
- * Shihyun Kim <shihyun.kim@samsung.com>
- * Taeyoung Son <taeyoung2.son@samsung.com>
- * Yongsung kim <yongsung1.kim@samsung.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Contributors:
- * - S-Core Co., Ltd
- *
- */
-
-package org.tizen.installmanager.core;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-
-import org.tizen.installmanager.lib.Checksum;
-import org.tizen.installmanager.lib.Downloader;
-import org.tizen.installmanager.lib.ErrorController;
-import org.tizen.installmanager.lib.ErrorController.InfoCode;
-import org.tizen.installmanager.lib.IIMProgressMonitor;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.Registry;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.exception.IMNetworkException;
-import org.tizen.installmanager.lib.win.WindowsProgramController;
-import org.tizen.installmanager.pkg.lib.PackageManager;
-import org.tizen.installmanager.pkg.model.Package;
-import org.tizen.installmanager.pkg.model.PackageSet;
-import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor;
-import org.tizen.installmanager.util.IMShellCommandFail;
-import org.tizen.installmanager.util.PathUtil;
-import org.tizen.installmanager.util.ShellUtil;
-
-/**
- * This class contains the main business logic of Install Manager. Use singleton
- * instance.
- *
- * @author Shihyun Kim <shihyun.kim@samsung.com>
- */
-public class InstallManager {
-
- private static final InstallManager mInstallManager = new InstallManager();
-
- private Config mConfig = null;
- private static Downloader mDownloader = new Downloader();
- private PackageManager packageManager;
-
- // windows path
- private static String WINDOWS_INSTALL_MANAGER_INSTALL_SCRIPT = "/res/desktop_directory/install.vbs";
- private static String WINDOWS_INSTALL_MANAGER_REMOVE_SCRIPT = "/res/desktop_directory/remove.vbs";
- private static String WINDOWS_MAKE_SHORTCUT_PATH = "/res/desktop_directory/makeshortcut.vbs";
- private static String WINDOWS_REMOVE_SHORTCUT_PATH = "/res/desktop_directory/removeshortcut.vbs";
-
- // linux script
- private static String LINUX_INSTALL_MANAGER_INSTALL_SCRIPT = "/res/desktop_directory/install.sh";
- private static String LINUX_INSTALL_MANAGER_REMOVE_SCRIPT = "/res/desktop_directory/remove.sh";
- private static String LINUX_MAKE_SHORTCUT_PATH = "/res/desktop_directory/makeshortcut.sh";
- private static String LINUX_REMOVE_SHORTCUT_PATH = "/res/desktop_directory/removeshortcut.sh";
- private static String LINUX_TSUDO_PATH = "/res/desktop_directory/tsudo.sh";
-
- private File makeShortCutFile = null;
- private File removeShortCutFile = null;
- private File tSudoFile = null;
-
- private static String REMOVE_ALL_PACKAGES = "Remove all packages...";
- private static String REMOVE_ALL_SDK_FILES = "Remove all SDK files...";
-
- private Thread installThread = null;
- private LinkedList<Package> installBuffer = new LinkedList<Package>();
-
- private InstallManager() {
- }
-
- /**
- * @return singleton instance of <code>InstallManager</code>
- */
- public static InstallManager getInstance() {
- return mInstallManager;
- }
-
- /**
- * Load config file
- */
- public void initConfig() {
- if (mConfig != null) {
- Registry.saveRepoInfo(mConfig.getConfigFile().getRepository());
- if (Config.isSupportMultiSDK()) {
- if (!Registry.getInstalledPath().isEmpty()) {
- mConfig.setTargetDir(Registry.getInstalledPath());
- }
- } else {
- return;
- }
- } else {
- mConfig = Config.getInstance();
- Registry.saveRepoInfo(mConfig.getConfigFile().getRepository());
- if (Options.doReplaceRepository) {
- Log.log("Replace repository => " + Options.repository);
- mConfig.getConfigFile().setRepository(Options.repository);
- mConfig.saveConfig();
- }
-
- if (Options.distribution != null && !Options.distribution.isEmpty()) {
- mConfig.getConfigFile().setDistribution(Options.distribution);
- mConfig.saveConfig();
- }
-
- if (mConfig.getConfigFile() == null) {
- Log.log("Loading config file failed");
- throw new IMFatalException("Loading configuration file failed");
- }
-
- if (!Registry.getInstalledPath().isEmpty()) {
- mConfig.setTargetDir(Registry.getInstalledPath());
- }
- mConfig.setSdkDatatDir(Registry.getSdkDataPath());
- }
- }
-
- /**
- * Initialize packages information.
- */
- public void initPackageList() {
- Collection<String> repositoryURLs = mConfig.getSDKPackageServerList();
-
- initPackageManager(repositoryURLs);
- }
-
- private void initPackageManager(Collection<String> repositoryURLs) {
- File installedPackageListFile = null;
- if (!Registry.targetPath.equalsIgnoreCase("")) {
- installedPackageListFile = new File(PathUtil.get(
- PathUtil.get(Registry.targetPath, Config.INFO_DIRECTORY),
- Config.INSTALLED_PACKAGE_LIST_FILE_NAME));
- } else {
- installedPackageListFile = new File(PathUtil.get(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),
- Config.INSTALLED_PACKAGE_LIST_FILE_NAME));
- }
-
- try {
- if (installedPackageListFile.exists()) {
- this.packageManager = PackageManager.getInstance(
- installedPackageListFile, repositoryURLs);
- } else {
- this.packageManager = PackageManager.getInstance(null,
- repositoryURLs);
- }
- } catch (IOException e) {
- Log.err("Cannot load package manager =>" + installedPackageListFile
- + ", " + repositoryURLs);
- throw new IMFatalException(ErrorCode.CANNOT_CREATE_FILE);
- }
- }
-
- /**
- * Initialize distribution and snapshot information
- */
- public boolean initDistribution() {
- DistributionController controller = DistributionController
- .getInstance(mConfig.getSDKRepositoryList());
-
- boolean initResult = controller.init();
- Log.log("Init Distribution result => " + initResult);
-
- // First distribution that read from config file is recognized as the
- // distribution installed.
- String installedDistribution = Config.getInstance().getConfigFile()
- .getDistribution();
- controller.setInstalledDistribution(installedDistribution);
-
- return initResult;
- }
-
- /**
- * Initialize installmanager. It performs that read config file, make
- * temporary files and load package list from repository.
- *
- * @return <code>true</code> if initialize success to install or uninstall.
- */
- public void init() {
- initConfig();
-
- cleanPackageDir();
-
- initDistribution();
- if (Config.status == Config.Status.INSTALL) {
- checkOldSDK();
- }
- initPackageList();
- initConfigurationFile();
- checkNewPackageServer();
- }
-
- /**
- * If packageServer has multi SDK packages, set Config.isNewPackageServer
- * true. otherwise false. InstallManager can be used old SDK installation.
- */
- private void checkNewPackageServer() {
- if (packageManager
- .getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME) == null) {
- Config.isNewPackageServer = false;
- Log.log("PackageServer has old SDK packages.");
- } else {
- Config.isNewPackageServer = true;
- Log.log("PackageServer has new SDK packages(Multi SDK).");
- }
- }
-
- private void initConfigurationFile() {
- copyMakeShortCutFile();
- copyRemoveShortCutFile();
-
- // Linux has several kinds such as Ubuntu, Fedora, etc. So, If
- // installation needs super user's
- // permission, sudo command depends on machine. Therefore,
- // Installmanager gives a tsudo command
- // which does not need to care of machine post install script for
- // package.
- if (Platform.isLinux()) {
- copyTizenSudoFile();
- }
- }
-
- /**
- * Delete temporary files related installmanager.
- */
- public static void deleteTempFile() {
-
- File tmpDir = new File(PathUtil.getTempFileParent());
- File[] tmpFiles = tmpDir.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- boolean found = false;
- String[] prefix = { "makeshortcut", "removeshortcut",
- "installmanager.repository", "Packages",
- "tizen_installmanager", "checkJavaInstallation",
- "install" };
- for (String pref : prefix) {
- found = name.startsWith(pref);
- if (found == true) {
- return true;
- }
- }
- return found;
- }
- });
-
- if (tmpFiles != null) {
- for (File f : tmpFiles) {
- if (!f.delete()) {
- Log.err("Fail to delete file ==> " + f);
- }
- }
- }
- }
-
- /**
- * Copy make shortcut file from resource to temp directory.
- */
- private void copyMakeShortCutFile() {
- try {
- if (Platform.isLinux()) {
- makeShortCutFile = PathUtil.getTempFileFromResource(
- LINUX_MAKE_SHORTCUT_PATH, "makeshortcut", ".sh");
- } else if (Platform.isWindows()) {
- makeShortCutFile = PathUtil.getTempFileFromResource(
- WINDOWS_MAKE_SHORTCUT_PATH, "makeshortcut", ".vbs");
- } else if (Platform.isMacOS()) {
- makeShortCutFile = PathUtil.getTempFileFromResource(
- LINUX_MAKE_SHORTCUT_PATH, "makeshortcut", ".sh");
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
-
- if (makeShortCutFile.exists()) {
- makeShortCutFile.setExecutable(true);
- }
- } catch (IOException e) {
- Log.err("Installer cannot make 'makeshortcut script' file.");
- throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT);
- }
- }
-
- /**
- * Copy remove shortcut file from resource to temp directory.
- */
- private void copyRemoveShortCutFile() {
- try {
- if (Platform.isLinux()) {
- removeShortCutFile = PathUtil.getTempFileFromResource(
- LINUX_REMOVE_SHORTCUT_PATH, "removeshortcut", ".sh");
- } else if (Platform.isWindows()) {
- removeShortCutFile = PathUtil.getTempFileFromResource(
- WINDOWS_REMOVE_SHORTCUT_PATH, "removeshortcut", ".vbs");
- } else if (Platform.isMacOS()) {
- removeShortCutFile = PathUtil.getTempFileFromResource(
- LINUX_REMOVE_SHORTCUT_PATH, "removeshortcut", ".sh");
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- removeShortCutFile.setExecutable(true);
- } catch (IOException e) {
- Log.err("Installer cannot make 'makeshortcut script' file.");
- throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT);
- }
- }
-
- /**
- * Copy remove shortcut file from resource to temp directory.
- */
- private void copyTizenSudoFile() {
- try {
- tSudoFile = PathUtil.getTempFileFromResource(LINUX_TSUDO_PATH,
- "tsudo", ".sh");
- tSudoFile.setExecutable(true);
- } catch (IOException e) {
- Log.err("Installer cannot make 'tsudo.sh' file.");
- throw new IMFatalException(ErrorCode.CANNOT_CREATE_TSUDO);
- }
- }
-
- /**
- * get make shortcut File instance.
- *
- * @return File instance of makeshortcut script.
- */
- public File getTSudo() {
- return tSudoFile;
- }
-
- /**
- * Get temporary file path.(makeshortcut script, Packages list, Installer
- * log)
- *
- * @return temporary file path, if not exist makeshortcut file, return empty
- * string.
- */
- public String getTSudoPath() {
- if (getTSudo() == null) {
- return "";
- } else {
- return getTSudo().getAbsolutePath();
- }
- }
-
- /**
- * get make shortcut File instance.
- *
- * @return File instance of makeshortcut script.
- */
- public File getMakeShortCut() {
- return makeShortCutFile;
- }
-
- /**
- * Get temporary file path.(makeshortcut script, Packages list, Installer
- * log)
- *
- * @return temporary file path, if not exist makeshortcut file, return empty
- * string.
- */
- public String getMakeShortCutPath() {
- if (getMakeShortCut() == null) {
- return "";
- } else {
- return getMakeShortCut().getAbsolutePath();
- }
- }
-
- /**
- * Get temporary file path.(rmoveshortcut script, Packages list, Installer
- * log)
- *
- * @return temporary file path, if not exist removeshortcut file, return
- * emptry string.
- */
- public String getRemoveShortCutPath() {
- if (getRemoveShortCut() == null) {
- return "";
- } else {
- return getRemoveShortCut().getAbsolutePath();
- }
- }
-
- /**
- * Get remove shortcut File instance.
- *
- * @return File instance of removeshortcut script.
- */
- public File getRemoveShortCut() {
- return removeShortCutFile;
- }
-
- /**
- * Get Config instance
- *
- * @return
- */
- public Config getConfig() {
- return mConfig;
- }
-
- /**
- * Get PackageManager instance.
- *
- * @return
- */
- public PackageManager getPackageManager() {
- return packageManager;
- }
-
- /**
- * Check old SDK is installed for compatibility.
- */
- private void checkOldSDK() {
- Log.log("Check old SDK.");
- if (Registry.getOldInstalledPath() != "") { // Old SDK is installed.
- if (Registry.getInstalledPath() != null && !Registry.getInstalledPath().isEmpty()) {
- // Old SDK is installed but new SDK is also installed, so environment does not need to
- // set new SDK environment.
- Log.log("Old SDK is installed but new SDK is also installed. => "
- + Registry.getInstalledPath());
- return;
- } else {
- Log.log("Old SDK is installed. => "
- + Registry.getOldInstalledPath());
- setCurrentSDKEnvironment(Registry.getOldInstalledPath());
- }
- } else {
- return;
- }
- }
-
- /**
- * If old SDK is installed and new SDK is not installed, installmanager set
- * environment for new SDK running properly.
- *
- * @param targetPath
- * SDK installed path.
- */
- private void setCurrentSDKEnvironment(String targetPath) {
- Log.log("Set new SDK environment from old SDK.");
- Registry.sdkDataPath = Config.getConfigHome();
-
- if (targetPath == null || targetPath.isEmpty()) {
- Log.err("Install path is invalid: " + targetPath
- + ". This might be a bug of IM");
- throw new IMFatalException(ErrorCode.INVALID_INSTALL_PATH);
- } else {
- Registry.exportInstallPath(targetPath);
- Registry.exportMultiInstallPath(targetPath, true);
- }
-
- // Make sdk.info file into target directory for compatibility.
- Registry.saveSDKInfo(targetPath);
- // Remove tizensdkpath file in 'tizen-sdk-data'.
- // Registry.removeOldRegistry();
- }
-
- /**
- * @param pkg
- * @param filePath
- * @return <code>true</code> if the package is already downloaded to the
- * file path
- */
- private boolean existInCacheFolder(Package pkg, String filePath,
- IIMProgressMonitor monitor) {
- File file = new File(filePath);
-
- if (!file.exists()) {
- return false;
- }
-
- if (monitor != null) {
- monitor.workedDownloadProgress("Validate the " + pkg.getPackageName(), 0);
- }
-
- if (Options.doPackageValidation) {
- if (Checksum.getSHA256(filePath) != null) {
- return checkFileChecksum(pkg, Checksum.getSHA256(filePath));
- } else {
- return false;
- }
- } else {
- return true;
- }
- }
-
- private boolean checkPackageSize(Package pkg, long size) {
- if (pkg.getPackageSize() == size) {
- return true;
- }
- return false;
- }
-
- private boolean checkFileChecksum(Package pkg, MessageDigest mDigest) {
-
- if (pkg.getSHA256() == null || pkg.getSHA256().isEmpty()) {
- return false;
- }
-
- if (mDigest.getAlgorithm().equals(Checksum.SHA_256_TYPE)) {
- return (pkg.getSHA256().equalsIgnoreCase(Checksum
- .messageDigestToString(mDigest)));
- } else {
- // TODO there's no checksum field in package.
- return false;
- }
- }
-
- /**
- * Packages Installation management. Download and install packages.
- *
- * @param packagesToInstall
- * @param targetDir
- * @param monitor
- * @return
- * @throws IMExitException
- */
- public boolean install(PackageSet installablePackages,
- final String targetDir, InstallProgressMonitor monitor)
- throws IMExitException, IMNetworkException {
- Log.log("InstallManager.install() installable packages : "
- + installablePackages);
-
- // performance measurement
- Performance.sdkPackageSize = packageManager
- .getTotalSizeOfInstallablePackages(installablePackages, true);
-
- if (installablePackages == null || targetDir == null
- || targetDir.isEmpty()) {
- Log.err("packaegs => " + installablePackages + ", targetDir => "
- + targetDir);
- return false;
- }
-
- mConfig.setTargetDir(targetDir);
- mConfig.setSdkDatatDir(Registry.sdkDataPath);
-
- if (monitor != null) {
- monitor.workedRefresh();
- monitor.beginTask(installablePackages.size(),
- getTotalDownloadSize(installablePackages),
- getTotalInstallSize(installablePackages));
- }
-
- initializeTargetDir(targetDir);
- makeShortcutMenu();
-
- // TODO : refactoring.
- long size = 0;
- if (Options.onlyDownload) {
- System.out.print("Downloading package => " + packageToDownload + " .......");
- }
- Log.log("start download package: " + packageToDownload);
- URL packageUrl = packageToDownload.getURL();
-
- if (monitor != null) {
- monitor.workedDownload(packageToDownload.getPackageName());
- }
- size = mDownloader.download(packageUrl, fileDownloadTargetPath,
- monitor);
-
- if (size >= 0) {
- if (Options.onlyDownload) {
- System.out.println(" done.");
- }
- Log.log("finish download");
- } else {
- Log.err("download failed => " + packageToDownload.getURL());
-
- PathUtil.remove(fileDownloadTargetPath);
-
- String errMsg = "";
- if (monitor.isCanceled()) {
- errMsg = ErrorController.getErrorMessage();
- } else {
- errMsg = "Fail to get '" +
- packageToDownload.getPackageName() + "'." +
- "\n(" + ErrorController.getErrorMessage() + ")";
- }
- throw new IMFatalException(errMsg);
- }
-
- // download complete.
- if (monitor != null) {
- monitor.workedDownloadProgress("Download complete", 0);
- monitor.downloadDone();
- }
-
- // install thread is running yet.
- try {
- installThread.join();
- } catch (InterruptedException e) {
- Log.ExceptionLog(e);
- Log.err("");
- }
-
- // install complete
- if (monitor != null) {
- monitor.workedInstallProgress("Installation complete", 0);
- monitor.installDone();
- }
-
- // save config file
- mConfig.saveConfig();
-
- // save sdk version.
- saveSDKVersion();
-
- // Delete installed packages
- if (Options.doRemovePackages) {
- removePackagesDir();
- }
-
- if (Config.status == Config.Status.INSTALL) {
- Registry.exportMultiInstallPath(targetDir, true);
- }
-
- // show reboot message in linux platform.
- if (Platform.isLinux() || Platform.isMacOS()) {
- ErrorController.setInfoCode(InfoCode.RESTART_THE_COMPUTER);
- }
-
- Performance.setInstallationEndTime();
- return true;
- }
-
- private long getTotalDownloadSize(PackageSet pkgSet) {
- if (pkgSet == null) {
- return -1;
- }
-
- long totalSize = 0;
- for (Package pkg : pkgSet) {
- totalSize += pkg.getPackageSize();
- }
-
- return totalSize;
- }
-
- private long getTotalInstallSize(PackageSet pkgSet) {
- if (pkgSet == null) {
- return -1;
- }
-
- long totalSize = 0;
- for (Package pkg : pkgSet) {
- totalSize += pkg.getUncompressedPackageSize();
- }
-
- return totalSize;
- }
-
- private boolean install(final Package pkg, final String targetDir,
- final InstallProgressMonitor monitor) throws IMExitException,
- IMNetworkException {
- Log.log("Install package => " + pkg.getPackageName());
- Log.log("Target directory => " + targetDir);
-
- boolean result = false;
-
- if (Options.doTest && Performance.getDownloadStartTime() == null) {
- Performance.setDownloadStartTime();
- }
-
- // download package from repository.
- result = downloadPackage(pkg, monitor);
-
- if (Options.doTest) {
- Performance.setDownloadEndTime();
- }
-
- if (result) {
- installBuffer.push(pkg);
-
- if (Options.doTest
- && Performance.getInstallationStartTime() == null) {
- Performance.setInstallationStartTime();
- }
-
- if (installThread == null || !installThread.isAlive()) {
- installThread = new Thread() {
- public void run() {
- Package p = null;
- while ((p = installBuffer.pollLast()) != null) {
- if (!installPackage(p, targetDir, monitor)) {
- return;
- }
-
- if (installBuffer.size() <= 0) {
- if (monitor != null ) {
- monitor.workedInstallProgress("Waiting for download", 0);
- monitor.installEnd();
- }
- }
- }
- }
- };
-
- installThread.start();
- }
-
- if (Options.doTest) {
- Performance.setInstallationEndTime();
- }
-
- if (!ErrorController.checkInstallationSuccess()) {
- return false;
- }
- } else {
- Log.log("Installation failed. => " + pkg.getPackageName());
- return false;
- }
-
- return result;
- }
-
- /**
- * Packages Installation management.
- * Download and install packages.
- *
- * @param packagesToInstall
- * @param targetDir
- * @param monitor
- * @return
- * @throws IMExitException
- */
- public boolean install(PackageSet installablePackages, final String targetDir,
- InstallProgressMonitor monitor) throws IMExitException, IMNetworkException{
- Log.log("InstallManager.install() installable packages : " + installablePackages);
-
- //performance measurement
- Performance.sdkPackageSize = packageManager.getTotalSizeOfInstallablePackages(installablePackages, true);
-
- if (installablePackages == null || targetDir == null || targetDir.isEmpty()) {
- Log.err("packaegs => " + installablePackages + ", targetDir => "
- + targetDir);
- return false;
- }
-
- mConfig.setTargetDir(targetDir);
- mConfig.setSdkDatatDir(Registry.sdkDataPath);
-
- Performance.setDownloadStartTime();
-
- // download packages from repository
- if (downloadPackages(installablePackages, monitor)) {
- Log.log("Success to download packages from repository.");
- } else {
- Log.err("Fail to download packages from repository.");
- if (!Options.doResumeDownloading) {
- removePackagesDir();
- }
-
- return false;
- }
-
- // check the cancel button
- if (monitor != null) {
- if (monitor.isCanceled()) {
- Log.log("download canceled");
- throw new IMInstallCancelException();
- } else {
- monitor.workedDownloadProgress(pkg.getPackageName(), 1);
- }
- }
-
- URL downloadFileURL = pkg.getURL();
- String downloadTargetPath = getDownloadTargetPath(pkg);
-
- Performance.setInstallationStartTime();
- // save target directory
- initializeTargetDir(targetDir);
-
- //if distribution is changed, remove all packages and install.
- if (packageManager.isReInstallable()) {
- removeAllPackages(monitor);
- } else {
- // remove missing packages
- if (!packageManager.isRepoPackagesEmpty()) {
- // Remove missing packages only network installation.
- if (Config.fromWhere == Config.ConfDialog.SNAPSHOT) {
- removeMissingPackages(monitor);
- }
- }
-
- // download package from repository
- long size = mDownloader.download(downloadFileURL, downloadTargetPath,
- monitor);
-
- if (size >= 0) {
- if (Options.onlyDownload) {
- System.out.println("Download success. => " + pkg);
- }
- Log.log("finish download => " + pkg);
- } else { // fail
- Log.err("download failed => " + downloadFileURL);
-
- PathUtil.remove(downloadTargetPath);
-
- String errMsg = "";
- if (monitor.isCanceled()) {
- errMsg = ErrorController.getErrorMessage();
- } else {
- errMsg = "Fail to get '" + pkg.getPackageName() + "'." + "\n("
- + ErrorController.getErrorMessage() + ")";
- }
- throw new IMFatalException(errMsg);
- }
-
- // package validation
- if (Options.doPackageValidation) {
- Log.log("Validate package");
- if (!checkPackageSize(pkg, size)) {
- Log.err("The expected size of package => "
- + pkg.getPackageSize());
- Log.err("Package size error. downloaded size => " + size);
-
- PathUtil.remove(downloadTargetPath);
-
- throw new IMFatalException(ErrorCode.PACKAGE_WRONG_SIZE);
- }
-
- // TODO :
- if (!checkFileChecksum(pkg, mDownloader.getFileChecksum())) {
- Log.err("The expected checksum of package => "
- + pkg.getSHA256());
- Log.err("Package checksum error downloaded checksum => "
- + mDownloader.getFileChecksum());
-
- PathUtil.remove(downloadTargetPath);
-
- throw new IMFatalException(ErrorCode.PACKAGE_WRONG_CHECKSUM);
- }
- }
-
- int i = 0;
- for (Package pkg : installablePackages) {
- if (monitor != null) {
- monitor.workedProcess(pkg.getPackageName());
- monitor.worked(++i);
- }
-
- private boolean installPackage(Package pkg, String targetDir,
- InstallProgressMonitor monitor) {
- // save target directory
- initializeTargetDir(targetDir);
-
- // remove packages to update.
- if (packageManager.isInstalledPackage(pkg) && (packageManager.isReInstall() || packageManager.isUpdatable(pkg))) {
- if (monitor != null) {
- monitor.workedInstallProgress("Remove the previous version", 0);
- }
-
- removePackage(pkg, null);
- }
-
- // remove conflict packages
- PackageSet pkgSet = packageManager.getConflictPackages(pkg);
- if (pkgSet.size() > 0) {
- if (monitor != null) {
- monitor.workedInstallProgress("Remove the conflict packages", 0);
- }
- removePackages(pkgSet, null);
- }
-
- if (Options.doInstallNoUI) {
- System.out.println(pkg.getPackageName() + " is installing...");
- }
-
- Installer installer = new Installer();
- boolean bResult = installer.install(pkg, targetDir, monitor);
-
- if (bResult) {// save installed package list
- packageManager.addPackageToInstalledPackages(pkg);
- packageManager.saveInstalledList();
- } else {
- Log.log("Installation failed => " + pkg);
-
- ErrorController.setError(ErrorCode.INSTALLATION_FAIL);
- ErrorController.setInstallationSuccess(false);
- }
-
- return bResult;
- }
-
- public String getDownloadTargetPath(Package pkg) {
- String repository = pkg.getBaseURL().toString();
-
- String encodeRepository = null;
- try {
- encodeRepository = URLEncoder.encode(repository, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- Log.ExceptionLog(e);
- return encodeRepository;
- }
-
- return PathUtil.get(mConfig.getDownloadDirPath(), encodeRepository,
- pkg.getFileName());
- }
-
- private boolean installInstallManagerFromLocal(String sdkPath) {
- Log.log("Install install-manager from local. => " + sdkPath);
- String targetDir = PathUtil.get(sdkPath,
- InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME);
-
- File targetDirFile = new File(targetDir);
-
- if (!targetDirFile.exists()) {
- targetDirFile.mkdirs();
- }
-
- try {
- if (Platform.isLinux()) {
- installInstallManagerFromLocalInLinux(targetDir);
- } else if (Platform.isWindows()) {
- installInstallManagerFromLocalInWindows(targetDir);
- } else if (Platform.isMacOS()) {
- installInstallManagerFromLocalInMac(targetDir);
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
-
- File toInstallManagerImage = new File(PathUtil.get(
- Registry.getInstalledPath(),
- InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME,
- InstallManagerConstants.INSTALLMANAGER_SHORTCUT_IMAGE_NAME));
- PathUtil.writeFileFromInputStream(
- PathUtil.getResourceAsStream(InstallManagerConstants.INSTALLMANAGER_SHORTCUT_IMAGE_PATH),
- toInstallManagerImage);
-
- File toDesktopFile = new File(PathUtil.get(
- Registry.getInstalledPath(),
- InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME,
- InstallManagerConstants.DESKTOP_SHORTCUT_IMAGE_NAME));
- PathUtil.writeFileFromInputStream(
- PathUtil.getResourceAsStream(InstallManagerConstants.DESKTOP_SHORTCUT_IMAGE_PATH),
- toDesktopFile);
-
- } catch (IOException e) {
- Log.ExceptionLog(e);
- return false;
- }
-
- // execute install script
- File installScript = getInstallScript();
- if (installScript != null && installScript.exists()) {
- installScript.setExecutable(true);
-
- Installer installer = new Installer();
- try {
- installer.executeScript(installScript);
- return true;
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- }
- }
- return false;
- }
-
- private void installInstallManagerFromLocalInLinux(String targetDir) {
- try {
- // copy excutable file to target directory
- PathUtil.copy(PathUtil.get(Options.executablePath,
- InstallManagerConstants.INSTALLMANAGER_BINARY_NAME),
- targetDir);
-
- // copy library file to target directory
- PathUtil.copy(PathUtil.get(PathUtil.getCurrentDir(),
- InstallManagerConstants.INSTALLMANAGER_JAR_FILE_NAME),
- targetDir);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
-
- private void installInstallManagerFromLocalInWindows(String targetDir) {
- installInstallManagerFromLocalInLinux(targetDir);
- }
-
- private void installInstallManagerFromLocalInMac(String targetDir) {
- String parentDir = PathUtil.getParentDirectory(
- PathUtil.getCurrentDir(), 4);
-
- String imExecutableAppDirPath = PathUtil
- .get(parentDir,
- InstallManagerConstants.INSTALLMANAGER_EXECUTALBE_DIR_NAME_FOR_MAC);
- String command = "cp -rf " + imExecutableAppDirPath + " " + targetDir;
-
- try {
- ShellUtil.execute(command);
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- Log.err(command);
- throw new IMFatalException(
- ErrorCode.CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY);
- }
-
- String imExecutableBinaryPath = PathUtil
- .get(parentDir,
- InstallManagerConstants.INSTALLMANAGER_EXECUTALBE_FILE_NAME_FOR_LINUX);
- command = "cp -rf " + imExecutableBinaryPath + " " + targetDir;
-
- try {
- ShellUtil.execute(command);
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- return;
- }
-
- String imJarFilePath = PathUtil.get(parentDir,
- InstallManagerConstants.INSTALLMANAGER_JAR_FILE_NAME);
- command = "cp -rf " + imJarFilePath + " " + targetDir;
-
- try {
- ShellUtil.execute(command);
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- return;
- }
- }
-
- private void removeMissingPackages(IIMProgressMonitor monitor) {
- PackageSet missingPackages = packageManager
- .getMissingPackagesFromRepository();
- Log.log("Remove missing packages => " + missingPackages);
-
- if (monitor != null) {
- monitor.workedDownloadProgress("Remove missing packages", 0);
- }
-
- for (Package pkg : missingPackages) {
- if (!removePackage(pkg, monitor)) {
- Log.err("Cannot remove missing package");
- throw new IMFatalException(
- ErrorCode.CANNOT_REMOVE_MISSING_PACKAGE);
- }
- }
- }
-
- /**
- * Initializes target directory
- *
- * @param targetDir
- * path to SDK target directory
- */
- public void initializeTargetDir(String targetDir) {
- Log.log("Initialize target dir. " + targetDir);
- // Make target directory
- File targetDirFile = new File(targetDir);
- if (!targetDirFile.exists()) {
- if (!targetDirFile.mkdirs()) {
- Log.err("Fail to create file ==> " + targetDirFile);
- }
- }
-
- // Keep target path in system
- Registry.exportInstallPath(targetDir);
-
- // Keep target path for later use
- mConfig.setTargetDir(targetDir);
- mConfig.setSdkDatatDir(Registry.sdkDataPath);
-
- // Make .info directory
- if (!mConfig.makeInfoDirectory()) {
- Log.err(Config.CONFIG_HOME_PATH + " cannot create.");
- throw new IMFatalException(ErrorCode.CANNOT_CREATE_CONFIG_FILE);
- }
- }
-
- /**
- * Save installed SDK version.
- */
- public void saveSDKVersion() {
- Registry.saveInstallVersion(mConfig.getConfigFile()
- .getInstallManagerVersion());
- }
-
- /**
- * Make tizen menu and installmanager shortcut.
- */
- private void makeShortcutMenu() {
- Log.log("InstallManager make shortcut menu.");
-
- // execute install script.
- File installScript = getInstallScript();
- if (installScript != null) {
- installScript.setExecutable(true);
-
- Installer installer = new Installer();
- try {
- installer.executeScript(installScript);
- } catch (IMShellCommandFail e) {
- // TODO
- Log.ExceptionLog(e);
- }
- }
- }
-
- /**
- * Get install script from resource according to each platform.
- *
- * @return
- */
- private File getInstallScript() {
- try {
- if (Platform.isLinux()) {
- return PathUtil.getTempFileFromResource(
- LINUX_INSTALL_MANAGER_INSTALL_SCRIPT, "im_install",
- ".sh");
- } else if (Platform.isWindows()) {
- return PathUtil.getTempFileFromResource(
- WINDOWS_INSTALL_MANAGER_INSTALL_SCRIPT, "im_install",
- ".vbs");
- } else if (Platform.isMacOS()) {
- return null;
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- } catch (IOException e) {
- Log.err("Cannot execute InstallManager's install script.");
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT);
- }
- }
-
- private void removeInstallManager() {
- Log.log("InstallManager.removeInstallManager");
-
- String installManagerDirectory = PathUtil.get(
- Registry.getInstalledPath(),
- InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME);
- PathUtil.remove(installManagerDirectory);
-
- if (Registry.getInstalledPath().isEmpty()) {
- return;
- }
- }
-
- private void removeShortcutMenu() {
- File removeScript = getRemoveScript();
-
- if (removeScript == null) {
- return;
- }
-
- removeScript.setExecutable(true);
-
- Installer installer = new Installer();
- try {
- installer.executeScript(removeScript);
- } catch (IMShellCommandFail e) {
- Log.err("Cannot execute InstallManager's remove script.");
- Log.ExceptionLog(e);
- }
- }
-
- private File getRemoveScript() {
- try {
- if (Platform.isLinux()) {
- return PathUtil
- .getTempFileFromResource(
- LINUX_INSTALL_MANAGER_REMOVE_SCRIPT,
- "im_remove", ".sh");
- } else if (Platform.isWindows()) {
- return PathUtil.getTempFileFromResource(
- WINDOWS_INSTALL_MANAGER_REMOVE_SCRIPT, "im_remove",
- ".vbs");
- } else if (Platform.isMacOS()) {
- return null;
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- Log.err("Cannot get InstallManager's remove script.");
- Log.ExceptionLog(e);
- return null;
- }
- }
-
- /*
- * private void copyInstallManagerToTargetDirectoryForMac() {
- * Log.log("Copy InstallManager to target in MAC platform");
- *
- * //get '.app' directory String fromPath =
- * PathUtil.getParentDirectory(PathUtil.getCurrentDir(), 3); if (fromPath ==
- * null) { Log.err("Cannot get parent directory => " +
- * PathUtil.getCurrentDir()); return; }
- *
- * File fromFile = new File(fromPath);
- *
- * if (Registry.getInstalledPath() == null ||
- * Registry.getInstalledPath().equals("")) {
- * Log.err("Cannot find target dir"); return; }
- *
- * File toFile = getInstalledAppPath(); if (!toFile.exists()) { if
- * (!toFile.mkdirs()) { Log.err("Fail to create file ==> " + toFile); } }
- *
- * if (fromFile.getAbsolutePath().equals(toFile.getAbsolutePath())) {
- * return; }
- *
- * try { PathUtil.copy(fromFile, toFile); } catch (IOException e) {
- * Log.ExceptionLog(e); return; }
- *
- * // copy InstallManager script to {target dir}/install-manager/ File
- * installManagerScript = new File(PathUtil.get(Registry.getInstalledPath(),
- * Config.INSTALL_MANAGER_DIRECTORY, Config.INSTALL_MANAGER_APP_JAVA,
- * Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER )); File targetDir = new
- * File(PathUtil.get(Registry.getInstalledPath(),
- * Config.INSTALL_MANAGER_DIRECTORY));
- *
- * try { PathUtil.copy(installManagerScript, targetDir); } catch
- * (IOException e) { Log.ExceptionLog(e); return; }
- *
- * //remove binary directory in target directory String removableBinaryPath
- * = PathUtil.get(toFile.getAbsolutePath() , "Contents" , "Resources" ,
- * "Java" , "binary");
- *
- * PathUtil.remove(removableBinaryPath); }
- *
- * private File getInstalledAppPath() { String appPath =
- * Registry.getInstalledPath() + File.separator +
- * Config.INSTALL_MANAGER_DIRECTORY + File.separator +
- * Config.INSTALL_MANAGER_APP;
- *
- * return new File(appPath); }
- */
-
- /**
- * Remove trash packages which are used during installation using SDK image.
- */
- private void cleanPackageDir() {
- // remove binary directory. TODO remove INSTALL_MANAGER_TEMP_DIRECTORY
- if (PathUtil.remove(PathUtil.get(Config.INSTALL_MANAGER_TEMP_DIRECTORY,
- Config.INSTALL_MANAGER_DOWNLOAD_DIRECTORY_NAME,
- Config.INSTALL_MANAGER_IMAGE_DOWNLOAD_DIRECTORY_NAME))) {
- Log.log("Success to remove trash SDK image package binaries.");
- } else {
- Log.err("Fail to remove trash SDK image package binaries.");
- }
- }
-
- public void removePackagesDir() {
- // remove binary directory. TODO remove INSTALL_MANAGER_TEMP_DIRECTORY
- if (PathUtil.remove(PathUtil.get(Config.INSTALL_MANAGER_TEMP_DIRECTORY,
- Config.INSTALL_MANAGER_DOWNLOAD_DIRECTORY_NAME))) {
- Log.log("Success to remove downloaded package binaries.");
- } else {
- Log.err("Fail to remove downloaded package binaries.");
- }
- }
-
- /**
- * Package uninstallation management
- *
- * @param pkg
- * @param monitor
- * @return
- */
- public boolean removePackage(Package pkg, IIMProgressMonitor monitor) {
- Log.log("InstallManager package remove start => " + pkg);
-
- if (pkg == null) {
- return false;
- }
-
- if (monitor != null) {
- monitor.workedTitle(pkg.getPackageName());
- }
-
- if (Options.doRemoveNoUI || Options.doInstallNoUI) {
- System.out.println(pkg.getPackageName() + " is uninstalling...");
- }
-
- boolean bResult = false;
- if (packageManager.isInstalledPackage(pkg)) {
- Installer installer = new Installer();
-
- bResult = installer.uninstall(pkg, monitor);
- } else {
- bResult = true;
- }
-
- // Remove packages in installed package list without result.
- // We don't know that failed packages are working well.
- packageManager.exceptPackageFromInstalledPackages(pkg);
- packageManager.saveInstalledList();
-
- Log.log(pkg + " remove end => " + bResult);
- return bResult;
- }
-
- /**
- * Packages uninstallation management
- *
- * @param pkg
- * @param monitor
- * @return
- */
- public boolean removePackages(PackageSet metasToRemove,
- IIMProgressMonitor monitor) {
- Log.log("InstallManager Packages remove Start => " + metasToRemove);
-
- if (metasToRemove == null) {
- return false;
- }
-
- PackageSet pkgsToRemove = packageManager
- .getToRemovePackagesInRemove(metasToRemove);
-
- Log.log("Remove packages: " + pkgsToRemove);
-
- if (monitor != null) {
- monitor.beginTask("Uninstalling...", pkgsToRemove.size() + 1);
- }
-
- int i = 0;
- for (Package pkg : pkgsToRemove) {
- if (monitor != null) {
- monitor.workedDownloadProgress(pkg.getPackageName(), 1);
- monitor.worked(++i);
- }
-
- if (removePackage(pkg, monitor)) {
- continue;
- } else {
- Log.log("Remove fail but make progress=> " + pkg);
- }
- }
-
- // if you remove all packages, delete targetDirectory and config File.
- if (!packageManager.existInstalledMetaPackages()) {
- Log.log("Installed meta packages do not exist");
- if (monitor != null) {
- monitor.workedDownloadProgress("Remove target directory...", 0);
- monitor.worked(pkgsToRemove.size());
- }
-
- if (packageManager.existInstalledPackages()) {
- Log.log("Installed meta packages do not exist, but some packages exist.");
- removeAll(monitor);
- } else {
- // not exist to remove
- removeSDK(monitor);
- }
- }
-
- Log.log("InstallManager packages remove success. return => " + true);
- return true;
- }
-
- /**
- * Remove all of packages.
- *
- * @param monitor
- */
- public void removeAll(IIMProgressMonitor monitor) {
- Log.log("InstallManager.removeAll()");
-
- removeAllPackages(monitor);
- removeSDK(monitor);
- }
-
- private void removeAllPackages(IIMProgressMonitor monitor) {
- Log.log("Remove all packages.");
-
- PackageSet removablePackages = packageManager.getInstalledPackages();
-
- for (Package pkg : removablePackages) {
- if (!removePackage(pkg, monitor)) {
- Log.err("InstallManager.removeAll remove fail => " + pkg);
- }
- }
- }
-
- /**
- * Remove All of TizenSDK files.
- */
- public void removeSDK(IIMProgressMonitor monitor) {
- Log.log("InstallManager removeSDK start");
-
- if (monitor != null) {
- monitor.workedTitle(REMOVE_ALL_SDK_FILES);
- }
-
- removeInstallManager();
- removeShortcutMenu();
- removeChangeLog();
- removeInfoDirectory();
- checkTargetDirAndRemove();
- // Registry.removeRegistry();
- if (Config.isSupportMultiSDK()) {
- Registry.removeMultiSDKInfo(Config.getSelectedSDKPath());
- } else {
- Registry.removeMultiSDKInfo(Registry.getInstalledPath());
- }
-
- // do not remove config home because it has log files
- Log.log("InstallManager removeSDK end");
- }
-
- private void checkTargetDirAndRemove() {
- File targetDir = new File(Registry.getInstalledPath());
- if (canRemoveTargetDir(targetDir)) {
- removeTargetDirectory();
- } else {
- Log.err("Cannot delete target directory => "
- + targetDir.getAbsolutePath());
- }
- }
-
- /**
- * Check status that target directory can remove or not.
- *
- * @param targetDir
- * @return
- */
- private boolean canRemoveTargetDir(File targetDir) {
- if (targetDir.exists()) {
- File[] fileList = targetDir.listFiles();
- if ((fileList == null || fileList.length <= 0)
- || (fileList.length == 1 && fileList[0].getName().equals(
- Config.OLD_INSTALL_MANAGER_DIRECTORY))) {
- return true;
- } else {
- ArrayList<String> fileNames = new ArrayList<String>();
- for (File file : fileList) {
- fileNames.add(file.getName());
- }
- Log.err("The SDK directory is not empty => " + fileNames);
- return false;
- }
- } else {
- Log.err("The SDK direcotry is already removed");
- return false;
- }
- }
-
- private void removeChangeLog() {
- File releaseNoteFile = new File(
- PathUtil.getFromInstalledPath(Config.RELEASE_NOTE));
-
- if (releaseNoteFile.exists()) {
- PathUtil.remove(releaseNoteFile);
- }
- }
-
- private void removeInfoDirectory() {
- // remove info directory in $HOME/tizen-sdk-data
- File infoDirFile = new File(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY));
- if (infoDirFile.exists()) {
- PathUtil.remove(infoDirFile);
- }
-
- // remove info directory in target directory
- File targetInfoFile = new File(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY));
-
- if (targetInfoFile.exists()) {
- PathUtil.remove(targetInfoFile);
- }
- }
-
- /**
- * Remove target directory.
- */
- public void removeTargetDirectory() {
- Log.log("InstallManager remove target directory start");
-
- if (Platform.CURRENT_PLATFORM == Platform.LINUX_32
- || Platform.CURRENT_PLATFORM == Platform.LINUX_64
- || Platform.CURRENT_PLATFORM == Platform.MACOS_64) {
- PathUtil.remove(Registry.getInstalledPath());
- } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32
- || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) {
- if (!WindowsProgramController.removeRunningDir(Registry
- .getInstalledPath())) {
- Log.err("Cannot remove target directory");
- }
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
-
- Log.log("InstallManager remove target directory end");
- }
-
- /**
- * Singleton and global downloader shared and used by every components in IM
- *
- * @return singleton downloader object
- */
- public static Downloader getDownloader() {
- return InstallManager.mDownloader;
- }
-}
+/*\r
+ * InstallManager\r
+ *\r
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact: \r
+ * Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+ * Shihyun Kim <shihyun.kim@samsung.com>\r
+ * Taeyoung Son <taeyoung2.son@samsung.com>\r
+ * Yongsung kim <yongsung1.kim@samsung.com>\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ *\r
+ */\r
+\r
+package org.tizen.installmanager.core;\r
+\r
+import java.io.File;\r
+import java.io.FilenameFilter;\r
+import java.io.IOException;\r
+import java.io.UnsupportedEncodingException;\r
+import java.net.URL;\r
+import java.net.URLEncoder;\r
+import java.security.MessageDigest;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.LinkedList;\r
+\r
+import org.tizen.installmanager.lib.Checksum;\r
+import org.tizen.installmanager.lib.Downloader;\r
+import org.tizen.installmanager.lib.ErrorController;\r
+import org.tizen.installmanager.lib.ErrorController.InfoCode;\r
+import org.tizen.installmanager.lib.IIMProgressMonitor;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.lib.Registry;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+import org.tizen.installmanager.lib.exception.IMNetworkException;\r
+import org.tizen.installmanager.lib.win.WindowsProgramController;\r
+import org.tizen.installmanager.pkg.lib.PackageManager;\r
+import org.tizen.installmanager.pkg.model.Package;\r
+import org.tizen.installmanager.pkg.model.PackageSet;\r
+import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor;\r
+import org.tizen.installmanager.util.IMShellCommandFail;\r
+import org.tizen.installmanager.util.PathUtil;\r
+import org.tizen.installmanager.util.ShellUtil;\r
+\r
+/**\r
+ * This class contains the main business logic of Install Manager. Use singleton\r
+ * instance.\r
+ * \r
+ * @author Shihyun Kim <shihyun.kim@samsung.com>\r
+ */\r
+public class InstallManager {\r
+\r
+ private static final InstallManager mInstallManager = new InstallManager();\r
+\r
+ private Config mConfig = null;\r
+ private static Downloader mDownloader = new Downloader();\r
+ private PackageManager packageManager;\r
+\r
+ // windows path\r
+ private static String WINDOWS_INSTALL_MANAGER_INSTALL_SCRIPT = "/res/desktop_directory/install.vbs";\r
+ private static String WINDOWS_INSTALL_MANAGER_REMOVE_SCRIPT = "/res/desktop_directory/remove.vbs";\r
+ private static String WINDOWS_MAKE_SHORTCUT_PATH = "/res/desktop_directory/makeshortcut.vbs";\r
+ private static String WINDOWS_REMOVE_SHORTCUT_PATH = "/res/desktop_directory/removeshortcut.vbs";\r
+\r
+ // linux script\r
+ private static String LINUX_INSTALL_MANAGER_INSTALL_SCRIPT = "/res/desktop_directory/install.sh";\r
+ private static String LINUX_INSTALL_MANAGER_REMOVE_SCRIPT = "/res/desktop_directory/remove.sh";\r
+ private static String LINUX_MAKE_SHORTCUT_PATH = "/res/desktop_directory/makeshortcut.sh";\r
+ private static String LINUX_REMOVE_SHORTCUT_PATH = "/res/desktop_directory/removeshortcut.sh";\r
+ private static String LINUX_TSUDO_PATH = "/res/desktop_directory/tsudo.sh";\r
+\r
+ private File makeShortCutFile = null;\r
+ private File removeShortCutFile = null;\r
+ private File tSudoFile = null;\r
+\r
+ private static String REMOVE_ALL_PACKAGES = "Remove all packages...";\r
+ private static String REMOVE_ALL_SDK_FILES = "Remove all SDK files...";\r
+\r
+ private Thread installThread = null;\r
+ private LinkedList<Package> installBuffer = new LinkedList<Package>();\r
+\r
+ private InstallManager() {\r
+ }\r
+\r
+ /**\r
+ * @return singleton instance of <code>InstallManager</code>\r
+ */\r
+ public static InstallManager getInstance() {\r
+ return mInstallManager;\r
+ }\r
+\r
+ /**\r
+ * Load config file\r
+ */\r
+ public void initConfig() {\r
+ if (mConfig != null) {\r
+ if (Config.isSupportMultiSDK()) {\r
+ if (!Registry.getInstalledPath().isEmpty()) {\r
+ mConfig.setTargetDir(Registry.getInstalledPath());\r
+ }\r
+ } else {\r
+ return;\r
+ }\r
+ } else {\r
+ mConfig = Config.getInstance();\r
+\r
+ if (Options.doReplaceRepository) {\r
+ Log.log("Replace repository => " + Options.repository);\r
+ mConfig.getConfigFile().setRepository(Options.repository);\r
+ mConfig.saveConfig();\r
+ }\r
+ \r
+ if (Options.distribution != null && !Options.distribution.isEmpty()) {\r
+ mConfig.getConfigFile().setDistribution(Options.distribution);\r
+ mConfig.saveConfig();\r
+ }\r
+\r
+ if (mConfig.getConfigFile() == null) {\r
+ Log.log("Loading config file failed");\r
+ throw new IMFatalException("Loading configuration file failed");\r
+ }\r
+\r
+ if (!Registry.getInstalledPath().isEmpty()) {\r
+ mConfig.setTargetDir(Registry.getInstalledPath());\r
+ }\r
+ mConfig.setSdkDatatDir(Registry.getSdkDataPath());\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Initialize packages information.\r
+ */\r
+ public void initPackageList() {\r
+ Collection<String> repositoryURLs = mConfig.getSDKPackageServerList();\r
+\r
+ initPackageManager(repositoryURLs);\r
+ }\r
+\r
+ private void initPackageManager(Collection<String> repositoryURLs) {\r
+ File installedPackageListFile = null;\r
+ if (Registry.targetPath != "") {\r
+ installedPackageListFile = new File(PathUtil.get(\r
+ PathUtil.get(Registry.targetPath, Config.INFO_DIRECTORY),\r
+ Config.INSTALLED_PACKAGE_LIST_FILE_NAME));\r
+ } else {\r
+ installedPackageListFile = new File(PathUtil.get(\r
+ PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),\r
+ Config.INSTALLED_PACKAGE_LIST_FILE_NAME));\r
+ }\r
+\r
+ try {\r
+ if (installedPackageListFile.exists()) {\r
+ this.packageManager = PackageManager.getInstance(\r
+ installedPackageListFile, repositoryURLs);\r
+ } else {\r
+ this.packageManager = PackageManager.getInstance(null,\r
+ repositoryURLs);\r
+ }\r
+ } catch (IOException e) {\r
+ Log.err("Cannot load package manager =>" + installedPackageListFile\r
+ + ", " + repositoryURLs);\r
+ throw new IMFatalException(ErrorCode.CANNOT_CREATE_FILE);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Initialize distribution and snapshot information\r
+ */\r
+ public boolean initDistribution() {\r
+ DistributionController controller = DistributionController\r
+ .getInstance(mConfig.getSDKRepositoryList());\r
+\r
+ boolean initResult = controller.init();\r
+ Log.log("Init Distribution result => " + initResult);\r
+\r
+ // First distribution that read from config file is recognized as the\r
+ // distribution installed.\r
+ String installedDistribution = Config.getInstance().getConfigFile()\r
+ .getDistribution();\r
+ controller.setInstalledDistribution(installedDistribution);\r
+\r
+ return initResult;\r
+ }\r
+\r
+ /**\r
+ * Initialize installmanager. It performs that read config file, make\r
+ * temporary files and load package list from repository.\r
+ * \r
+ * @return <code>true</code> if initialize success to install or uninstall.\r
+ */\r
+ public void init() {\r
+ initConfig();\r
+\r
+ cleanPackageDir();\r
+\r
+ initDistribution();\r
+ if (Config.status == Config.Status.INSTALL) {\r
+ checkOldSDK();\r
+ }\r
+ initPackageList();\r
+ initConfigurationFile();\r
+ checkNewPackageServer();\r
+ }\r
+\r
+ /**\r
+ * If packageServer has multi SDK packages, set Config.isNewPackageServer\r
+ * true. otherwise false. InstallManager can be used old SDK installation.\r
+ */\r
+ private void checkNewPackageServer() {\r
+ if (packageManager\r
+ .getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME) == null) {\r
+ Config.isNewPackageServer = false;\r
+ Log.log("PackageServer has old SDK packages.");\r
+ } else {\r
+ Config.isNewPackageServer = true;\r
+ Log.log("PackageServer has new SDK packages(Multi SDK).");\r
+ }\r
+ }\r
+\r
+ private void initConfigurationFile() {\r
+ copyMakeShortCutFile();\r
+ copyRemoveShortCutFile();\r
+\r
+ // Linux has several kinds such as Ubuntu, Fedora, etc. So, If\r
+ // installation needs super user's\r
+ // permission, sudo command depends on machine. Therefore,\r
+ // Installmanager gives a tsudo command\r
+ // which does not need to care of machine post install script for\r
+ // package.\r
+ if (Platform.isLinux()) {\r
+ copyTizenSudoFile();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Delete temporary files related installmanager.\r
+ */\r
+ public static void deleteTempFile() {\r
+\r
+ File tmpDir = new File(PathUtil.getTempFileParent());\r
+ File[] tmpFiles = tmpDir.listFiles(new FilenameFilter() {\r
+ @Override\r
+ public boolean accept(File dir, String name) {\r
+ boolean found = false;\r
+ String[] prefix = { "makeshortcut", "removeshortcut",\r
+ "installmanager.repository", "Packages",\r
+ "tizen_installmanager", "checkJavaInstallation",\r
+ "install" };\r
+ for (String pref : prefix) {\r
+ found = name.startsWith(pref);\r
+ if (found == true) {\r
+ return true;\r
+ }\r
+ }\r
+ return found;\r
+ }\r
+ });\r
+\r
+ if (tmpFiles != null) {\r
+ for (File f : tmpFiles) {\r
+ if (!f.delete()) {\r
+ Log.err("Fail to delete file ==> " + f);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Copy make shortcut file from resource to temp directory.\r
+ */\r
+ private void copyMakeShortCutFile() {\r
+ try {\r
+ if (Platform.isLinux()) {\r
+ makeShortCutFile = PathUtil.getTempFileFromResource(\r
+ LINUX_MAKE_SHORTCUT_PATH, "makeshortcut", ".sh");\r
+ } else if (Platform.isWindows()) {\r
+ makeShortCutFile = PathUtil.getTempFileFromResource(\r
+ WINDOWS_MAKE_SHORTCUT_PATH, "makeshortcut", ".vbs");\r
+ } else if (Platform.isMacOS()) {\r
+ makeShortCutFile = PathUtil.getTempFileFromResource(\r
+ LINUX_MAKE_SHORTCUT_PATH, "makeshortcut", ".sh");\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+\r
+ if (makeShortCutFile.exists()) {\r
+ makeShortCutFile.setExecutable(true);\r
+ }\r
+ } catch (IOException e) {\r
+ Log.err("Installer cannot make 'makeshortcut script' file.");\r
+ throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Copy remove shortcut file from resource to temp directory.\r
+ */\r
+ private void copyRemoveShortCutFile() {\r
+ try {\r
+ if (Platform.isLinux()) {\r
+ removeShortCutFile = PathUtil.getTempFileFromResource(\r
+ LINUX_REMOVE_SHORTCUT_PATH, "removeshortcut", ".sh");\r
+ } else if (Platform.isWindows()) {\r
+ removeShortCutFile = PathUtil.getTempFileFromResource(\r
+ WINDOWS_REMOVE_SHORTCUT_PATH, "removeshortcut", ".vbs");\r
+ } else if (Platform.isMacOS()) {\r
+ removeShortCutFile = PathUtil.getTempFileFromResource(\r
+ LINUX_REMOVE_SHORTCUT_PATH, "removeshortcut", ".sh");\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+ removeShortCutFile.setExecutable(true);\r
+ } catch (IOException e) {\r
+ Log.err("Installer cannot make 'makeshortcut script' file.");\r
+ throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Copy remove shortcut file from resource to temp directory.\r
+ */\r
+ private void copyTizenSudoFile() {\r
+ try {\r
+ tSudoFile = PathUtil.getTempFileFromResource(LINUX_TSUDO_PATH,\r
+ "tsudo", ".sh");\r
+ tSudoFile.setExecutable(true);\r
+ } catch (IOException e) {\r
+ Log.err("Installer cannot make 'tsudo.sh' file.");\r
+ throw new IMFatalException(ErrorCode.CANNOT_CREATE_TSUDO);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * get make shortcut File instance.\r
+ * \r
+ * @return File instance of makeshortcut script.\r
+ */\r
+ public File getTSudo() {\r
+ return tSudoFile;\r
+ }\r
+\r
+ /**\r
+ * Get temporary file path.(makeshortcut script, Packages list, Installer\r
+ * log)\r
+ * \r
+ * @return temporary file path, if not exist makeshortcut file, return empty\r
+ * string.\r
+ */\r
+ public String getTSudoPath() {\r
+ if (getTSudo() == null) {\r
+ return "";\r
+ } else {\r
+ return getTSudo().getAbsolutePath();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * get make shortcut File instance.\r
+ * \r
+ * @return File instance of makeshortcut script.\r
+ */\r
+ public File getMakeShortCut() {\r
+ return makeShortCutFile;\r
+ }\r
+\r
+ /**\r
+ * Get temporary file path.(makeshortcut script, Packages list, Installer\r
+ * log)\r
+ * \r
+ * @return temporary file path, if not exist makeshortcut file, return empty\r
+ * string.\r
+ */\r
+ public String getMakeShortCutPath() {\r
+ if (getMakeShortCut() == null) {\r
+ return "";\r
+ } else {\r
+ return getMakeShortCut().getAbsolutePath();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get temporary file path.(rmoveshortcut script, Packages list, Installer\r
+ * log)\r
+ * \r
+ * @return temporary file path, if not exist removeshortcut file, return\r
+ * emptry string.\r
+ */\r
+ public String getRemoveShortCutPath() {\r
+ if (getRemoveShortCut() == null) {\r
+ return "";\r
+ } else {\r
+ return getRemoveShortCut().getAbsolutePath();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get remove shortcut File instance.\r
+ * \r
+ * @return File instance of removeshortcut script.\r
+ */\r
+ public File getRemoveShortCut() {\r
+ return removeShortCutFile;\r
+ }\r
+\r
+ /**\r
+ * Get Config instance\r
+ * \r
+ * @return\r
+ */\r
+ public Config getConfig() {\r
+ return mConfig;\r
+ }\r
+\r
+ /**\r
+ * Get PackageManager instance.\r
+ * \r
+ * @return\r
+ */\r
+ public PackageManager getPackageManager() {\r
+ return packageManager;\r
+ }\r
+\r
+ /**\r
+ * Check old SDK is installed for compatibility.\r
+ */\r
+ private void checkOldSDK() {\r
+ Log.log("Check old SDK.");\r
+ if (Registry.getOldInstalledPath() != "") { // Old SDK is installed.\r
+ if (Registry.getInstalledPath() != null\r
+ && !Registry.getInstalledPath().isEmpty()) {\r
+ // Old SDK is installed but new SDK is also installed, so\r
+ // environment does not need to\r
+ // set new SDK environment.\r
+ Log.log("Old SDK is installed but new SDK is also installed. => "\r
+ + Registry.getInstalledPath());\r
+ return;\r
+ } else {\r
+ Log.log("Old SDK is installed. => "\r
+ + Registry.getOldInstalledPath());\r
+ setCurrentSDKEnvironment(Registry.getOldInstalledPath());\r
+ }\r
+ } else {\r
+ return;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * If old SDK is installed and new SDK is not installed, installmanager set\r
+ * environment for new SDK running properly.\r
+ * \r
+ * @param targetPath\r
+ * SDK installed path.\r
+ */\r
+ private void setCurrentSDKEnvironment(String targetPath) {\r
+ Log.log("Set new SDK environment from old SDK.");\r
+ Registry.sdkDataPath = Config.getConfigHome();\r
+\r
+ if (targetPath == null || targetPath.isEmpty()) {\r
+ Log.err("Install path is invalid: " + targetPath\r
+ + ". This might be a bug of IM");\r
+ throw new IMFatalException(ErrorCode.INVALID_INSTALL_PATH);\r
+ } else {\r
+ Registry.exportInstallPath(targetPath);\r
+ Registry.exportMultiInstallPath(targetPath, true);\r
+ }\r
+\r
+ // Make sdk.info file into target directory for compatibility.\r
+ Registry.saveSDKInfo(targetPath);\r
+ // Remove tizensdkpath file in 'tizen-sdk-data'.\r
+ // Registry.removeOldRegistry();\r
+ }\r
+\r
+ /**\r
+ * @param pkg\r
+ * @param filePath\r
+ * @return <code>true</code> if the package is already downloaded to the\r
+ * file path\r
+ */\r
+ private boolean existInCacheFolder(Package pkg, String filePath,\r
+ IIMProgressMonitor monitor) {\r
+ File file = new File(filePath);\r
+\r
+ if (!file.exists()) {\r
+ return false;\r
+ }\r
+\r
+ if (monitor != null) {\r
+ monitor.workedDownloadProgress("Validate the " + pkg.getPackageName(), 0);\r
+ }\r
+\r
+ if (Options.doPackageValidation) {\r
+ if (Checksum.getSHA256(filePath) != null) {\r
+ return checkFileChecksum(pkg, Checksum.getSHA256(filePath));\r
+ } else {\r
+ return false;\r
+ }\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ private boolean checkPackageSize(Package pkg, long size) {\r
+ if (pkg.getPackageSize() == size) {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private boolean checkFileChecksum(Package pkg, MessageDigest mDigest) {\r
+\r
+ if (pkg.getSHA256() == null || pkg.getSHA256().isEmpty()) {\r
+ return false;\r
+ }\r
+\r
+ if (mDigest.getAlgorithm().equals(Checksum.SHA_256_TYPE)) {\r
+ return (pkg.getSHA256().equalsIgnoreCase(Checksum\r
+ .messageDigestToString(mDigest)));\r
+ } else {\r
+ // TODO there's no checksum field in package.\r
+ return false;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Packages Installation management. Download and install packages.\r
+ * \r
+ * @param packagesToInstall\r
+ * @param targetDir\r
+ * @param monitor\r
+ * @return\r
+ * @throws IMExitException\r
+ */\r
+ public boolean install(PackageSet installablePackages,\r
+ final String targetDir, InstallProgressMonitor monitor)\r
+ throws IMExitException, IMNetworkException {\r
+ Log.log("InstallManager.install() installable packages : "\r
+ + installablePackages);\r
+\r
+ // performance measurement\r
+ Performance.sdkPackageSize = packageManager\r
+ .getTotalSizeOfInstallablePackages(installablePackages, true);\r
+\r
+ if (installablePackages == null || targetDir == null\r
+ || targetDir.isEmpty()) {\r
+ Log.err("packaegs => " + installablePackages + ", targetDir => "\r
+ + targetDir);\r
+ return false;\r
+ }\r
+ \r
+ mConfig.setTargetDir(targetDir);\r
+ mConfig.setSdkDatatDir(Registry.sdkDataPath);\r
+\r
+ if (monitor != null) {\r
+ monitor.workedRefresh();\r
+ monitor.beginTask(installablePackages.size(),\r
+ getTotalDownloadSize(installablePackages),\r
+ getTotalInstallSize(installablePackages));\r
+ }\r
+ \r
+ initializeTargetDir(targetDir);\r
+ makeShortcutMenu();\r
+\r
+ // make start menu\r
+ // if you cannot get installmanager from repository, install from local.\r
+ if (!packageManager\r
+ .existsPackage(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME)) {\r
+ Log.log("Cannot find install-manager from repository.");\r
+\r
+ if (!installInstallManagerFromLocal(targetDir)) {\r
+ Log.err("Cannot install install-manager from local directory.");\r
+ }\r
+ }\r
+\r
+ // wait if cancel confirm dialog is showing. wait until user press\r
+ // button(cancel or not).\r
+ // TODO :\r
+ if (monitor != null) {\r
+ while (monitor.checkCancelAndDisableCancelButton() == false) {\r
+ if (monitor.isCanceled()) {\r
+ throw new IMInstallCancelException();\r
+ }\r
+ }\r
+ }\r
+\r
+ // remove missing packages in repository.\r
+ removeMissingPackages(monitor);\r
+\r
+ for (Package pkg : installablePackages) {\r
+ if (!install(pkg, targetDir, monitor)) {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ // download complete.\r
+ if (monitor != null) {\r
+ monitor.workedDownloadProgress("Download complete", 0);\r
+ monitor.downloadDone();\r
+ }\r
+\r
+ // install thread is running yet.\r
+ try {\r
+ installThread.join();\r
+ } catch (InterruptedException e) {\r
+ Log.ExceptionLog(e);\r
+ Log.err("");\r
+ }\r
+\r
+ // install complete\r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Installation complete", 0);\r
+ monitor.installDone();\r
+ }\r
+\r
+ // save config file\r
+ mConfig.saveConfig();\r
+\r
+ // save sdk version.\r
+ saveSDKVersion();\r
+\r
+ // Delete installed packages\r
+ if (Options.doRemovePackages) {\r
+ removePackagesDir();\r
+ }\r
+\r
+ if (Config.status == Config.Status.INSTALL) {\r
+ Registry.exportMultiInstallPath(targetDir, true);\r
+ }\r
+\r
+ // show reboot message in linux platform.\r
+ if (Platform.isLinux() || Platform.isMacOS()) {\r
+ ErrorController.setInfoCode(InfoCode.RESTART_THE_COMPUTER);\r
+ }\r
+\r
+ Performance.setInstallationEndTime();\r
+ return true;\r
+ }\r
+\r
+ private long getTotalDownloadSize(PackageSet pkgSet) {\r
+ if (pkgSet == null) {\r
+ return -1;\r
+ }\r
+\r
+ long totalSize = 0;\r
+ for (Package pkg : pkgSet) {\r
+ totalSize += pkg.getPackageSize();\r
+ }\r
+\r
+ return totalSize;\r
+ }\r
+\r
+ private long getTotalInstallSize(PackageSet pkgSet) {\r
+ if (pkgSet == null) {\r
+ return -1;\r
+ }\r
+\r
+ long totalSize = 0;\r
+ for (Package pkg : pkgSet) {\r
+ totalSize += pkg.getUncompressedPackageSize();\r
+ }\r
+\r
+ return totalSize;\r
+ }\r
+\r
+ private boolean install(final Package pkg, final String targetDir,\r
+ final InstallProgressMonitor monitor) throws IMExitException,\r
+ IMNetworkException {\r
+ Log.log("Install package => " + pkg.getPackageName());\r
+ Log.log("Target directory => " + targetDir);\r
+\r
+ boolean result = false;\r
+\r
+ if (Options.doTest && Performance.getDownloadStartTime() == null) {\r
+ Performance.setDownloadStartTime();\r
+ }\r
+\r
+ // download package from repository.\r
+ result = downloadPackage(pkg, monitor);\r
+\r
+ if (Options.doTest) {\r
+ Performance.setDownloadEndTime();\r
+ }\r
+\r
+ if (result) {\r
+ installBuffer.push(pkg);\r
+\r
+ if (Options.doTest\r
+ && Performance.getInstallationStartTime() == null) {\r
+ Performance.setInstallationStartTime();\r
+ }\r
+\r
+ if (installThread == null || !installThread.isAlive()) {\r
+ installThread = new Thread() {\r
+ public void run() {\r
+ Package p = null;\r
+ while ((p = installBuffer.pollLast()) != null) {\r
+ if (!installPackage(p, targetDir, monitor)) {\r
+ return;\r
+ }\r
+ \r
+ if (installBuffer.size() <= 0) {\r
+ if (monitor != null ) {\r
+ monitor.workedInstallProgress("Waiting for download", 0);\r
+ monitor.installEnd();\r
+ }\r
+ }\r
+ }\r
+ }\r
+ };\r
+\r
+ installThread.start();\r
+ }\r
+\r
+ if (Options.doTest) {\r
+ Performance.setInstallationEndTime();\r
+ }\r
+\r
+ if (!ErrorController.checkInstallationSuccess()) {\r
+ return false;\r
+ }\r
+ } else {\r
+ Log.log("Installation failed. => " + pkg.getPackageName());\r
+ return false;\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ public boolean downloadPackages(PackageSet packageSet,\r
+ InstallProgressMonitor monitor) throws IMNetworkException {\r
+ if (packageSet == null) {\r
+ return false;\r
+ }\r
+\r
+ for (Package pkg : packageSet) {\r
+ if (!downloadPackage(pkg, monitor)) {\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private boolean downloadPackage(Package pkg, InstallProgressMonitor monitor)\r
+ throws IMNetworkException {\r
+ Log.log("Download package => " + pkg);\r
+\r
+ // check the parameter\r
+ if (pkg == null) {\r
+ Log.err("Cannot find package.");\r
+ return false;\r
+ }\r
+\r
+ // check the option.\r
+ if (Options.doInstallNoUI) {\r
+ System.out.println(pkg.getPackageName() + " is downloading...");\r
+ }\r
+\r
+ // check the cancel button\r
+ if (monitor != null) {\r
+ if (monitor.isCanceled()) {\r
+ Log.log("download canceled");\r
+ throw new IMInstallCancelException();\r
+ } else {\r
+ monitor.workedDownloadProgress(pkg.getPackageName(), 1);\r
+ }\r
+ }\r
+\r
+ URL downloadFileURL = pkg.getURL();\r
+ String downloadTargetPath = getDownloadTargetPath(pkg);\r
+\r
+ // check the package in cache folder\r
+ if (existInCacheFolder(pkg, downloadTargetPath, monitor)) {\r
+ Log.log("Found the package in cache");\r
+ \r
+ if (monitor != null) {\r
+ monitor.workedDownloadSize(pkg.getPackageSize());\r
+ }\r
+ \r
+ return true;\r
+ }\r
+\r
+ // download package from repository\r
+ long size = mDownloader.download(downloadFileURL, downloadTargetPath,\r
+ monitor);\r
+\r
+ if (size >= 0) {\r
+ if (Options.onlyDownload) {\r
+ System.out.println("Download success. => " + pkg);\r
+ }\r
+ Log.log("finish download => " + pkg);\r
+ } else { // fail\r
+ Log.err("download failed => " + downloadFileURL);\r
+\r
+ PathUtil.remove(downloadTargetPath);\r
+\r
+ String errMsg = "";\r
+ if (monitor.isCanceled()) {\r
+ errMsg = ErrorController.getErrorMessage();\r
+ } else {\r
+ errMsg = "Fail to get '" + pkg.getPackageName() + "'." + "\n("\r
+ + ErrorController.getErrorMessage() + ")";\r
+ }\r
+ throw new IMFatalException(errMsg);\r
+ }\r
+\r
+ // package validation\r
+ if (Options.doPackageValidation) {\r
+ Log.log("Validate package");\r
+ if (!checkPackageSize(pkg, size)) {\r
+ Log.err("The expected size of package => "\r
+ + pkg.getPackageSize());\r
+ Log.err("Package size error. downloaded size => " + size);\r
+\r
+ PathUtil.remove(downloadTargetPath);\r
+\r
+ throw new IMFatalException(ErrorCode.PACKAGE_WRONG_SIZE);\r
+ }\r
+\r
+ // TODO :\r
+ if (!checkFileChecksum(pkg, mDownloader.getFileChecksum())) {\r
+ Log.err("The expected checksum of package => "\r
+ + pkg.getSHA256());\r
+ Log.err("Package checksum error downloaded checksum => "\r
+ + mDownloader.getFileChecksum());\r
+\r
+ PathUtil.remove(downloadTargetPath);\r
+\r
+ throw new IMFatalException(ErrorCode.PACKAGE_WRONG_CHECKSUM);\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ private boolean installPackage(Package pkg, String targetDir,\r
+ InstallProgressMonitor monitor) {\r
+ // save target directory\r
+ initializeTargetDir(targetDir);\r
+\r
+ // remove packages to update.\r
+ if (packageManager.isInstalledPackage(pkg) && (packageManager.isReInstall() || packageManager.isUpdatable(pkg))) {\r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Remove the previous version", 0);\r
+ }\r
+ \r
+ removePackage(pkg, null);\r
+ }\r
+\r
+ // remove conflict packages\r
+ PackageSet pkgSet = packageManager.getConflictPackages(pkg);\r
+ if (pkgSet.size() > 0) {\r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Remove the conflict packages", 0);\r
+ }\r
+ removePackages(pkgSet, null);\r
+ }\r
+\r
+ if (Options.doInstallNoUI) {\r
+ System.out.println(pkg.getPackageName() + " is installing...");\r
+ }\r
+\r
+ Installer installer = new Installer();\r
+ boolean bResult = installer.install(pkg, targetDir, monitor);\r
+\r
+ if (bResult) {// save installed package list\r
+ packageManager.addPackageToInstalledPackages(pkg);\r
+ packageManager.saveInstalledList();\r
+ } else {\r
+ Log.log("Installation failed => " + pkg);\r
+\r
+ ErrorController.setError(ErrorCode.INSTALLATION_FAIL);\r
+ ErrorController.setInstallationSuccess(false);\r
+ }\r
+\r
+ return bResult;\r
+ }\r
+\r
+ public String getDownloadTargetPath(Package pkg) {\r
+ String repository = pkg.getBaseURL().toString();\r
+\r
+ String encodeRepository = null;\r
+ try {\r
+ encodeRepository = URLEncoder.encode(repository, "UTF-8");\r
+ } catch (UnsupportedEncodingException e) {\r
+ Log.ExceptionLog(e);\r
+ return encodeRepository;\r
+ }\r
+\r
+ return PathUtil.get(mConfig.getDownloadDirPath(), encodeRepository,\r
+ pkg.getFileName());\r
+ }\r
+\r
+ private boolean installInstallManagerFromLocal(String sdkPath) {\r
+ Log.log("Install install-manager from local. => " + sdkPath);\r
+ String targetDir = PathUtil.get(sdkPath,\r
+ InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME);\r
+\r
+ File targetDirFile = new File(targetDir);\r
+\r
+ if (!targetDirFile.exists()) {\r
+ targetDirFile.mkdirs();\r
+ }\r
+\r
+ try {\r
+ if (Platform.isLinux()) {\r
+ installInstallManagerFromLocalInLinux(targetDir);\r
+ } else if (Platform.isWindows()) {\r
+ installInstallManagerFromLocalInWindows(targetDir);\r
+ } else if (Platform.isMacOS()) {\r
+ installInstallManagerFromLocalInMac(targetDir);\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+\r
+ File toInstallManagerImage = new File(PathUtil.get(\r
+ Registry.getInstalledPath(),\r
+ InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME,\r
+ InstallManagerConstants.INSTALLMANAGER_SHORTCUT_IMAGE_NAME));\r
+ PathUtil.writeFileFromInputStream(\r
+ PathUtil.getResourceAsStream(InstallManagerConstants.INSTALLMANAGER_SHORTCUT_IMAGE_PATH),\r
+ toInstallManagerImage);\r
+\r
+ File toDesktopFile = new File(PathUtil.get(\r
+ Registry.getInstalledPath(),\r
+ InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME,\r
+ InstallManagerConstants.DESKTOP_SHORTCUT_IMAGE_NAME));\r
+ PathUtil.writeFileFromInputStream(\r
+ PathUtil.getResourceAsStream(InstallManagerConstants.DESKTOP_SHORTCUT_IMAGE_PATH),\r
+ toDesktopFile);\r
+\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ return false;\r
+ }\r
+\r
+ // execute install script\r
+ File installScript = getInstallScript();\r
+ if (installScript != null && installScript.exists()) {\r
+ installScript.setExecutable(true);\r
+\r
+ Installer installer = new Installer();\r
+ try {\r
+ installer.executeScript(installScript);\r
+ return true;\r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private void installInstallManagerFromLocalInLinux(String targetDir) {\r
+ try {\r
+ // copy excutable file to target directory\r
+ PathUtil.copy(PathUtil.get(Options.executablePath,\r
+ InstallManagerConstants.INSTALLMANAGER_BINARY_NAME),\r
+ targetDir);\r
+\r
+ // copy library file to target directory\r
+ PathUtil.copy(PathUtil.get(PathUtil.getCurrentDir(),\r
+ InstallManagerConstants.INSTALLMANAGER_JAR_FILE_NAME),\r
+ targetDir);\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+\r
+ private void installInstallManagerFromLocalInWindows(String targetDir) {\r
+ installInstallManagerFromLocalInLinux(targetDir);\r
+ }\r
+\r
+ private void installInstallManagerFromLocalInMac(String targetDir) {\r
+ String parentDir = PathUtil.getParentDirectory(\r
+ PathUtil.getCurrentDir(), 4);\r
+\r
+ String imExecutableAppDirPath = PathUtil\r
+ .get(parentDir,\r
+ InstallManagerConstants.INSTALLMANAGER_EXECUTALBE_DIR_NAME_FOR_MAC);\r
+ String command = "cp -rf " + imExecutableAppDirPath + " " + targetDir;\r
+\r
+ try {\r
+ ShellUtil.execute(command);\r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ Log.err(command);\r
+ throw new IMFatalException(\r
+ ErrorCode.CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY);\r
+ }\r
+\r
+ String imExecutableBinaryPath = PathUtil\r
+ .get(parentDir,\r
+ InstallManagerConstants.INSTALLMANAGER_EXECUTALBE_FILE_NAME_FOR_LINUX);\r
+ command = "cp -rf " + imExecutableBinaryPath + " " + targetDir;\r
+\r
+ try {\r
+ ShellUtil.execute(command);\r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ return;\r
+ }\r
+\r
+ String imJarFilePath = PathUtil.get(parentDir,\r
+ InstallManagerConstants.INSTALLMANAGER_JAR_FILE_NAME);\r
+ command = "cp -rf " + imJarFilePath + " " + targetDir;\r
+\r
+ try {\r
+ ShellUtil.execute(command);\r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ return;\r
+ }\r
+ }\r
+\r
+ private void removeMissingPackages(IIMProgressMonitor monitor) {\r
+ PackageSet missingPackages = packageManager\r
+ .getMissingPackagesFromRepository();\r
+ Log.log("Remove missing packages => " + missingPackages);\r
+\r
+ if (monitor != null) {\r
+ monitor.workedDownloadProgress("Remove missing packages", 0);\r
+ }\r
+\r
+ for (Package pkg : missingPackages) {\r
+ if (!removePackage(pkg, monitor)) {\r
+ Log.err("Cannot remove missing package");\r
+ throw new IMFatalException(\r
+ ErrorCode.CANNOT_REMOVE_MISSING_PACKAGE);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Initializes target directory\r
+ * \r
+ * @param targetDir\r
+ * path to SDK target directory\r
+ */\r
+ public void initializeTargetDir(String targetDir) {\r
+ Log.log("Initialize target dir. " + targetDir);\r
+ // Make target directory\r
+ File targetDirFile = new File(targetDir);\r
+ if (!targetDirFile.exists()) {\r
+ if (!targetDirFile.mkdirs()) {\r
+ Log.err("Fail to create file ==> " + targetDirFile);\r
+ }\r
+ }\r
+\r
+ // Keep target path in system\r
+ Registry.exportInstallPath(targetDir);\r
+\r
+ // Keep target path for later use\r
+ mConfig.setTargetDir(targetDir);\r
+ mConfig.setSdkDatatDir(Registry.sdkDataPath);\r
+\r
+ // Make .info directory\r
+ if (!mConfig.makeInfoDirectory()) {\r
+ Log.err(Config.CONFIG_HOME_PATH + " cannot create.");\r
+ throw new IMFatalException(ErrorCode.CANNOT_CREATE_CONFIG_FILE);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Save installed SDK version.\r
+ */\r
+ public void saveSDKVersion() {\r
+ Registry.saveInstallVersion(mConfig.getConfigFile()\r
+ .getInstallManagerVersion());\r
+ }\r
+\r
+ /**\r
+ * Make tizen menu and installmanager shortcut.\r
+ */\r
+ private void makeShortcutMenu() {\r
+ Log.log("InstallManager make shortcut menu.");\r
+\r
+ // execute install script.\r
+ File installScript = getInstallScript();\r
+ if (installScript != null) {\r
+ installScript.setExecutable(true);\r
+\r
+ Installer installer = new Installer();\r
+ try {\r
+ installer.executeScript(installScript);\r
+ } catch (IMShellCommandFail e) {\r
+ // TODO\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get install script from resource according to each platform.\r
+ * \r
+ * @return\r
+ */\r
+ private File getInstallScript() {\r
+ try {\r
+ if (Platform.isLinux()) {\r
+ return PathUtil.getTempFileFromResource(\r
+ LINUX_INSTALL_MANAGER_INSTALL_SCRIPT, "im_install",\r
+ ".sh");\r
+ } else if (Platform.isWindows()) {\r
+ return PathUtil.getTempFileFromResource(\r
+ WINDOWS_INSTALL_MANAGER_INSTALL_SCRIPT, "im_install",\r
+ ".vbs");\r
+ } else if (Platform.isMacOS()) {\r
+ return null;\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+ } catch (IOException e) {\r
+ Log.err("Cannot execute InstallManager's install script.");\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT);\r
+ }\r
+ }\r
+\r
+ private void removeInstallManager() {\r
+ Log.log("InstallManager.removeInstallManager");\r
+\r
+ String installManagerDirectory = PathUtil.get(\r
+ Registry.getInstalledPath(),\r
+ InstallManagerConstants.INSTALLMANAGER_DIRECTORY_NAME);\r
+ PathUtil.remove(installManagerDirectory);\r
+\r
+ if (Registry.getInstalledPath().isEmpty()) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ private void removeShortcutMenu() {\r
+ File removeScript = getRemoveScript();\r
+\r
+ if (removeScript == null) {\r
+ return;\r
+ }\r
+\r
+ removeScript.setExecutable(true);\r
+\r
+ Installer installer = new Installer();\r
+ try {\r
+ installer.executeScript(removeScript);\r
+ } catch (IMShellCommandFail e) {\r
+ Log.err("Cannot execute InstallManager's remove script.");\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+\r
+ private File getRemoveScript() {\r
+ try {\r
+ if (Platform.isLinux()) {\r
+ return PathUtil\r
+ .getTempFileFromResource(\r
+ LINUX_INSTALL_MANAGER_REMOVE_SCRIPT,\r
+ "im_remove", ".sh");\r
+ } else if (Platform.isWindows()) {\r
+ return PathUtil.getTempFileFromResource(\r
+ WINDOWS_INSTALL_MANAGER_REMOVE_SCRIPT, "im_remove",\r
+ ".vbs");\r
+ } else if (Platform.isMacOS()) {\r
+ return null;\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+ } catch (IOException e) {\r
+ // TODO Auto-generated catch block\r
+ Log.err("Cannot get InstallManager's remove script.");\r
+ Log.ExceptionLog(e);\r
+ return null;\r
+ }\r
+ }\r
+\r
+ /*\r
+ * private void copyInstallManagerToTargetDirectoryForMac() {\r
+ * Log.log("Copy InstallManager to target in MAC platform");\r
+ * \r
+ * //get '.app' directory String fromPath =\r
+ * PathUtil.getParentDirectory(PathUtil.getCurrentDir(), 3); if (fromPath ==\r
+ * null) { Log.err("Cannot get parent directory => " +\r
+ * PathUtil.getCurrentDir()); return; }\r
+ * \r
+ * File fromFile = new File(fromPath);\r
+ * \r
+ * if (Registry.getInstalledPath() == null ||\r
+ * Registry.getInstalledPath().equals("")) {\r
+ * Log.err("Cannot find target dir"); return; }\r
+ * \r
+ * File toFile = getInstalledAppPath(); if (!toFile.exists()) { if\r
+ * (!toFile.mkdirs()) { Log.err("Fail to create file ==> " + toFile); } }\r
+ * \r
+ * if (fromFile.getAbsolutePath().equals(toFile.getAbsolutePath())) {\r
+ * return; }\r
+ * \r
+ * try { PathUtil.copy(fromFile, toFile); } catch (IOException e) {\r
+ * Log.ExceptionLog(e); return; }\r
+ * \r
+ * // copy InstallManager script to {target dir}/install-manager/ File\r
+ * installManagerScript = new File(PathUtil.get(Registry.getInstalledPath(),\r
+ * Config.INSTALL_MANAGER_DIRECTORY, Config.INSTALL_MANAGER_APP_JAVA,\r
+ * Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER )); File targetDir = new\r
+ * File(PathUtil.get(Registry.getInstalledPath(),\r
+ * Config.INSTALL_MANAGER_DIRECTORY));\r
+ * \r
+ * try { PathUtil.copy(installManagerScript, targetDir); } catch\r
+ * (IOException e) { Log.ExceptionLog(e); return; }\r
+ * \r
+ * //remove binary directory in target directory String removableBinaryPath\r
+ * = PathUtil.get(toFile.getAbsolutePath() , "Contents" , "Resources" ,\r
+ * "Java" , "binary");\r
+ * \r
+ * PathUtil.remove(removableBinaryPath); }\r
+ * \r
+ * private File getInstalledAppPath() { String appPath =\r
+ * Registry.getInstalledPath() + File.separator +\r
+ * Config.INSTALL_MANAGER_DIRECTORY + File.separator +\r
+ * Config.INSTALL_MANAGER_APP;\r
+ * \r
+ * return new File(appPath); }\r
+ */\r
+\r
+ /**\r
+ * Remove trash packages which are used during installation using SDK image.\r
+ */\r
+ private void cleanPackageDir() {\r
+ // remove binary directory. TODO remove INSTALL_MANAGER_TEMP_DIRECTORY\r
+ if (PathUtil.remove(PathUtil.get(Config.INSTALL_MANAGER_TEMP_DIRECTORY,\r
+ Config.INSTALL_MANAGER_DOWNLOAD_DIRECTORY_NAME,\r
+ Config.INSTALL_MANAGER_IMAGE_DOWNLOAD_DIRECTORY_NAME))) {\r
+ Log.log("Success to remove trash SDK image package binaries.");\r
+ } else {\r
+ Log.err("Fail to remove trash SDK image package binaries.");\r
+ }\r
+ }\r
+\r
+ public void removePackagesDir() {\r
+ // remove binary directory. TODO remove INSTALL_MANAGER_TEMP_DIRECTORY\r
+ if (PathUtil.remove(PathUtil.get(Config.INSTALL_MANAGER_TEMP_DIRECTORY,\r
+ Config.INSTALL_MANAGER_DOWNLOAD_DIRECTORY_NAME))) {\r
+ Log.log("Success to remove downloaded package binaries.");\r
+ } else {\r
+ Log.err("Fail to remove downloaded package binaries.");\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Package uninstallation management\r
+ * \r
+ * @param pkg\r
+ * @param monitor\r
+ * @return\r
+ */\r
+ public boolean removePackage(Package pkg, IIMProgressMonitor monitor) {\r
+ Log.log("InstallManager package remove start => " + pkg);\r
+ \r
+ if (pkg == null) {\r
+ return false;\r
+ }\r
+ \r
+ if (monitor != null) {\r
+ monitor.workedTitle(pkg.getPackageName());\r
+ }\r
+\r
+ if (Options.doRemoveNoUI || Options.doInstallNoUI) {\r
+ System.out.println(pkg.getPackageName() + " is uninstalling...");\r
+ }\r
+\r
+ boolean bResult = false;\r
+ if (packageManager.isInstalledPackage(pkg)) {\r
+ Installer installer = new Installer();\r
+\r
+ bResult = installer.uninstall(pkg, monitor);\r
+ } else {\r
+ bResult = true;\r
+ }\r
+ \r
+ // Remove packages in installed package list without result.\r
+ // We don't know that failed packages are working well.\r
+ packageManager.exceptPackageFromInstalledPackages(pkg);\r
+ packageManager.saveInstalledList();\r
+\r
+ Log.log(pkg + " remove end => " + bResult);\r
+ return bResult;\r
+ }\r
+\r
+ /**\r
+ * Packages uninstallation management\r
+ * \r
+ * @param pkg\r
+ * @param monitor\r
+ * @return\r
+ */\r
+ public boolean removePackages(PackageSet metasToRemove,\r
+ IIMProgressMonitor monitor) {\r
+ Log.log("InstallManager Packages remove Start => " + metasToRemove);\r
+\r
+ if (metasToRemove == null) {\r
+ return false;\r
+ }\r
+\r
+ PackageSet pkgsToRemove = packageManager\r
+ .getToRemovePackagesInRemove(metasToRemove);\r
+\r
+ Log.log("Remove packages: " + pkgsToRemove);\r
+\r
+ if (monitor != null) {\r
+ monitor.beginTask("Uninstalling...", pkgsToRemove.size() + 1);\r
+ }\r
+\r
+ int i = 0;\r
+ for (Package pkg : pkgsToRemove) {\r
+ if (monitor != null) {\r
+ monitor.workedDownloadProgress(pkg.getPackageName(), 1);\r
+ monitor.worked(++i);\r
+ }\r
+\r
+ if (removePackage(pkg, monitor)) {\r
+ continue;\r
+ } else {\r
+ Log.log("Remove fail but make progress=> " + pkg);\r
+ }\r
+ }\r
+\r
+ // if you remove all packages, delete targetDirectory and config File.\r
+ if (!packageManager.existInstalledMetaPackages()) {\r
+ Log.log("Installed meta packages do not exist");\r
+ if (monitor != null) {\r
+ monitor.workedDownloadProgress("Remove target directory...", 0);\r
+ monitor.worked(pkgsToRemove.size());\r
+ }\r
+\r
+ if (packageManager.existInstalledPackages()) {\r
+ Log.log("Installed meta packages do not exist, but some packages exist.");\r
+ removeAll(monitor);\r
+ } else {\r
+ // not exist to remove\r
+ removeSDK(monitor);\r
+ }\r
+ }\r
+\r
+ Log.log("InstallManager packages remove success. return => " + true);\r
+ return true;\r
+ }\r
+\r
+ /**\r
+ * Remove all of packages.\r
+ * \r
+ * @param monitor\r
+ */\r
+ public void removeAll(IIMProgressMonitor monitor) {\r
+ Log.log("InstallManager.removeAll()");\r
+\r
+ removeAllPackages(monitor);\r
+ removeSDK(monitor);\r
+ }\r
+\r
+ private void removeAllPackages(IIMProgressMonitor monitor) {\r
+ Log.log("Remove all packages.");\r
+\r
+ PackageSet removablePackages = packageManager.getInstalledPackages();\r
+\r
+ for (Package pkg : removablePackages) {\r
+ if (!removePackage(pkg, monitor)) {\r
+ Log.err("InstallManager.removeAll remove fail => " + pkg);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Remove All of TizenSDK files.\r
+ */\r
+ public void removeSDK(IIMProgressMonitor monitor) {\r
+ Log.log("InstallManager removeSDK start");\r
+\r
+ if (monitor != null) {\r
+ monitor.workedTitle(REMOVE_ALL_SDK_FILES);\r
+ }\r
+\r
+ removeInstallManager();\r
+ removeShortcutMenu();\r
+ removeChangeLog();\r
+ removeInfoDirectory();\r
+ checkTargetDirAndRemove();\r
+ // Registry.removeRegistry();\r
+ if (Config.isSupportMultiSDK()) {\r
+ Registry.removeMultiSDKInfo(Config.getSelectedSDKPath());\r
+ } else {\r
+ Registry.removeMultiSDKInfo(Registry.getInstalledPath());\r
+ }\r
+\r
+ // do not remove config home because it has log files\r
+ Log.log("InstallManager removeSDK end");\r
+ }\r
+\r
+ private void checkTargetDirAndRemove() {\r
+ File targetDir = new File(Registry.getInstalledPath());\r
+ if (canRemoveTargetDir(targetDir)) {\r
+ removeTargetDirectory();\r
+ } else {\r
+ Log.err("Cannot delete target directory => "\r
+ + targetDir.getAbsolutePath());\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Check status that target directory can remove or not.\r
+ * \r
+ * @param targetDir\r
+ * @return\r
+ */\r
+ private boolean canRemoveTargetDir(File targetDir) {\r
+ if (targetDir.exists()) {\r
+ File[] fileList = targetDir.listFiles();\r
+ if ((fileList == null || fileList.length <= 0)\r
+ || (fileList.length == 1 && fileList[0].getName().equals(\r
+ Config.OLD_INSTALL_MANAGER_DIRECTORY))) {\r
+ return true;\r
+ } else {\r
+ ArrayList<String> fileNames = new ArrayList<String>();\r
+ for (File file : fileList) {\r
+ fileNames.add(file.getName());\r
+ }\r
+ Log.err("The SDK directory is not empty => " + fileNames);\r
+ return false;\r
+ }\r
+ } else {\r
+ Log.err("The SDK direcotry is already removed");\r
+ return false;\r
+ }\r
+ }\r
+\r
+ private void removeChangeLog() {\r
+ File releaseNoteFile = new File(\r
+ PathUtil.getFromInstalledPath(Config.RELEASE_NOTE));\r
+\r
+ if (releaseNoteFile.exists()) {\r
+ PathUtil.remove(releaseNoteFile);\r
+ }\r
+ }\r
+\r
+ private void removeInfoDirectory() {\r
+ // remove info directory in $HOME/tizen-sdk-data\r
+ File infoDirFile = new File(\r
+ PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY));\r
+ if (infoDirFile.exists()) {\r
+ PathUtil.remove(infoDirFile);\r
+ }\r
+\r
+ // remove info directory in target directory\r
+ File targetInfoFile = new File(\r
+ PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY));\r
+\r
+ if (targetInfoFile.exists()) {\r
+ PathUtil.remove(targetInfoFile);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Remove target directory.\r
+ */\r
+ public void removeTargetDirectory() {\r
+ Log.log("InstallManager remove target directory start");\r
+\r
+ if (Platform.CURRENT_PLATFORM == Platform.LINUX_32\r
+ || Platform.CURRENT_PLATFORM == Platform.LINUX_64\r
+ || Platform.CURRENT_PLATFORM == Platform.MACOS_64) {\r
+ PathUtil.remove(Registry.getInstalledPath());\r
+ } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32\r
+ || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) {\r
+ if (!WindowsProgramController.removeRunningDir(Registry\r
+ .getInstalledPath())) {\r
+ Log.err("Cannot remove target directory");\r
+ }\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+\r
+ Log.log("InstallManager remove target directory end");\r
+ }\r
+\r
+ /**\r
+ * Singleton and global downloader shared and used by every components in IM\r
+ * \r
+ * @return singleton downloader object\r
+ */\r
+ public static Downloader getDownloader() {\r
+ return InstallManager.mDownloader;\r
+ }\r
+}\r
final static public String SDK_INSTALLED_PACKAGE_LIST_FILE = "installedpackage.list";
final static public String SDK_INSTALLED_PACKAGE_LIST_PATH = PathUtil.get(SDK_CONFIGURATION_DIR, SDK_INSTALLED_PACKAGE_LIST_FILE);
- final static public String SDK_PATCH_SCRIPT = getPatchScript();
- final static public String SDK_PATCH_TEMP_NAME = "patchTemp";
- final static public String SDK_PATCH_PKG_INFO = "pkginfo.manifest";
-
//test file
final static public String SDK_TEST_DIR_NAME = "test";
// final static public String SDK_INSTALLMANAGER_TEST_RESULT_DIR_PATH = PathUtil.get(SDK_DATA_PATH, SDK_TEST_DIR_NAME, INSTALLMANAGER_DIRECTORY_NAME);
}
static String getSDKDataPath() {
- if (Config.getInstance().getSdkDataDir().equals("")) {
+ if (Config.getInstance().getSdkDataDir() == "") {
if (Platform.isLinux() || Platform.isMacOS()) {
return PathUtil.getFromHome(SDK_DATA_DIR_NAME);
} else if (Platform.isWindows()) {
throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
}
}
-
- static String getPatchScript() {
- if (Platform.isLinux() || Platform.isMacOS()) {
- return "patch.sh";
- } else if (Platform.isWindows()) {
- return "patch.bat";
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- }
}
-/*
- * InstallManager
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact:
- * Wooyoung Cho <wooyoung1.cho@samsung.com>
- * Shihyun Kim <shihyun.kim@samsung.com>
- * Taeyoung Son <taeyoung2.son@samsung.com>
- * Yongsung kim <yongsung1.kim@samsung.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Contributors:
- * - S-Core Co., Ltd
- *
- */
-
-package org.tizen.installmanager.core;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.tizen.installmanager.lib.ErrorController;
-import org.tizen.installmanager.lib.ErrorController.InfoCode;
-import org.tizen.installmanager.lib.IIMProgressMonitor;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.LoggerShellParser;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.Registry;
-import org.tizen.installmanager.lib.SDKPackageFormat;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.pkg.model.Package;
-import org.tizen.installmanager.util.IMShellCommandFail;
-import org.tizen.installmanager.util.PathUtil;
-import org.tizen.installmanager.util.ShellUtil;
-
-/**
- * This class manages lowlevel install/uninstall operations
- *
- * @author Shihyun Kim <shihyun.kim@samsung.com>
- */
-public class Installer {
- /**
- * Install a package to target directory.
- *
- * @param pack
- * Package to be installed.
- * @param targetDir
- * Target directory to install.
- * @param monitor
- * If you want to express in UI, implement IIMProgressMonitor and
- * set this parametor. if not, set <code>null</code>.
- * @return <code>true</code>, if installation is success.
- */
- public boolean install(Package pack, String targetDir,
- IIMProgressMonitor monitor) {
- Log.log("**** installer install start => " + pack + ", target => " + targetDir);
-
- if (monitor != null) {
- monitor.workedInstallProgress(pack.getPackageName(), 1);
- }
-
- // unzip in temp dir
- String tempDir = PathUtil.get(targetDir, Config.TEMP_DIRECTORY);
-
- // Clear temp dir before unzip package.
- File tmpDir = new File(tempDir);
-
- if (tmpDir.exists()) {
- if (!tmpDir.delete()) {
- Log.err("Fail to delete " + tmpDir);
- }
- }
-
- long unZipSize = unZipPackage(pack, tempDir, monitor);
-
- if (unZipSize <= 0) {
- Log.err("Unzip failed. => " + pack);
- PathUtil.remove(tempDir);
- throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE);
- }
- if (!checkUnzipSize(pack, unZipSize)) {
- Log.err("Unzip size error. => " + pack);
- PathUtil.remove(tempDir);
- throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE);
- }
-
- if (!moveToTargetDirectoryFromTempDirectory(tempDir, targetDir)) {
- PathUtil.remove(tempDir);
- Log.err("Moving temp to target failed. Remove temp and cancel installing.");
- throw new IMFatalException(
- ErrorCode.CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY);
- }
-
- List<File> missingFiles = findMissingFiles(pack, monitor);
- if (missingFiles.size() > 0) {
- Log.err("Some files are not moved properly: " + missingFiles);
- throw new IMFatalException(ErrorCode.FIND_MISSING_FILES);
- } else {
- Log.log("All files moved properly.");
- }
-
- if (!executeInstallScript(pack, monitor, tempDir)) {
- Log.err("Fail to execute install script.");
- PathUtil.remove(tempDir);
- throw new IMFatalException(ErrorController.getMessage(ErrorCode.INSTALL_SCRIPT_FATAL_ERROR)
- + " (" + pack + " package)");
- }
-
- if (!moveRemoveScript(tempDir, pack)) {
- PathUtil.remove(tempDir);
- return false;
- }
-
- PathUtil.remove(tempDir);
- return true;
- }
-
- private boolean moveRemoveScript(String tempDir, Package pack) {
- // move removeScript file to special Directory
- File removeScriptFrom = new File(tempDir + File.separator
- + pack.getRemoveScript());
-
- if ((pack.getRemoveScript() != null)
- && !(pack.getRemoveScript().equals(""))
- && (removeScriptFrom.exists())) {
- File removeScriptTo = new File(getRemoveScriptLocalPath(pack));
- if (!createRemoveScriptDir(removeScriptTo)) {
- Log.err("Cannot create remove script directory in Info directory => "
- + pack.getPackageName());
- return false;
- } else {
- if (removeScriptTo.exists()) {
- if (!removeScriptTo.delete()) {
- Log.err("Fail to delete file ==> " + removeScriptTo);
- }
- }
- if (!PathUtil.moveFile(removeScriptFrom, removeScriptTo)) {
- Log.err("Cannot move removeScript to targetDir => "
- + pack.getPackageName());
- return false;
- }
- }
- }
- return true;
- }
-
-// private boolean moveInstallScript(String tempDir, Package pack) {
-// // move removeScript file to special Directory
-// File installScriptFrom = new File(tempDir + File.separator
-// + pack.getInstallScript());
-//
-// if ((pack.getInstallScript() != null)
-// && !(pack.getInstallScript().equals(""))
-// && (installScriptFrom.exists())) {
-// File installScriptTo = new File(getInstallScriptLocalPath(pack));
-// if (!createInstallScriptDir(installScriptTo)) {
-// Log.err("Cannot create install script directory in Info directory => "
-// + pack.getPackageName());
-// return false;
-// } else {
-// if (installScriptTo.exists()) {
-// if (!installScriptTo.delete()) {
-// Log.err("Fail to delete file ==> " + installScriptTo);
-// }
-// }
-// if (!PathUtil.moveFile(installScriptFrom, installScriptTo)) {
-// Log.err("Cannot move install Script to targetDir => "
-// + pack.getPackageName());
-// return false;
-// }
-// }
-// }
-// return true;
-// }
-
- /**
- * @param pack
- * @return list of files which are not moved normally
- */
- private List<File> findMissingFiles(Package pack, IIMProgressMonitor monitor) {
- LinkedList<File> missingFiles = new LinkedList<File>();
-
- if (pack == null) {
- return missingFiles;
- }
-
- if (monitor != null) {
- monitor.workedInstallProgress("Verify that the file exists", 0);
- }
-
- File listFile = new File(getInstalledFileListPath(pack));
- InputStream is = null;
- BufferedReader in = null;
- try {
- is = new FileInputStream(listFile);
- in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
- String line;
- while ((line = in.readLine()) != null) {
- File tmp = new File(PathUtil.getFromInstalledPath(line));
- if (!tmp.exists()) {
- if (Platform.isWindows()) {
- missingFiles.add(tmp);
- } else if (Platform.isLinux() || Platform.isMacOS()) {
- // check if it is broken link
- try {
- int exitCode = ShellUtil.execute("ls " + tmp, null);
- if (exitCode == 0) {
- Log.log("broken link " + tmp
- + " but no problem");
- } else {
- Log.err(tmp + " not exist.");
- missingFiles.add(tmp);
- }
- } catch (IMShellCommandFail e) {
- Log.err("Failed to check file exists");
- Log.ExceptionLog(e);
- }
- } else {
- throw new IMFatalException(
- ErrorCode.UNSUPPORTED_PLATFORM);
- }
- }
- }
- } catch (IOException e) {
- Log.err("Installer.findMissingFiles() Cannot check file list: "
- + listFile.getAbsolutePath());
- throw new IMFatalException(
- ErrorCode.CANNOT_CHECK_INSTLLED_FILE_LIST);
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
-
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
- }
- return missingFiles;
- }
-
- /**
- * Set script running process' environment variables.
- *
- * @return Environment variables map
- */
- public Map<String, String> setEnvironmentVariable() {
- HashMap<String, String> env = new HashMap<String, String>();
-
- env.put("INSTALLED_PATH", Registry.getInstalledPath());
- env.put("SDK_DATA_PATH", Registry.sdkDataPath);
- env.put("USER_DATA_PATH", Registry.sdkDataPath);
- env.put("MAKESHORTCUT_PATH", InstallManager.getInstance().getMakeShortCutPath());
- env.put("REMOVE_SHORTCUT", InstallManager.getInstance().getRemoveShortCutPath());
- env.put("TSUDO", InstallManager.getInstance().getTSudoPath());
-
- if (Options.doInstallNoUI || Options.doRemoveNoUI){
- env.put("INSTALLMANAGER_UI", "CLI");
- } else {
- env.put("INSTALLMANAGER_UI", "GUI");
- }
-
- if (Options.interactive) {
- env.put("INTERACTIVE", "true");
- } else {
- env.put("INTERACTIVE", "false");
- env.put("SUPASS", Options.suPass);
- }
-
- return env;
- }
-
- private long unZipPackage(Package pkg, String tempDir,
- IIMProgressMonitor monitor) {
- String filePath = InstallManager.getInstance().getDownloadTargetPath(pkg);
-
- File pkgFile = new File(filePath);
- if (!pkgFile.exists()) {
- Log.err(filePath + " doesn't exist");
- throw new IMFatalException(ErrorCode.CANNOT_FIND_FILE_IN_LOCAL);
- }
-
- SDKPackageFormat format = SDKPackageFormat.createSDKPackageFormat();
-
- // Each packages are saved installed list to file
- String installedFileListPath = getInstalledFileListPath(pkg);
-
- format.setFileOutput(installedFileListPath);
-
- return format.unZip(filePath, tempDir, monitor);
- }
-
- private String getRemoveScriptLocalPath(Package pkg) {
- return PathUtil.get(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),
- pkg.getPackageName(), pkg.getRemoveScript());
- }
-
- private String getInstalledFileListPath(Package pkg) {
- return PathUtil.get(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),
- pkg.getPackageName(), (pkg.getPackageName() + ".list"));
- }
-
- private boolean moveToTargetDirectoryFromTempDirectory(String tempDir,
- String targetDir) {
- Log.log("Move temp to target");
- File fromFile = new File(tempDir + File.separator
- + Config.DATA_DIRECTORY);
- if (!fromFile.exists()) {
- Log.err("Data directory is not exist in package.");
- return true;
- }
- File toFile = new File(targetDir);
-
- File[] fromList = fromFile.listFiles();
-
- if (fromList == null) {
- return false;
- }
-
- for (int i = 0; i < fromList.length; i++) {
- boolean ret = false;
- if (Platform.isLinux()) {
- ret = PathUtil.copyHardLink(fromList[i], toFile, false);
- } else if (Platform.isWindows()) {
- ret = PathUtil.move(fromList[i],
- new File(toFile, fromList[i].getName()));
- } else if (Platform.isMacOS()) {
- ret = PathUtil.copyHardLink(fromList[i], toFile, false);
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- if (!ret) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Uninstalls the given package
- *
- * @param pkg
- * package to be uninstalled
- * @param monitor
- * @return true if success. false if fatal error. delete failure is checked
- * and sets error status in ErrorController but still returns true.
- * if file to be deleted doesn't exist, it's not considered error.
- */
- public boolean uninstall(Package pkg, IIMProgressMonitor monitor) {
- Log.log("Installer uninstall start");
-
- if (monitor != null) {
- monitor.workedInstallProgress("Remove the " + pkg.getPackageName(), 1);
- }
-
- int resultRemoveScript = executeRemoveScript(pkg, monitor);
-
- if (resultRemoveScript == 0) {
- Log.log("Execute remove script success.");
- } else if (resultRemoveScript == 1) {
- Log.err("Execute remove script fail.");
- } else if (resultRemoveScript == 2) {
- Log.log("This package does not need a remove script.");
- }
-
- File installedFileList = new File(getInstalledFileListPath(pkg));
-
- if (!installedFileList.exists()) {
- ErrorController.setError(ErrorCode.CONFIG_CANNOT_FIND_INSTALLED_FILE_LIST);
- return false;
- }
-
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new FileReader(installedFileList));
-
- String line = null;
- Stack<File> dirStack = new Stack<File>();
- while ((line = reader.readLine()) != null) {
- File deleteFile = new File(PathUtil.getFromInstalledPath(line));
-
- if (deleteFile.isDirectory()) {
- File[] listFiles = deleteFile.listFiles();
-
- if (listFiles == null || listFiles.length <= 0) {
- deleteIfExists(deleteFile);
- } else {
- dirStack.push(deleteFile);
- }
- } else {
- deleteIfExists(deleteFile);
- }
- }
-
- while (!dirStack.isEmpty()) {
- File deleteDir = dirStack.pop();
- File[] listFiles = deleteDir.listFiles();
-
- if (listFiles == null || listFiles.length <= 0) {
- deleteIfExists(deleteDir);
- }
- }
-
- } catch (FileNotFoundException e) {
- Log.err("File not found => " + installedFileList.getAbsolutePath());
- return false;
- } catch (IOException e) {
- Log.err("IO Exception => " + installedFileList.getAbsolutePath());
- return false;
- } catch (Throwable e) {
- Log.ExceptionLog(e);
- return false;
- } finally {
- try {
- if (reader != null) {
- reader.close();
- deleteIfExists(installedFileList);
- }
- } catch (IOException ioe) {
- Log.err("Close fileoutput fail.");
- }
- }
-
- return true;
- }
-
- /**
- * Delete the <code>file</code>
- *
- * @param file
- */
- private void deleteIfExists(File file) {
- if (!file.delete()) {
- Log.err("Delete fail -> " + file.getAbsolutePath());
- }
- }
-
- private boolean checkUnzipSize(Package pack, long size) {
- // TODO : impl. not supported
- return true;
- }
-
- private boolean createRemoveScriptDir(File removeScript) {
- File parentDir = removeScript.getParentFile();
-
- if (!parentDir.exists()) {
- return parentDir.mkdirs();
- } else {
- return true;
- }
- }
-
- private boolean executeInstallScript(Package pack,
- IIMProgressMonitor monitor, String tempDir) {
- if (pack.getInstallScript() != null
- && !pack.getInstallScript().equals("")) {
- String command = PathUtil.get(tempDir, pack.getInstallScript());
- File scriptFile = new File(command);
-
- if (scriptFile.exists()) {
- Log.log("Execute " + pack.getPackageName() + " install script");
-
- if (monitor != null) {
- monitor.workedInstallProgress("Execute the " + pack.getPackageName() + " install script", 0);
- }
- try {
- return executeScript(scriptFile);
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorController.getMessage(ErrorCode.INSTALL_SCRIPT_FATAL_ERROR)
- + " (" + pack + " package)");
- }
- } else {
- Log.log(pack.getPackageName() + " does not have install script");
- }
- }
- return true;
- }
-
- private int executeRemoveScript(Package pkg, IIMProgressMonitor monitor) {
- Log.log("executeRemoveScript => " + pkg.getRemoveScript());
-
- // execute remove script
- String script = PathUtil.get(getRemoveScriptLocalPath(pkg));
- File scriptFile = new File(script);
-
- if (scriptFile.exists()) {
-
- if (monitor != null) {
- monitor.workedInstallProgress("Excute the " + pkg.getPackageName() + " remove script", 0);
- }
-
- try {
- if (executeScript(scriptFile)) {
- return 0; // succeed to execute remove script.
- } else {
- return 1; // fail to execute remove script.
- }
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorController.getMessage(ErrorCode.REMOVE_SCRIPT_FATAL_ERROR)
- + " (" + pkg + " package)");
- }
- }
- return 2; // package does not need remove script.
- }
-
- /**
- * Executes the file with default environment variables
- *
- * @param scriptFile
- * @return <code>true</code> if success
- * @throws IMShellCommandFail
- */
- public boolean executeScript(File scriptFile) throws IMShellCommandFail {
- scriptFile.setExecutable(true);
- Map<String, String> env = setEnvironmentVariable();
-
- String command = ShellUtil.addInterpreter(scriptFile.getAbsolutePath());
-
- String current = PathUtil.getCurrentDir();
- Log.log("Current working directory. => " + current);
- int exitCode = ShellUtil.execute(command, env, new File(current),
- new LoggerShellParser());
-
- // check exit code
- if (exitCode == 0) {
- return true;
- } else if (exitCode == 1 || exitCode == 2) {
- Log.err("Exit code => " + Integer.toString(exitCode));
- return false;
- } else if (exitCode == 99) {
- ErrorController.setInfoCode(InfoCode.RESTART_THE_COMPUTER);
- Log.log("Set restart message.");
- return true;
- } else {
- Log.err("Installer.executeScript() install script error => "
- + scriptFile.getAbsolutePath());
- Log.err("Exit code => " + Integer.toString(exitCode));
- throw new IMFatalException(ErrorController.getMessage(ErrorCode.SCRIPT_FATAL_ERROR)
- + " (" + scriptFile.getParentFile().getName() + " package)");
- }
- }
-}
+/*\r
+ * InstallManager\r
+ *\r
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact: \r
+ * Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+ * Shihyun Kim <shihyun.kim@samsung.com>\r
+ * Taeyoung Son <taeyoung2.son@samsung.com>\r
+ * Yongsung kim <yongsung1.kim@samsung.com>\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ *\r
+ */\r
+\r
+package org.tizen.installmanager.core;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileReader;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.InputStreamReader;\r
+import java.util.HashMap;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Stack;\r
+\r
+import org.tizen.installmanager.lib.ErrorController;\r
+import org.tizen.installmanager.lib.ErrorController.InfoCode;\r
+import org.tizen.installmanager.lib.IIMProgressMonitor;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.LoggerShellParser;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.lib.Registry;\r
+import org.tizen.installmanager.lib.SDKPackageFormat;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+import org.tizen.installmanager.pkg.model.Package;\r
+import org.tizen.installmanager.util.IMShellCommandFail;\r
+import org.tizen.installmanager.util.PathUtil;\r
+import org.tizen.installmanager.util.ShellUtil;\r
+\r
+/**\r
+ * This class manages lowlevel install/uninstall operations\r
+ * \r
+ * @author Shihyun Kim <shihyun.kim@samsung.com>\r
+ */\r
+public class Installer {\r
+ /**\r
+ * Install a package to target directory.\r
+ * \r
+ * @param pack\r
+ * Package to be installed.\r
+ * @param targetDir\r
+ * Target directory to install.\r
+ * @param monitor\r
+ * If you want to express in UI, implement IIMProgressMonitor and\r
+ * set this parametor. if not, set <code>null</code>.\r
+ * @return <code>true</code>, if installation is success.\r
+ */\r
+ public boolean install(Package pack, String targetDir,\r
+ IIMProgressMonitor monitor) {\r
+ Log.log("**** installer install start => " + pack + ", target => " + targetDir);\r
+\r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress(pack.getPackageName(), 1);\r
+ }\r
+ \r
+ // unzip in temp dir\r
+ String tempDir = PathUtil.get(targetDir, Config.TEMP_DIRECTORY);\r
+\r
+ // Clear temp dir before unzip package.\r
+ File tmpDir = new File(tempDir);\r
+ \r
+ if (tmpDir.exists()) {\r
+ if (!tmpDir.delete()) {\r
+ Log.err("Fail to delete " + tmpDir);\r
+ }\r
+ }\r
+\r
+ long unZipSize = unZipPackage(pack, tempDir, monitor);\r
+\r
+ if (unZipSize <= 0) {\r
+ Log.err("Unzip failed. => " + pack);\r
+ PathUtil.remove(tempDir);\r
+ throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE);\r
+ }\r
+ if (!checkUnzipSize(pack, unZipSize)) {\r
+ Log.err("Unzip size error. => " + pack);\r
+ PathUtil.remove(tempDir);\r
+ throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE);\r
+ }\r
+\r
+ if (!moveToTargetDirectoryFromTempDirectory(tempDir, targetDir)) {\r
+ PathUtil.remove(tempDir);\r
+ Log.err("Moving temp to target failed. Remove temp and cancel installing.");\r
+ throw new IMFatalException(\r
+ ErrorCode.CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY);\r
+ }\r
+\r
+ List<File> missingFiles = findMissingFiles(pack, monitor);\r
+ if (missingFiles.size() > 0) {\r
+ Log.err("Some files are not moved properly: " + missingFiles);\r
+ throw new IMFatalException(ErrorCode.FIND_MISSING_FILES);\r
+ } else {\r
+ Log.log("All files moved properly.");\r
+ }\r
+\r
+ if (!executeInstallScript(pack, monitor, tempDir)) {\r
+ Log.err("Fail to execute install script.");\r
+ PathUtil.remove(tempDir);\r
+ throw new IMFatalException(ErrorController.getMessage(ErrorCode.INSTALL_SCRIPT_FATAL_ERROR)\r
+ + " (" + pack + " package)");\r
+ }\r
+\r
+ if (!moveRemoveScript(tempDir, pack)) {\r
+ PathUtil.remove(tempDir);\r
+ return false;\r
+ }\r
+ \r
+ PathUtil.remove(tempDir);\r
+ return true;\r
+ }\r
+ \r
+ private boolean moveRemoveScript(String tempDir, Package pack) {\r
+ // move removeScript file to special Directory\r
+ File removeScriptFrom = new File(tempDir + File.separator\r
+ + pack.getRemoveScript());\r
+\r
+ if ((pack.getRemoveScript() != null)\r
+ && !(pack.getRemoveScript().equals(""))\r
+ && (removeScriptFrom.exists())) {\r
+ File removeScriptTo = new File(getRemoveScriptLocalPath(pack));\r
+ if (!createRemoveScriptDir(removeScriptTo)) {\r
+ Log.err("Cannot create remove script directory in Info directory => "\r
+ + pack.getPackageName());\r
+ return false;\r
+ } else {\r
+ if (removeScriptTo.exists()) {\r
+ if (!removeScriptTo.delete()) {\r
+ Log.err("Fail to delete file ==> " + removeScriptTo);\r
+ }\r
+ }\r
+ if (!PathUtil.moveFile(removeScriptFrom, removeScriptTo)) {\r
+ Log.err("Cannot move removeScript to targetDir => "\r
+ + pack.getPackageName());\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ \r
+// private boolean moveInstallScript(String tempDir, Package pack) {\r
+// // move removeScript file to special Directory\r
+// File installScriptFrom = new File(tempDir + File.separator\r
+// + pack.getInstallScript());\r
+//\r
+// if ((pack.getInstallScript() != null)\r
+// && !(pack.getInstallScript().equals(""))\r
+// && (installScriptFrom.exists())) {\r
+// File installScriptTo = new File(getInstallScriptLocalPath(pack));\r
+// if (!createInstallScriptDir(installScriptTo)) {\r
+// Log.err("Cannot create install script directory in Info directory => "\r
+// + pack.getPackageName());\r
+// return false;\r
+// } else {\r
+// if (installScriptTo.exists()) {\r
+// if (!installScriptTo.delete()) {\r
+// Log.err("Fail to delete file ==> " + installScriptTo);\r
+// }\r
+// }\r
+// if (!PathUtil.moveFile(installScriptFrom, installScriptTo)) {\r
+// Log.err("Cannot move install Script to targetDir => "\r
+// + pack.getPackageName());\r
+// return false;\r
+// }\r
+// }\r
+// }\r
+// return true;\r
+// }\r
+\r
+ /**\r
+ * @param pack\r
+ * @return list of files which are not moved normally\r
+ */\r
+ private List<File> findMissingFiles(Package pack, IIMProgressMonitor monitor) {\r
+ LinkedList<File> missingFiles = new LinkedList<File>();\r
+ \r
+ if (pack == null) {\r
+ return missingFiles;\r
+ }\r
+ \r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Verify that the file exists", 0);\r
+ }\r
+ \r
+ File listFile = new File(getInstalledFileListPath(pack));\r
+ InputStream is = null;\r
+ BufferedReader in = null;\r
+ try {\r
+ is = new FileInputStream(listFile);\r
+ in = new BufferedReader(new InputStreamReader(is, "UTF-8"));\r
+ String line;\r
+ while ((line = in.readLine()) != null) {\r
+ File tmp = new File(PathUtil.getFromInstalledPath(line));\r
+ if (!tmp.exists()) {\r
+ if (Platform.isWindows()) {\r
+ missingFiles.add(tmp);\r
+ } else if (Platform.isLinux() || Platform.isMacOS()) {\r
+ // check if it is broken link\r
+ try {\r
+ int exitCode = ShellUtil.execute("ls " + tmp, null);\r
+ if (exitCode == 0) {\r
+ Log.log("broken link " + tmp\r
+ + " but no problem");\r
+ } else {\r
+ Log.err(tmp + " not exist.");\r
+ missingFiles.add(tmp);\r
+ }\r
+ } catch (IMShellCommandFail e) {\r
+ Log.err("Failed to check file exists");\r
+ Log.ExceptionLog(e);\r
+ }\r
+ } else {\r
+ throw new IMFatalException(\r
+ ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+ }\r
+ }\r
+ } catch (IOException e) {\r
+ Log.err("Installer.findMissingFiles() Cannot check file list: "\r
+ + listFile.getAbsolutePath());\r
+ throw new IMFatalException(\r
+ ErrorCode.CANNOT_CHECK_INSTLLED_FILE_LIST);\r
+ } finally {\r
+ if (in != null) {\r
+ try {\r
+ in.close();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ \r
+ if (is != null) {\r
+ try {\r
+ is.close();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ }\r
+ return missingFiles;\r
+ }\r
+\r
+ /**\r
+ * Set script running process' environment variables.\r
+ * \r
+ * @return Environment variables map\r
+ */\r
+ private Map<String, String> setEnvironmentVariable() {\r
+ HashMap<String, String> env = new HashMap<String, String>();\r
+\r
+ env.put("INSTALLED_PATH", Registry.getInstalledPath());\r
+ env.put("SDK_DATA_PATH", Registry.sdkDataPath);\r
+ env.put("USER_DATA_PATH", Registry.sdkDataPath);\r
+ env.put("MAKESHORTCUT_PATH", InstallManager.getInstance().getMakeShortCutPath());\r
+ env.put("REMOVE_SHORTCUT", InstallManager.getInstance().getRemoveShortCutPath());\r
+ env.put("TSUDO", InstallManager.getInstance().getTSudoPath());\r
+ \r
+ if (Options.doInstallNoUI || Options.doRemoveNoUI){\r
+ env.put("INSTALLMANAGER_UI", "CLI");\r
+ } else {\r
+ env.put("INSTALLMANAGER_UI", "GUI");\r
+ }\r
+ \r
+ if (Options.interactive) {\r
+ env.put("INTERACTIVE", "true");\r
+ } else {\r
+ env.put("INTERACTIVE", "false");\r
+ env.put("SUPASS", Options.suPass);\r
+ }\r
+ \r
+ return env;\r
+ }\r
+\r
+ private long unZipPackage(Package pkg, String tempDir,\r
+ IIMProgressMonitor monitor) {\r
+ String filePath = InstallManager.getInstance().getDownloadTargetPath(pkg);\r
+ \r
+ File pkgFile = new File(filePath);\r
+ if (!pkgFile.exists()) {\r
+ Log.err(filePath + " doesn't exist");\r
+ throw new IMFatalException(ErrorCode.CANNOT_FIND_FILE_IN_LOCAL);\r
+ }\r
+\r
+ SDKPackageFormat format = SDKPackageFormat.createSDKPackageFormat();\r
+\r
+ // Each packages are saved installed list to file\r
+ String installedFileListPath = getInstalledFileListPath(pkg);\r
+\r
+ format.setFileOutput(installedFileListPath);\r
+\r
+ return format.unZip(filePath, tempDir, monitor);\r
+ }\r
+\r
+ private String getRemoveScriptLocalPath(Package pkg) {\r
+ return PathUtil.get(\r
+ PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),\r
+ pkg.getPackageName(), pkg.getRemoveScript());\r
+ }\r
+\r
+ private String getInstalledFileListPath(Package pkg) {\r
+ return PathUtil.get(\r
+ PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),\r
+ pkg.getPackageName(), (pkg.getPackageName() + ".list"));\r
+ }\r
+\r
+ private boolean moveToTargetDirectoryFromTempDirectory(String tempDir,\r
+ String targetDir) {\r
+ Log.log("Move temp to target");\r
+ File fromFile = new File(tempDir + File.separator\r
+ + Config.DATA_DIRECTORY);\r
+ if (!fromFile.exists()) {\r
+ Log.err("Data directory is not exist in package.");\r
+ return true;\r
+ }\r
+ File toFile = new File(targetDir);\r
+\r
+ File[] fromList = fromFile.listFiles();\r
+\r
+ if (fromList == null) {\r
+ return false;\r
+ }\r
+\r
+ for (int i = 0; i < fromList.length; i++) {\r
+ boolean ret = false;\r
+ if (Platform.isLinux()) {\r
+ ret = PathUtil.copyHardLink(fromList[i], toFile);\r
+ } else if (Platform.isWindows()) {\r
+ ret = PathUtil.move(fromList[i],\r
+ new File(toFile, fromList[i].getName()));\r
+ } else if (Platform.isMacOS()) {\r
+ ret = PathUtil.copyHardLink(fromList[i], toFile);\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+ if (!ret) {\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /**\r
+ * Uninstalls the given package\r
+ * \r
+ * @param pkg\r
+ * package to be uninstalled\r
+ * @param monitor\r
+ * @return true if success. false if fatal error. delete failure is checked\r
+ * and sets error status in ErrorController but still returns true.\r
+ * if file to be deleted doesn't exist, it's not considered error.\r
+ */\r
+ public boolean uninstall(Package pkg, IIMProgressMonitor monitor) {\r
+ Log.log("Installer uninstall start");\r
+ \r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Remove the " + pkg.getPackageName(), 1);\r
+ }\r
+ \r
+ int resultRemoveScript = executeRemoveScript(pkg, monitor);\r
+\r
+ if (resultRemoveScript == 0) {\r
+ Log.log("Execute remove script success.");\r
+ } else if (resultRemoveScript == 1) {\r
+ Log.err("Execute remove script fail.");\r
+ } else if (resultRemoveScript == 2) {\r
+ Log.log("This package does not need a remove script.");\r
+ }\r
+\r
+ File installedFileList = new File(getInstalledFileListPath(pkg));\r
+\r
+ if (!installedFileList.exists()) {\r
+ ErrorController.setError(ErrorCode.CONFIG_CANNOT_FIND_INSTALLED_FILE_LIST);\r
+ return false;\r
+ }\r
+\r
+ BufferedReader reader = null;\r
+ try {\r
+ reader = new BufferedReader(new FileReader(installedFileList));\r
+\r
+ String line = null;\r
+ Stack<File> dirStack = new Stack<File>();\r
+ while ((line = reader.readLine()) != null) {\r
+ File deleteFile = new File(PathUtil.getFromInstalledPath(line));\r
+\r
+ if (deleteFile.isDirectory()) {\r
+ File[] listFiles = deleteFile.listFiles();\r
+\r
+ if (listFiles == null || listFiles.length <= 0) {\r
+ deleteIfExists(deleteFile);\r
+ } else {\r
+ dirStack.push(deleteFile);\r
+ }\r
+ } else {\r
+ deleteIfExists(deleteFile);\r
+ }\r
+ }\r
+\r
+ while (!dirStack.isEmpty()) {\r
+ File deleteDir = dirStack.pop();\r
+ File[] listFiles = deleteDir.listFiles();\r
+\r
+ if (listFiles == null || listFiles.length <= 0) {\r
+ deleteIfExists(deleteDir);\r
+ }\r
+ }\r
+\r
+ } catch (FileNotFoundException e) {\r
+ Log.err("File not found => " + installedFileList.getAbsolutePath());\r
+ return false;\r
+ } catch (IOException e) {\r
+ Log.err("IO Exception => " + installedFileList.getAbsolutePath());\r
+ return false;\r
+ } catch (Throwable e) {\r
+ Log.ExceptionLog(e);\r
+ return false;\r
+ } finally {\r
+ try {\r
+ if (reader != null) {\r
+ reader.close();\r
+ deleteIfExists(installedFileList);\r
+ }\r
+ } catch (IOException ioe) {\r
+ Log.err("Close fileoutput fail.");\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ /**\r
+ * Delete the <code>file</code>\r
+ * \r
+ * @param file\r
+ */\r
+ private void deleteIfExists(File file) {\r
+ if (!file.delete()) {\r
+ Log.err("Delete fail -> " + file.getAbsolutePath());\r
+ }\r
+ }\r
+\r
+ private boolean checkUnzipSize(Package pack, long size) {\r
+ // TODO : impl. not supported\r
+ return true;\r
+ }\r
+\r
+ private boolean createRemoveScriptDir(File removeScript) {\r
+ File parentDir = removeScript.getParentFile();\r
+\r
+ if (!parentDir.exists()) {\r
+ return parentDir.mkdirs();\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ \r
+ private boolean executeInstallScript(Package pack,\r
+ IIMProgressMonitor monitor, String tempDir) {\r
+ if (pack.getInstallScript() != null\r
+ && !pack.getInstallScript().equals("")) {\r
+ String command = PathUtil.get(tempDir, pack.getInstallScript());\r
+ File scriptFile = new File(command);\r
+\r
+ if (scriptFile.exists()) {\r
+ Log.log("Execute " + pack.getPackageName() + " install script");\r
+\r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Execute the " + pack.getPackageName() + " install script", 0);\r
+ }\r
+ try {\r
+ return executeScript(scriptFile);\r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorController.getMessage(ErrorCode.INSTALL_SCRIPT_FATAL_ERROR)\r
+ + " (" + pack + " package)");\r
+ }\r
+ } else {\r
+ Log.log(pack.getPackageName() + " does not have install script");\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private int executeRemoveScript(Package pkg, IIMProgressMonitor monitor) {\r
+ Log.log("executeRemoveScript => " + pkg.getRemoveScript());\r
+\r
+ // execute remove script\r
+ String script = PathUtil.get(getRemoveScriptLocalPath(pkg));\r
+ File scriptFile = new File(script);\r
+\r
+ if (scriptFile.exists()) {\r
+\r
+ if (monitor != null) {\r
+ monitor.workedInstallProgress("Excute the " + pkg.getPackageName() + " remove script", 0);\r
+ }\r
+\r
+ try {\r
+ if (executeScript(scriptFile)) {\r
+ return 0; // succeed to execute remove script.\r
+ } else {\r
+ return 1; // fail to execute remove script.\r
+ }\r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorController.getMessage(ErrorCode.REMOVE_SCRIPT_FATAL_ERROR)\r
+ + " (" + pkg + " package)");\r
+ }\r
+ }\r
+ return 2; // package does not need remove script.\r
+ }\r
+\r
+ /**\r
+ * Executes the file with default environment variables\r
+ * \r
+ * @param scriptFile\r
+ * @return <code>true</code> if success\r
+ * @throws IMShellCommandFail\r
+ */\r
+ public boolean executeScript(File scriptFile) throws IMShellCommandFail {\r
+ scriptFile.setExecutable(true);\r
+ Map<String, String> env = setEnvironmentVariable();\r
+\r
+ String command = ShellUtil.addInterpreter(scriptFile.getAbsolutePath());\r
+\r
+ String current = PathUtil.getCurrentDir();\r
+ Log.log("Current working directory. => " + current);\r
+ int exitCode = ShellUtil.execute(command, env, new File(current),\r
+ new LoggerShellParser());\r
+\r
+ // check exit code\r
+ if (exitCode == 0) {\r
+ return true;\r
+ } else if (exitCode == 1 || exitCode == 2) {\r
+ Log.err("Exit code => " + Integer.toString(exitCode));\r
+ return false;\r
+ } else if (exitCode == 99) {\r
+ ErrorController.setInfoCode(InfoCode.RESTART_THE_COMPUTER);\r
+ Log.log("Set restart message.");\r
+ return true;\r
+ } else {\r
+ Log.err("Installer.executeScript() install script error => "\r
+ + scriptFile.getAbsolutePath());\r
+ Log.err("Exit code => " + Integer.toString(exitCode));\r
+ throw new IMFatalException(ErrorController.getMessage(ErrorCode.SCRIPT_FATAL_ERROR)\r
+ + " (" + scriptFile.getParentFile().getName() + " package)");\r
+ }\r
+ }\r
+}\r
-/*
-* InstallManager
-*
-* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Wooyoung Cho <wooyoung1.cho@samsung.com>
-* Shihyun Kim <shihyun.kim@samsung.com>
-* Taeyoung Son <taeyoung2.son@samsung.com>
-* Yongsung kim <yongsung1.kim@samsung.com>
-*
- * Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
-
-package org.tizen.installmanager.core;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.tizen.installmanager.core.Config.ServerType;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.Registry;
-
-/**
- * This class represents options from command line arguments.
- * @author Wooyoung Cho <wooyoung1.cho@samsung.com>
- *
- */
-public class Options {
- /**
- * Do sanity checks including file size and checksum
- */
- public static boolean doPackageValidation = true;
-
- /**
- * Do download package file.
- */
- public static boolean onlyDownload = false;
-
- /**
- * Do resume downloading.
- */
- public static boolean doResumeDownloading = true;
-
- /**
- * Use system proxy
- */
- public static boolean useAutoProxy = true;
-
- /**
- * Do remove temporary installmanager that exist in /tmp/tizensdk
- */
- public static boolean doRemoveTempTizenSDK = true;
-
- /**
- * Conf file provided by user
- */
- public static String userConfPath = null;
-
- /**
- * update installmanager.
- * If <code>doUpdateInstallManager</code> is false, do not update installmanager binary.
- */
- public static boolean doUpdateInstallManager = true;
- /**
- * Do replace repository.
- * If <code>doRepository</code> is true, change repository address to <code>repo</code> variable.
- */
- public static boolean doReplaceRepository = false;
-
- /**
- * Do remove packages after installation
- */
- public static boolean doRemovePackages = true;
-
- /**
- * Do remove old sdk.
- * If installer cannot update sdk, <code>doRemoveOldSDK</code> is true.
- */
- public static boolean doRemoveOldSDK = false;
- /**
- * Just check installer is available for update.
- */
- public static boolean checkPackageUpdate = false;
-
- /**
- * Prints dependency graph of packages
- */
- public static boolean printDepGraph = false;
-
- /**
- * start installmanager test
- */
- public static boolean doTest = false;
-
- /**
- * Use Snapshot file.
- */
- public static boolean snapshot = false;
-
- /**
- * Download specific package
- */
- public static boolean downloadPackage = false;
-
- /**
- * Do auto install or uninstall without GUI
- */
- public static boolean doInstallNoUI = false;
- public static boolean doRemoveNoUI = false;
- public static boolean doUpdateNoUI = false;
- public static boolean doShowDistListNoUI = false;
- public static boolean doShowPackageListNoUI = false;
- public static boolean doShowSDKInstallStatus = false;
- public static boolean doShowHelp = false;
-
- public static String repository = null;
- public static String imageFilePath = null;
- public static String snapshotPath = null;
- public static ServerType serverType = null;
- public static String distribution = null;
- public static String targetDir = null;
- public static String sdkDataPath = null;
-
- public static boolean isNetwork = true;
-
- public static List<String> packages = new ArrayList<String>();
- public static List<String> skipPackages = new ArrayList<String>();
-
- public static boolean isAgreeLicense = false;
-
- /**
- * Use only download for making SDK image.
- */
- public static String boundary = "public"; // all, public, partner
- public static String platForm = null;
- public static int platFormBit = 0;
-
- /**
- * See all snapshots
- */
- public static boolean allSnapshots = false;
-
- /**
- * Support Partner SDK
- */
- public static boolean partnerSdk = false;
- public static String purposeOfInstalling = "public";
-
- /**
- * Display InstallManager Version
- */
- public static boolean showVersion = false;
-
- /**
- * User-provided proxy server
- */
- public static String proxy = null;
-
- /**
- * Logging all system information
- */
- public static boolean propertyLogging = false;
-
- /**
- * Non-interactive(continuous installation).
- */
- public static boolean interactive = true;
- public static String suPass = "";
-
- public static String[] args;
-
- public static String executablePath = null;
-
- /**
- * SDK patch
- */
- public static boolean doSDKPatch = false;
- public static String SDKPatchPath = null;
-
- /**
- * Parses command line arguments and sets corresponding options.
- * @param args command line arguments
- */
- public static void loadCmdArgs(String[] args) {
- Options.args = args;
- Iterator<String> iter = Arrays.asList(args).iterator();
-
- while (iter.hasNext()) {
- String arg = iter.next();
-
- if (arg.equals("-noPackageValidation")) {
- doPackageValidation = false;
- } else if (arg.equals("-path")) {
- if (iter.hasNext()) {
- executablePath = iter.next();
- Log.log("executable path : " + executablePath);
- }
- } else if (arg.equals(OptionConstant.OPTION_TEST)) {
- doTest = true;
- } else if (arg.equals("-install")) {
- if (iter.hasNext()) {
- doInstallNoUI = true;
- workCliOptions(args);
- } else {
- Log.err("-install option must have some arguments.");
- System.out.println("-install option must have some arguements" +
- " such as specific meta packages");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
-
- if (!validateArgs()) {
- Log.err("repository : " + repository + ", distribution : "
- + distribution + ", packages : " + packages);
- System.out.println("-install option must have some arguements"
- + " you can see usage using '-help'");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- break;
- } else if (arg.equals("-remove")) {
- if (iter.hasNext()) {
- doRemoveNoUI = true;
- workCliOptions(args);
- } else {
- Log.err("-remove option must have some arguments.");
- System.out.println("-remove option must have some arguements" +
- " such as specific meta packages or 'all'");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- break;
- } else if (arg.equals("-download")) {
- if (iter.hasNext()) {
- downloadPackage = true;
- workCliOptions(args);
- } else {
- Log.err("-download option must have some arguments.");
- System.out.println("-install option must have some arguements" +
- " such as any packages");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- break;
- } else if (arg.equalsIgnoreCase("-patch")) {
- if (!canSDKPatch()) {
- Log.err("Cannot find installed SDK. The SDK must be installed before patching.");
- System.out.println("Cannot find installed SDK. The SDK must be installed before patching.");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- } else {
- if (iter.hasNext()) {
- doSDKPatch = true;
- workCliOptions(args);
- }
-
- if (SDKPatchPath == null) {
- Log.err("Cannot find SDK patch file path.");
- System.out.println("Cannot find SDK patch file path. Please check your '-f' options.");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- }
- break;
- } else if (arg.equalsIgnoreCase("-repoinfo")) {
- if (iter.hasNext()) {
- doShowDistListNoUI = true;
- serverType = ServerType.SNAPSHOT;
- workCliOptions(args);
- } else {
- Log.err("-info option must have some arguments.");
- System.out.println("-remove option must have some arguements" +
- " such as repository address.");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- break;
- } else if (arg.equalsIgnoreCase("-packageinfo")) {
- if (iter.hasNext()) {
- doShowPackageListNoUI = true;
- serverType = ServerType.SNAPSHOT;
- workCliOptions(args);
- } else {
- Log.err("-packages option must have some arguments.");
- System.out.println("-remove option must have some arguements" +
- " such as repository address and distribution.");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- break;
- } else if (arg.equalsIgnoreCase("-status")) {
- doShowSDKInstallStatus = true;
- break;
- } else if (arg.equalsIgnoreCase("-help")) {
- doShowHelp = true;
- break;
- } else if (arg.equals("-noRemovePackages")) {
- doRemovePackages = false;
- } else if (arg.equals("-skipUpdate")) {
- doUpdateInstallManager = false;
- } else if (arg.equals("-checkPackageUpdate")) {
- checkPackageUpdate = true;
- } else if (arg.equals("-printDepGraph")) {
- printDepGraph = true;
- } else if (arg.equals("-proxy")) {
- if(iter.hasNext()) {
- proxy = iter.next();
- Log.log("User-provided proxy: "+proxy);
- } else {
- Log.err("-proxy requires proxy description");
- throw new IMFatalException(ErrorCode.PROXY_NOT_PROVIDED);
- }
- } else if (arg.equals("-snapShot")) {
- if(iter.hasNext()) {
- snapshot = true;
- snapshotPath = iter.next();
- Log.log("User-provided snapshot path: " + snapshotPath);
- } else {
- Log.err("-snapShot requires repository description");
- throw new IMFatalException(ErrorCode.USESNAPSHOT_REPOSITORY_NOT_PROVIDED);
- }
- } else if (arg.equals("-allSnapshots")) {
- allSnapshots = true;
- Log.log("Using '-allSnapshots' option, all snapshots are displaying.");
- } else if (arg.equals("-onlyDownload")) {
- if(iter.hasNext()) {
- onlyDownload = true;
- boundary = iter.next();
- platForm = iter.next().toLowerCase();
- platFormBit = Integer.parseInt(iter.next());
- Log.log("Only download boundary : "+ boundary);
- } else {
- Log.err("-onlyDownload requires packageList description");
- throw new IMFatalException(ErrorCode.REPOSITORY_NOT_PROVIDED);
- }
- onlyDownload = true;
- } else if (arg.equals("-noResumeDownloading")) {
- doResumeDownloading = false;
- Log.log("Using '-noResumeDownloading' option, do not resume downloading");
- } else if (arg.equals("-noUseAutoProxy")) {
- useAutoProxy = false;
- Log.log("Using '-noUseAutoProxy' option, do not use system proxy.");
- } else if (arg.equals("-version")) {
- showVersion = true;
- Log.log("Using '-version' option, display InstallManager version on console.");
- } else if (arg.equals("-noRemoveTempTizenSDK")) {
- doRemoveTempTizenSDK = false;
- } else if (arg.equals("-repository")) {
- if(iter.hasNext()) {
- doReplaceRepository = true;
- repository = iter.next();
- Log.log("replace repository : "+repository);
- } else {
- Log.err("-replaceRepository requires repository description");
- throw new IMFatalException(ErrorCode.REPOSITORY_NOT_PROVIDED);
- }
- } else if (arg.equals(OptionConstant.OPTION_DISTRIBUTION)) {
- if(iter.hasNext()) {
- distribution = iter.next();
- Log.log("replace distribution : "+distribution);
- } else {
- Log.err("-distribution requires distribution description");
- throw new IMFatalException(OptionConstant.MSG_DISTRIBUTION_NOT_PROVIDED);
- }
- } else if (arg.equals("-removeOldSDK")) {
- doRemoveOldSDK = true;
- } else if (arg.equals("-property")) {
- propertyLogging = true;
- } else if (arg.equals("-skip")) {
- if (iter.hasNext()) {
- String skipPackageName = iter.next();
- skipPackages.add(skipPackageName);
- Log.log("Skip package => " + skipPackageName);
- } else {
- Log.err("-skip requires package name");
- throw new IMFatalException("-skip requires package name");
- }
- } else {
- Log.err("InstallManager do not support '" + arg + "' option");
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- }
-
- String option = "";
- for (int i = 0; i < args.length; i++) {
- option = option.concat(args[i] + " ");
- }
- Log.log("Option : " + option);
- }
-
- /**
- * Get options.
- * @return
- */
- public static String getArgsStr() {
- String argsStr = "";
- for(String arg : args) {
- argsStr = argsStr + " " + arg;
- }
- return argsStr;
- }
-
- private static boolean validateArgs() {
- if (isNetwork) {
- if (Options.repository != null && Options.distribution != null && !Options.packages.isEmpty()) {
- return true;
- } else {
- return false;
- }
- } else {
- if (Options.repository != null && !Options.packages.isEmpty()) {
- if (Platform.isWindows()) {
- if (Options.repository.startsWith("file")) {
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- } else if (Options.imageFilePath == null) {
- return false;
- } else {
- return true;
- }
- }
- }
-
- private static void workCliOptions(String[] args) {
- ArrayList<String> argArray = new ArrayList<String>();
-
- for (String t : args) {
- if (!t.equalsIgnoreCase("-install")
- && !t.equalsIgnoreCase("-remove")
- && !t.equalsIgnoreCase("-download")
- && !t.equalsIgnoreCase("-patch")) {
- argArray.add(t);
- }
- }
-
- Iterator<String> argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-path")) {
- argIter.remove();
- argIter.next();
- argIter.remove();
- }
- }
-
- // set repository
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-r")) {
- argIter.remove();
- repository = argIter.next();
- if (!repository.startsWith("http")) {
- isNetwork = false;
- serverType = ServerType.LOCAL;
- exclusiveOptions("-d", argArray);
- } else {
- serverType = ServerType.SNAPSHOT;
- isNetwork = true;
- }
- argIter.remove();
- }
- }
-
- // set SDK image path
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-f")) {
- if (doInstallNoUI) {
- argIter.remove();
- imageFilePath = argIter.next();
- isNetwork = false;
- serverType = ServerType.LOCAL;
- argIter.remove();
- exclusiveOptions("-d", argArray);
- } else if (doSDKPatch) {
- SDKPatchPath = argIter.next();
- argIter.remove();
- }
- }
- }
-
- // set target directory
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-l")) {
- argIter.remove();
- targetDir = argIter.next();
- argIter.remove();
- }
- }
-
- // set license agreement
- if (doInstallNoUI) {
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-accept_license")) {
- argIter.remove();
- isAgreeLicense = true;
- }
- }
- }
-
- // set sdk data directory
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-w")) {
- argIter.remove();
- sdkDataPath = argIter.next();
- argIter.remove();
- }
- }
-
- // set distribution
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-d")) {
- argIter.remove();
- distribution = argIter.next();
- argIter.remove();
- }
- }
-
- // set packages
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-p")) {
- argIter.remove();
- while (argIter.hasNext()) {
- String pkg = argIter.next();
- if (!pkg.startsWith("-")) {
- packages.add(pkg);
- argIter.remove();
- } else {
- break;
- }
- }
- }
- }
-
- // set skip packages
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-skip")) {
- argIter.remove();
- while (argIter.hasNext()) {
- String pkg = argIter.next();
- if (!pkg.startsWith("-")) {
- skipPackages.add(pkg);
- argIter.remove();
- } else {
- break;
- }
- }
- }
- }
-
- // set proxy
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-x")) {
- argIter.remove();
- Options.proxy = argIter.next();
- Log.log("Use proxy setting => " + Options.proxy);
- argIter.remove();
- }
- }
-
- // set test
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-test")) {
- argIter.remove();
- Options.doTest = true;
- Log.log("Set to test working performance.");
- }
- }
-
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-ni")) {
- argIter.remove();
- if (argIter.hasNext()) { // -ni option must have -passwd option.
- if (Platform.isLinux()) {
- argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase("-passwd")) {
- argIter.remove();
- if (argIter.hasNext()) {
- suPass = argIter.next();
- interactive = false;
- argIter.remove();
- } else { // -passwd option must have value.
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- }
- }
- if (suPass.equals("")) {
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- } else if (Platform.isWindows()) {
- interactive = true;
- } else if (Platform.isMacOS()) {
- interactive = true;
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- } else {
- throw new IMFatalException(ErrorCode.WRONG_OPTION);
- }
- }
- }
- }
-
- private static void exclusiveOptions(String option, ArrayList<String> argArray) {
- Iterator<String> argIter = argArray.iterator();
- while (argIter.hasNext()) {
- if (argIter.next().equalsIgnoreCase(option)) {
- Log.err("[" + option + "] cannot be used.");
- System.out.println("[" + option + "] cannot be used with some options.");
- throw new IMFatalException("[" + option + "] cannot be used with some options.");
- }
- }
- }
-
- private static boolean canSDKPatch() {
- if (Registry.isInstalled()) {
- return true;
- } else {
- return false;
- }
- }
-}
+/*\r
+* InstallManager\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact: \r
+* Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+* Shihyun Kim <shihyun.kim@samsung.com>\r
+* Taeyoung Son <taeyoung2.son@samsung.com>\r
+* Yongsung kim <yongsung1.kim@samsung.com>\r
+* \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/ \r
+\r
+package org.tizen.installmanager.core;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import org.tizen.installmanager.core.Config.ServerType;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+\r
+/**\r
+ * This class represents options from command line arguments.\r
+ * @author Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+ *\r
+ */\r
+public class Options {\r
+ /**\r
+ * Do sanity checks including file size and checksum \r
+ */\r
+ public static boolean doPackageValidation = true;\r
+ \r
+ /**\r
+ * Do download package file.\r
+ */\r
+ public static boolean onlyDownload = false;\r
+ \r
+ /**\r
+ * Do resume downloading.\r
+ */\r
+ public static boolean doResumeDownloading = true;\r
+ \r
+ /**\r
+ * Use system proxy\r
+ */\r
+ public static boolean useAutoProxy = true;\r
+ \r
+ /**\r
+ * Do remove temporary installmanager that exist in /tmp/tizensdk\r
+ */\r
+ public static boolean doRemoveTempTizenSDK = true;\r
+ \r
+ /**\r
+ * Conf file provided by user\r
+ */\r
+ public static String userConfPath = null;\r
+ \r
+ /**\r
+ * update installmanager.\r
+ * If <code>doUpdateInstallManager</code> is false, do not update installmanager binary.\r
+ */\r
+ public static boolean doUpdateInstallManager = true;\r
+ /**\r
+ * Do replace repository. \r
+ * If <code>doRepository</code> is true, change repository address to <code>repo</code> variable. \r
+ */\r
+ public static boolean doReplaceRepository = false;\r
+ \r
+ /**\r
+ * Do remove packages after installation\r
+ */\r
+ public static boolean doRemovePackages = true;\r
+ \r
+ /**\r
+ * Do remove old sdk.\r
+ * If installer cannot update sdk, <code>doRemoveOldSDK</code> is true.\r
+ */\r
+ public static boolean doRemoveOldSDK = false;\r
+ /**\r
+ * Just check installer is available for update.\r
+ */\r
+ public static boolean checkPackageUpdate = false;\r
+ \r
+ /**\r
+ * Prints dependency graph of packages\r
+ */\r
+ public static boolean printDepGraph = false;\r
+ \r
+ /**\r
+ * start installmanager test\r
+ */ \r
+ public static boolean doTest = false;\r
+ \r
+ /**\r
+ * Use Snapshot file.\r
+ */\r
+ public static boolean snapshot = false;\r
+ \r
+ /**\r
+ * Do auto install or uninstall without GUI\r
+ */\r
+ public static boolean doInstallNoUI = false;\r
+ public static boolean doRemoveNoUI = false;\r
+ public static boolean doUpdateNoUI = false;\r
+ public static boolean doShowDistListNoUI = false;\r
+ public static boolean doShowPackageListNoUI = false;\r
+ public static boolean doShowSDKInstallStatus = false;\r
+ public static boolean doShowHelp = false;\r
+ \r
+ public static String repository = null;\r
+ public static String imageFilePath = null;\r
+ public static String snapshotPath = null;\r
+ public static ServerType serverType = null;\r
+ public static String distribution = null;\r
+ public static String targetDir = null;\r
+ public static String sdkDataPath = null;\r
+ \r
+ public static boolean isNetwork = true;\r
+ \r
+ public static List<String> packages = new ArrayList<String>();\r
+ public static List<String> skipPackages = new ArrayList<String>();\r
+ \r
+ public static boolean isAgreeLicense = false;\r
+ \r
+ /**\r
+ * Use only download for making SDK image.\r
+ */\r
+ public static String boundary = "public"; // all, public, partner\r
+ public static String platForm = null;\r
+ public static int platFormBit = 0;\r
+ \r
+ /**\r
+ * See all snapshots\r
+ */\r
+ public static boolean allSnapshots = false;\r
+ \r
+ /**\r
+ * Support Partner SDK\r
+ */\r
+ public static boolean partnerSdk = false;\r
+ public static String purposeOfInstalling = "public";\r
+ \r
+ /**\r
+ * Display InstallManager Version\r
+ */\r
+ public static boolean showVersion = false;\r
+ \r
+ /**\r
+ * User-provided proxy server\r
+ */\r
+ public static String proxy = null;\r
+ \r
+ /**\r
+ * Logging all system information\r
+ */\r
+ public static boolean propertyLogging = false;\r
+ \r
+ /**\r
+ * Non-interactive(continuous installation).\r
+ */\r
+ public static boolean interactive = true;\r
+ public static String suPass = ""; \r
+ \r
+ public static String[] args;\r
+ \r
+ public static String executablePath = null;\r
+ \r
+ /**\r
+ * Parses command line arguments and sets corresponding options. \r
+ * @param args command line arguments\r
+ */\r
+ public static void loadCmdArgs(String[] args) {\r
+ Options.args = args;\r
+ Iterator<String> iter = Arrays.asList(args).iterator();\r
+ \r
+ while (iter.hasNext()) {\r
+ String arg = iter.next();\r
+ Log.log(arg+" option is specified");\r
+\r
+ if (arg.equals("-noPackageValidation")) {\r
+ doPackageValidation = false;\r
+ } else if (arg.equals("-path")) {\r
+ if (iter.hasNext()) {\r
+ executablePath = iter.next();\r
+ Log.log("executable path : " + executablePath);\r
+ }\r
+ } else if (arg.equals(OptionConstant.OPTION_TEST)) {\r
+ doTest = true;\r
+ } else if (arg.equals("-install")) {\r
+ if (iter.hasNext()) {\r
+ doInstallNoUI = true;\r
+ workCliOptions(args);\r
+ } else {\r
+ Log.err("-install option must have some arguments.");\r
+ System.out.println("-install option must have some arguements" +\r
+ " such as specific meta packages");\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+\r
+ if (!validateArgs()) {\r
+ Log.err("repository : " + repository + ", distribution : "\r
+ + distribution + ", packages : " + packages);\r
+ System.out.println("-install option must have some arguements"\r
+ + " you can see usage using '-help'");\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ break;\r
+ } else if (arg.equals("-remove")) {\r
+ if (iter.hasNext()) {\r
+ doRemoveNoUI = true;\r
+ workCliOptions(args);\r
+ } else {\r
+ Log.err("-remove option must have some arguments.");\r
+ System.out.println("-remove option must have some arguements" +\r
+ " such as specific meta packages or 'all'");\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ break;\r
+ } else if (arg.equalsIgnoreCase("-repoinfo")) {\r
+ if (iter.hasNext()) {\r
+ doShowDistListNoUI = true;\r
+ serverType = ServerType.SNAPSHOT;\r
+ workCliOptions(args);\r
+ } else {\r
+ Log.err("-info option must have some arguments.");\r
+ System.out.println("-remove option must have some arguements" +\r
+ " such as repository address.");\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ break;\r
+ } else if (arg.equalsIgnoreCase("-packageinfo")) {\r
+ if (iter.hasNext()) {\r
+ doShowPackageListNoUI = true;\r
+ serverType = ServerType.SNAPSHOT;\r
+ workCliOptions(args);\r
+ } else {\r
+ Log.err("-packages option must have some arguments.");\r
+ System.out.println("-remove option must have some arguements" +\r
+ " such as repository address and distribution.");\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ break;\r
+ } else if (arg.equalsIgnoreCase("-status")) {\r
+ doShowSDKInstallStatus = true;\r
+ break;\r
+ } else if (arg.equalsIgnoreCase("-help")) {\r
+ doShowHelp = true;\r
+ break;\r
+ } else if (arg.equals("-noRemovePackages")) {\r
+ doRemovePackages = false;\r
+ } else if (arg.equals("-skipUpdate")) {\r
+ doUpdateInstallManager = false;\r
+ } else if (arg.equals("-checkPackageUpdate")) {\r
+ checkPackageUpdate = true;\r
+ } else if (arg.equals("-printDepGraph")) {\r
+ printDepGraph = true;\r
+ } else if (arg.equals("-proxy")) {\r
+ if(iter.hasNext()) {\r
+ proxy = iter.next();\r
+ Log.log("User-provided proxy: "+proxy);\r
+ } else {\r
+ Log.err("-proxy requires proxy description");\r
+ throw new IMFatalException(ErrorCode.PROXY_NOT_PROVIDED);\r
+ }\r
+ } else if (arg.equals("-snapShot")) {\r
+ if(iter.hasNext()) {\r
+ snapshot = true;\r
+ snapshotPath = iter.next();\r
+ Log.log("User-provided repository: " + repository);\r
+ } else {\r
+ Log.err("-snapShot requires repository description");\r
+ throw new IMFatalException(ErrorCode.USESNAPSHOT_REPOSITORY_NOT_PROVIDED);\r
+ }\r
+ } else if (arg.equals("-allSnapshots")) {\r
+ allSnapshots = true;\r
+ Log.log("Using '-allSnapshots' option, all snapshots are displaying.");\r
+ } else if (arg.equals("-onlyDownload")) {\r
+ if(iter.hasNext()) {\r
+ onlyDownload = true;\r
+ boundary = iter.next();\r
+ platForm = iter.next().toLowerCase();\r
+ platFormBit = Integer.parseInt(iter.next());\r
+ Log.log("Only download boundary : "+ boundary);\r
+ } else {\r
+ Log.err("-onlyDownload requires packageList description");\r
+ throw new IMFatalException(ErrorCode.REPOSITORY_NOT_PROVIDED);\r
+ }\r
+ onlyDownload = true;\r
+ } else if (arg.equals("-noResumeDownloading")) {\r
+ doResumeDownloading = false;\r
+ Log.log("Using '-noResumeDownloading' option, do not resume downloading");\r
+ } else if (arg.equals("-noUseAutoProxy")) {\r
+ useAutoProxy = false;\r
+ Log.log("Using '-noUseAutoProxy' option, do not use system proxy.");\r
+ } else if (arg.equals("-version")) {\r
+ showVersion = true;\r
+ Log.log("Using '-version' option, display InstallManager version on console.");\r
+ } else if (arg.equals("-noRemoveTempTizenSDK")) {\r
+ doRemoveTempTizenSDK = false;\r
+ } else if (arg.equals("-repository")) {\r
+ if(iter.hasNext()) {\r
+ doReplaceRepository = true;\r
+ repository = iter.next();\r
+ Log.log("replace repository : "+repository);\r
+ } else {\r
+ Log.err("-replaceRepository requires repository description");\r
+ throw new IMFatalException(ErrorCode.REPOSITORY_NOT_PROVIDED);\r
+ }\r
+ } else if (arg.equals(OptionConstant.OPTION_DISTRIBUTION)) {\r
+ if(iter.hasNext()) {\r
+ distribution = iter.next();\r
+ Log.log("replace distribution : "+distribution);\r
+ } else {\r
+ Log.err("-distribution requires distribution description");\r
+ throw new IMFatalException(OptionConstant.MSG_DISTRIBUTION_NOT_PROVIDED);\r
+ }\r
+ } else if (arg.equals("-removeOldSDK")) {\r
+ doRemoveOldSDK = true;\r
+ } else if (arg.equals("-property")) {\r
+ propertyLogging = true;\r
+ } else if (arg.equals("-skip")) {\r
+ if (iter.hasNext()) {\r
+ String skipPackageName = iter.next(); \r
+ skipPackages.add(skipPackageName);\r
+ Log.log("Skip package => " + skipPackageName);\r
+ } else {\r
+ Log.err("-skip requires package name");\r
+ throw new IMFatalException("-skip requires package name");\r
+ }\r
+ } else {\r
+ Log.err("InstallManager do not support '" + arg + "' option");\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get options.\r
+ * @return\r
+ */\r
+ public static String getArgsStr() {\r
+ String argsStr = "";\r
+ for(String arg : args) {\r
+ argsStr = argsStr + " " + arg;\r
+ }\r
+ return argsStr;\r
+ }\r
+ \r
+ private static boolean validateArgs() {\r
+ if (isNetwork) {\r
+ if (Options.repository != null && Options.distribution != null && !Options.packages.isEmpty()) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ } else {\r
+ if (Options.repository != null && !Options.packages.isEmpty()) {\r
+ if (Platform.isWindows()) {\r
+ if (Options.repository.startsWith("file")) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ } else {\r
+ return true;\r
+ }\r
+ } else if (Options.imageFilePath == null) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ \r
+ private static void workCliOptions(String[] args) {\r
+ ArrayList<String> argArray = new ArrayList<String>();\r
+\r
+ for (String t : args) {\r
+ if (!t.equalsIgnoreCase("-install") && !t.equalsIgnoreCase("-remove")) {\r
+ argArray.add(t); \r
+ }\r
+ }\r
+ \r
+ Iterator<String> argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-path")) {\r
+ argIter.remove();\r
+ argIter.next();\r
+ argIter.remove();\r
+ }\r
+ }\r
+ \r
+ // set repository\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-r")) {\r
+ argIter.remove();\r
+ repository = argIter.next();\r
+ if (!repository.startsWith("http")) {\r
+ isNetwork = false;\r
+ serverType = ServerType.LOCAL;\r
+ exclusiveOptions("-d", argArray);\r
+ } else {\r
+ serverType = ServerType.SNAPSHOT;\r
+ isNetwork = true; \r
+ }\r
+ argIter.remove();\r
+ }\r
+ }\r
+ \r
+ // set SDK image path\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-f")) {\r
+ argIter.remove();\r
+ imageFilePath = argIter.next();\r
+ isNetwork = false;\r
+ serverType = ServerType.LOCAL;\r
+ argIter.remove();\r
+ exclusiveOptions("-d", argArray);\r
+ }\r
+ }\r
+ \r
+ // set target directory\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-l")) {\r
+ argIter.remove();\r
+ targetDir = argIter.next();\r
+ argIter.remove();\r
+ }\r
+ }\r
+ \r
+ // set license agreement\r
+ if (doInstallNoUI) {\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-accept_license")) {\r
+ argIter.remove();\r
+ isAgreeLicense = true;\r
+ }\r
+ } \r
+ }\r
+ \r
+ // set sdk data directory\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-w")) {\r
+ argIter.remove();\r
+ sdkDataPath = argIter.next();\r
+ argIter.remove();\r
+ }\r
+ }\r
+\r
+ // set distribution\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-d")) {\r
+ argIter.remove();\r
+ distribution = argIter.next();\r
+ argIter.remove();\r
+ }\r
+ }\r
+\r
+ // set packages\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-p")) {\r
+ argIter.remove();\r
+ while (argIter.hasNext()) {\r
+ String pkg = argIter.next();\r
+ if (!pkg.startsWith("-")) {\r
+ packages.add(pkg);\r
+ argIter.remove();\r
+ } else {\r
+ break; \r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ // set skip packages\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-skip")) {\r
+ argIter.remove();\r
+ while (argIter.hasNext()) {\r
+ String pkg = argIter.next();\r
+ if (!pkg.startsWith("-")) {\r
+ skipPackages.add(pkg);\r
+ argIter.remove();\r
+ } else {\r
+ break; \r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ // set proxy\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-x")) {\r
+ argIter.remove();\r
+ Options.proxy = argIter.next();\r
+ Log.log("Use proxy setting => " + Options.proxy);\r
+ argIter.remove();\r
+ }\r
+ }\r
+ \r
+ // set test\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-test")) {\r
+ argIter.remove();\r
+ Options.doTest = true;\r
+ Log.log("Set to test working performance.");\r
+ }\r
+ }\r
+ \r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-ni")) {\r
+ argIter.remove();\r
+ if (argIter.hasNext()) { // -ni option must have -passwd option.\r
+ if (Platform.isLinux()) {\r
+ argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase("-passwd")) {\r
+ argIter.remove();\r
+ if (argIter.hasNext()) {\r
+ suPass = argIter.next();\r
+ interactive = false;\r
+ argIter.remove();\r
+ } else { // -passwd option must have value.\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ }\r
+ }\r
+ if (suPass == "") {\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ } else if (Platform.isWindows()) {\r
+ interactive = true;\r
+ } else if (Platform.isMacOS()) {\r
+ interactive = true;\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);\r
+ }\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.WRONG_OPTION);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ private static void exclusiveOptions(String option, ArrayList<String> argArray) {\r
+ Iterator<String> argIter = argArray.iterator();\r
+ while (argIter.hasNext()) {\r
+ if (argIter.next().equalsIgnoreCase(option)) {\r
+ Log.err("[" + option + "] cannot be used.");\r
+ System.out.println("[" + option + "] cannot be used with some options.");\r
+ throw new IMFatalException("[" + option + "] cannot be used with some options.");\r
+ }\r
+ }\r
+ }\r
+}\r
-package org.tizen.installmanager.core;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.tizen.installmanager.lib.ErrorController;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.util.PathUtil;
-
-public class Performance {
- public static final String INSTALL_TEST_FILE_NAME = "installtime";
- public static final String REMOVE_TEST_FILE_NAME = "removetime";
-
- //total time
- private static Date imStartTime = null;
- private static Date imEndTime = null;
-
- //initialize time
- private static Date initializeStartTime = null;
- private static Date initializeEndTime = null;
-
- //download time
- private static Date downloadStartTime = null;
- private static Date downloadEndTime = null;
-
-
- //installation time
- private static Date installationStartTime = null;
- private static Date installationEndTime = null;
-
- //removal time
- private static Date removalStartTime = null;
- private static Date removalEndTime = null;
-
- //information
- public static long sdkPackageSize = 0;
-
-
- public static void setIMStartTime() {
- imStartTime = new Date();
- }
-
- public static void setIMEndTime() {
- imEndTime = new Date();
- }
-
- public static void setInitializeStartTime() {
- initializeStartTime = new Date();
- }
-
- public static void setInitializeEndTime() {
- initializeEndTime = new Date();
- }
-
- public static void setDownloadStartTime() {
- downloadStartTime = new Date();
- }
-
- public static void setDownloadEndTime() {
- downloadEndTime = new Date();
- }
-
- public static void setInstallationStartTime() {
- installationStartTime = new Date();
- }
-
- public static Date getInstallationStartTime() {
- return installationStartTime;
- }
-
- public static void setInstallationEndTime() {
- installationEndTime = new Date();
- }
-
- public static void setRemovalStartTime() {
- removalStartTime = new Date();
- }
-
- public static void setRemovalEndTime() {
- removalEndTime = new Date();
- }
-
- public static void printToLogFile() {
- Log.log("The installmanager start time : " + imStartTime);
- Log.log("The installmanager end time : " + imEndTime);
- Log.log("The installation start time : " + installationStartTime);
- Log.log("The installation end time : " + installationEndTime);
-
- long progressSecond = getInstallationTime()/1000;
-
- if (progressSecond >= 0) {
- Log.log("The progress time of the installation : About " + progressSecond/60 + " minutes"
- +"(" + progressSecond + " seconds)");
- } else {
- Log.log("The progress time of the installation : Installation fail");
- }
- }
-
- public static void printTestResult() {
- //get file name of test result
- SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
- String testFileName = formatter.format(imStartTime) + "_result" + ".txt";
-
- String testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath()
- , "result", testFileName);
- File testResultFile = new File(testResultFilePath);
-
- if (!testResultFile.getParentFile().exists()) {
- testResultFile.getParentFile().mkdirs();
- }
-
- BufferedWriter out = null;
- try {
- out = new BufferedWriter(new FileWriter(testResultFile));
-
- out.write("*** InstallManager performance test ***");
- out.newLine();
- out.write("Sdk package size\t: " + sdkPackageSize);
- out.newLine();
- out.write("The initialization time\t: " + getInitializeTime() + "sec");
- out.write("(" + getBitPerSecond(sdkPackageSize, getInitializeTime())+ "b/s)");
- out.newLine();
- out.write("The download time\t: " + getDownloadTime() + "sec");
- out.write("(" + getBitPerSecond(sdkPackageSize, getDownloadTime())+ "b/s)");
- out.newLine();
- out.write("The installation time\t: " + getInstallationTime() + "sec");
- out.write("(" + getBitPerSecond(sdkPackageSize, getInstallationTime())+ "b/s)");
- out.newLine();
- out.write("The removal time\t: " + getRemovalTime() + "sec");
- out.write("(" + getBitPerSecond(sdkPackageSize, getRemovalTime())+ "b/s)");
- out.newLine();
- out.write("The install-manager start time\t: " + imStartTime);
- out.newLine();
- out.write("The install-manager end time\t: " + imEndTime);
- out.newLine();
- out.newLine();
-
- long progressSecond = getTotalTime();
-
- if (progressSecond >= 0) {
- out.write("* Total time to install : About " + progressSecond/60 + " minutes"
- +"(" + progressSecond + " seconds)");
- out.newLine();
- } else {
- out.write("* Total time to install : Installation fail");
- out.newLine();
- }
-
- } catch (IOException e) {
- Log.ExceptionLog(e);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
- }
- }
-
- public static void printTestResultXmlFormat() {
- //get file name of test result
- SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
- String testFileName = formatter.format(imStartTime) + ".xml";
-
- String testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);
- File testResultFile = new File(testResultFilePath);
-
- if (!testResultFile.getParentFile().exists()) {
- testResultFile.getParentFile().mkdirs();
- }
-
- BufferedWriter out = null;
- try {
- out = new BufferedWriter(new FileWriter(testResultFile));
- out.write(getTestSuiteXml("InstallManager performance test", 4, getTotalTime()));
- out.newLine();
- out.write(getTestCaseXml("InitTest", "The initialization time", getInitializeTime()));
- out.newLine();
- out.write(getTestCaseXml("DownloadTest", "The download time", getDownloadTime()));
- out.newLine();
- out.write(getTestCaseXml("InstallTest", "The installation time", getInstallationTime()));
- out.newLine();
- out.write(getTestCaseXml("RemoveTest", "The removal time", getRemovalTime()));
- out.newLine();
- out.write("</testsuite>");
- } catch (IOException e) {
- Log.ExceptionLog(e);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
- }
- }
-
- public static void printTestResultXmlFormat2() {
- if (installationStartTime != null) {
- printInstallTestResultXmlFormat(isForAutomation);
- } else {
- printRemoveTestResultXmlFormat(isForAutomation);
- }
- }
-
- public static void printInstallTestResultXmlFormat(boolean isForAutomation) {
- //get file name of test result
- SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
- String testFileName = INSTALL_TEST_FILE_NAME + "_" + formatter.format(imStartTime) + ".xml";
-
- String testResultFilePath = "";
- if (isForAutomation) {
- testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath()
- , "result", testFileName);
- } else {
- testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);
- }
-
- File testResultFile = new File(testResultFilePath);
-
- if (!testResultFile.getParentFile().exists()) {
- testResultFile.getParentFile().mkdirs();
- }
-
- BufferedWriter out = null;
- try {
- out = new BufferedWriter(new FileWriter(testResultFile));
- out.write(getTestSuiteXml("InstallManager performance test", 3, getTotalTime()));
- out.newLine();
- out.write(getTestCaseXml("InitTest", "The initialization time", getInitializeTime()));
- out.newLine();
- out.write(getTestCaseXml("DownloadTest", "The download time", getDownloadTime()));
- out.newLine();
- out.write(getTestCaseXml("DownloadRetry", "Download retry count", ErrorController.getNetworkRetryCount()));
- out.newLine();
- out.write(getTestCaseXml("InstallTest", "The installation time", getInstallationTime()));
- out.newLine();
- out.write(getTestCaseXml("TotalInstallationTest", "Total installation time", getTotalInstallationTime()));
- out.write("</testsuite>");
- } catch (IOException e) {
- Log.ExceptionLog(e);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
- }
- }
-
- public static void printRemoveTestResultXmlFormat(boolean isForAutomation) {
- //get file name of test result
- SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
- String testFileName = REMOVE_TEST_FILE_NAME + "_" + formatter.format(imStartTime) + ".xml";
-
- String testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);
- if (isForAutomation) {
- testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath()
- , "result", testFileName);
- } else {
- testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);
- }
-
- File testResultFile = new File(testResultFilePath);
-
- if (!testResultFile.getParentFile().exists()) {
- testResultFile.getParentFile().mkdirs();
- }
-
- BufferedWriter out = null;
- try {
- out = new BufferedWriter(new FileWriter(testResultFile));
- out.write(getTestSuiteXml("InstallManager performance test", 1, getTotalTime()));
- out.newLine();
- out.write(getTestCaseXml("RemoveTest", "The removal time", getRemovalTime()));
- out.newLine();
- out.write("</testsuite>");
- } catch (IOException e) {
- Log.ExceptionLog(e);
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
- }
- }
-
- private static String getTestSuiteXml(String testName, int testNum, long time) {
- return "<testsuite errors=\"\" failures=\"\" name=\"" + testName + "\" skips=\"\" tests=\"" + testNum +"\" time=\""+ time +"\">";
- }
-
- private static String getTestCaseXml(String testClass, String testName, long time) {
- return "<testcase classname=\"" + testClass + "\" name=\"" + testName + "\" time=\"" + time +"\"/>";
- }
-
- private static long getInitializeTime() {
- if (initializeStartTime == null || initializeEndTime == null) {
- return 0;
- }
-
- long interval = (initializeEndTime.getTime() - initializeStartTime.getTime())/1000;
- return interval;
- }
-
- private static long getDownloadTime() {
- if (downloadStartTime == null || downloadEndTime == null) {
- return 0;
- }
-
- long interval = (downloadEndTime.getTime() - downloadStartTime.getTime())/1000;
- return interval;
- }
-
- private static long getTotalTime() {
- if (imStartTime == null || imEndTime == null) {
- return 0;
- }
-
- long interval = (imEndTime.getTime() - imStartTime.getTime())/1000;
- return interval;
- }
-
- private static long getInstallationTime() {
- if (installationStartTime == null || installationEndTime == null) {
- return 0;
- }
-
- long interval = (installationEndTime.getTime() - installationStartTime.getTime())/1000;
- return interval;
- }
-
- private static long getTotalInstallationTime() {
- if (downloadStartTime == null || installationEndTime == null) {
- return 0;
- }
-
- long interval = (installationEndTime.getTime() - downloadStartTime.getTime())/1000;
- return interval;
- }
-
- private static long getRemovalTime() {
- if (removalStartTime == null || removalEndTime == null) {
- return 0;
- }
-
- long interval = (removalEndTime.getTime() - removalStartTime.getTime())/1000;
- return interval;
- }
-
- private static long getKBPerSecond(long size, long seconds) {
- if (seconds == 0) {
- return 0;
- } else {
- return (size/1024/seconds);
- }
- }
-}
+package org.tizen.installmanager.core;\r
+\r
+import java.io.BufferedWriter;\r
+import java.io.File;\r
+import java.io.FileWriter;\r
+import java.io.IOException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Date;\r
+\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.util.PathUtil;\r
+\r
+public class Performance {\r
+ public static final String INSTALL_TEST_FILE_NAME = "installtime";\r
+ public static final String REMOVE_TEST_FILE_NAME = "removetime";\r
+ \r
+ //total time\r
+ private static Date imStartTime = null;\r
+ private static Date imEndTime = null;\r
+ \r
+ //initialize time\r
+ private static Date initializeStartTime = null;\r
+ private static Date initializeEndTime = null;\r
+ \r
+ //download time\r
+ private static Date downloadStartTime = null;\r
+ private static Date downloadEndTime = null;\r
+ \r
+ \r
+ //installation time\r
+ private static Date installationStartTime = null;\r
+ private static Date installationEndTime = null;\r
+ \r
+ //removal time\r
+ private static Date removalStartTime = null;\r
+ private static Date removalEndTime = null;\r
+ \r
+ //information\r
+ public static long sdkPackageSize = 0; \r
+ \r
+ \r
+ public static void setIMStartTime() {\r
+ imStartTime = new Date();\r
+ }\r
+ \r
+ public static void setIMEndTime() {\r
+ imEndTime = new Date();\r
+ }\r
+ \r
+ public static void setInitializeStartTime() {\r
+ initializeStartTime = new Date();\r
+ }\r
+ \r
+ public static void setInitializeEndTime() {\r
+ initializeEndTime = new Date();\r
+ }\r
+ \r
+ public static void setDownloadStartTime() {\r
+ downloadStartTime = new Date();\r
+ }\r
+ \r
+ public static Date getDownloadStartTime() {\r
+ return downloadStartTime;\r
+ }\r
+ \r
+ public static void setDownloadEndTime() {\r
+ downloadEndTime = new Date();\r
+ }\r
+ \r
+ public static void setInstallationStartTime() {\r
+ installationStartTime = new Date();\r
+ }\r
+ \r
+ public static Date getInstallationStartTime() {\r
+ return installationStartTime;\r
+ }\r
+ \r
+ public static void setInstallationEndTime() {\r
+ installationEndTime = new Date();\r
+ }\r
+ \r
+ public static void setRemovalStartTime() {\r
+ removalStartTime = new Date();\r
+ }\r
+ \r
+ public static void setRemovalEndTime() {\r
+ removalEndTime = new Date();\r
+ }\r
+ \r
+ public static void printToLogFile() {\r
+ Log.log("The installmanager start time : " + imStartTime);\r
+ Log.log("The installmanager end time : " + imEndTime);\r
+ Log.log("The installation start time : " + installationStartTime);\r
+ Log.log("The installation end time : " + installationEndTime);\r
+ \r
+ long progressSecond = getInstallationTime()/1000;\r
+ \r
+ if (progressSecond >= 0) {\r
+ Log.log("The progress time of the installation : About " + progressSecond/60 + " minutes"\r
+ +"(" + progressSecond + " seconds)");\r
+ } else {\r
+ Log.log("The progress time of the installation : Installation fail");\r
+ }\r
+ }\r
+ \r
+ public static void printTestResult() {\r
+ //get file name of test result\r
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");\r
+ String testFileName = formatter.format(imStartTime) + ".txt";\r
+ \r
+ String testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);\r
+ File testResultFile = new File(testResultFilePath);\r
+ \r
+ if (!testResultFile.getParentFile().exists()) {\r
+ testResultFile.getParentFile().mkdirs();\r
+ }\r
+ \r
+ BufferedWriter out = null;\r
+ try {\r
+ out = new BufferedWriter(new FileWriter(testResultFile));\r
+ \r
+ out.write("*** InstallManager performance test ***");\r
+ out.newLine();\r
+ out.write("Sdk package size\t: " + sdkPackageSize);\r
+ out.newLine();\r
+ out.write("The initialization time\t: " + getInitializeTime() + "sec");\r
+ out.write("(" + getKBPerSecond(sdkPackageSize, getInitializeTime())+ "kb/s)");\r
+ out.newLine();\r
+ out.write("The download time\t: " + getDownloadTime() + "sec");\r
+ out.write("(" + getKBPerSecond(sdkPackageSize, getDownloadTime())+ "kb/s)");\r
+ out.newLine();\r
+ out.write("The installation time\t: " + getInstallationTime() + "sec");\r
+ out.write("(" + getKBPerSecond(sdkPackageSize, getInstallationTime())+ "kb/s)");\r
+ out.newLine();\r
+ out.write("The total installation time\t: " + getTotalInstallationTime() + "sec");\r
+ out.write("(" + getKBPerSecond(sdkPackageSize, getTotalInstallationTime())+ "kb/s)");\r
+ out.newLine();\r
+ out.write("The removal time\t: " + getRemovalTime() + "sec");\r
+ out.write("(" + getKBPerSecond(sdkPackageSize, getRemovalTime())+ "b/s)");\r
+ out.newLine();\r
+ out.write("The install-manager start time\t: " + imStartTime);\r
+ out.newLine();\r
+ out.write("The install-manager end time\t: " + imEndTime);\r
+ out.newLine();\r
+ out.newLine();\r
+ \r
+ long progressSecond = getTotalTime();\r
+ \r
+ if (progressSecond >= 0) {\r
+ out.write("* Total time to install : About " + progressSecond/60 + " minutes"\r
+ +"(" + progressSecond + " seconds)");\r
+ out.newLine();\r
+ } else {\r
+ out.write("* Total time to install : Installation fail");\r
+ out.newLine();\r
+ }\r
+ \r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ } finally {\r
+ if (out != null) {\r
+ try {\r
+ out.close();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public static void printTestResultXmlFormat() {\r
+ if (installationStartTime != null) {\r
+ printInstallTestResultXmlFormat();\r
+ } else {\r
+ printRemoveTestResultXmlFormat();\r
+ }\r
+ }\r
+ \r
+ public static void printInstallTestResultXmlFormat() {\r
+ //get file name of test result\r
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");\r
+ String testFileName = INSTALL_TEST_FILE_NAME + "_" + formatter.format(imStartTime) + ".xml";\r
+ \r
+ String testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);\r
+ File testResultFile = new File(testResultFilePath);\r
+ \r
+ if (!testResultFile.getParentFile().exists()) {\r
+ testResultFile.getParentFile().mkdirs();\r
+ }\r
+ \r
+ BufferedWriter out = null;\r
+ try {\r
+ out = new BufferedWriter(new FileWriter(testResultFile));\r
+ out.write(getTestSuiteXml("InstallManager performance test", 3, getTotalTime()));\r
+ out.newLine();\r
+ out.write(getTestCaseXml("InitTest", "The initialization time", getInitializeTime()));\r
+ out.newLine();\r
+ out.write(getTestCaseXml("DownloadTest", "The download time", getDownloadTime()));\r
+ out.newLine();\r
+ out.write(getTestCaseXml("InstallTest", "The installation time", getInstallationTime()));\r
+ out.newLine();\r
+ out.write(getTestCaseXml("TotalInstallationTest", "Total installation time", getTotalInstallationTime()));\r
+ out.write("</testsuite>");\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ } finally {\r
+ if (out != null) {\r
+ try {\r
+ out.close();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public static void printRemoveTestResultXmlFormat() {\r
+ //get file name of test result\r
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");\r
+ String testFileName = REMOVE_TEST_FILE_NAME + "_" + formatter.format(imStartTime) + ".xml";\r
+ \r
+ String testResultFilePath = PathUtil.get(InstallManagerConstants.getInstallManagerTestResultPath(), testFileName);\r
+ File testResultFile = new File(testResultFilePath);\r
+ \r
+ if (!testResultFile.getParentFile().exists()) {\r
+ testResultFile.getParentFile().mkdirs();\r
+ }\r
+ \r
+ BufferedWriter out = null;\r
+ try {\r
+ out = new BufferedWriter(new FileWriter(testResultFile));\r
+ out.write(getTestSuiteXml("InstallManager performance test", 1, getTotalTime()));\r
+ out.newLine();\r
+ out.write(getTestCaseXml("RemoveTest", "The removal time", getRemovalTime()));\r
+ out.newLine();\r
+ out.write("</testsuite>");\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ } finally {\r
+ if (out != null) {\r
+ try {\r
+ out.close();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ private static String getTestSuiteXml(String testName, int testNum, long time) {\r
+ return "<testsuite errors=\"\" failures=\"\" name=\"" + testName + "\" skips=\"\" tests=\"" + testNum +"\" time=\""+ time +"\">";\r
+ }\r
+ \r
+ private static String getTestCaseXml(String testClass, String testName, long time) {\r
+ return "<testcase classname=\"" + testClass + "\" name=\"" + testName + "\" time=\"" + time +"\"/>";\r
+ }\r
+ \r
+ private static long getInitializeTime() {\r
+ if (initializeStartTime == null || initializeEndTime == null) {\r
+ return 0;\r
+ }\r
+ \r
+ long interval = (initializeEndTime.getTime() - initializeStartTime.getTime())/1000;\r
+ return interval;\r
+ }\r
+ \r
+ private static long getDownloadTime() {\r
+ if (downloadStartTime == null || downloadEndTime == null) {\r
+ return 0;\r
+ }\r
+ \r
+ long interval = (downloadEndTime.getTime() - downloadStartTime.getTime())/1000;\r
+ return interval;\r
+ }\r
+ \r
+ private static long getTotalTime() {\r
+ if (imStartTime == null || imEndTime == null) {\r
+ return 0;\r
+ }\r
+ \r
+ long interval = (imEndTime.getTime() - imStartTime.getTime())/1000;\r
+ return interval;\r
+ }\r
+ \r
+ private static long getInstallationTime() {\r
+ if (installationStartTime == null || installationEndTime == null) {\r
+ return 0;\r
+ }\r
+ \r
+ long interval = (installationEndTime.getTime() - installationStartTime.getTime())/1000;\r
+ return interval;\r
+ }\r
+ \r
+ private static long getTotalInstallationTime() {\r
+ if (downloadStartTime == null || installationEndTime == null) {\r
+ return 0;\r
+ }\r
+ \r
+ long interval = (installationEndTime.getTime() - downloadStartTime.getTime())/1000;\r
+ return interval;\r
+ }\r
+ \r
+ private static long getRemovalTime() {\r
+ if (removalStartTime == null || removalEndTime == null) {\r
+ return 0;\r
+ }\r
+ \r
+ long interval = (removalEndTime.getTime() - removalStartTime.getTime())/1000;\r
+ return interval;\r
+ }\r
+ \r
+ private static long getKBPerSecond(long size, long seconds) {\r
+ if (seconds == 0) {\r
+ return 0;\r
+ } else {\r
+ return (size/1024/seconds);\r
+ }\r
+ }\r
+}\r
-/*
- * InstallManager
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact:
- * Wooyoung Cho <wooyoung1.cho@samsung.com>
- * Shihyun Kim <shihyun.kim@samsung.com>
- * Taeyoung Son <taeyoung2.son@samsung.com>
- * Yongsung kim <yongsung1.kim@samsung.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Contributors:
- * - S-Core Co., Ltd
- *
- */
-
-package org.tizen.installmanager.lib;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.RandomAccessFile;
-import java.net.Authenticator;
-import java.net.ConnectException;
-import java.net.HttpURLConnection;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.MalformedURLException;
-import java.net.NoRouteToHostException;
-import java.net.Proxy;
-import java.net.SocketAddress;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.UnknownHostException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import javax.net.ssl.SSLHandshakeException;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.tizen.installmanager.core.Config;
-import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.InstallManager;
-import org.tizen.installmanager.core.Options;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.NetworkProxy.ProxyType;
-import org.tizen.installmanager.lib.exception.IMNetworkConnectException;
-import org.tizen.installmanager.lib.exception.IMNetworkDownloadException;
-import org.tizen.installmanager.ui.dialog.LoginDlg;
-import org.tizen.installmanager.util.PathUtil;
-import org.tizen.installmanager.util.ResourceHandler;
-
-/**
- * Manages downloading from url.
- *
- * @author Shihyun Kim <shihyun.kim@samsung.com>
- *
- */
-public class Downloader {
- private static final String PROTOCOL_SEPARATOR = "://";
- private static final String USER_PASSWORD_SEPARATOR = ":";
- private static final String ID_SEPARATOR = "@";
-
- private static final int BUF_SIZE = 65536;
-
- public static final long ERROR = -1;
-
- private MessageDigest mDigest;
- private URLConnection mConnection = null;
- private static final int CONNECT_TIMEOUT = 15000; // connection timeout: 10 sec
- private static final int READ_TIMEOUT = 20000; // read timeout: 20 sec
- private static final int CONNECT_TIMEOUT_TEST = 30000; // connection timeout: 10 sec
- private static final int READ_TIMEOUT_TEST = 60000; // read timeout: 20 sec
- private static final int CONNECT_THREAD_JOIN_TIMEOUT = 11000; // // connection
- // thread timeout: 11
- // sec
- private static final int CONNECT_RETRY = 3;
- private static final int FIRST_TRY = 0;
-
- private String mUser = "";
- private String mPassword = "";
-
- private int responseCode = -1;
- private String responseMessage = "";
- private long fileSize = 0;
- long rangeSize = 0;
-
- //Http response code
- public static final int HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
-
-
- // proxy authentication
- private static String proxyUser = "";
- private static String proxyPassword = "";
-
- public Downloader() {
- try {
- mDigest = MessageDigest.getInstance("SHA-256");
- } catch (NoSuchAlgorithmException e) {
- Log.err("Downloader No algorithm for SHA-256");
- throw new IMFatalException("No algorithm for SHA-256");
- }
- }
-
- /**
- * Downloads the url to the local path
- *
- * @param sUrl
- * url to download
- * @param localPath
- * local path to save the file from the url
- * @param monitor
- * @return download size in bytes if success. -1 if fail.
- */
- public long download(URL sUrl, String localPath, IIMProgressMonitor monitor)
- throws IMNetworkConnectException, IMNetworkDownloadException{
- Log.log("Downloading: " + sUrl + " -> " + localPath);
-
- if (localPath == null || localPath.equals("")) {
- return ERROR;
- }
-
- if ((sUrl == null || sUrl.toExternalForm().equals(""))) {
- return ERROR;
- }
-
- File localFile = new File(localPath);
- setRangeSize(localFile);
-
- if (!connect(sUrl) || mConnection == null) {
- Log.err("Network connection error.\n" + sUrl);
-
- if (ErrorController.getErrorCode() == ErrorCode.HTTP_ERROR_MESSAGE_416) {
- Log.err("Requested range not satisfiable.");
- PathUtil.remove(localPath);
- }
-
- return ERROR;
- }
-
- long downloadSize = downloadFile(localPath, monitor);
-
- return downloadSize;
- }
-
- private void setRangeSize(File localFile) {
- //set range size.
- if (localFile.exists()) {
- rangeSize = localFile.length();
- } else {
- rangeSize = 0;
- }
- }
-
- private long downloadFile(String localPath, IIMProgressMonitor monitor) throws IMNetworkDownloadException{
- Log.log("File download start => " + localPath);
-
- File destFile = new File(localPath);
- if (!destFile.isAbsolute()) {
- return ERROR;
- }
-
- File parentDir = destFile.getParentFile();
- if (!parentDir.exists()) {
- if (!parentDir.mkdirs()) {
- Log.err("Fail to create directory ==> " + parentDir);
- }
- }
-
- RandomAccessFile output = null;
- if (isDownloadFileExist(destFile)){
- return destFile.length();
- } else {
- output = getOutputFile(destFile);
- }
-
- InputStream input = getFileInputStream();
- if (input == null) {
- return ERROR;
- }
-
- byte[] buf = new byte[BUF_SIZE];
- long totalWriteSize = rangeSize;
- long writeSizePerSecond = 0;
- long totalFileSize = getDownloadFileSize() +rangeSize;
-
- long beginMS = System.currentTimeMillis();
-
- makeDigest(localPath);
-
- try {
-
- if (monitor != null) {
- monitor.workedDownloadSize(rangeSize);
- }
-
- while (totalWriteSize < totalFileSize) {
- if (input.available() > 0) {
- int inputReadSize = input.read(buf);
-
- output.write(buf, 0, inputReadSize);
-
- totalWriteSize += inputReadSize;
- writeSizePerSecond += inputReadSize;
-
- if (mDigest != null) {
- mDigest.update(buf, 0, inputReadSize);
- }
-
- long endMS = System.currentTimeMillis();
- if (endMS > (beginMS + 100)) {
- if (monitor != null) {
- if (monitor.isCanceled()) {
- ErrorController.setError(ErrorCode.CANCEL);
- return ERROR;
- }
- monitor.workedDownloadSize(writeSizePerSecond);
- }
-
- writeSizePerSecond = 0;
- beginMS = endMS;
- }
- }
-
- long endMS = System.currentTimeMillis();
- long timeOutOffset = 0;
-
- if (Options.doTest) {
- timeOutOffset = READ_TIMEOUT_TEST;
- } else {
- timeOutOffset = READ_TIMEOUT;
- }
-
- if (endMS > (beginMS + timeOutOffset)) {
- Log.err("Can not be read during 20 seconds(test case : 60 seconds).");
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
-
- throw new IMNetworkDownloadException(ErrorCode.INTERNET_CONNECTION_ERROR);
- } else {
- // normal operation. to do nothing.
- }
- }
-
- if (writeSizePerSecond > 0 && monitor != null) {
- monitor.workedDownloadSize(writeSizePerSecond);
- }
- } catch (SocketTimeoutException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT);
- throw new IMNetworkDownloadException(ErrorCode.SERVER_CONNECTION_TIME_OUT);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.UNKNOWN_ERROR);
- throw new IMNetworkDownloadException(ErrorCode.UNKOWN_ERROR);
- } finally {
- try {
- if (input != null) {
- input.close();
- }
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
-
- try {
- if (output != null) {
- output.close();
- }
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
-
- if (totalWriteSize != this.fileSize) {
- Log.err("File size error occurs during the download");
- Log.err("Expected file size => " + fileSize);
- Log.err("Downloaded file size => " + totalWriteSize);
-
- throw new IMNetworkDownloadException(ErrorCode.NETWORK_DOWNLOADED_FILE_INCORRECTLY);
- }
-
- Log.log("Downloaded size: " + totalWriteSize);
- return totalWriteSize;
- }
-
- private InputStream getFileInputStream() {
- try {
- return mConnection.getInputStream();
- } catch (FileNotFoundException e) {
- Log.ExceptionLog(e);
- String url = mConnection.getURL().toString();
- int index = url.lastIndexOf("/");
- String errUrl = url.substring(0, index);
- String errorMsg = ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY
- .getErrorMessage() + "\n(URL = " + errUrl + ")";
- ErrorController.setErrorMessage(errorMsg);
- return null;
- } catch (SocketTimeoutException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT);
- return null;
- } catch (NoRouteToHostException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.NO_ROUTE_TO_HOST);
- Log.err(ErrorController.getErrorMessage());
- return null;
- } catch (SocketException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
- Log.err(ErrorController.getErrorMessage());
- return null;
- } catch (IOException e) {
- Log.ExceptionLog(e);
- if (e.getClass().toString().indexOf("FtpLoginException") >= 0) {
- ErrorController.setError(ErrorCode.NOT_LOGGED_IN);
- Log.err(ErrorController.getErrorMessage());
- return null;
- }
-
- ErrorController.setError(ErrorCode.CANNOT_DOWNLOAD_FILE);
- Log.err(ErrorController.getErrorMessage());
- return null;
- } catch (Throwable e) {
- Log.ExceptionLog(e);
- ErrorController.setErrorMessage(e.getMessage());
- return null;
- }
- }
-
- /**
- * file output.
- * @param outputFilePath
- * @return
- */
- private RandomAccessFile getOutputFile(File outputFile) {
- //Create new file to download or resume downloading.
- if (!outputFile.exists()) {
- try {
- outputFile.createNewFile();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.CANNOT_CREATE_DOWNLOAD_FILE);
- return null;
- }
- }
-
- RandomAccessFile raFile = null;
- try {
- raFile = new RandomAccessFile(outputFile, "rw");
- } catch (FileNotFoundException e) {
- Log.ExceptionLog(e);
- ErrorController.setErrorMessage(e.getMessage());
- return null;
- }
-
- try {
- if (rangeSize > 0) {
- raFile.seek(rangeSize);
- }
- } catch (IOException e) {
- ErrorController.setErrorMessage(e.getMessage());
- Log.ExceptionLog(e);
- ResourceHandler.closeObjectSilently(raFile);
- }
-
- return raFile;
- }
-
- private void makeDigest(String filePath) {
- if (mDigest != null) {
- mDigest.reset();
- } else {
- try {
- mDigest = MessageDigest.getInstance("SHA-256");
- } catch (NoSuchAlgorithmException e) {
- Log.ExceptionLog(e);
- return;
- }
- }
-
- if (rangeSize > 0) {
- mDigest = Checksum.getSHA256(filePath);
- }
- }
-
- private boolean isDownloadFileExist(File localFile) {
- if (!localFile.exists()) {
- return false;
- } else {
- if (localFile.length() == getDownloadFileSize()) {
- return true;
- } else {
- return false;
- }
- }
- }
-
- /**
- * Set user name.
- *
- * @param user
- */
- public void setUser(String user) {
- mUser = user;
- }
-
- /**
- * Set password
- *
- * @param password
- */
- public void setPassword(String password) {
- mPassword = password;
- }
-
- /**
- * Get MessageDigest instance from downloading file.
- *
- * @return
- */
- public MessageDigest getFileChecksum() {
- return mDigest;
- }
-
- /**
- * Connect to aUrl and ready to download.
- *
- * @param aUrl
- * @return <code>true</code> if connect success.
- */
- public boolean connect(URL aUrl) {
- Log.log("Connect to " + aUrl);
-
- if (isAvailableURL(aUrl)) {
- boolean bRet = false;
-
- URL url = getURLWithAuthentication(aUrl);
-
- for (int i = 0; i < CONNECT_RETRY; i++) {
- bRet = connectWithConfiguration(url);
-
- if (bRet == false
- && getResponseCode() == HttpURLConnection.HTTP_PROXY_AUTH) {
- LoginDlg loginDialog = new LoginDlg(new Shell(
- Display.getCurrent()));
-
- if (i == FIRST_TRY) {
- loginDialog.setWarningMessage(getResponseMessage());
- } else {
- loginDialog
- .setWarningMessage(ErrorCode.PROXY_AUTHENTICATION_IS_WRONG
- .getErrorMessage());
- }
- int dRet = loginDialog.open();
-
- if (dRet == 0) {
- setProxyAuthentication(loginDialog.getID(),
- loginDialog.getPassword());
- } else {
- break;
- }
- } else {
- break;
- }
- }
-
- return bRet;
- } else {
- return false;
- }
- }
-
- private boolean connectWithConfiguration(URL url) {
- boolean bRet = false;
-
- String proxyType = Config.getInstance().getConfigFile().getProxyType();
- if (proxyType.equals("")) { // InstallManager uses a system proxy as default.
- proxyType = ProxyType.AUTOMATIC.toString();
- }
-
- if (proxyType.equalsIgnoreCase(ProxyType.DIRECT.toString())) {
- bRet = connectWithDirectProxy(url);
- } else if (proxyType.equalsIgnoreCase(ProxyType.AUTOMATIC.toString())) {
- if (Options.useAutoProxy) {
- bRet = connectWithAutoProxy(url);
- } else {
- Config.getInstance().getConfigFile().setProxyType(ProxyType.DIRECT.toString());
- bRet = connectWithDirectProxy(url);
- }
- } else if (proxyType.equalsIgnoreCase(ProxyType.MANUAL.toString())) {
- bRet = connectWithManualProxy(url);
- } else {
- bRet = connectWithDirectProxy(url);
- }
-
- return bRet;
- }
-
- private URL getURLWithAuthentication(URL url) {
- try {
- if (!mUser.isEmpty() && !mPassword.equals("")) {
- String fullUrl = url.getProtocol() + PROTOCOL_SEPARATOR + mUser
- + USER_PASSWORD_SEPARATOR + mPassword + ID_SEPARATOR
- + url.getHost() + url.getPath();
-
- return new URL(fullUrl);
- } else {
- return url;
- }
-
- } catch (MalformedURLException e) {
- Log.ExceptionLog(e);
- return url;
- } catch (Throwable e) {
- Log.ExceptionLog(e);
- return url;
- }
- }
-
- public boolean connectWithDirectProxy(URL url) {
- boolean bRet = false;
-
- String protocol = url.getProtocol();
- if (protocol.startsWith("file")) {
- Log.log("Connect to local path.");
- bRet = connectToURL(url, Proxy.NO_PROXY);
-
- } else {
- Proxy directProxy = NetworkProxy.getHttpDirectProxy(url);
- bRet = connectToURL(url, directProxy);
- }
-
- return bRet;
- }
-
- public boolean connectWithAutoProxy(URL url) {
- boolean bRet = false;
- if (NetworkProxy.useProxy) {
- bRet = connectWithProxy(url);
-
- if (!bRet) {
- bRet = connectWithDirectProxy(url);
-
- if (bRet) {
- NetworkProxy.useProxy = false;
- }
- }
- } else {
- bRet = connectWithDirectProxy(url);
-
- if (!bRet) {
- bRet = connectWithProxy(url);
-
- if (bRet) {
- NetworkProxy.useProxy = true;
- }
- }
- }
-
- return bRet;
- }
-
- public boolean connectWithManualProxy(URL url) {
- Log.log("Connect to url with manual proxy. => " + url);
- saveProxyAuthentication();
-
- String protocol = url.getProtocol();
- Config conf = InstallManager.getInstance().getConfig();
-
- boolean bRet = false;
- if (protocol.startsWith("file")) {
- Log.log("Connect to local path.");
- bRet = connectToURL(url, Proxy.NO_PROXY);
-
- } else {
- if (!conf.hasProxy()) {
- ErrorController.setInstallationSuccess(false);
- throw new IMFatalException(ErrorCode.PROXY_CANNOT_FIND_SETTING);
- } else {
- Log.log("Connect to repository with config proxy.");
- bRet = connectToURL(url, getConfigProxy());
- }
- }
- return bRet;
- }
-
- /**
- * Check url available.
- *
- * @param url
- * @return
- */
- public static boolean isAvailableURL(URL url) {
- if (url.getProtocol().equalsIgnoreCase("file")) {
- return true;
- }
- SocketAddress socketAddress = null;
- try {
- int port = url.getPort();
- if (port < 0) {
- port = url.getDefaultPort();
- }
- socketAddress = getSocketAddress(url.getHost(), port);
-
- } catch (IMFatalException e) {
- Log.ExceptionLog(e);
- return false;
- }
-
- if (socketAddress == null) {
- return false;
- } else {
- return true;
- }
- }
-
- public static boolean isAvailableURL(String host, int port) {
- SocketAddress socketAddress = null;
- try {
- socketAddress = getSocketAddress(host, port);
-
- } catch (IMFatalException e) {
- Log.ExceptionLog(e);
- return false;
- }
-
- if (socketAddress == null) {
- return false;
- } else {
- return true;
- }
- }
-
- private boolean connectWithProxy(URL url) {
- saveProxyAuthentication();
-
- String protocol = url.getProtocol();
- Config conf = InstallManager.getInstance().getConfig();
-
- boolean bRet = false;
- if (protocol.startsWith("file")) {
- Log.log("Connect to local path.");
- bRet = connectToURL(url, Proxy.NO_PROXY);
-
- } else if (Options.proxy != null) {
- Log.log("Connect to repository with '-proxy' option.");
- bRet = connectToURL(url, getOptionalProxy());
-
- } else if (conf.hasProxy()) {
- Log.log("Connect to repository with config proxy.");
- bRet = connectToURL(url, getConfigProxy());
-
- } else { // system proxy
- Log.log("Connect to repository with system proxy.");
- List<Proxy> proxyList = NetworkProxy.getSystemProxyList(url);
-
- for (Proxy proxy : proxyList) {
- if (proxy == Proxy.NO_PROXY) {
- proxy = NetworkProxy.getHttpDirectProxy(url);
- }
-
- if (bRet = connectToURL(url, proxy)) {
- break;
- }
- }
- }
-
- return bRet;
- }
-
- private boolean connectToURL(final URL url, final Proxy proxy) {
-
- ConnectionThread connectionThread = new ConnectionThread(url, proxy);
-
- connectionThread.setDaemon(true);
- connectionThread.start();
-
- try {
- connectionThread.join(CONNECT_THREAD_JOIN_TIMEOUT);
- } catch (InterruptedException e) {
- Log.ExceptionLog(e);
- }
-
- if (!connectionThread.getConnectionResult()) {
- return false;
- }
-
- if (connectionThread.isAlive()) {
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
- Log.err("Cannot connect to server (URL => " + url
- + "). Connection thread still alive.");
- Log.err("proxy => " + proxy);
- return false;
- }
-
- if (!checkConnectionStatus(mConnection)) {
- return false;
- }
-
- fileSize = mConnection.getContentLength();
- if (fileSize < 0) {
- Log.err("Cannot connect to repository(url=>" + url + ", proxy=>"
- + proxy);
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
- return false;
- } else {
- return true;
- }
- }
-
- private boolean checkConnectionStatus(URLConnection connection) {
- if (connection == null) {
- return false;
- } else {
- String protocol = connection.getURL().getProtocol();
- if (protocol.equalsIgnoreCase("http")) {
- return checkHttpConnectionStatus(connection);
- } else if (protocol.equalsIgnoreCase("ftp")) {
- return true;
- } else {
- return true;
- }
- }
- }
-
- /**
- * Get reponse code from connection.
- *
- * @return
- */
- public int getResponseCode() {
- return responseCode;
- }
-
- /**
- * Get reponse message from connection.
- *
- * @return
- */
- public String getResponseMessage() {
- return responseMessage;
- }
-
- private boolean checkHttpConnectionStatus(URLConnection connection) {
- HttpURLConnection httpCon = (HttpURLConnection) connection;
-
- try {
- responseCode = httpCon.getResponseCode();
- responseMessage = httpCon.getResponseMessage();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
- return false;
- }
-
- Log.log(Integer.toString(responseCode));
- Log.log(responseMessage);
-
- switch (responseCode) {
- case HttpURLConnection.HTTP_OK:
- return true;
- case HttpURLConnection.HTTP_PARTIAL :
- return true;
- case HttpURLConnection.HTTP_NOT_FOUND:
- ErrorController.setError(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY);
- break;
- case HttpURLConnection.HTTP_UNAUTHORIZED:
- ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_401);
- break;
- case HttpURLConnection.HTTP_FORBIDDEN:
- ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_403);
- break;
- case HttpURLConnection.HTTP_PROXY_AUTH:
- ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_407);
- break;
- case Downloader.HTTP_REQUESTED_RANGE_NOT_SATISFIABLE :
- ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_416);
- break;
- case -1:
- Log.err("Http response code returns -1(null). It looks a Linux bug.");
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
- break;
- default:
- String errMsg = "Server connection failed." + "\nError message : "
- + responseMessage + "(Code number="
- + Integer.toString(responseCode) + ")";
- ErrorController.setErrorMessage(errMsg);
- break;
- }
-
- return false;
- }
-
- private Proxy getOptionalProxy() {
- Config conf = InstallManager.getInstance().getConfig();
-
- String[] arr = Options.proxy.split(":");
- try {
- Log.log("Use user-provided proxy: " + Options.proxy);
-
- SocketAddress addr = getSocketAddress(arr[0], arr[1]);
-
- // save proxy server and port
- conf.getConfigFile().setProxyServer(arr[0]);
- conf.getConfigFile().setProxyPort(arr[1]);
-
- return new Proxy(Proxy.Type.HTTP, addr);
- } catch (IllegalArgumentException e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorCode.PROXY_SERVER_IS_WRONG);
- } catch (ArrayIndexOutOfBoundsException e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorCode.PROXY_SERVER_IS_WRONG);
- } catch (IMFatalException e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(e.getMessage() + "\n(proxy: " + arr[0]
- + ":" + arr[1] + ").");
- }
- }
-
- private Proxy getConfigProxy() {
- Config conf = InstallManager.getInstance().getConfig();
-
- Log.log("Use proxy specified in .conf file: "
- + conf.getConfigFile().getProxyHost() + ":"
- + conf.getConfigFile().getProxyPort());
-
- SocketAddress addr = null;
- try {
- addr = getSocketAddress(conf.getConfigFile().getProxyHost(), conf
- .getConfigFile().getProxyPort());
- } catch (IMFatalException e) {
- throw new IMFatalException(e.getMessage() + "\n(proxy:"
- + conf.getConfigFile().getProxyHost() + ":"
- + conf.getConfigFile().getProxyPort() + ").");
- }
-
- return new Proxy(Proxy.Type.HTTP, addr);
- }
-
- private SocketAddress getSocketAddress(String address, String port)
- throws IMFatalException {
- try {
- return getSocketAddress(address, Integer.parseInt(port));
- } catch (NumberFormatException e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorCode.URL_PORT_IS_WRONG);
- }
- }
-
- public static SocketAddress getSocketAddress(String address, int port)
- throws IMFatalException {
- SocketAddress addr = null;
- try {
- addr = new InetSocketAddress(InetAddress.getByName(address), port);
- } catch (UnknownHostException e) {
- Log.ExceptionLog(e);
-
- String errMsg = ErrorCode.UNKNOWN_HOST_EXCEPTION.getErrorMessage() +
- "(" + address + ")";
- throw new IMFatalException(errMsg);
-
- } catch (IllegalArgumentException e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(ErrorCode.URL_PORT_IS_WRONG);
-
- } catch (SecurityException e) {
- Log.ExceptionLog(e);
-
- ErrorController.setErrorMessage(e.getMessage());
- throw new IMFatalException(ErrorCode.URL_SECURITY_EXCEPTION);
- }
-
- return addr;
- }
-
- public void saveProxyAuthentication() {
- if (!proxyUser.isEmpty() && !proxyPassword.isEmpty()) {
- Authenticator.setDefault(new ProxyAuthenticator(proxyUser,
- proxyPassword));
- } else {
- return;
- }
- }
-
- public void setProxyAuthentication(String user, String password) {
- proxyUser = user;
- proxyPassword = password;
- }
-
- /**
- * Get file size to download.
- *
- * @return
- */
- public long getDownloadFileSize() {
- if (fileSize <= 0) {
- return mConnection.getContentLength();
- } else {
- return fileSize;
- }
- }
-
- class ConnectionThread extends Thread {
- URL url = null;
- Proxy proxy = null;
-
- boolean connectionResult = false;
-
- public ConnectionThread(URL url, Proxy proxy) {
- this.url = url;
- this.proxy = proxy;
- }
-
- public void run() {
- try {
- if (url != null) {
- mConnection = url.openConnection(proxy);
- }
-
- // set connetion timeout
- if (mConnection != null) {
- if (Options.doTest) {
- mConnection.setConnectTimeout(CONNECT_TIMEOUT_TEST);
- mConnection.setReadTimeout(READ_TIMEOUT_TEST);
- } else {
- mConnection.setConnectTimeout(CONNECT_TIMEOUT);
- mConnection.setReadTimeout(READ_TIMEOUT);
- }
-// mConnection.setConnectTimeout(CONNECT_TIMEOUT);
-// mConnection.setReadTimeout(READ_TIMEOUT);
-
- if (rangeSize > 0) {
- setRangeRequest();
- }
- mConnection.connect();
- } else {
- return;
- }
-
- connectionResult = true;
- } catch (ConnectException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
-
- } catch (NoRouteToHostException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
-
- } catch (SocketTimeoutException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT);
-
- } catch (SocketException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);
-
- } catch (FileNotFoundException e) {
- Log.ExceptionLog(e);
- ErrorController
- .setError(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY);
-
- } catch (SSLHandshakeException e) {
- Log.ExceptionLog(e);
- ErrorController.setError(ErrorCode.NOT_SUPPORT_HTTPS_PROTOCOL);
-
- } catch (NoSuchElementException e) {
- Log.ExceptionLog(e);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- } catch (Throwable e) {
- Log.ExceptionLog(e);
- }
- }
-
- private void setRangeRequest() {
- Log.log("request range size of file " + rangeSize);
-
- if (mConnection != null) {
- mConnection.setRequestProperty("Range", "bytes=" + String.valueOf(rangeSize) + '-');
- } else {
- return;
- }
- }
-
- public boolean getConnectionResult() {
- return connectionResult;
- }
- }
-}
+/*\r
+ * InstallManager\r
+ *\r
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact:\r
+ * Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+ * Shihyun Kim <shihyun.kim@samsung.com>\r
+ * Taeyoung Son <taeyoung2.son@samsung.com>\r
+ * Yongsung kim <yongsung1.kim@samsung.com>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ *\r
+ */\r
+\r
+package org.tizen.installmanager.lib;\r
+\r
+import java.io.File;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.RandomAccessFile;\r
+import java.net.Authenticator;\r
+import java.net.ConnectException;\r
+import java.net.HttpURLConnection;\r
+import java.net.InetAddress;\r
+import java.net.InetSocketAddress;\r
+import java.net.MalformedURLException;\r
+import java.net.NoRouteToHostException;\r
+import java.net.Proxy;\r
+import java.net.SocketAddress;\r
+import java.net.SocketException;\r
+import java.net.SocketTimeoutException;\r
+import java.net.URL;\r
+import java.net.URLConnection;\r
+import java.net.UnknownHostException;\r
+import java.security.MessageDigest;\r
+import java.security.NoSuchAlgorithmException;\r
+import java.util.List;\r
+import java.util.NoSuchElementException;\r
+\r
+import javax.net.ssl.SSLHandshakeException;\r
+\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.tizen.installmanager.core.Config;\r
+import org.tizen.installmanager.core.IMFatalException;\r
+import org.tizen.installmanager.core.InstallManager;\r
+import org.tizen.installmanager.core.Options;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+import org.tizen.installmanager.lib.NetworkProxy.ProxyType;\r
+import org.tizen.installmanager.lib.exception.IMNetworkConnectException;\r
+import org.tizen.installmanager.lib.exception.IMNetworkDownloadException;\r
+import org.tizen.installmanager.ui.dialog.LoginDlg;\r
+import org.tizen.installmanager.util.PathUtil;\r
+import org.tizen.installmanager.util.ResourceHandler;\r
+\r
+/**\r
+ * Manages downloading from url.\r
+ * \r
+ * @author Shihyun Kim <shihyun.kim@samsung.com>\r
+ * \r
+ */\r
+public class Downloader {\r
+ private static final String PROTOCOL_SEPARATOR = "://";\r
+ private static final String USER_PASSWORD_SEPARATOR = ":";\r
+ private static final String ID_SEPARATOR = "@";\r
+\r
+ private static final int BUF_SIZE = 65536;\r
+\r
+ public static final long ERROR = -1;\r
+\r
+ private MessageDigest mDigest;\r
+ private URLConnection mConnection = null;\r
+ private static final int CONNECT_TIMEOUT = 15000; // connection timeout: 10 sec\r
+ private static final int READ_TIMEOUT = 20000; // read timeout: 20 sec\r
+ private static final int CONNECT_THREAD_JOIN_TIMEOUT = 11000; // // connection\r
+ // thread timeout: 11\r
+ // sec\r
+ private static final int CONNECT_RETRY = 3;\r
+ private static final int FIRST_TRY = 0;\r
+\r
+ private String mUser = "";\r
+ private String mPassword = "";\r
+\r
+ private int responseCode = -1;\r
+ private String responseMessage = "";\r
+ private long fileSize = 0;\r
+ long rangeSize = 0;\r
+ \r
+ //Http response code\r
+ public static final int HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416; \r
+ \r
+\r
+ // proxy authentication\r
+ private static String proxyUser = "";\r
+ private static String proxyPassword = "";\r
+\r
+ public Downloader() {\r
+ try {\r
+ mDigest = MessageDigest.getInstance("SHA-256");\r
+ } catch (NoSuchAlgorithmException e) {\r
+ Log.err("Downloader No algorithm for SHA-256");\r
+ throw new IMFatalException("No algorithm for SHA-256");\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Downloads the url to the local path\r
+ * \r
+ * @param sUrl\r
+ * url to download\r
+ * @param localPath\r
+ * local path to save the file from the url\r
+ * @param monitor\r
+ * @return download size in bytes if success. -1 if fail.\r
+ */\r
+ public long download(URL sUrl, String localPath, IIMProgressMonitor monitor) \r
+ throws IMNetworkConnectException, IMNetworkDownloadException{\r
+ Log.log("Downloading: " + sUrl + " -> " + localPath);\r
+\r
+ if (localPath == null || localPath.equals("")) {\r
+ return ERROR;\r
+ } \r
+\r
+ if ((sUrl == null || sUrl.toExternalForm().equals(""))) {\r
+ return ERROR;\r
+ } \r
+ \r
+ File localFile = new File(localPath);\r
+ setRangeSize(localFile);\r
+\r
+ if (!connect(sUrl) || mConnection == null) {\r
+ Log.err("Network connection error.\n" + sUrl);\r
+ \r
+ if (ErrorController.getErrorCode() == ErrorCode.HTTP_ERROR_MESSAGE_416) {\r
+ Log.err("Requested range not satisfiable.");\r
+ PathUtil.remove(localPath);\r
+ }\r
+ \r
+ return ERROR;\r
+ } \r
+\r
+ long downloadSize = downloadFile(localPath, monitor);\r
+\r
+ return downloadSize;\r
+ }\r
+ \r
+ private void setRangeSize(File localFile) { \r
+ //set range size.\r
+ if (localFile.exists()) {\r
+ rangeSize = localFile.length();\r
+ } else {\r
+ rangeSize = 0;\r
+ }\r
+ }\r
+\r
+ private long downloadFile(String localPath, IIMProgressMonitor monitor) throws IMNetworkDownloadException{\r
+ Log.log("File download start => " + localPath);\r
+ \r
+ File destFile = new File(localPath);\r
+ if (!destFile.isAbsolute()) {\r
+ return ERROR;\r
+ }\r
+ \r
+ File parentDir = destFile.getParentFile();\r
+ if (!parentDir.exists()) {\r
+ if (!parentDir.mkdirs()) {\r
+ Log.err("Fail to create directory ==> " + parentDir);\r
+ }\r
+ }\r
+ \r
+ RandomAccessFile output = null;\r
+ if (isDownloadFileExist(destFile)){\r
+ return destFile.length();\r
+ } else {\r
+ output = getOutputFile(destFile);\r
+ }\r
+ \r
+ InputStream input = getFileInputStream();\r
+ if (input == null) {\r
+ return ERROR;\r
+ }\r
+\r
+ byte[] buf = new byte[BUF_SIZE];\r
+ long totalWriteSize = rangeSize;\r
+ long writeSizePerSecond = 0;\r
+ long totalFileSize = getDownloadFileSize() +rangeSize;\r
+\r
+ long beginMS = System.currentTimeMillis();\r
+ \r
+ makeDigest(localPath);\r
+ \r
+ try {\r
+ \r
+ if (monitor != null) {\r
+ monitor.workedDownloadSize(rangeSize);\r
+ }\r
+ \r
+ while (totalWriteSize < totalFileSize) {\r
+ if (input.available() > 0) {\r
+ int inputReadSize = input.read(buf);\r
+\r
+ output.write(buf, 0, inputReadSize);\r
+\r
+ totalWriteSize += inputReadSize;\r
+ writeSizePerSecond += inputReadSize;\r
+\r
+ if (mDigest != null) {\r
+ mDigest.update(buf, 0, inputReadSize);\r
+ }\r
+\r
+ long endMS = System.currentTimeMillis();\r
+ if (endMS > (beginMS + 100)) {\r
+ if (monitor != null) {\r
+ if (monitor.isCanceled()) {\r
+ ErrorController.setError(ErrorCode.CANCEL);\r
+ return ERROR;\r
+ }\r
+ monitor.workedDownloadSize(writeSizePerSecond);\r
+ }\r
+\r
+ writeSizePerSecond = 0;\r
+ beginMS = endMS;\r
+ }\r
+ }\r
+\r
+ long endMS = System.currentTimeMillis();\r
+ if (endMS > (beginMS + READ_TIMEOUT)) {\r
+ Log.err("Can not be read during 20 seconds.");\r
+ ErrorController\r
+ .setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ \r
+ throw new IMNetworkDownloadException(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ }\r
+ }\r
+ \r
+ if (writeSizePerSecond > 0 && monitor != null) {\r
+ monitor.workedDownloadSize(writeSizePerSecond);\r
+ }\r
+ } catch (SocketTimeoutException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT);\r
+ throw new IMNetworkDownloadException(ErrorCode.SERVER_CONNECTION_TIME_OUT);\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.UNKNOWN_ERROR);\r
+ throw new IMNetworkDownloadException(ErrorCode.UNKOWN_ERROR);\r
+ } finally {\r
+ try {\r
+ if (input != null) {\r
+ input.close();\r
+ }\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+\r
+ try {\r
+ if (output != null) {\r
+ output.close();\r
+ }\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ \r
+ if (totalWriteSize != this.fileSize) {\r
+ Log.err("File size error occurs during the download");\r
+ Log.err("Expected file size => " + fileSize);\r
+ Log.err("Downloaded file size => " + totalWriteSize);\r
+ \r
+ throw new IMNetworkDownloadException(ErrorCode.NETWORK_DOWNLOADED_FILE_INCORRECTLY);\r
+ }\r
+ \r
+ Log.log("Downloaded size: " + totalWriteSize);\r
+ return totalWriteSize;\r
+ }\r
+\r
+ private InputStream getFileInputStream() {\r
+ try {\r
+ return mConnection.getInputStream();\r
+ } catch (FileNotFoundException e) {\r
+ Log.ExceptionLog(e);\r
+ String url = mConnection.getURL().toString();\r
+ int index = url.lastIndexOf("/");\r
+ String errUrl = url.substring(0, index);\r
+ String errorMsg = ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY\r
+ .getErrorMessage() + "\n(URL = " + errUrl + ")";\r
+ ErrorController.setErrorMessage(errorMsg);\r
+ return null;\r
+ } catch (SocketTimeoutException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT);\r
+ return null;\r
+ } catch (NoRouteToHostException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.NO_ROUTE_TO_HOST);\r
+ Log.err(ErrorController.getErrorMessage());\r
+ return null;\r
+ } catch (SocketException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ Log.err(ErrorController.getErrorMessage());\r
+ return null;\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ if (e.getClass().toString().indexOf("FtpLoginException") >= 0) {\r
+ ErrorController.setError(ErrorCode.NOT_LOGGED_IN);\r
+ Log.err(ErrorController.getErrorMessage());\r
+ return null;\r
+ }\r
+\r
+ ErrorController.setError(ErrorCode.CANNOT_DOWNLOAD_FILE);\r
+ Log.err(ErrorController.getErrorMessage());\r
+ return null;\r
+ } catch (Throwable e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setErrorMessage(e.getMessage());\r
+ return null;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * file output.\r
+ * @param outputFilePath\r
+ * @return \r
+ */\r
+ private RandomAccessFile getOutputFile(File outputFile) {\r
+ //Create new file to download or resume downloading.\r
+ if (!outputFile.exists()) {\r
+ try {\r
+ outputFile.createNewFile();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.CANNOT_CREATE_DOWNLOAD_FILE);\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ RandomAccessFile raFile = null;\r
+ try {\r
+ raFile = new RandomAccessFile(outputFile, "rw");\r
+ } catch (FileNotFoundException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setErrorMessage(e.getMessage());\r
+ return null;\r
+ }\r
+\r
+ try {\r
+ if (rangeSize > 0) {\r
+ raFile.seek(rangeSize);\r
+ }\r
+ } catch (IOException e) {\r
+ ErrorController.setErrorMessage(e.getMessage());\r
+ Log.ExceptionLog(e);\r
+ ResourceHandler.closeObjectSilently(raFile);\r
+ }\r
+ \r
+ return raFile;\r
+ }\r
+ \r
+ private void makeDigest(String filePath) {\r
+ if (mDigest != null) {\r
+ mDigest.reset();\r
+ } else {\r
+ try {\r
+ mDigest = MessageDigest.getInstance("SHA-256");\r
+ } catch (NoSuchAlgorithmException e) {\r
+ Log.ExceptionLog(e);\r
+ return;\r
+ }\r
+ }\r
+ \r
+ if (rangeSize > 0) {\r
+ mDigest = Checksum.getSHA256(filePath);\r
+ }\r
+ }\r
+ \r
+ private boolean isDownloadFileExist(File localFile) {\r
+ if (!localFile.exists()) {\r
+ return false;\r
+ } else {\r
+ if (localFile.length() == getDownloadFileSize()) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Set user name.\r
+ * \r
+ * @param user\r
+ */\r
+ public void setUser(String user) {\r
+ mUser = user;\r
+ }\r
+\r
+ /**\r
+ * Set password\r
+ * \r
+ * @param password\r
+ */\r
+ public void setPassword(String password) {\r
+ mPassword = password;\r
+ }\r
+\r
+ /**\r
+ * Get MessageDigest instance from downloading file.\r
+ * \r
+ * @return\r
+ */\r
+ public MessageDigest getFileChecksum() {\r
+ return mDigest;\r
+ }\r
+\r
+ /**\r
+ * Connect to aUrl and ready to download.\r
+ * \r
+ * @param aUrl\r
+ * @return <code>true</code> if connect success.\r
+ */\r
+ public boolean connect(URL aUrl) {\r
+ Log.log("Connect to " + aUrl);\r
+\r
+ if (isAvailableURL(aUrl)) {\r
+ boolean bRet = false;\r
+\r
+ URL url = getURLWithAuthentication(aUrl);\r
+\r
+ for (int i = 0; i < CONNECT_RETRY; i++) {\r
+ bRet = connectWithConfiguration(url);\r
+\r
+ if (bRet == false\r
+ && getResponseCode() == HttpURLConnection.HTTP_PROXY_AUTH) {\r
+ LoginDlg loginDialog = new LoginDlg(new Shell(\r
+ Display.getCurrent()));\r
+\r
+ if (i == FIRST_TRY) {\r
+ loginDialog.setWarningMessage(getResponseMessage());\r
+ } else {\r
+ loginDialog\r
+ .setWarningMessage(ErrorCode.PROXY_AUTHENTICATION_IS_WRONG\r
+ .getErrorMessage());\r
+ }\r
+ int dRet = loginDialog.open();\r
+\r
+ if (dRet == 0) {\r
+ setProxyAuthentication(loginDialog.getID(),\r
+ loginDialog.getPassword());\r
+ } else {\r
+ break;\r
+ }\r
+ } else {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return bRet;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ private boolean connectWithConfiguration(URL url) {\r
+ boolean bRet = false;\r
+\r
+ String proxyType = Config.getInstance().getConfigFile().getProxyType();\r
+ if (proxyType == "") { // InstallManager uses a system proxy as default.\r
+ proxyType = ProxyType.AUTOMATIC.toString();\r
+ }\r
+ \r
+ if (proxyType.equalsIgnoreCase(ProxyType.DIRECT.toString())) {\r
+ bRet = connectWithDirectProxy(url);\r
+ } else if (proxyType.equalsIgnoreCase(ProxyType.AUTOMATIC.toString())) {\r
+ if (Options.useAutoProxy) {\r
+ bRet = connectWithAutoProxy(url);\r
+ } else {\r
+ Config.getInstance().getConfigFile().setProxyType(ProxyType.DIRECT.toString());\r
+ bRet = connectWithDirectProxy(url);\r
+ }\r
+ } else if (proxyType.equalsIgnoreCase(ProxyType.MANUAL.toString())) {\r
+ bRet = connectWithManualProxy(url);\r
+ } else {\r
+ bRet = connectWithDirectProxy(url);\r
+ }\r
+\r
+ return bRet;\r
+ }\r
+\r
+ private URL getURLWithAuthentication(URL url) {\r
+ try {\r
+ if (!mUser.isEmpty() && !mPassword.equals("")) {\r
+ String fullUrl = url.getProtocol() + PROTOCOL_SEPARATOR + mUser\r
+ + USER_PASSWORD_SEPARATOR + mPassword + ID_SEPARATOR\r
+ + url.getHost() + url.getPath();\r
+\r
+ return new URL(fullUrl);\r
+ } else {\r
+ return url;\r
+ }\r
+\r
+ } catch (MalformedURLException e) {\r
+ Log.ExceptionLog(e);\r
+ return url;\r
+ } catch (Throwable e) {\r
+ Log.ExceptionLog(e);\r
+ return url;\r
+ }\r
+ }\r
+\r
+ public boolean connectWithDirectProxy(URL url) {\r
+ boolean bRet = false;\r
+\r
+ String protocol = url.getProtocol();\r
+ if (protocol.startsWith("file")) {\r
+ Log.log("Connect to local path.");\r
+ bRet = connectToURL(url, Proxy.NO_PROXY);\r
+\r
+ } else {\r
+ Proxy directProxy = NetworkProxy.getHttpDirectProxy(url);\r
+ bRet = connectToURL(url, directProxy);\r
+ }\r
+\r
+ return bRet;\r
+ }\r
+\r
+ public boolean connectWithAutoProxy(URL url) {\r
+ boolean bRet = false;\r
+ if (NetworkProxy.useProxy) {\r
+ bRet = connectWithProxy(url);\r
+\r
+ if (!bRet) {\r
+ bRet = connectWithDirectProxy(url);\r
+\r
+ if (bRet) {\r
+ NetworkProxy.useProxy = false;\r
+ }\r
+ }\r
+ } else {\r
+ bRet = connectWithDirectProxy(url);\r
+\r
+ if (!bRet) {\r
+ bRet = connectWithProxy(url);\r
+\r
+ if (bRet) {\r
+ NetworkProxy.useProxy = true;\r
+ }\r
+ }\r
+ }\r
+\r
+ return bRet;\r
+ }\r
+\r
+ public boolean connectWithManualProxy(URL url) {\r
+ Log.log("Connect to url with manual proxy. => " + url);\r
+ saveProxyAuthentication();\r
+\r
+ String protocol = url.getProtocol();\r
+ Config conf = InstallManager.getInstance().getConfig();\r
+\r
+ boolean bRet = false;\r
+ if (protocol.startsWith("file")) {\r
+ Log.log("Connect to local path.");\r
+ bRet = connectToURL(url, Proxy.NO_PROXY);\r
+\r
+ } else {\r
+ if (!conf.hasProxy()) {\r
+ ErrorController.setInstallationSuccess(false);\r
+ throw new IMFatalException(ErrorCode.PROXY_CANNOT_FIND_SETTING);\r
+ } else {\r
+ Log.log("Connect to repository with config proxy.");\r
+ bRet = connectToURL(url, getConfigProxy());\r
+ }\r
+ }\r
+ return bRet;\r
+ }\r
+\r
+ /**\r
+ * Check url available.\r
+ * \r
+ * @param url\r
+ * @return\r
+ */\r
+ public static boolean isAvailableURL(URL url) {\r
+ if (url.getProtocol().equalsIgnoreCase("file")) {\r
+ return true;\r
+ }\r
+ SocketAddress socketAddress = null;\r
+ try {\r
+ int port = url.getPort();\r
+ if (port < 0) {\r
+ port = url.getDefaultPort();\r
+ }\r
+ socketAddress = getSocketAddress(url.getHost(), port);\r
+\r
+ } catch (IMFatalException e) {\r
+ Log.ExceptionLog(e);\r
+ return false;\r
+ }\r
+\r
+ if (socketAddress == null) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ public static boolean isAvailableURL(String host, int port) {\r
+ SocketAddress socketAddress = null;\r
+ try {\r
+ socketAddress = getSocketAddress(host, port);\r
+\r
+ } catch (IMFatalException e) {\r
+ Log.ExceptionLog(e);\r
+ return false;\r
+ }\r
+\r
+ if (socketAddress == null) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ private boolean connectWithProxy(URL url) {\r
+ saveProxyAuthentication();\r
+\r
+ String protocol = url.getProtocol();\r
+ Config conf = InstallManager.getInstance().getConfig();\r
+\r
+ boolean bRet = false;\r
+ if (protocol.startsWith("file")) {\r
+ Log.log("Connect to local path.");\r
+ bRet = connectToURL(url, Proxy.NO_PROXY);\r
+\r
+ } else if (Options.proxy != null) {\r
+ Log.log("Connect to repository with '-proxy' option.");\r
+ bRet = connectToURL(url, getOptionalProxy());\r
+\r
+ } else if (conf.hasProxy()) {\r
+ Log.log("Connect to repository with config proxy.");\r
+ bRet = connectToURL(url, getConfigProxy());\r
+\r
+ } else { // system proxy\r
+ Log.log("Connect to repository with system proxy.");\r
+ List<Proxy> proxyList = NetworkProxy.getSystemProxyList(url);\r
+\r
+ for (Proxy proxy : proxyList) {\r
+ if (proxy == Proxy.NO_PROXY) {\r
+ proxy = NetworkProxy.getHttpDirectProxy(url);\r
+ }\r
+ \r
+ if (bRet = connectToURL(url, proxy)) {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return bRet;\r
+ }\r
+\r
+ private boolean connectToURL(final URL url, final Proxy proxy) {\r
+\r
+ ConnectionThread connectionThread = new ConnectionThread(url, proxy);\r
+\r
+ connectionThread.setDaemon(true);\r
+ connectionThread.start();\r
+\r
+ try {\r
+ connectionThread.join(CONNECT_THREAD_JOIN_TIMEOUT);\r
+ } catch (InterruptedException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+\r
+ if (!connectionThread.getConnectionResult()) {\r
+ return false;\r
+ }\r
+\r
+ if (connectionThread.isAlive()) {\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ Log.err("Cannot connect to server (URL => " + url\r
+ + "). Connection thread still alive.");\r
+ Log.err("proxy => " + proxy);\r
+ return false;\r
+ }\r
+\r
+ if (!checkConnectionStatus(mConnection)) {\r
+ return false;\r
+ }\r
+\r
+ fileSize = mConnection.getContentLength();\r
+ if (fileSize < 0) {\r
+ Log.err("Cannot connect to repository(url=>" + url + ", proxy=>"\r
+ + proxy);\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ private boolean checkConnectionStatus(URLConnection connection) {\r
+ if (connection == null) {\r
+ return false;\r
+ } else {\r
+ String protocol = connection.getURL().getProtocol();\r
+ if (protocol.equalsIgnoreCase("http")) {\r
+ return checkHttpConnectionStatus(connection);\r
+ } else if (protocol.equalsIgnoreCase("ftp")) {\r
+ return true;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get reponse code from connection.\r
+ * \r
+ * @return\r
+ */\r
+ public int getResponseCode() {\r
+ return responseCode;\r
+ }\r
+\r
+ /**\r
+ * Get reponse message from connection.\r
+ * \r
+ * @return\r
+ */\r
+ public String getResponseMessage() {\r
+ return responseMessage;\r
+ }\r
+\r
+ private boolean checkHttpConnectionStatus(URLConnection connection) {\r
+ HttpURLConnection httpCon = (HttpURLConnection) connection;\r
+\r
+ try {\r
+ responseCode = httpCon.getResponseCode();\r
+ responseMessage = httpCon.getResponseMessage();\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ return false;\r
+ }\r
+\r
+ Log.log(Integer.toString(responseCode));\r
+ Log.log(responseMessage);\r
+\r
+ switch (responseCode) {\r
+ case HttpURLConnection.HTTP_OK:\r
+ return true;\r
+ case HttpURLConnection.HTTP_PARTIAL :\r
+ return true;\r
+ case HttpURLConnection.HTTP_NOT_FOUND:\r
+ ErrorController.setError(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY);\r
+ break;\r
+ case HttpURLConnection.HTTP_UNAUTHORIZED:\r
+ ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_401);\r
+ break;\r
+ case HttpURLConnection.HTTP_FORBIDDEN:\r
+ ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_403);\r
+ break;\r
+ case HttpURLConnection.HTTP_PROXY_AUTH:\r
+ ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_407);\r
+ break;\r
+ case Downloader.HTTP_REQUESTED_RANGE_NOT_SATISFIABLE :\r
+ ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_416);\r
+ break;\r
+ case -1:\r
+ Log.err("Http response code returns -1(null). It looks a Linux bug.");\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+ break;\r
+ default:\r
+ String errMsg = "Server connection failed." + "\nError message : "\r
+ + responseMessage + "(Code number="\r
+ + Integer.toString(responseCode) + ")";\r
+ ErrorController.setErrorMessage(errMsg);\r
+ break;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ private Proxy getOptionalProxy() {\r
+ Config conf = InstallManager.getInstance().getConfig();\r
+\r
+ String[] arr = Options.proxy.split(":");\r
+ try {\r
+ Log.log("Use user-provided proxy: " + Options.proxy);\r
+\r
+ SocketAddress addr = getSocketAddress(arr[0], arr[1]);\r
+\r
+ // save proxy server and port\r
+ conf.getConfigFile().setProxyServer(arr[0]);\r
+ conf.getConfigFile().setProxyPort(arr[1]);\r
+\r
+ return new Proxy(Proxy.Type.HTTP, addr);\r
+ } catch (IllegalArgumentException e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorCode.PROXY_SERVER_IS_WRONG);\r
+ } catch (ArrayIndexOutOfBoundsException e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorCode.PROXY_SERVER_IS_WRONG);\r
+ } catch (IMFatalException e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(e.getMessage() + "\n(proxy: " + arr[0]\r
+ + ":" + arr[1] + ").");\r
+ }\r
+ }\r
+\r
+ private Proxy getConfigProxy() {\r
+ Config conf = InstallManager.getInstance().getConfig();\r
+\r
+ Log.log("Use proxy specified in .conf file: "\r
+ + conf.getConfigFile().getProxyHost() + ":"\r
+ + conf.getConfigFile().getProxyPort());\r
+\r
+ SocketAddress addr = null;\r
+ try {\r
+ addr = getSocketAddress(conf.getConfigFile().getProxyHost(), conf\r
+ .getConfigFile().getProxyPort());\r
+ } catch (IMFatalException e) {\r
+ throw new IMFatalException(e.getMessage() + "\n(proxy:"\r
+ + conf.getConfigFile().getProxyHost() + ":"\r
+ + conf.getConfigFile().getProxyPort() + ").");\r
+ }\r
+\r
+ return new Proxy(Proxy.Type.HTTP, addr);\r
+ }\r
+\r
+ private SocketAddress getSocketAddress(String address, String port)\r
+ throws IMFatalException {\r
+ try {\r
+ return getSocketAddress(address, Integer.parseInt(port));\r
+ } catch (NumberFormatException e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorCode.URL_PORT_IS_WRONG);\r
+ }\r
+ }\r
+\r
+ public static SocketAddress getSocketAddress(String address, int port)\r
+ throws IMFatalException {\r
+ SocketAddress addr = null;\r
+ try {\r
+ addr = new InetSocketAddress(InetAddress.getByName(address), port);\r
+ } catch (UnknownHostException e) {\r
+ Log.ExceptionLog(e);\r
+ \r
+ String errMsg = ErrorCode.UNKNOWN_HOST_EXCEPTION.getErrorMessage() +\r
+ "(" + address + ")";\r
+ throw new IMFatalException(errMsg);\r
+\r
+ } catch (IllegalArgumentException e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(ErrorCode.URL_PORT_IS_WRONG);\r
+\r
+ } catch (SecurityException e) {\r
+ Log.ExceptionLog(e);\r
+\r
+ ErrorController.setErrorMessage(e.getMessage());\r
+ throw new IMFatalException(ErrorCode.URL_SECURITY_EXCEPTION);\r
+ }\r
+\r
+ return addr;\r
+ }\r
+\r
+ public void saveProxyAuthentication() {\r
+ if (!proxyUser.isEmpty() && !proxyPassword.isEmpty()) {\r
+ Authenticator.setDefault(new ProxyAuthenticator(proxyUser,\r
+ proxyPassword));\r
+ } else {\r
+ return;\r
+ }\r
+ }\r
+\r
+ public void setProxyAuthentication(String user, String password) {\r
+ proxyUser = user;\r
+ proxyPassword = password;\r
+ }\r
+\r
+ /**\r
+ * Get file size to download.\r
+ * \r
+ * @return\r
+ */\r
+ public long getDownloadFileSize() {\r
+ if (fileSize <= 0) {\r
+ return mConnection.getContentLength();\r
+ } else {\r
+ return fileSize;\r
+ }\r
+ }\r
+\r
+ class ConnectionThread extends Thread {\r
+ URL url = null;\r
+ Proxy proxy = null;\r
+\r
+ boolean connectionResult = false;\r
+\r
+ public ConnectionThread(URL url, Proxy proxy) {\r
+ this.url = url;\r
+ this.proxy = proxy;\r
+ }\r
+\r
+ public void run() {\r
+ try {\r
+ if (url != null) {\r
+ mConnection = url.openConnection(proxy);\r
+ }\r
+\r
+ // set connetion timeout\r
+ if (mConnection != null) {\r
+ mConnection.setConnectTimeout(CONNECT_TIMEOUT);\r
+ mConnection.setReadTimeout(READ_TIMEOUT);\r
+ \r
+ if (rangeSize > 0) {\r
+ setRangeRequest();\r
+ } \r
+ mConnection.connect();\r
+ } else {\r
+ return;\r
+ }\r
+\r
+ connectionResult = true;\r
+ } catch (ConnectException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+\r
+ } catch (NoRouteToHostException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+\r
+ } catch (SocketTimeoutException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT);\r
+\r
+ } catch (SocketException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR);\r
+\r
+ } catch (FileNotFoundException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController\r
+ .setError(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY);\r
+\r
+ } catch (SSLHandshakeException e) {\r
+ Log.ExceptionLog(e);\r
+ ErrorController.setError(ErrorCode.NOT_SUPPORT_HTTPS_PROTOCOL);\r
+\r
+ } catch (NoSuchElementException e) {\r
+ Log.ExceptionLog(e);\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ } catch (Throwable e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ }\r
+ \r
+ private void setRangeRequest() {\r
+ Log.log("request range size of file " + rangeSize);\r
+ \r
+ if (mConnection != null) {\r
+ mConnection.setRequestProperty("Range", "bytes=" + String.valueOf(rangeSize) + '-');\r
+ } else {\r
+ return;\r
+ }\r
+ }\r
+\r
+ public boolean getConnectionResult() {\r
+ return connectionResult;\r
+ }\r
+ }\r
+}\r
-/*
-* InstallManager
-*
-* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Wooyoung Cho <wooyoung1.cho@samsung.com>
-* Shihyun Kim <shihyun.kim@samsung.com>
-* Taeyoung Son <taeyoung2.son@samsung.com>
-* Yongsung kim <yongsung1.kim@samsung.com>
-*
- * Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
-
-package org.tizen.installmanager.lib;
-
-import org.tizen.installmanager.core.Config;
-
-/**
- * This class manages error codes and states
- *
- * @author Shihyun Kim <shihyun.kim@samsung.com>
- */
-public class ErrorController {
- /**
- * Define case of error
- *
- * @author Shihyun Kim <shihyun.kim@samsung.com>
- *
- */
- public enum ErrorCode {
- CANNOT_FIND_CONFIG_FILE("The installmanager.conf file not found."),
- CANNOT_FIND_FILE_IN_REPOSITROY("Cannot find file in repository."),
- CANNOT_CREATE_DOWNLOAD_FILE("Download file cannot be created."),
- CANNOT_CHECK_INSTLLED_FILE_LIST("Installed file list cannot be checked."),
- CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY("File cannot be moved to the target directory."),
- CANNOT_CONNECT_TO_PROXY_SERVER("Proxy server connection fails."),
- WRONG_PACKAGE_URL("Package URLs are invalid."),
- CANCEL("Download canceled."),
- UNKNOWN_ERROR("Unknown error."),
- UNKNOWN_PACKAGE_EXTENSION("Package extension not supported."),
- INVALID_PACKAGE_VERSION("Invalid package version."),
- CANNOT_FIND_PACKAGE_VERSION("Package version not found."),
- CANNOT_FIND_INSTALLABLE_OR_REMOVABLE_PACKAGES("Install or uninstall packages not found. Network connection may have failed."),
- CANNOT_FIND_FILE_IN_LOCAL("Local file not found."),
- CANNOT_SAVE_CONFIG("Configuration file cannot be saved."),
- CANNOT_CREATE_SHORTCUT("Shortcut creation is failed."),
- CANNOT_CREATE_TSUDO("tsudo creation is failed."),
- CANNOT_CREATE_INSTALL_LIST("Install list creation failed."),
- CANNOT_CREATE_CONFIG_FILE("Configuration directory or file creation failed."),
- CANNOT_FIND_USER_CONFIG_FILE("User configuration file creation failed."),
- CANNOT_REGISTER_TARGET_DIR("Target directory registration failed."),
- CANNOT_PARSING_TEXT("Configuration file parsing failed."),
- CANNOT_SAVE_PROPERTY_FILE("The installmanager.conf or Package file cannot be saved."),
- CANNOT_UNPACK_PACKAGE("The package zip file unpackaging failed."),
- CANNOT_CREATE_RESOURCE("Resource file creation failed."),
- CANNOT_FIND_PACKAGE("Required packages not found. The package server may be invalid."),
- CANNOT_REMOVE_PACKAGE("Package removal failed."),
- CANNOT_REMOVE_MISSING_PACKAGE("Missing package cannot be removed."),
- FIND_MISSING_FILES("Some files are not installed properly."),
- CANNOT_ACCESS_FILE("File access failed."),
- CANNOT_REMOVE_OLDSDK("Old SDK removal failed."),
- COPY_FILE_IS_FAIL("Copying the file to the target directory failed."),
- OLD_TIZEN_SDK_EXISTS("Old Tizen SDK is installed. Remove the old SDK and run the Tizen SDK Install Manager again."),
- UNSUPPORTED_PLATFORM("Platform not supported."),
- REMOVE_SCRIPT_NOT_EXISTS("Removal script not found."),
- REMOVE_SCRIPT_FATAL_ERROR("Fatal error occurred while executing remove script."),
- INSTALLATION_FAIL("Installation failed."),
- INSTALL_CANCELED("Installation canceled."),
- INSTALLED_VERSION_IS_HIGH("Installation progress failed due to high installed package version."),
- CANNOT_CREATE_FILE("File creation failed."),
- THREAD_INTERRUPTED("Thread execution interrupted."),
- CIRCULAR_PACKAGE_DEPENDENCY("Circular package dependency detected."),
-
- //Configuration file error
- CONFIG_CANNOT_PARSING_PACKAGE_LIST("Package list cannot be read. Check the repository or proxy server."),
- CONFIG_CANNOT_FIND_PACKAGE_LIST_FILE_IN_REPOSITORY("Cannot get the package information. " +
- "\nPlease check your repository or SDK image file."),
- CONFIG_CANNOT_REMOVE_CONFLICT_PACKAGES("Conflict package removal failed."),
- CONFIG_CANNOT_REMOVE_UPDATABLE_PACKAGES("Updatable package removal failed."),
- CONFIG_CANNOT_READ_SERVER_TYPE("Server type cannot be read. Check the server type in the installmanager.conf file."),
- CONFIG_CANNOT_FIND_INSTALLED_FILE_LIST("Installation file list not found."),
-
- //Package error
- CANNOT_FIND_REPOSITORY("Cannot find repository. Please check your repository."),
- PACKAGE_WRONG_SIZE("Package size incorrect."),
- PACKAGE_WRONG_CHECKSUM("Package file checksum error."),
- PACKAGE_NOT_EXIST_TO_INSTALL_OR_UNINSTALL("Install or uninstall package not found."),
- INSTALL_SCRIPT_NOT_EXISTS("Install script files not found."),
- INSTALL_SCRIPT_FATAL_ERROR("Fatal error occurred while executing install script."),
- SCRIPT_FATAL_ERROR("Fatal error occurred while executing post script."),
-
- // Network error
- INTERNET_CONNECTION_ERROR("Server connection failed. Check the network status or set InstallManager settings."),
- SERVER_CONNECTION_TIME_OUT("Server connection timed out."),
- PROXY_NOT_PROVIDED("Proxy setting missing. Use the '-proxy <proxy-address>:<port>' option."),
- PROXY_SERVER_IS_WRONG("Proxy server connection failed. Check the proxy server."),
- PROXY_CONNECT_ERROR("Proxy server connection failed. Check the proxy server."),
- URL_SECURITY_EXCEPTION("Proxy server URL security error."),
- UNKNOWN_HOST_EXCEPTION("Fail to resolve host name."),
- URL_PORT_IS_WRONG("Incorrect port number."),
- NO_ROUTE_TO_HOST("Server not found. Check the URL."),
- NOT_LOGGED_IN("Login failed."),
- NOT_SUPPORT_HTTPS_PROTOCOL("HTTPS not supported."),
-
- //Network download error
- NETWORK_DOWNLOADED_FILE_INCORRECTLY("The downloaded file is invalid."),
-
- //proxy
- PROXY_CANNOT_FIND_SETTING("Cannot find proxy settings."),
- PROXY_AUTHENTICATION_IS_WRONG("Your authentication is wrong, please enter your correct ID and password."),
-
- //Http Socket error message
- HTTP_ERROR_MESSAGE_403("403 Forbidden is returned by http protocol. " +
- "The server can be reached, but the server declined to allow access to the page."),
- HTTP_ERROR_MESSAGE_401("Server requires authentication."),
- HTTP_ERROR_MESSAGE_407("Proxy requires Authentication "),
- HTTP_ERROR_MESSAGE_416("Requested range not satisfiable."),
-
- //option
- WRONG_OPTION("Incorrect option. Check it."),
- USESNAPSHOT_REPOSITORY_NOT_PROVIDED("Repository setting is missing. Use the '-snapShot <repository>' option."),
- REPOSITORY_NOT_PROVIDED("Repository setting is missing. Use the '-repository <repository>' option."),
- PACKAGES_NOT_PROVIDED("Repository setting is missing. Use the '-proxy <repository>' option."),
- CANNOT_FIND_INSTALLMANAGER_EXECUTABLE_PATH("Cannot find installmanager executable path."),
-
- //etc
- CANNOT_REMOVE_TARGET_DIR("Target directory removal failed."),
- INSTALLATION_STOP("Required packages for the META package not installed."),
- UNINSTALLATION_FAIL("Uninstallation failed."),
- FILE_NOT_FOUND("File not found."),
- FILE_DO_NOT_HAVE_PERMISSION("Do not have permission for the file."),
- REMOVE_OLD_SDK_OK("Old SDK uninstallation completed. Restart Install Manager."),
- INVALID_INSTALL_PATH("Invalid installation path."),
- DOWNLOAD_AND_EXIT("Packages downloaded successfully. Exit Install Manager."),
- CANNOT_DOWNLOAD_FILE("File download failed."),
- CANNOT_FIND_JAVA("\'JAVA\' not found. Check the java installation."),
- UNKOWN_ERROR("Unknown error."),
- NO_ERROR("Install Manager error. Send the log file to the Tizen SDK team."),
- ERROR_TEMP("Information retrieval from the default SDK package server failed.\n In Advanced Configuration, select the package server and distribution."),
-
- SNAPSHOT_PATH_IS_NULL("Snapshot path missing."),
- FAIL_TO_EXTRACT_SDK_IMAGE_FILE("SDK image file extraction failed."),
-
- //Using add extra repository dialog
- INVALID_REPOSITORY_FOR_HISTORY("Invalid repository for history."),
- SPACE_IN_REPOSITORY_NAME("Name cannot contain spaces."),
- NOTHING_TO_REPOSITORY_NAME("Name must be more than 1 character long."),
- HANGUL_IN_REPOSITORY_NAME("Repository name must be in English."),
- WRONG_PACKAGE_SERVER("Package list files not found. Check the package list files on the package server."),
- WRONG_PACKAGE_LIST_FORMAT("Mandatory field missing in the package list file."),
- WRONG_URL_FORMAT_HTTP("URL must begin with 'http://'."),
- WRONG_URL_FORMAT("Incorrect URL format. Enter the URL in the correct format."),
- CANNOT_CONNECT_URL_ADDRESS("Connection to the URL failed. Enter the correct URL."),
- PACKAGE_NOT_IN_EXTENSION_SERVER("Package file not found on the package server."),
- DUPLICATED_EXTENSION_REPOSITORY("Extension repository URL already exists.\nEnter a different extension repository URL."),
- DUPLICATED_BUILT_IN_EXTENSION_REPOSITORY("Built-in extension repository URL already exists.\nEnter a different extension repository URL."),
- DUPLICATED_EXTENSION_REPOSITORY_NAME("Extension repository name already exists.\nEnter a different extension repository name."),
- DUPLICATED_BUILT_IN_EXTENSION_REPOSITORY_NAME("Built-in extension repository name already exists.\nEnter a different extension repository name.");
-
- private String errorMessage = "";
-
- ErrorCode(String arg) {
- errorMessage = arg;
- }
-
- public String getErrorMessage() {
- return errorMessage;
- }
-
- public void setErrorMessage(String msg) {
- errorMessage = msg;
- }
-
- public boolean existErrorMessage() {
- if (errorMessage.isEmpty()) {
- return false;
- } else {
- return true;
- }
- }
-
- }
-
- public enum InfoCode {
- CANNOT_KILL_PROCESS("Cannot kill the proecss."),
- RESTART_THE_COMPUTER("Some Tizen SDK components may not work yet.\nPlease restart your computer before using Tizen SDK.");
-
- private String infoMessage = "";
-
- InfoCode(String arg) {
- infoMessage = arg;
- }
-
- public String getInfoMessage() {
- return infoMessage;
- }
- }
-
- static public boolean isInstallManagerUpdatable = false;
-
-
- static private ErrorCode mErrorCode = ErrorCode.NO_ERROR;
- static private boolean mInstallationStatus = true;
- static private String errorMsg = "";
- static private InfoCode infoCode = null;
-
- private static int exitCode = Config.EXITCODE_NORMAL;
-
- private static int retryCount = 0;
-
- /**
- * Set error code.
- * @param errorCode
- */
- static public void setError(ErrorCode errorCode) {
- mInstallationStatus = false;
- mErrorCode = errorCode;
- }
-
- /**
- *
- * @return Latest error message.
- */
- static public String getErrorMessage() {
- if (mErrorCode != null) {
- return mErrorCode.getErrorMessage();
- } else {
- return errorMsg;
- }
- }
-
- static public void setErrorMessage(String msg) {
- mInstallationStatus = false;
- mErrorCode = null;
- errorMsg = msg;
- }
-
- /**
- * @return Latest error code.
- */
- static public ErrorCode getErrorCode() {
- return mErrorCode;
- }
-
- /**
- * Get information message
- * @return
- */
- static public String getInfoMessage() {
- return infoCode.getInfoMessage();
- }
-
- /**
- * Set information message
- * @param msg
- */
- static public void setInfoCode(InfoCode info) {
- infoCode = info;
- }
-
- static public boolean existInfoMessage() {
- if (infoCode == null) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Set status of installation.
- * @param status
- */
- static public void setInstallationSuccess(boolean status) {
- Log.log("Set installation success: "+status);
- if (status == true) {
- mErrorCode = null;
- }
- mInstallationStatus = status;
- }
-
- /**
- * Get status of installation.
- * @return
- */
- static public boolean checkInstallationSuccess() {
- return mInstallationStatus;
- }
-
- /**
- * Get error message of e
- * @param e
- * @return
- */
- public static String getMessage(ErrorCode e) {
- return e.getErrorMessage();
- }
-
- /**
- * Sets exit code to be used on exit
- * @param exitCode
- */
- public static void setExitCode(int exitCode) {
- ErrorController.exitCode = exitCode;
- }
-
- /**
- * Gets exit code to be used on exit
- */
- public static int getExitCode() {
- return ErrorController.exitCode;
- }
-
- public static void setNetworkRetryCount(int cnt) {
- retryCount = cnt;
- }
-
- public static int getNetworkRetryCount() {
- return retryCount;
- }
-}
+/*\r
+* InstallManager\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact:\r
+* Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+* Shihyun Kim <shihyun.kim@samsung.com>\r
+* Taeyoung Son <taeyoung2.son@samsung.com>\r
+* Yongsung kim <yongsung1.kim@samsung.com>\r
+*\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/\r
+\r
+package org.tizen.installmanager.lib;\r
+\r
+import org.tizen.installmanager.core.Config;\r
+\r
+/**\r
+ * This class manages error codes and states\r
+ *\r
+ * @author Shihyun Kim <shihyun.kim@samsung.com>\r
+ */\r
+public class ErrorController {\r
+ /**\r
+ * Define case of error\r
+ *\r
+ * @author Shihyun Kim <shihyun.kim@samsung.com>\r
+ *\r
+ */\r
+ public enum ErrorCode {\r
+ CANNOT_FIND_CONFIG_FILE("The installmanager.conf file not found."),\r
+ CANNOT_FIND_FILE_IN_REPOSITROY("Cannot find file in repository."),\r
+ CANNOT_CREATE_DOWNLOAD_FILE("Download file cannot be created."),\r
+ CANNOT_CHECK_INSTLLED_FILE_LIST("Installed file list cannot be checked."),\r
+ CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY("File cannot be moved to the target directory."),\r
+ CANNOT_CONNECT_TO_PROXY_SERVER("Proxy server connection fails."),\r
+ WRONG_PACKAGE_URL("Package URLs are invalid."),\r
+ CANCEL("Download canceled."),\r
+ UNKNOWN_ERROR("Unknown error."),\r
+ UNKNOWN_PACKAGE_EXTENSION("Package extension not supported."),\r
+ INVALID_PACKAGE_VERSION("Invalid package version."),\r
+ CANNOT_FIND_PACKAGE_VERSION("Package version not found."),\r
+ CANNOT_FIND_INSTALLABLE_OR_REMOVABLE_PACKAGES("Install or uninstall packages not found. Network connection may have failed."),\r
+ CANNOT_FIND_FILE_IN_LOCAL("Local file not found."),\r
+ CANNOT_SAVE_CONFIG("Configuration file cannot be saved."),\r
+ CANNOT_CREATE_SHORTCUT("Shortcut creation is failed."),\r
+ CANNOT_CREATE_TSUDO("tsudo creation is failed."),\r
+ CANNOT_CREATE_INSTALL_LIST("Install list creation failed."),\r
+ CANNOT_CREATE_CONFIG_FILE("Configuration directory or file creation failed."),\r
+ CANNOT_FIND_USER_CONFIG_FILE("User configuration file creation failed."),\r
+ CANNOT_REGISTER_TARGET_DIR("Target directory registration failed."),\r
+ CANNOT_PARSING_TEXT("Configuration file parsing failed."),\r
+ CANNOT_SAVE_PROPERTY_FILE("The installmanager.conf or Package file cannot be saved."),\r
+ CANNOT_UNPACK_PACKAGE("The package zip file unpackaging failed."),\r
+ CANNOT_CREATE_RESOURCE("Resource file creation failed."),\r
+ CANNOT_FIND_PACKAGE("Required packages not found. The package server may be invalid."),\r
+ CANNOT_REMOVE_PACKAGE("Package removal failed."),\r
+ CANNOT_REMOVE_MISSING_PACKAGE("Missing package cannot be removed."),\r
+ FIND_MISSING_FILES("Some files are not installed properly."),\r
+ CANNOT_ACCESS_FILE("File access failed."),\r
+ CANNOT_REMOVE_OLDSDK("Old SDK removal failed."),\r
+ COPY_FILE_IS_FAIL("Copying the file to the target directory failed."),\r
+ OLD_TIZEN_SDK_EXISTS("Old Tizen SDK is installed. Remove the old SDK and run the Tizen SDK Install Manager again."),\r
+ UNSUPPORTED_PLATFORM("Platform not supported."),\r
+ REMOVE_SCRIPT_NOT_EXISTS("Removal script not found."),\r
+ REMOVE_SCRIPT_FATAL_ERROR("Fatal error occurred while executing remove script."),\r
+ INSTALLATION_FAIL("Installation failed."),\r
+ INSTALL_CANCELED("Installation canceled."),\r
+ INSTALLED_VERSION_IS_HIGH("Installation progress failed due to high installed package version."),\r
+ CANNOT_CREATE_FILE("File creation failed."),\r
+ THREAD_INTERRUPTED("Thread execution interrupted."),\r
+ CIRCULAR_PACKAGE_DEPENDENCY("Circular package dependency detected."),\r
+ \r
+ //Configuration file error\r
+ CONFIG_CANNOT_PARSING_PACKAGE_LIST("Package list cannot be read. Check the repository or proxy server."),\r
+ CONFIG_CANNOT_FIND_PACKAGE_LIST_FILE_IN_REPOSITORY("Cannot get the package information. " +\r
+ "\nPlease check your repository or SDK image file."),\r
+ CONFIG_CANNOT_REMOVE_CONFLICT_PACKAGES("Conflict package removal failed."),\r
+ CONFIG_CANNOT_REMOVE_UPDATABLE_PACKAGES("Updatable package removal failed."),\r
+ CONFIG_CANNOT_READ_SERVER_TYPE("Server type cannot be read. Check the server type in the installmanager.conf file."),\r
+ CONFIG_CANNOT_FIND_INSTALLED_FILE_LIST("Installation file list not found."),\r
+ \r
+ //Package error\r
+ CANNOT_FIND_REPOSITORY("Cannot find repository. Please check your repository."),\r
+ PACKAGE_WRONG_SIZE("Package size incorrect."),\r
+ PACKAGE_WRONG_CHECKSUM("Package file checksum error."),\r
+ PACKAGE_NOT_EXIST_TO_INSTALL_OR_UNINSTALL("Install or uninstall package not found."),\r
+ INSTALL_SCRIPT_NOT_EXISTS("Install script files not found."),\r
+ INSTALL_SCRIPT_FATAL_ERROR("Fatal error occurred while executing install script."),\r
+ SCRIPT_FATAL_ERROR("Fatal error occurred while executing post script."),\r
+ \r
+ // Network error\r
+ INTERNET_CONNECTION_ERROR("Server connection failed. Check the network status or set InstallManager settings."),\r
+ SERVER_CONNECTION_TIME_OUT("Server connection timed out."),\r
+ PROXY_NOT_PROVIDED("Proxy setting missing. Use the '-proxy <proxy-address>:<port>' option."),\r
+ PROXY_SERVER_IS_WRONG("Proxy server connection failed. Check the proxy server."),\r
+ PROXY_CONNECT_ERROR("Proxy server connection failed. Check the proxy server."),\r
+ URL_SECURITY_EXCEPTION("Proxy server URL security error."),\r
+ UNKNOWN_HOST_EXCEPTION("Fail to resolve host name."),\r
+ URL_PORT_IS_WRONG("Incorrect port number."),\r
+ NO_ROUTE_TO_HOST("Server not found. Check the URL."),\r
+ NOT_LOGGED_IN("Login failed."),\r
+ NOT_SUPPORT_HTTPS_PROTOCOL("HTTPS not supported."),\r
+ \r
+ //Network download error\r
+ NETWORK_DOWNLOADED_FILE_INCORRECTLY("The downloaded file is invalid."),\r
+ \r
+ //proxy\r
+ PROXY_CANNOT_FIND_SETTING("Cannot find proxy settings."),\r
+ PROXY_AUTHENTICATION_IS_WRONG("Your authentication is wrong, please enter your correct ID and password."),\r
+ \r
+ //Http Socket error message\r
+ HTTP_ERROR_MESSAGE_403("403 Forbidden is returned by http protocol. " +\r
+ "The server can be reached, but the server declined to allow access to the page."),\r
+ HTTP_ERROR_MESSAGE_401("Server requires authentication."),\r
+ HTTP_ERROR_MESSAGE_407("Proxy requires Authentication "),\r
+ HTTP_ERROR_MESSAGE_416("Requested range not satisfiable."),\r
+ \r
+ //option\r
+ WRONG_OPTION("Incorrect option. Check it."),\r
+ USESNAPSHOT_REPOSITORY_NOT_PROVIDED("Repository setting is missing. Use the '-snapShot <repository>' option."),\r
+ REPOSITORY_NOT_PROVIDED("Repository setting is missing. Use the '-repository <repository>' option."),\r
+ PACKAGES_NOT_PROVIDED("Repository setting is missing. Use the '-proxy <repository>' option."),\r
+ CANNOT_FIND_INSTALLMANAGER_EXECUTABLE_PATH("Cannot find installmanager executable path."),\r
+ \r
+ //etc\r
+ CANNOT_REMOVE_TARGET_DIR("Target directory removal failed."),\r
+ INSTALLATION_STOP("Required packages for the META package not installed."),\r
+ UNINSTALLATION_FAIL("Uninstallation failed."),\r
+ FILE_NOT_FOUND("File not found."),\r
+ FILE_DO_NOT_HAVE_PERMISSION("Do not have permission for the file."),\r
+ REMOVE_OLD_SDK_OK("Old SDK uninstallation completed. Restart Install Manager."),\r
+ INVALID_INSTALL_PATH("Invalid installation path."),\r
+ DOWNLOAD_AND_EXIT("Packages downloaded successfully. Exit Install Manager."),\r
+ CANNOT_DOWNLOAD_FILE("File download failed."),\r
+ CANNOT_FIND_JAVA("\'JAVA\' not found. Check the java installation."),\r
+ UNKOWN_ERROR("Unknown error."),\r
+ NO_ERROR("Install Manager error. Send the log file to the Tizen SDK team."),\r
+ ERROR_TEMP("Information retrieval from the default SDK package server failed.\n In Advanced Configuration, select the package server and distribution."),\r
+ \r
+ SNAPSHOT_PATH_IS_NULL("Snapshot path missing."),\r
+ FAIL_TO_EXTRACT_SDK_IMAGE_FILE("SDK image file extraction failed."),\r
+ \r
+ //Using add extra repository dialog\r
+ SPACE_IN_REPOSITORY_NAME("Name cannot contain spaces."),\r
+ NOTHING_TO_REPOSITORY_NAME("Name must be more than 1 character long."),\r
+ HANGUL_IN_REPOSITORY_NAME("Repository name must be in English."),\r
+ WRONG_PACKAGE_SERVER("Package list files not found. Check the package list files on the package server."),\r
+ WRONG_PACKAGE_LIST_FORMAT("Mandatory field missing in the package list file."),\r
+ WRONG_URL_FORMAT_HTTP("URL must begin with 'http://'."),\r
+ WRONG_URL_FORMAT("Incorrect URL format. Enter the URL in the correct format."),\r
+ CANNOT_CONNECT_URL_ADDRESS("Connection to the URL failed. Enter the correct URL."),\r
+ PACKAGE_NOT_IN_EXTENSION_SERVER("Package file not found on the package server."),\r
+ DUPLICATED_EXTENSION_REPOSITORY("Extension repository URL already exists.\nEnter a different extension repository URL."),\r
+ DUPLICATED_BUILT_IN_EXTENSION_REPOSITORY("Built-in extension repository URL already exists.\nEnter a different extension repository URL."),\r
+ DUPLICATED_EXTENSION_REPOSITORY_NAME("Extension repository name already exists.\nEnter a different extension repository name."),\r
+ DUPLICATED_BUILT_IN_EXTENSION_REPOSITORY_NAME("Built-in extension repository name already exists.\nEnter a different extension repository name.");\r
+ \r
+ private String errorMessage = "";\r
+\r
+ ErrorCode(String arg) {\r
+ errorMessage = arg;\r
+ }\r
+\r
+ public String getErrorMessage() {\r
+ return errorMessage;\r
+ }\r
+ \r
+ public void setErrorMessage(String msg) {\r
+ errorMessage = msg;\r
+ }\r
+ \r
+ public boolean existErrorMessage() {\r
+ if (errorMessage.isEmpty()) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+ public enum InfoCode {\r
+ CANNOT_KILL_PROCESS("Cannot kill the proecss."),\r
+ RESTART_THE_COMPUTER("Some Tizen SDK components may not work yet.\nPlease restart your computer before using Tizen SDK.");\r
+ \r
+ private String infoMessage = "";\r
+\r
+ InfoCode(String arg) {\r
+ infoMessage = arg;\r
+ }\r
+\r
+ public String getInfoMessage() {\r
+ return infoMessage;\r
+ }\r
+ }\r
+ \r
+ static public boolean isInstallManagerUpdatable = false;\r
+\r
+\r
+ static private ErrorCode mErrorCode = ErrorCode.NO_ERROR;\r
+ static private boolean mInstallationStatus = true;\r
+ static private String errorMsg = "";\r
+ static private InfoCode infoCode = null;\r
+\r
+ private static int exitCode = Config.EXITCODE_NORMAL;\r
+\r
+ /**\r
+ * Set error code.\r
+ * @param errorCode\r
+ */\r
+ static public void setError(ErrorCode errorCode) {\r
+ mInstallationStatus = false;\r
+ mErrorCode = errorCode;\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @return Latest error message.\r
+ */\r
+ static public String getErrorMessage() {\r
+ if (mErrorCode != null) { \r
+ return mErrorCode.getErrorMessage();\r
+ } else {\r
+ return errorMsg;\r
+ }\r
+ }\r
+ \r
+ static public void setErrorMessage(String msg) {\r
+ mInstallationStatus = false;\r
+ mErrorCode = null; \r
+ errorMsg = msg;\r
+ }\r
+\r
+ /** \r
+ * @return Latest error code.\r
+ */\r
+ static public ErrorCode getErrorCode() {\r
+ return mErrorCode;\r
+ }\r
+ \r
+ /**\r
+ * Get information message\r
+ * @return\r
+ */\r
+ static public String getInfoMessage() {\r
+ return infoCode.getInfoMessage();\r
+ }\r
+ \r
+ /**\r
+ * Set information message\r
+ * @param msg\r
+ */\r
+ static public void setInfoCode(InfoCode info) {\r
+ infoCode = info;\r
+ }\r
+ \r
+ static public boolean existInfoMessage() {\r
+ if (infoCode == null) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Set status of installation.\r
+ * @param status\r
+ */\r
+ static public void setInstallationSuccess(boolean status) {\r
+ Log.log("Set installation success: "+status);\r
+ if (status == true) {\r
+ mErrorCode = null;\r
+ }\r
+ mInstallationStatus = status;\r
+ }\r
+\r
+ /**\r
+ * Get status of installation.\r
+ * @return\r
+ */\r
+ static public boolean checkInstallationSuccess() {\r
+ return mInstallationStatus;\r
+ }\r
+\r
+ /**\r
+ * Get error message of e\r
+ * @param e\r
+ * @return\r
+ */\r
+ public static String getMessage(ErrorCode e) {\r
+ return e.getErrorMessage();\r
+ }\r
+\r
+ /**\r
+ * Sets exit code to be used on exit\r
+ * @param exitCode\r
+ */\r
+ public static void setExitCode(int exitCode) {\r
+ ErrorController.exitCode = exitCode;\r
+ }\r
+\r
+ /**\r
+ * Gets exit code to be used on exit\r
+ */\r
+ public static int getExitCode() {\r
+ return ErrorController.exitCode;\r
+ }\r
+}\r
List<RegistryInfo> oldRegistryInfo = new ArrayList<RegistryInfo>();
RegistryInfo mCurrentRegistry = null;
- private static class RegistryInfo {
+ private class RegistryInfo {
String mRegistryPath = "";
String mPathKey = "";
String mTargetPath = "";
+++ /dev/null
-/*
- * InstallManager
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact:
- * Donghee Yang <donghee.yang@samsung.com>
- * Shihyun Kim <shihyun.kim@samsung.com>
- * Yongsung kim <yongsung1.kim@samsung.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Contributors:
- * - S-Core Co., Ltd
- *
- */
-
-package org.tizen.installmanager.lib;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.tizen.installmanager.cli.CliUnzipImage;
-import org.tizen.installmanager.cli.CliUnzipImage.UNZIP_FILE_STYLE;
-import org.tizen.installmanager.core.Config;
-import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.InstallManager;
-import org.tizen.installmanager.core.Installer;
-import org.tizen.installmanager.core.Options;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.ErrorController.InfoCode;
-import org.tizen.installmanager.pkg.lib.PackageManager;
-import org.tizen.installmanager.pkg.lib.PropertyParser;
-import org.tizen.installmanager.pkg.model.Package;
-import org.tizen.installmanager.pkg.model.Properties;
-import org.tizen.installmanager.pkg.model.Property;
-import org.tizen.installmanager.pkg.model.PropertySection;
-import org.tizen.installmanager.util.IMShellCommandFail;
-import org.tizen.installmanager.util.PathUtil;
-import org.tizen.installmanager.util.ShellUtil;
-
-/**
- * This class supports SDK patch.
- * @author Yongsung Kim
- *
- */
-public class Patch {
- public static final String PATCH_SCRIPT_LINUX = "patch.sh";
- public static final String PATCH_SCRIPT_WINDOWS = "patch.bat";
- public static final String PATCH_PKG_INFO = "pkginfo.manifest";
-
- private String patchPath = null;
- private Package patchPackage = null;
-
- public Patch() {
- patchPath = Options.SDKPatchPath;
- }
-
- public boolean patchSDK() {
- File patchFile = new File(patchPath);
- CliUnzipImage cui = new CliUnzipImage(patchFile);
- String patchTempPath = cui.unzipSDKImageFile(patchFile, UNZIP_FILE_STYLE.PATCH);
-
- System.out.println("*** Patch processing ***");
- boolean move = moveToTargetDirectoryFromTempDirectory(patchTempPath, Registry.getInstalledPath());
-
- if (move) {
- setPatchPackageInfo(patchTempPath);
- executePatchScript(patchTempPath);
- removePatchTemp(patchTempPath);
- } else {
- return false;
- }
-
- if (setInstalledVersionUp()) {
- return true;
- } else {
- return false;
- }
- }
-
- private void setPatchPackageInfo(String patchTempDir) {
- List<PropertySection> propertySections = null;
- PropertyParser parser = new PropertyParser();
- propertySections = parser.readFromFile(PathUtil.get(patchTempDir, PATCH_PKG_INFO));
-
- PropertySection section = new PropertySection();
- for (PropertySection sect : propertySections) {
- section = sect;
- }
-
- String repo = null;
- Collection<String> repos = Config.getInstance().getSDKPackageServerList();
-
- for (String tmp : repos) {
- repo = tmp;
- }
-
- patchPackage = new Package(section.getProperties(), repo);
- }
-
- public Package getPatchPackage() {
- return patchPackage;
- }
-
- private boolean executePatchScript(String patchTempDir) {
- File scriptFile = getPatchScript(patchTempDir);
- if (scriptFile.exists()) {
- Log.log("Execute patch script");
-
- try {
- return executeScript(scriptFile);
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(
- ErrorController
- .getMessage(ErrorCode.INSTALL_SCRIPT_FATAL_ERROR)
- + " (" + patchPackage.getPackageName() + " package)");
- }
- } else {
- Log.log(patchPackage.getPackageName() + " does not have patch script");
- }
- return true;
- }
-
- private File getPatchScript(String patchTempDir) {
- File scriptFile = null;
-
- if (Platform.isUbuntu() || Platform.isMacOS()) {
- scriptFile = new File(PathUtil.get(patchTempDir, PATCH_SCRIPT_LINUX));
- } else if (Platform.isWindows()) {
- scriptFile = new File(PathUtil.get(patchTempDir, PATCH_SCRIPT_WINDOWS));
- } else {
- Log.err("Platform not supported.");
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
-
- return scriptFile;
- }
-
- /**
- * Executes the file with default environment variables
- *
- * @param scriptFile
- * @return <code>true</code> if success
- * @throws IMShellCommandFail
- */
- public boolean executeScript(File scriptFile) throws IMShellCommandFail {
- scriptFile.setExecutable(true);
- Installer installer = new Installer();
- Map<String, String> env = installer.setEnvironmentVariable(); // except sdk data path.
-
- String command = ShellUtil.addInterpreter(scriptFile.getAbsolutePath());
-
- String current = PathUtil.getCurrentDir();
- Log.log("Current working directory. => " + current);
- int exitCode = ShellUtil.execute(command, env, new File(current),
- new LoggerShellParser());
-
- // check exit code
- if (exitCode == 0) {
- System.out.println("Execute patch script ..... done");
- return true;
- } else if (exitCode == 1 || exitCode == 2) {
- Log.err("Exit code => " + Integer.toString(exitCode));
- System.out.println("Execute patch script ..... fail (exit code : " + exitCode + ")");
- return false;
- } else if (exitCode == 99) {
- ErrorController.setInfoCode(InfoCode.RESTART_THE_COMPUTER);
- Log.log("Set restart message.");
- return true;
- } else {
- System.out.println("Execute patch script ..... fail (exit code : " + exitCode + ")");
- Log.err("patch script error => " + scriptFile.getAbsolutePath());
- Log.err("Exit code => " + Integer.toString(exitCode));
- throw new IMFatalException(ErrorController.getMessage(ErrorCode.SCRIPT_FATAL_ERROR)
- + " (" + patchPackage.getPackageName() + " package)");
- }
- }
-
- private void removePatchTemp(String patchTempDir) {
- if (PathUtil.remove(patchTempDir)) {
- Log.log("Success to remove patch temporary directory. ==> " + patchTempDir);
- System.out.println("Success to remove patch temporary directory.");
- } else {
- Log.err("Fail to remove patch temporary directory. ==> " + patchTempDir);
- System.out.println("Fail to remove patch temporary directory.");
- }
-
- }
-
- private boolean moveToTargetDirectoryFromTempDirectory(String tempDir,
- String targetDir) {
- Log.log("Move temp to target");
- File fromFile = new File(tempDir + File.separator
- + Config.DATA_DIRECTORY);
- if (!fromFile.exists()) {
- Log.err("Data directory is not exist in package.");
- return true;
- }
- File toFile = new File(targetDir);
-
- File[] fromList = fromFile.listFiles();
-
- if (fromList == null) {
- return false;
- }
-
- for (int i = 0; i < fromList.length; i++) {
- boolean ret = false;
- if (Platform.isLinux()) {
- ret = PathUtil.copyHardLink(fromList[i], toFile, true);
- } else if (Platform.isWindows()) {
- ret = PathUtil.move(fromList[i],
- new File(toFile, fromList[i].getName()));
- } else if (Platform.isMacOS()) {
- ret = PathUtil.copyHardLink(fromList[i], toFile, true);
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
- if (!ret) {
- return false;
- }
- }
- return true;
- }
-
- private boolean setInstalledVersionUp() {
- // Remove patch package property from installed packages properties.
- PackageManager pm = InstallManager.getInstance().getPackageManager();
- Package installedPkg = pm.getInstalledPackageByName(patchPackage.getPackageName());
- PropertySection iSection = new PropertySection();
- Properties installedPkgProps = (Properties) installedPkg.getProperties();
- iSection.setProperties(installedPkgProps);
-
- String filePath = PathUtil.get(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),
- Config.INSTALLED_PACKAGE_LIST_FILE_NAME);
-
- List<PropertySection> sectionsInstalled = null;
- List<PropertySection> sectionsInstalledClone = null;
-
- PropertyParser parser = new PropertyParser();
- sectionsInstalled = parser.readFromFile(filePath);
- sectionsInstalledClone = parser.readFromFile(filePath);
-
- int cnt = 0;
-
- // Filtering patch package from installed packages.
- for (PropertySection p : sectionsInstalledClone) {
- String m = p.getProperties().get(0).getValue();
- String k = iSection.getProperties().get(0).getValue();
- cnt ++;
- if (m.equalsIgnoreCase(k)) {
- int index = cnt - 1;
- sectionsInstalled.remove(index);
- }
- }
-
- // Replace version from installed to patch.
- for (Property prop : installedPkgProps) {
- if (prop.getName().equalsIgnoreCase(Package.FIELD_VERSION)) {
- prop.setValue(patchPackage.getVersion().toString());
- }
- }
-
- iSection.setProperties(installedPkgProps);
- if (!sectionsInstalled.add(iSection)) {
- System.out.println("Cannot update patch package version. (from : " + installedPkg.getVersion()
- + " to : " + patchPackage.getVersion());
- Log.err("Cannot update patch package version. (from : " + installedPkg.getVersion()
- + " to : " + patchPackage.getVersion());
- return false;
- } else {
- System.out.println("Success to update patch package version. (from : " + installedPkg.getVersion()
- + " to : " + patchPackage.getVersion());
- Log.log("Success to update patch package version. (from : " + installedPkg.getVersion()
- + " to : " + patchPackage.getVersion());
- }
-
- // Write the new installedpackage.list
- parser.writeToFile(sectionsInstalled, filePath);
- System.out.println("Write a updated installedpackage.list file ... done");
-
- return true;
- }
-}
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
-import java.util.Collections;
import org.tizen.installmanager.core.Config;
import org.tizen.installmanager.core.IMFatalException;
//installed path.
public static final String REGISTRY_FILE_NAME = "tizensdkpath";
public static final String MULTI_SDK_FILE_NAME = "multisdkpath";
- public static final String REPO_HISTORY_FILE_NAME = "repo.history";
public static final String REGISTRY_FILE_PATH = PathUtil.get(
Config.INSTALL_MANAGER_CONFIG, REGISTRY_FILE_NAME);
private static final String OLD_REGISTRY_FILE_PATH = PathUtil.get(
Config.getConfigHome(), REGISTRY_FILE_NAME);
public static final String MULTI_SDK_FILE_PATH = PathUtil.get(
Config.INSTALL_MANAGER_CONFIG, MULTI_SDK_FILE_NAME);
- public static final String REPO_HISTORY_FILE_PATH = PathUtil.get(
- Config.INSTALL_MANAGER_CONFIG, REPO_HISTORY_FILE_NAME);
private static final String INSTALLED_PATH_KEY = "TIZEN_SDK_INSTALLED_PATH";
private static final String SDK_DATA_PATH_KEY = "TIZEN_SDK_DATA_PATH";
public static String sdkDataPath = "";
// public static String sdkDataPath = getSDKinfoBySDKPath(Config.getInstance().getTargetDir());
private static ArrayList<String> sdkPathList = getSDKPath();
- private static ArrayList<String> repoHistory = getRepoHistory();
- private final static int REPO_HISTORY_COUNT = 5;
/**
* Exports target path to the registry file.
return sdkPath;
}
- public static ArrayList<String> getRepoHistory() {
- File repoHistoryFile = new File(REPO_HISTORY_FILE_PATH);
- ArrayList<String> repoHistory = new ArrayList<String>();
- if (repoHistoryFile.exists()) {
- repoHistory = getPathFromRegistryFile(REPO_HISTORY_FILE_PATH);
- }
- return repoHistory;
- }
-
private static ArrayList<String> getPathFromRegistryFile(String filePath) {
ArrayList<String> sdkPaths = new ArrayList<String>();
InputStream is = null;
if (bw != null) {
try {
bw.close();
+
} catch (IOException e) {
Log.ExceptionLog(e);
}
}
}
- public static void saveRepoInfo(String repository) {
- if (repository == null || repository.isEmpty()) {
- Log.err("Repository is invalid for registering : " + repository);
- throw new IMFatalException(ErrorCode.INVALID_REPOSITORY_FOR_HISTORY);
- }
-
- File repoHistoryFile = new File(REPO_HISTORY_FILE_PATH);
- if (!repoHistoryFile.exists() || Options.doInstallNoUI || Options.doRemoveNoUI) {
- try {
- repoHistoryFile = PathUtil.makeNewFile(REPO_HISTORY_FILE_PATH);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- return;
- }
- } else {
- if (repoHistory.contains(repository)) {
- return;
- }
- }
-
- if (repoHistoryFile == null) {
- return;
- }
-
- removeOldHistory();
-
- BufferedWriter bw = null;
- try {
- FileWriter fw = new FileWriter(repoHistoryFile);
- bw = new BufferedWriter(fw);
- if (!repoHistory.isEmpty()) {
- for (String repo : repoHistory) {
- if (!repo.equalsIgnoreCase("")) {
- bw.write(repo);
- bw.newLine();
- }
- }
- }
- bw.write(repository);
- bw.newLine();
- bw.flush();
- } catch (IOException e) {
- Log.err("Cannot register to file. " + repoHistoryFile.getAbsolutePath());
- throw new IMFatalException(ErrorCode.CANNOT_REGISTER_TARGET_DIR);
- } finally {
- if (bw != null) {
- try {
- bw.close();
- repoHistory.add(repository);
- Log.log("Package server address history. => " + repoHistory);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- }
- }
- }
-
- private static void removeOldHistory() {
- while (repoHistory.size() >= REPO_HISTORY_COUNT) {
- repoHistory.remove(0);
- }
- }
-
/**
* Get installed version.
* @return
*/
private boolean isInstallManager(String path) {
if (path.contains(InstallManagerConstants.INSTALLMANAGER_JAR_FILE_NAME)
- || path.contains(InstallManagerConstants.INSTALLMANAGER_BINARY_PREFIX)
- || path.contains(InstallManagerConstants.INSTALLMANAGERV2_JAR_FILE_NAME)) {
+ || path.contains(InstallManagerConstants.INSTALLMANAGER_BINARY_PREFIX)) {
return true;
} else {
return false;
-/*
-* InstallManager
-*
-* Copyright (C) 2013 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Munkyu Im <munkyu.im@samsung.com>
-* YeongKyoon Lee <yeongkyoon.lee@samsung.com>
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
+/**
+ *
+ *
+ * Copyright (C) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:
+ * Munkyu Im <munkyu.im@samsung.com>
+ * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
package org.tizen.installmanager.lib.mac;
-/*
-* InstallManager
-*
-* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Wooyoung Cho <wooyoung1.cho@samsung.com>
-* Shihyun Kim <shihyun.kim@samsung.com>
-* Taeyoung Son <taeyoung2.son@samsung.com>
-* Yongsung kim <yongsung1.kim@samsung.com>
-*
- * Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
-
-package org.tizen.installmanager.pkg.lib;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.tizen.installmanager.core.Config;
-import org.tizen.installmanager.core.Config.ServerType;
-import org.tizen.installmanager.core.DistributionController;
-import org.tizen.installmanager.core.IMExitException;
-import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.InstallManager;
-import org.tizen.installmanager.core.Options;
-import org.tizen.installmanager.core.SDKExtensionInfo;
-import org.tizen.installmanager.lib.Downloader;
-import org.tizen.installmanager.lib.ErrorController;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Registry;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.exception.IMNetworkConnectException;
-import org.tizen.installmanager.lib.exception.IMNetworkDownloadException;
-import org.tizen.installmanager.pkg.lib.darwin.DarwinPackageManager;
-import org.tizen.installmanager.pkg.lib.linux.LinuxPackageManager;
-import org.tizen.installmanager.pkg.lib.win.WindowsPackageManager;
-import org.tizen.installmanager.pkg.model.IMPackageNotFound;
-import org.tizen.installmanager.pkg.model.Package;
-import org.tizen.installmanager.pkg.model.PackageSet;
-import org.tizen.installmanager.pkg.model.Properties;
-import org.tizen.installmanager.pkg.model.Property;
-import org.tizen.installmanager.pkg.model.PropertySection;
-import org.tizen.installmanager.pkg.model.Snapshot;
-import org.tizen.installmanager.pkg.model.Version;
-import org.tizen.installmanager.util.PathUtil;
-
-
-/**
- * Package Manager
- * <p>
- * This class provides various methods for managing packages.
- * Most of the methods handle packages symbolically. Namely, they are identified by its package name not the object if not specially mentioned.
- * <p>
- * Some methods are carefully designed to preserve the order of packages because the order of packages is important sometimes.
- * See the details in the documentation of each methods.
- *
- * @author Shihyun Kim <shihyun.kim@samsung.com>
- *
- */
-public abstract class PackageManager {
- /**
- * Packages that are already installed in the system.
- */
- private PackageSet installedPackages;
- /**
- * packages that are available in the repositories(package servers).
- */
- private PackageSet repoPackages;
- /**
- * packages that combines <code>installedPackages</code> and <code>repoPackages</code>.
- * This includes only the latest package from the several versions of a package.
- * This is used as the universe set(base set) of packages available.
- */
- private PackageSet recentPackages;
-
- /**
- * Packages from extension package server.111
- */
- private PackageSet extensionPackages = new PackageSet();
-
- private static PackageManager pm = null;
-
- //repository that installed.
- private static String installedRepository = null;
- private String currentRepository = null;
-
- public boolean isInstallInstallManager = false;
-
- public enum State {
- INSTALL,
- UNINSTALL;
- }
-
- /**
- * It is a position where can installmanager get the package list file
- */
- private enum Style {
- NETWORK,
- IMAGE,
- EXTRA;
- }
-
- //abstract method
- /**
- * Get package list file name.
- * @return
- */
- abstract public String getPackageListFileName();
-
- /**
- * Creates and initializes Package Manager instance.
- * This combines installed packages and packages from the repositories.
- *
- * @param installed a file in which installed packages are specified. This can be <code>null</code> if no packages are installed.
- * @param repoPackagesUrls a collection of URLs of repositories(package servers). This cannot be <code>null</code>.
- * @throws IOException if temporary file cannot created
- */
- protected PackageManager(File installed, Collection<String> repoPackagesUrls) throws IOException {
- setInstalledPackageList(installed);
- loadRepositoryPackageList(repoPackagesUrls);
- getRecentPackages();
-
- if (repoPackagesUrls.size() > 0) {
- setRepository(repoPackagesUrls.iterator().next());
- }
- }
-
- private void setRepository(String repository) {
- if (installedRepository == null) {
- installedRepository = repository;
- }
-
- currentRepository = repository;
- return;
- }
-
- /**
- * set repository url to each package.(reposistory url plus package name is complete url.)
- * @param repoPackagesUrls
- * @throws IOException
- */
- public void loadRepositoryPackageList(Collection<String> repoPackagesUrls) throws IOException {
- HashMap<String,List<PropertySection>> r2sMap = null;
- ServerType serverType = Config.getInstance().getConfigFile().getServerType();
-
- if (serverType == ServerType.LOCAL) { // Using SDK Image
- r2sMap = getRepositoryAndPackageList(repoPackagesUrls, Style.IMAGE);
- } else {
- r2sMap = getRepositoryAndPackageList(repoPackagesUrls, Style.NETWORK);
- }
- setRepoPackages(r2sMap);
-
- //Add EXTRAS for extention packages
- addExtraMetaPackage();
- }
-
- /**
- * set repository url to each package.(reposistory url plus package name is complete url.)
- * @param repoPackagesUrls Packgae server list.
- * @throws IOException
- */
- public void loadExtensionPackages() throws IOException {
- HashMap<String,List<PropertySection>> repoToSectionsMap =
- getRepositoryAndPackageList(SDKExtensionInfo.getInstance().getExtensionRepositories().keySet(),
- Style.EXTRA);
-
- //Update extension packages.
- if (repoToSectionsMap != null/*adall && !repoToSectionsMap.isEmpty()*/) {
- setExtensionPackages(repoToSectionsMap);
- setExtensionPackagesToRecentPackages();
- } else {
- return;
- }
- }
-
- private HashMap<String,List<PropertySection>> getRepositoryAndPackageList
- (Collection<String> repoPackagesUrls, Style style) throws IOException {
- PropertyParser parser = new PropertyParser();
- HashMap<String,List<PropertySection>> r2sMap = new HashMap<String,List<PropertySection>>();
-
- if(repoPackagesUrls != null) {
- for(String repo : repoPackagesUrls) {
- URL packageListURL = getPackageListPath(repo, style);
- File packageListFile = null;
-
- if (style != Style.EXTRA) { // Snapshot, Image case
- packageListFile = downloadPackageListFile(packageListURL);
- if(packageListFile != null) {
- r2sMap.put(repo, parser.readFromFile(packageListFile));
- }
- } else { // Extra extension case
- // Get package list file from cache.
- URL extraPackageListURL = getPackageListPath(SDKExtensionInfo.getInstance().getExtraPackageListPath(repo), style);
- packageListFile = downloadPackageListFile(extraPackageListURL);
- if (packageListFile != null) { // If cache does not exist, install manager get it from remote repository.
- r2sMap.put(repo, parser.readFromFile(packageListFile));
- } else {
- // InstallManager can get package list file from remote repository.
- packageListFile = downloadPackageListFile(packageListURL);
- if (packageListFile != null) {
- r2sMap.put(repo, parser.readFromFile(packageListFile));
- }
- }
- }
- }
- } else {
- Log.log("Cannot find repository. This is local installer.");
- }
-
- return r2sMap;
- }
-
- private File downloadPackageListFile(URL packageListURL) throws IOException {
- if (packageListURL == null) {
- return null;
- }
- Downloader dl = InstallManager.getDownloader();
- File tmp = null;
-
- if (Options.onlyDownload) {
- tmp = new File(PathUtil.getFromCurrDir(getPackageListFileName()));
- } else {
- tmp = File.createTempFile("Packages", ".list");
- tmp.deleteOnExit();
- }
-
- long size = 0;
- try {
- size = dl.download(packageListURL, tmp.getAbsolutePath(), null);
- } catch (IMNetworkConnectException e) {
- Log.ExceptionLog(e);
- return null;
- } catch (IMNetworkDownloadException e) {
- Log.ExceptionLog(e);
- return null;
- }
-
- if (size > 0) {
- return tmp;
- } else {
- return null;
- }
- }
-
- private void setExtensionPackages(HashMap<String,List<PropertySection>> repoToSectionsMap) {
- extensionPackages = new PackageSet();
- boolean result = setPackages(extensionPackages, repoToSectionsMap, true);
- if (!result) {
- Log.err("Cannot set extension packages.");
- }
- }
-
- private void addExtraMetaPackage() {
- if (repoPackages == null) {
- repoPackages = new PackageSet();
- } else {
- if (repoPackages.hasPackageByName("EXTRAS")) {
- return;
- }
- }
-
- Properties props = new Properties();
-
- props.add(new Property(Package.FIELD_PACKAGE, "EXTRAS"));
- props.add(new Property(Package.FIELD_LABEL, "Extras"));
- props.add(new Property(Package.FIELD_ATTRIBUTE, "root"));
- props.add(new Property(Package.FIELD_PACKAGE_SIZE, "0"));
- props.add(new Property(Package.FIELD_UNCOMPRESSED_SIZE, "0"));
-
- Package extraPackage = new Package(props);
- repoPackages.add(extraPackage);
- }
-
- /**
- * Get packages from extension package server.
- * @return set of packages
- */
- public PackageSet getExtensionPackages() {
- return extensionPackages;
- }
-
- public PackageSet getInstalledExtensionPackages() {
- PackageSet extensionPackages = new PackageSet();
- PackageSet pkgs = this.getInstalledPackages();
-
-
- for (Package pkg : pkgs) {
- if (pkg.isExtensionPackage()) {
- extensionPackages.add(pkg);
- }
- }
-
- return extensionPackages;
- }
-
- /**
- * Set installed packages.
- * @param installedPackageListPath
- */
- public void setInstalledPackageList(File installedPackageListPath) {
- List<PropertySection> sectionsInstalled = null;
- PropertyParser parser = new PropertyParser();
-
- if(installedPackageListPath != null) {
- sectionsInstalled = parser.readFromFile(installedPackageListPath);
- } else {
- sectionsInstalled= new LinkedList<PropertySection>();
- }
-
- if (sectionsInstalled != null) {
- setInstalledPackageList(sectionsInstalled);
- }
- }
-
- /**
- * Set installed packages
- * @param sections
- */
- private void setInstalledPackageList(List<PropertySection> sections) {
- installedPackages = new PackageSet();
-
- for(PropertySection sect : sections) {
- installedPackages.add(new Package(sect.getProperties()));
- }
- }
-
- public void installedPackagesFree() {
- installedPackages = null;
- }
-
- /**
- * Get package list file path from url.
- * @param url
- * @return Full url path
- */
- private URL getPackageListPath(String url, Style style) {
- if (url == null || url.isEmpty()) {
- return null;
- } else {
- String packageListURL = "";
-
- if (style == Style.NETWORK) {
- String snapshotPath = Config.getInstance().getSnapshotPath();
-
- if (snapshotPath == null || snapshotPath.isEmpty() || snapshotPath.equalsIgnoreCase("null")) {
- String distribution = Config.getInstance().getConfigFile().getDistribution();
-
- Snapshot latestSnapshot = DistributionController.getInstance().getLatestSnapshot(distribution);
- if (latestSnapshot == null) {
- return null;
- } else {
- snapshotPath = latestSnapshot.getPath();
- }
- }
-
- if (snapshotPath != null) {
- packageListURL = PathUtil.addURLPath(url,
- snapshotPath,
- getPackageListFileName());
- }
- } else {
- packageListURL = PathUtil.addURLPath(url, getPackageListFileName());
- }
-
- try {
- return new URL(packageListURL);
- } catch (MalformedURLException e) {
- Log.ExceptionLog(e);
- return null;
- }
- }
- }
-
-
-
- /**
- * @return installed packages
- */
- public PackageSet getInstalledPackages() {
- return (PackageSet) installedPackages.clone();
- }
-
- /**
- * Set packages of repository
- * @param sections
- */
- protected void setRepoPackages( Map<String,List<PropertySection>> repoToSectionsMap) {
- repoPackages = new PackageSet();
- boolean result = setPackages(repoPackages, repoToSectionsMap, false);
- if (!result) {
- Log.err("Cannot find repository. Please check your repository.");
- ErrorController.setError(ErrorCode.CANNOT_FIND_REPOSITORY);
- }
- }
-
- /**
- * Set packages to <code>destPackages</code>
- * @param destPackages It is set of packages.
- * @param repoToSectionsMap It is added to <code>destPackages</code>
- */
- public boolean setPackages(PackageSet destPackages, Map<String,List<PropertySection>> repoToSectionsMap, boolean isExtensionPackage) {
- if (destPackages == null) {
- destPackages = new PackageSet();
- }
-
- if (repoToSectionsMap == null || repoToSectionsMap.isEmpty()) {
- return false;
- }
-
- for(String repoBaseUrl : repoToSectionsMap.keySet()) {
- for(PropertySection sect : repoToSectionsMap.get(repoBaseUrl)) {
- Package pkg = new Package(sect.getProperties(), repoBaseUrl);
- Log.log("Check valid package version. => " + pkg);
- pkg.getVersion(); // Vaild version check.
- if (isExtensionPackage) {
- if (pkg.getAttribute().equalsIgnoreCase("extra")) {
- pkg.setExtensionServer(repoBaseUrl);
- destPackages.add(pkg);
- }
- } else {
- destPackages.add(pkg);
-
- }
- }
- }
- return true;
- }
-
- /**
- * @return packages of repository
- */
- public PackageSet getRepoPackages() {
- return repoPackages;
- }
-
- /**
- * Set repository packages.
- * @param packageSet
- */
- public void setRepoPackages(PackageSet packageSet) {
- repoPackages = packageSet;
- }
-
- /**
- * @return root meta packages of repository
- */
- public PackageSet getRootMetaPackagesOfRepository() {
- PackageSet clone = (PackageSet) repoPackages.clone();
-
- // Repository packages should not have extension packages.
- for (Package pkg : repoPackages) {
- if (pkg.isExtensionPackage()) {
- clone.remove(pkg);
- }
- }
-
- repoPackages = clone;
-
- return rootMeta(repoPackages);
- }
-
- /**
- * Get install meta packages from repository.
- * @return
- */
- public PackageSet getInstallMetaPackagesOfRepository() {
- return installMeta(repoPackages);
- }
-
- /**
- * Get root meta package from extension package server()
- */
- public PackageSet getRootMetaPackagesOfExtensionServer() {
- return rootMeta(extensionPackages);
- }
-
- /**
- * @return recent packages. This includes the latest packages among all packages from currently
- * installed packages and packages of repository if a package has several versions.
- */
- public PackageSet getRecentPackages() {
- Log.log("Repo packages : " + repoPackages);
- if(recentPackages == null) {
- recentPackages = new PackageSet();
- for(Package ip : installedPackages) {
- if(repoPackages != null && repoPackages.contains(ip)) {
- Package rp = repoPackages.getPackage(ip);
- if(ip.getVersion().compareTo(rp.getVersion()) > 0) {
- recentPackages.add(ip);
- } else {
- recentPackages.add(rp);
- }
- } else if (extensionPackages != null && extensionPackages.contains(ip)) {
- Package ep = extensionPackages.getPackage(ip);
- if(ip.getVersion().compareTo(ep.getVersion()) > 0) {
- recentPackages.add(ip);
- } else {
- recentPackages.add(ep);
- }
- } else {
- recentPackages.add(ip);
- }
- }
-
- if (repoPackages != null) {
- for(Package rp : repoPackages) {
- if(!recentPackages.contains(rp)) {
- recentPackages.add(rp);
- }
- }
- }
- }
- return recentPackages;
- }
-
- private void setExtensionPackagesToRecentPackages() {
- if (recentPackages == null) {
- recentPackages = new PackageSet();
- }
-
- for(Package ip : installedPackages) {
- if (extensionPackages != null && extensionPackages.contains(ip)) {
- Package ep = extensionPackages.getPackage(ip);
- if(ip.getVersion().compareTo(ep.getVersion()) > 0) {
- recentPackages.add(ip);
- } else {
- recentPackages.add(ep);
- }
- } else {
- recentPackages.add(ip);
- }
- }
- }
-
-
-
- // Methods for update process
- /**
- * except package from installed package list.
- * @param pkg
- * @return
- */
- public boolean exceptPackageFromInstalledPackages(Package pkg) {
- return installedPackages.remove(pkg);
- }
-
- /**
- * Add package to installed package list.
- * @param pkg
- * @return
- */
- public boolean addPackageToInstalledPackages(Package pkg) {
- installedPackages.remove(pkg);
- return installedPackages.add(pkg);
- }
-
- /**
- * @return updatable packages among installed packages
- */
- public PackageSet getUpdatableInstalledPackages() {
- PackageSet updatables = new PackageSet();
- for(Package ip : installedPackages) {
- if(repoPackages.contains(ip)) {
- Package rp = repoPackages.getPackage(ip);
- if(rp.getVersion().compareTo(ip.getVersion()) != 0) {
- updatables.add(ip);
- }
- }
- }
- return updatables;
- }
-
- /**
- * if pkg is updatable, return true. else return false.
- * @param pkg
- * @return
- */
- public boolean isUpdatable(Package pkg) {
- if (pkg == null) {
- return false;
- }
-
- PackageSet updatables = getUpdatableInstalledPackages();
- if (updatables.contains(pkg)) {
- return true;
- } else {
- return false;
- }
- }
-
- public boolean isInstalledPackage(Package pkg) {
- if (pkg == null) {
- return false;
- }
-
- if (installedPackages.contains(pkg)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * If package set of repository is empty, return true;
- * @return
- */
- public boolean isRepoPackagesEmpty() {
- if (repoPackages == null || repoPackages.isEmpty()) {
- return true;
- } else if (repoPackages.size() == 1) {
- if (repoPackages.getPackageByName("EXTRAS") != null) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
- /**
- * If pkg is installed, return true. else return false
- * @param pkg
- * @return
- */
- public boolean isInstalledVersion(Package pkg) {
- Package installedPackage = installedPackages.getPackage(pkg);
- if (installedPackage == null) {
- return false;
- } else {
- Version installedVersion = installedPackage.getVersion();
- if (installedVersion.compareTo(pkg.getVersion()) == 0) {
- return true;
- } else {
- return false;
- }
- }
- }
-
- public PackageSet getRecentMetaPackages() {
- PackageSet recentPackages = union(repoPackages, installedPackages);
- return rootMeta(recentPackages);
- }
-
- /**
- * @return meta packages among installed packages
- */
- public PackageSet getInstalledMetaPackages() {
- return meta(installedPackages);
- }
-
- public List<String> getInstalledMetaNames() {
- ArrayList<String> installedMetaNames = new ArrayList<String>();
-
- for (Package meta : getInstalledMetaPackages()) {
- installedMetaNames.add(meta.getPackageName());
- }
-
- return installedMetaNames;
- }
-
- public List<String> getInstalledPkgNames() {
- ArrayList<String> installedPkgNames = new ArrayList<String>();
-
- for (Package pkg : getInstalledPackages()) {
- installedPkgNames.add(pkg.getPackageName());
- }
-
- return installedPkgNames;
- }
-
- /**
- * @return meta packages among all recent packages
- */
- public PackageSet getAllMetaPackages() {
- PackageSet allMeta = new PackageSet();
-
- PackageSet recentMeta = meta(recentPackages);
- PackageSet extensionMeta = meta(extensionPackages);
-
- allMeta.addAll(recentMeta);
- allMeta.addAll(extensionMeta);
-
- return allMeta;
- }
-
- public PackageSet getLeafMetaPackages() {
- PackageSet allMetas = meta(recentPackages);
-
- PackageSet leafMetas = new PackageSet();
- for (Package meta : allMetas) {
- //if (depends size <= 0) is leaf
- if (meta.getDependentPackageNames().size() <= 0) {
- leafMetas.add(meta);
- } else {
- if (!isChildrenAllMeta(meta)) {
- leafMetas.add(meta);
- }
- }
- }
-
- return leafMetas;
- }
-
- public PackageSet getInstalledLeafMetaPackages() {
- PackageSet allMetas = meta(installedPackages);
-
- PackageSet leafMetas = new PackageSet();
- for (Package meta : allMetas) {
- //if (depends size <= 0) is leaf
- if (meta.getDependentPackageNames().size() <= 0) {
- leafMetas.add(meta);
- } else {
- if (!isChildrenAllMeta(meta)) {
- leafMetas.add(meta);
- }
- }
- }
-
- return leafMetas;
- }
-
- private boolean hasMetaPackagesInChildren(Package pkg) {
- PackageSet dependPackages = getDependsPackages(pkg);
-
- if (dependPackages == null) {
- return true;
- } else {
- for (Package dPackage : dependPackages) {
- if (dPackage.isMeta()) {
- return true;
- }
- }
- return false;
- }
- }
- private boolean isChildrenAllMeta(Package pkg) {
- PackageSet dependPackages = getDependsPackages(pkg);
-
- if (dependPackages == null) {
- return true;
- } else {
- for (Package dPackage : dependPackages) {
- if (!dPackage.isMeta()) {
- return false;
- }
- }
- return true;
- }
- }
-
- private PackageSet getDependsPackages(Package pkg) {
- PackageSet dependPackages = new PackageSet();
- if (pkg == null) {
- return dependPackages;
- }
-
- Collection<String> depends = pkg.getDependentPackageNames();
-
- try {
- dependPackages = recentPackages.getPackagesByNames(depends);
- } catch (IMPackageNotFound e) {
- Log.ExceptionLog(e);
- }
- return dependPackages;
- }
-
- /**
- * @return partner meta packages among all meta packages.
- */
- public PackageSet getPartnerMetaPackages() {
- PackageSet allMetas = meta(recentPackages);
-
- PackageSet partnerMeta = new PackageSet();
- for (Package meta : allMetas) {
- if (meta.isPartnerMeta()) {
- partnerMeta.add(meta);
- }
- }
-
- return partnerMeta;
- }
-
- /**
- * @return public meta packages among all meta packages.
- */
- public PackageSet getPublicMetaPackages() {
- PackageSet allMetas = meta(recentPackages);
-
- PackageSet publicMeta = new PackageSet();
- for (Package meta : allMetas) {
- if (meta.isPublicMeta()) {
- publicMeta.add(meta);
- }
- }
-
- return publicMeta;
- }
-
- /**
- * Get dependency packages of installable package.
- * @param pkgs installable packages.
- * @return
- */
- public PackageSet getDependsPackagesFromRepository(PackageSet pkgs) {
- return dep(pkgs, State.INSTALL);
- }
-
- /**
- * @return meta packages that have no updates considering its dependents
- */
- public PackageSet getNotUpdatableMetaPackages() {
- PackageSet noup = new PackageSet();
- for(Package m : getAllMetaPackages()) {
- if(!isMetaUpdatable(m)) {
- noup.add(m);
- }
- }
- return noup;
- }
-
- public PackageSet getNotInstallableAndNotUpdatablePackages() {
- PackageSet notPkg = new PackageSet();
-
- for (Package m :getAllMetaPackages()) {
- if (isMetaRemovable(m) && !isMetaUpdatable(m)) {
- notPkg.add(m);
- }
- }
-
- return notPkg;
- }
-
- /**
- * @return meta packages thar are updatable among installed packages
- */
- public PackageSet getUpdatableMetaPackages() {
- PackageSet allMetas = getAllMetaPackages();
- PackageSet notUpdatableMetas = getNotUpdatableMetaPackages();
- return diff(allMetas, notUpdatableMetas);
- }
-
- public PackageSet getUpdatableInstalledMetaPackages() {
- PackageSet installedMeta = getInstalledMetaPackages();
- PackageSet updatableMeta = getUpdatableMetaPackages();
- return intersect(installedMeta, updatableMeta);
- }
-
- /**
- * @param selectedMetas
- * @return packages that will be installed after update/install resulted from the selected meta packages
- */
- public PackageSet getResultPackagesAfterUpdate(PackageSet selectedMetas) {
- PackageSet deps = dep(selectedMetas, State.INSTALL);
- PackageSet conflicts = conflictPackages(selectedMetas);
- PackageSet remainedFromConflicts = diff(installedPackages, conflicts);
- return union(deps, remainedFromConflicts);
- }
-
- /**
- * Get updatable packages in update process except new packages.
- * @param packageSet
- * @return
- */
- public PackageSet getUpdatablePackagesInUpdate(PackageSet packageSet) {
- PackageSet result = dep(packageSet, State.INSTALL);
- PackageSet up = getUpdatableInstalledPackages();
- return intersect(result, up);
- }
-
- /**
- * Get removable packages in snapshot process except new packages.
- * @param selectedMetas
- * @return
- */
- public PackageSet getRemovablePackagesInSnapshot(PackageSet selectedMetas) {
- PackageSet result = dep(selectedMetas, State.UNINSTALL);
- PackageSet pkgSet = getdifferentVersionFromInstalledPackages(result);
-
- return pkgSet;
- }
-
- /**
- * check version between sourcePackages and installedPackages, and return different version packages.
- * @param pkgs
- * @return Different version packages among installed packages
- */
- public PackageSet getdifferentVersionFromInstalledPackages(PackageSet pkgs) {
- PackageSet depPkgs = dep(pkgs, State.INSTALL);
- PackageSet otherVersionPackages = new PackageSet();
- for(Package ip : installedPackages) {
- if(depPkgs.contains(ip)) {
- Package rp = depPkgs.getPackage(ip);
- if(rp.getVersion().compareTo(ip.getVersion()) != 0) {
- otherVersionPackages.add(ip);
- }
- }
- }
-
- return otherVersionPackages;
- }
-
- /**
- * @param selectedMetas
- * @return packages to newly install in update process by the selected meta packages
- */
- public PackageSet getInstallablePackages(PackageSet selectedMetas) {
- PackageSet installablePackages = null;
- if (isReInstall()) {
- installablePackages = dep(selectedMetas, State.INSTALL);
- } else if (Config.isSupportMultiSDK()) {
- if (Config.status == Config.Status.INSTALL) {
- installablePackages = dep(selectedMetas, State.INSTALL);
- } else if (Config.status == Config.Status.UPDATE) {
- PackageSet result = getResultPackagesAfterUpdate(selectedMetas);
- installablePackages = diffPackageWithVersion(result, installedPackages);
- }
- } else {
- PackageSet result = getResultPackagesAfterUpdate(selectedMetas);
- installablePackages = diffPackageWithVersion(result, installedPackages);
- }
-
- return installablePackages;
- }
-
- /**
- * @param selectedMetas
- * @return packages to update in update process by the selected meta packages
- */
- public PackageSet getToUpdatePackagesInUpdate(PackageSet selectedMetas) {
- PackageSet result = getResultPackagesAfterUpdate(selectedMetas);
- PackageSet up = getUpdatableInstalledPackages();
- return intersect(result, up);
- }
-
-
- /**
- * Get conflict packages that installed.
- * @param packageSet
- * @return packages to remove in update process by conflicts with the selected meta packages
- */
- public PackageSet getConflictPackagesInUpdate(PackageSet packageSet) {
- return intersect(installedPackages, getConflictPackages(packageSet));
- }
-
- /**
- * Get conflict packages that contain reverse depends packages.
- * @param packageSet
- * @return
- */
- public PackageSet getConflictPackages(PackageSet packageSet) {
- PackageSet conflicts = conflictPackages(packageSet);
-
- conflicts.addAll(reverseDep(conflicts));
- return intersect(getConflictMetaPackages(), conflicts);
- }
-
- /**
- * Get conflict packages that contain reverse depends packages.
- * @param packageSet
- * @return
- */
- public PackageSet getConflictPackages(Package pkg) {
- PackageSet conflicts = conflictPackages(pkg);
-
- conflicts.addAll(reverseDep(conflicts));
- return intersect(getConflictMetaPackages(), conflicts);
- }
-
- private PackageSet getConflictMetaPackages() {
- PackageSet leafMetas = new PackageSet();
- for (Package meta : recentPackages) {
- //if (depends size <= 0) is leaf
- if (meta.getDependentPackageNames().size() <= 0) {
- leafMetas.add(meta);
- } else {
- if (!hasMetaPackagesInChildren(meta)) {
- leafMetas.add(meta);
- }
- }
- }
-
- return leafMetas;
- }
-
- // Methods for remove process
-
- /**
- * @return packages that can be removed
- */
- public PackageSet getRemovableMetaPackages() {
- return getInstalledMetaPackages();
- }
-
- public PackageSet getInstallableMetaPackagesInSnapshot() {
- PackageSet repoMetas = meta(repoPackages);
-
- PackageSet installableMeta = new PackageSet();
- for (Package metaPackage : repoMetas) {
- if (isMetaInstallable(metaPackage)) {
- installableMeta.add(metaPackage);
- }
- }
-
- return installableMeta;
- }
-
- /**
- * Get remove packages by selected metas.
- * @param selectedMetas
- * @return packages to remove in remove process
- */
- public PackageSet getToRemovePackagesInRemove(PackageSet selectedMetas) {
- if (Options.doRemoveNoUI) {
- // When installmanager removes specific packages, it should consider package dependency.
- // For example, 'sdb' package depends on 'tizen-web-cli' and 'tizen-native-cli'.
- // In this case, when installmanager removes 'tizen-web-cli' package, 'sdb' package should
- // not be removed because of 'tizen-native-cli'.
-
- // Get candidate packages to remove.
- PackageSet depMetas = getDependMetas(selectedMetas, State.UNINSTALL);
- PackageSet dep = dep(depMetas, State.UNINSTALL);
- PackageSet mayRemove = intersect(installedPackages, dep);
-
- // Get packages to remain.
- PackageSet remainMetas = diff(getInstalledLeafMetaPackages(), depMetas);
- PackageSet remainPackages = dep(remainMetas, State.UNINSTALL);
-
- // Get packages to remove.
- PackageSet toRemove = diff(mayRemove, remainPackages);
- return reverseSet(toRemove);
- } else {
- // InstallManager removes whole SDK.
- PackageSet dep = dep(selectedMetas, State.UNINSTALL);
- return reverseSet(dep);
- }
- }
-
- /**
- * @param selectedMetas
- * @return packages that will be remained after remove resulted from the selected meta packages
- */
- public PackageSet getResultPackagesAfterRemove(PackageSet selectedMetas) {
- return diff(getInstalledMetaPackages(), selectedMetas);
- }
-
- // set handling methods
-
- /**
- * @param pset
- * @return meta packages in the package set
- */
- private PackageSet meta(PackageSet pset) {
- PackageSet metas = new PackageSet();
-
- if (pset == null) {
- return metas;
- }
-
- for(Package p : pset) {
- if(p.isMeta()) {
- metas.add(p);
- }
- }
- return metas;
- }
-
- /**
- * @param pset
- * @return meta packages in the package set
- */
- private PackageSet rootMeta(PackageSet pset) {
- PackageSet metas = new PackageSet();
- for(Package p : pset) {
- if (!Options.doTest) {
- if(p.isRootMeta() || p.isExtraMeta() || p.isPublicMeta()) {
- metas.add(p);
- }
- } else {
- if(p.isRootMeta() || p.isExtraMeta() || p.isPublicMeta() || p.isTestMeta()) {
- metas.add(p);
- }
- }
- }
- return metas;
- }
-
- /**
- * @param pset
- * @return meta packages in the package set
- */
- private PackageSet installMeta(PackageSet pset) {
- PackageSet metas = new PackageSet();
- for(Package p : pset) {
- if(p.isInstallMeta()) {
- metas.add(p);
- }
- }
- return metas;
- }
-
- /**
- * Get dependency package list from p.
- * @param p a package
- * @return all the packages that the given package depends on directly or indirectly
- */
- private PackageSet dep(Package p, State state) {
- // depth first traverse on dependency graph
- PackageSet dep = new PackageSet();
- Stack<Package> pkgStack = new Stack<Package>();
- pkgStack.push(p);
- while(!pkgStack.isEmpty()) {
- Package pkg = pkgStack.pop();
-
- if(!dep.contains(pkg)) {
- dep.add(pkg);
- PackageSet depPackageSet = new PackageSet();
- try {
- if (state == State.INSTALL) {
- if (repoPackages.contains(pkg)) {
- depPackageSet = repoPackages.getPackagesByNames(pkg.getDependentPackageNames());
- } else if (extensionPackages.contains(pkg)) {
- depPackageSet = extensionPackages.getPackagesByNames(pkg.getDependentPackageNames());
- }
- } else if (state == State.UNINSTALL){
- depPackageSet = installedPackages.getPackagesByNames(pkg.getDependentPackageNames());
- } else {
- Log.err("State class have two state(INSTALL/UNINSTALL) ");
- throw new IMFatalException(ErrorCode.UNKOWN_ERROR);
- }
- } catch (IMPackageNotFound e) {
- Log.err("Finding dependents: "+p+": Package does not exist: " + e.getPackageName()+ " or "+ pkg.getDependentPackageNames());
- throw new IMFatalException(ErrorCode.CANNOT_FIND_PACKAGE);
- }
-
- for(Package depPkg : depPackageSet) {
- if(p.equals(depPkg)) {
- Log.err("Circular dependency found: "+p);
- throw new IMFatalException(ErrorCode.CIRCULAR_PACKAGE_DEPENDENCY);
- }
- pkgStack.push(depPkg);
- }
- } else {
- // already visited.
- addDependsSet(dep, pkg);
- }
- }
-
- return reverseSet(dep);
- }
-
- private PackageSet reverseDep(PackageSet packages) {
- PackageSet reversePackages = new PackageSet();
-
- for (Package pkg : packages) {
- reversePackages.addAll(reverseDep(pkg));
- }
-
- return reversePackages;
- }
-
- /**
- * Need reverse depends when remove.
- * @param p
- * @return
- */
- private PackageSet reverseDep(Package p) {
- // depth first traverse on dependency graph
- PackageSet reverseDep = new PackageSet();
- Stack<Package> pkgStack = new Stack<Package>();
- pkgStack.push(p);
- while(!pkgStack.isEmpty()) {
- Package pkg = pkgStack.pop();
-
- if(!reverseDep.contains(pkg)) {
- reverseDep.add(pkg);
-
- for (Package recentPkg : recentPackages) {
- Collection<String> dependsList = recentPkg.getDependentPackageNames();
- for (String pkgName : dependsList) {
- if (pkgName.equals(pkg.getPackageName())) {
- pkgStack.push(recentPkg);
- break;
- }
- }
-
- }
- } else {
- // already visited
- addDependsSet(reverseDep, pkg);
- }
- }
-
- return reverseDep;
- }
-
- /**
- * Remove saved package and save package at the end of set.
- * @param dependsSet
- * @param pkg
- */
- private void addDependsSet(PackageSet dependsSet, Package pkg) {
- if (dependsSet.contains(pkg)) {
- dependsSet.remove(pkg);
- }
-
- dependsSet.add(pkg);
- }
-
- /**
- * reverse package list.
- * @param pkgSet
- * @return
- */
- public PackageSet reverseSet(PackageSet pkgSet) {
- if (pkgSet == null) {
- return null;
- }
-
- Stack<Package> stack = new Stack<Package>();
- for (Package pkg : pkgSet) {
- stack.push(pkg);
- }
-
- PackageSet reverseSet = new PackageSet();
-
- while(!stack.isEmpty()) {
- reverseSet.add(stack.pop());
- }
-
- return reverseSet;
- }
-
- /**
- * @param pset package set
- * @return all the packages that the given packages depends on directly or indirectly
- */
- private PackageSet dep(PackageSet pset, State state) {
- PackageSet dep = new PackageSet();
- for(Package p : pset) {
- dep.addAll(dep(p, state));
- }
- return dep;
- }
-
- /**
- * Get conflict package list from p.
- * @param p
- * @return packages that conflict with the given package directly or indirectly
- */
- public PackageSet conflictPackages(Package p) {
- PackageSet conflicts = new PackageSet();
- PackageSet dep = dep(p, State.INSTALL);
- for(Package pkg : dep) {
- Collection<String> conflictPackageNames = pkg.getConflictPackageNames();
- for(String conflictPackageName : conflictPackageNames) {
- if(installedPackages.hasPackageByName(conflictPackageName)) {
- Package conflictPackage = installedPackages.getPackageByName(conflictPackageName);
- conflicts.addAll(reverseDep(conflictPackage));
- } else if (repoPackages.hasPackageByName(conflictPackageName)) {
- Package conflictPackage = repoPackages.getPackageByName(conflictPackageName);
- conflicts.addAll(reverseDep(conflictPackage));
- }
- }
- }
- return conflicts;
- }
-
- /**
- * Get conflict package list.
- * @param pset
- * @return packages that conflict with the given packages directly or indirectly
- */
- public PackageSet conflictPackages(PackageSet pset) {
- PackageSet conflicts = new PackageSet();
- for(Package p : pset) {
- conflicts.addAll(conflictPackages(p));
- }
- return conflicts;
- }
-
- /**
- * Adds packages of pset2 to packages of pset1.
- * @param pset1
- * @param pset2
- * @return new package set has the union of pset1 and pset2.
- */
- private PackageSet union(PackageSet pset1, PackageSet pset2) {
- PackageSet union = (PackageSet) pset1.clone();
- union.addAll(pset2);
- return union;
- }
-
- /**
- * Removes packages of pset2 from packages of pset1.
- * @param pset1
- * @param pset2
- * @return new package set that represents (pset1 - pset2).
- */
- public PackageSet diff(PackageSet pset1, PackageSet pset2) {
- PackageSet diff = new PackageSet();
- for(Package p : pset1) {
- if(!pset2.contains(p)) {
- diff.add(p);
- }
- }
- return diff;
- }
-
- private PackageSet diffPackageWithVersion(PackageSet pset1, PackageSet pset2) {
- PackageSet diff = new PackageSet();
- for(Package p : pset1) {
- Package pkg = pset2.getPackage(p);
-
- if (pkg == null) {
- diff.add(p);
- } else {
- if (Version.compareTo(p.getVersion(), pkg.getVersion()) != 0) {
- diff.add(p);
- }
- }
- }
- return diff;
- }
-
- /**
- *
- * @param pset1
- * @param pset2
- * @return new set of intersection of pset1 and pset2. It has the order of pset1.
- */
- private PackageSet intersect(PackageSet pset1, PackageSet pset2) {
- PackageSet pset = new PackageSet();
- for(Package p : pset1) {
- if(pset2.contains(p)) {
- pset.add(p);
- }
- }
- return pset;
- }
-
- private PackageSet getDependMetas(PackageSet packageSet, State state) {
- PackageSet depMetas = new PackageSet();
- PackageSet depPkgs = dep(packageSet, state);
- for (Package p : depPkgs) {
- if (p.isMeta()) {
- depMetas.add(p);
- }
- }
-
- return depMetas;
- }
-
- /**
- * @param m meta package to be checked updatable
- * @return <code>true</code> if the meta package is updatable.
- * ie. the meta package is installed and one of its dependents is already installed and is updatable.
- */
- public boolean isMetaUpdatable(Package m) {
- // if one of the meta package's dependents is installed and updatable, the meta package is updatable.
- PackageSet dep = dep(m, State.INSTALL);
-
- for(Package p : dep) {
-
- if(installedPackages.contains(p)) {
- Package ip = installedPackages.getPackage(p);
- if (ip == null) {
- continue;
- }
-
- Package rp = null;
- if (repoPackages != null && repoPackages.hasPackage(p)) {
- rp = repoPackages.getPackage(p);
- } else if (extensionPackages != null && extensionPackages.hasPackage(p)) {
- rp = extensionPackages.getPackage(p);
- }
-
- // checks p is updatable
- if(rp != null && rp.getVersion().compareTo(ip.getVersion()) != 0) {
- return true;
- }
- }
- }
- return false;
- }
-
-
-
- /**
- * @param m meta package to be checked removable
- * @return <code>true</code> if the meta package is removable
- * ie. the meta package is installed and one of its dependents is already installed and is removable.
- */
- private boolean isMetaRemovable(Package m) {
- // if the meta package is not installed, it's never updatable
- if(installedPackages.contains(m)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * check new installation or upgrade or downgrade.
- * @param meta meta package to be checked installable.
- * @return <code>true</code> if the meta package is updatable.
- * ie. the meta package is installed and one of its dependents is already installed and is updatable.
- */
- private boolean isMetaInstallable(Package meta) {
- // if one of the meta package's dependents is installed and updatable, the meta package is updatable.
- PackageSet dep = dep(meta, State.INSTALL);
-
- for(Package p : dep) {
- //Do not check meta package. It is only used by install-type or category.
- if (p.isMeta()) {
- continue;
- }
-
- if(installedPackages.contains(p)) {
- Package ip = installedPackages.getPackage(p);
- if (ip == null) {
- continue;
- }
-
- Package rp = repoPackages.getPackage(p); // rp always exists if ip exists
-
- // checks p is updatable
- if(rp.getVersion().compareTo(ip.getVersion()) != 0) {
- return true;
- }
- } else {
- return true;
- }
- }
- return false;
- }
-
- // utility methods
- /**
- * Get installed package.
- * @param pkg
- * @return If not exist package in installed package list, return empty string.
- */
- public Package getInstalledPackageByName(String pkgName) {
- Package retPkg = installedPackages.getPackageByName(pkgName);
-
- return retPkg;
- }
-
- /**
- * Get installed packages by package name.
- * @param pkgName name of packages
- * @return If not exist package in installed package list, return empty string.
- */
- public PackageSet getInstalledPackagesByName(List<String> pkgNames) {
- PackageSet installedPackages = new PackageSet();
- for (String pkg : pkgNames) {
- Package retPkg = getInstalledPackageByName(pkg);
-
- if (retPkg != null) {
- installedPackages.add(retPkg);
- }
- }
-
- return installedPackages;
- }
-
- /**
- * Get Package instance from package name.
- * @param pkgName
- * @return
- */
- public Package getPackageByName(String pkgName) {
- PackageSet packageList = repoPackages;
- packageList.addAll(extensionPackages);
-
- if (packageList.hasPackageByName(pkgName)) {
- return packageList.getPackageByName(pkgName);
- } else {
- return null;
- }
- }
-
- public boolean existsPackage(String packageName) {
- if (getPackageByName(packageName) != null) {
- return true;
- } else if (getInstalledPackageByName(packageName) != null) {
- return true;
- } else {
- return false;
- }
- }
-
- public void removePackageFromPackageManager(String pkgName) {
- PackageSet clone = (PackageSet) repoPackages.clone();
- Package pkg = clone.getPackageByName(pkgName);
-
- if (clone.hasPackage(pkg)) {
- clone.remove(pkg);
- }
-
- repoPackages = clone;
- }
- /**
- * @param packageNames
- * @return packages collected by the given package names
- */
- public PackageSet getPackagesByNames(Collection<String> packageNames) {
- PackageSet pset = new PackageSet();
- for(String name : packageNames) {
- if(repoPackages.hasPackageByName(name)) {
- Package pkg = repoPackages.getPackageByName(name);
- pset.add(pkg);
- } else if (extensionPackages.hasPackageByName(name)) {
- Package pkg = extensionPackages.getPackageByName(name);
- pset.add(pkg);
- } else {
- throw new IMFatalException(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY);
- }
- }
- return pset;
- }
-
- public PackageSet getMandatoryPackages() {
- PackageSet pSet = new PackageSet();
-
- for (Package pkg : repoPackages) {
- if (pkg.isMandatory()) {
- pSet.add(pkg);
- }
- }
-
- return pSet;
- }
-
- public PackageSet getUpdatableMandatoryPackages() {
- PackageSet pSet = new PackageSet();
-
- for (Package mPkg : getMandatoryPackages()) {
- if (!installedPackages.contains(mPkg)) {
- pSet.add(mPkg);
- } else if(isUpdatable(mPkg)) {
- pSet.add(mPkg);
- } else {
- continue;
- }
- }
-
- return pSet;
- }
-
- /**
- * Check installed meta packages
- * @return if installed package exists, return true. if not return false.
- */
- public boolean existInstalledMetaPackages() {
- if (getInstalledMetaPackages().size() <= 0) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Check installable meta packages
- * @return if installable meta package exists, return true. if not return false.
- */
- public boolean existInstallableMetaPackages() {
- if (getInstalledMetaPackages().size() <= 0) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Check installed packages.
- * @return if installed package exists, return true. if not return false.
- */
- public boolean existInstalledPackages() {
- if (installedPackages.size() <= 0) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Check installable or updatable packages.
- * @return if installable package exists, return true. if not return false.
- */
- public boolean existInstallablePackages() {
- for(Package p : repoPackages) {
- if(installedPackages.contains(p)) {
- Package ip = installedPackages.getPackage(p);
- if (ip == null) {
- continue;
- }
-
- Package rp = recentPackages.getPackage(p); // rp always exists if ip exists
- // checks p is updatable
- if(rp.getVersion().compareTo(ip.getVersion()) > 0) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * get total size to remove.
- * @param pkg
- * @return
- */
- public long getTotalSizeOfRemovablePackages(Package pkg) {
- PackageSet pkgs = new PackageSet();
-
- pkgs.add(pkg);
- PackageSet depPkgSet = getToRemovePackagesInRemove(pkgs);
-
- return getTotalSize(depPkgSet, true);
- }
-
- /**
- * get total size to install.
- * @param pkg
- * @param isUncompressed Uncompressed is true, not false.
- * @return
- */
- public long getTotalSizeOfInstallablePackages(PackageSet pkgs, boolean isUncompressed) {
- PackageSet depPkgSet = getInstallablePackages(pkgs);
-
- return getTotalSize(depPkgSet, isUncompressed);
- }
-
- /**
- * get total size to remove.
- * @param pkg
- * @return
- */
- public long getTotalSizeOfRemovablePackages(PackageSet pkgs) {
- PackageSet depPkgSet = getRemovablePackagesInSnapshot(pkgs);
-
- return getTotalSize(depPkgSet, true);
- }
-
- /**
- * Get uncompressed packages size or compressed(zipped) packages size.
- * @param pkgs Packages set which can be calculated total size.
- * @param isUncompressed Uncompressed is true, not false.
- * @return
- */
- private long getTotalSize(PackageSet pkgs, boolean isUncompressed) {
- long totalSize = 0;
- if (pkgs != null) {
- for (Package depPkg : pkgs) {
- if (isUncompressed) {
- totalSize += depPkg.getUncompressedPackageSize();
- } else {
- totalSize += depPkg.getPackageSize();
- }
- }
- } else {
- Log.log("Cannot caculate packages' total size because of empty or null packages.");
- }
-
- return totalSize;
- }
-
- /**
- * @return <code>true</code> if installed and repository packages are empty.
- */
- public boolean isEmpty() {
-
- if (installedPackages.size() <= 0 && repoPackages.size() <= 0) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Get Installable packages.
- * @return packages that can be newly installable.
- */
- public PackageSet getInstallableMetaPackages() {
- return diff(getAllMetaPackages(), getInstalledMetaPackages());
- }
-
- /**
- * @return packages that can be newly installable or updatable.
- */
- public PackageSet getInstallableOrUpdatableMetaPackages() {
- PackageSet installableMetaPackages = new PackageSet();
- PackageSet allMetaPackages = getAllMetaPackages();
-
- for (Package metaPackage : allMetaPackages) {
- if (isMetaInstallable(metaPackage)) {
- installableMetaPackages.add(metaPackage);
- }
- }
-
- return installableMetaPackages;
- }
-
-
- /**
- * Check missing packages from repository's package list.
- * @return packages that is missing in repository's package list.
- */
- public PackageSet getMissingPackagesFromRepository() {
- PackageSet missingPackages = new PackageSet();
-
- if (!repoPackages.isEmpty()) {
- missingPackages = diff(installedPackages, repoPackages);
- missingPackages = diff(missingPackages, extensionPackages);
- }
-
- return missingPackages;
- }
-
- /**
- * save packages to installedpackage.list
- * @param filePath
- */
- public void saveInstalledList() {
- String filePath = PathUtil.get(
- PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),
- Config.INSTALLED_PACKAGE_LIST_FILE_NAME);
-
- PropertyParser parser = new PropertyParser();
- List<PropertySection> pSections = saveProperySectionsFromPackages(installedPackages);
- parser.writeToFile(pSections, filePath);
- }
-
- /**
- * save information of packages.
- * @param packages
- * @return
- */
- public List<PropertySection> saveProperySectionsFromPackages(PackageSet packages) {
- List<PropertySection> pSections = new ArrayList<PropertySection>();
- PropertySection pSection = null;
- Properties properties = null;
-
- for (Package pkg : packages) {
- properties = (Properties)pkg.getProperties();
- pSection = new PropertySection();
- pSection.setProperties(properties);
- pSections.add(pSection);
- }
-
- return pSections;
- }
-
- public PropertySection saveProperySectionsFromPackages(Package pkg) {
- PropertySection pSection = null;
- Properties properties = null;
-
- properties = (Properties)pkg.getProperties();
- pSection = new PropertySection();
- pSection.setProperties(properties);
-
- return pSection;
- }
-
- /**
- * Check the repository change.
- * @return
- */
- public boolean isRepositoryChanged() {
- if (installedRepository == null || !currentRepository.equalsIgnoreCase(installedRepository)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Check to need re-installation.
- * If there has been a change distribution or repository or SDK image, force to re-install.
- * @return If it needs to re-install, return true. otherwise return false.
- */
- public boolean isReInstall() {
- if (isInstallInstallManager) {
- return false;
- } else if (Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) {
- return true;
- } else if (isRepositoryChanged()) {
- return true;
- } else {
- if (DistributionController.getInstance().isDistributionChanged()) {
- return true;
- } else {
- return false;
- }
- }
- }
-
- public boolean isConflict(PackageSet pkgsToInstall, Package pkg) {
- return false;
- }
-
- /**
- * Prints dependency graph of packages in dot format to stdout.
- * @throws IMExitException
- */
- public void printDepGraph() {
- StringBuffer buf = new StringBuffer();
-
- buf.append("digraph G {\n");
-
- for(Package p : recentPackages) {
- PackageSet dep = dep(p, State.INSTALL);
-
- for(Package d : dep) {
- if(!d.equals(p)) {
- buf.append("\""+p+"\" -> \"" + d + "\";\n");
- }
- }
- }
-
- buf.append("}\n");
- System.out.println(buf);
- }
-
- public static void dispose() {
- if (pm != null) {
- pm = null;
- }
- }
-
- /**
- * Get PackageManager singleton instance.
- * @param installed
- * @param repoPackagesUrls
- * @return
- * @throws IOException
- */
- public static PackageManager getInstance(File installed, Collection<String> repoPackagesUrls) throws IOException {
- if (Options.platForm == null) {
- if (Config.isSupportMultiSDK) {
- if (!Registry.targetPath.equals("")) {
- pm = null;
- if (Platform.isLinux()) {
- pm = new LinuxPackageManager(installed, repoPackagesUrls);
- } else if (Platform.isWindows()) {
- pm = new WindowsPackageManager(installed, repoPackagesUrls);
- } else if (Platform.isMacOS()) {
- pm = new DarwinPackageManager(installed, repoPackagesUrls);
- } else {
- return null;
- }
- } else {
- if (pm == null) {
- if (Platform.isLinux()) {
- pm = new LinuxPackageManager(installed, repoPackagesUrls);
- } else if (Platform.isWindows()) {
- pm = new WindowsPackageManager(installed, repoPackagesUrls);
- } else if (Platform.isMacOS()) {
- pm = new DarwinPackageManager(installed, repoPackagesUrls);
- } else {
- return null;
- }
- }
- }
- } else {
- if (pm == null) {
- if (Platform.isLinux()) {
- pm = new LinuxPackageManager(installed, repoPackagesUrls);
- } else if (Platform.isWindows()) {
- pm = new WindowsPackageManager(installed, repoPackagesUrls);
- } else if (Platform.isMacOS()) {
- pm = new DarwinPackageManager(installed, repoPackagesUrls);
- } else {
- return null;
- }
- }
- }
- } else {
- if (pm == null) {
- if (Options.platForm.equalsIgnoreCase("ubuntu")) {
- pm = new LinuxPackageManager(installed, repoPackagesUrls);
- } else if (Options.platForm.equalsIgnoreCase("windows")) {
- pm = new WindowsPackageManager(installed, repoPackagesUrls);
- } else if (Options.platForm.equalsIgnoreCase("macos")) {
- pm = new DarwinPackageManager(installed, repoPackagesUrls);
- } else {
- return null;
- }
- }
- }
- return pm;
- }
-
- public static PackageManager getInstance() {
- return pm;
- }
-
- public SDKExtensionInfo getSdkExtensionInfo() {
- return SDKExtensionInfo.getInstance();
- }
-}
+/*\r
+* InstallManager\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact: \r
+* Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+* Shihyun Kim <shihyun.kim@samsung.com>\r
+* Taeyoung Son <taeyoung2.son@samsung.com>\r
+* Yongsung kim <yongsung1.kim@samsung.com>\r
+* \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/ \r
+\r
+package org.tizen.installmanager.pkg.lib;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Stack;\r
+\r
+import org.tizen.installmanager.core.Config;\r
+import org.tizen.installmanager.core.Config.ServerType;\r
+import org.tizen.installmanager.core.DistributionController;\r
+import org.tizen.installmanager.core.IMExitException;\r
+import org.tizen.installmanager.core.IMFatalException;\r
+import org.tizen.installmanager.core.InstallManager;\r
+import org.tizen.installmanager.core.Options;\r
+import org.tizen.installmanager.core.SDKExtensionInfo;\r
+import org.tizen.installmanager.lib.Downloader;\r
+import org.tizen.installmanager.lib.ErrorController;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.Registry;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.lib.exception.IMNetworkConnectException;\r
+import org.tizen.installmanager.lib.exception.IMNetworkDownloadException;\r
+import org.tizen.installmanager.pkg.lib.darwin.DarwinPackageManager;\r
+import org.tizen.installmanager.pkg.lib.linux.LinuxPackageManager;\r
+import org.tizen.installmanager.pkg.lib.win.WindowsPackageManager;\r
+import org.tizen.installmanager.pkg.model.IMPackageNotFound;\r
+import org.tizen.installmanager.pkg.model.Package;\r
+import org.tizen.installmanager.pkg.model.PackageSet;\r
+import org.tizen.installmanager.pkg.model.Properties;\r
+import org.tizen.installmanager.pkg.model.Property;\r
+import org.tizen.installmanager.pkg.model.PropertySection;\r
+import org.tizen.installmanager.pkg.model.Snapshot;\r
+import org.tizen.installmanager.pkg.model.Version;\r
+import org.tizen.installmanager.util.PathUtil;\r
+\r
+\r
+/**\r
+ * Package Manager\r
+ * <p>\r
+ * This class provides various methods for managing packages.\r
+ * Most of the methods handle packages symbolically. Namely, they are identified by its package name not the object if not specially mentioned.\r
+ * <p>\r
+ * Some methods are carefully designed to preserve the order of packages because the order of packages is important sometimes. \r
+ * See the details in the documentation of each methods.\r
+ * \r
+ * @author Shihyun Kim <shihyun.kim@samsung.com>\r
+ *\r
+ */\r
+public abstract class PackageManager {\r
+ /**\r
+ * Packages that are already installed in the system.\r
+ */\r
+ private PackageSet installedPackages;\r
+ /**\r
+ * packages that are available in the repositories(package servers).\r
+ */\r
+ private PackageSet repoPackages;\r
+ /**\r
+ * packages that combines <code>installedPackages</code> and <code>repoPackages</code>. \r
+ * This includes only the latest package from the several versions of a package.\r
+ * This is used as the universe set(base set) of packages available.\r
+ */\r
+ private PackageSet recentPackages;\r
+ \r
+ /**\r
+ * Packages from extension package server.111\r
+ */\r
+ private PackageSet extensionPackages = new PackageSet();\r
+ \r
+ private static PackageManager pm = null;\r
+ \r
+ //repository that installed.\r
+ private static String installedRepository = null;\r
+ private String currentRepository = null;\r
+ \r
+ public boolean isInstallInstallManager = false;\r
+ \r
+ public enum State {\r
+ INSTALL,\r
+ UNINSTALL;\r
+ }\r
+ \r
+ /**\r
+ * It is a position where can installmanager get the package list file \r
+ */\r
+ private enum Style {\r
+ NETWORK,\r
+ IMAGE,\r
+ EXTRA;\r
+ }\r
+ \r
+ //abstract method\r
+ /**\r
+ * Get package list file name.\r
+ * @return\r
+ */\r
+ abstract public String getPackageListFileName();\r
+ \r
+ /**\r
+ * Creates and initializes Package Manager instance.\r
+ * This combines installed packages and packages from the repositories.\r
+ * \r
+ * @param installed a file in which installed packages are specified. This can be <code>null</code> if no packages are installed.\r
+ * @param repoPackagesUrls a collection of URLs of repositories(package servers). This cannot be <code>null</code>.\r
+ * @throws IOException if temporary file cannot created\r
+ */\r
+ protected PackageManager(File installed, Collection<String> repoPackagesUrls) throws IOException {\r
+ setInstalledPackageList(installed);\r
+ loadRepositoryPackageList(repoPackagesUrls);\r
+ getRecentPackages();\r
+ \r
+ if (repoPackagesUrls.size() > 0) {\r
+ setRepository(repoPackagesUrls.iterator().next());\r
+ }\r
+ }\r
+ \r
+ private void setRepository(String repository) {\r
+ if (installedRepository == null) {\r
+ installedRepository = repository;\r
+ }\r
+ \r
+ currentRepository = repository;\r
+ return;\r
+ }\r
+ \r
+ /**\r
+ * set repository url to each package.(reposistory url plus package name is complete url.)\r
+ * @param repoPackagesUrls\r
+ * @throws IOException\r
+ */\r
+ public void loadRepositoryPackageList(Collection<String> repoPackagesUrls) throws IOException {\r
+ HashMap<String,List<PropertySection>> r2sMap = null;\r
+ ServerType serverType = Config.getInstance().getConfigFile().getServerType();\r
+ \r
+ if (serverType == ServerType.LOCAL) { // Using SDK Image\r
+ r2sMap = getRepositoryAndPackageList(repoPackagesUrls, Style.IMAGE);\r
+ } else {\r
+ r2sMap = getRepositoryAndPackageList(repoPackagesUrls, Style.NETWORK); \r
+ }\r
+ setRepoPackages(r2sMap);\r
+ \r
+ //Add EXTRAS for extention packages\r
+ addExtraMetaPackage();\r
+ }\r
+ \r
+ /**\r
+ * set repository url to each package.(reposistory url plus package name is complete url.)\r
+ * @param repoPackagesUrls Packgae server list.\r
+ * @throws IOException\r
+ */\r
+ public void loadExtensionPackages() throws IOException {\r
+ HashMap<String,List<PropertySection>> repoToSectionsMap = \r
+ getRepositoryAndPackageList(SDKExtensionInfo.getInstance().getExtensionRepositories().keySet(),\r
+ Style.EXTRA);\r
+ \r
+ //Update extension packages.\r
+ if (repoToSectionsMap != null/*adall && !repoToSectionsMap.isEmpty()*/) {\r
+ setExtensionPackages(repoToSectionsMap);\r
+ setExtensionPackagesToRecentPackages();\r
+ } else {\r
+ return;\r
+ }\r
+ }\r
+ \r
+ private HashMap<String,List<PropertySection>> getRepositoryAndPackageList\r
+ (Collection<String> repoPackagesUrls, Style style) throws IOException {\r
+ PropertyParser parser = new PropertyParser();\r
+ HashMap<String,List<PropertySection>> r2sMap = new HashMap<String,List<PropertySection>>();\r
+ \r
+ if(repoPackagesUrls != null) {\r
+ for(String repo : repoPackagesUrls) { \r
+ URL packageListURL = getPackageListPath(repo, style);\r
+ File packageListFile = null;\r
+ \r
+ if (style != Style.EXTRA) { // Snapshot, Image case\r
+ packageListFile = downloadPackageListFile(packageListURL);\r
+ if(packageListFile != null) {\r
+ r2sMap.put(repo, parser.readFromFile(packageListFile));\r
+ }\r
+ } else { // Extra extension case\r
+ // Get package list file from cache.\r
+ URL extraPackageListURL = getPackageListPath(SDKExtensionInfo.getInstance().getExtraPackageListPath(repo), style);\r
+ packageListFile = downloadPackageListFile(extraPackageListURL);\r
+ if (packageListFile != null) { // If cache does not exist, install manager get it from remote repository.\r
+ r2sMap.put(repo, parser.readFromFile(packageListFile));\r
+ } else {\r
+ // InstallManager can get package list file from remote repository.\r
+ packageListFile = downloadPackageListFile(packageListURL);\r
+ if (packageListFile != null) {\r
+ r2sMap.put(repo, parser.readFromFile(packageListFile));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ Log.log("Cannot find repository. This is local installer.");\r
+ }\r
+ \r
+ return r2sMap;\r
+ }\r
+ \r
+ private File downloadPackageListFile(URL packageListURL) throws IOException {\r
+ if (packageListURL == null) {\r
+ return null;\r
+ }\r
+ Downloader dl = InstallManager.getDownloader();\r
+ File tmp = null;\r
+ \r
+ if (Options.onlyDownload) {\r
+ tmp = new File(PathUtil.getFromCurrDir(getPackageListFileName()));\r
+ } else {\r
+ tmp = File.createTempFile("Packages", ".list");\r
+ tmp.deleteOnExit();\r
+ }\r
+ \r
+ long size = 0;\r
+ try {\r
+ size = dl.download(packageListURL, tmp.getAbsolutePath(), null);\r
+ } catch (IMNetworkConnectException e) {\r
+ Log.ExceptionLog(e);\r
+ return null;\r
+ } catch (IMNetworkDownloadException e) {\r
+ Log.ExceptionLog(e);\r
+ return null;\r
+ }\r
+ \r
+ if (size > 0) {\r
+ return tmp;\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ private void setExtensionPackages(HashMap<String,List<PropertySection>> repoToSectionsMap) {\r
+ extensionPackages = new PackageSet();\r
+ boolean result = setPackages(extensionPackages, repoToSectionsMap, true);\r
+ if (!result) {\r
+ Log.err("Cannot set extension packages.");\r
+ }\r
+ }\r
+ \r
+ private void addExtraMetaPackage() {\r
+ if (repoPackages == null) {\r
+ repoPackages = new PackageSet();\r
+ } else {\r
+ if (repoPackages.hasPackageByName("EXTRAS")) {\r
+ return;\r
+ }\r
+ }\r
+ \r
+ Properties props = new Properties();\r
+ \r
+ props.add(new Property(Package.FIELD_PACKAGE, "EXTRAS"));\r
+ props.add(new Property(Package.FIELD_LABEL, "Extras"));\r
+ props.add(new Property(Package.FIELD_ATTRIBUTE, "root"));\r
+ props.add(new Property(Package.FIELD_PACKAGE_SIZE, "0"));\r
+ props.add(new Property(Package.FIELD_UNCOMPRESSED_SIZE, "0"));\r
+ \r
+ Package extraPackage = new Package(props);\r
+ repoPackages.add(extraPackage);\r
+ }\r
+ \r
+ /**\r
+ * Get packages from extension package server.\r
+ * @return set of packages\r
+ */\r
+ public PackageSet getExtensionPackages() {\r
+ return extensionPackages;\r
+ }\r
+ \r
+ public PackageSet getInstalledExtensionPackages() {\r
+ PackageSet extensionPackages = new PackageSet();\r
+ PackageSet pkgs = this.getInstalledPackages();\r
+ \r
+ \r
+ for (Package pkg : pkgs) {\r
+ if (pkg.isExtensionPackage()) {\r
+ extensionPackages.add(pkg);\r
+ }\r
+ }\r
+ \r
+ return extensionPackages;\r
+ }\r
+ \r
+ /**\r
+ * Set installed packages.\r
+ * @param installedPackageListPath\r
+ */\r
+ public void setInstalledPackageList(File installedPackageListPath) {\r
+ List<PropertySection> sectionsInstalled = null;\r
+ PropertyParser parser = new PropertyParser();\r
+ \r
+ if(installedPackageListPath != null) {\r
+ sectionsInstalled = parser.readFromFile(installedPackageListPath);\r
+ } else {\r
+ sectionsInstalled= new LinkedList<PropertySection>();\r
+ }\r
+ \r
+ if (sectionsInstalled != null) {\r
+ setInstalledPackageList(sectionsInstalled); \r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Set installed packages\r
+ * @param sections\r
+ */\r
+ private void setInstalledPackageList(List<PropertySection> sections) {\r
+ installedPackages = new PackageSet();\r
+ \r
+ for(PropertySection sect : sections) {\r
+ installedPackages.add(new Package(sect.getProperties()));\r
+ }\r
+ }\r
+ \r
+ public void installedPackagesFree() {\r
+ installedPackages = null;\r
+ }\r
+ \r
+ /**\r
+ * Get package list file path from url.\r
+ * @param url\r
+ * @return Full url path\r
+ */\r
+ private URL getPackageListPath(String url, Style style) {\r
+ if (url == null || url.isEmpty()) {\r
+ return null;\r
+ } else {\r
+ String packageListURL = "";\r
+\r
+ if (style == Style.NETWORK) {\r
+ String snapshotPath = Config.getInstance().getSnapshotPath();\r
+ \r
+ if (snapshotPath == null || snapshotPath.isEmpty() || snapshotPath.equalsIgnoreCase("null")) {\r
+ String distribution = Config.getInstance().getConfigFile().getDistribution();\r
+ \r
+ Snapshot latestSnapshot = DistributionController.getInstance().getLatestSnapshot(distribution);\r
+ if (latestSnapshot == null) {\r
+ return null;\r
+ } else {\r
+ snapshotPath = DistributionController.getInstance().getLatestSnapshot(distribution).getPath();\r
+ }\r
+ }\r
+ \r
+ packageListURL = PathUtil.addURLPath(url,\r
+ snapshotPath, \r
+ getPackageListFileName());\r
+ } else {\r
+ packageListURL = PathUtil.addURLPath(url, getPackageListFileName());\r
+ }\r
+ \r
+ try {\r
+ return new URL(packageListURL);\r
+ } catch (MalformedURLException e) {\r
+ Log.ExceptionLog(e);\r
+ return null;\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ \r
+ /**\r
+ * @return installed packages\r
+ */\r
+ public PackageSet getInstalledPackages() {\r
+ return (PackageSet) installedPackages.clone();\r
+ }\r
+ \r
+ /**\r
+ * Set packages of repository\r
+ * @param sections\r
+ */\r
+ protected void setRepoPackages( Map<String,List<PropertySection>> repoToSectionsMap) {\r
+ repoPackages = new PackageSet();\r
+ boolean result = setPackages(repoPackages, repoToSectionsMap, false);\r
+ if (!result) {\r
+ Log.err("Cannot find repository. Please check your repository.");\r
+ ErrorController.setError(ErrorCode.CANNOT_FIND_REPOSITORY);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Set packages to <code>destPackages</code>\r
+ * @param destPackages It is set of packages.\r
+ * @param repoToSectionsMap It is added to <code>destPackages</code>\r
+ */\r
+ private boolean setPackages(PackageSet destPackages, Map<String,List<PropertySection>> repoToSectionsMap, boolean isExtensionPackage) {\r
+ if (destPackages == null) {\r
+ destPackages = new PackageSet();\r
+ }\r
+ \r
+ if (repoToSectionsMap == null || repoToSectionsMap.isEmpty()) {\r
+ return false;\r
+ }\r
+ \r
+ for(String repoBaseUrl : repoToSectionsMap.keySet()) {\r
+ for(PropertySection sect : repoToSectionsMap.get(repoBaseUrl)) {\r
+ Package pkg = new Package(sect.getProperties(), repoBaseUrl);\r
+ Log.log("Check valid package version. => " + pkg);\r
+ pkg.getVersion(); // Vaild version check.\r
+ if (isExtensionPackage) {\r
+ if (pkg.getAttribute().equalsIgnoreCase("extra")) {\r
+ pkg.setExtensionServer(repoBaseUrl);\r
+ destPackages.add(pkg);\r
+ }\r
+ } else {\r
+ destPackages.add(pkg);\r
+\r
+ }\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ \r
+ /**\r
+ * @return packages of repository\r
+ */\r
+ public PackageSet getRepoPackages() {\r
+ return repoPackages;\r
+ }\r
+ \r
+ /**\r
+ * Set repository packages.\r
+ * @param packageSet\r
+ */\r
+ public void setRepoPackages(PackageSet packageSet) {\r
+ repoPackages = packageSet;\r
+ }\r
+ \r
+ /**\r
+ * @return root meta packages of repository\r
+ */\r
+ public PackageSet getRootMetaPackagesOfRepository() {\r
+ PackageSet clone = (PackageSet) repoPackages.clone();\r
+ \r
+ // Repository packages should not have extension packages.\r
+ for (Package pkg : repoPackages) {\r
+ if (pkg.isExtensionPackage()) {\r
+ clone.remove(pkg);\r
+ }\r
+ }\r
+ \r
+ repoPackages = clone;\r
+ \r
+ return rootMeta(repoPackages);\r
+ }\r
+ \r
+ /**\r
+ * Get install meta packages from repository.\r
+ * @return\r
+ */\r
+ public PackageSet getInstallMetaPackagesOfRepository() {\r
+ return installMeta(repoPackages);\r
+ }\r
+ \r
+ /**\r
+ * Get root meta package from extension package server()\r
+ */\r
+ public PackageSet getRootMetaPackagesOfExtensionServer() {\r
+ return rootMeta(extensionPackages);\r
+ }\r
+ \r
+ /**\r
+ * @return recent packages. This includes the latest packages among all packages from currently \r
+ * installed packages and packages of repository if a package has several versions.\r
+ */\r
+ public PackageSet getRecentPackages() {\r
+ if(recentPackages == null) {\r
+ recentPackages = new PackageSet();\r
+ for(Package ip : installedPackages) {\r
+ if(repoPackages != null && repoPackages.contains(ip)) {\r
+ Package rp = repoPackages.getPackage(ip);\r
+ Log.log("Repo packages : " + repoPackages);\r
+ if(ip.getVersion().compareTo(rp.getVersion()) > 0) {\r
+ recentPackages.add(ip);\r
+ } else {\r
+ recentPackages.add(rp);\r
+ }\r
+ } else if (extensionPackages != null && extensionPackages.contains(ip)) {\r
+ Package ep = extensionPackages.getPackage(ip);\r
+ if(ip.getVersion().compareTo(ep.getVersion()) > 0) {\r
+ recentPackages.add(ip);\r
+ } else {\r
+ recentPackages.add(ep);\r
+ }\r
+ } else {\r
+ recentPackages.add(ip);\r
+ }\r
+ }\r
+ \r
+ if (repoPackages != null) {\r
+ for(Package rp : repoPackages) {\r
+ if(!recentPackages.contains(rp)) {\r
+ recentPackages.add(rp);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return recentPackages;\r
+ }\r
+ \r
+ private void setExtensionPackagesToRecentPackages() {\r
+ if (recentPackages == null) {\r
+ recentPackages = new PackageSet();\r
+ }\r
+ \r
+ for(Package ip : installedPackages) {\r
+ if (extensionPackages != null && extensionPackages.contains(ip)) {\r
+ Package ep = extensionPackages.getPackage(ip);\r
+ if(ip.getVersion().compareTo(ep.getVersion()) > 0) {\r
+ recentPackages.add(ip);\r
+ } else {\r
+ recentPackages.add(ep);\r
+ }\r
+ } else {\r
+ recentPackages.add(ip);\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ \r
+ // Methods for update process\r
+ /**\r
+ * except package from installed package list. \r
+ * @param pkg\r
+ * @return\r
+ */\r
+ public boolean exceptPackageFromInstalledPackages(Package pkg) {\r
+ return installedPackages.remove(pkg);\r
+ }\r
+ \r
+ /**\r
+ * Add package to installed package list.\r
+ * @param pkg\r
+ * @return\r
+ */\r
+ public boolean addPackageToInstalledPackages(Package pkg) {\r
+ installedPackages.remove(pkg);\r
+ return installedPackages.add(pkg);\r
+ }\r
+ \r
+ /**\r
+ * @return updatable packages among installed packages\r
+ */\r
+ public PackageSet getUpdatableInstalledPackages() {\r
+ PackageSet updatables = new PackageSet();\r
+ for(Package ip : installedPackages) {\r
+ if(repoPackages.contains(ip)) {\r
+ Package rp = repoPackages.getPackage(ip);\r
+ if(rp.getVersion().compareTo(ip.getVersion()) != 0) {\r
+ updatables.add(ip);\r
+ }\r
+ }\r
+ }\r
+ return updatables;\r
+ }\r
+ \r
+ /**\r
+ * if pkg is updatable, return true. else return false.\r
+ * @param pkg\r
+ * @return\r
+ */\r
+ public boolean isUpdatable(Package pkg) {\r
+ if (pkg == null) {\r
+ return false;\r
+ }\r
+ \r
+ PackageSet updatables = getUpdatableInstalledPackages();\r
+ if (updatables.contains(pkg)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public boolean isInstalledPackage(Package pkg) {\r
+ if (pkg == null) {\r
+ return false;\r
+ }\r
+ \r
+ if (installedPackages.contains(pkg)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * If package set of repository is empty, return true;\r
+ * @return\r
+ */\r
+ public boolean isRepoPackagesEmpty() {\r
+ if (repoPackages == null || repoPackages.isEmpty()) {\r
+ return true;\r
+ } else if (repoPackages.size() == 1) {\r
+ if (repoPackages.getPackageByName("EXTRAS") != null) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * If pkg is installed, return true. else return false\r
+ * @param pkg\r
+ * @return\r
+ */\r
+ public boolean isInstalledVersion(Package pkg) {\r
+ Package installedPackage = installedPackages.getPackage(pkg);\r
+ if (installedPackage == null) {\r
+ return false;\r
+ } else {\r
+ Version installedVersion = installedPackage.getVersion();\r
+ if (installedVersion.compareTo(pkg.getVersion()) == 0) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ } \r
+ }\r
+ }\r
+ \r
+ public PackageSet getRecentMetaPackages() {\r
+ PackageSet recentPackages = union(repoPackages, installedPackages);\r
+ return rootMeta(recentPackages);\r
+ }\r
+ \r
+ /**\r
+ * @return meta packages among installed packages\r
+ */\r
+ public PackageSet getInstalledMetaPackages() {\r
+ return meta(installedPackages);\r
+ }\r
+ \r
+ public List<String> getInstalledMetaNames() {\r
+ ArrayList<String> installedMetaNames = new ArrayList<String>();\r
+ \r
+ for (Package meta : getInstalledMetaPackages()) {\r
+ installedMetaNames.add(meta.getPackageName());\r
+ }\r
+ \r
+ return installedMetaNames;\r
+ }\r
+ \r
+ public List<String> getInstalledPkgNames() {\r
+ ArrayList<String> installedPkgNames = new ArrayList<String>();\r
+ \r
+ for (Package pkg : getInstalledPackages()) {\r
+ installedPkgNames.add(pkg.getPackageName());\r
+ }\r
+ \r
+ return installedPkgNames;\r
+ }\r
+ \r
+ /**\r
+ * @return meta packages among all recent packages\r
+ */\r
+ public PackageSet getAllMetaPackages() {\r
+ PackageSet allMeta = new PackageSet();\r
+ \r
+ PackageSet recentMeta = meta(recentPackages);\r
+ PackageSet extensionMeta = meta(extensionPackages);\r
+ \r
+ allMeta.addAll(recentMeta);\r
+ allMeta.addAll(extensionMeta);\r
+ \r
+ return allMeta;\r
+ }\r
+ \r
+ public PackageSet getLeafMetaPackages() {\r
+ PackageSet allMetas = meta(recentPackages);\r
+ \r
+ PackageSet leafMetas = new PackageSet();\r
+ for (Package meta : allMetas) {\r
+ //if (depends size <= 0) is leaf\r
+ if (meta.getDependentPackageNames().size() <= 0) {\r
+ leafMetas.add(meta);\r
+ } else {\r
+ if (!isChildrenAllMeta(meta)) {\r
+ leafMetas.add(meta);\r
+ }\r
+ }\r
+ }\r
+ \r
+ return leafMetas;\r
+ }\r
+ \r
+ public PackageSet getInstalledLeafMetaPackages() {\r
+ PackageSet allMetas = meta(installedPackages);\r
+ \r
+ PackageSet leafMetas = new PackageSet();\r
+ for (Package meta : allMetas) {\r
+ //if (depends size <= 0) is leaf\r
+ if (meta.getDependentPackageNames().size() <= 0) {\r
+ leafMetas.add(meta);\r
+ } else {\r
+ if (!isChildrenAllMeta(meta)) {\r
+ leafMetas.add(meta);\r
+ }\r
+ }\r
+ }\r
+ \r
+ return leafMetas;\r
+ }\r
+ \r
+ private boolean hasMetaPackagesInChildren(Package pkg) {\r
+ PackageSet dependPackages = getDependsPackages(pkg);\r
+ \r
+ if (dependPackages == null) {\r
+ return true;\r
+ } else {\r
+ for (Package dPackage : dependPackages) {\r
+ if (dPackage.isMeta()) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ }\r
+ private boolean isChildrenAllMeta(Package pkg) { \r
+ PackageSet dependPackages = getDependsPackages(pkg);\r
+ \r
+ if (dependPackages == null) {\r
+ return true;\r
+ } else {\r
+ for (Package dPackage : dependPackages) {\r
+ if (!dPackage.isMeta()) {\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ \r
+ private PackageSet getDependsPackages(Package pkg) {\r
+ PackageSet dependPackages = new PackageSet();\r
+ if (pkg == null) {\r
+ return dependPackages;\r
+ }\r
+ \r
+ Collection<String> depends = pkg.getDependentPackageNames();\r
+ \r
+ try {\r
+ dependPackages = recentPackages.getPackagesByNames(depends);\r
+ } catch (IMPackageNotFound e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ return dependPackages;\r
+ }\r
+ \r
+ /**\r
+ * @return partner meta packages among all meta packages.\r
+ */\r
+ public PackageSet getPartnerMetaPackages() {\r
+ PackageSet allMetas = meta(recentPackages);\r
+ \r
+ PackageSet partnerMeta = new PackageSet();\r
+ for (Package meta : allMetas) {\r
+ if (meta.isPartnerMeta()) {\r
+ partnerMeta.add(meta);\r
+ }\r
+ }\r
+ \r
+ return partnerMeta;\r
+ }\r
+ \r
+ /**\r
+ * @return public meta packages among all meta packages.\r
+ */\r
+ public PackageSet getPublicMetaPackages() {\r
+ PackageSet allMetas = meta(recentPackages);\r
+ \r
+ PackageSet publicMeta = new PackageSet();\r
+ for (Package meta : allMetas) {\r
+ if (meta.isPublicMeta()) {\r
+ publicMeta.add(meta);\r
+ }\r
+ }\r
+ \r
+ return publicMeta;\r
+ }\r
+ \r
+ /**\r
+ * Get dependency packages of installable package.\r
+ * @param pkgs installable packages.\r
+ * @return\r
+ */\r
+ public PackageSet getDependsPackagesFromRepository(PackageSet pkgs) {\r
+ return dep(pkgs, State.INSTALL);\r
+ }\r
+ \r
+ /**\r
+ * @return meta packages that have no updates considering its dependents\r
+ */\r
+ public PackageSet getNotUpdatableMetaPackages() {\r
+ PackageSet noup = new PackageSet();\r
+ for(Package m : getAllMetaPackages()) {\r
+ if(!isMetaUpdatable(m)) {\r
+ noup.add(m);\r
+ }\r
+ }\r
+ return noup;\r
+ }\r
+ \r
+ public PackageSet getNotInstallableAndNotUpdatablePackages() {\r
+ PackageSet notPkg = new PackageSet();\r
+ \r
+ for (Package m :getAllMetaPackages()) {\r
+ if (isMetaRemovable(m) && !isMetaUpdatable(m)) {\r
+ notPkg.add(m);\r
+ }\r
+ }\r
+ \r
+ return notPkg;\r
+ }\r
+ \r
+ /**\r
+ * @return meta packages thar are updatable among installed packages\r
+ */\r
+ public PackageSet getUpdatableMetaPackages() {\r
+ PackageSet allMetas = getAllMetaPackages();\r
+ PackageSet notUpdatableMetas = getNotUpdatableMetaPackages(); \r
+ return diff(allMetas, notUpdatableMetas);\r
+ }\r
+ \r
+ public PackageSet getUpdatableInstalledMetaPackages() {\r
+ PackageSet installedMeta = getInstalledMetaPackages();\r
+ PackageSet updatableMeta = getUpdatableMetaPackages();\r
+ return intersect(installedMeta, updatableMeta);\r
+ }\r
+\r
+ /**\r
+ * @param selectedMetas\r
+ * @return packages that will be installed after update/install resulted from the selected meta packages\r
+ */ \r
+ public PackageSet getResultPackagesAfterUpdate(PackageSet selectedMetas) {\r
+ PackageSet deps = dep(selectedMetas, State.INSTALL);\r
+ PackageSet conflicts = conflictPackages(selectedMetas);\r
+ PackageSet remainedFromConflicts = diff(installedPackages, conflicts);\r
+ return union(deps, remainedFromConflicts);\r
+ }\r
+ \r
+ /**\r
+ * Get updatable packages in update process except new packages.\r
+ * @param packageSet\r
+ * @return\r
+ */\r
+ public PackageSet getUpdatablePackagesInUpdate(PackageSet packageSet) {\r
+ PackageSet result = dep(packageSet, State.INSTALL);\r
+ PackageSet up = getUpdatableInstalledPackages();\r
+ return intersect(result, up);\r
+ }\r
+ \r
+ /**\r
+ * Get removable packages in snapshot process except new packages.\r
+ * @param selectedMetas\r
+ * @return\r
+ */\r
+ public PackageSet getRemovablePackagesInSnapshot(PackageSet selectedMetas) {\r
+ PackageSet result = dep(selectedMetas, State.UNINSTALL);\r
+ PackageSet pkgSet = getdifferentVersionFromInstalledPackages(result);\r
+ \r
+ return pkgSet;\r
+ }\r
+ \r
+ /**\r
+ * check version between sourcePackages and installedPackages, and return different version packages.\r
+ * @param pkgs \r
+ * @return Different version packages among installed packages\r
+ */\r
+ public PackageSet getdifferentVersionFromInstalledPackages(PackageSet pkgs) {\r
+ PackageSet depPkgs = dep(pkgs, State.INSTALL);\r
+ PackageSet otherVersionPackages = new PackageSet();\r
+ for(Package ip : installedPackages) {\r
+ if(depPkgs.contains(ip)) {\r
+ Package rp = depPkgs.getPackage(ip);\r
+ if(rp.getVersion().compareTo(ip.getVersion()) != 0) {\r
+ otherVersionPackages.add(ip);\r
+ }\r
+ }\r
+ }\r
+ \r
+ return otherVersionPackages;\r
+ }\r
+ \r
+ /**\r
+ * @param selectedMetas\r
+ * @return packages to newly install in update process by the selected meta packages\r
+ */\r
+ public PackageSet getInstallablePackages(PackageSet selectedMetas) {\r
+ PackageSet installablePackages = null;\r
+ if (isReInstall()) {\r
+ installablePackages = dep(selectedMetas, State.INSTALL);\r
+ } else if (Config.isSupportMultiSDK()) {\r
+ if (Config.status == Config.Status.INSTALL) {\r
+ installablePackages = dep(selectedMetas, State.INSTALL); \r
+ } else if (Config.status == Config.Status.UPDATE) {\r
+ PackageSet result = getResultPackagesAfterUpdate(selectedMetas);\r
+ installablePackages = diffPackageWithVersion(result, installedPackages);\r
+ }\r
+ } else {\r
+ PackageSet result = getResultPackagesAfterUpdate(selectedMetas);\r
+ installablePackages = diffPackageWithVersion(result, installedPackages);\r
+ }\r
+ \r
+ return installablePackages;\r
+ }\r
+ \r
+ /**\r
+ * @param selectedMetas\r
+ * @return packages to update in update process by the selected meta packages\r
+ */\r
+ public PackageSet getToUpdatePackagesInUpdate(PackageSet selectedMetas) {\r
+ PackageSet result = getResultPackagesAfterUpdate(selectedMetas);\r
+ PackageSet up = getUpdatableInstalledPackages();\r
+ return intersect(result, up);\r
+ }\r
+\r
+\r
+ /**\r
+ * Get conflict packages that installed.\r
+ * @param packageSet\r
+ * @return packages to remove in update process by conflicts with the selected meta packages \r
+ */\r
+ public PackageSet getConflictPackagesInUpdate(PackageSet packageSet) { \r
+ return intersect(installedPackages, getConflictPackages(packageSet));\r
+ }\r
+ \r
+ /**\r
+ * Get conflict packages that contain reverse depends packages. \r
+ * @param packageSet\r
+ * @return\r
+ */\r
+ public PackageSet getConflictPackages(PackageSet packageSet) {\r
+ PackageSet conflicts = conflictPackages(packageSet);\r
+ \r
+ conflicts.addAll(reverseDep(conflicts));\r
+ return intersect(getConflictMetaPackages(), conflicts);\r
+ }\r
+ \r
+ /**\r
+ * Get conflict packages that contain reverse depends packages. \r
+ * @param packageSet\r
+ * @return\r
+ */\r
+ public PackageSet getConflictPackages(Package pkg) {\r
+ PackageSet conflicts = conflictPackages(pkg);\r
+ \r
+ conflicts.addAll(reverseDep(conflicts));\r
+ return intersect(getConflictMetaPackages(), conflicts);\r
+ }\r
+ \r
+ private PackageSet getConflictMetaPackages() { \r
+ PackageSet leafMetas = new PackageSet();\r
+ for (Package meta : recentPackages) {\r
+ //if (depends size <= 0) is leaf\r
+ if (meta.getDependentPackageNames().size() <= 0) {\r
+ leafMetas.add(meta);\r
+ } else {\r
+ if (!hasMetaPackagesInChildren(meta)) {\r
+ leafMetas.add(meta);\r
+ }\r
+ }\r
+ }\r
+ \r
+ return leafMetas;\r
+ }\r
+ \r
+ // Methods for remove process\r
+ \r
+ /**\r
+ * @return packages that can be removed\r
+ */\r
+ public PackageSet getRemovableMetaPackages() {\r
+ return getInstalledMetaPackages();\r
+ }\r
+ \r
+ public PackageSet getInstallableMetaPackagesInSnapshot() {\r
+ PackageSet repoMetas = meta(repoPackages);\r
+ \r
+ PackageSet installableMeta = new PackageSet();\r
+ for (Package metaPackage : repoMetas) {\r
+ if (isMetaInstallable(metaPackage)) {\r
+ installableMeta.add(metaPackage);\r
+ }\r
+ }\r
+ \r
+ return installableMeta;\r
+ }\r
+ \r
+ /**\r
+ * Get remove packages by selected metas.\r
+ * @param selectedMetas\r
+ * @return packages to remove in remove process\r
+ */\r
+ public PackageSet getToRemovePackagesInRemove(PackageSet selectedMetas) {\r
+ if (Options.doRemoveNoUI) {\r
+ // When installmanager removes specific packages, it should consider package dependency.\r
+ // For example, 'sdb' package depends on 'tizen-web-cli' and 'tizen-native-cli'.\r
+ // In this case, when installmanager removes 'tizen-web-cli' package, 'sdb' package should\r
+ // not be removed because of 'tizen-native-cli'.\r
+ \r
+ // Get candidate packages to remove. \r
+ PackageSet depMetas = getDependMetas(selectedMetas, State.UNINSTALL);\r
+ PackageSet dep = dep(depMetas, State.UNINSTALL);\r
+ PackageSet mayRemove = intersect(installedPackages, dep);\r
+ \r
+ // Get packages to remain.\r
+ PackageSet remainMetas = diff(getInstalledLeafMetaPackages(), depMetas);\r
+ PackageSet remainPackages = dep(remainMetas, State.UNINSTALL);\r
+ \r
+ // Get packages to remove.\r
+ PackageSet toRemove = diff(mayRemove, remainPackages);\r
+ return reverseSet(toRemove); \r
+ } else {\r
+ // InstallManager removes whole SDK.\r
+ PackageSet dep = dep(selectedMetas, State.UNINSTALL);\r
+ return reverseSet(dep);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @param selectedMetas\r
+ * @return packages that will be remained after remove resulted from the selected meta packages\r
+ */\r
+ public PackageSet getResultPackagesAfterRemove(PackageSet selectedMetas) {\r
+ return diff(getInstalledMetaPackages(), selectedMetas);\r
+ }\r
+ \r
+ // set handling methods\r
+ \r
+ /**\r
+ * @param pset\r
+ * @return meta packages in the package set\r
+ */\r
+ private PackageSet meta(PackageSet pset) {\r
+ PackageSet metas = new PackageSet();\r
+ \r
+ if (pset == null) {\r
+ return metas;\r
+ }\r
+ \r
+ for(Package p : pset) {\r
+ if(p.isMeta()) {\r
+ metas.add(p);\r
+ }\r
+ }\r
+ return metas;\r
+ }\r
+ \r
+ /**\r
+ * @param pset\r
+ * @return meta packages in the package set\r
+ */\r
+ private PackageSet rootMeta(PackageSet pset) {\r
+ PackageSet metas = new PackageSet();\r
+ for(Package p : pset) {\r
+ if (!Options.doTest) {\r
+ if(p.isRootMeta() || p.isExtraMeta() || p.isPublicMeta()) {\r
+ metas.add(p);\r
+ }\r
+ } else {\r
+ if(p.isRootMeta() || p.isExtraMeta() || p.isPublicMeta() || p.isTestMeta()) {\r
+ metas.add(p);\r
+ }\r
+ }\r
+ }\r
+ return metas;\r
+ }\r
+ \r
+ /**\r
+ * @param pset\r
+ * @return meta packages in the package set\r
+ */\r
+ private PackageSet installMeta(PackageSet pset) {\r
+ PackageSet metas = new PackageSet();\r
+ for(Package p : pset) {\r
+ if(p.isInstallMeta()) {\r
+ metas.add(p);\r
+ }\r
+ }\r
+ return metas;\r
+ }\r
+ \r
+ /**\r
+ * Get dependency package list from p.\r
+ * @param p a package\r
+ * @return all the packages that the given package depends on directly or indirectly\r
+ */\r
+ private PackageSet dep(Package p, State state) {\r
+ // depth first traverse on dependency graph\r
+ PackageSet dep = new PackageSet();\r
+ Stack<Package> pkgStack = new Stack<Package>();\r
+ pkgStack.push(p);\r
+ while(!pkgStack.isEmpty()) {\r
+ Package pkg = pkgStack.pop();\r
+ \r
+ if(!dep.contains(pkg)) {\r
+ dep.add(pkg);\r
+ PackageSet depPackageSet = new PackageSet();\r
+ try {\r
+ if (state == State.INSTALL) {\r
+ if (repoPackages.contains(pkg)) {\r
+ depPackageSet = repoPackages.getPackagesByNames(pkg.getDependentPackageNames());\r
+ } else if (extensionPackages.contains(pkg)) {\r
+ depPackageSet = extensionPackages.getPackagesByNames(pkg.getDependentPackageNames());\r
+ }\r
+ } else if (state == State.UNINSTALL){\r
+ depPackageSet = installedPackages.getPackagesByNames(pkg.getDependentPackageNames());\r
+ } else {\r
+ Log.err("State class have two state(INSTALL/UNINSTALL) ");\r
+ throw new IMFatalException(ErrorCode.UNKOWN_ERROR); \r
+ }\r
+ } catch (IMPackageNotFound e) {\r
+ Log.err("Finding dependents: "+p+": Package does not exist: " + e.getPackageName()+ " or "+ pkg.getDependentPackageNames());\r
+ throw new IMFatalException(ErrorCode.CANNOT_FIND_PACKAGE);\r
+ }\r
+\r
+ for(Package depPkg : depPackageSet) {\r
+ if(p.equals(depPkg)) {\r
+ Log.err("Circular dependency found: "+p);\r
+ throw new IMFatalException(ErrorCode.CIRCULAR_PACKAGE_DEPENDENCY);\r
+ }\r
+ pkgStack.push(depPkg);\r
+ }\r
+ } else {\r
+ // already visited.\r
+ addDependsSet(dep, pkg);\r
+ }\r
+ }\r
+ \r
+ return reverseSet(dep);\r
+ }\r
+ \r
+ private PackageSet reverseDep(PackageSet packages) {\r
+ PackageSet reversePackages = new PackageSet();\r
+ \r
+ for (Package pkg : packages) {\r
+ reversePackages.addAll(reverseDep(pkg));\r
+ }\r
+ \r
+ return reversePackages;\r
+ }\r
+ \r
+ /**\r
+ * Need reverse depends when remove.\r
+ * @param p\r
+ * @return\r
+ */\r
+ private PackageSet reverseDep(Package p) {\r
+ // depth first traverse on dependency graph\r
+ PackageSet reverseDep = new PackageSet();\r
+ Stack<Package> pkgStack = new Stack<Package>();\r
+ pkgStack.push(p);\r
+ while(!pkgStack.isEmpty()) {\r
+ Package pkg = pkgStack.pop();\r
+ \r
+ if(!reverseDep.contains(pkg)) {\r
+ reverseDep.add(pkg);\r
+ \r
+ for (Package recentPkg : recentPackages) {\r
+ Collection<String> dependsList = recentPkg.getDependentPackageNames();\r
+ for (String pkgName : dependsList) {\r
+ if (pkgName.equals(pkg.getPackageName())) {\r
+ pkgStack.push(recentPkg);\r
+ break;\r
+ }\r
+ }\r
+ \r
+ }\r
+ } else {\r
+ // already visited\r
+ addDependsSet(reverseDep, pkg);\r
+ }\r
+ }\r
+ \r
+ return reverseDep;\r
+ }\r
+ \r
+ /**\r
+ * Remove saved package and save package at the end of set.\r
+ * @param dependsSet\r
+ * @param pkg\r
+ */\r
+ private void addDependsSet(PackageSet dependsSet, Package pkg) {\r
+ if (dependsSet.contains(pkg)) {\r
+ dependsSet.remove(pkg);\r
+ }\r
+ \r
+ dependsSet.add(pkg);\r
+ }\r
+ \r
+ /**\r
+ * reverse package list.\r
+ * @param pkgSet\r
+ * @return\r
+ */\r
+ public PackageSet reverseSet(PackageSet pkgSet) {\r
+ if (pkgSet == null) {\r
+ return null;\r
+ }\r
+ \r
+ Stack<Package> stack = new Stack<Package>();\r
+ for (Package pkg : pkgSet) {\r
+ stack.push(pkg);\r
+ }\r
+ \r
+ PackageSet reverseSet = new PackageSet();\r
+ \r
+ while(!stack.isEmpty()) {\r
+ reverseSet.add(stack.pop());\r
+ }\r
+ \r
+ return reverseSet;\r
+ }\r
+ \r
+ /**\r
+ * @param pset package set\r
+ * @return all the packages that the given packages depends on directly or indirectly\r
+ */\r
+ private PackageSet dep(PackageSet pset, State state) {\r
+ PackageSet dep = new PackageSet();\r
+ for(Package p : pset) {\r
+ dep.addAll(dep(p, state));\r
+ }\r
+ return dep;\r
+ }\r
+ \r
+ /**\r
+ * Get conflict package list from p.\r
+ * @param p\r
+ * @return packages that conflict with the given package directly or indirectly\r
+ */\r
+ public PackageSet conflictPackages(Package p) {\r
+ PackageSet conflicts = new PackageSet();\r
+ PackageSet dep = dep(p, State.INSTALL);\r
+ for(Package pkg : dep) {\r
+ Collection<String> conflictPackageNames = pkg.getConflictPackageNames();\r
+ for(String conflictPackageName : conflictPackageNames) {\r
+ if(installedPackages.hasPackageByName(conflictPackageName)) {\r
+ Package conflictPackage = installedPackages.getPackageByName(conflictPackageName);\r
+ conflicts.addAll(reverseDep(conflictPackage));\r
+ } else if (repoPackages.hasPackageByName(conflictPackageName)) {\r
+ Package conflictPackage = repoPackages.getPackageByName(conflictPackageName);\r
+ conflicts.addAll(reverseDep(conflictPackage));\r
+ }\r
+ }\r
+ }\r
+ return conflicts;\r
+ }\r
+ \r
+ /**\r
+ * Get conflict package list.\r
+ * @param pset\r
+ * @return packages that conflict with the given packages directly or indirectly \r
+ */\r
+ public PackageSet conflictPackages(PackageSet pset) {\r
+ PackageSet conflicts = new PackageSet();\r
+ for(Package p : pset) {\r
+ conflicts.addAll(conflictPackages(p));\r
+ }\r
+ return conflicts;\r
+ }\r
+ \r
+ /**\r
+ * Adds packages of pset2 to packages of pset1.\r
+ * @param pset1\r
+ * @param pset2\r
+ * @return new package set has the union of pset1 and pset2.\r
+ */\r
+ private PackageSet union(PackageSet pset1, PackageSet pset2) {\r
+ PackageSet union = (PackageSet) pset1.clone();\r
+ union.addAll(pset2);\r
+ return union;\r
+ }\r
+ \r
+ /**\r
+ * Removes packages of pset2 from packages of pset1.\r
+ * @param pset1\r
+ * @param pset2\r
+ * @return new package set that represents (pset1 - pset2). \r
+ */\r
+ public PackageSet diff(PackageSet pset1, PackageSet pset2) {\r
+ PackageSet diff = new PackageSet();\r
+ for(Package p : pset1) {\r
+ if(!pset2.contains(p)) {\r
+ diff.add(p);\r
+ }\r
+ }\r
+ return diff;\r
+ }\r
+ \r
+ private PackageSet diffPackageWithVersion(PackageSet pset1, PackageSet pset2) {\r
+ PackageSet diff = new PackageSet();\r
+ for(Package p : pset1) {\r
+ Package pkg = pset2.getPackage(p);\r
+ \r
+ if (pkg == null) {\r
+ diff.add(p);\r
+ } else {\r
+ if (Version.compareTo(p.getVersion(), pkg.getVersion()) != 0) {\r
+ diff.add(p);\r
+ }\r
+ }\r
+ }\r
+ return diff;\r
+ }\r
+ \r
+ /**\r
+ * \r
+ * @param pset1\r
+ * @param pset2\r
+ * @return new set of intersection of pset1 and pset2. It has the order of pset1.\r
+ */\r
+ private PackageSet intersect(PackageSet pset1, PackageSet pset2) {\r
+ PackageSet pset = new PackageSet();\r
+ for(Package p : pset1) {\r
+ if(pset2.contains(p)) {\r
+ pset.add(p);\r
+ }\r
+ }\r
+ return pset;\r
+ }\r
+ \r
+ private PackageSet getDependMetas(PackageSet packageSet, State state) {\r
+ PackageSet depMetas = new PackageSet();\r
+ PackageSet depPkgs = dep(packageSet, state);\r
+ for (Package p : depPkgs) {\r
+ if (p.isMeta()) {\r
+ depMetas.add(p);\r
+ }\r
+ }\r
+ \r
+ return depMetas;\r
+ }\r
+ \r
+ /**\r
+ * @param m meta package to be checked updatable\r
+ * @return <code>true</code> if the meta package is updatable. \r
+ * ie. the meta package is installed and one of its dependents is already installed and is updatable.\r
+ */\r
+ public boolean isMetaUpdatable(Package m) { \r
+ // if one of the meta package's dependents is installed and updatable, the meta package is updatable.\r
+ PackageSet dep = dep(m, State.INSTALL);\r
+\r
+ for(Package p : dep) {\r
+ \r
+ if(installedPackages.contains(p)) {\r
+ Package ip = installedPackages.getPackage(p);\r
+ if (ip == null) {\r
+ continue;\r
+ }\r
+ \r
+ Package rp = null;\r
+ if (repoPackages != null && repoPackages.hasPackage(p)) {\r
+ rp = repoPackages.getPackage(p);\r
+ } else if (extensionPackages != null && extensionPackages.hasPackage(p)) {\r
+ rp = extensionPackages.getPackage(p);\r
+ }\r
+ \r
+ // checks p is updatable\r
+ if(rp != null && rp.getVersion().compareTo(ip.getVersion()) != 0) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+\r
+ \r
+ /**\r
+ * @param m meta package to be checked removable\r
+ * @return <code>true</code> if the meta package is removable \r
+ * ie. the meta package is installed and one of its dependents is already installed and is removable.\r
+ */\r
+ private boolean isMetaRemovable(Package m) {\r
+ // if the meta package is not installed, it's never updatable\r
+ if(installedPackages.contains(m)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * check new installation or upgrade or downgrade.\r
+ * @param meta meta package to be checked installable.\r
+ * @return <code>true</code> if the meta package is updatable. \r
+ * ie. the meta package is installed and one of its dependents is already installed and is updatable.\r
+ */\r
+ private boolean isMetaInstallable(Package meta) { \r
+ // if one of the meta package's dependents is installed and updatable, the meta package is updatable.\r
+ PackageSet dep = dep(meta, State.INSTALL);\r
+ \r
+ for(Package p : dep) {\r
+ //Do not check meta package. It is only used by install-type or category.\r
+ if (p.isMeta()) {\r
+ continue;\r
+ }\r
+ \r
+ if(installedPackages.contains(p)) {\r
+ Package ip = installedPackages.getPackage(p);\r
+ if (ip == null) {\r
+ continue;\r
+ }\r
+ \r
+ Package rp = repoPackages.getPackage(p); // rp always exists if ip exists\r
+ \r
+ // checks p is updatable\r
+ if(rp.getVersion().compareTo(ip.getVersion()) != 0) {\r
+ return true;\r
+ }\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ // utility methods\r
+ /**\r
+ * Get installed package.\r
+ * @param pkg\r
+ * @return If not exist package in installed package list, return empty string.\r
+ */\r
+ public Package getInstalledPackageByName(String pkgName) {\r
+ Package retPkg = installedPackages.getPackageByName(pkgName);\r
+ \r
+ return retPkg;\r
+ }\r
+ \r
+ /**\r
+ * Get installed packages by package name.\r
+ * @param pkgName name of packages\r
+ * @return If not exist package in installed package list, return empty string.\r
+ */\r
+ public PackageSet getInstalledPackagesByName(List<String> pkgNames) {\r
+ PackageSet installedPackages = new PackageSet();\r
+ for (String pkg : pkgNames) {\r
+ Package retPkg = getInstalledPackageByName(pkg);\r
+ \r
+ if (retPkg != null) {\r
+ installedPackages.add(retPkg);\r
+ }\r
+ }\r
+ \r
+ return installedPackages;\r
+ }\r
+ \r
+ /**\r
+ * Get Package instance from package name.\r
+ * @param pkgName\r
+ * @return\r
+ */\r
+ public Package getPackageByName(String pkgName) {\r
+ PackageSet packageList = repoPackages;\r
+ packageList.addAll(extensionPackages);\r
+ \r
+ if (packageList.hasPackageByName(pkgName)) {\r
+ return packageList.getPackageByName(pkgName);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ public boolean existsPackage(String packageName) {\r
+ if (getPackageByName(packageName) != null) {\r
+ return true;\r
+ } else if (getInstalledPackageByName(packageName) != null) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public void removePackageFromPackageManager(String pkgName) {\r
+ PackageSet clone = (PackageSet) repoPackages.clone();\r
+ Package pkg = clone.getPackageByName(pkgName);\r
+ \r
+ if (clone.hasPackage(pkg)) {\r
+ clone.remove(pkg);\r
+ }\r
+ \r
+ repoPackages = clone;\r
+ }\r
+ /**\r
+ * @param packageNames\r
+ * @return packages collected by the given package names\r
+ */\r
+ public PackageSet getPackagesByNames(Collection<String> packageNames) {\r
+ PackageSet pset = new PackageSet();\r
+ for(String name : packageNames) {\r
+ if(repoPackages.hasPackageByName(name)) {\r
+ Package pkg = repoPackages.getPackageByName(name);\r
+ pset.add(pkg);\r
+ } else if (extensionPackages.hasPackageByName(name)) {\r
+ Package pkg = extensionPackages.getPackageByName(name);\r
+ pset.add(pkg);\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY);\r
+ }\r
+ }\r
+ return pset;\r
+ }\r
+ \r
+ public PackageSet getMandatoryPackages() {\r
+ PackageSet pSet = new PackageSet();\r
+ \r
+ for (Package pkg : repoPackages) {\r
+ if (pkg.isMandatory()) {\r
+ pSet.add(pkg);\r
+ }\r
+ }\r
+ \r
+ return pSet;\r
+ }\r
+ \r
+ public PackageSet getUpdatableMandatoryPackages() {\r
+ PackageSet pSet = new PackageSet();\r
+ \r
+ for (Package mPkg : getMandatoryPackages()) {\r
+ if (!installedPackages.contains(mPkg)) {\r
+ pSet.add(mPkg);\r
+ } else if(isUpdatable(mPkg)) {\r
+ pSet.add(mPkg);\r
+ } else {\r
+ continue;\r
+ }\r
+ }\r
+ \r
+ return pSet;\r
+ }\r
+ \r
+ /**\r
+ * Check installed meta packages\r
+ * @return if installed package exists, return true. if not return false.\r
+ */\r
+ public boolean existInstalledMetaPackages() {\r
+ if (getInstalledMetaPackages().size() <= 0) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check installable meta packages\r
+ * @return if installable meta package exists, return true. if not return false.\r
+ */\r
+ public boolean existInstallableMetaPackages() {\r
+ if (getInstalledMetaPackages().size() <= 0) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check installed packages.\r
+ * @return if installed package exists, return true. if not return false.\r
+ */\r
+ public boolean existInstalledPackages() {\r
+ if (installedPackages.size() <= 0) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check installable or updatable packages.\r
+ * @return if installable package exists, return true. if not return false.\r
+ */\r
+ public boolean existInstallablePackages() {\r
+ for(Package p : repoPackages) {\r
+ if(installedPackages.contains(p)) {\r
+ Package ip = installedPackages.getPackage(p);\r
+ if (ip == null) {\r
+ continue;\r
+ }\r
+ \r
+ Package rp = recentPackages.getPackage(p); // rp always exists if ip exists\r
+ // checks p is updatable\r
+ if(rp.getVersion().compareTo(ip.getVersion()) > 0) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ /**\r
+ * get total size to remove. \r
+ * @param pkg\r
+ * @return\r
+ */\r
+ public long getTotalSizeOfRemovablePackages(Package pkg) {\r
+ PackageSet pkgs = new PackageSet();\r
+ \r
+ pkgs.add(pkg);\r
+ PackageSet depPkgSet = getToRemovePackagesInRemove(pkgs);\r
+ \r
+ return getTotalSize(depPkgSet, true);\r
+ }\r
+ \r
+ /**\r
+ * get total size to install. \r
+ * @param pkg\r
+ * @param isUncompressed Uncompressed is true, not false.\r
+ * @return\r
+ */\r
+ public long getTotalSizeOfInstallablePackages(PackageSet pkgs, boolean isUncompressed) {\r
+ PackageSet depPkgSet = getInstallablePackages(pkgs);\r
+ \r
+ return getTotalSize(depPkgSet, isUncompressed);\r
+ }\r
+ \r
+ /**\r
+ * get total size to remove. \r
+ * @param pkg\r
+ * @return\r
+ */\r
+ public long getTotalSizeOfRemovablePackages(PackageSet pkgs) {\r
+ PackageSet depPkgSet = getRemovablePackagesInSnapshot(pkgs);\r
+ \r
+ return getTotalSize(depPkgSet, true);\r
+ }\r
+\r
+ /**\r
+ * Get uncompressed packages size or compressed(zipped) packages size.\r
+ * @param pkgs Packages set which can be calculated total size.\r
+ * @param isUncompressed Uncompressed is true, not false.\r
+ * @return\r
+ */\r
+ private long getTotalSize(PackageSet pkgs, boolean isUncompressed) {\r
+ long totalSize = 0;\r
+ for (Package depPkg : pkgs) {\r
+ if (isUncompressed) {\r
+ totalSize += depPkg.getUncompressedPackageSize(); \r
+ } else {\r
+ totalSize += depPkg.getPackageSize(); \r
+ }\r
+ }\r
+ \r
+ return totalSize;\r
+ }\r
+ \r
+ /**\r
+ * @return <code>true</code> if installed and repository packages are empty.\r
+ */\r
+ public boolean isEmpty() {\r
+ \r
+ if (installedPackages.size() <= 0 && repoPackages.size() <= 0) {\r
+ return true;\r
+ }\r
+ \r
+ return false;\r
+ }\r
+ \r
+ /**\r
+ * Get Installable packages.\r
+ * @return packages that can be newly installable.\r
+ */\r
+ public PackageSet getInstallableMetaPackages() {\r
+ return diff(getAllMetaPackages(), getInstalledMetaPackages());\r
+ }\r
+\r
+ /**\r
+ * @return packages that can be newly installable or updatable. \r
+ */\r
+ public PackageSet getInstallableOrUpdatableMetaPackages() {\r
+ PackageSet installableMetaPackages = new PackageSet();\r
+ PackageSet allMetaPackages = getAllMetaPackages();\r
+ \r
+ for (Package metaPackage : allMetaPackages) {\r
+ if (isMetaInstallable(metaPackage)) {\r
+ installableMetaPackages.add(metaPackage);\r
+ }\r
+ }\r
+ \r
+ return installableMetaPackages;\r
+ }\r
+ \r
+ \r
+ /**\r
+ * Check missing packages from repository's package list. \r
+ * @return packages that is missing in repository's package list.\r
+ */\r
+ public PackageSet getMissingPackagesFromRepository() {\r
+ PackageSet missingPackages = new PackageSet();\r
+ \r
+ if (!repoPackages.isEmpty()) {\r
+ missingPackages = diff(installedPackages, repoPackages);\r
+ missingPackages = diff(missingPackages, extensionPackages);\r
+ }\r
+ \r
+ return missingPackages;\r
+ }\r
+ \r
+ /**\r
+ * save packages to installedpackage.list\r
+ * @param filePath\r
+ */\r
+ public void saveInstalledList() {\r
+ String filePath = PathUtil.get(\r
+ PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY),\r
+ Config.INSTALLED_PACKAGE_LIST_FILE_NAME);\r
+ \r
+ PropertyParser parser = new PropertyParser();\r
+ List<PropertySection> pSections = saveProperySectionsFromPackages(installedPackages);\r
+ parser.writeToFile(pSections, filePath);\r
+ }\r
+ \r
+ /**\r
+ * save information of packages.\r
+ * @param packages \r
+ * @return\r
+ */\r
+ public List<PropertySection> saveProperySectionsFromPackages(PackageSet packages) {\r
+ List<PropertySection> pSections = new ArrayList<PropertySection>();\r
+ PropertySection pSection = null;\r
+ Properties properties = null;\r
+ \r
+ for (Package pkg : packages) {\r
+ properties = (Properties)pkg.getProperties();\r
+ pSection = new PropertySection();\r
+ pSection.setProperties(properties);\r
+ pSections.add(pSection);\r
+ }\r
+ \r
+ return pSections;\r
+ }\r
+ \r
+ /**\r
+ * Check the repository change.\r
+ * @return\r
+ */\r
+ public boolean isRepositoryChanged() { \r
+ if (installedRepository == null || !currentRepository.equalsIgnoreCase(installedRepository)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check to need re-installation.\r
+ * If there has been a change distribution or repository or SDK image, force to re-install.\r
+ * @return If it needs to re-install, return true. otherwise return false.\r
+ */\r
+ public boolean isReInstall() {\r
+ if (isInstallInstallManager) {\r
+ return false;\r
+ } else if (Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) {\r
+ return true;\r
+ } else if (isRepositoryChanged()) {\r
+ return true;\r
+ } else {\r
+ if (DistributionController.getInstance().isDistributionChanged()) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ \r
+ public boolean isConflict(PackageSet pkgsToInstall, Package pkg) {\r
+ return false;\r
+ }\r
+ \r
+ /**\r
+ * Prints dependency graph of packages in dot format to stdout.\r
+ * @throws IMExitException \r
+ */\r
+ public void printDepGraph() {\r
+ StringBuffer buf = new StringBuffer();\r
+ \r
+ buf.append("digraph G {\n");\r
+ \r
+ for(Package p : recentPackages) {\r
+ PackageSet dep = dep(p, State.INSTALL);\r
+ \r
+ for(Package d : dep) {\r
+ if(!d.equals(p)) {\r
+ buf.append("\""+p+"\" -> \"" + d + "\";\n");\r
+ }\r
+ }\r
+ }\r
+ \r
+ buf.append("}\n");\r
+ System.out.println(buf);\r
+ }\r
+ \r
+ public static void dispose() {\r
+ if (pm != null) {\r
+ pm = null;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get PackageManager singleton instance.\r
+ * @param installed\r
+ * @param repoPackagesUrls\r
+ * @return\r
+ * @throws IOException\r
+ */\r
+ public static PackageManager getInstance(File installed, Collection<String> repoPackagesUrls) throws IOException {\r
+ if (Options.platForm == null) {\r
+ if (Config.isSupportMultiSDK) {\r
+ if (Registry.targetPath != "") {\r
+ pm = null;\r
+ if (Platform.isLinux()) {\r
+ pm = new LinuxPackageManager(installed, repoPackagesUrls);\r
+ } else if (Platform.isWindows()) {\r
+ pm = new WindowsPackageManager(installed, repoPackagesUrls);\r
+ } else if (Platform.isMacOS()) {\r
+ pm = new DarwinPackageManager(installed, repoPackagesUrls);\r
+ } else {\r
+ return null;\r
+ } \r
+ } else {\r
+ if (pm == null) {\r
+ if (Platform.isLinux()) {\r
+ pm = new LinuxPackageManager(installed, repoPackagesUrls);\r
+ } else if (Platform.isWindows()) {\r
+ pm = new WindowsPackageManager(installed, repoPackagesUrls);\r
+ } else if (Platform.isMacOS()) {\r
+ pm = new DarwinPackageManager(installed, repoPackagesUrls);\r
+ } else {\r
+ return null;\r
+ }\r
+ } \r
+ }\r
+ } else {\r
+ if (pm == null) {\r
+ if (Platform.isLinux()) {\r
+ pm = new LinuxPackageManager(installed, repoPackagesUrls);\r
+ } else if (Platform.isWindows()) {\r
+ pm = new WindowsPackageManager(installed, repoPackagesUrls);\r
+ } else if (Platform.isMacOS()) {\r
+ pm = new DarwinPackageManager(installed, repoPackagesUrls);\r
+ } else {\r
+ return null;\r
+ }\r
+ } \r
+ }\r
+ } else {\r
+ if (pm == null) {\r
+ if (Options.platForm.equalsIgnoreCase("ubuntu")) {\r
+ pm = new LinuxPackageManager(installed, repoPackagesUrls);\r
+ } else if (Options.platForm.equalsIgnoreCase("windows")) {\r
+ pm = new WindowsPackageManager(installed, repoPackagesUrls);\r
+ } else if (Options.platForm.equalsIgnoreCase("macos")) {\r
+ pm = new DarwinPackageManager(installed, repoPackagesUrls);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ }\r
+ return pm;\r
+ }\r
+ \r
+ public static PackageManager getInstance() {\r
+ return pm;\r
+ }\r
+ \r
+ public SDKExtensionInfo getSdkExtensionInfo() {\r
+ return SDKExtensionInfo.getInstance();\r
+ }\r
+}\r
}
//end of file.
- if (sReadData == null || sReadData.startsWith("#")) {
+ if (sReadData == null) {
if (pFieldList.size() > 0) {
pSection = new PropertySection();
pSection.setProperties(pFieldList);
pFieldList.add(tempProperty);
pField = tempProperty;
} else {
- if (pField != null) {
- pField.setValue(pField.getValue()+'\n'+sReadData.trim());
- }
+ pField.setValue(pField.getValue()+'\n'+sReadData.trim());
}
} else {
Log.err("Cannot parse name and value from installmanager.conf. (read line => " + sReadData + ")");
-/*
-* InstallManager
-*
-* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Wooyoung Cho <wooyoung1.cho@samsung.com>
-* Shihyun Kim <shihyun.kim@samsung.com>
-* Taeyoung Son <taeyoung2.son@samsung.com>
-* Yongsung kim <yongsung1.kim@samsung.com>
-*
- * Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
-
-package org.tizen.installmanager.pkg.model;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.Options;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.util.PathUtil;
-
-/**
- * This class describes a package.
- *
- * @author Wooyoung Cho <wooyoung1.cho@samsung.com>
- *
- */
-public class Package {
-
- // fields of package control
- // mandatory
- public static final String FIELD_PACKAGE = "Package";
- public static final String FIELD_VERSION = "Version";
- public static final String FIELD_LABEL = "Label";
- public static final String FIELD_MAINTAINER = "Maintainer";
- public static final String FIELD_DESCRIPTION = "Description";
-
- // etc
- public static final String FIELD_DEPENDS = "Install-dependency"; // list of packages that this package depends on
- public static final String FIELD_CONFLICTS = "Conflicts";
- public static final String FIELD_PACKAGE_SIZE = "Size"; // size of zipped package
- public static final String FIELD_UNCOMPRESSED_SIZE = "Uncompressed-size"; // uncompressed size of package
-
- // fields of installed control
- public static final String FIELD_ATTRIBUTE = "Attribute";
-
- // fields of repository control
- public static final String FIELD_SHA256 = "SHA256";
- public static final String FIELD_FILE_PATH = "Path"; // path from the base url
-
- // fields of ordering for UI
- public static final String FIELD_ORDER = "C-Order";
-
- // field of Partner SDK
- public static final String FIELD_PARTNER = "C-Partner";
-
- // fields of script
- public static final String INSTALL_SCRIPT_LINUX = "install.sh";
- public static final String REMOVE_SCRIPT_LINUX = "remove.sh";
- public static final String INSTALL_SCRIPT_WINDOWS = "Install.bat";
- public static final String REMOVE_SCRIPT_WINDOWS = "Remove.bat";
-
- // fields of ui control
- public static final String FIELD_DEFAULT_CHECK = "Default";
-
- //field of extension server. this field is used by installed list.
- public static final String FIELD_EXTENSION_SERVER = "Extension-server";
-
- // attribute value
- private static final String ATTRIBUTE_ROOT_META = "root";
- private static final String ATTRIBUTE_EXTRA_META = "extra";
- private static final String ATTRIBUTE_INSTALL_META = "install";
- private static final String ATTRIBUTE_TEST_META = "test";
- private static final String ATTRIBUTE_MANDATORY = "mandatory";
- private static final String ATTRIBUTE_PARTNER = "partner";
- private static final String ATTRIBUTE_PUBLIC = "public";
-
- //dependency information
- private static final String START_OF_OS_DEPENDENCY = "[";
-
- private List<Property> mProperties;
- private URL baseURL = null;
- private URL url; // url to the package zip file
-
- private static final int LOWEST_ORDER = 100;
-
- public Package(List<Property> properties) {
- this.mProperties = properties;
- }
-
- /**
- * Make url of package.
- * @param properties package
- * @param repoBaseUrl url before snapshot path.
- */
- public Package(Properties properties, String repoBaseUrl) {
- this(properties);
-
- try {
- if (Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) { // data from file dialog for local installing
- this.url = new URL(repoBaseUrl + "/" + getValue(FIELD_FILE_PATH));
- } else { // data from snapshot and normal 'next' case
- this.url = new URL(repoBaseUrl + "/" + getValue(FIELD_FILE_PATH));
- }
- } catch (MalformedURLException e) {
- Log.err("Invalid package url: "+repoBaseUrl + "/" + getValue(FIELD_FILE_PATH));
- throw new IMFatalException(ErrorCode.WRONG_PACKAGE_URL);
- }
- }
-
- public void setProperties(List<Property> properties) {
- mProperties = properties;
- }
-
- /**
- * @return version of this package. If package does not have version, set version to 0.0.0
- */
- public Version getVersion() {
- String version = getValue(FIELD_VERSION);
- if (version == null || version.isEmpty()) {
- List<Property> props = this.getProperties();
- for (Property p : props) {
- if (p.getName().equalsIgnoreCase(Package.FIELD_VERSION)) {
- p.setValue("0.0.0");
- }
- }
- }
- return new Version(getValue(FIELD_VERSION));
- }
-
- /**
- * @return package name of this package
- */
- public String getPackageName() {
- return getValue(FIELD_PACKAGE);
- }
-
- /**
- * @return name of package.
- */
- public String getLabel() {
- return getValue(FIELD_LABEL);
- }
-
- /**
- * @return the size of zipped package file
- */
- public Long getPackageSize() {
- long result = 0;
- try {
- result = Long.parseLong(getValue(FIELD_PACKAGE_SIZE));
- } catch(NumberFormatException e) {
- Log.err(toString() + " size does not exist.");
- Log.ExceptionLog(e);
- }
-
- return result;
- }
-
- /**
- * @return the real size of package file
- */
- public Long getUncompressedPackageSize() {
- long result = 0;
- try {
- result = Long.parseLong(getValue(FIELD_UNCOMPRESSED_SIZE));
- } catch(NumberFormatException e) {
- // All packages do not have 'Uncompressed-size' filed.
- // In this case, InstallManager use 'Size' field.
- result = Long.parseLong(getValue(FIELD_PACKAGE_SIZE));
- }
-
- return result;
- }
-
- /**
- * @return Path of this package File from repository.
- */
- public String getFileName() {
- return getValue(FIELD_FILE_PATH);
- }
-
- /**
- * @return Description of this package.
- */
- public String getDescription() {
- return getValue(FIELD_DESCRIPTION);
- }
-
- /**
- * @return SHA256 digest of this package file.
- */
- public String getSHA256() {
- return getValue(FIELD_SHA256);
- }
-
- /**
- * @return URL to the package file in repository.
- */
- public URL getURL() {
- return url;
- }
-
- public URL getBaseURL() {
- return baseURL;
- }
-
- public String getPartner() {
- return getValue(FIELD_PARTNER);
- }
-
- /**
- * @return Extension server of this package.
- */
- public String getExtensionServer() {
- return getValue(FIELD_EXTENSION_SERVER);
- }
-
- /**
- * Set extension server to package information.
- * @param extensionServer extension server of this packge
- */
- public void setExtensionServer(String extensionServer) {
- Property property = getProperty(FIELD_EXTENSION_SERVER);
-
- if (property != null) {
- property.setValue(extensionServer);
- } else {
- property = new Property();
- property.setName(FIELD_EXTENSION_SERVER);
- property.setValue(extensionServer);
-
- mProperties.add(property);
- }
- }
- /**
- * Get package order for InstallManager displaying package tree.
- * @return package order
- */
- public int getOrder() {
- String order = getValue(FIELD_ORDER);
- if (order.equals("")) {
- return LOWEST_ORDER;
- } else {
- int nOrder = 0;
- try {
- nOrder = Integer.parseInt(order);
- } catch (NumberFormatException e) {
- Log.err("C-Order field value is not a integer format.");
- return 100;
- }
- return nOrder;
- }
- }
-
- /**
- * @return Remove Script name of this package.
- */
- public String getRemoveScript() {
- if (Platform.CURRENT_PLATFORM == Platform.LINUX_32
- || Platform.CURRENT_PLATFORM == Platform.LINUX_64
- || Platform.CURRENT_PLATFORM == Platform.MACOS_64
- || Platform.CURRENT_PLATFORM == Platform.MACOS_32) {
- return REMOVE_SCRIPT_LINUX;
- } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32
- || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) {
- return REMOVE_SCRIPT_WINDOWS;
- } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) {
- return "";
- }
- return null;
- }
-
- /**
- * @return Install script name of this package.
- */
- public String getInstallScript() {
- if (Platform.isUbuntu() || Platform.isMacOS()) {
- return INSTALL_SCRIPT_LINUX;
- } else if (Platform.isWindows()) {
- return INSTALL_SCRIPT_WINDOWS;
- }
-
- return null;
- }
-
- /**
- * @return List of Property instance.
- */
- public List<Property> getProperties() {
- return mProperties;
- }
-
- /**
- * Get Property instance from key.
- *
- * @param key
- * @return
- */
- private Property getProperty(String key) {
- if (mProperties != null && key != null) {
- for (int i = 0; i < mProperties.size(); i++) {
- if (key.compareTo(mProperties.get(i).getName()) == 0) {
- return mProperties.get(i);
- }
- }
- }
- return null;
- }
-
- /**
- * @param propertyName
- * @return string value of the property name. empty string if there's no such property name
- */
- private String getValue(String propertyName) {
- for(Property prop : mProperties) {
- if(prop.getName().equals(propertyName)) {
- return prop.getValue();
- }
- }
- return "";
- }
-
- /**
- * @return Attribute value.
- */
- public String getAttribute() {
- return getValue(FIELD_ATTRIBUTE);
- }
-
- /**
- * @return <code>true</code> if this package is a meta package.
- */
- public boolean isMeta() {
- // onlyDownload option, in this case, do not need separate public meta package
- // to partner meta package because installmanager should download all meta packages.
- if (Options.onlyDownload) {
- if (isRootMeta() || isInstallMeta() || isExtraMeta() ||
- isPublicMeta() || isPartnerMeta() || isMandatory()) {
- return true;
- } else {
- return false;
- }
- }
-
- if (Options.doTest) { // include test packages for SDK testing
- if (isRootMeta() || isInstallMeta() || isExtraMeta() || isMandatory() || isPublicMeta() || isTestMeta()) {
- return true;
- } else {
- return false;
- }
- } else { // except test packages for normal SDK.
- if (isRootMeta() || isInstallMeta() || isExtraMeta() || isMandatory() || isPublicMeta()) {
- return true;
- } else {
- return false;
- }
- }
- }
-
- /**
- * @return <code>true</code> if this package is a root meta package.
- */
- public boolean isRootMeta() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_ROOT_META)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * @return <code>true</code> if this package is a extra meta package.
- */
- public boolean isExtraMeta() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_EXTRA_META)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Check to belong to partner sdk given package
- * @return <code>true</code> if this package is a partner package.
- */
- public boolean isPartnerMeta() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_PARTNER)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Check to belong to partner sdk given package
- * @return <code>true</code> if this package is a partner package.
- */
- public boolean isPublicMeta() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_PUBLIC)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * @return <code>true</code> if this meta package is a install meta package.
- */
- public boolean isInstallMeta() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_INSTALL_META)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * @return <code>true</code> if this meta package is a install meta package.
- */
- public boolean isTestMeta() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_TEST_META)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * @return <code>true</code>, if this package is a mandatory package. This package must install.
- */
- public boolean isMandatory() {
- String attributeValue = getAttribute().trim();
-
- if (attributeValue.equalsIgnoreCase(ATTRIBUTE_MANDATORY)) {
- return true;
- } else {
- return false;
- }
- }
-
- public boolean isExtensionPackage() {
- String extensionServer = getExtensionServer();
-
- if (extensionServer == null || extensionServer.isEmpty()) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * @return package names that this package directly depends on
- */
- public Collection<String> getDependentPackageNames() {
- HashSet<String> depends = new HashSet<String>();
- String dependsStr = getValue(FIELD_DEPENDS);
- String deps[] = dependsStr.split(",");
- for(int i = 0; i < deps.length; i++) {
- String dep = removeOSInformationOfDepends(deps[i]);
-
- if(!dep.isEmpty()) {
- depends.add(dep);
- }
- }
- return depends;
- }
-
- private String removeOSInformationOfDepends(String info) {
- //Log.log("Package.removeOSInformation (info => " + info + ")");
-
- if (info.contains(START_OF_OS_DEPENDENCY)) {
- int index = info.indexOf(START_OF_OS_DEPENDENCY);
- String pkgInfo = info.substring(0, index).trim();
-
- return pkgInfo;
- } else {
- return info.trim();
- }
- }
-
- /**
- * @return package names that this package directly conflicts to
- */
- public Collection<String> getConflictPackageNames() {
- HashSet<String> conflicts = new HashSet<String>();
- String conflictsStr = getValue(FIELD_CONFLICTS);
- String confs[] = conflictsStr.split(",");
- for(int i = 0; i < confs.length; i++) {
- conflicts.add(confs[i].trim());
- }
- return conflicts;
- }
-
- public String toString() {
- return getPackageName();
- }
-
- /**
- * Checks equality symbolically only using their package names.
- * @return <code>true</code> if they have the same package name.
- */
- public boolean equals(Object obj) {
- if (obj instanceof Package) {
- Package pkg2 = (Package)obj;
- return this.getPackageName().equals(pkg2.getPackageName());
- } else {
- return false;
- }
- }
-
- public int hashCode() {
- return getPackageName().hashCode();
- }
-}
+/*\r
+* InstallManager\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact: \r
+* Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+* Shihyun Kim <shihyun.kim@samsung.com>\r
+* Taeyoung Son <taeyoung2.son@samsung.com>\r
+* Yongsung kim <yongsung1.kim@samsung.com>\r
+* \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/ \r
+\r
+package org.tizen.installmanager.pkg.model;\r
+\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+import java.util.Collection;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+\r
+import org.tizen.installmanager.core.IMFatalException;\r
+import org.tizen.installmanager.core.Options;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.util.PathUtil;\r
+\r
+/**\r
+ * This class describes a package.\r
+ * \r
+ * @author Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+ *\r
+ */\r
+public class Package {\r
+ \r
+ // fields of package control\r
+ // mandatory\r
+ public static final String FIELD_PACKAGE = "Package";\r
+ public static final String FIELD_VERSION = "Version";\r
+ public static final String FIELD_LABEL = "Label";\r
+ public static final String FIELD_MAINTAINER = "Maintainer";\r
+ public static final String FIELD_DESCRIPTION = "Description";\r
+\r
+ // etc\r
+ public static final String FIELD_DEPENDS = "Install-dependency"; // list of packages that this package depends on\r
+ public static final String FIELD_CONFLICTS = "Conflicts";\r
+ public static final String FIELD_PACKAGE_SIZE = "Size"; // size of zipped package\r
+ public static final String FIELD_UNCOMPRESSED_SIZE = "Uncompressed-size"; // uncompressed size of package\r
+ \r
+ // fields of installed control\r
+ public static final String FIELD_ATTRIBUTE = "Attribute";\r
+ \r
+ // fields of repository control\r
+ public static final String FIELD_SHA256 = "SHA256";\r
+ public static final String FIELD_FILE_PATH = "Path"; // path from the base url\r
+ \r
+ // fields of ordering for UI\r
+ public static final String FIELD_ORDER = "C-Order";\r
+ \r
+ // field of Partner SDK\r
+ public static final String FIELD_PARTNER = "C-Partner";\r
+ \r
+ // fields of script\r
+ public static final String INSTALL_SCRIPT_LINUX = "install.sh";\r
+ public static final String REMOVE_SCRIPT_LINUX = "remove.sh";\r
+ public static final String INSTALL_SCRIPT_WINDOWS = "Install.bat";\r
+ public static final String REMOVE_SCRIPT_WINDOWS = "Remove.bat";\r
+ \r
+ // fields of ui control\r
+ public static final String FIELD_DEFAULT_CHECK = "Default";\r
+ \r
+ //field of extension server. this field is used by installed list.\r
+ public static final String FIELD_EXTENSION_SERVER = "Extension-server"; \r
+ \r
+ // attribute value\r
+ private static final String ATTRIBUTE_ROOT_META = "root";\r
+ private static final String ATTRIBUTE_EXTRA_META = "extra";\r
+ private static final String ATTRIBUTE_INSTALL_META = "install";\r
+ private static final String ATTRIBUTE_TEST_META = "test";\r
+ private static final String ATTRIBUTE_MANDATORY = "mandatory";\r
+ private static final String ATTRIBUTE_PARTNER = "partner";\r
+ private static final String ATTRIBUTE_PUBLIC = "public";\r
+\r
+ //dependency information\r
+ private static final String START_OF_OS_DEPENDENCY = "[";\r
+ \r
+ private List<Property> mProperties;\r
+ private URL baseURL = null; \r
+ private URL url; // url to the package zip file\r
+ \r
+ private static final int LOWEST_ORDER = 100;\r
+ \r
+ public Package(List<Property> properties) {\r
+ this.mProperties = properties;\r
+ }\r
+\r
+ /**\r
+ * Make url of package.\r
+ * @param properties package\r
+ * @param repoBaseUrl url before snapshot path.\r
+ */\r
+ public Package(Properties properties, String repoBaseUrl) {\r
+ this(properties);\r
+ \r
+ try {\r
+ this.baseURL = new URL(repoBaseUrl);\r
+ this.url = new URL(PathUtil.addURLPath(repoBaseUrl, getValue(FIELD_FILE_PATH)));\r
+ } catch (MalformedURLException e) {\r
+ Log.err("Invalid package url: "+repoBaseUrl + "/" + getValue(FIELD_FILE_PATH));\r
+ throw new IMFatalException(ErrorCode.WRONG_PACKAGE_URL);\r
+ }\r
+ }\r
+ \r
+ public void setProperties(List<Property> properties) {\r
+ mProperties = properties;\r
+ }\r
+\r
+ /**\r
+ * @return version of this package. If package does not have version, set version to 0.0.0\r
+ */\r
+ public Version getVersion() {\r
+ String version = getValue(FIELD_VERSION);\r
+ if (version == null || version.isEmpty()) {\r
+ List<Property> props = this.getProperties();\r
+ for (Property p : props) {\r
+ if (p.getName().equalsIgnoreCase(Package.FIELD_VERSION)) {\r
+ p.setValue("0.0.0");\r
+ }\r
+ }\r
+ }\r
+ return new Version(getValue(FIELD_VERSION)); \r
+ }\r
+ \r
+ /**\r
+ * @return package name of this package\r
+ */\r
+ public String getPackageName() {\r
+ return getValue(FIELD_PACKAGE);\r
+ }\r
+ \r
+ /**\r
+ * @return name of package.\r
+ */\r
+ public String getLabel() {\r
+ return getValue(FIELD_LABEL);\r
+ }\r
+ \r
+ /**\r
+ * @return the size of zipped package file \r
+ */\r
+ public Long getPackageSize() {\r
+ long result = 0;\r
+ try {\r
+ result = Long.parseLong(getValue(FIELD_PACKAGE_SIZE));\r
+ } catch(NumberFormatException e) {\r
+ Log.err(toString() + " size does not exist.");\r
+ Log.ExceptionLog(e);\r
+ }\r
+ \r
+ return result;\r
+ }\r
+ \r
+ /**\r
+ * @return the real size of package file \r
+ */\r
+ public Long getUncompressedPackageSize() {\r
+ long result = 0;\r
+ try {\r
+ result = Long.parseLong(getValue(FIELD_UNCOMPRESSED_SIZE));\r
+ } catch(NumberFormatException e) {\r
+ // All packages do not have 'Uncompressed-size' filed.\r
+ // In this case, InstallManager use 'Size' field.\r
+ result = Long.parseLong(getValue(FIELD_PACKAGE_SIZE)); \r
+ }\r
+ \r
+ return result;\r
+ }\r
+ \r
+ /**\r
+ * @return Path of this package File from repository. \r
+ */\r
+ public String getFileName() {\r
+ return getValue(FIELD_FILE_PATH);\r
+ }\r
+ \r
+ /**\r
+ * @return Description of this package.\r
+ */\r
+ public String getDescription() {\r
+ return getValue(FIELD_DESCRIPTION);\r
+ }\r
+ \r
+ /**\r
+ * @return SHA256 digest of this package file.\r
+ */\r
+ public String getSHA256() {\r
+ return getValue(FIELD_SHA256);\r
+ }\r
+ \r
+ /**\r
+ * @return URL to the package file in repository.\r
+ */\r
+ public URL getURL() {\r
+ return url;\r
+ }\r
+ \r
+ public URL getBaseURL() {\r
+ return baseURL;\r
+ }\r
+ \r
+ public String getPartner() {\r
+ return getValue(FIELD_PARTNER);\r
+ }\r
+ \r
+ /**\r
+ * @return Extension server of this package.\r
+ */\r
+ public String getExtensionServer() {\r
+ return getValue(FIELD_EXTENSION_SERVER);\r
+ }\r
+ \r
+ /**\r
+ * Set extension server to package information.\r
+ * @param extensionServer extension server of this packge\r
+ */\r
+ public void setExtensionServer(String extensionServer) {\r
+ Property property = getProperty(FIELD_EXTENSION_SERVER);\r
+\r
+ if (property != null) {\r
+ property.setValue(extensionServer);\r
+ } else {\r
+ property = new Property();\r
+ property.setName(FIELD_EXTENSION_SERVER);\r
+ property.setValue(extensionServer);\r
+\r
+ mProperties.add(property);\r
+ }\r
+ }\r
+ /**\r
+ * Get package order for InstallManager displaying package tree.\r
+ * @return package order\r
+ */\r
+ public int getOrder() {\r
+ String order = getValue(FIELD_ORDER);\r
+ if (order.equals("")) {\r
+ return LOWEST_ORDER;\r
+ } else {\r
+ int nOrder = 0;\r
+ try {\r
+ nOrder = Integer.parseInt(order);\r
+ } catch (NumberFormatException e) {\r
+ Log.err("C-Order field value is not a integer format.");\r
+ return 100;\r
+ }\r
+ return nOrder; \r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @return Remove Script name of this package.\r
+ */\r
+ public String getRemoveScript() {\r
+ if (Platform.CURRENT_PLATFORM == Platform.LINUX_32\r
+ || Platform.CURRENT_PLATFORM == Platform.LINUX_64\r
+ || Platform.CURRENT_PLATFORM == Platform.MACOS_64\r
+ || Platform.CURRENT_PLATFORM == Platform.MACOS_32) {\r
+ return REMOVE_SCRIPT_LINUX;\r
+ } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32\r
+ || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) {\r
+ return REMOVE_SCRIPT_WINDOWS;\r
+ } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) {\r
+ return "";\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ /**\r
+ * @return Install script name of this package.\r
+ */\r
+ public String getInstallScript() {\r
+ if (Platform.isUbuntu() || Platform.isMacOS()) {\r
+ return INSTALL_SCRIPT_LINUX;\r
+ } else if (Platform.isWindows()) {\r
+ return INSTALL_SCRIPT_WINDOWS;\r
+ }\r
+ \r
+ return null;\r
+ }\r
+ \r
+ /**\r
+ * @return List of Property instance.\r
+ */\r
+ public List<Property> getProperties() {\r
+ return mProperties;\r
+ }\r
+ \r
+ /**\r
+ * Get Property instance from key.\r
+ * \r
+ * @param key\r
+ * @return\r
+ */\r
+ private Property getProperty(String key) {\r
+ if (mProperties != null && key != null) {\r
+ for (int i = 0; i < mProperties.size(); i++) {\r
+ if (key.compareTo(mProperties.get(i).getName()) == 0) {\r
+ return mProperties.get(i);\r
+ }\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * @param propertyName\r
+ * @return string value of the property name. empty string if there's no such property name\r
+ */\r
+ private String getValue(String propertyName) {\r
+ for(Property prop : mProperties) {\r
+ if(prop.getName().equals(propertyName)) {\r
+ return prop.getValue();\r
+ }\r
+ }\r
+ return "";\r
+ }\r
+ \r
+ /**\r
+ * @return Attribute value.\r
+ */\r
+ public String getAttribute() {\r
+ return getValue(FIELD_ATTRIBUTE);\r
+ }\r
+\r
+ /**\r
+ * @return <code>true</code> if this package is a meta package.\r
+ */\r
+ public boolean isMeta() {\r
+ // onlyDownload option, in this case, do not need separate public meta package \r
+ // to partner meta package because installmanager should download all meta packages.\r
+ if (Options.onlyDownload) {\r
+ if (isRootMeta() || isInstallMeta() || isExtraMeta() ||\r
+ isPublicMeta() || isPartnerMeta() || isMandatory()) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ if (Options.doTest) { // include test packages for SDK testing\r
+ if (isRootMeta() || isInstallMeta() || isExtraMeta() || isMandatory() || isPublicMeta() || isTestMeta()) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ } else { // except test packages for normal SDK.\r
+ if (isRootMeta() || isInstallMeta() || isExtraMeta() || isMandatory() || isPublicMeta()) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @return <code>true</code> if this package is a root meta package.\r
+ */\r
+ public boolean isRootMeta() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_ROOT_META)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @return <code>true</code> if this package is a extra meta package.\r
+ */\r
+ public boolean isExtraMeta() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_EXTRA_META)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check to belong to partner sdk given package\r
+ * @return <code>true</code> if this package is a partner package.\r
+ */\r
+ public boolean isPartnerMeta() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_PARTNER)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ } \r
+ }\r
+ \r
+ /**\r
+ * Check to belong to partner sdk given package\r
+ * @return <code>true</code> if this package is a partner package.\r
+ */\r
+ public boolean isPublicMeta() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_PUBLIC)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ } \r
+ \r
+ /**\r
+ * @return <code>true</code> if this meta package is a install meta package.\r
+ */\r
+ public boolean isInstallMeta() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_INSTALL_META)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @return <code>true</code> if this meta package is a install meta package.\r
+ */\r
+ public boolean isTestMeta() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_TEST_META)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @return <code>true</code>, if this package is a mandatory package. This package must install.\r
+ */\r
+ public boolean isMandatory() {\r
+ String attributeValue = getAttribute().trim();\r
+ \r
+ if (attributeValue.equalsIgnoreCase(ATTRIBUTE_MANDATORY)) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public boolean isExtensionPackage() {\r
+ String extensionServer = getExtensionServer();\r
+ \r
+ if (extensionServer == null || extensionServer.isEmpty()) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @return package names that this package directly depends on\r
+ */\r
+ public Collection<String> getDependentPackageNames() {\r
+ HashSet<String> depends = new HashSet<String>();\r
+ String dependsStr = getValue(FIELD_DEPENDS);\r
+ String deps[] = dependsStr.split(",");\r
+ for(int i = 0; i < deps.length; i++) {\r
+ String dep = removeOSInformationOfDepends(deps[i]);\r
+\r
+ if(!dep.isEmpty()) {\r
+ depends.add(dep);\r
+ }\r
+ }\r
+ return depends;\r
+ }\r
+ \r
+ private String removeOSInformationOfDepends(String info) { \r
+ //Log.log("Package.removeOSInformation (info => " + info + ")");\r
+ \r
+ if (info.contains(START_OF_OS_DEPENDENCY)) {\r
+ int index = info.indexOf(START_OF_OS_DEPENDENCY);\r
+ String pkgInfo = info.substring(0, index).trim();\r
+ \r
+ return pkgInfo;\r
+ } else {\r
+ return info.trim();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @return package names that this package directly conflicts to\r
+ */\r
+ public Collection<String> getConflictPackageNames() {\r
+ HashSet<String> conflicts = new HashSet<String>();\r
+ String conflictsStr = getValue(FIELD_CONFLICTS);\r
+ String confs[] = conflictsStr.split(",");\r
+ for(int i = 0; i < confs.length; i++) {\r
+ conflicts.add(confs[i].trim());\r
+ }\r
+ return conflicts;\r
+ }\r
+ \r
+ public String toString() {\r
+ return getPackageName();\r
+ }\r
+ \r
+ /**\r
+ * Checks equality symbolically only using their package names.\r
+ * @return <code>true</code> if they have the same package name.\r
+ */\r
+ public boolean equals(Object obj) {\r
+ if (obj instanceof Package) {\r
+ Package pkg2 = (Package)obj;\r
+ return this.getPackageName().equals(pkg2.getPackageName());\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public int hashCode() {\r
+ return getPackageName().hashCode();\r
+ }\r
+}\r
-/*
-* InstallManager
-*
-* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Wooyoung Cho <wooyoung1.cho@samsung.com>
-* Shihyun Kim <shihyun.kim@samsung.com>
-* Taeyoung Son <taeyoung2.son@samsung.com>
-* Yongsung kim <yongsung1.kim@samsung.com>
-*
- * Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
-
-package org.tizen.installmanager.ui;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.tizen.installmanager.cli.InstallManagerNoUI;
-import org.tizen.installmanager.core.Config;
-import org.tizen.installmanager.core.IMExitException;
-import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.InstallManager;
-import org.tizen.installmanager.core.InstallManagerConstants;
-import org.tizen.installmanager.core.Options;
-import org.tizen.installmanager.core.Performance;
-import org.tizen.installmanager.lib.ErrorController;
-import org.tizen.installmanager.lib.IMError;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Patch;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.ProgramController;
-import org.tizen.installmanager.lib.Registry;
-import org.tizen.installmanager.lib.exception.IMNetworkException;
-import org.tizen.installmanager.lib.mac.CocoaUtil;
-import org.tizen.installmanager.pkg.lib.PackageManager;
-import org.tizen.installmanager.pkg.model.ConfigFile;
-import org.tizen.installmanager.pkg.model.PackageSet;
-import org.tizen.installmanager.ui.dialog.AddExtraRepositoryDialog;
-import org.tizen.installmanager.ui.dialog.IndeterminateProgressDialog;
-import org.tizen.installmanager.ui.dialog.MessageBoxDlg;
-import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType;
-import org.tizen.installmanager.ui.dialog.ProxySettingsDialog;
-import org.tizen.installmanager.ui.model.Item;
-import org.tizen.installmanager.ui.page.CompletePage;
-import org.tizen.installmanager.ui.page.InstallPage;
-import org.tizen.installmanager.ui.page.InstallableListPage;
-import org.tizen.installmanager.ui.page.InstallingPage;
-import org.tizen.installmanager.ui.page.LicensePage;
-import org.tizen.installmanager.ui.page.SetInstallDirectoryPage;
-import org.tizen.installmanager.ui.page.UninstallableListPage;
-import org.tizen.installmanager.ui.page.UninstallingPage;
-import org.tizen.installmanager.ui.page.UpdatableListPage;
-import org.tizen.installmanager.ui.page.ViewController;
-import org.tizen.installmanager.ui.page.WelcomePage;
-import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor;
-import org.tizen.installmanager.ui.page.WelcomePage.INSTALLMANAGER_ACTION;
-import org.tizen.installmanager.util.PathUtil;
-import org.tizen.installmanager.pkg.model.Package;
-
-
-/**
- * This class is main class for install manager.
- * @author Taeyoung Son <taeyoung2.son@samsung.com>
- */
-public class InstallManagerWindow extends ApplicationWindow {
- private static final RGB RGB_BACKGROUND = new RGB(242, 242, 242);
-
- private static final Point POINT_MAIN_WINDOW = new Point(628, 478);
- private static Image IMAGE_WINDOW_ICON;
- private static Color COLOR_BACKGROUND;
-
- private static InstallManagerWindow window;
-
-// private StackLayout sl_composite = new StackLayout();
- public StackLayout sl_composite = new StackLayout();
- private static Button btnClose;
- private static Button btnBack;
- private static Button btnNext;
-
- private Composite pageComposite; // Page area
- private WelcomePage compositeWelcomePage;
- private LicensePage compositeLicensePage;
- private InstallableListPage compositeInstallableListPage;
- private UninstallableListPage compositeUninstallableListPage;
- private InstallingPage compositeInstallingPage;
- private UninstallingPage compositeUninstallingPage;
- private CompletePage compositeCompletePage;
- private SetInstallDirectoryPage compositeSetInstallDirectoryPage;
- public UpdatableListPage compositeUpdatableListPage;
-
- protected static ViewController controller;
- private SelectionAdapter cancelBtnSelectionAdapter = null;
- private SelectionAdapter closeBtnSelectionAdapter = null;
-
- /**
- * Create the application window.
- */
- public InstallManagerWindow() {
- super(null);
- setShellStyle(SWT.SHELL_TRIM);
- setShellStyle(SWT.BORDER | SWT.TITLE);
- }
-
- /**
- * Get installmanager window background color.
- * @return background color
- */
- public static Color getBackgroundColor() {
- if (COLOR_BACKGROUND == null) {
- COLOR_BACKGROUND = new Color(null, RGB_BACKGROUND);
- }
- return COLOR_BACKGROUND;
- }
-
- private static Image getWindowIconImage() {
- if (IMAGE_WINDOW_ICON == null) {
- IMAGE_WINDOW_ICON = PathUtil.getImageFromResource("/res/icons/SDK_icon.png");
- }
- return IMAGE_WINDOW_ICON;
- }
-
- private void init() throws IMExitException{
- Log.log("Window init start");
-
- //make waiting dialog.
- final IndeterminateProgressDialog progressbar = IndeterminateProgressDialog.getInstance();
-
- final Shell shell = progressbar.getParent();
- shell.getDisplay().asyncExec(new Runnable(){
- public void run() {
- //initialize installmanager
- progressbar.updateName("Connecting to package server.\nIt may take a minute...");
-
- shell.getDisplay().asyncExec(new Runnable() {
- public void run() {
- initInstallManager();
- }
-
- });
-
- //init end
- progressbar.finish();
- }
- });
-
- if (!shell.isDisposed()) {
- progressbar.open();
- }
-
- Log.log("Window init end");
- }
-
- private void updateInstallManager(Shell shell) {
- if (controller.canInstallManagerUpdate()) {
- String msg = "There is a new installer on the server. \nNew install-manager will be started. \nIt may take a minute...";
- MessageBoxDlg.showDlg(shell, "InstallManager", msg, DialogType.NOTIFY, false);
-
- controller.updateInstallManager();
- }
- }
-
- /**
- * init IM's configuation and packages information.
- * @return
- */
- public boolean initInstallManager() {
- ErrorController.setInstallationSuccess(true);
-
- controller = new ViewController();
-
- if (controller.init()) {
- if (Config.isSupportMultiSDK()) {
- Log.log("Multi SDK installation.");
- } else {
- Log.log("Single SDK installation.");
- }
- return true;
- } else {
- Log.err("InstallManager init fail.");
- ErrorController.setInstallationSuccess(false);
-
- return false;
- }
- }
-
- /**
- * Create contents of the application window.
- *
- * @param parent
- */
- @Override
- protected Control createContents(Composite parent) {
-
- parent.setSize(630, 490);
- IMError.setComposite(parent);
- Composite container = new Composite(parent, SWT.NONE);
-
- // Set layout attributes.
- RowLayout rl_container = new RowLayout(SWT.VERTICAL);
- rl_container.spacing = 0;
- rl_container.marginTop = 0;
- rl_container.marginRight = 0;
- rl_container.marginLeft = 0;
- rl_container.marginBottom = 0;
- container.setLayout(rl_container);
-
- // Set page composite size. (image, label, etc.)
- pageComposite = new Composite(container, SWT.NONE);
- pageComposite.setLayoutData(new RowData(628, 405));
- pageComposite.setLayout(sl_composite);
-
- Composite composite_buttonArea = new Composite(container, SWT.NONE);
- composite_buttonArea.setLayoutData(new RowData(628, 52));
- composite_buttonArea.setBackground(getBackgroundColor());
-
- setButtonClose(composite_buttonArea);
- setButtonNext(composite_buttonArea);
- setButtonBack(composite_buttonArea);
-
- compositeWelcomePage = new WelcomePage(pageComposite, SWT.NONE);
- compositeLicensePage = new LicensePage(pageComposite, SWT.NONE);
- compositeCompletePage = new CompletePage(pageComposite, SWT.NONE);
- compositeInstallingPage = new InstallingPage(pageComposite, SWT.NONE);
- compositeInstallableListPage = new InstallableListPage(pageComposite, SWT.NONE);
- compositeUninstallingPage = new UninstallingPage(pageComposite, SWT.NONE);
- compositeUninstallableListPage = new UninstallableListPage(pageComposite, SWT.NONE);
- compositeSetInstallDirectoryPage = new SetInstallDirectoryPage(pageComposite, SWT.NONE);
- compositeUpdatableListPage = new UpdatableListPage(pageComposite, SWT.NONE);
-
-// registLicensePageListener();
-// registCompletePageListener();
-
- initWelcomePage();
-
- return container;
- }
-
- private void setButtonClose(Composite composite) {
- btnClose = new Button(composite, SWT.NONE);
- btnClose.setText("Cancel");
- cancelBtnSelectionAdapter = new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- int result = MessageBoxDlg.NO;
- if (sl_composite.topControl == compositeInstallingPage) {
- InstallProgressMonitor mon = compositeInstallingPage.getInstallProgressMonitor();
- mon.setCancelRequested(true);
- result = MessageBoxDlg.showDlg(
- e.display.getActiveShell(),
- "Tizen SDK Install Manager",
- "Are you sure you want to quit Install Manager?\n\nIf you click \"Yes\", the installation is stopped.",
- DialogType.WARNING, false);
- if (result == MessageBoxDlg.YES) {
- mon.setCanceled(true);
- } else {
- mon.setCancelRequested(false);
- }
- return;
- } else if (sl_composite.topControl == compositeUninstallingPage) {
- result = MessageBoxDlg.showDlg(
- e.display.getActiveShell(),
- "Tizen SDK Install Manager",
- "Are you sure to quit Install Manager?\n\nIf you click \"Yes\", the uninstallation is stopped.",
- DialogType.WARNING, false);
- } else if (sl_composite.topControl == compositeCompletePage) {
- controller.showChangeLog();
-
- if (!Options.doResumeDownloading) {
- controller.cleanUpTargetDirectory();
- }
-
- result = MessageBoxDlg.YES;
- } else {
- result = MessageBoxDlg.showDlg(e.display.getActiveShell(),
- "Tizen SDK Install Manager",
- "Are you sure to quit Install Manager?",
- DialogType.WARNING, false);
- }
-
- if (result == MessageBoxDlg.YES) {
- e.display.close();
- }
- }
- };
-
- closeBtnSelectionAdapter = new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- arg0.display.close();
- }
- };
-
- btnClose.addSelectionListener(cancelBtnSelectionAdapter);
- btnClose.setBounds(531, 10, 78, 29);
- }
-
- private void setButtonNext(Composite composite) {
- btnNext = new Button(composite, SWT.NONE);
- btnNext.setText("Next");
- btnNext.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- if (sl_composite.topControl == compositeWelcomePage) {
- updateInstallManager(e.display.getActiveShell());
- btnNext.setVisible(false);
- if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.INSTALL) {
- if (!checkVaildPkgVersion()) {
- return;
- }
-
- if (!controller.isNewInstallation()) {// Update case
- Config.status = Config.Status.UPDATE;
- compositeUpdatableListPage.loadPage(controller);
- btnBack.setVisible(true);
- btnNext.setVisible(true);
- showComposite(compositeUpdatableListPage);
- if (controller.existRemovablePackage()) {
- btnNext.setText("Install");
- }
- btnBack.setVisible(true);
- } else {
- boolean hasItem = compositeInstallableListPage.loadPage(controller);
- if (hasItem) {
- Config.status = Config.Status.INSTALL;
- showComposite(compositeInstallableListPage);
- btnNext.setVisible(true);
- btnNext.setEnabled(hasItem);
- btnBack.setVisible(hasItem);
- if (controller.existRemovablePackage()) {
- btnNext.setText("Install");
- }
- } else {
- Log.err("Installable packages do not exist. This is error.");
- //TODO
- }
- }
- } else if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.UPDATE) {
-// btnNext.setEnabled(compositeLicensePage.getAcceptButton().getSelection());
- btnNext.setEnabled(true);
- PackageManager.dispose();
- initInstallManager();
- compositeUpdatableListPage.loadPage(controller);
- btnBack.setVisible(true);
- showComposite(compositeUpdatableListPage);
- if (controller.existRemovablePackage()) {
- btnNext.setText("Install");
- }
- btnBack.setVisible(true);
- } else if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.UNINSTALL) {
- showComposite(compositeUninstallableListPage);
- btnNext.setVisible(true);
- btnBack.setVisible(true);
- btnNext.setText("Uninstall");
- compositeUninstallableListPage.loadPage(controller);
-// int resultDialog = MessageBoxDlg.NO;
-// resultDialog = MessageBoxDlg.showDlg(
-// e.display.getActiveShell(),
-// "Tizen SDK Install Manager",
-// "Are you sure you want to remove the Tizen SDK?\n\nIf you click \"Yes\", the Tizen SDK is uninstalled.",
-// DialogType.WARNING, false);
-// if (resultDialog == MessageBoxDlg.YES) {
-// showComposite(compositeUninstallingPage);
-// btnBack.setVisible(false);
-// btnNext.setVisible(false);
-// btnClose.setEnabled(false);
-//
-// if (Config.isSupportMultiSDK()) {
-// PackageManager.dispose();
-// initInstallManager();
-// }
-//
-// List<Item> items = compositeUninstallablePage.getItems();
-// boolean result = compositeUninstallingPage.loadPage(getSelectedPackageNames(items) /* compositeInstallablePage.getCheckedPackageNames()*/,
-// controller,
-// window);
-// if (!result) {
-// showComposite(compositeWelcomePage);
-// btnBack.setVisible(true);
-// btnNext.setVisible(true);
-// btnClose.setEnabled(true);
-// }
-// } else {
-// return;
-// }
- }
- } else if (sl_composite.topControl == compositeInstallableListPage) {
-// btnNext.setEnabled(compositeLicensePage.getAcceptButton().getSelection());
- btnNext.setEnabled(true);
- if (Config.isSupportMultiSDK()) {
- compositeLicensePage.loadPage(compositeInstallableListPage.getSelectedItems());
- showComposite(compositeLicensePage);
- btnBack.setVisible(true);
- } else {
- if (!controller.isNewInstallation()) {// Update case
- compositeUpdatableListPage.loadPage(controller);
- btnBack.setVisible(true);
- showComposite(compositeUpdatableListPage);
- if (controller.existRemovablePackage()) {
- btnNext.setText("Install");
- }
- btnBack.setVisible(true);
- } else {
- //License page button status setting.
- compositeLicensePage.loadPage(compositeInstallableListPage.getSelectedItems());
- showComposite(compositeLicensePage);
- btnNext.setText("I agree");
- btnNext.setEnabled(true);
- btnNext.setFocus();
- btnBack.setVisible(true);
- }
- }
- } else if (sl_composite.topControl == compositeLicensePage) {
- List<Item> items = compositeInstallableListPage.getItems();
- if (getSelectedPackageNames(items).size() <= 0) {
- return;
- }
- if (Config.isSupportMultiSDK()) {
- showComposite(compositeSetInstallDirectoryPage);
- compositeSetInstallDirectoryPage.loadPage(
- controller, compositeInstallableListPage.getCheckedPackageSize(false));
-// btnNext.setText("Install");
- } else {
- if (controller.existRemovablePackage()) { // update case
- btnBack.setVisible(false);
- btnNext.setVisible(false);
- showComposite(compositeInstallingPage);
- boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items),
- controller,
- Registry.getInstalledPath(),
- window, true);
- if (!result) {
- showComposite(compositeInstallableListPage);
- btnBack.setVisible(true);
- btnNext.setVisible(true);
- btnClose.setEnabled(true);
- }
- } else {
- showComposite(compositeSetInstallDirectoryPage);
- compositeSetInstallDirectoryPage.loadPage(
- controller, compositeInstallableListPage.getCheckedPackageSize(false));
- btnNext.setText("Install");
-// btnNext.setVisible(false);
-// btnBack.setBounds(447, 10, 78, 29);
- }
- }
- } else if (sl_composite.topControl == compositeUpdatableListPage) {
- List<Item> items = compositeUpdatableListPage.getItems();
- if (getSelectedPackageNames(items).size() <= 0) {
- return;
- }
-
- btnBack.setVisible(false);
- btnNext.setVisible(false);
- showComposite(compositeInstallingPage);
- boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items), controller, Registry.getInstalledPath(), window, true);
-
- if (!result) {
- showComposite(compositeUpdatableListPage);
- btnBack.setVisible(true);
- btnNext.setVisible(true);
- btnClose.setEnabled(true);
- }
- } else if (sl_composite.topControl == compositeSetInstallDirectoryPage) {
- boolean installable = compositeSetInstallDirectoryPage.isInstallablePath();
-
- Config.USER_CONFIG_HOME_PATH = compositeSetInstallDirectoryPage.getSDKWorkSpacePath();
- Registry.sdkDataPath = controller.getSDKWorkSpacePath();
- Registry.targetPath = controller.getInstallPath();
- Registry.saveSDKInfo(Registry.targetPath);
-
- InstallManager.getInstance().initPackageList();
-
- if (!installable) {
- MessageBoxDlg.showDlg(
- Display.getCurrent().getShells()[0],
- "Error",
- "Not enough disk space for the installation. Select a different installation path.",
- DialogType.ERROR, false);
- return;
- }
-
- if (!compositeSetInstallDirectoryPage.isWorkSpaceDuplicate()) {
- int result = MessageBoxDlg.showDlg(
- Display.getCurrent().getShells()[0],
- "Warning",
- "Tizen SDK data directory is used already. Do you want to continue?",
- DialogType.WARNING, false);
- if (result == MessageBoxDlg.NO) {
- return;
- }
- }
-
- btnBack.setVisible(false);
- btnNext.setVisible(false);
- List<Item> items = compositeInstallableListPage.getItems();
- showComposite(compositeInstallingPage);
- boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items),
- controller,
- compositeSetInstallDirectoryPage.getInstallPath(),
- window, false);
- if (!result) {
- showComposite(compositeInstallableListPage);
- btnBack.setVisible(true);
- btnNext.setVisible(true);
- btnClose.setEnabled(true);
- }
- } else if (sl_composite.topControl == compositeUninstallableListPage) {
- showComposite(compositeUninstallingPage);
- btnBack.setVisible(false);
- btnNext.setVisible(false);
- btnClose.setEnabled(false);
- List<Item> items = compositeUninstallableListPage.getItems();
- boolean result = compositeUninstallingPage.loadPage(getSelectedPackageNames(items) /* compositeInstallablePage.getCheckedPackageNames()*/,
- controller,
- window);
- if (!result) {
- showComposite(compositeUninstallableListPage);
- btnBack.setVisible(true);
- btnNext.setVisible(true);
- btnClose.setEnabled(true);
- }
- }
- }
- });
- btnNext.setBounds(447, 10, 78, 29);
- }
-
- private void setButtonBack(Composite composite) {
- btnBack = new Button(composite, SWT.NONE);
- btnBack.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- if (sl_composite.topControl == compositeInstallableListPage
- || sl_composite.topControl == compositeUpdatableListPage) {
- compositeInstallableListPage.getItems().clear();
- showComposite(compositeWelcomePage);
-// if (controller.existRemovablePackage()) {
-// btnBack.setVisible(false);
-// showComposite(compositeWelcomePage);
-// } else {
-// showComposite(compositeLicensePage);
-// }
- btnNext.setVisible(false);
- btnBack.setVisible(false);
- } else if (sl_composite.topControl == compositeLicensePage) {
- btnNext.setEnabled(true);
- btnBack.setVisible(false);
- btnNext.setFocus();
- if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.INSTALL) {
- showComposite(compositeInstallableListPage);
- btnNext.setText("Next");
- btnBack.setVisible(true);
- } else if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.UPDATE) {
- showComposite(compositeUpdatableListPage);
- btnNext.setText("Next");
- btnBack.setVisible(true);
- }
- } else if (sl_composite.topControl == compositeSetInstallDirectoryPage) {
- showComposite(compositeLicensePage);
- btnNext.setText("I agree");
- btnNext.setEnabled(true);
- } else if (sl_composite.topControl == compositeUninstallableListPage) {
- showComposite(compositeWelcomePage);
- btnNext.setVisible(false);
- btnBack.setVisible(false);
- }
- }
- });
- btnBack.setBounds(363, 10, 78, 29);
- btnBack.setText("Back");
- btnBack.setVisible(false);
- }
-
- private void initWelcomePage() {
- compositeWelcomePage.setViewController(controller);
-
- if (ErrorController.checkInstallationSuccess()) {
-// compositeWelcomePage.setTitle(WelcomePage.STRING_TITLE);
-// compositeWelcomePage.setSubTitleBounds(20, 190, 600, 40);
-// compositeWelcomePage.setSubTitle(WelcomePage.STRING_SUBTITLE1);
-//
-// compositeWelcomePage.setVisibleRadioButton(true);
-// btnNext.setEnabled(true);
- btnNext.setVisible(false);
- btnClose.setText("Cancel");
-
- btnClose.removeSelectionListener(closeBtnSelectionAdapter);
- btnClose.removeSelectionListener(cancelBtnSelectionAdapter);
- btnClose.addSelectionListener(cancelBtnSelectionAdapter);
-
- compositeWelcomePage.setButtonStatus();
- } else {
- compositeWelcomePage.setVisibleRadioButton(false);
- btnNext.setVisible(false);
-
- compositeWelcomePage.setTitle("Cannot start Tizen SDK Install Manager.");
-
- String errMsg = ErrorController.getErrorMessage();
- String repository = Config.getInstance().getConfigFile().getRepository();
-
- if (repository != null && !repository.isEmpty()) {
- errMsg = errMsg + "\n(" + repository + ")";
- }
- compositeWelcomePage.setSubTitleBounds(20, 190, 600, 100);
- compositeWelcomePage.setErrorSubTitle(errMsg);
-
- btnClose.setText("Close");
-
- btnClose.removeSelectionListener(closeBtnSelectionAdapter);
- btnClose.removeSelectionListener(cancelBtnSelectionAdapter);
- btnClose.addSelectionListener(closeBtnSelectionAdapter);
- }
- btnNext.setFocus();
- sl_composite.topControl = compositeWelcomePage;
- }
-
- /**
- * Refresh InstallManager.
- * Refresh packages and configuration information.
- */
- public void refresh() {
- final IndeterminateProgressDialog progressbar = IndeterminateProgressDialog.getInstance();
- final Shell shell = progressbar.getParent();
- shell.getDisplay().asyncExec(new Runnable(){
- public void run() {
- progressbar.updateName("Initializing...");
-
- shell.getDisplay().syncExec(new Runnable() {
- public void run() {
- PackageManager.dispose();
- initInstallManager();
- initWelcomePage();
- }
- });
-
- //init end
- progressbar.finish();
- }
- });
-
- if (!shell.isDisposed()) {
- progressbar.open();
- }
-
- Log.log("Window refresh end");
- }
-
- /**
- * Checks if there's updatable meta package.
- * Then print "updatable" to stdout.
- */
- private static void checkMetaPackageUpdate() {
- if (PackageManager.getInstance().getUpdatableMetaPackages().size() != 0) {
- System.out.println("updatable");
- }
- }
-
- /**
- * There is no UI, just download packages.
- * @throws IMExitException
- */
- private static void onlyDownloadPackages() throws IMExitException {
- ViewController controller = new ViewController();
- controller.init();
-
- InstallManager installManager = InstallManager.getInstance();
- PackageManager packageManager = installManager.getPackageManager();
-
- // Get all meta packages list by boundary.(eg. public, partner, all....)
- PackageSet filteredMeta = filterPackageSet();
- PackageSet downloadablePkgs = packageManager.getDependsPackagesFromRepository(filteredMeta);
-
- // Download all meta packages.
- boolean filteredPackages = false;
- try {
- filteredPackages = installManager.downloadPackages(
- downloadablePkgs, null);
- } catch (IMNetworkException e) {
- Log.ExceptionLog(e);
- return;
- }
-
- if (filteredPackages) {
- Log.log("Success to download packages from repository");
- } else {
- Log.err("Fail to download packages from repository");
- return;
- }
- }
-
- private static PackageSet filterPackageSet() {
- PackageManager pm = PackageManager.getInstance();
-
- PackageSet downloadPackageList = pm.getLeafMetaPackages();
-
- String boundary = Options.boundary;
- if (boundary.equalsIgnoreCase("public")) {
- PackageSet partnerMetaPackages = pm.getPartnerMetaPackages();
-
- if (!partnerMetaPackages.isEmpty()) {
- downloadPackageList.removeAll(partnerMetaPackages);
- }
- } else if (boundary.equalsIgnoreCase("partner")) {
- PackageSet publicMetaPackages = pm.getPublicMetaPackages();
-
- if (!publicMetaPackages.isEmpty()) {
- downloadPackageList.removeAll(publicMetaPackages);
- }
- }
-
- return downloadPackageList;
- }
-
- private static void showInstallManagerVersion() {
- System.out.println("InstallManager Version : " +
- Config.getInstance().getInstallManagerVersion().toString());
- }
-
- /**
- * Logging all system information.
- */
- private static void loggingProperty() {
- Log.log("=========== System properties ===========");
- Properties sysprops = System.getProperties();
- for (Enumeration e = sysprops.propertyNames(); e.hasMoreElements();) {
- String key = (String) e.nextElement();
- String value = sysprops.getProperty(key);
- Log.log(key + " = " + value);
- }
-
- Log.log("=========== Environment variables ===========");
-
- Map<String, String> env = System.getenv();
- Set<String> set = env.keySet();
- Iterator<String> iter = set.iterator();
-
- while (iter.hasNext()) {
- String key = (String) iter.next();
- Set<Entry<String, String>> value = env.entrySet();
- Log.log(key + " = " + value);
- }
- Log.log("=============================================");
- }
-
- /**
- * Launch the application.
- *
- * @param args
- */
- public static void main(String args[]) {
- //performance measurement
- Performance.setIMStartTime();
-
- InstallManager.deleteTempFile();
-
- Log.open();
- Log.LogTitle("Installmanager start");
- Log.log(Platform.getPlatformInfo());
- Log.log(PathUtil.getCurrentDir());
-
- if (Options.propertyLogging) {
- loggingProperty();
- }
-
- try {
- Options.loadCmdArgs(args);
- } catch (IMFatalException e) {
- Log.err("Check your options. => " + Arrays.toString(args));
- System.out.println("Check your options. => " + Arrays.toString(args));
- return;
- }
-
- try {
- if (Options.onlyDownload) {
- onlyDownloadPackages();
- System.exit(0);
- } else if (Options.downloadPackage) {
- if (InstallManagerNoUI.cliDownload(Options.packages)) {
- Log.log("Success to download packages. => " + Options.packages);
- System.out.println("Success to download packages. => " + Options.packages);
- } else {
- Log.log("Fail to download packages. => " + Options.packages);
- System.out.println("Fail to download packages. => " + Options.packages);
- }
- System.exit(0);
- } else if (Options.doInstallNoUI) {
- if (InstallManagerNoUI.cliInstall(Options.packages)) {
- Log.log("Success to command line install.");
- System.out.println("Success to console install.");
- Performance.setIMEndTime();
- if (Options.doTest) {
- Performance.printTestResult();
- Performance.printTestResultXmlFormat(true);
- Performance.printTestResultXmlFormat2(true);
- Performance.printTestResultXmlFormat(false);
- Performance.printTestResultXmlFormat2(false);
- }
- } else {
- Log.log("Fail to command line install.");
- System.out.println("Fail to console install.");
- }
-
- Performance.setIMEndTime();
- if (Options.doTest) {
- Performance.printTestResultXmlFormat();
- Performance.printTestResultXmlFormat2();
- }
-
- System.exit(0);
- } else if (Options.doRemoveNoUI) {
- if (InstallManagerNoUI.cliUninstall(Options.packages)) {
- Log.log("Success to command line remove.");
- System.out.println("Success to remove.");
- Performance.setIMEndTime();
- if (Options.doTest) {
- Performance.printTestResult();
- Performance.printTestResultXmlFormat(true);
- Performance.printTestResultXmlFormat2(true);
- Performance.printTestResultXmlFormat(false);
- Performance.printTestResultXmlFormat2(false);
- }
- } else {
- Log.log("Fail to command line remove.");
- System.out.println("Fail to remove.");
- }
-
- Performance.setIMEndTime();
- if (Options.doTest) {
- Performance.printTestResultXmlFormat();
- Performance.printTestResultXmlFormat2();
- }
-
- System.exit(0);
- } else if (Options.showVersion) {
- showInstallManagerVersion();
- System.exit(0);
- } else if (Options.doShowHelp) {
- InstallManagerNoUI.cliShowHelp();
- System.exit(0);
- }
-
- if (Platform.isMacOS()) {
- System.setProperty("apple.laf.useScreenMenuBar", "true");
- System.setProperty(
- "com.apple.mrj.application.apple.menu.about.name",
- "Emulator Manager");
- Display display = Display.getDefault();
- display.syncExec(new Runnable() {
- @Override
- public void run() {
- new CocoaUtil().removeTopMenuItems();
- }
- });
- }
-
- window = new InstallManagerWindow();
- window.setBlockOnOpen(true);
-
- window.init();
-
- Log.log("after init");
- if (Options.checkPackageUpdate) {
- checkMetaPackageUpdate();
- } else if (Options.printDepGraph) {
- InstallManager.getInstance().getPackageManager().printDepGraph();
- } else if (Options.doShowDistListNoUI) {
- InstallManagerNoUI.cliShowRepoInformation();
- } else if (Options.doShowPackageListNoUI) {
- InstallManagerNoUI.cliShowPackageList();
- } else if (Options.doShowSDKInstallStatus) {
- InstallManagerNoUI.cliShowInstallInformation();
- } else if (Options.doSDKPatch) {
- InstallManagerNoUI.cliSDKPatch();
- System.exit(0);
- } else {
- window.open();
- if (Display.getCurrent() != null
- && !Display.getCurrent().isDisposed()) {
- Display.getCurrent().dispose();
- }
- }
- } catch (IMExitException e) {
- // do not remove sdk temp dir if exit for self update
- if (ErrorController.getExitCode() == Config.EXITCODE_HAS_SELF_UPDATE) {
- Options.doRemoveTempTizenSDK = false;
- }
-
- Log.log("Gracefully exit");
- } catch (Throwable e) {
- Log.err("Unexpected error occurred");
- Log.ExceptionLog(e);
-
- if (Options.doSDKPatch) {
- System.out.println("Fail to SDK patch process.");
- PathUtil.remove(PathUtil.get(
- Registry.getInstalledPath(), InstallManagerConstants.SDK_PATCH_TEMP_NAME));
- System.exit(0);
- }
-
- if (Options.doInstallNoUI || Options.doRemoveNoUI) {
- PathUtil.remove(Registry.REGISTRY_FILE_PATH);
- PathUtil.remove(Registry.MULTI_SDK_FILE_PATH);
- System.out.println("Fatal error occurred.");
- System.exit(0);
- }
-
- // show error message
- if (window != null) {
- window.open();
-
- if (Display.getCurrent() != null
- && !Display.getCurrent().isDisposed()) {
- Display.getCurrent().dispose();
- }
- }
-
- ErrorController.setExitCode(Config.EXITCODE_UNKNOWN_ERROR);
- } finally {
- if (Platform.isWindows()) {
- ProgramController.createProgramController().removeSDKTempDir();
- }
-
- //performance measurement
- Performance.setIMEndTime();
- Performance.printToLogFile();
-
- if (Options.doTest) {
- Performance.printTestResultXmlFormat();
- Performance.printTestResultXmlFormat2();
- }
-
- Log.LogTitle("Installmanager finish");
- Log.close();
-
- if (Platform.isMacOS()) {
- System.exit(ErrorController.getExitCode());
- } else {
- if (ErrorController.getExitCode() == Config.EXITCODE_HAS_SELF_UPDATE) {
- String binary = PathUtil.get(Registry.getInstalledPath(), Config.INSTALL_MANAGER_DIRECTORY, Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER);
- try {
- Runtime.getRuntime().exec(binary);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- } else if (ErrorController.getExitCode() != Config.EXITCODE_NORMAL) {
- System.exit(ErrorController.getExitCode());
- }
- }
- }
- }
-
- @Override
- protected void configureShell(Shell newShell) {
- newShell.setBackground(getBackgroundColor());
- newShell.setMinimumSize(getInitialSize());
- newShell.setSize(getInitialSize());
- newShell.setImage(getWindowIconImage());
- super.configureShell(newShell);
-
- newShell.setText("Tizen SDK Install Manager");
- }
-
- @Override
- /**
- * Install manager window is close.
- */
- public boolean close() {
- return false;
- }
-
- /**
- * Return the initial size of the window.
- */
- @Override
- protected Point getInitialSize() {
- return POINT_MAIN_WINDOW;
- }
-
- /**
- * Show the composite depending on parameter.
- * @param composite
- */
- public void showComposite(Composite composite) {
- StackLayout layout;
- if (composite.getParent().getLayout() instanceof StackLayout) {
- layout = (StackLayout) composite.getParent().getLayout();
- layout.topControl = composite;
- }
- composite.getParent().layout();
- }
-
-// private void registLicensePageListener() {
-// compositeLicensePage.getAcceptButton()
-// .addSelectionListener(new SelectionAdapter() {
-//
-// @Override
-// public void widgetSelected(SelectionEvent e) {
-// btnNext.setEnabled(compositeLicensePage.getAcceptButton()
-// .getSelection());
-// }
-// });
-// }
-
- private void registCompletePageListener() {
- compositeCompletePage.addPaintListener(new PaintListener() {
-
- @Override
- public void paintControl(PaintEvent arg0) {
- btnClose.setText("Close");
- }
- });
- }
-
- public void setNameOfCancelButton(String name) {
- btnClose.setText("Close");
- }
-
- /**
- * Get selected package names on installing
- * @param items
- * @return list of selected package names.
- */
- public List<String> getSelectedPackageNames(List<Item> items) {
- List<String> list = new ArrayList<String>();
- for (int i = 0; i < items.size(); i++) {
- items.get(i).getTerminalPackages(list, true);
- }
-
- return list;
- }
-
- /**
- * Installed packages do not have package version, installmanager will show warning dialog.
- * @return
- */
- private boolean checkVaildPkgVersion() {
- PackageSet installedPkgs = controller.getInstalledPackages();
- if (!installedPkgs.isEmpty()) {
- for (Package pkg : installedPkgs) {
- String vs = pkg.getVersion().toString();
- if (vs != "" && vs.equals("0.0.0")) {
- Log.err("Package version not found. ==> " + pkg.getPackageName());
- int confirm = MessageBoxDlg.showDlg(getShell(),
- "WARNING",
- "'" + pkg.getPackageName() + "'" + " package version is not found.\n" +
- "If you keep installing Tizen SDK, some unexpected may occur.\n" +
- "Do you want to continue?",
- DialogType.WARNING, false);
- if (confirm == MessageBoxDlg.YES) {
- return true;
- } else {
- return false;
- }
- }
- }
- }
-
- return true;
- }
-
- /**
- * Get install manager window object.
- * @return install manager window object.
- */
- public static InstallManagerWindow getInstallManagerWindow() {
- return window;
- }
-
- /**
- * Get complete page composite object
- * @return complete page composite object
- */
- public CompletePage getCompletePage() {
- return compositeCompletePage;
- }
-
- public LicensePage getLicensePage() {
- return compositeLicensePage;
- }
-
- public InstallableListPage getComponentSelectionPage() {
- return compositeInstallableListPage;
- }
-
- public WelcomePage getWelcomePage() {
- return compositeWelcomePage;
- }
-
- /**
- * Get setInstallDirectoryPage composite object
- * @return complete page composite object
- */
- public SetInstallDirectoryPage getSetInstallDirectoryPage() {
- return compositeSetInstallDirectoryPage;
- }
-
- public Button getNextButton() {
- return btnNext;
- }
-
- /**
- * If parameter is true, 'Next' button will be enabled. but false, 'Next' button will be disabled.
- * @param enabled
- */
- public static void setNextBtnEnabled(boolean enabled) {
- btnNext.setEnabled(enabled);
- }
-
- /**
- * If parameter is true, 'Back' button will be enabled. but false, 'Back' button will be disabled.
- * @param enabled
- */
- public static void setBackBtnEnabled(boolean enabled) {
- btnBack.setEnabled(enabled);
- }
-
- /**
- * If parameter is true, 'Cancel' button will be enabled. but false, 'Cancel' button will be disabled.
- * @param enabled
- */
- public void setCancelBtnEnabled(boolean enabled) {
- btnClose.setEnabled(enabled);
- }
-
- public ViewController getViewController() {
- return controller;
- }
-}
-
+/*\r
+* InstallManager\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact: \r
+* Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+* Shihyun Kim <shihyun.kim@samsung.com>\r
+* Taeyoung Son <taeyoung2.son@samsung.com>\r
+* Yongsung kim <yongsung1.kim@samsung.com>\r
+* \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/\r
+\r
+package org.tizen.installmanager.ui;\r
+\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Enumeration;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+import java.util.Properties;\r
+import java.util.Set;\r
+\r
+import org.eclipse.jface.window.ApplicationWindow;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.StackLayout;\r
+import org.eclipse.swt.events.PaintEvent;\r
+import org.eclipse.swt.events.PaintListener;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.eclipse.swt.layout.RowData;\r
+import org.eclipse.swt.layout.RowLayout;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Layout;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.tizen.installmanager.cli.InstallManagerNoUI;\r
+import org.tizen.installmanager.core.Config;\r
+import org.tizen.installmanager.core.IMExitException;\r
+import org.tizen.installmanager.core.IMFatalException;\r
+import org.tizen.installmanager.core.InstallManager;\r
+import org.tizen.installmanager.core.Options;\r
+import org.tizen.installmanager.core.Performance;\r
+import org.tizen.installmanager.lib.ErrorController;\r
+import org.tizen.installmanager.lib.IMError;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.lib.ProgramController;\r
+import org.tizen.installmanager.lib.Registry;\r
+import org.tizen.installmanager.lib.exception.IMNetworkException;\r
+import org.tizen.installmanager.lib.mac.CocoaUtil;\r
+import org.tizen.installmanager.pkg.lib.PackageManager;\r
+import org.tizen.installmanager.pkg.model.ConfigFile;\r
+import org.tizen.installmanager.pkg.model.PackageSet;\r
+import org.tizen.installmanager.ui.dialog.AddExtraRepositoryDialog;\r
+import org.tizen.installmanager.ui.dialog.IndeterminateProgressDialog;\r
+import org.tizen.installmanager.ui.dialog.MessageBoxDlg;\r
+import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType;\r
+import org.tizen.installmanager.ui.dialog.ProxySettingsDialog;\r
+import org.tizen.installmanager.ui.model.Item;\r
+import org.tizen.installmanager.ui.page.CompletePage;\r
+import org.tizen.installmanager.ui.page.InstallPage;\r
+import org.tizen.installmanager.ui.page.InstallableListPage;\r
+import org.tizen.installmanager.ui.page.InstallingPage;\r
+import org.tizen.installmanager.ui.page.LicensePage;\r
+import org.tizen.installmanager.ui.page.SetInstallDirectoryPage;\r
+import org.tizen.installmanager.ui.page.UninstallableListPage;\r
+import org.tizen.installmanager.ui.page.UninstallingPage;\r
+import org.tizen.installmanager.ui.page.UpdatableListPage;\r
+import org.tizen.installmanager.ui.page.ViewController;\r
+import org.tizen.installmanager.ui.page.WelcomePage;\r
+import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor;\r
+import org.tizen.installmanager.ui.page.WelcomePage.INSTALLMANAGER_ACTION;\r
+import org.tizen.installmanager.util.PathUtil;\r
+import org.tizen.installmanager.pkg.model.Package;\r
+\r
+\r
+/**\r
+ * This class is main class for install manager.\r
+ * @author Taeyoung Son <taeyoung2.son@samsung.com>\r
+ */\r
+public class InstallManagerWindow extends ApplicationWindow {\r
+ private static final RGB RGB_BACKGROUND = new RGB(242, 242, 242);\r
+\r
+ private static final Point POINT_MAIN_WINDOW = new Point(628, 478);\r
+ private static Image IMAGE_WINDOW_ICON;\r
+ private static Color COLOR_BACKGROUND;\r
+\r
+ private static InstallManagerWindow window;\r
+\r
+// private StackLayout sl_composite = new StackLayout();\r
+ public StackLayout sl_composite = new StackLayout();\r
+ private static Button btnClose;\r
+ private static Button btnBack;\r
+ private static Button btnNext;\r
+\r
+ private Composite pageComposite; // Page area\r
+ private WelcomePage compositeWelcomePage;\r
+ private LicensePage compositeLicensePage;\r
+ private InstallableListPage compositeInstallableListPage;\r
+ private UninstallableListPage compositeUninstallableListPage;\r
+ private InstallingPage compositeInstallingPage;\r
+ private UninstallingPage compositeUninstallingPage;\r
+ private CompletePage compositeCompletePage;\r
+ private SetInstallDirectoryPage compositeSetInstallDirectoryPage;\r
+ public UpdatableListPage compositeUpdatableListPage;\r
+\r
+ protected static ViewController controller;\r
+ private SelectionAdapter cancelBtnSelectionAdapter = null;\r
+ private SelectionAdapter closeBtnSelectionAdapter = null;\r
+\r
+ /**\r
+ * Create the application window.\r
+ */\r
+ public InstallManagerWindow() {\r
+ super(null);\r
+ setShellStyle(SWT.SHELL_TRIM);\r
+ setShellStyle(SWT.BORDER | SWT.TITLE);\r
+ }\r
+\r
+ /**\r
+ * Get installmanager window background color.\r
+ * @return background color\r
+ */\r
+ public static Color getBackgroundColor() {\r
+ if (COLOR_BACKGROUND == null) {\r
+ COLOR_BACKGROUND = new Color(null, RGB_BACKGROUND);\r
+ }\r
+ return COLOR_BACKGROUND;\r
+ }\r
+\r
+ private static Image getWindowIconImage() {\r
+ if (IMAGE_WINDOW_ICON == null) {\r
+ IMAGE_WINDOW_ICON = PathUtil.getImageFromResource("/res/icons/SDK_icon.png");\r
+ }\r
+ return IMAGE_WINDOW_ICON;\r
+ }\r
+\r
+ private void init() throws IMExitException{\r
+ Log.log("Window init start");\r
+ \r
+ //make waiting dialog.\r
+ final IndeterminateProgressDialog progressbar = IndeterminateProgressDialog.getInstance();\r
+ \r
+ final Shell shell = progressbar.getParent();\r
+ shell.getDisplay().asyncExec(new Runnable(){\r
+ public void run() { \r
+ //initialize installmanager\r
+ progressbar.updateName("Connecting to package server.\nIt may take a minute...");\r
+ \r
+ shell.getDisplay().asyncExec(new Runnable() {\r
+ public void run() {\r
+ initInstallManager();\r
+ }\r
+ \r
+ });\r
+ \r
+ //init end\r
+ progressbar.finish();\r
+ }\r
+ });\r
+ \r
+ if (!shell.isDisposed()) {\r
+ progressbar.open();\r
+ }\r
+\r
+ Log.log("Window init end");\r
+ }\r
+ \r
+ private void updateInstallManager(Shell shell) {\r
+ if (controller.canInstallManagerUpdate()) {\r
+ String msg = "There is a new installer on the server. \nNew install-manager will be started. \nIt may take a minute...";\r
+ MessageBoxDlg.showDlg(shell, "InstallManager", msg, DialogType.NOTIFY, false);\r
+ \r
+ controller.updateInstallManager();\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * init IM's configuation and packages information.\r
+ * @return\r
+ */\r
+ public boolean initInstallManager() {\r
+ ErrorController.setInstallationSuccess(true);\r
+ \r
+ controller = new ViewController();\r
+ \r
+ if (controller.init()) {\r
+ if (Config.isSupportMultiSDK()) {\r
+ Log.log("Multi SDK installation.");\r
+ } else {\r
+ Log.log("Single SDK installation.");\r
+ }\r
+ return true;\r
+ } else {\r
+ Log.err("InstallManager init fail.");\r
+ ErrorController.setInstallationSuccess(false);\r
+ \r
+ return false;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Create contents of the application window.\r
+ * \r
+ * @param parent\r
+ */\r
+ @Override\r
+ protected Control createContents(Composite parent) {\r
+\r
+ parent.setSize(630, 490);\r
+ IMError.setComposite(parent);\r
+ Composite container = new Composite(parent, SWT.NONE);\r
+ \r
+ // Set layout attributes.\r
+ RowLayout rl_container = new RowLayout(SWT.VERTICAL);\r
+ rl_container.spacing = 0;\r
+ rl_container.marginTop = 0;\r
+ rl_container.marginRight = 0;\r
+ rl_container.marginLeft = 0;\r
+ rl_container.marginBottom = 0;\r
+ container.setLayout(rl_container);\r
+\r
+ // Set page composite size. (image, label, etc.)\r
+ pageComposite = new Composite(container, SWT.NONE);\r
+ pageComposite.setLayoutData(new RowData(628, 405));\r
+ pageComposite.setLayout(sl_composite);\r
+ \r
+ Composite composite_buttonArea = new Composite(container, SWT.NONE);\r
+ composite_buttonArea.setLayoutData(new RowData(628, 52));\r
+ composite_buttonArea.setBackground(getBackgroundColor());\r
+\r
+ setButtonClose(composite_buttonArea);\r
+ setButtonNext(composite_buttonArea);\r
+ setButtonBack(composite_buttonArea);\r
+\r
+ compositeWelcomePage = new WelcomePage(pageComposite, SWT.NONE);\r
+ compositeLicensePage = new LicensePage(pageComposite, SWT.NONE);\r
+ compositeCompletePage = new CompletePage(pageComposite, SWT.NONE);\r
+ compositeInstallingPage = new InstallingPage(pageComposite, SWT.NONE);\r
+ compositeInstallableListPage = new InstallableListPage(pageComposite, SWT.NONE);\r
+ compositeUninstallingPage = new UninstallingPage(pageComposite, SWT.NONE);\r
+ compositeUninstallableListPage = new UninstallableListPage(pageComposite, SWT.NONE);\r
+ compositeSetInstallDirectoryPage = new SetInstallDirectoryPage(pageComposite, SWT.NONE);\r
+ compositeUpdatableListPage = new UpdatableListPage(pageComposite, SWT.NONE);\r
+\r
+// registLicensePageListener();\r
+// registCompletePageListener();\r
+\r
+ initWelcomePage();\r
+ \r
+ return container;\r
+ }\r
+\r
+ private void setButtonClose(Composite composite) {\r
+ btnClose = new Button(composite, SWT.NONE);\r
+ btnClose.setText("Cancel");\r
+ cancelBtnSelectionAdapter = new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ int result = MessageBoxDlg.NO;\r
+ if (sl_composite.topControl == compositeInstallingPage) {\r
+ InstallProgressMonitor mon = compositeInstallingPage.getInstallProgressMonitor();\r
+ mon.setCancelRequested(true);\r
+ result = MessageBoxDlg.showDlg(\r
+ e.display.getActiveShell(),\r
+ "Tizen SDK Install Manager",\r
+ "Are you sure you want to quit Install Manager?\n\nIf you click \"Yes\", the installation is stopped.",\r
+ DialogType.WARNING, false);\r
+ if (result == MessageBoxDlg.YES) {\r
+ mon.setCanceled(true);\r
+ } else {\r
+ mon.setCancelRequested(false);\r
+ }\r
+ return;\r
+ } else if (sl_composite.topControl == compositeUninstallingPage) {\r
+ result = MessageBoxDlg.showDlg(\r
+ e.display.getActiveShell(),\r
+ "Tizen SDK Install Manager",\r
+ "Are you sure to quit Install Manager?\n\nIf you click \"Yes\", the uninstallation is stopped.",\r
+ DialogType.WARNING, false);\r
+ } else if (sl_composite.topControl == compositeCompletePage) {\r
+ controller.showChangeLog();\r
+ \r
+ if (!Options.doResumeDownloading) {\r
+ controller.cleanUpTargetDirectory();\r
+ }\r
+ \r
+ result = MessageBoxDlg.YES;\r
+ } else {\r
+ result = MessageBoxDlg.showDlg(e.display.getActiveShell(),\r
+ "Tizen SDK Install Manager",\r
+ "Are you sure to quit Install Manager?",\r
+ DialogType.WARNING, false);\r
+ }\r
+ \r
+ if (result == MessageBoxDlg.YES) {\r
+ e.display.close();\r
+ }\r
+ }\r
+ };\r
+ \r
+ closeBtnSelectionAdapter = new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent arg0) {\r
+ arg0.display.close();\r
+ }\r
+ };\r
+ \r
+ btnClose.addSelectionListener(cancelBtnSelectionAdapter);\r
+ btnClose.setBounds(531, 10, 78, 29);\r
+ }\r
+ \r
+ private void setButtonNext(Composite composite) {\r
+ btnNext = new Button(composite, SWT.NONE);\r
+ btnNext.setText("Next");\r
+ btnNext.addSelectionListener(new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ if (sl_composite.topControl == compositeWelcomePage) {\r
+ updateInstallManager(e.display.getActiveShell());\r
+ btnNext.setVisible(false);\r
+ if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.INSTALL) {\r
+ if (!checkVaildPkgVersion()) {\r
+ return;\r
+ }\r
+ \r
+ if (!controller.isNewInstallation()) {// Update case\r
+ Config.status = Config.Status.UPDATE;\r
+ compositeUpdatableListPage.loadPage(controller);\r
+ btnBack.setVisible(true);\r
+ btnNext.setVisible(true);\r
+ showComposite(compositeUpdatableListPage);\r
+ if (controller.existRemovablePackage()) {\r
+ btnNext.setText("Install");\r
+ }\r
+ btnBack.setVisible(true);\r
+ } else {\r
+ boolean hasItem = compositeInstallableListPage.loadPage(controller);\r
+ if (hasItem) {\r
+ Config.status = Config.Status.INSTALL;\r
+ showComposite(compositeInstallableListPage);\r
+ btnNext.setVisible(true);\r
+ btnNext.setEnabled(hasItem);\r
+ btnBack.setVisible(hasItem);\r
+ if (controller.existRemovablePackage()) {\r
+ btnNext.setText("Install");\r
+ }\r
+ } else {\r
+ Log.err("Installable packages do not exist. This is error.");\r
+ //TODO\r
+ }\r
+ }\r
+ } else if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.UPDATE) {\r
+// btnNext.setEnabled(compositeLicensePage.getAcceptButton().getSelection());\r
+ btnNext.setEnabled(true);\r
+ PackageManager.dispose();\r
+ initInstallManager();\r
+ compositeUpdatableListPage.loadPage(controller);\r
+ btnBack.setVisible(true);\r
+ showComposite(compositeUpdatableListPage);\r
+ if (controller.existRemovablePackage()) {\r
+ btnNext.setText("Install");\r
+ }\r
+ btnBack.setVisible(true);\r
+ } else if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.UNINSTALL) {\r
+ showComposite(compositeUninstallableListPage);\r
+ btnNext.setVisible(true);\r
+ btnBack.setVisible(true);\r
+ btnNext.setText("Uninstall");\r
+ compositeUninstallableListPage.loadPage(controller);\r
+// int resultDialog = MessageBoxDlg.NO;\r
+// resultDialog = MessageBoxDlg.showDlg(\r
+// e.display.getActiveShell(),\r
+// "Tizen SDK Install Manager",\r
+// "Are you sure you want to remove the Tizen SDK?\n\nIf you click \"Yes\", the Tizen SDK is uninstalled.",\r
+// DialogType.WARNING, false);\r
+// if (resultDialog == MessageBoxDlg.YES) {\r
+// showComposite(compositeUninstallingPage);\r
+// btnBack.setVisible(false);\r
+// btnNext.setVisible(false);\r
+// btnClose.setEnabled(false);\r
+// \r
+// if (Config.isSupportMultiSDK()) {\r
+// PackageManager.dispose();\r
+// initInstallManager(); \r
+// }\r
+//\r
+// List<Item> items = compositeUninstallablePage.getItems();\r
+// boolean result = compositeUninstallingPage.loadPage(getSelectedPackageNames(items) /* compositeInstallablePage.getCheckedPackageNames()*/,\r
+// controller,\r
+// window);\r
+// if (!result) {\r
+// showComposite(compositeWelcomePage);\r
+// btnBack.setVisible(true);\r
+// btnNext.setVisible(true);\r
+// btnClose.setEnabled(true);\r
+// }\r
+// } else {\r
+// return;\r
+// }\r
+ }\r
+ } else if (sl_composite.topControl == compositeInstallableListPage) {\r
+// btnNext.setEnabled(compositeLicensePage.getAcceptButton().getSelection());\r
+ btnNext.setEnabled(true);\r
+ if (Config.isSupportMultiSDK()) {\r
+ compositeLicensePage.loadPage(compositeInstallableListPage.getSelectedItems());\r
+ showComposite(compositeLicensePage);\r
+ btnBack.setVisible(true);\r
+ } else {\r
+ if (!controller.isNewInstallation()) {// Update case\r
+ compositeUpdatableListPage.loadPage(controller);\r
+ btnBack.setVisible(true);\r
+ showComposite(compositeUpdatableListPage);\r
+ if (controller.existRemovablePackage()) {\r
+ btnNext.setText("Install");\r
+ }\r
+ btnBack.setVisible(true);\r
+ } else {\r
+ //License page button status setting.\r
+ compositeLicensePage.loadPage(compositeInstallableListPage.getSelectedItems());\r
+ showComposite(compositeLicensePage);\r
+ btnNext.setText("I agree");\r
+ btnNext.setEnabled(true);\r
+ btnNext.setFocus();\r
+ btnBack.setVisible(true);\r
+ }\r
+ }\r
+ } else if (sl_composite.topControl == compositeLicensePage) {\r
+ List<Item> items = compositeInstallableListPage.getItems();\r
+ if (getSelectedPackageNames(items).size() <= 0) {\r
+ return;\r
+ }\r
+ if (Config.isSupportMultiSDK()) {\r
+ showComposite(compositeSetInstallDirectoryPage);\r
+ compositeSetInstallDirectoryPage.loadPage(\r
+ controller, compositeInstallableListPage.getCheckedPackageSize(false));\r
+// btnNext.setText("Install");\r
+ } else {\r
+ if (controller.existRemovablePackage()) { // update case\r
+ btnBack.setVisible(false);\r
+ btnNext.setVisible(false);\r
+ showComposite(compositeInstallingPage);\r
+ boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items),\r
+ controller,\r
+ Registry.getInstalledPath(),\r
+ window, true);\r
+ if (!result) {\r
+ showComposite(compositeInstallableListPage);\r
+ btnBack.setVisible(true);\r
+ btnNext.setVisible(true);\r
+ btnClose.setEnabled(true);\r
+ }\r
+ } else {\r
+ showComposite(compositeSetInstallDirectoryPage);\r
+ compositeSetInstallDirectoryPage.loadPage(\r
+ controller, compositeInstallableListPage.getCheckedPackageSize(false));\r
+ btnNext.setText("Install");\r
+// btnNext.setVisible(false);\r
+// btnBack.setBounds(447, 10, 78, 29);\r
+ }\r
+ }\r
+ } else if (sl_composite.topControl == compositeUpdatableListPage) {\r
+ List<Item> items = compositeUpdatableListPage.getItems();\r
+ if (getSelectedPackageNames(items).size() <= 0) {\r
+ return;\r
+ }\r
+ \r
+ btnBack.setVisible(false);\r
+ btnNext.setVisible(false);\r
+ showComposite(compositeInstallingPage);\r
+ boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items), controller, Registry.getInstalledPath(), window, true);\r
+ \r
+ if (!result) {\r
+ showComposite(compositeUpdatableListPage);\r
+ btnBack.setVisible(true);\r
+ btnNext.setVisible(true);\r
+ btnClose.setEnabled(true);\r
+ }\r
+ } else if (sl_composite.topControl == compositeSetInstallDirectoryPage) {\r
+ boolean installable = compositeSetInstallDirectoryPage.isInstallablePath();\r
+\r
+ Config.USER_CONFIG_HOME_PATH = compositeSetInstallDirectoryPage.getSDKWorkSpacePath();\r
+ Registry.sdkDataPath = controller.getSDKWorkSpacePath();\r
+ Registry.targetPath = controller.getInstallPath();\r
+ Registry.saveSDKInfo(Registry.targetPath);\r
+ \r
+ InstallManager.getInstance().initPackageList();\r
+\r
+ if (!installable) {\r
+ MessageBoxDlg.showDlg(\r
+ Display.getCurrent().getShells()[0],\r
+ "Error",\r
+ "Not enough disk space for the installation. Select a different installation path.",\r
+ DialogType.ERROR, false);\r
+ return;\r
+ }\r
+ \r
+ if (!compositeSetInstallDirectoryPage.isWorkSpaceDuplicate()) {\r
+ int result = MessageBoxDlg.showDlg(\r
+ Display.getCurrent().getShells()[0],\r
+ "Warning",\r
+ "Tizen SDK data directory is used already. Do you want to continue?",\r
+ DialogType.WARNING, false);\r
+ if (result == MessageBoxDlg.NO) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ btnBack.setVisible(false);\r
+ btnNext.setVisible(false);\r
+ List<Item> items = compositeInstallableListPage.getItems();\r
+ showComposite(compositeInstallingPage);\r
+ boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items),\r
+ controller,\r
+ compositeSetInstallDirectoryPage.getInstallPath(),\r
+ window, false);\r
+ if (!result) {\r
+ showComposite(compositeInstallableListPage);\r
+ btnBack.setVisible(true);\r
+ btnNext.setVisible(true);\r
+ btnClose.setEnabled(true);\r
+ }\r
+ } else if (sl_composite.topControl == compositeUninstallableListPage) {\r
+ showComposite(compositeUninstallingPage);\r
+ btnBack.setVisible(false);\r
+ btnNext.setVisible(false);\r
+ btnClose.setEnabled(false);\r
+ List<Item> items = compositeUninstallableListPage.getItems();\r
+ boolean result = compositeUninstallingPage.loadPage(getSelectedPackageNames(items) /* compositeInstallablePage.getCheckedPackageNames()*/,\r
+ controller,\r
+ window);\r
+ if (!result) {\r
+ showComposite(compositeUninstallableListPage);\r
+ btnBack.setVisible(true);\r
+ btnNext.setVisible(true);\r
+ btnClose.setEnabled(true);\r
+ }\r
+ }\r
+ }\r
+ });\r
+ btnNext.setBounds(447, 10, 78, 29);\r
+ }\r
+ \r
+ private void setButtonBack(Composite composite) {\r
+ btnBack = new Button(composite, SWT.NONE); \r
+ btnBack.addSelectionListener(new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ if (sl_composite.topControl == compositeInstallableListPage\r
+ || sl_composite.topControl == compositeUpdatableListPage) {\r
+ compositeInstallableListPage.getItems().clear();\r
+ showComposite(compositeWelcomePage);\r
+// if (controller.existRemovablePackage()) {\r
+// btnBack.setVisible(false);\r
+// showComposite(compositeWelcomePage);\r
+// } else {\r
+// showComposite(compositeLicensePage);\r
+// }\r
+ btnNext.setVisible(false);\r
+ btnBack.setVisible(false);\r
+ } else if (sl_composite.topControl == compositeLicensePage) {\r
+ btnNext.setEnabled(true);\r
+ btnBack.setVisible(false);\r
+ btnNext.setFocus();\r
+ if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.INSTALL) {\r
+ showComposite(compositeInstallableListPage);\r
+ btnNext.setText("Next");\r
+ btnBack.setVisible(true);\r
+ } else if (compositeWelcomePage.getSelectedButton() == INSTALLMANAGER_ACTION.UPDATE) {\r
+ showComposite(compositeUpdatableListPage);\r
+ btnNext.setText("Next");\r
+ btnBack.setVisible(true);\r
+ }\r
+ } else if (sl_composite.topControl == compositeSetInstallDirectoryPage) {\r
+ showComposite(compositeLicensePage);\r
+ btnNext.setText("I agree");\r
+ btnNext.setEnabled(true);\r
+ } else if (sl_composite.topControl == compositeUninstallableListPage) {\r
+ showComposite(compositeWelcomePage);\r
+ btnNext.setVisible(false);\r
+ btnBack.setVisible(false);\r
+ }\r
+ }\r
+ });\r
+ btnBack.setBounds(363, 10, 78, 29);\r
+ btnBack.setText("Back");\r
+ btnBack.setVisible(false);\r
+ }\r
+ \r
+ private void initWelcomePage() {\r
+ compositeWelcomePage.setViewController(controller);\r
+ \r
+ if (ErrorController.checkInstallationSuccess()) {\r
+// compositeWelcomePage.setTitle(WelcomePage.STRING_TITLE);\r
+// compositeWelcomePage.setSubTitleBounds(20, 190, 600, 40);\r
+// compositeWelcomePage.setSubTitle(WelcomePage.STRING_SUBTITLE1);\r
+// \r
+// compositeWelcomePage.setVisibleRadioButton(true);\r
+// btnNext.setEnabled(true);\r
+ btnNext.setVisible(false);\r
+ btnClose.setText("Cancel");\r
+ \r
+ btnClose.removeSelectionListener(closeBtnSelectionAdapter);\r
+ btnClose.removeSelectionListener(cancelBtnSelectionAdapter);\r
+ btnClose.addSelectionListener(cancelBtnSelectionAdapter);\r
+ \r
+ compositeWelcomePage.setButtonStatus();\r
+ } else {\r
+ compositeWelcomePage.setVisibleRadioButton(false);\r
+ btnNext.setVisible(false);\r
+ \r
+ compositeWelcomePage.setTitle("Cannot start Tizen SDK Install Manager.");\r
+ \r
+ String errMsg = ErrorController.getErrorMessage();\r
+ String repository = Config.getInstance().getConfigFile().getRepository();\r
+ \r
+ if (repository != null && !repository.isEmpty()) {\r
+ errMsg = errMsg + "\n(" + repository + ")";\r
+ }\r
+ compositeWelcomePage.setSubTitleBounds(20, 190, 600, 100);\r
+ compositeWelcomePage.setErrorSubTitle(errMsg);\r
+\r
+ btnClose.setText("Close");\r
+ \r
+ btnClose.removeSelectionListener(closeBtnSelectionAdapter);\r
+ btnClose.removeSelectionListener(cancelBtnSelectionAdapter);\r
+ btnClose.addSelectionListener(closeBtnSelectionAdapter);\r
+ }\r
+ btnNext.setFocus();\r
+ sl_composite.topControl = compositeWelcomePage;\r
+ }\r
+ \r
+ /**\r
+ * Refresh InstallManager. \r
+ * Refresh packages and configuration information.\r
+ */\r
+ public void refresh() {\r
+ final IndeterminateProgressDialog progressbar = IndeterminateProgressDialog.getInstance();\r
+ final Shell shell = progressbar.getParent();\r
+ shell.getDisplay().asyncExec(new Runnable(){\r
+ public void run() {\r
+ progressbar.updateName("Initializing...");\r
+ \r
+ shell.getDisplay().syncExec(new Runnable() {\r
+ public void run() {\r
+ PackageManager.dispose();\r
+ initInstallManager();\r
+ initWelcomePage();\r
+ }\r
+ });\r
+ \r
+ //init end\r
+ progressbar.finish();\r
+ }\r
+ });\r
+ \r
+ if (!shell.isDisposed()) {\r
+ progressbar.open();\r
+ }\r
+\r
+ Log.log("Window refresh end");\r
+ }\r
+\r
+ /**\r
+ * Checks if there's updatable meta package.\r
+ * Then print "updatable" to stdout.\r
+ */\r
+ private static void checkMetaPackageUpdate() {\r
+ if (PackageManager.getInstance().getUpdatableMetaPackages().size() != 0) {\r
+ System.out.println("updatable");\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * There is no UI, just download packages.\r
+ * @throws IMExitException\r
+ */\r
+ private static void onlyDownloadPackages() throws IMExitException {\r
+ ViewController controller = new ViewController();\r
+ controller.init();\r
+\r
+ InstallManager installManager = InstallManager.getInstance();\r
+ PackageManager packageManager = installManager.getPackageManager();\r
+ \r
+ // Get all meta packages list by boundary.(eg. public, partner, all....) \r
+ PackageSet filteredMeta = filterPackageSet();\r
+ PackageSet downloadablePkgs = packageManager.getDependsPackagesFromRepository(filteredMeta);\r
+ \r
+ // Download all meta packages. \r
+ boolean filteredPackages = false;\r
+ try {\r
+ filteredPackages = installManager.downloadPackages(\r
+ downloadablePkgs, null);\r
+ } catch (IMNetworkException e) {\r
+ Log.ExceptionLog(e);\r
+ return;\r
+ }\r
+ \r
+ if (filteredPackages) {\r
+ Log.log("Success to download packages from repository");\r
+ } else {\r
+ Log.err("Fail to download packages from repository");\r
+ return;\r
+ }\r
+ }\r
+ \r
+ private static PackageSet filterPackageSet() {\r
+ PackageManager pm = PackageManager.getInstance();\r
+ \r
+ PackageSet downloadPackageList = pm.getLeafMetaPackages();\r
+ \r
+ String boundary = Options.boundary;\r
+ if (boundary.equalsIgnoreCase("public")) {\r
+ PackageSet partnerMetaPackages = pm.getPartnerMetaPackages();\r
+ \r
+ if (!partnerMetaPackages.isEmpty()) {\r
+ downloadPackageList.removeAll(partnerMetaPackages);\r
+ }\r
+ } else if (boundary.equalsIgnoreCase("partner")) {\r
+ PackageSet publicMetaPackages = pm.getPublicMetaPackages();\r
+ \r
+ if (!publicMetaPackages.isEmpty()) {\r
+ downloadPackageList.removeAll(publicMetaPackages);\r
+ }\r
+ }\r
+ \r
+ return downloadPackageList;\r
+ }\r
+ \r
+ private static void showInstallManagerVersion() {\r
+ System.out.println("InstallManager Version : " + \r
+ Config.getInstance().getInstallManagerVersion().toString());\r
+ }\r
+ \r
+ /**\r
+ * Logging all system information.\r
+ */\r
+ private static void loggingProperty() {\r
+ Log.log("=========== System properties ===========");\r
+ Properties sysprops = System.getProperties();\r
+ for (Enumeration e = sysprops.propertyNames(); e.hasMoreElements();) {\r
+ String key = (String) e.nextElement();\r
+ String value = sysprops.getProperty(key);\r
+ Log.log(key + " = " + value);\r
+ }\r
+ \r
+ Log.log("=========== Environment variables ===========");\r
+\r
+ Map<String, String> env = System.getenv();\r
+ Set<String> set = env.keySet();\r
+ Iterator<String> iter = set.iterator();\r
+\r
+ while (iter.hasNext()) {\r
+ String key = (String) iter.next();\r
+ Set<Entry<String, String>> value = env.entrySet();\r
+ Log.log(key + " = " + value);\r
+ }\r
+ Log.log("=============================================");\r
+ }\r
+\r
+ /**\r
+ * Launch the application.\r
+ * \r
+ * @param args\r
+ */\r
+ public static void main(String args[]) {\r
+ //performance measurement\r
+ Performance.setIMStartTime();\r
+ \r
+ InstallManager.deleteTempFile();\r
+ \r
+ Log.open();\r
+ Log.LogTitle("Installmanager start");\r
+ Log.log(Platform.getPlatformInfo());\r
+ Log.log(PathUtil.getCurrentDir());\r
+ \r
+ if (Options.propertyLogging) {\r
+ loggingProperty();\r
+ }\r
+ \r
+ try {\r
+ Options.loadCmdArgs(args);\r
+ } catch (IMFatalException e) {\r
+ Log.err("Check your options. => " + Arrays.toString(args));\r
+ System.out.println("Check your options. => " + Arrays.toString(args));\r
+ return;\r
+ }\r
+ \r
+ try { \r
+ if (Options.onlyDownload) {\r
+ onlyDownloadPackages();\r
+ System.exit(0);\r
+ } else if (Options.doInstallNoUI) {\r
+ if (InstallManagerNoUI.cliInstall(Options.packages)) {\r
+ Log.log("Success to command line install.");\r
+ System.out.println("Success to console install.");\r
+ } else {\r
+ Log.log("Fail to command line install.");\r
+ System.out.println("Fail to console install.");\r
+ }\r
+ \r
+ Performance.setIMEndTime();\r
+ if (Options.doTest) {\r
+ Performance.printTestResultXmlFormat();\r
+// Performance.printTestResultXmlFormat2();\r
+ }\r
+ \r
+ System.exit(0);\r
+ } else if (Options.doRemoveNoUI) {\r
+ if (InstallManagerNoUI.cliUninstall(Options.packages)) {\r
+ Log.log("Success to command line remove.");\r
+ System.out.println("Success to remove.");\r
+ } else {\r
+ Log.log("Fail to command line remove.");\r
+ System.out.println("Fail to remove.");\r
+ }\r
+ \r
+ Performance.setIMEndTime();\r
+ if (Options.doTest) {\r
+ Performance.printTestResultXmlFormat();\r
+// Performance.printTestResultXmlFormat2();\r
+ }\r
+ \r
+ System.exit(0);\r
+ } else if (Options.showVersion) {\r
+ showInstallManagerVersion();\r
+ System.exit(0);\r
+ } else if (Options.doShowHelp) {\r
+ InstallManagerNoUI.cliShowHelp();\r
+ System.exit(0);\r
+ }\r
+ \r
+ if (Platform.isMacOS()) {\r
+ System.setProperty("apple.laf.useScreenMenuBar", "true");\r
+ System.setProperty(\r
+ "com.apple.mrj.application.apple.menu.about.name",\r
+ "Emulator Manager");\r
+ Display display = Display.getDefault();\r
+ display.syncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ new CocoaUtil().removeTopMenuItems();\r
+ }\r
+ });\r
+ }\r
+ \r
+ window = new InstallManagerWindow();\r
+ window.setBlockOnOpen(true);\r
+ \r
+ window.init();\r
+ \r
+ Log.log("after init");\r
+ if (Options.checkPackageUpdate) {\r
+ checkMetaPackageUpdate();\r
+ } else if (Options.printDepGraph) {\r
+ InstallManager.getInstance().getPackageManager().printDepGraph();\r
+ } else if (Options.doShowDistListNoUI) {\r
+ InstallManagerNoUI.cliShowRepoInformation();\r
+ } else if (Options.doShowPackageListNoUI) {\r
+ InstallManagerNoUI.cliShowPackageList();\r
+ } else if (Options.doShowSDKInstallStatus) {\r
+ InstallManagerNoUI.cliShowInstallInformation();\r
+ } else {\r
+ window.open();\r
+ if (Display.getCurrent() != null\r
+ && !Display.getCurrent().isDisposed()) {\r
+ Display.getCurrent().dispose();\r
+ }\r
+ }\r
+ } catch (IMExitException e) {\r
+ // do not remove sdk temp dir if exit for self update\r
+ if (ErrorController.getExitCode() == Config.EXITCODE_HAS_SELF_UPDATE) {\r
+ Options.doRemoveTempTizenSDK = false;\r
+ }\r
+ \r
+ Log.log("Gracefully exit");\r
+ } catch (Throwable e) {\r
+ Log.err("Unexpected error occurred");\r
+ Log.ExceptionLog(e);\r
+ \r
+ if (Options.doInstallNoUI || Options.doRemoveNoUI) {\r
+ PathUtil.remove(Registry.REGISTRY_FILE_PATH);\r
+ PathUtil.remove(Registry.MULTI_SDK_FILE_PATH);\r
+ System.out.println("Fatal error occurred.");\r
+ System.exit(0);\r
+ }\r
+ \r
+ // show error message\r
+ if (window != null) {\r
+ window.open();\r
+ \r
+ if (Display.getCurrent() != null\r
+ && !Display.getCurrent().isDisposed()) {\r
+ Display.getCurrent().dispose();\r
+ }\r
+ }\r
+ \r
+ ErrorController.setExitCode(Config.EXITCODE_UNKNOWN_ERROR);\r
+ } finally {\r
+ if (Platform.isWindows()) {\r
+ ProgramController.createProgramController().removeSDKTempDir();\r
+ }\r
+ \r
+ //performance measurement\r
+ Performance.setIMEndTime();\r
+ Performance.printToLogFile();\r
+ \r
+ if (Options.doTest) {\r
+ Performance.printTestResultXmlFormat();\r
+// Performance.printTestResultXmlFormat2();\r
+ }\r
+ \r
+ Log.LogTitle("Installmanager finish");\r
+ Log.close();\r
+ \r
+ if (Platform.isMacOS()) {\r
+ System.exit(ErrorController.getExitCode());\r
+ } else {\r
+ if (ErrorController.getExitCode() == Config.EXITCODE_HAS_SELF_UPDATE) {\r
+ String binary = PathUtil.get(Registry.getInstalledPath(), Config.INSTALL_MANAGER_DIRECTORY, Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER);\r
+ try {\r
+ Runtime.getRuntime().exec(binary);\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ }\r
+ } else if (ErrorController.getExitCode() != Config.EXITCODE_NORMAL) {\r
+ System.exit(ErrorController.getExitCode());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void configureShell(Shell newShell) {\r
+ newShell.setBackground(getBackgroundColor());\r
+ newShell.setMinimumSize(getInitialSize());\r
+ newShell.setSize(getInitialSize());\r
+ newShell.setImage(getWindowIconImage());\r
+ super.configureShell(newShell);\r
+\r
+ newShell.setText("Tizen SDK Install Manager");\r
+ }\r
+\r
+ @Override\r
+ /**\r
+ * Install manager window is close.\r
+ */\r
+ public boolean close() {\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ * Return the initial size of the window.\r
+ */\r
+ @Override\r
+ protected Point getInitialSize() {\r
+ return POINT_MAIN_WINDOW;\r
+ }\r
+\r
+ /**\r
+ * Show the composite depending on parameter.\r
+ * @param composite\r
+ */\r
+ public void showComposite(Composite composite) {\r
+ StackLayout layout;\r
+ if (composite.getParent().getLayout() instanceof StackLayout) {\r
+ layout = (StackLayout) composite.getParent().getLayout();\r
+ layout.topControl = composite;\r
+ }\r
+ composite.getParent().layout();\r
+ }\r
+\r
+// private void registLicensePageListener() {\r
+// compositeLicensePage.getAcceptButton()\r
+// .addSelectionListener(new SelectionAdapter() {\r
+//\r
+// @Override\r
+// public void widgetSelected(SelectionEvent e) {\r
+// btnNext.setEnabled(compositeLicensePage.getAcceptButton()\r
+// .getSelection());\r
+// }\r
+// });\r
+// }\r
+\r
+ private void registCompletePageListener() {\r
+ compositeCompletePage.addPaintListener(new PaintListener() {\r
+\r
+ @Override\r
+ public void paintControl(PaintEvent arg0) {\r
+ btnClose.setText("Close");\r
+ }\r
+ });\r
+ }\r
+ \r
+ public void setNameOfCancelButton(String name) {\r
+ btnClose.setText("Close");\r
+ }\r
+\r
+ /**\r
+ * Get selected package names on installing\r
+ * @param items\r
+ * @return list of selected package names.\r
+ */\r
+ public List<String> getSelectedPackageNames(List<Item> items) {\r
+ List<String> list = new ArrayList<String>();\r
+ for (int i = 0; i < items.size(); i++) {\r
+ items.get(i).getTerminalPackages(list, true);\r
+ }\r
+\r
+ return list;\r
+ }\r
+ \r
+ /**\r
+ * Installed packages do not have package version, installmanager will show warning dialog.\r
+ * @return\r
+ */\r
+ private boolean checkVaildPkgVersion() {\r
+ PackageSet installedPkgs = controller.getInstalledPackages();\r
+ if (!installedPkgs.isEmpty()) {\r
+ for (Package pkg : installedPkgs) {\r
+ String vs = pkg.getVersion().toString();\r
+ if (vs != "" && vs.equals("0.0.0")) {\r
+ Log.err("Package version not found. ==> " + pkg.getPackageName());\r
+ int confirm = MessageBoxDlg.showDlg(getShell(), \r
+ "WARNING", \r
+ "'" + pkg.getPackageName() + "'" + " package version is not found.\n" +\r
+ "If you keep installing Tizen SDK, some unexpected may occur.\n" +\r
+ "Do you want to continue?", \r
+ DialogType.WARNING, false);\r
+ if (confirm == MessageBoxDlg.YES) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+ \r
+ /**\r
+ * Get install manager window object.\r
+ * @return install manager window object.\r
+ */\r
+ public static InstallManagerWindow getInstallManagerWindow() {\r
+ return window;\r
+ }\r
+\r
+ /**\r
+ * Get complete page composite object\r
+ * @return complete page composite object\r
+ */\r
+ public CompletePage getCompletePage() {\r
+ return compositeCompletePage;\r
+ }\r
+ \r
+ public LicensePage getLicensePage() {\r
+ return compositeLicensePage;\r
+ }\r
+ \r
+ public InstallableListPage getComponentSelectionPage() {\r
+ return compositeInstallableListPage;\r
+ }\r
+ \r
+ public WelcomePage getWelcomePage() {\r
+ return compositeWelcomePage;\r
+ }\r
+ \r
+ /**\r
+ * Get setInstallDirectoryPage composite object\r
+ * @return complete page composite object\r
+ */\r
+ public SetInstallDirectoryPage getSetInstallDirectoryPage() {\r
+ return compositeSetInstallDirectoryPage;\r
+ }\r
+ \r
+ public Button getNextButton() {\r
+ return btnNext;\r
+ }\r
+\r
+ /**\r
+ * If parameter is true, 'Next' button will be enabled. but false, 'Next' button will be disabled.\r
+ * @param enabled\r
+ */\r
+ public static void setNextBtnEnabled(boolean enabled) {\r
+ btnNext.setEnabled(enabled);\r
+ }\r
+\r
+ /**\r
+ * If parameter is true, 'Back' button will be enabled. but false, 'Back' button will be disabled.\r
+ * @param enabled\r
+ */\r
+ public static void setBackBtnEnabled(boolean enabled) {\r
+ btnBack.setEnabled(enabled);\r
+ }\r
+\r
+ /**\r
+ * If parameter is true, 'Cancel' button will be enabled. but false, 'Cancel' button will be disabled.\r
+ * @param enabled\r
+ */\r
+ public void setCancelBtnEnabled(boolean enabled) {\r
+ btnClose.setEnabled(enabled);\r
+ }\r
+ \r
+ public ViewController getViewController() {\r
+ return controller;\r
+ }\r
+}\r
+\r
-/*
- * InstallManager
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact:
- * Donghee Yang <donghee.yang@samsung.com>
- * Shihyun Kim <shihyun.kim@samsung.com>
- * Yongsung kim <yongsung1.kim@samsung.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Contributors:
- * - S-Core Co., Ltd
- *
- */
-
package org.tizen.installmanager.ui.dialog;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.ArrayList;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
import org.tizen.installmanager.core.Config;
import org.tizen.installmanager.lib.Downloader;
import org.tizen.installmanager.lib.ErrorController;
public class ChangeServerDialog extends Dialog {
private static final String STRING_TITLE = "Change Server";
private Label titleLabel = null;
- private Combo serverCombo = null;
+ private Text serverText = null;
private Label errLabel = null;
private String serverUrl = "";
- private ArrayList<String> serverUrls = new ArrayList<String>();
public ChangeServerDialog(Shell parentShell) {
super(parentShell);
setTitle();
setTitleLabel(container);
- setServerUrlComboBox(container);
+ setServerUrlText(container);
setErrLabel(container);
return container;
@Override
protected void okPressed() {
- String changeServerUrl = serverCombo.getText();
+ String changeServerUrl = serverText.getText();
- if (serverUrls.contains(changeServerUrl)) {
- serverUrl = changeServerUrl;
+ if (serverUrl.equals(changeServerUrl)) {
this.close();
} else {
if (isExactFormat(changeServerUrl)) {
titleLabel.setBounds(10, 10, 200, 23);
}
- private void setServerUrlComboBox(Composite composite) {
- serverCombo = new Combo(composite, SWT.NONE);
- serverCombo.setBounds(10, 33, 360, 23);
- serverCombo.setEnabled(true);
+ private void setServerUrlText(Composite composite) {
+ serverText = new Text(composite, SWT.BORDER);
+ serverText.setBounds(10, 33, 360, 23);
+ serverText.setEnabled(true);
- if (serverUrls.isEmpty()) {
- serverCombo.setText("http://");
+ if (serverUrl.isEmpty()) {
+ serverText.setText("http://");
} else {
- serverCombo.setText(serverUrl);
- for (String url : serverUrls) {
- if (url != null) {
- serverCombo.add(url);
- }
- }
+ serverText.setText(serverUrl);
+ serverText.selectAll();
}
}
serverUrl = url;
}
- public void setCurrentServer(ArrayList<String> urls) {
- serverUrls = urls;
- }
-
public String getServerUrl() {
return serverUrl;
}
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
import org.tizen.installmanager.core.Config;
import org.tizen.installmanager.core.DistributionController;
import org.tizen.installmanager.core.InstallManager;
-import org.tizen.installmanager.core.InstallManagerConstants;
import org.tizen.installmanager.core.Config.ServerType;
import org.tizen.installmanager.core.IMFatalException;
import org.tizen.installmanager.core.SnapshotLog;
import org.tizen.installmanager.lib.Log;
import org.tizen.installmanager.lib.ErrorController.ErrorCode;
import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.Registry;
import org.tizen.installmanager.pkg.lib.PackageManager;
import org.tizen.installmanager.pkg.model.Snapshot;
import org.tizen.installmanager.pkg.model.SnapshotList;
private String snapshotPath = "";
private String currentDistribution = "";
private String repository = "";
- ArrayList<String> repos = new ArrayList<String>();
private ServerType serverType = ServerType.SNAPSHOT;
private SnapshotLogDialog snapshotDialog = null;
private Table snapshotTable;
+ private Label localErrLabel;
private Label textPackageServerUrl;
private Label textLocalServerUrl;
private File imageFile;
private DistributionController controller = null;
private boolean noErr = true; // flag check to verify pkg list file path.
- //patch support
- private Button buttonPatch = null;
- private Label labelPatch = null;
- private Button buttonPatchSelection = null;
-
- private static final int IMAGE_FILE = 0;
- private static final int PATCH_FILE = 1;
-
//snapshot table column
public static final int TABLE_STATUS = 0;
public static final int TABLE_NAME = 1;
setLocalButton(container);
setFileDialog(container);
setLocalLabel(container);
-
-// setSeparator_02(container);
-// setPatchButton(container);
-// setPatchDialog(container);
-// setPatchLabel(container);
+ setLocalErrorlabel(container);
return container;
}
this.repository = serverUrl;
}
- public void setRepositories(ArrayList<String> serverUrls) {
- if (serverUrls == null || serverUrls.isEmpty()) {
- return;
- }
-
- this.repos = serverUrls;
- }
-
/**
* Change package server type by install type(normal, snapshot, local).
* @param isConfDialog User push 'OK' button in configuration dialog is true, otherwise is false.
buttonSelectImage.setEnabled(false);
textLocalServerUrl.setEnabled(false);
textLocalServerUrl.setText("");
+ localErrLabel.setText("");
setOkEnable(false);
}
});
public void widgetSelected(SelectionEvent e) {
ChangeServerDialog changeServerDialog = new ChangeServerDialog(composite.getShell());
changeServerDialog.setCurrentServer(repository);
- changeServerDialog.setCurrentServer(Registry.getRepoHistory());
int ret = changeServerDialog.open();
if (ret == 0) {
String changeServerUrl = changeServerDialog.getServerUrl();
if (!repository.equals(changeServerUrl)) {
setPackageServerEnv(changeServerUrl);
}
- if (!Registry.getRepoHistory().contains(changeServerUrl)) {
- Registry.saveRepoInfo(changeServerUrl);
- }
} else {
Log.log("Change server dialog is canceled.");
}
buttonLocal.setSelection(false);
textLocalServerUrl.setEnabled(false);
textLocalServerUrl.setText("");
+ localErrLabel.setText("");
buttonSelectImage.setEnabled(false);
setOkEnable(true);
log = snapshotLog.getSnapshotLog(item.getText(TABLE_NAME));
}
- if (log == null && item != null) {
+ if (log == null) {
MessageBoxDlg.showDlg(
getShell(),
"Notice",
"There is not information for snapshot \'" + item.getText(TABLE_NAME) + "\'.",
DialogType.INFO, true);
} else {
- String itemText = "";
- if (item != null) {
- itemText = item.getText(TABLE_NAME);
- } else {
- Log.err("Cannot display item text because item is null.");
- }
- snapshotDialog = new SnapshotLogDialog(getShell(), log, itemText);
-
+ snapshotDialog = new SnapshotLogDialog(getShell(), log, item.getText(TABLE_NAME));
int ret = snapshotDialog.open();
if (ret == 0) {
Log.log("Success to open snapshot log dialog");
public void widgetSelected(SelectionEvent e) {
textLocalServerUrl.setEnabled(true);
buttonSelectImage.setEnabled(true);
+ localErrLabel.setEnabled(true);
distributionCombo.setEnabled(false);
buttonChangeServer.setEnabled(false);
Log.log("SDK image File selection => " + strDir);
if (strDir.endsWith(SDK_IMAGE_ZIP_EXTENSION)) {
imageFile = new File(strDir);
- if (validation(strDir, IMAGE_FILE)) {
+ if (validation(strDir)) {
Log.log("Package list file found in SDK image => " + strDir);
textLocalServerUrl.setText(strDir);
+ localErrLabel.setText("");
UNZIP_RESULT unzipResult = unzipSDKImageFile(imageFile);
if (checkUnzip(unzipResult)) {
setOkEnable(true);
}
@SuppressWarnings("unused")
- private boolean validation(String strDir, int fileStyle) {
+ private boolean validation(String strDir) {
ZipFile zipFile = null;
ZipEntry entry = null;
}
if (zipFile != null) {
- if (fileStyle == IMAGE_FILE) {
- String packageList = PackageManager.getInstance().getPackageListFileName();
- Log.log("This platform must have package list file as '" + packageList + "'");
-
- entry = zipFile.getEntry(packageList);
- } else if (fileStyle == PATCH_FILE) {
- String scriptFile = InstallManagerConstants.SDK_PATCH_SCRIPT;
- Log.log("Patch must have execute script file as '" + scriptFile + "'");
-
- entry = zipFile.getEntry(scriptFile);
- } else {
- try {
- zipFile.close();
- } catch (IOException e) {
- Log.ExceptionLog(e);
- }
- return false;
- }
+ String packageList = PackageManager.getInstance().getPackageListFileName();
+ Log.log("This platform must have package list file as '" + packageList + "'");
+
+ entry = zipFile.getEntry(packageList);
try {
zipFile.close();
return false;
}
}
+
+ private void setLocalErrorlabel(Composite composite) {
+ localErrLabel = new Label(composite, SWT.WRAP);
+ localErrLabel.setBounds(20, 343, 475, 45);
+ localErrLabel.setForeground(new Color(null, 255, 0, 0));
+ }
/**
* Show file path dialog when file dialog button is pushed.
return strDir;
}
-
- private void setSeparator_02(Composite composite) {
- Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
- sep.setBounds(10, 348, 560, 1);
- }
-
- private void setPatchButton(Composite composite) {
- buttonPatch = new Button(composite, SWT.RADIO);
- buttonPatch.setSelection(false);
- buttonPatch.setBounds(10, 358, 350, 18);
- buttonPatch.setText("SDK patch");
-
- buttonPatch.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- textLocalServerUrl.setEnabled(true);
- buttonPatchSelection.setEnabled(true);
-
- distributionCombo.setEnabled(false);
- buttonChangeServer.setEnabled(false);
- buttonSnapshotFilter.setEnabled(false);
- buttonSelectImage.setEnabled(false);
- setOkEnable(false);
-
- snapshotPath = "";
- }
- });
- }
-
- private void setPatchDialog(Composite composite) {
- buttonPatchSelection = new Button(composite, SWT.NONE);
- buttonPatchSelection.setEnabled(false);
- buttonPatchSelection.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- String strDir = showSettingPatchpathDlg();
- if (strDir != null) {
- Log.log("Success to open SDK patch selection file dialog.");
- Log.log("SDK patch file selection => " + strDir);
- if (strDir.endsWith(SDK_IMAGE_ZIP_EXTENSION)) {
-
- }
- }
- }
- });
-
- buttonPatchSelection.setImage(PathUtil.getImageFromResource("/res/icons/icon_directory_open.png"));
- if (!Platform.isMacOS()) {
- buttonPatchSelection.setBounds(520, 381, 35, 29);
- } else {
- buttonPatchSelection.setBounds(525, 380, 40, 31);
- }
- }
-
- private void setPatchLabel(Composite composite) {
- labelPatch = new Label(composite, SWT.BORDER);
- labelPatch.setBounds(10, 386, 500, 20);
- labelPatch.setEnabled(false);
- }
-
- private String showSettingPatchpathDlg() {
- FileDialog dlg = new FileDialog(Display.getCurrent().getShells()[0]);
- dlg.setText("Select the SDK patch file.");
- String strDir = null;
- try {
- strDir = dlg.open();
- } catch (SWTException e) {
- Log.ExceptionLog(e);
- }
-
- return strDir;
- }
/**
* Unzip SDK ImageFile.
-/*
-* InstallManager
-*
-* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-*
-* Contact:
-* Wooyoung Cho <wooyoung1.cho@samsung.com>
-* Shihyun Kim <shihyun.kim@samsung.com>
-* Taeyoung Son <taeyoung2.son@samsung.com>
-* Yongsung kim <yongsung1.kim@samsung.com>
-*
- * Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-* Contributors:
-* - S-Core Co., Ltd
-*
-*/
-
-package org.tizen.installmanager.ui.page;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.tizen.installmanager.core.Config;
-import org.tizen.installmanager.core.IMExitException;
-import org.tizen.installmanager.core.IMFatalException;
-import org.tizen.installmanager.core.InstallManager;
-import org.tizen.installmanager.core.InstallManagerConstants;
-import org.tizen.installmanager.core.Options;
-import org.tizen.installmanager.core.Performance;
-import org.tizen.installmanager.core.SDKExtensionInfo;
-import org.tizen.installmanager.core.Config.ServerType;
-import org.tizen.installmanager.lib.Documents;
-import org.tizen.installmanager.lib.Downloader;
-import org.tizen.installmanager.lib.ErrorController;
-import org.tizen.installmanager.lib.IIMProgressMonitor;
-import org.tizen.installmanager.lib.Log;
-import org.tizen.installmanager.lib.Platform;
-import org.tizen.installmanager.lib.Registry;
-import org.tizen.installmanager.lib.ErrorController.ErrorCode;
-import org.tizen.installmanager.lib.SDKPackageFormat;
-import org.tizen.installmanager.lib.exception.IMNetworkConnectException;
-import org.tizen.installmanager.lib.exception.IMNetworkDownloadException;
-import org.tizen.installmanager.lib.exception.IMNetworkException;
-import org.tizen.installmanager.lib.linux.LinuxShellRunningProgramParser;
-import org.tizen.installmanager.pkg.lib.PackageManager;
-import org.tizen.installmanager.pkg.model.Package;
-import org.tizen.installmanager.pkg.model.PackageSet;
-import org.tizen.installmanager.pkg.model.ProcessInformation;
-import org.tizen.installmanager.pkg.model.Version;
-import org.tizen.installmanager.ui.InstallManagerWindow;
-import org.tizen.installmanager.ui.dialog.MessageBoxDlg;
-import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType;
-import org.tizen.installmanager.ui.model.Item;
-import org.tizen.installmanager.ui.model.Item.InstallState;
-import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor;
-import org.tizen.installmanager.util.IMShellCommandFail;
-import org.tizen.installmanager.util.PathUtil;
-import org.tizen.installmanager.util.ShellUtil;
-
-/**
- * This class is a connector between Model and View. Model and View can communicate each other via ViewController.
- * @author Taeyoung Son <taeyoung2.son@samsung.com>
- */
-public class ViewController {
-
- private InstallManager installManager;
- private PackageManager packageManager;
- private SDKExtensionInfo sdkExtensionInfo;
-
- /**
- * Initialize objects which need to install.
- * @return
- * true : Success to Initialize<br>
- * false : Fail to Initialize
- */
- public boolean init() {
- Log.log("ViewController init");
-
- try {
- installManager = InstallManager.getInstance();
- installManager.init();
- packageManager = installManager.getPackageManager();
-
- if (packageManager == null) {
- throw new IMFatalException("Cannot read package information.");
- } else {
- if (existInstallableOrRemovablePackages()) {
- sdkExtensionInfo = packageManager.getSdkExtensionInfo();
-
-
- // InstallManager maintains the newest extension package list always.
- sdkExtensionInfo.refreshCache();
-
- return true;
- } else {
- ErrorController.setInstallationSuccess(false);
- Log.log("existInstallableOrRemovablePackages() is false.");
- return false;
- }
- }
- } catch(IMFatalException e) {
- Log.ExceptionLog(e);
- return false;
- }
- }
-
- /**
- * Get meta packages that are available to install or to update.
- * @return Meta package set
- */
- public PackageSet getInstallableOrUpdatableMetaPackages() {
- if (packageManager == null) {
- Log.err("PackageManage is null.");
- return null;
- } else {
- return packageManager.getInstallableOrUpdatableMetaPackages();
- }
- }
-
- /**
- * Get meta packages that are available to install.
- * @return Meta package set
- */
- public PackageSet getInstallableMetaPackageList() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getInstallableMetaPackages();
- }
- }
-
- public PackageSet getAllMetaPackages() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getAllMetaPackages();
- }
- }
-
- /**
- * Get meta packages in repository.
- * @return Meta package set
- */
- public PackageSet getRootMetaPackageListOfRepository() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getRootMetaPackagesOfRepository();
- }
- }
-
- public PackageSet getTreeMetaPackageListOfRepository() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getRecentMetaPackages();
- }
- }
-
- public PackageSet getRootMetaPackageListOfExtension() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getRootMetaPackagesOfExtensionServer();
- }
- }
-
- /**
- * Get meta packages that are available to update.
- * @return Meta package set
- */
- public PackageSet getUpdatableMetapackageList() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getUpdatableMetaPackages();
- }
- }
-
- /**
- * Get meta packages that are available to update.
- * @return Meta package set
- */
- public PackageSet getNotUpdatableMetapackageList() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getNotInstallableAndNotUpdatablePackages();
- }
- }
-
- /**
- * Get meta packages that are available to remove.
- * @return Meta package set
- */
- public PackageSet getRemovableMetaPackageList() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getRemovableMetaPackages();
- }
- }
-
- public PackageSet getInstallablePackageListInSnapshot() {
- if (packageManager == null) {
- return null;
- } else {
- return packageManager.getInstallableMetaPackagesInSnapshot();
- }
- }
-
- /**
- * Get packages that are available to remove.
- * @return package set
- */
- public PackageSet getRemovablePackageList() {
- if (packageManager == null) {
- Log.err("packageManage is null");
- return null;
- } else {
- return packageManager.getInstalledPackages();
- }
- }
-
- /**
- * Check to exist removable packages.
- * @return if installed package exists, return true. if not return false.
- */
- public boolean existRemovablePackage() {
- if (packageManager == null) {
- return false;
- } else {
- return packageManager.existInstalledPackages();
- }
- }
-
- /**
- * Check to need new installation.
- * @return If it needs new installation, return true. otherwise return false.
- */
- public boolean isNewInstallation() {
-// if (packageManager == null) {
-// return false;
-// }
-
- if (packageManager.isReInstall()) {
- return true;
- } else {
- return !packageManager.existInstalledPackages();
- }
- }
-
- /**
- * Check that package server has web or native minimal install type package.
- * @return If package server has web or native minimal install type package, return true
- * . Others return false.
- */
- public boolean hasWebNativeMinimal() {
- Package webMinimalPkg = packageManager.getPackageByName("WEB-MINIMAL");
- Package nativeMinimalPkg = packageManager.getPackageByName("NATIVE-MINIMAL");
- if (webMinimalPkg != null && nativeMinimalPkg != null) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Start to install and update.
- * @param installList : selected mata packages
- * @param targetPath : install path
- * @param monitor
- * @return If installation is succeeded, return true. if not return false.
- * @throws IMExitException
- */
- public boolean install(Collection<String> installList, String targetPath,
- InstallProgressMonitor monitor) throws IMExitException {
- Log.log("======== Start Installing ========");
- Log.log("Selected package list => " + installList);
- Log.log("target path => " + targetPath);
-
- if (packageManager == null) {
- Log.err("Package list does not exist.");
- return false;
- }
-
- PackageSet installablePackages = null;
- if (installList.size() == 0) {
- Log.log("Package install success.");
- return true;
- } else {
- installablePackages = getInstallablePackages(installList);
- }
-
- Registry.setSDKinfoBySDKPath(targetPath);
- Registry.saveSDKInfo(targetPath);
-
- boolean bResult = false;
- while(true) {
- try {
- if (installablePackages != null) {
- bResult = installManager.install(installablePackages, targetPath, monitor);
- } else {
- Log.err("Fail to install because installable packages are null.");
- throw new IMFatalException("Fail to install because installable packages are null.");
- }
- break;
- } catch (IMNetworkException e) {
- Log.ExceptionLog(e);
- showRetryDialog(e.getMessage());
-
- if (monitor != null) {
- monitor.workedRefresh();
- }
- continue;
- } catch (Exception e) {
- Log.ExceptionLog(e);
- throw new IMFatalException(e.getMessage());
- }
- }
-
- if (bResult) {
- PathUtil.remove(Config.getInstance().getDownloadDirPath());
- }
-
- return bResult;
- }
-
- public void showRetryDialog(String msg) {
- //retry dialog.
- String errorMsg = msg + "\nWould you like to retry?";
- int ret = MessageBoxDlg.showDlg(
- InstallManagerWindow.getInstallManagerWindow().getShell(),
- "Warning",
- errorMsg,
- DialogType.WARNING, false);
-
- if (ret == SWT.NO) { //cancel
- throw new IMFatalException(msg);
- }
- }
-
- /**
- * Get installable packages.
- * @param installList package name list from UI.
- * @return set of installable packages.
- */
- public PackageSet getInstallablePackages(Collection<String> installList) {
- //get installable packages
- PackageSet selectedMetas = packageManager.getPackagesByNames(installList);
-
- //add mandatory packages, madatory packages always reinstall.
- selectedMetas.addAll(packageManager.getMandatoryPackages());
-
- return packageManager.getInstallablePackages(selectedMetas);
- }
-
- /**
- * Start to uninstall
- * @param uninstallList
- * @param monitor
- * @return If uninstallation is succeed, return true. if not return false.
- * @see ViewController#uninstallPackages(PackageSet, IIMProgressMonitor)
- */
- public boolean uninstall(List<String> uninstallList, IIMProgressMonitor monitor) {
- Log.log("ViewController Uninstall Start => " + uninstallList);
-
- //performance measurement
- Performance.setRemovalStartTime();
- if (packageManager == null || uninstallList.size() == 0) {
- Log.err("ViewController.uninstall() uninstalllist does not exist. => " + uninstallList);
- ErrorController.setError(ErrorCode.UNKNOWN_ERROR);
-
- Performance.setRemovalEndTime();
- return false;
- }
-
- if (Options.doRemoveOldSDK || (uninstallList.size() == 1 && uninstallList.get(0).equals(Config.SDK_NAME))) {
- uninstallAll(monitor);
-
- //performance measurement
- Performance.setRemovalEndTime();
-
- return true;
- } else {
- PackageSet removablePackages = packageManager.getInstalledPackagesByName(uninstallList);
-
- //performance measurement
- Performance.sdkPackageSize = packageManager.getTotalSizeOfRemovablePackages(removablePackages);
-
- boolean result = uninstallPackages(removablePackages, monitor);
-
- //performance measurement
- Performance.setRemovalEndTime();
- return result;
- }
- }
-
- /**
- * Uninstall removable packages.
- * @param removableMetapkgs
- * @param monitor
- * @return If removable packages can success to uninstall, return true. if not return false.
- */
- public boolean uninstallPackages(PackageSet removableMetapkgs, IIMProgressMonitor monitor) {
- boolean bRet = installManager.removePackages(removableMetapkgs, monitor);
-
- Log.log("ViewController Uninstall End => " + bRet);
- return bRet;
- }
-
- /**
- * Remove all packages.
- * @param monitor
- */
- public void uninstallAll(IIMProgressMonitor monitor) {
- Log.log("ViewController Unintall All");
- installManager.removeAll(monitor);
- Registry.removeRegistry();
- }
-
- /**
- * Get package version that is installed already.
- * @param pkgName is installed packages already.
- * @return version
- */
- public Package getInstalledPackage(String pkgName) {
- return packageManager.getInstalledPackageByName(pkgName);
- }
-
- public PackageSet getInstalledPackages() {
- return packageManager.getInstalledPackages();
- }
-
- /**
- * Get items of tree
- * @return
- */
- public List<Item> getPackageSetOfTree() {
- if (packageManager == null) {
- return new ArrayList<Item>();
- }
-
- //get all meta packages (installable packages)
- //TODO : show all packages. (installable, installed)
- PackageSet metaPackageSet = packageManager.getRootMetaPackagesOfRepository();
-
- return makeTreeItem(metaPackageSet);
- }
-
- /**
- * Make tree item from package set.
- * @param pkgSet
- * @return
- */
- public List<Item> makeTreeItem(PackageSet pkgSet) {
- List<Item> treeItemList = new ArrayList<Item>();
- Item extraItem = null;
-
- if (pkgSet == null) {
- return treeItemList;
- }
-
- for (Package pkg : pkgSet) {
- if (!pkg.isMeta() || pkg.isMandatory()) {
- continue;
- }
-
- InstallState itemState = getState(pkg);
-
- if (pkg.getPackageName().equalsIgnoreCase("EXTRAS")) {
- extraItem = new Item(pkg, pkg, itemState);
- continue;
- }
-
- Item newItem = null;
- if (itemState == InstallState.INSTALL) {
- newItem = new Item(pkg, pkg, itemState);
- } else if (itemState == InstallState.UPDATE) {
- Package installedPkg = packageManager.getInstalledMetaPackages().getPackage(pkg);
- newItem = new Item(pkg, installedPkg, itemState);
- } else if (itemState == InstallState.UNINSTALL) {
- newItem = new Item(pkg, pkg, itemState);
- } else {
- Log.err("Cannot find install state. => " + itemState);
- continue;
- }
-
- treeItemList.add(newItem);
- }
-
- if (extraItem != null) {
- treeItemList.add(extraItem);
- }
-
- return treeItemList;
- }
-
- public void refreshTreeItemStatus(List<Item> items) {
-
- }
-
- private InstallState getState(Package pkg) {
- if (PackageManager.getInstance().isReInstall()) {
- return InstallState.INSTALL;
- } else if (Config.isSupportMultiSDK()) {
- if (Config.status == Config.Status.INSTALL) {
- return InstallState.INSTALL;
- } else if (Config.status == Config.Status.UPDATE) {
- if (packageManager.getInstallableMetaPackages().contains(pkg)) {
- return InstallState.INSTALL;
- } else if (packageManager.getUpdatableMetaPackages().contains(pkg)) {
- return InstallState.UPDATE;
- } else {
- return InstallState.UNINSTALL;
- }
- }
- } else {
- if (packageManager.getInstallableMetaPackages().contains(pkg)) {
- return InstallState.INSTALL;
- } else if (packageManager.getUpdatableMetaPackages().contains(pkg)) {
- return InstallState.UPDATE;
- } else {
- return InstallState.UNINSTALL;
- }
- }
-
- return null;
- }
-
- /**
- * Get total size depends on a package list.
- * @param pkgList is list.
- * @param isUncompressed Uncompressed is true, not false.
- * @return size
- */
- public long getTotalSizeWithDepends(Collection<String> pkgList, boolean isUncompressed) {
- PackageSet pkgSet = packageManager.getPackagesByNames(pkgList);
- return getTotalSizeWithDepends(pkgSet, isUncompressed);
- }
-
- /**
- * Get total size depends on a package format.
- * @param pkg is package format.
- * @return size
- */
- public long getRemovablePackagesSize(Package pkg) {
- return packageManager.getTotalSizeOfRemovablePackages(pkg);
- }
-
- /**
- * Get total size depends on a package set.
- * @param pkgs is package set
- * @param isUncompressed Uncompressed is true, not false.
- * @return size
- */
- public long getTotalSizeWithDepends(PackageSet pkgs, boolean isUncompressed) {
- return packageManager.getTotalSizeOfInstallablePackages(pkgs, isUncompressed);
- }
-
- /**
- * Get installed path.
- * @return Installed target path
- */
- public String getInstalledPath() {
- return Registry.getInstalledPath();
- }
-
- public String getInstallPath() {
- String path = InstallManagerWindow.getInstallManagerWindow().getSetInstallDirectoryPage().getInstallPath();
- return path;
- }
-
- public String getSDKWorkSpacePath() {
- String path = InstallManagerWindow.getInstallManagerWindow().getSetInstallDirectoryPage().getSDKWorkSpacePath();
- return path;
- }
-
-
- /**
- * Check to exist package which can install or remove.
- * @return There are packages to install or remove, return true. if not false.
- */
- public boolean existInstallableOrRemovablePackages() {
- PackageSet rmPkgs = new PackageSet();
- rmPkgs = getRemovablePackageList();
- PackageSet insPkgs = getInstallableOrUpdatableMetaPackages();
-
- if (rmPkgs != null && insPkgs != null) {
- if (!rmPkgs.isEmpty() || !insPkgs.isEmpty()) {
- Log.log("existInstallableOrRemovablePackages() is true.");
- return (getRemovablePackageList().size() > 0 || getInstallableOrUpdatableMetaPackages().size() > 0);
- } else {
- Log.err("Both Removable Package List and Installable or Updatable Meta Packages are empty");
- return false;
- }
- } else {
- Log.err("Both Removable Package List and Installable or Updatable Meta Packages are null");
- return false;
- }
- }
-
- /**
- * Check to exist package which can install or update.
- * @return There are packages to install or remove, return true. if not false.
- */
- public boolean existInstallableOrUpdatablePackages() {
- PackageSet ps = getInstallablePackageListInSnapshot();
-
- if (ps != null) {
- if (Options.snapshot || Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) {
- return (ps.size() > 0);
- } else {
- return (ps.size() > 0);
- }
- } else {
- return false;
- }
- }
-
- /**
- * Get Install configure.
- * @return configure object.
- */
- public Config getConfig() {
- return installManager.getConfig();
- }
-
- /**
- * Get description of package.
- * @param pkgName
- * @return decription of package.
- */
- public String getDescription(String pkgName) {
- Package pkg = packageManager.getPackageByName(pkgName);
-
- if (pkg == null) {
- return "";
- } else {
- return pkg.getDescription();
- }
- }
-
- /**
- * Check to exist files in target directory.
- * @param targetDir is installed directory.
- * @return If there are files in directory, return true. if not false.
- */
- public boolean existFilesInTargetDirectory(String targetDir) {
- File targetFile = new File(targetDir);
-
- if (!targetFile.exists()) {
- return false;
- }
-
- File[] targetFileList = targetFile.listFiles();
- if (targetFileList == null || targetFileList.length <= 0) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Remove file or directory from parameter
- * @param targetPath
- */
- public void removeTargetPath(String targetPath) {
- PathUtil.remove(targetPath);
- }
-
- /**
- * save information of server.
- * @param repository Base-repository of sdk. if repository is null, it do not save repository.
- * @param type type of repository. if type is null, it do not save type.
- * @param packageServer package server of sdk. if packageServer is null, it do not save packageServer.
- * @param packageType set ServerType.snapshot or ServerType.package. if serverType is null, it do not save serverType.
- */
- public void saveSnapshotSettings(String repository, String distribution, ServerType packageType, String snapshotPath) {
- Config.getInstance().saveSnapshotSettings(repository, distribution, packageType, snapshotPath);
- }
-
- public SDKExtensionInfo getSdkExtensionInfo() {
- return sdkExtensionInfo;
- }
-
- public void loadSdkExtension() {
- sdkExtensionInfo.load();
- }
-
- /**
- * Check the environment of ubuntu.
- * @return If true, this is unity panel service.
- */
- public boolean isUnityEnvironment() {
- String command = "ps -ax";
-
- try {
- LinuxShellRunningProgramParser parser = new LinuxShellRunningProgramParser();
- int ret = ShellUtil.execute(command, parser);
-
- if (ret != 0 ){
- return false;
- } else {
- for (ProcessInformation pInfo : parser.getProcessInformation()) {
- if (pInfo.getCommand().contains("unity-panel-service")) {
- return true;
- }
- }
- return false;
- }
-
- } catch (IMShellCommandFail e) {
- Log.ExceptionLog(e);
- return false;
- }
- }
-
- public PackageSet getConflictPackages(PackageSet pkgs) {
- PackageSet pkgSet = packageManager.getDependsPackagesFromRepository(pkgs);
- return packageManager.getConflictPackages(pkgSet);
- }
-
- public PackageSet getCauseOfConflict(PackageSet checkedPackages, Package conflictPackage) {
- PackageSet causePackages = new PackageSet();
-
- for (Package pkg : checkedPackages) {
- if (packageManager.conflictPackages(pkg).contains(conflictPackage)) {
- causePackages.add(pkg);
- }
- }
-
- return causePackages;
- }
-
- public void showChangeLog() {
- if (Documents.isChecked()) {
- Documents.showChangeLog(); // show the change log(history)
- }
- }
-
- public void cleanUpTargetDirectory() {
- Log.log("Clean up the target directory => " + Registry.getInstalledPath());
- if (packageManager == null || packageManager.getInstalledPackages().isEmpty()) {
- String targetPath = Config.getInstance().getTargetDir();
-
- if (targetPath.isEmpty()) {
- return;
- } else {
- removeTargetPath(targetPath);
- }
- }
- }
-
- public boolean canInstallManagerUpdate() {
- Package pkg = packageManager.getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);
-
- if (pkg == null) {
- return false;
- }
- String version = Config.getInstance().getCurrentConfigFile().getInstallManagerVersion();
-
- Log.log("Current InstallManager version => " + version);
- if (version == null || version.isEmpty()) {
- return true;
- }
-
- Log.log("Update version => " + pkg.getVersion().toString());
- if (Version.compareTo(new Version(version), pkg.getVersion()) < 0) {
- Log.log("Update version is higher than current version. So, installmanager will be updated.");
- return true;
- } else {
- return false;
- }
- }
-
- public boolean isInstalledInstallManager() {
- Package installedPackage = packageManager.getInstalledPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);
-
- if (installedPackage != null) {
- return true;
- } else {
- return false;
- }
- }
-
- public boolean updateInstallManager() {
- Package pkg = packageManager.getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);
-
- if (pkg == null) {
- return false;
- }
-
- if (installInstallManagerToTemp()) {
- Log.log("## Success to update the InstallManager, and restart now.");
- System.out.println("## Success to update the InstallManager, and restart now.");
-
- runNewInstallManager();
- return true;
- } else {
- return false;
- }
- }
-
- public boolean installInstallManagerToTemp() {
- String imPackage = downloadInstallManager();
- if (imPackage == null) {
- return false;
- }
-
- if (extractIMPackage(imPackage)) {
- Log.log("Success to extract updatable InstallManager.");
- runNewInstallManager();
- return true;
- } else {
- Log.err("Fail to extract updatable InstallManager. Cannot execute it.");
- return false;
- }
- }
-
- private String downloadInstallManager() {
- Package pkg = packageManager.getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);
-
- if (pkg != null) {
- Downloader downloader = new Downloader();
-
- String packagePath = pkg.getFileName();
- String installManagerTempPath = PathUtil.get(PathUtil.getTempDir(), PathUtil.getFileName(packagePath));
- File tempInstaller = new File(installManagerTempPath);
-
- if (tempInstaller.exists()) {
- if (!PathUtil.remove(installManagerTempPath)) {
- Log.err("Cannot remove installmanager. => " + tempInstaller);
- }
- }
-
- try {
- long size = downloader.download(pkg.getURL(), installManagerTempPath, null);
-
- if (size > 0) {
- return installManagerTempPath;
- } else {
- return null;
- }
- } catch (IMNetworkConnectException e) {
- Log.ExceptionLog(e);
- return null;
- } catch (IMNetworkDownloadException e) {
- Log.ExceptionLog(e);
- return null;
- }
- } else {
- Log.err("Cannot download installmanager package.");
- return null;
- }
- }
-
- private boolean extractIMPackage(String imPath) {
- removeIMBinaryInTemp();
-
- SDKPackageFormat format = SDKPackageFormat.createSDKPackageFormat();
- long size = format.unZip(imPath, PathUtil.getTempDir(), null);
-
- if (size > 0) {
- return true;
- } else {
- throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE);
- }
- }
-
- private void removeIMBinaryInTemp() {
- String tempDir = PathUtil.getTempDir();
-
- File tempDirFile = new File(tempDir);
-
- for (File childFile : tempDirFile.listFiles()) {
- if (isIMBinary(childFile.getName())) {
- if (!childFile.delete()) {
- Log.err("Cannot delete " + childFile.getAbsolutePath());
- }
- }
- }
- }
-
- private boolean isIMBinary(String fileName) {
- if (fileName.equals(InstallManagerConstants.INSTALLMANAGERV2_JAR_FILE_NAME)){
- return true;
- } else {
- return false;
- }
- }
-
- private void runNewInstallManager() {
- File tempIMJarFile = new File(PathUtil.get(
- PathUtil.getTempDir(), "data", "install-manager",
- InstallManagerConstants.INSTALLMANAGERV2_JAR_FILE_NAME));
-
- if (tempIMJarFile.exists()) {
- try {
- ArrayList<String> commands = new ArrayList<String>();
-
- String javaHome = System.getProperty("java.home");
- File java = null;
- if (Platform.isLinux() || Platform.isMacOS()) {
- java = new File(PathUtil.get(javaHome, "bin", "java"));
- } else if (Platform.isWindows()) {
- java = new File(PathUtil.get(javaHome, "bin", "java.exe"));
- } else {
- throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM);
- }
-
- String forceBitOption = "-d" + System.getProperty("sun.arch.data.model");
-
- String jarPath = PathUtil.get(tempIMJarFile.getAbsolutePath());
- if (java.exists()) {
- commands.add(java.getAbsolutePath());
- } else {
- commands.add("java");
- }
-
- if (Platform.isMacOS()) {
- commands.add("-XstartOnFirstThread");
- }
-
- commands.add(forceBitOption);
- commands.add("-jar");
- commands.add(jarPath);
-
- if (Options.executablePath != null) {
- commands.add("-path");
- commands.add(Options.executablePath);
- }
-
- String repo = Config.getInstance().getConfigFile().getRepository();
- if (repo != null && !repo.isEmpty()) {
- commands.add("-repository");
- commands.add(repo);
- }
-
- String dist = Config.getInstance().getConfigFile().getDistribution();
- if (dist != null && !dist.isEmpty()) {
- commands.add("-distribution");
- commands.add(dist);
- }
-
- String proxyHost = Config.getInstance().getConfigFile().getProxyHost();
- int proxyPort = Config.getInstance().getConfigFile().getProxyPort();
- if (proxyHost != null && !proxyHost.isEmpty()) {
- if (proxyPort > 0) {
- commands.add("-proxy");
- commands.add(proxyHost + ":" + proxyPort);
- }
- }
-
- if (packageManager.getPackageByName("install-manager") != null) {
- Config.getInstance().getConfigFile().setInstallManagerVersion(packageManager.getPackageByName("install-manager").getVersion().toString());
- Config.getInstance().getConfigFile().saveConfig(PathUtil.get(tempIMJarFile.getParent(), "installmanager.conf"));
- }
-
- Log.log("Updatable commands => " + commands);
-
- ProcessBuilder pb = new ProcessBuilder(commands);
- pb.directory(tempIMJarFile.getParentFile());
- pb.start();
-
- System.exit(0);
- } catch (IOException e) {
- Log.ExceptionLog(e);
- return;
- }
- }
- }
-}
+/*\r
+* InstallManager\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact: \r
+* Wooyoung Cho <wooyoung1.cho@samsung.com>\r
+* Shihyun Kim <shihyun.kim@samsung.com>\r
+* Taeyoung Son <taeyoung2.son@samsung.com>\r
+* Yongsung kim <yongsung1.kim@samsung.com>\r
+* \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/\r
+\r
+package org.tizen.installmanager.ui.page;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.tizen.installmanager.core.Config;\r
+import org.tizen.installmanager.core.IMExitException;\r
+import org.tizen.installmanager.core.IMFatalException;\r
+import org.tizen.installmanager.core.InstallManager;\r
+import org.tizen.installmanager.core.InstallManagerConstants;\r
+import org.tizen.installmanager.core.Options;\r
+import org.tizen.installmanager.core.Performance;\r
+import org.tizen.installmanager.core.SDKExtensionInfo;\r
+import org.tizen.installmanager.core.Config.ServerType;\r
+import org.tizen.installmanager.lib.Documents;\r
+import org.tizen.installmanager.lib.Downloader;\r
+import org.tizen.installmanager.lib.ErrorController;\r
+import org.tizen.installmanager.lib.IIMProgressMonitor;\r
+import org.tizen.installmanager.lib.Log;\r
+import org.tizen.installmanager.lib.Platform;\r
+import org.tizen.installmanager.lib.Registry;\r
+import org.tizen.installmanager.lib.ErrorController.ErrorCode;\r
+import org.tizen.installmanager.lib.SDKPackageFormat;\r
+import org.tizen.installmanager.lib.exception.IMNetworkConnectException;\r
+import org.tizen.installmanager.lib.exception.IMNetworkDownloadException;\r
+import org.tizen.installmanager.lib.exception.IMNetworkException;\r
+import org.tizen.installmanager.lib.linux.LinuxShellRunningProgramParser;\r
+import org.tizen.installmanager.pkg.lib.PackageManager;\r
+import org.tizen.installmanager.pkg.model.Package;\r
+import org.tizen.installmanager.pkg.model.PackageSet;\r
+import org.tizen.installmanager.pkg.model.ProcessInformation;\r
+import org.tizen.installmanager.pkg.model.Version;\r
+import org.tizen.installmanager.ui.InstallManagerWindow;\r
+import org.tizen.installmanager.ui.dialog.MessageBoxDlg;\r
+import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType;\r
+import org.tizen.installmanager.ui.model.Item;\r
+import org.tizen.installmanager.ui.model.Item.InstallState;\r
+import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor;\r
+import org.tizen.installmanager.util.IMShellCommandFail;\r
+import org.tizen.installmanager.util.PathUtil;\r
+import org.tizen.installmanager.util.ShellUtil;\r
+\r
+/**\r
+ * This class is a connector between Model and View. Model and View can communicate each other via ViewController. \r
+ * @author Taeyoung Son <taeyoung2.son@samsung.com>\r
+ */\r
+public class ViewController {\r
+\r
+ private InstallManager installManager;\r
+ private PackageManager packageManager;\r
+ private SDKExtensionInfo sdkExtensionInfo;\r
+\r
+ /**\r
+ * Initialize objects which need to install.\r
+ * @return\r
+ * true : Success to Initialize<br>\r
+ * false : Fail to Initialize\r
+ */\r
+ public boolean init() {\r
+ Log.log("ViewController init");\r
+ \r
+ try {\r
+ installManager = InstallManager.getInstance();\r
+ installManager.init();\r
+ packageManager = installManager.getPackageManager();\r
+ \r
+ if (packageManager == null) {\r
+ throw new IMFatalException("Cannot read package information.");\r
+ } else {\r
+ if (existInstallableOrRemovablePackages()) {\r
+ sdkExtensionInfo = packageManager.getSdkExtensionInfo();\r
+ \r
+ \r
+ // InstallManager maintains the newest extension package list always.\r
+ sdkExtensionInfo.refreshCache();\r
+ \r
+ return true;\r
+ } else {\r
+ ErrorController.setInstallationSuccess(false);\r
+ Log.log("existInstallableOrRemovablePackages() is false.");\r
+ return false;\r
+ }\r
+ }\r
+ } catch(IMFatalException e) {\r
+ Log.ExceptionLog(e);\r
+ return false;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get meta packages that are available to install or to update.\r
+ * @return Meta package set\r
+ */\r
+ public PackageSet getInstallableOrUpdatableMetaPackages() {\r
+ if (packageManager == null) {\r
+ Log.err("PackageManage is null.");\r
+ return null;\r
+ } else {\r
+ return packageManager.getInstallableOrUpdatableMetaPackages();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get meta packages that are available to install.\r
+ * @return Meta package set\r
+ */\r
+ public PackageSet getInstallableMetaPackageList() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getInstallableMetaPackages();\r
+ }\r
+ }\r
+ \r
+ public PackageSet getAllMetaPackages() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getAllMetaPackages();\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Get meta packages in repository.\r
+ * @return Meta package set\r
+ */\r
+ public PackageSet getRootMetaPackageListOfRepository() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getRootMetaPackagesOfRepository();\r
+ }\r
+ }\r
+ \r
+ public PackageSet getTreeMetaPackageListOfRepository() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getRecentMetaPackages();\r
+ }\r
+ }\r
+ \r
+ public PackageSet getRootMetaPackageListOfExtension() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getRootMetaPackagesOfExtensionServer();\r
+ } \r
+ }\r
+\r
+ /**\r
+ * Get meta packages that are available to update.\r
+ * @return Meta package set\r
+ */\r
+ public PackageSet getUpdatableMetapackageList() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getUpdatableMetaPackages();\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Get meta packages that are available to update.\r
+ * @return Meta package set\r
+ */\r
+ public PackageSet getNotUpdatableMetapackageList() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getNotInstallableAndNotUpdatablePackages();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get meta packages that are available to remove.\r
+ * @return Meta package set\r
+ */\r
+ public PackageSet getRemovableMetaPackageList() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getRemovableMetaPackages();\r
+ }\r
+ }\r
+ \r
+ public PackageSet getInstallablePackageListInSnapshot() {\r
+ if (packageManager == null) {\r
+ return null;\r
+ } else {\r
+ return packageManager.getInstallableMetaPackagesInSnapshot();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get packages that are available to remove.\r
+ * @return package set\r
+ */\r
+ public PackageSet getRemovablePackageList() {\r
+ if (packageManager == null) {\r
+ Log.err("packageManage is null");\r
+ return null;\r
+ } else {\r
+ return packageManager.getInstalledPackages();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Check to exist removable packages.\r
+ * @return if installed package exists, return true. if not return false.\r
+ */\r
+ public boolean existRemovablePackage() {\r
+ if (packageManager == null) {\r
+ return false;\r
+ } else {\r
+ return packageManager.existInstalledPackages();\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check to need new installation.\r
+ * @return If it needs new installation, return true. otherwise return false.\r
+ */\r
+ public boolean isNewInstallation() { \r
+// if (packageManager == null) {\r
+// return false;\r
+// }\r
+ \r
+ if (packageManager.isReInstall()) {\r
+ return true;\r
+ } else {\r
+ return !packageManager.existInstalledPackages();\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check that package server has web or native minimal install type package.\r
+ * @return If package server has web or native minimal install type package, return true\r
+ * . Others return false.\r
+ */\r
+ public boolean hasWebNativeMinimal() {\r
+ Package webMinimalPkg = packageManager.getPackageByName("WEB-MINIMAL");\r
+ Package nativeMinimalPkg = packageManager.getPackageByName("NATIVE-MINIMAL");\r
+ if (webMinimalPkg != null && nativeMinimalPkg != null) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Start to install and update.\r
+ * @param installList : selected mata packages\r
+ * @param targetPath : install path\r
+ * @param monitor\r
+ * @return If installation is succeeded, return true. if not return false.\r
+ * @throws IMExitException \r
+ */\r
+ public boolean install(Collection<String> installList, String targetPath,\r
+ InstallProgressMonitor monitor) throws IMExitException { \r
+ Log.log("======== Start Installing ========");\r
+ Log.log("Selected package list => " + installList);\r
+ Log.log("target path => " + targetPath);\r
+\r
+ if (packageManager == null) {\r
+ Log.err("Package list does not exist.");\r
+ return false;\r
+ }\r
+ \r
+ PackageSet installablePackages = null;\r
+ if (installList.size() == 0) {\r
+ Log.log("Package install success.");\r
+ return true;\r
+ } else {\r
+ installablePackages = getInstallablePackages(installList);\r
+ }\r
+ \r
+ Registry.setSDKinfoBySDKPath(targetPath);\r
+ Registry.saveSDKInfo(targetPath);\r
+ \r
+ boolean bResult = false;\r
+ while(true) {\r
+ try {\r
+ bResult = installManager.install(installablePackages, targetPath, monitor);\r
+ break;\r
+ } catch (IMNetworkException e) {\r
+ Log.ExceptionLog(e);\r
+ showRetryDialog(e.getMessage());\r
+ \r
+ if (monitor != null) {\r
+ monitor.workedRefresh();\r
+ }\r
+ continue;\r
+ } catch (Exception e) {\r
+ Log.ExceptionLog(e);\r
+ throw new IMFatalException(e.getMessage());\r
+ }\r
+ }\r
+ \r
+ if (bResult) {\r
+ PathUtil.remove(Config.getInstance().getDownloadDirPath());\r
+ }\r
+ \r
+ return bResult;\r
+ }\r
+ \r
+ public void showRetryDialog(String msg) {\r
+ //retry dialog.\r
+ String errorMsg = msg + "\nWould you like to retry?";\r
+ int ret = MessageBoxDlg.showDlg(\r
+ InstallManagerWindow.getInstallManagerWindow().getShell(),\r
+ "Warning",\r
+ errorMsg,\r
+ DialogType.WARNING, false);\r
+ \r
+ if (ret == SWT.NO) { //cancel\r
+ throw new IMFatalException(msg);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Get installable packages.\r
+ * @param installList package name list from UI.\r
+ * @return set of installable packages.\r
+ */\r
+ public PackageSet getInstallablePackages(Collection<String> installList) {\r
+ //get installable packages\r
+ PackageSet selectedMetas = packageManager.getPackagesByNames(installList);\r
+ \r
+ //add mandatory packages, madatory packages always reinstall.\r
+ selectedMetas.addAll(packageManager.getMandatoryPackages());\r
+ \r
+ return packageManager.getInstallablePackages(selectedMetas);\r
+ }\r
+\r
+ /**\r
+ * Start to uninstall\r
+ * @param uninstallList\r
+ * @param monitor\r
+ * @return If uninstallation is succeed, return true. if not return false.\r
+ * @see ViewController#uninstallPackages(PackageSet, IIMProgressMonitor)\r
+ */\r
+ public boolean uninstall(List<String> uninstallList, IIMProgressMonitor monitor) { \r
+ Log.log("ViewController Uninstall Start => " + uninstallList);\r
+ \r
+ //performance measurement\r
+ Performance.setRemovalStartTime();\r
+ if (packageManager == null || uninstallList.size() == 0) {\r
+ Log.err("ViewController.uninstall() uninstalllist does not exist. => " + uninstallList);\r
+ ErrorController.setError(ErrorCode.UNKNOWN_ERROR);\r
+ \r
+ Performance.setRemovalEndTime();\r
+ return false;\r
+ }\r
+\r
+ if (Options.doRemoveOldSDK || (uninstallList.size() == 1 && uninstallList.get(0).equals(Config.SDK_NAME))) {\r
+ uninstallAll(monitor);\r
+ \r
+ //performance measurement\r
+ Performance.setRemovalEndTime();\r
+ \r
+ return true;\r
+ } else {\r
+ PackageSet removablePackages = packageManager.getInstalledPackagesByName(uninstallList);\r
+\r
+ //performance measurement\r
+ Performance.sdkPackageSize = packageManager.getTotalSizeOfRemovablePackages(removablePackages);\r
+ \r
+ boolean result = uninstallPackages(removablePackages, monitor);\r
+ \r
+ //performance measurement\r
+ Performance.setRemovalEndTime();\r
+ return result;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Uninstall removable packages.\r
+ * @param removableMetapkgs\r
+ * @param monitor\r
+ * @return If removable packages can success to uninstall, return true. if not return false.\r
+ */\r
+ public boolean uninstallPackages(PackageSet removableMetapkgs, IIMProgressMonitor monitor) {\r
+ boolean bRet = installManager.removePackages(removableMetapkgs, monitor);\r
+\r
+ Log.log("ViewController Uninstall End => " + bRet);\r
+ return bRet;\r
+ }\r
+\r
+ /**\r
+ * Remove all packages.\r
+ * @param monitor\r
+ */\r
+ public void uninstallAll(IIMProgressMonitor monitor) {\r
+ Log.log("ViewController Unintall All");\r
+ installManager.removeAll(monitor);\r
+ Registry.removeRegistry();\r
+ }\r
+\r
+ /**\r
+ * Get package version that is installed already.\r
+ * @param pkgName is installed packages already.\r
+ * @return version\r
+ */\r
+ public Package getInstalledPackage(String pkgName) {\r
+ return packageManager.getInstalledPackageByName(pkgName);\r
+ }\r
+ \r
+ public PackageSet getInstalledPackages() {\r
+ return packageManager.getInstalledPackages();\r
+ }\r
+ \r
+ /**\r
+ * Get items of tree\r
+ * @return\r
+ */\r
+ public List<Item> getPackageSetOfTree() { \r
+ if (packageManager == null) {\r
+ return new ArrayList<Item>();\r
+ }\r
+ \r
+ //get all meta packages (installable packages)\r
+ //TODO : show all packages. (installable, installed)\r
+ PackageSet metaPackageSet = packageManager.getRootMetaPackagesOfRepository(); \r
+ \r
+ return makeTreeItem(metaPackageSet);\r
+ }\r
+ \r
+ /**\r
+ * Make tree item from package set.\r
+ * @param pkgSet\r
+ * @return\r
+ */\r
+ public List<Item> makeTreeItem(PackageSet pkgSet) {\r
+ List<Item> treeItemList = new ArrayList<Item>();\r
+ Item extraItem = null;\r
+ \r
+ if (pkgSet == null) {\r
+ return treeItemList;\r
+ }\r
+ \r
+ for (Package pkg : pkgSet) {\r
+ if (!pkg.isMeta() || pkg.isMandatory()) {\r
+ continue;\r
+ }\r
+ \r
+ InstallState itemState = getState(pkg);\r
+ \r
+ if (pkg.getPackageName().equalsIgnoreCase("EXTRAS")) {\r
+ extraItem = new Item(pkg, pkg, itemState);\r
+ continue;\r
+ }\r
+ \r
+ Item newItem = null;\r
+ if (itemState == InstallState.INSTALL) {\r
+ newItem = new Item(pkg, pkg, itemState);\r
+ } else if (itemState == InstallState.UPDATE) {\r
+ Package installedPkg = packageManager.getInstalledMetaPackages().getPackage(pkg);\r
+ newItem = new Item(pkg, installedPkg, itemState); \r
+ } else if (itemState == InstallState.UNINSTALL) {\r
+ newItem = new Item(pkg, pkg, itemState);\r
+ } else {\r
+ Log.err("Cannot find install state. => " + itemState);\r
+ continue;\r
+ }\r
+\r
+ treeItemList.add(newItem);\r
+ }\r
+\r
+ if (extraItem != null) {\r
+ treeItemList.add(extraItem);\r
+ }\r
+ \r
+ return treeItemList;\r
+ }\r
+ \r
+ public void refreshTreeItemStatus(List<Item> items) {\r
+ \r
+ }\r
+ \r
+ private InstallState getState(Package pkg) {\r
+ if (PackageManager.getInstance().isReInstall()) {\r
+ return InstallState.INSTALL;\r
+ } else if (Config.isSupportMultiSDK()) {\r
+ if (Config.status == Config.Status.INSTALL) {\r
+ return InstallState.INSTALL; \r
+ } else if (Config.status == Config.Status.UPDATE) {\r
+ if (packageManager.getInstallableMetaPackages().contains(pkg)) {\r
+ return InstallState.INSTALL;\r
+ } else if (packageManager.getUpdatableMetaPackages().contains(pkg)) {\r
+ return InstallState.UPDATE;\r
+ } else {\r
+ return InstallState.UNINSTALL;\r
+ }\r
+ }\r
+ } else {\r
+ if (packageManager.getInstallableMetaPackages().contains(pkg)) {\r
+ return InstallState.INSTALL;\r
+ } else if (packageManager.getUpdatableMetaPackages().contains(pkg)) {\r
+ return InstallState.UPDATE;\r
+ } else {\r
+ return InstallState.UNINSTALL;\r
+ }\r
+ }\r
+ \r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * Get total size depends on a package list.\r
+ * @param pkgList is list.\r
+ * @param isUncompressed Uncompressed is true, not false.\r
+ * @return size\r
+ */\r
+ public long getTotalSizeWithDepends(Collection<String> pkgList, boolean isUncompressed) {\r
+ PackageSet pkgSet = packageManager.getPackagesByNames(pkgList);\r
+ return getTotalSizeWithDepends(pkgSet, isUncompressed);\r
+ }\r
+ \r
+ /**\r
+ * Get total size depends on a package format.\r
+ * @param pkg is package format.\r
+ * @return size\r
+ */\r
+ public long getRemovablePackagesSize(Package pkg) {\r
+ return packageManager.getTotalSizeOfRemovablePackages(pkg);\r
+ }\r
+\r
+ /**\r
+ * Get total size depends on a package set.\r
+ * @param pkgs is package set\r
+ * @param isUncompressed Uncompressed is true, not false.\r
+ * @return size\r
+ */\r
+ public long getTotalSizeWithDepends(PackageSet pkgs, boolean isUncompressed) {\r
+ return packageManager.getTotalSizeOfInstallablePackages(pkgs, isUncompressed);\r
+ }\r
+ \r
+ /**\r
+ * Get installed path.\r
+ * @return Installed target path\r
+ */\r
+ public String getInstalledPath() {\r
+ return Registry.getInstalledPath();\r
+ }\r
+ \r
+ public String getInstallPath() {\r
+ String path = InstallManagerWindow.getInstallManagerWindow().getSetInstallDirectoryPage().getInstallPath();\r
+ return path;\r
+ }\r
+ \r
+ public String getSDKWorkSpacePath() {\r
+ String path = InstallManagerWindow.getInstallManagerWindow().getSetInstallDirectoryPage().getSDKWorkSpacePath();\r
+ return path;\r
+ }\r
+ \r
+\r
+ /**\r
+ * Check to exist package which can install or remove.\r
+ * @return There are packages to install or remove, return true. if not false.\r
+ */\r
+ public boolean existInstallableOrRemovablePackages() {\r
+ PackageSet rmPkgs = getRemovablePackageList();\r
+ PackageSet insPkgs = getInstallableOrUpdatableMetaPackages();\r
+ \r
+ if (!rmPkgs.isEmpty() || !insPkgs.isEmpty()) {\r
+ Log.log("existInstallableOrRemovablePackages() is true.");\r
+ return (getRemovablePackageList().size() > 0 || getInstallableOrUpdatableMetaPackages().size() > 0); \r
+ } else {\r
+ Log.err("Both Removable Package List and Installable or Updatable Meta Packages are null"); \r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Check to exist package which can install or update.\r
+ * @return There are packages to install or remove, return true. if not false.\r
+ */\r
+ public boolean existInstallableOrUpdatablePackages() {\r
+ PackageSet ps = getInstallablePackageListInSnapshot();\r
+ \r
+ if (ps != null) {\r
+ if (Options.snapshot || Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) {\r
+ return (ps.size() > 0);\r
+ } else {\r
+ return (ps.size() > 0);\r
+ }\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Get Install configure.\r
+ * @return configure object.\r
+ */\r
+ public Config getConfig() {\r
+ return installManager.getConfig();\r
+ }\r
+\r
+ /**\r
+ * Get description of package.\r
+ * @param pkgName\r
+ * @return decription of package.\r
+ */\r
+ public String getDescription(String pkgName) {\r
+ Package pkg = packageManager.getPackageByName(pkgName);\r
+\r
+ if (pkg == null) {\r
+ return "";\r
+ } else {\r
+ return pkg.getDescription();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Check to exist files in target directory.\r
+ * @param targetDir is installed directory.\r
+ * @return If there are files in directory, return true. if not false.\r
+ */\r
+ public boolean existFilesInTargetDirectory(String targetDir) {\r
+ File targetFile = new File(targetDir);\r
+\r
+ if (!targetFile.exists()) {\r
+ return false;\r
+ }\r
+\r
+ File[] targetFileList = targetFile.listFiles();\r
+ if (targetFileList == null || targetFileList.length <= 0) {\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Remove file or directory from parameter\r
+ * @param targetPath\r
+ */\r
+ public void removeTargetPath(String targetPath) {\r
+ PathUtil.remove(targetPath);\r
+ }\r
+ \r
+ /**\r
+ * save information of server.\r
+ * @param repository Base-repository of sdk. if repository is null, it do not save repository.\r
+ * @param type type of repository. if type is null, it do not save type.\r
+ * @param packageServer package server of sdk. if packageServer is null, it do not save packageServer.\r
+ * @param packageType set ServerType.snapshot or ServerType.package. if serverType is null, it do not save serverType.\r
+ */\r
+ public void saveSnapshotSettings(String repository, String distribution, ServerType packageType, String snapshotPath) {\r
+ Config.getInstance().saveSnapshotSettings(repository, distribution, packageType, snapshotPath);\r
+ }\r
+ \r
+ public SDKExtensionInfo getSdkExtensionInfo() {\r
+ return sdkExtensionInfo;\r
+ }\r
+ \r
+ public void loadSdkExtension() {\r
+ sdkExtensionInfo.load();\r
+ }\r
+ \r
+ /**\r
+ * Check the environment of ubuntu.\r
+ * @return If true, this is unity panel service.\r
+ */\r
+ public boolean isUnityEnvironment() {\r
+ String command = "ps -ax";\r
+ \r
+ try {\r
+ LinuxShellRunningProgramParser parser = new LinuxShellRunningProgramParser();\r
+ int ret = ShellUtil.execute(command, parser);\r
+ \r
+ if (ret != 0 ){\r
+ return false;\r
+ } else {\r
+ for (ProcessInformation pInfo : parser.getProcessInformation()) {\r
+ if (pInfo.getCommand().contains("unity-panel-service")) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ } catch (IMShellCommandFail e) {\r
+ Log.ExceptionLog(e);\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public PackageSet getConflictPackages(PackageSet pkgs) {\r
+ PackageSet pkgSet = packageManager.getDependsPackagesFromRepository(pkgs); \r
+ return packageManager.getConflictPackages(pkgSet);\r
+ }\r
+ \r
+ public PackageSet getCauseOfConflict(PackageSet checkedPackages, Package conflictPackage) {\r
+ PackageSet causePackages = new PackageSet();\r
+ \r
+ for (Package pkg : checkedPackages) {\r
+ if (packageManager.conflictPackages(pkg).contains(conflictPackage)) {\r
+ causePackages.add(pkg);\r
+ }\r
+ }\r
+ \r
+ return causePackages;\r
+ }\r
+ \r
+ public void showChangeLog() {\r
+ if (Documents.isChecked()) {\r
+ Documents.showChangeLog(); // show the change log(history)\r
+ }\r
+ }\r
+ \r
+ public void cleanUpTargetDirectory() {\r
+ Log.log("Clean up the target directory => " + Registry.getInstalledPath());\r
+ if (packageManager == null || packageManager.getInstalledPackages().isEmpty()) {\r
+ String targetPath = Config.getInstance().getTargetDir();\r
+ \r
+ if (targetPath.isEmpty()) {\r
+ return;\r
+ } else {\r
+ removeTargetPath(targetPath);\r
+ }\r
+ }\r
+ }\r
+ \r
+ public boolean canInstallManagerUpdate() {\r
+ Package pkg = packageManager.getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);\r
+ \r
+ if (pkg == null) {\r
+ return false;\r
+ }\r
+ String version = Config.getInstance().getCurrentConfigFile().getInstallManagerVersion();\r
+ \r
+ Log.log("Current InstallManager version => " + version);\r
+ if (version == null || version.isEmpty()) {\r
+ return true;\r
+ }\r
+ \r
+ Log.log("Update version => " + pkg.getVersion().toString());\r
+ if (Version.compareTo(new Version(version), pkg.getVersion()) < 0) {\r
+ Log.log("Update version is higher than current version. So, installmanager will be updated.");\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public boolean isInstalledInstallManager() {\r
+ Package installedPackage = packageManager.getInstalledPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);\r
+ \r
+ if (installedPackage != null) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public boolean updateInstallManager() {\r
+ Package pkg = packageManager.getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);\r
+\r
+ if (pkg == null) {\r
+ return false;\r
+ }\r
+ \r
+ if (installInstallManagerToTemp()) {\r
+ Log.log("## Success to update the InstallManager, and restart now.");\r
+ System.out.println("## Success to update the InstallManager, and restart now.");\r
+ \r
+ runNewInstallManager();\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ public boolean installInstallManagerToTemp() {\r
+ String imPackage = downloadInstallManager();\r
+ if (imPackage == null) {\r
+ return false;\r
+ }\r
+ \r
+ if (extractIMPackage(imPackage)) {\r
+ Log.log("Success to extract updatable InstallManager.");\r
+ runNewInstallManager();\r
+ return true;\r
+ } else {\r
+ Log.err("Fail to extract updatable InstallManager. Cannot execute it.");\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ private String downloadInstallManager() {\r
+ Package pkg = packageManager.getPackageByName(InstallManagerConstants.INSTALLMANAGER_PACKAGE_NAME);\r
+ \r
+ Downloader downloader = new Downloader();\r
+ \r
+ String packagePath = pkg.getFileName();\r
+ String installManagerTempPath = PathUtil.get(PathUtil.getTempDir(), PathUtil.getFileName(packagePath));\r
+ File tempInstaller = new File(installManagerTempPath);\r
+ \r
+ if (tempInstaller.exists()) {\r
+ if (!PathUtil.remove(installManagerTempPath)) {\r
+ Log.err("Cannot remove installmanager. => " + tempInstaller);\r
+ }\r
+ }\r
+ \r
+ try {\r
+ long size = downloader.download(pkg.getURL(), installManagerTempPath, null);\r
+ \r
+ if (size > 0) {\r
+ return installManagerTempPath;\r
+ } else {\r
+ return null;\r
+ }\r
+ } catch (IMNetworkConnectException e) {\r
+ Log.ExceptionLog(e);\r
+ return null;\r
+ } catch (IMNetworkDownloadException e) {\r
+ Log.ExceptionLog(e);\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ private boolean extractIMPackage(String imPath) {\r
+ removeIMBinaryInTemp();\r
+ \r
+ SDKPackageFormat format = SDKPackageFormat.createSDKPackageFormat();\r
+ long size = format.unZip(imPath, PathUtil.getTempDir(), null);\r
+ \r
+ if (size > 0) {\r
+ return true;\r
+ } else {\r
+ throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE);\r
+ }\r
+ }\r
+ \r
+ private void removeIMBinaryInTemp() {\r
+ String tempDir = PathUtil.getTempDir();\r
+ \r
+ File tempDirFile = new File(tempDir);\r
+ \r
+ for (File childFile : tempDirFile.listFiles()) {\r
+ if (isIMBinary(childFile.getName())) {\r
+ if (!childFile.delete()) {\r
+ Log.err("Cannot delete " + childFile.getAbsolutePath());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ private boolean isIMBinary(String fileName) {\r
+ if (fileName.equals(InstallManagerConstants.INSTALLMANAGERV2_JAR_FILE_NAME)){\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ private void runNewInstallManager() {\r
+ File tempIMJarFile = new File(PathUtil.get(\r
+ PathUtil.getTempDir(), "data", "install-manager",\r
+ InstallManagerConstants.INSTALLMANAGERV2_JAR_FILE_NAME));\r
+\r
+ if (tempIMJarFile.exists()) {\r
+ try {\r
+ ArrayList<String> commands = new ArrayList<String>();\r
+ \r
+ String javaHome = System.getProperty("java.home");\r
+ File java = null;\r
+ if (Platform.isLinux() || Platform.isMacOS()) {\r
+ java = new File(PathUtil.get(javaHome, "bin", "java"));\r
+ } else if (Platform.isWindows()) {\r
+ java = new File(PathUtil.get(javaHome, "bin", "java.exe"));\r
+ }\r
+ \r
+ String forceBitOption = "-d" + System.getProperty("sun.arch.data.model");\r
+\r
+ String jarPath = PathUtil.get(tempIMJarFile.getAbsolutePath());\r
+ if (java.exists()) {\r
+ commands.add(java.getAbsolutePath());\r
+ } else {\r
+ commands.add("java");\r
+ }\r
+ \r
+ if (Platform.isMacOS()) {\r
+ commands.add("-XstartOnFirstThread");\r
+ }\r
+ \r
+ commands.add(forceBitOption);\r
+ commands.add("-jar");\r
+ commands.add(jarPath);\r
+ \r
+ if (Options.executablePath != null) {\r
+ commands.add("-path");\r
+ commands.add(Options.executablePath);\r
+ }\r
+ \r
+ String repo = Config.getInstance().getConfigFile().getRepository();\r
+ if (repo != null & !repo.isEmpty()) {\r
+ commands.add("-repository");\r
+ commands.add(repo);\r
+ }\r
+ \r
+ String dist = Config.getInstance().getConfigFile().getDistribution();\r
+ if (repo != null & !repo.isEmpty()) {\r
+ commands.add("-distribution");\r
+ commands.add(dist);\r
+ }\r
+ \r
+ String proxyHost = Config.getInstance().getConfigFile().getProxyHost();\r
+ int proxyPort = Config.getInstance().getConfigFile().getProxyPort();\r
+ if (proxyHost != null & !proxyHost.isEmpty()) {\r
+ if (proxyPort > 0) {\r
+ commands.add("-proxy");\r
+ commands.add(proxyHost + ":" + proxyPort);\r
+ }\r
+ }\r
+ \r
+ Config.getInstance().getConfigFile().setInstallManagerVersion(packageManager.getPackageByName("install-manager").getVersion().toString());\r
+ Config.getInstance().getConfigFile().saveConfig(PathUtil.get(tempIMJarFile.getParent(), "installmanager.conf"));\r
+ \r
+ Log.log("Updatable commands => " + commands);\r
+ \r
+ ProcessBuilder pb = new ProcessBuilder(commands);\r
+ pb.directory(tempIMJarFile.getParentFile());\r
+ pb.start();\r
+ \r
+ System.exit(0);\r
+ } catch (IOException e) {\r
+ Log.ExceptionLog(e);\r
+ return;\r
+ }\r
+ }\r
+ }\r
+}\r
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
-import java.util.StringTokenizer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
if (path != null) {
for (int i = parentDepth; i > 0; i--) {
parentPath = PathUtil.getParentDirectory(parentPath);
- if (parentPath == null) {
- break;
- }
}
}
* @param toFile
* @return
*/
- public static boolean copyHardLink(File fromFile, File toFile, boolean overwrite) {
+ public static boolean copyHardLink(File fromFile, File toFile) {
Log.log("Copy from " + fromFile + " to " + toFile);
- if (overwrite) {
- Log.log("Set overwrite flag.");
- }
-
String fromPath = fromFile.getAbsolutePath();
- String[] command = getCopyShellCommand(fromPath, toFile.getAbsolutePath(), overwrite);
+ String[] command = getCopyShellCommand(fromPath, toFile.getAbsolutePath());
try {
ShellUtil.execute(command);
} catch (IMShellCommandFail e) {
return true;
}
- private static String[] getCopyShellCommand(String fromPath, String toPath, boolean overwrite) {
- if (overwrite) {
- if (Platform.CURRENT_PLATFORM == Platform.LINUX_32
- || Platform.CURRENT_PLATFORM == Platform.LINUX_64) {
- String command[] = {"cp", "-rlf", fromPath, toPath};
- return command;
- } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) {
- String command[] = {"cp", "-af", fromPath, toPath};
- return command;
- } else {
- return null;
- }
+ private static String[] getCopyShellCommand(String fromPath, String toPath) {
+ if (Platform.CURRENT_PLATFORM == Platform.LINUX_32
+ || Platform.CURRENT_PLATFORM == Platform.LINUX_64) {
+ String command[] = {"cp", "-rl", fromPath, toPath};
+ return command;
+ } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) {
+ String command[] = {"cp", "-a", fromPath, toPath};
+ return command;
} else {
- if (Platform.CURRENT_PLATFORM == Platform.LINUX_32
- || Platform.CURRENT_PLATFORM == Platform.LINUX_64) {
- String command[] = {"cp", "-rl", fromPath, toPath};
- return command;
- } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) {
- String command[] = {"cp", "-a", fromPath, toPath};
- return command;
- } else {
- return null;
- }
+ return null;
}
-
}
//Copy file
return file;
}
- public static File makeParent(String filePath) throws IOException{
- File file = new File(filePath);
- if (file.exists()) {
- Log.log("<" + file + "> exists already. it will be removed.");
- if (!file.delete()) {
- Log.err("Fail to delete file. => " + file);
- return null;
- } else {
- Log.log("Success to delete file. => " + file);
- }
- }
-
- File parentDir = file.getParentFile();
- if (!parentDir.exists()) {
- if (!parentDir.mkdirs()) {
- return null;
- }
- }
-
- return parentDir;
- }
-
- public static int getParentCnt(String filePath) {
- StringTokenizer token = new StringTokenizer(filePath, DIRECTORY_SEPERATOR);
- int count = token.countTokens();
-
- return count - 1; // except file.
- }
-
/**
* Make hidden file.
* @param file
* @param fromFilePath
* @param toFilePath
*/
- public static boolean moveFile(String fromFilePath, String toFilePath) {
- return PathUtil.moveFile(new File(fromFilePath), new File(toFilePath));
+ public static void moveFile(String fromFilePath, String toFilePath) {
+ PathUtil.moveFile(new File(fromFilePath), new File(toFilePath));
}
/**
return exitCode;
} catch (IOException e) {
Log.err("Command exec error => " + Arrays.toString(cmd));
- Log.ExceptionLog(e);
throw new IMShellCommandFail();
} catch (InterruptedException e) {
Log.err("Command exec error => " + Arrays.toString(cmd));
- Log.ExceptionLog(e);
throw new IMShellCommandFail();
}
}
fi
###### Get system information ######
+AVAIL_SPACE=`df -k . | tail -n -1 | awk '{if ( $4 ~ /%/) { print $3 } else { print $4 } }'`
DISPLAY_MODE=$DISPLAY
OS_BLOCKSIZE=`df -k . |head -n 1 | awk '{if ( $4 ~ /%/) { print $1 } else { print $2 } }'`
OUT_PATH="/tmp/tizensdk_${MYTIMESTAMP}"
# list for pre installation check. Write including 'space'
-if [ "Ubuntu" = "${OS_NAME}" ] ; then
- OS_NAME="ubuntu"
-fi
-if [ "ubuntu" = "${OS_NAME}" ] || [ "Ubuntu" = "${OS_NAME}" ] ; then
+if [ "ubuntu" = "${OS_NAME}" ] ; then
INSTALLATION_CHECK="procps gettext libdbus-1-3 libcurl3 expect grep zip make libgnome2-0 libudev-dev libpng12-0 libpython2.7 libpixman-1-0 libpng12-0"
elif [ "fedora" = "${OS_NAME}" ]; then
INSTALLATION_CHECK="procps-ng gettext dbus-libs libcurl expect gtk2 grep zip make libgnome qemu-user webkitgtk libpng12"
elif [ "11.04" = ${OS_VERSION} ] || [ "11.10" = ${OS_VERSION} ]; then
INSTALLATION_CHECK="$INSTALLATION_CHECK qemu-user-static"
elif [ "12.04" = ${OS_VERSION} ]; then
- INSTALLATION_CHECK="$INSTALLATION_CHECK qemu-user-static libwebkitgtk-1.0-0 libxcb-render-util0 libxcb-randr0 libxcb-xfixes0 libxcb-sync0 libxcb-shm0 libxcb-icccm4 libxcb-keysyms1 libxcb-image0"
+ INSTALLATION_CHECK="$INSTALLATION_CHECK qemu-user-static libwebkitgtk-1.0-0"
elif [ "12.10" = ${OS_VERSION} ]; then
- INSTALLATION_CHECK="$INSTALLATION_CHECK qemu-user-static libwebkitgtk-1.0-0 libsdl1.2debian libxcb-render-util0 libxcb-randr0 libxcb-xfixes0 libxcb-sync0 libxcb-shm0 libxcb-icccm4 libxcb-keysyms1 libxcb-image0"
+ INSTALLATION_CHECK="$INSTALLATION_CHECK qemu-user-static libwebkitgtk-1.0-0 libsdl1.2debian"
fi
NVIDIA_CHECK=`lspci | grep nVidia`
fi
####################################
+## check the available space ##
+if [ $AVAIL_SPACE -lt 5452596 ]; then
+ echo "${CE} Available blocks: $AVAIL_SPACE($OS_BLOCKSIZE) Needed blocks: about 5.2GB "
+ echo " Please free up the required Disk Space and try again. $CN"
+ exit 1
+fi
+
## check the root user ##
if [ `whoami` = "root" ] ; then
echo "${CE} Do not install as 'root' user or 'su' commands. ${CN}"
## Check java version and java execution.\r
ExpandEnvStrings $3 %COMSPEC%\r
\r
- ${If} $3 == "%COMSPEC%"\r
- ${DisableX64FSRedirection} ; execute cmd command for windows7 64bit\r
- nsExec::ExecToStack '"java.exe" "-version"'\r
- ${EnableX64FSRedirection} ; execute cmd command for windows7 64bit\r
- Pop $0\r
- Pop $6\r
- ${Else}\r
- ${DisableX64FSRedirection} ; execute cmd command for windows7 64bit\r
- nsExec::ExecToStack '"$3" /C ""java.exe" "-version""'\r
- ${EnableX64FSRedirection} ; execute cmd command for windows7 64bit\r
- Pop $0\r
- Pop $6\r
- ${EndIf}\r
+ ${DisableX64FSRedirection} ; execute cmd command for windows7 64bit\r
+ nsExec::ExecToStack '"$3" /C ""java.exe" "-version""'\r
+ Pop $0\r
+ Pop $6\r
+ ${EnableX64FSRedirection} ; execute cmd command for windows7 64bit\r
\r
## check java 1.6\r
Push $6\r
Call StrStr\r
Pop $1\r
${If} $1 == "" ; if not java version 1.7, it will check java version using java home.\r
- Push $6\r
- Push "1.8"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.8, it will check java version using java home.\r
- ## Execute java.exe in java home\r
- nsExec::ExecToStack '"$3" /C ""$5\bin\java.exe" "-version""'\r
- Pop $0\r
- Pop $6\r
-\r
- ## check java 1.6\r
- Push $6\r
- Push "1.6"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.6, it will check java version 1.7.\r
- Push $6\r
- Push "1.7"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.7, it will check java version 1.8.\r
- Push $6\r
- Push "1.7"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.8, system does not support java.\r
- goto NoEnv\r
- ${EndIf}\r
- ${EndIf}\r
+ ## Execute java.exe in java home\r
+ nsExec::ExecToStack '"$3" /C ""$5\bin\java.exe" "-version""'\r
+ Pop $0\r
+ Pop $6\r
+\r
+ Push $6\r
+ Push "1.6"\r
+ Call StrStr\r
+ Pop $1\r
+ ${If} $1 == "" ; if not java version 1.6, it will check java version 1.7.\r
+ Push $6\r
+ Push "1.7"\r
+ Call StrStr\r
+ Pop $1\r
+ ${If} $1 == "" ; if not java version 1.7, system does not support java.\r
+ goto NoEnv\r
${EndIf}\r
${EndIf}\r
${EndIf}\r
${EndIf}\r
\r
${If} $R0 == ""\r
- DetailPrint "Installmanager needs initialization time for executing itself."\r
ExecDos::Exec /NOUNLOAD /ASYNC /DISABLEFSR "java -jar $INSTDIR\InstallManager.jar $2"\r
- sleep 5000\r
pop $4\r
${Else}\r
StrCpy $3 "$2 $R0"\r
return\r
\r
NoEnv:\r
- MessageBox MB_ICONEXCLAMATION "Cannot execute Java even if it was installed. Check environment variables or Java version(1.6, 1.7, 1.8) please." \r
+ MessageBox MB_ICONEXCLAMATION "Cannot execute Java even if it was installed. Check environment variables or Java version(over 1.6) please." \r
SetAutoClose true\r
return\r
\r
NoJava:\r
- MessageBox MB_ICONEXCLAMATION "You must have either a Java Runtime Environment (JRE) or a Java Development Kit (JDK) in version 6, 7, 8 installed on your computer."\r
+ MessageBox MB_ICONEXCLAMATION "You must have either a Java Runtime Environment (JRE) or a Java Development Kit (JDK) in version 6 installed on your computer."\r
SetAutoClose true\r
return\r
\r
FunctionEnd\r
############\r
\r
+\r
### TimeStamp\r
!ifndef TimeStamp\r
!define TimeStamp "!insertmacro _TimeStamp" \r
\r
## Check java version and java execution.\r
ExpandEnvStrings $3 %COMSPEC%\r
-\r
- ${If} $3 == "%COMSPEC%"\r
- nsExec::ExecToStack '"java.exe" "-version"'\r
- Pop $0\r
- Pop $6\r
- ${Else}\r
- nsExec::ExecToStack '"$3" /C ""java.exe" "-version""'\r
- Pop $0\r
- Pop $6\r
- ${EndIf}\r
-\r
+ \r
+ nsExec::ExecToStack '"$3" /C ""java.exe" "-version""'\r
+ Pop $0\r
+ Pop $6\r
## check java 1.6\r
Push $6\r
Push "1.6"\r
Call StrStr\r
Pop $1\r
${If} $1 == "" ; if not java version 1.7, it will check java version using java home.\r
- Push $6\r
- Push "1.8"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.8, it will check java version using java home.\r
- ## Execute java.exe in java home\r
- nsExec::ExecToStack '"$3" /C ""$5\bin\java.exe" "-version""'\r
- Pop $0\r
- Pop $6\r
-\r
- ## check java 1.6\r
- Push $6\r
- Push "1.6"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.6, it will check java version 1.7.\r
- Push $6\r
- Push "1.7"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.7, it will check java version 1.8.\r
- Push $6\r
- Push "1.7"\r
- Call StrStr\r
- Pop $1\r
- ${If} $1 == "" ; if not java version 1.8, system does not support java.\r
- goto NoEnv\r
- ${EndIf}\r
- ${EndIf}\r
+ ## Execute java.exe in java home\r
+ nsExec::ExecToStack '"$3" /C ""$5\bin\java.exe" "-version""'\r
+ Pop $0\r
+ Pop $6\r
+\r
+ ## check java 1.6\r
+ Push $6\r
+ Push "1.6"\r
+ Call StrStr\r
+ Pop $1\r
+ ${If} $1 == "" ; if not java version 1.6, it will check java version 1.7.\r
+ Push $6\r
+ Push "1.7"\r
+ Call StrStr\r
+ Pop $1\r
+ ${If} $1 == "" ; if not java version 1.7, system does not support java.\r
+ goto NoEnv\r
${EndIf}\r
${EndIf}\r
${EndIf}\r
${EndIf}\r
\r
${If} $R0 == ""\r
- DetailPrint "Installmanager needs initialization time for executing itself."\r
- ExecDos::Exec /NOUNLOAD /ASYNC /DISABLEFSR "java -jar $INSTDIR\InstallManager.jar $2"\r
- sleep 5000\r
- pop $4\r
+ ExecDos::Exec /NOUNLOAD /ASYNC "java.exe -jar $INSTDIR\InstallManager.jar $2"\r
+ Pop $4\r
${Else}\r
StrCpy $3 "$2 $R0"\r
System::Call 'kernel32::GetStdHandle(i -11)i.r0' ;try to get stdout\r
return\r
\r
NoEnv:\r
- MessageBox MB_ICONEXCLAMATION "Cannot execute Java even if it was installed. Check environment variables or Java version(1.6, 1.7, 1.8) please." \r
+ MessageBox MB_ICONEXCLAMATION "Cannot execute Java even if it was installed. Check environment variables or Java version(over 1.6) please." \r
SetAutoClose true\r
return\r
\r
NoJava:\r
- MessageBox MB_ICONEXCLAMATION "You must have either a Java Runtime Environment (JRE) or a Java Development Kit (JDK) in version 6, 7, 8 installed on your computer."\r
+ MessageBox MB_ICONEXCLAMATION "You must have either a Java Runtime Environment (JRE) or a Java Development Kit (JDK) in version 6 installed on your computer."\r
SetAutoClose true\r
return\r
\r
-#!/bin/bash\r
-if [ "`which makensis 2>/dev/null`" ] ; then\r
- echo "Checking NSIS... OK"\r
-else\r
- echo "Checking NSIS... IS NOT INSTALLED"\r
- exit 1\r
-fi\r
-\r
-# build exe\r
-makensis $1\r
-\r
-# sign if defined\r
-#if [ "$SIGNTOOL_PATH" != "" ] && [ -f "$SIGNTOOL_PATH" ]\r
-#then\r
-# if [ "$SIGNFILE_PATH" != "" ] && [ -f "$SIGNFILE_PATH" ]\r
-# then\r
-# if [ "$SIGNPASSWORD" != "" ]\r
-# then\r
-# "$SIGNTOOL_PATH" "sign" "//f" "$SIGNFILE_PATH" "//p" "${SIGNPASSWORD}" "$SRCDIR/build/inst-manager.exe"\r
-# else\r
-# echo "Skip signing... Signing password is not defined!"\r
-# fi\r
-# else\r
-# echo "Skip signing... Signing file does not exist!"\r
-# fi\r
-#else\r
-# echo "Skip signing... Signing tool does not exist!"\r
-#fi\r
+#!/bin/bash
+if [ "`which makensis 2>/dev/null`" ] ; then
+ echo "Checking NSIS... OK"
+else
+ echo "Checking NSIS... IS NOT INSTALLED"
+ exit 1
+fi
+
+# build exe
+makensis $1
+
+# sign if defined
+if [ "$SIGNTOOL_PATH" != "" ] && [ -f "$SIGNTOOL_PATH" ]
+then
+ if [ "$SIGNFILE_PATH" != "" ] && [ -f "$SIGNFILE_PATH" ]
+ then
+ if [ "$SIGNPASSWORD" != "" ]
+ then
+ "$SIGNTOOL_PATH" "sign" "//f" "$SIGNFILE_PATH" "//p" "${SIGNPASSWORD}" "$SRCDIR/build/inst-manager.exe"
+ else
+ echo "Skip signing... Signing password is not defined!"
+ fi
+ else
+ echo "Skip signing... Signing file does not exist!"
+ fi
+else
+ echo "Skip signing... Signing tool does not exist!"
+fi
-*2.2.82\r
-- Modified repository packages log code.\r
-- Add pre-requisites for UI builder.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-03-10\r
-*2.2.81\r
-- Installmanager can only download packages.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-02-17\r
-*2.2.80\r
-- Installmanager can only download packages.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-17\r
-*2.2.79\r
-- In test case, download retry count is 200 times.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-17\r
-*2.2.78\r
-- Installmanager can support test automation more effective than before.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-16\r
-*2.2.77\r
-- Fix bug that installmanager cannot display download progress bar.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-16\r
-*2.2.76\r
-- Installmanager uses more network connection and read time for test.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-16\r
-*2.2.75\r
-- Fix bug that installmanager cannot get installed SDK.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-16\r
-*2.2.74\r
-- Fix bug that installmanager cannot calculate download time.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2014-01-15\r
-*2.2.73\r
-- remove a signing process because of wrong sfx file.\r
-== Shihyun Kim <shihyun.kim@samsung.com> 2013-12-26\r
-*2.2.72\r
-- Add the installmanager file name for self updating\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-12-10\r
-*2.2.71\r
-- Fixed a bug on checking ubuntu os name.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-11-13\r
-*2.2.70\r
-- InstallManager get added options and can be executed itself for upgrading.\r
-- Fix bug that installmanager could not check pre-requsites by /etc/lsb-release.\r
-- Jump to 2.2.70 for being same as tizen_2.2\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-24\r
-*2.2.65\r
-- InstallManager can check bit difference between OS and InstallManager On Ubuntu.\r
-- InstallManager can get system information from lsb-release if os-release does not exist.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-24\r
-*2.2.63\r
-- Modify error message when cannot find repository.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-24\r
-*2.2.62\r
-- Modify unzip option on Ubuntu.(unzip -ao -> unzip -o)\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-22\r
-*2.2.61\r
-- Fix bug that installmanager cannot use both -x(proxy) options and -test option with cli installation.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-15\r
-*2.2.60\r
-- Fix bug that 'tizen-sdk-data' is wrong position under local app.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-15\r
-*2.2.59\r
-- Add remove test result.\r
-== Shihyun Kim <shihyun.kim@samsung.com> 2013-10-15\r
-*2.2.58\r
-- modify result test file name.\r
-== Shihyun Kim <shihyun.kim@samsung.com> 2013-10-14\r
-*2.2.57\r
-- Fix bug that 'tizen-sdk-data' is wrong position under local app.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-14\r
-*2.2.56\r
-- Modify license agreement.\r
-- Fix that installmanager(windows 32bit) has virus threats.\r
-- Modify if-condition when check packages in server.\r
-- When removing SDK, installmanager can make performance result file with xml.\r
-- Kill all running SDK processes before SDK uninstalling with CLI.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-10\r
-*2.2.55\r
-- InstallManager can work well cli mode with SDK image.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-09-13\r
-*2.2.54\r
-- Add flush() method in log class.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-09-13\r
-*2.2.53\r
-- Add '-accept_license' option for cli installing.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-09-05\r
-*2.2.52\r
-- Add test result file by xml format.\r
-== Shihyun Kim <shihyun.kim@samsung.com> 2013-09-03\r
-*2.2.51\r
-- remove a dialog shows java home for windows 32bit\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-30\r
-*2.2.50\r
-- InstallManager can install extra packages after SDK image installation.\r
-- InstallManager can manage invalid package version and version not found.\r
-- InstallManager show warning dialog when invaild package version and version not found.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-30\r
-*2.2.49\r
-- Modify check routine of java version and java execution on cmd command for Windows\r
-- Removed javacheck.exe file.\r
-- Windows installmanager is not known fault as virus anymore.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-23\r
-*2.2.48\r
-- Add pre-requisites on Ubuntu.(libpixman-1-0, libpng12-0, libpython2.7)\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-21\r
-*2.2.47\r
-- Change file path which is installmanager performance test result file path from applocal/tizen-sdk-data to c:\tizen-sdk-data by default on Windows.\r
-- Add meta packages to install.\r
-- fixed checkbox status in checkboxTreeViewer\r
-- Fix wrong test result path when cli installation on Ubuntu.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-12\r
-*2.2.46\r
-- InstallManager display test packages on tree optionally.\r
-- tizen-install-manager-test package's attribute changed to test.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-05\r
-*2.2.45\r
-- Fix bug that '-test' option for installmanager performance test does not work with '-ni' option.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-05\r
-*2.2.44\r
-- -skip option works well when use -p all option.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-02\r
-*2.2.38\r
-- Add test package for installmanager performance testing.\r
-*2.2.34\r
-- Add -test option for installmanager performance testing.\r
-- Add test package for installmanager.\r
-- Installmanager does not display useless cmd console when cli installation.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-26\r
-*2.2.33\r
-- CLI installation works well on macos non-gui environment.\r
-- CLI installation works well on Ubuntu.\r
-- When installmanager works by cli mode, it does not pop up cmd console window.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-24\r
-*2.2.32\r
-- Modify license\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-19\r
-*2.2.31\r
-- progressbar works well more than before.\r
-- Add performance information.\r
-- -skip options is added.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-19\r
-*2.2.30\r
-- Fix bug of downloading UX\r
-- InstallManager can manage that script return value is 2.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-16\r
-*2.2.29\r
-- Modify tsudo.sh script for working well.\r
-- InstallManager works well by cli mode.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-12\r
-*2.2.28\r
-- Modify tsudo.sh script for working well.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-11\r
-*2.2.27\r
-- Modify InstallManager-64.nsi script because of useless character\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-10\r
-*2.2.26\r
-- Add libpng package to pre-requisites for ubuntu and fedora.\r
-- Progress bar works better than before.\r
-- When installmanager makes temporary directory for installation on windows, it can get current time correctly.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-10\r
-*2.2.25\r
-- InstallManager can support 'tsudo' command as ${TSUDO} for install and remove script of package.\r
-- InstallManager can support non-interactive cli mode.\r
-- Modify wrong character in install script of installmanager.\r
-- InstallManager works well by cli mode.\r
-- change the directory location to download packages.(to target directory/.info/download)\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-09\r
-*2.2.23\r
-- InstallManager can support 'tsudo' command as ${TSUDO} for install and remove script of package.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-08\r
-*2.2.21\r
-- InstallManager can show remove target directory dialog end of uninstallation.\r
-- Fix bug that installmanager cannot update SDK.\r
-- InstallManager can support SDK_DATA_PATH environment variable when SDK updates.\r
-- InstallManager can check that input paths are duplicated and has wrong pattern both SDK install path and SDK data path same time.\r
-- Error message more detail than before in set install path page.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-04\r
-*2.2.20\r
-- When installmanager cancels to download packages, remove the target directory.\r
-- Add libgnome to prerequistes\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-04\r
-*2.2.19\r
-- For 2.2 beta. InstallManage heads for http://download.tizen.org/sdk/packages/\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-04\r
-*2.2.18\r
-- For 2.2 beta. InstallManage heads for http://download.tizen.org/sdk/packages-2.2b/\r
-== Shihyun Kim <shihyun.kim@samsung.com> 2013-06-29\r
-*2.2.17\r
-- Added the environment variable "USER_DATA_PATH". \r
-== Shihyun Kim <shihyun.kim@samsung.com> 2013-06-29\r
-*2.2.14\r
-- InstallManager make tizensdkpath file in also sdk data path.\r
-== Yongsung Kim <yongsung1.kim@samsung.com> 2013-06-28\r
-*2.2.13\r
-- Fixed a bug that installmanager does not work on Windows XP\r
-== DongHee Yang <donghee.yang@samsung.net> 2013-06-26\r
-*2.2.12\r
-- Fixed a bug that there is a space at the end of installed path string\r
-== DongHee Yang <donghee.yang@samsung.net> 2013-06-25\r
-*2.2.11\r
-- Fixed a bug that updating SDK faile with old install of shortcut\r
-== DongHee Yang <donghee.yang@samsung.net> 2013-06-24\r
-*2.2.5\r
-- InstallManager install script cannot work properly. so, modified the script.\r
-== Yongsung Kim <yongsung1.kim@samsung.net> 2013-06-22\r
-*2.2.4\r
-- InstallManager does not display component which does not have children.\r
-== Yongsung Kim <yongsung1.kim@samsung.net> 2013-06-21\r
-*2.2.3\r
-- Bug fix : InstallManager cannot create SDK data path.\r
-== Yongsung Kim <yongsung1.kim@samsung.net> 2013-06-21\r
-*2.1.15\r
-- Version up for test\r
-== DongHee Yang <donghee.yang@samsung.net> 2013-06-11\r
-*2.1.10\r
-- Applied DIBS build\r
-== DongHee Yang <donghee.yang@samsung.net> 2013-06-11\r
-*2.0.13\r
-- Search sdk process that can not kill and show the message "Cannot kill the process" in complete page.\r
-- If platform is linux, recommand to restart the computer.\r
-- Add '-direct' option. Do not use system proxy.\r
-- add MacOS InstallManager for partner\r
-== Shihyun Kim <shihyun.kim@samsung.net> 2012-11-09\r
+*2.2.65
+- InstallManager can check bit difference between OS and InstallManager On Ubuntu.
+- InstallManager can get system information from lsb-release if os-release does not exist.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-24
+*2.2.63
+- Modify error message when cannot find repository.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-24
+*2.2.62
+- Modify unzip option on Ubuntu.(unzip -ao -> unzip -o)
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-22
+*2.2.61
+- Fix bug that installmanager cannot use both -x(proxy) options and -test option with cli installation.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-15
+*2.2.60
+- Fix bug that 'tizen-sdk-data' is wrong position under local app.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-15
+*2.2.59
+- Add remove test result.
+== Shihyun Kim <shihyun.kim@samsung.com> 2013-10-15
+*2.2.58
+- modify result test file name.
+== Shihyun Kim <shihyun.kim@samsung.com> 2013-10-14
+*2.2.57
+- Fix bug that 'tizen-sdk-data' is wrong position under local app.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-14
+*2.2.56
+- Modify license agreement.
+- Fix that installmanager(windows 32bit) has virus threats.
+- Modify if-condition when check packages in server.
+- When removing SDK, installmanager can make performance result file with xml.
+- Kill all running SDK processes before SDK uninstalling with CLI.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-10-10
+*2.2.55
+- InstallManager can work well cli mode with SDK image.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-09-13
+*2.2.54
+- Add flush() method in log class.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-09-13
+*2.2.53
+- Add '-accept_license' option for cli installing.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-09-05
+*2.2.52
+- Add test result file by xml format.
+== Shihyun Kim <shihyun.kim@samsung.com> 2013-09-03
+*2.2.51
+- remove a dialog shows java home for windows 32bit
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-30
+*2.2.50
+- InstallManager can install extra packages after SDK image installation.
+- InstallManager can manage invalid package version and version not found.
+- InstallManager show warning dialog when invaild package version and version not found.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-30
+*2.2.49
+- Modify check routine of java version and java execution on cmd command for Windows
+- Removed javacheck.exe file.
+- Windows installmanager is not known fault as virus anymore.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-23
+*2.2.48
+- Add pre-requisites on Ubuntu.(libpixman-1-0, libpng12-0, libpython2.7)
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-21
+*2.2.47
+- Change file path which is installmanager performance test result file path from applocal/tizen-sdk-data to c:\tizen-sdk-data by default on Windows.
+- Add meta packages to install.
+- fixed checkbox status in checkboxTreeViewer
+- Fix wrong test result path when cli installation on Ubuntu.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-12
+*2.2.46
+- InstallManager display test packages on tree optionally.
+- tizen-install-manager-test package's attribute changed to test.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-05
+*2.2.45
+- Fix bug that '-test' option for installmanager performance test does not work with '-ni' option.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-05
+*2.2.44
+- -skip option works well when use -p all option.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-08-02
+*2.2.38
+- Add test package for installmanager performance testing.
+*2.2.34
+- Add -test option for installmanager performance testing.
+- Add test package for installmanager.
+- Installmanager does not display useless cmd console when cli installation.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-26
+*2.2.33
+- CLI installation works well on macos non-gui environment.
+- CLI installation works well on Ubuntu.
+- When installmanager works by cli mode, it does not pop up cmd console window.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-24
+*2.2.32
+- Modify license
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-19
+*2.2.31
+- progressbar works well more than before.
+- Add performance information.
+- -skip options is added.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-19
+*2.2.30
+- Fix bug of downloading UX
+- InstallManager can manage that script return value is 2.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-16
+*2.2.29
+- Modify tsudo.sh script for working well.
+- InstallManager works well by cli mode.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-12
+*2.2.28
+- Modify tsudo.sh script for working well.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-11
+*2.2.27
+- Modify InstallManager-64.nsi script because of useless character
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-10
+*2.2.26
+- Add libpng package to pre-requisites for ubuntu and fedora.
+- Progress bar works better than before.
+- When installmanager makes temporary directory for installation on windows, it can get current time correctly.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-10
+*2.2.25
+- InstallManager can support 'tsudo' command as ${TSUDO} for install and remove script of package.
+- InstallManager can support non-interactive cli mode.
+- Modify wrong character in install script of installmanager.
+- InstallManager works well by cli mode.
+- change the directory location to download packages.(to target directory/.info/download)
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-09
+*2.2.23
+- InstallManager can support 'tsudo' command as ${TSUDO} for install and remove script of package.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-08
+*2.2.21
+- InstallManager can show remove target directory dialog end of uninstallation.
+- Fix bug that installmanager cannot update SDK.
+- InstallManager can support SDK_DATA_PATH environment variable when SDK updates.
+- InstallManager can check that input paths are duplicated and has wrong pattern both SDK install path and SDK data path same time.
+- Error message more detail than before in set install path page.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-04
+*2.2.20
+- When installmanager cancels to download packages, remove the target directory.
+- Add libgnome to prerequistes
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-04
+*2.2.19
+- For 2.2 beta. InstallManage heads for http://download.tizen.org/sdk/packages/
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-07-04
+*2.2.18
+- For 2.2 beta. InstallManage heads for http://download.tizen.org/sdk/packages-2.2b/
+== Shihyun Kim <shihyun.kim@samsung.com> 2013-06-29
+*2.2.17
+- Added the environment variable "USER_DATA_PATH".
+== Shihyun Kim <shihyun.kim@samsung.com> 2013-06-29
+*2.2.14
+- InstallManager make tizensdkpath file in also sdk data path.
+== Yongsung Kim <yongsung1.kim@samsung.com> 2013-06-28
+*2.2.13
+- Fixed a bug that installmanager does not work on Windows XP
+== DongHee Yang <donghee.yang@samsung.net> 2013-06-26
+*2.2.12
+- Fixed a bug that there is a space at the end of installed path string
+== DongHee Yang <donghee.yang@samsung.net> 2013-06-25
+*2.2.11
+- Fixed a bug that updating SDK faile with old install of shortcut
+== DongHee Yang <donghee.yang@samsung.net> 2013-06-24
+*2.2.5
+- InstallManager install script cannot work properly. so, modified the script.
+== Yongsung Kim <yongsung1.kim@samsung.net> 2013-06-22
+*2.2.4
+- InstallManager does not display component which does not have children.
+== Yongsung Kim <yongsung1.kim@samsung.net> 2013-06-21
+*2.2.3
+- Bug fix : InstallManager cannot create SDK data path.
+== Yongsung Kim <yongsung1.kim@samsung.net> 2013-06-21
+*2.1.15
+- Version up for test
+== DongHee Yang <donghee.yang@samsung.net> 2013-06-11
+*2.1.10
+- Applied DIBS build
+== DongHee Yang <donghee.yang@samsung.net> 2013-06-11
+*2.0.13
+- Search sdk process that can not kill and show the message "Cannot kill the process" in complete page.
+- If platform is linux, recommand to restart the computer.
+- Add '-direct' option. Do not use system proxy.
+- add MacOS InstallManager for partner
+== Shihyun Kim <shihyun.kim@samsung.net> 2012-11-09
-Source: install-manager\r
-Version: 2.2.82\r
-Maintainer: Shihyun Kim<shihyun.kim@samsung.com>, Yongsung Kim<yongsung1.kim@samsung.com>\r
-\r
-Package: install-manager\r
-OS: ubuntu-32\r
-Build-host-os: ubuntu-32\r
-Description: InstallManager\r
-\r
-Package: install-manager\r
-OS: ubuntu-64\r
-Build-host-os: ubuntu-64\r
-Description: InstallManager\r
-\r
-Package: install-manager\r
-OS: windows-32\r
-Build-host-os: windows-32\r
-Description: InstallManager\r
-\r
-Package: install-manager\r
-OS: windows-64\r
-Build-host-os: windows-32\r
-Description: InstallManager\r
-\r
-Package: install-manager\r
-OS: macos-64\r
-Build-host-os: macos-64\r
-Description: InstallManager\r
-\r
-Package: install-manager-standalone\r
-OS: ubuntu-32\r
-Build-host-os: ubuntu-32\r
-Description: Standalone Install Manager Executable(s)\r
-\r
-Package: install-manager-standalone\r
-OS: ubuntu-64\r
-Build-host-os: ubuntu-64\r
-Description: Standalone Install Manager Executable(s)\r
-\r
-Package: install-manager-standalone\r
-OS: windows-32\r
-Build-host-os: windows-32\r
-Description: Standalone Install Manager Executable(s)\r
-\r
-Package: install-manager-standalone\r
-OS: windows-64\r
-Build-host-os: windows-32\r
-Description: Standalone Install Manager Executable(s)\r
-\r
-Package: install-manager-standalone\r
-OS: macos-64\r
-Build-host-os: macos-64\r
-Description: Standalone Install Manager Executable(s)\r
-\r
-Package: install-manager-test\r
-OS: ubuntu-32\r
-Build-host-os: ubuntu-32\r
-Description: Test for install-manager\r
-\r
-Package: install-manager-test\r
-OS: ubuntu-64\r
-Build-host-os: ubuntu-64\r
-Description: Test for install-manager\r
-\r
-Package: install-manager-test\r
-OS: windows-32\r
-Build-host-os: windows-32\r
-Description: Test for install-manager\r
-\r
-Package: install-manager-test\r
-OS: windows-64\r
-Build-host-os: windows-32\r
-Description: Test for install-manager\r
-\r
-Package: install-manager-test\r
-OS: macos-64\r
-Build-host-os: macos-64\r
-Description: Test for install-manager\r
-\r
-Package: tizen-install-manager-test\r
-Label: Installmanager Test\r
-Attribute: test\r
-OS: ubuntu-32\r
-Build-host-os: ubuntu-32\r
-Install-dependency: install-manager-test\r
-Description: Test for install-manager\r
-\r
-Package: tizen-install-manager-test\r
-Label: Installmanager Test\r
-Attribute: test\r
-OS: ubuntu-64\r
-Build-host-os: ubuntu-64\r
-Install-dependency: install-manager-test\r
-Description: Test for install-manager\r
-\r
-Package: tizen-install-manager-test\r
-Label: Installmanager Test\r
-Attribute: test\r
-OS: windows-32\r
-Build-host-os: windows-32\r
-Install-dependency: install-manager-test\r
-Description: Test for install-manager\r
-\r
-Package: tizen-install-manager-test\r
-Label: Installmanager Test\r
-Attribute: test\r
-OS: windows-64\r
-Build-host-os: windows-32\r
-Install-dependency: install-manager-test\r
-Description: Test for install-manager\r
-\r
-Package: tizen-install-manager-test\r
-Label: Installmanager Test\r
-Attribute: test\r
-OS: macos-64\r
-Build-host-os: macos-64\r
-Install-dependency: install-manager-test\r
-Description: Test for install-manager\r
+Source: install-manager
+Version: 2.2.65
+Maintainer: Shihyun Kim<shihyun.kim@samsung.com>, Yongsung Kim<yongsung1.kim@samsung.com>
+
+Package: install-manager
+OS: ubuntu-32
+Build-host-os: ubuntu-32
+Description: InstallManager
+
+Package: install-manager
+OS: ubuntu-64
+Build-host-os: ubuntu-64
+Description: InstallManager
+
+Package: install-manager
+OS: windows-32
+Build-host-os: windows-32
+Description: InstallManager
+
+Package: install-manager
+OS: windows-64
+Build-host-os: windows-32
+Description: InstallManager
+
+Package: install-manager
+OS: macos-64
+Build-host-os: macos-64
+Description: InstallManager
+
+Package: install-manager-standalone
+OS: ubuntu-32
+Build-host-os: ubuntu-32
+Description: Standalone Install Manager Executable(s)
+
+Package: install-manager-standalone
+OS: ubuntu-64
+Build-host-os: ubuntu-64
+Description: Standalone Install Manager Executable(s)
+
+Package: install-manager-standalone
+OS: windows-32
+Build-host-os: windows-32
+Description: Standalone Install Manager Executable(s)
+
+Package: install-manager-standalone
+OS: windows-64
+Build-host-os: windows-32
+Description: Standalone Install Manager Executable(s)
+
+Package: install-manager-standalone
+OS: macos-64
+Build-host-os: macos-64
+Description: Standalone Install Manager Executable(s)
+
+Package: install-manager-test
+OS: ubuntu-32
+Build-host-os: ubuntu-32
+Description: Test for install-manager
+
+Package: install-manager-test
+OS: ubuntu-64
+Build-host-os: ubuntu-64
+Description: Test for install-manager
+
+Package: install-manager-test
+OS: windows-32
+Build-host-os: windows-32
+Description: Test for install-manager
+
+Package: install-manager-test
+OS: windows-64
+Build-host-os: windows-32
+Description: Test for install-manager
+
+Package: install-manager-test
+OS: macos-64
+Build-host-os: macos-64
+Description: Test for install-manager
+
+Package: tizen-install-manager-test
+Label: Installmanager Test
+Attribute: test
+OS: ubuntu-32
+Build-host-os: ubuntu-32
+Install-dependency: install-manager-test
+Description: Test for install-manager
+
+Package: tizen-install-manager-test
+Label: Installmanager Test
+Attribute: test
+OS: ubuntu-64
+Build-host-os: ubuntu-64
+Install-dependency: install-manager-test
+Description: Test for install-manager
+
+Package: tizen-install-manager-test
+Label: Installmanager Test
+Attribute: test
+OS: windows-32
+Build-host-os: windows-32
+Install-dependency: install-manager-test
+Description: Test for install-manager
+
+Package: tizen-install-manager-test
+Label: Installmanager Test
+Attribute: test
+OS: windows-64
+Build-host-os: windows-32
+Install-dependency: install-manager-test
+Description: Test for install-manager
+
+Package: tizen-install-manager-test
+Label: Installmanager Test
+Attribute: test
+OS: macos-64
+Build-host-os: macos-64
+Install-dependency: install-manager-test
+Description: Test for install-manager