Ben Konrath 02a0b82
Index: src/org/eclipse/update/search/UpdateSearchRequest.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/search/UpdateSearchRequest.java,v
Ben Konrath 02a0b82
retrieving revision 1.27
Ben Konrath 02a0b82
diff -u -r1.27 UpdateSearchRequest.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.core/src/org/eclipse/update/search/UpdateSearchRequest.java	29 Mar 2006 23:37:07 -0000	1.27
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.core/src/org/eclipse/update/search/UpdateSearchRequest.java	30 Mar 2006 06:02:10 -0000
Ben Konrath 02a0b82
@@ -10,6 +10,7 @@
Ben Konrath 02a0b82
  *******************************************************************************/
Ben Konrath 02a0b82
 package org.eclipse.update.search;
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
+import java.io.File;
Ben Konrath 02a0b82
 import java.net.URL;
Ben Konrath 02a0b82
 import java.util.ArrayList;
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
@@ -140,11 +141,11 @@
Ben Konrath 02a0b82
 		this.category = category;
Ben Konrath 02a0b82
 		this.scope = scope;
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
+	
Ben Konrath 02a0b82
 	/**
Ben Konrath 02a0b82
 	 * Returns the search catagory used in this request.
Ben Konrath 02a0b82
 	 * @return the search category
Ben Konrath 02a0b82
 	 */
Ben Konrath 02a0b82
-	
Ben Konrath 02a0b82
 	public IUpdateSearchCategory getCategory() {
Ben Konrath 02a0b82
 		return category;
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
@@ -251,6 +252,10 @@
Ben Konrath 02a0b82
 					// currently, the next conditional is only executed (qsite!=null) when
Ben Konrath 02a0b82
 					// running an update search. 
Ben Konrath 02a0b82
 					if (qsite != null && searchFeatureProvidedSites) {
Ben Konrath 02a0b82
+						// do not update features that are installed in read-only locations
Ben Konrath 02a0b82
+						IFeature feature = query.getFeature();
Ben Konrath 02a0b82
+						if (feature != null && !feature.getSite().getCurrentConfiguredSite().verifyUpdatableStatus().isOK())
Ben Konrath 02a0b82
+							continue;
Ben Konrath 02a0b82
 						// check for mapping
Ben Konrath 02a0b82
 						IUpdateSiteAdapter mappedSite = getMappedSite(updatePolicy, qsite);
Ben Konrath 02a0b82
 						// when there is no mapped site the feature is not updatable
Ben Konrath 02a0b82
Index: src/org/eclipse/update/search/IUpdateSearchQuery.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/search/IUpdateSearchQuery.java,v
Ben Konrath 02a0b82
retrieving revision 1.8
Ben Konrath 02a0b82
diff -u -r1.8 IUpdateSearchQuery.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.core/src/org/eclipse/update/search/IUpdateSearchQuery.java	1 Mar 2005 20:29:16 -0000	1.8
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.core/src/org/eclipse/update/search/IUpdateSearchQuery.java	30 Mar 2006 06:02:10 -0000
Ben Konrath 02a0b82
@@ -7,6 +7,7 @@
Ben Konrath 02a0b82
  *
Ben Konrath 02a0b82
  * Contributors:
Ben Konrath 02a0b82
  *     IBM Corporation - initial API and implementation
Ben Konrath 02a0b82
+ *     Red Hat Incorporated - getFeature() API addition
Ben Konrath 02a0b82
  *******************************************************************************/
Ben Konrath 02a0b82
 package org.eclipse.update.search;
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
@@ -50,4 +51,12 @@
Ben Konrath 02a0b82
  * @param monitor a progress monitor to report search progress within the provided site
Ben Konrath 02a0b82
  */
Ben Konrath 02a0b82
 	public void run(ISite site, String [] categoriesToSkip, IUpdateSearchFilter filter, IUpdateSearchResultCollector collector, IProgressMonitor monitor);
Ben Konrath 02a0b82
+	
Ben Konrath 02a0b82
+/**
Ben Konrath 02a0b82
+ * Returns IFeature associated with the IUpdateSearchQuery
Ben Konrath 02a0b82
+ * 
Ben Konrath 02a0b82
+ * @return the IFeature that is associated with the IUpdateSearchQuery
Ben Konrath 02a0b82
+ * @since 3.2
Ben Konrath 02a0b82
+ */
Ben Konrath 02a0b82
+	public IFeature getFeature(); 
Ben Konrath 02a0b82
 }
Ben Konrath 02a0b82
Index: src/org/eclipse/update/internal/search/OptionalFeatureSearchCategory.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/internal/search/OptionalFeatureSearchCategory.java,v
Ben Konrath 02a0b82
retrieving revision 1.8
Ben Konrath 02a0b82
diff -u -r1.8 OptionalFeatureSearchCategory.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.core/src/org/eclipse/update/internal/search/OptionalFeatureSearchCategory.java	1 Mar 2005 20:29:16 -0000	1.8
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.core/src/org/eclipse/update/internal/search/OptionalFeatureSearchCategory.java	30 Mar 2006 06:02:10 -0000
Ben Konrath 02a0b82
@@ -76,6 +76,13 @@
Ben Konrath 02a0b82
 		public IQueryUpdateSiteAdapter getQuerySearchSite() {
Ben Konrath 02a0b82
 			return null;
Ben Konrath 02a0b82
 		}
Ben Konrath 02a0b82
+
Ben Konrath 02a0b82
+		/* (non-Javadoc)
Ben Konrath 02a0b82
+		 * @see org.eclipse.update.internal.ui.search.ISearchQuery#getFeature()
Ben Konrath 02a0b82
+		 */
Ben Konrath 02a0b82
+		public IFeature getFeature() {
Ben Konrath 02a0b82
+			return null;
Ben Konrath 02a0b82
+		}
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 	public void addVersionedIdentifier(VersionedIdentifier vid) {
Ben Konrath 02a0b82
Index: src/org/eclipse/update/internal/search/UpdatesSearchCategory.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/internal/search/UpdatesSearchCategory.java,v
Ben Konrath 02a0b82
retrieving revision 1.26
Ben Konrath 02a0b82
diff -u -r1.26 UpdatesSearchCategory.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.core/src/org/eclipse/update/internal/search/UpdatesSearchCategory.java	23 May 2005 17:59:41 -0000	1.26
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.core/src/org/eclipse/update/internal/search/UpdatesSearchCategory.java	30 Mar 2006 06:02:10 -0000
Ben Konrath 02a0b82
@@ -285,6 +285,10 @@
Ben Konrath 02a0b82
 			monitor.worked(1);
Ben Konrath 02a0b82
 			monitor.done();
Ben Konrath 02a0b82
 		}
Ben Konrath 02a0b82
+
Ben Konrath 02a0b82
+		public IFeature getFeature() {
Ben Konrath 02a0b82
+			return candidate;
Ben Konrath 02a0b82
+		}
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 	private ArrayList candidates;
Ben Konrath 02a0b82
Index: src/org/eclipse/update/internal/search/SiteSearchCategory.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/internal/search/SiteSearchCategory.java,v
Ben Konrath 02a0b82
retrieving revision 1.12
Ben Konrath 02a0b82
diff -u -r1.12 SiteSearchCategory.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.core/src/org/eclipse/update/internal/search/SiteSearchCategory.java	29 Mar 2006 23:37:08 -0000	1.12
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.core/src/org/eclipse/update/internal/search/SiteSearchCategory.java	30 Mar 2006 06:02:10 -0000
Ben Konrath 02a0b82
@@ -114,6 +114,12 @@
Ben Konrath 02a0b82
 		public IQueryUpdateSiteAdapter getQuerySearchSite() {
Ben Konrath 02a0b82
 			return null;
Ben Konrath 02a0b82
 		}
Ben Konrath 02a0b82
+		/* (non-Javadoc)
Ben Konrath 02a0b82
+		 * @see org.eclipse.update.internal.ui.search.ISearchQuery#getFeature()
Ben Konrath 02a0b82
+		 */
Ben Konrath 02a0b82
+		public IFeature getFeature() {
Ben Konrath 02a0b82
+			return null;
Ben Konrath 02a0b82
+		}
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 	public SiteSearchCategory() {
Ben Konrath 02a0b82
Index: src/org/eclipse/update/internal/core/ConfiguredSite.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.core/src/org/eclipse/update/internal/core/ConfiguredSite.java,v
Ben Konrath 02a0b82
retrieving revision 1.96
Ben Konrath 02a0b82
diff -u -r1.96 ConfiguredSite.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.core/src/org/eclipse/update/internal/core/ConfiguredSite.java	30 Mar 2006 02:34:37 -0000	1.96
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.core/src/org/eclipse/update/internal/core/ConfiguredSite.java	30 Mar 2006 06:02:10 -0000
Ben Konrath 02a0b82
@@ -35,6 +35,7 @@
Ben Konrath 02a0b82
 import org.eclipse.core.runtime.IProgressMonitor;
Ben Konrath 02a0b82
 import org.eclipse.core.runtime.IStatus;
Ben Konrath 02a0b82
 import org.eclipse.core.runtime.MultiStatus;
Ben Konrath 02a0b82
+import org.eclipse.core.runtime.Platform;
Ben Konrath 02a0b82
 import org.eclipse.osgi.util.NLS;
Ben Konrath 02a0b82
 import org.eclipse.update.configuration.IActivity;
Ben Konrath 02a0b82
 import org.eclipse.update.configuration.IConfiguredSite;
Ben Konrath 02a0b82
@@ -803,7 +804,9 @@
Ben Konrath 02a0b82
 			}
Ben Konrath 02a0b82
 		} else {
Ben Konrath 02a0b82
 			File container = getSiteContaining(file);
Ben Konrath 02a0b82
-			if (container != null) {
Ben Konrath 02a0b82
+			// allow the install location to pass even though it looks like this
Ben Konrath 02a0b82
+			// site is contained in another site
Ben Konrath 02a0b82
+			if (container != null && !siteLocation.equals(Platform.getInstallLocation().getURL().getFile())) {
Ben Konrath 02a0b82
 				verifyStatus = createStatus(IStatus.ERROR, NLS.bind(Messages.ConfiguredSite_ContainedInAnotherSite, (new String[] { container.getAbsolutePath() })), null);
Ben Konrath 02a0b82
 				return verifyStatus;
Ben Konrath 02a0b82
 			}
Ben Konrath 02a0b82
Index: src/org/eclipse/update/internal/ui/wizards/InstallWizard2.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/InstallWizard2.java,v
Ben Konrath 02a0b82
retrieving revision 1.8
Ben Konrath 02a0b82
diff -u -r1.8 InstallWizard2.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/InstallWizard2.java	17 Mar 2006 06:02:44 -0000	1.8
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/InstallWizard2.java	30 Mar 2006 06:02:11 -0000
Ben Konrath 02a0b82
@@ -148,7 +148,7 @@
Ben Konrath 02a0b82
 		addPage(licensePage);
Ben Konrath 02a0b82
 		optionalFeaturesPage = new OptionalFeaturesPage(config);
Ben Konrath 02a0b82
 		addPage(optionalFeaturesPage);
Ben Konrath 02a0b82
-		targetPage = new TargetPage(config);
Ben Konrath 02a0b82
+		targetPage = new TargetPage(config, isUpdate);
Ben Konrath 02a0b82
 		addPage(targetPage);
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
Index: src/org/eclipse/update/internal/ui/wizards/TargetPage.java
Ben Konrath 02a0b82
===================================================================
Ben Konrath 02a0b82
RCS file: /home/eclipse/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/TargetPage.java,v
Ben Konrath 02a0b82
retrieving revision 1.74
Ben Konrath 02a0b82
diff -u -r1.74 TargetPage.java
Ben Konrath 02a0b82
--- plugins/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/TargetPage.java	21 Nov 2005 21:39:24 -0000	1.74
Ben Konrath 02a0b82
+++ plugins/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/TargetPage.java	30 Mar 2006 06:02:11 -0000
Ben Konrath 02a0b82
@@ -13,6 +13,9 @@
Ben Konrath 02a0b82
 import java.io.*;
Ben Konrath 02a0b82
 import java.util.*;
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
+import org.eclipse.core.runtime.Platform;
Ben Konrath 02a0b82
+import org.eclipse.core.runtime.CoreException;
Ben Konrath 02a0b82
+import org.eclipse.core.runtime.IStatus;
Ben Konrath 02a0b82
 import org.eclipse.jface.dialogs.Dialog;
Ben Konrath 02a0b82
 import org.eclipse.jface.resource.*;
Ben Konrath 02a0b82
 import org.eclipse.jface.viewers.*;
Ben Konrath 02a0b82
@@ -41,6 +44,7 @@
Ben Konrath 02a0b82
     private Label installLocation;
Ben Konrath 02a0b82
     private Button changeLocation;
Ben Konrath 02a0b82
     static HashSet added;
Ben Konrath 02a0b82
+    private boolean isUpdate; // whether the wizard is updating a feature or installing a new one
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 	class JobsContentProvider
Ben Konrath 02a0b82
 		extends DefaultContentProvider
Ben Konrath 02a0b82
@@ -113,13 +117,14 @@
Ben Konrath 02a0b82
 	/**
Ben Konrath 02a0b82
 	 * Constructor for ReviewPage2
Ben Konrath 02a0b82
 	 */
Ben Konrath 02a0b82
-	public TargetPage(IInstallConfiguration config) {
Ben Konrath 02a0b82
+	public TargetPage(IInstallConfiguration config, boolean isUpdate) {
Ben Konrath 02a0b82
 		super("Target"); //$NON-NLS-1$
Ben Konrath 02a0b82
 		setTitle(UpdateUIMessages.InstallWizard_TargetPage_title); 
Ben Konrath 02a0b82
 		setDescription(UpdateUIMessages.InstallWizard_TargetPage_desc); 
Ben Konrath 02a0b82
 		this.config = config;
Ben Konrath 02a0b82
 		UpdateUI.getDefault().getLabelProvider().connect(this);
Ben Konrath 02a0b82
 		configListener = new ConfigListener();
Ben Konrath 02a0b82
+		this.isUpdate = isUpdate;
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 	public void setJobs(IInstallFeatureOperation[] jobs) {
Ben Konrath 02a0b82
@@ -150,7 +155,7 @@
Ben Konrath 02a0b82
         label.setLayoutData(gd);
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 		installLocation = new Label(client, SWT.NULL);
Ben Konrath 02a0b82
-        installLocation.setText("foo"); //$NON-NLS-1$
Ben Konrath 02a0b82
+        installLocation.setText(""); //$NON-NLS-1$
Ben Konrath 02a0b82
         gd = new GridData(GridData.FILL_HORIZONTAL);
Ben Konrath 02a0b82
         installLocation.setLayoutData(gd);
Ben Konrath 02a0b82
         
Ben Konrath 02a0b82
@@ -360,17 +365,51 @@
Ben Konrath 02a0b82
 				continue;
Ben Konrath 02a0b82
 			}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
-			jobs[i].setTargetSite(getFirstTargetSite(jobs[i]));
Ben Konrath 02a0b82
+			IConfiguredSite csite = getFirstTargetSite(jobs[i]);
Ben Konrath 02a0b82
+			if (csite == null && Platform.getInstallLocation().isReadOnly() && isUpdate == false) {
Ben Konrath 02a0b82
+				// there are no updateable sites, the installation location is read-only and we are installing a new feature
Ben Konrath 02a0b82
+				// make an update site in the user's home direcotry
Ben Konrath 02a0b82
+				File site= new File(System.getProperty("user.home") + File.separator + ".eclipse" + File.separator + //$NON-NLS-1$
Ben Konrath 02a0b82
+					Platform.getProduct().getId() + File.separator + "updates"); //$NON-NLS-1$
Ben Konrath 02a0b82
+				
Ben Konrath 02a0b82
+				try {
Ben Konrath 02a0b82
+					csite = config.createConfiguredSite(site);
Ben Konrath 02a0b82
+					config.addConfiguredSite(csite);
Ben Konrath 02a0b82
+					IStatus status = csite.verifyUpdatableStatus();
Ben Konrath 02a0b82
+					if (!status.isOK())
Ben Konrath 02a0b82
+						throw new CoreException(status);
Ben Konrath 02a0b82
+					
Ben Konrath 02a0b82
+				} catch (CoreException e) {
Ben Konrath 02a0b82
+					// there was a problem, the user must choose an installation site
Ben Konrath 02a0b82
+					csite = null;
Ben Konrath 02a0b82
+					// no need to check if the directory exists because File.delete() returns false if it's not there
Ben Konrath 02a0b82
+					deleteDir(site);
Ben Konrath 02a0b82
+				}
Ben Konrath 02a0b82
+			}
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
+			jobs[i].setTargetSite(csite);
Ben Konrath 02a0b82
 		}
Ben Konrath 02a0b82
 	}
Ben Konrath 02a0b82
+
Ben Konrath 02a0b82
+	private boolean deleteDir(File dir) {
Ben Konrath 02a0b82
+        if (dir.isDirectory()) {
Ben Konrath 02a0b82
+            String[] files = dir.list();
Ben Konrath 02a0b82
+            for (int i=0; i < files.length; i++) {
Ben Konrath 02a0b82
+                if (!deleteDir(new File(dir, files[i]))) {
Ben Konrath 02a0b82
+                    return false;
Ben Konrath 02a0b82
+                }
Ben Konrath 02a0b82
+            }
Ben Konrath 02a0b82
+        }
Ben Konrath 02a0b82
+        return dir.delete();
Ben Konrath 02a0b82
+    }
Ben Konrath 02a0b82
 	
Ben Konrath 02a0b82
 
Ben Konrath 02a0b82
 	private IConfiguredSite getFirstTargetSite(IInstallFeatureOperation job) {
Ben Konrath 02a0b82
 		IConfiguredSite[] sites = config.getConfiguredSites();
Ben Konrath 02a0b82
 		for (int i = 0; i < sites.length; i++) {
Ben Konrath 02a0b82
 			IConfiguredSite csite = sites[i];
Ben Konrath 02a0b82
-			if (getSiteVisibility(csite, job)) 
Ben Konrath 02a0b82
+			if (getSiteVisibility(csite, job) && 
Ben Konrath 02a0b82
+				csite.getSite().getCurrentConfiguredSite().verifyUpdatableStatus().isOK())
Ben Konrath 02a0b82
 				return csite;
Ben Konrath 02a0b82
 		}
Ben Konrath 02a0b82
 		return null;