[Esbox-commits] r1855 - in branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard: . nokiabin

eswartz at garage.maemo.org eswartz at garage.maemo.org
Wed Jul 8 23:34:10 EEST 2009


Author: eswartz
Date: 2009-07-08 23:34:09 +0300 (Wed, 08 Jul 2009)
New Revision: 1855

Removed:
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesPackageInstaller.java
Modified:
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/NewScratchbox1SDKWizard.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerEngine.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerEngine.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/DiabloInstallerScriptWorkPage.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/FremantleWorkPage.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesInstallerEngine.java
Log:
Work to make the package manager wizards and operations more centralized.  Reudce a lot of duplication and add useful utilities for common operations.

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/NewScratchbox1SDKWizard.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/NewScratchbox1SDKWizard.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/NewScratchbox1SDKWizard.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -223,7 +223,7 @@
 					
 					IStatus status = engine.installScratchbox(monitor);
 					
-					if (status.matches(IStatus.CANCEL))
+					if (status.matches(IStatus.CANCEL) || monitor.isCanceled())
 						status = Activator.createErrorStatus("The installation was canceled.", null);
 					statuses[0] = status;
 				}

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerEngine.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerEngine.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerEngine.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -13,10 +13,7 @@
 package org.maemo.esbox.internal.scratchbox.sb1.ui.wizard;
 
 import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -45,10 +42,13 @@
 import org.maemo.mica.common.core.ui.IProgressReporter;
 import org.maemo.mica.common.core.ui.ProgressReporterStreamTextMonitor;
 import org.maemo.mica.internal.api.common.core.sdk.SDKManagerInternal;
-import org.maemo.mica.internal.api.linux.packages.core.*;
+import org.maemo.mica.internal.api.linux.packages.core.ISystemPackage;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.AptInstallerEngine;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.IAptInstallerWorkList;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManager;
 import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManagerRegistry;
 import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptPackageManager;
-import org.maemo.mica.internal.api.linux.packages.ui.aptinstall.MachinePackageInstaller;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptRepository;
 
 /**
  * This engine runs the Scratchbox installer script,
@@ -203,28 +203,55 @@
 	private IStatus safeInstallWithPkgManager(IProgressMonitor monitor) {
 		
 		IStatus status = null;
-		
-		reporter.logInfo("Installing " + installerData.getName());
-		
-		Set<String> pkgs = new HashSet<String>();
-		pkgs.addAll(Arrays.asList(installerData.getRequiredPackages()));
-		
-		String[] repositoriesToAdd = new String[]{installerData.getRepositoryURL()};
 		//FIXME should add an Field on WizardWorkPage
 		int timeout= 30;
-		boolean forceUpgrade = false;
-		boolean forceInstall = true;
 		
-		MachinePackageInstaller pkgInstaller = new MachinePackageInstaller(
-				pkgs, repositoriesToAdd, machine, true, forceUpgrade, forceInstall, timeout, reporter);
+		reporter.logInfo("Installing " + installerData.getName());
 		
-		status = pkgInstaller.ensureInstalledPackages(shell, monitor);
-		
+		try {
+			IAptInstallerWorkList workList = gatherWork();
+			
+			AptInstallerEngine engine = new AptInstallerEngine(
+					shell, reporter, workList);
+			engine.state().setNetworkTimeout(timeout);
+			
+			status = engine.run(monitor);
+		} catch (MicaException e) {
+			status = Activator.createErrorStatus("Unexpected error:", e);
+			reporter.log(status);
+		}
+
 		monitor.done();
 		
 		return status;
 	}
 
+	/**
+	 * Gather the work needed for the package operations
+	 * @return
+	 */
+	private IAptInstallerWorkList gatherWork() throws MicaException {
+		IAptPackageManager manager = AptPackageManagerRegistry.getInstance().
+			getPackageManagerFor(machine);
+		if (manager == null) {
+			throw new MicaException(machine + " does not support apt");
+		}
+	
+		String repositoryURL = installerData.getRepositoryURL();
+		IAptRepository repository = AptPackageManager.createRepositoryFromString(manager, 
+				null, repositoryURL); 
+				
+		if (repository == null) {
+			throw new MicaException("Cannot create repository from: " + repositoryURL);
+		}
+		
+		IAptInstallerWorkList workList = AptInstallerEngine.newWorkList();
+		
+		workList.queueInstallUnknownPackages(manager, installerData.getRequiredPackages());
+
+		return workList;
+	}
+
 	private IStatus safeInstallScratchbox(IProgressMonitor monitor) {
 		MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0, null, null);
 		

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerEngine.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerEngine.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerEngine.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -17,7 +17,6 @@
 import java.util.List;
 import java.util.regex.Pattern;
 
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -39,9 +38,10 @@
 import org.maemo.mica.common.core.ui.IProgressReporter;
 import org.maemo.mica.internal.api.common.core.sdk.SDKManagerInternal;
 import org.maemo.mica.internal.api.linux.packages.core.ISystemPackage;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.AptInstallerEngine;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.IAptInstallerWorkList;
 import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManagerRegistry;
 import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptPackageManager;
-import org.maemo.mica.internal.api.linux.packages.ui.aptinstall.MachinePackageInstaller;
 
 /**
  * This engine runs the SDK installer script in non-interactive mode,
@@ -197,12 +197,12 @@
 	 */
 	private void checkRequiredDevkitsAndCompilers(MultiStatus multiStatus, IProgressMonitor monitor) {
 		IStatus status;
-		if(!installerData.isInstallRequiredCompilers() || !installerData.isInstallRequiredDevkits())
+		if(!installerData.isInstallRequiredCompilers() && !installerData.isInstallRequiredDevkits())
 			return;
 		
-		monitor.beginTask("", 3);
-		monitor.subTask("Looking for required scratchbox compilers and devkits...");
-		reporter.logInfo("Looking for required scratchbox compilers and devkits");
+		monitor.beginTask("", 20);
+		monitor.subTask("Looking for required Scratchbox compilers and devkits...");
+		reporter.logInfo("Looking for required Scratchbox compilers and devkits");
 		
 		IScratchbox1SDK sdk = installerData.getScratchbox1SDK();
 		
@@ -229,7 +229,7 @@
 		
 		if (manager == null){
 			status = Activator.createStatus(IStatus.ERROR,
-					"Could not found package manager.");
+					"Could not find package manager.");
 			reporter.log(status);
 			multiStatus.add(status);
 			return;
@@ -237,6 +237,7 @@
 		
 		ISystemPackage[] sboxPackages = null;
 		try {
+			reporter.logInfo("Finding Scratchbox packages available on " + machine.getName());
 			sboxPackages = manager.searchSystemPackages(
 					Pattern.compile("scratchbox-(core|libs|devkit-.*|toolchain-.*)"), 
 					new SubProgressMonitor(monitor, 1));
@@ -255,74 +256,80 @@
 			return;
 		}
 		
+		IAptInstallerWorkList workList = AptInstallerEngine.newWorkList();
 		
-		try {
-			if(installerData.isInstallRequiredDevkits()){
-				reporter.logInfo("Checking required devkits for " + installerData.getName());
-				List<ISystemPackage> toInstall = new ArrayList<ISystemPackage>();
-				List<String> uninstallable = new ArrayList<String>();
-				for(String devkit : missingDevkits){
-					boolean unknown = true;//unknown package? 		
-					String name = inferPkgNameFromDevkit(devkit);
-					for(ISystemPackage pkg : sboxPackages){
-						if(pkg.getName().matches(name)){
-							unknown = false;
-							toInstall.add(pkg);
-						}
+		if (installerData.isInstallRequiredDevkits()){
+			reporter.logInfo("Checking required devkits for " + installerData.getName());
+			List<ISystemPackage> toInstall = new ArrayList<ISystemPackage>();
+			List<String> uninstallable = new ArrayList<String>();
+			for (String devkit : missingDevkits){
+				boolean unknown = true;//unknown package? 		
+				String name = inferPkgNameFromDevkit(devkit);
+				for (ISystemPackage pkg : sboxPackages){
+					if(pkg.getName().matches(name)){
+						unknown = false;
+						toInstall.add(pkg);
 					}
-					if(unknown)
-						uninstallable.add(devkit);
 				}
-				
-				
-				if (uninstallable.size() > 0) {
-					 status = Activator.createStatus(IStatus.ERROR,
-							"Could not find required packages for devkits: "  + uninstallable 
-							+ " you should add the repository to sources.list before using this installer, manually install them, or upgrade Scratchbox first.");
-					reporter.log(status);
-					multiStatus.add(status);
-					return;
-				}
-				
-				MachinePackageInstaller.installPackages(toInstall, true, shell, reporter, monitor);
+				if (unknown)
+					uninstallable.add(devkit);
 			}
 			
-			monitor.worked(2);
+			if (uninstallable.size() > 0) {
+				 status = Activator.createStatus(IStatus.ERROR,
+						"Could not find required packages for devkits: "  + uninstallable 
+						+ " you should add the repository to sources.list before using this installer, manually install them, or upgrade Scratchbox first.");
+				reporter.log(status);
+				multiStatus.add(status);
+				return;
+			}
+
+			workList.queueInstallPackages((ISystemPackage[]) toInstall.toArray(new ISystemPackage[toInstall.size()]));
 			
-			if(installerData.isInstallRequiredCompilers()){
-				reporter.logInfo("Checking required compilers for " + installerData.getName());
-				List<ISystemPackage> toInstall = new ArrayList<ISystemPackage>();
-				List<String> uninstallable = new ArrayList<String>();
-				for(String compiler : missingCompilers){
-					boolean unknown = true;//unknown package? 		
-					String name = inferPkgNameFromCompiler(compiler);
-					for(ISystemPackage pkg : sboxPackages){
-						if(pkg.getName().matches(name)){
-							unknown = false;
-							toInstall.add(pkg);
-						}
+		}
+		
+		monitor.worked(2);
+		
+		if(installerData.isInstallRequiredCompilers()){
+			reporter.logInfo("Checking required compilers for " + installerData.getName());
+			List<ISystemPackage> toInstall = new ArrayList<ISystemPackage>();
+			List<String> uninstallable = new ArrayList<String>();
+			for(String compiler : missingCompilers){
+				boolean unknown = true;//unknown package? 		
+				String name = inferPkgNameFromCompiler(compiler);
+				for(ISystemPackage pkg : sboxPackages){
+					if(pkg.getName().matches(name)){
+						unknown = false;
+						toInstall.add(pkg);
 					}
-					if(unknown)
-						uninstallable.add(compiler);
 				}
-				
-				
-				if (uninstallable.size() > 0) {
-					 status = Activator.createStatus(IStatus.ERROR,
-							"Could not find required packages for compilers: "  + uninstallable 
-						+ " you should add the repository to sources.list before using this installer, manually install them, or upgrade Scratchbox first.");
-					reporter.log(status);
-					multiStatus.add(status);
-					return;
-				}
-				
-				MachinePackageInstaller.installPackages(toInstall, true, shell, reporter, monitor);
+				if(unknown)
+					uninstallable.add(compiler);
 			}
-			monitor.worked(3);
 			
-		} catch (CoreException e) {
-			multiStatus.add(e.getStatus());
+			
+			if (uninstallable.size() > 0) {
+				 status = Activator.createStatus(IStatus.ERROR,
+						"Could not find required packages for compilers: "  + uninstallable 
+					+ " you should add the repository to sources.list before using this installer, manually install them, or upgrade Scratchbox first.");
+				reporter.log(status);
+				multiStatus.add(status);
+				return;
+			}
+			
+			workList.queueInstallPackages((ISystemPackage[]) toInstall.toArray(new ISystemPackage[toInstall.size()]));
 		}
+		monitor.worked(3);
+		
+		// do the work
+		AptInstallerEngine engine = new AptInstallerEngine(shell, reporter, workList);
+		engine.state().setNetworkTimeout(30);
+		
+		status = engine.run(new SubProgressMonitor(monitor, 17));
+		
+		if (!status.isOK())
+			multiStatus.add(status);
+		
 	}
 
 	/**
@@ -333,7 +340,7 @@
 	private String inferPkgNameFromDevkit(String devkit) {
 		String prefix = "scratchbox-devkit-";
 		//XXX HACK: to infer package names from devkit name 
-		if(devkit.matches("debian-*")){
+		if(devkit.matches("debian-.*")){
 			return prefix + "debian";
 		}
 		

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/DiabloInstallerScriptWorkPage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/DiabloInstallerScriptWorkPage.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/DiabloInstallerScriptWorkPage.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -41,7 +41,6 @@
 public class DiabloInstallerScriptWorkPage extends WizardWorkProgressPageBase {
 
 	private boolean forceUpgrade;
-	private boolean updateLists;
 	private TimeoutUI timeoutUI;
 	private DiabloInstallerScriptWorkPage workPage = this;
 	private NokiaBinariesInstallerData installerData;
@@ -51,7 +50,6 @@
 				"Install Nokia-closed binaries packages",
 				"This page shows the installation process.  Before finishing, configure the settings and verify your network preferences.");
 		forceUpgrade = true;
-		updateLists = true;
 		timeoutUI = new TimeoutUI();
 		timeoutUI.setTimeout(30);
 		try {
@@ -82,21 +80,6 @@
 	}
 
 	/**
-	 * @return the updateLists
-	 */
-	public boolean getUpdateLists() {
-		return updateLists;
-	}
-
-	/**
-	 * @param updateLists
-	 *            the updateLists to set
-	 */
-	public void setUpdateLists(boolean updateLists) {
-		this.updateLists = updateLists;
-	}
-
-	/**
 	 * @return the timeout in seconds
 	 */
 	public int getTimeout() {
@@ -203,7 +186,6 @@
 					monitor.subTask("Running installer...");
 					NokiaBinariesInstallerEngine installer = new NokiaBinariesInstallerEngine(
 							installerData, buildMachine, targets, workPage
-									.getUpdateLists(), workPage
 									.getForceUpgrade(), workPage.getTimeout(),
 							workPage.getProgressReporter());
 

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/FremantleWorkPage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/FremantleWorkPage.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/FremantleWorkPage.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -7,10 +7,14 @@
  *
  * Contributors:
  *    Fabrício S Epaminondas (UFCG)
- *    
+ *    Ed Swartz (Nokia)
  *******************************************************************************/
 package org.maemo.esbox.internal.scratchbox.sb1.ui.wizard.nokiabin;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Set;
+
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jface.layout.GridDataFactory;
@@ -19,25 +23,24 @@
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.maemo.esbox.internal.scratchbox.sb1.Activator;
+import org.maemo.mica.common.core.MicaException;
 import org.maemo.mica.common.core.Policy;
 import org.maemo.mica.common.core.sdk.ISDKTarget;
 import org.maemo.mica.common.ui.TimeoutUI;
 import org.maemo.mica.internal.api.common.ui.wizards.WizardWorkProgressPageBase;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.AptInstallerEngine;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.IAptInstallerWorkList;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManager;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManagerRegistry;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptPackageManager;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptRepository;
 
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-import java.util.Set;
-
 /**
- * 
- * FIXME this was repeated from {@link ProjectPackageInstallerWizardWorkPage}
- * 
  * @author Fabrício S Epaminondas (UFCG)
  * 
  */
 public class FremantleWorkPage extends WizardWorkProgressPageBase {
 	private boolean forceUpgrade;
-	private boolean updateLists;
 	private TimeoutUI timeoutUI;
 	private FremantleWorkPage workPage = this;
 
@@ -46,7 +49,6 @@
 				"Install Nokia-closed binaries packages",
 				"This page shows the installation process.  Before finishing, configure the settings and verify your network preferences.");
 		forceUpgrade = true;
-		updateLists = true;
 		timeoutUI = new TimeoutUI();
 		timeoutUI.setTimeout(30);
 		setWizard(wizard);
@@ -71,21 +73,6 @@
 	}
 
 	/**
-	 * @return the updateLists
-	 */
-	public boolean getUpdateLists() {
-		return updateLists;
-	}
-
-	/**
-	 * @param updateLists
-	 *            the updateLists to set
-	 */
-	public void setUpdateLists(boolean updateLists) {
-		this.updateLists = updateLists;
-	}
-
-	/**
 	 * @return the timeout in seconds
 	 */
 	public int getTimeout() {
@@ -161,7 +148,6 @@
 	 * @seeorg.maemo.esbox.internal.scratchbox.sb1.ui.wizard.nokiabin.
 	 * INokiaBinariesWizardDelegate#doWork()
 	 */
-	@SuppressWarnings("unchecked")
 	public IStatus doWork() {
 
 		final IStatus[] statuses = { Policy.getCancelStatus(Activator
@@ -170,29 +156,29 @@
 			getContainer().showPage(workPage);
 			workPage.showAndClearLog();
 
-			final List<ISDKTarget> targets = (List<ISDKTarget>) getWizard()
-					.getParameter("targets_selection");
-
 			getContainer().run(true, true, new IRunnableWithProgress() {
 
 				public void run(IProgressMonitor monitor)
 						throws InvocationTargetException, InterruptedException {
 
 					monitor.subTask("Running installer...");
-					NokiaBinariesPackageInstaller installer = new NokiaBinariesPackageInstaller(
-							targets, (Set<String>) getWizard().getParameter(
-									"packages"), getWizard().getParameter(
-									"repoURL").toString(), workPage
-									.getUpdateLists(), workPage
-									.getForceUpgrade(), workPage.getTimeout(),
-							workPage.getProgressReporter());
-
-					IStatus status = null;
-					installer.setInteractiveMode(false);
-					status = installer.ensureInstalledPackages(getShell(),
-							monitor);
-
-					if (status != null && status.matches(IStatus.CANCEL))
+					
+					IAptInstallerWorkList workList;
+					IStatus status;
+					try {
+						workList = gatherWork();
+						
+						AptInstallerEngine engine = new AptInstallerEngine(getShell(), 
+								workPage.getProgressReporter(), workList);
+						engine.state().setNetworkTimeout(workPage.getTimeout());
+						
+						status = engine.run(monitor);
+					} catch (MicaException e) {
+						status = Activator.createErrorStatus("Unexpected error:", e);
+						workPage.getProgressReporter().log(status);
+					}
+					
+					if (status.matches(IStatus.CANCEL) || monitor.isCanceled())
 						status = Activator.createErrorStatus(
 								"The installation was canceled.", null);
 
@@ -210,4 +196,46 @@
 		}
 		return statuses[0];
 	}
+
+	/**
+	 * Gather work needed to make package changes
+	 * @param string
+	 * @return new {@link IAptInstallerWorkList}
+	 * @throws MicaException for serious problem
+	 */
+	@SuppressWarnings("unchecked")
+	protected IAptInstallerWorkList gatherWork() throws MicaException {
+		IAptInstallerWorkList workList = AptInstallerEngine.newWorkList();
+		
+		final List<ISDKTarget> targets = (List<ISDKTarget>) getWizard()
+			.getParameter("targets_selection");
+		
+		Set<String> packages = (Set<String>) getWizard().getParameter("packages");
+		
+		for (ISDKTarget target : targets) {
+			IAptPackageManager manager = AptPackageManagerRegistry.getInstance().getPackageManagerFor(target);
+			if (manager == null) {
+				throw new MicaException(target + " does not support apt");
+			}
+
+			String repoURL = getWizard().getParameter("repoURL").toString();
+			
+			IAptRepository repository = AptPackageManager.createRepositoryFromString(
+					manager, null, repoURL);
+			if (repository == null) {
+				throw new MicaException("Cannot create repository from " + repoURL);
+			}
+			
+			workList.queueAddRepository(manager, repository);
+			
+			workList.queueInstallUnknownPackages(manager, 
+					(String[]) packages.toArray(new String[packages.size()]));
+			
+			if (forceUpgrade) {
+				workList.queueUpgradePackages(manager);
+			}
+		}
+		return workList;
+		
+	}
 }

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesInstallerEngine.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesInstallerEngine.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesInstallerEngine.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *    Fabrício S Epaminondas (UFCG)
- *    
+ *    Ed Swartz (Nokia)
  *******************************************************************************/
 package org.maemo.esbox.internal.scratchbox.sb1.ui.wizard.nokiabin;
 
@@ -22,6 +22,12 @@
 import org.maemo.mica.common.core.sdk.ISDKTarget;
 import org.maemo.mica.common.core.ui.IProgressReporter;
 import org.maemo.mica.internal.api.common.core.GeneralUtils;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.AptInstallerEngine;
+import org.maemo.mica.internal.api.linux.packages.core.aptinstall.IAptInstallerWorkList;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManager;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManagerRegistry;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptPackageManager;
+import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptRepository;
 
 import java.net.URL;
 import java.util.List;
@@ -34,7 +40,6 @@
 
 	private NokiaBinariesInstallerData installerData;
 	private List<ISDKTarget> targets;
-	private boolean updateLists;
 	private boolean forceUpgrade;
 	private int timeout;
 	private IProgressReporter reporter;
@@ -53,19 +58,18 @@
 	 * @param buildMachine 
 	 * @param targets
 	 * @param parameter
-	 * @param updateLists
 	 * @param forceUpgrade
 	 * @param timeout
 	 * @param reporter
 	 */
 	public NokiaBinariesInstallerEngine(
-			NokiaBinariesInstallerData installerData, IBuildMachine buildMachine,List<ISDKTarget> targets,
-			boolean updateLists, boolean forceUpgrade, int timeout,
+			NokiaBinariesInstallerData installerData, IBuildMachine buildMachine,
+			List<ISDKTarget> targets,
+			boolean forceUpgrade, int timeout,
 			IProgressReporter reporter) {
 		this.installerData = installerData;
 		this.buildMachine = buildMachine;
 		this.targets = targets;
-		this.updateLists = updateLists;
 		this.forceUpgrade = forceUpgrade;
 		this.timeout = timeout;
 		this.reporter = reporter;
@@ -127,34 +131,31 @@
 			}
 			
 			//Running package installer
-packinstall:if (exit != 0) {
+			if (exit != 0) {
 				multiStatus.add(Activator.createErrorStatus("Installation script failed with exit code " + exit, null));				
 			} else {
 				String repoURL = nokiaBinariesInstallerScriptMonitor.getRepositoryURL();
 				
 				reporter.logInfo("Nokia packages decompressed on: " + repoURL);
 				
-				reporter.logInfo("Installing nokia packages from local debian repository");
-				monitor.subTask("Installing nokia packages from local debian repository");
-				
-				
-				NokiaBinariesPackageInstaller installer = new NokiaBinariesPackageInstaller(
-						targets,
-						installerData.getPackages(),
-						repoURL,
-						updateLists,
-						forceUpgrade,
-						timeout,
-						reporter);
-				
-				if (monitor.isCanceled()) {
-					break packinstall;
+				reporter.logInfo("Installing Nokia packages from local Debian repository");
+				monitor.subTask("Installing Nokia packages from local Debian repository");
+
+				IAptInstallerWorkList workList;
+				try {
+					workList = gatherWork(repoURL);
+					
+					AptInstallerEngine engine = new AptInstallerEngine(shell, reporter, workList);
+					engine.state().setNetworkTimeout(timeout);
+					
+					status = engine.run(monitor);
+				} catch (MicaException e) {
+					status = Activator.createErrorStatus("Unexpected error:", e);
+					reporter.log(status);
 				}
 				
-				installer.setInteractiveMode(false);
-				status = installer.ensureInstalledPackages(shell, monitor);
-				multiStatus.add(status);
-
+				if (!status.isOK())
+					multiStatus.add(status);
 			}
 
 		} finally {
@@ -172,6 +173,38 @@
 
 	
 	/**
+	 * Construct the worklist for the apt operations
+	 * @param repoURL
+	 * @return new worklist
+	 * @throws MicaException if there are serious problems
+	 */
+	private IAptInstallerWorkList gatherWork(String repoURL) throws MicaException {
+		IAptInstallerWorkList workList = AptInstallerEngine.newWorkList();
+		for (ISDKTarget target : targets) {
+			IAptPackageManager manager = AptPackageManagerRegistry.getInstance().getPackageManagerFor(target);
+			if (manager == null) {
+				throw new MicaException("Unexpected error: " + target + " does not support apt");
+			}
+
+			IAptRepository repository = AptPackageManager.createRepositoryFromString(
+					manager, null, repoURL);
+			if (repository == null) {
+				throw new MicaException("Unexpected error: cannot create repository from " + repoURL);
+			}
+			
+			workList.queueAddRepository(manager, repository);
+			
+			workList.queueInstallUnknownPackages(manager, 
+					(String[]) installerData.getPackages().toArray(new String[installerData.getPackages().size()]));
+			
+			if (forceUpgrade) {
+				workList.queueUpgradePackages(manager);
+			}
+		}
+		return workList;
+	}
+
+	/**
 	 * @param multiStatus
 	 * @param monitor
 	 * @param installerURL

Deleted: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesPackageInstaller.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesPackageInstaller.java	2009-07-08 11:19:18 UTC (rev 1854)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/nokiabin/NokiaBinariesPackageInstaller.java	2009-07-08 20:34:09 UTC (rev 1855)
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Nokia Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Fabrício S Epaminondas (UFCG)
- *    
- *******************************************************************************/
-package org.maemo.esbox.internal.scratchbox.sb1.ui.wizard.nokiabin;
-
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.swt.widgets.Shell;
-import org.maemo.esbox.internal.scratchbox.sb1.Activator;
-import org.maemo.mica.common.core.sdk.*;
-import org.maemo.mica.common.core.ui.IProgressReporter;
-import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.AptPackageManagerRegistry;
-import org.maemo.mica.internal.api.linux.packages.core.aptpkgconfig.IAptPackageManager;
-import org.maemo.mica.internal.api.linux.packages.ui.aptinstall.MachinePackageInstaller;
-
-import java.text.MessageFormat;
-import java.util.*;
-
-
-/**
- * 
- * @author Fabrício S Epaminondas (UFCG) 
- *
- */
-public class NokiaBinariesPackageInstaller extends MachinePackageInstaller  {
-
-	private Queue<ISDKTarget> sdkTargetsQueue;
-	
-	/**
-	 * Create the installer engine.
-	 * @param sdkTargets the set of targets to scan and install packages
-	 * @param nokia meta-packages to install 
-	 * @param repoURL package repository URL
-	 * @param updateLists update package lists
-	 * @param forceUpgrade upgrade existing packages
-	 * @param timeout
-	 * @param reporter interface for reporting info, warning, and error messages
-	 * NOTE: the class still invokes UI for asking questions, unless JUnit is running,
-	 * in which case all questions are answered "yes". 
-	 */
-	public NokiaBinariesPackageInstaller(
-			List<ISDKTarget> sdkTargets,
-			Set<String> packages, String repoURL,
-			boolean updateLists, boolean forceUpgrade, 
-			int timeout,
-			IProgressReporter reporter) {
-		super(packages, new String[]{repoURL}, null, updateLists, forceUpgrade, true, timeout, reporter);
-		
-		if(sdkTargets ==null || sdkTargets.isEmpty())
-			throw new IllegalStateException("SDK target list must contains any sdk target");
-		
-		this.sdkTargetsQueue = new LinkedList<ISDKTarget>();
-		this.sdkTargetsQueue.addAll(sdkTargets);
-	}
-	
-	@Override
-	public IStatus ensureInstalledPackages(Shell shell, IProgressMonitor monitor) {
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-
-		monitor.beginTask("", sdkTargetsQueue.size());
-
-		MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0,
-				"Problems encountered while installing packages", null);
-		
-		while(!sdkTargetsQueue.isEmpty()){
-			ISDKTarget target = sdkTargetsQueue.peek(); 
-			setMachine(target.getMachine());
-			IStatus status = super.runPackageInstaller(shell, new SubProgressMonitor(monitor, 1));
-			sdkTargetsQueue.poll();
-			multiStatus.add(status);
-			if (monitor.isCanceled())
-				break;
-		}
-		monitor.done();
-
-		if (multiStatus.isOK() || multiStatus.matches(IStatus.INFO)) {
-			multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0, multiStatus
-					.getChildren(), "Installation was successful.", null);
-		}
-		return multiStatus;
-	}
-	
-	/**
-	 * Get the package managers for the currently SDK target in processing.
-	 * @return
-	 */
-	@Override
-	protected IAptPackageManager getPackageManager(IProgressMonitor monitor) {
-		monitor.beginTask("", 1);
-		ISDKTarget target = sdkTargetsQueue.peek();
-		SDKUtils.establishPlatform(target,
-				new SubProgressMonitor(monitor, 1));
-		if (monitor.isCanceled())
-			return null;
-
-		if (ISDKPlatform.NAME_UNKNOWN.equals(target.getPlatform().getName())) {
-			reporter
-					.log(Activator
-							.createErrorStatus(
-									MessageFormat
-											.format(
-													"Cannot determine the platform for {0}; excluding it from package operations",
-													target.getName()), null));
-			return null;
-		}
-
-		monitor.subTask("Scanning packages in " + target.getName() + "...");
-		reporter.logInfo("Scanning packages in " + target.getName());
-		IAptPackageManager manager = AptPackageManagerRegistry.getInstance()
-				.getPackageManagerFor(target);
-		if (monitor.isCanceled() || manager == null)
-			return null;
-
-		return manager;
-	}
-}



More information about the Esbox-commits mailing list