Révision 2218
tmp/org.txm.rcp/src/main/java/org/txm/rcp/p2/plugins/TXMUpdateHandler.java (revision 2218) | ||
---|---|---|
14 | 14 |
import java.net.URI; |
15 | 15 |
import java.net.URL; |
16 | 16 |
import java.util.Arrays; |
17 |
import java.util.Iterator; |
|
17 | 18 |
|
18 | 19 |
import org.eclipse.core.commands.ExecutionEvent; |
19 | 20 |
import org.eclipse.core.runtime.Assert; |
20 | 21 |
import org.eclipse.core.runtime.IProgressMonitor; |
21 | 22 |
import org.eclipse.core.runtime.IStatus; |
22 | 23 |
import org.eclipse.core.runtime.OperationCanceledException; |
24 |
import org.eclipse.equinox.internal.p2.engine.Profile; |
|
25 |
import org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry; |
|
26 |
import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; |
|
23 | 27 |
import org.eclipse.equinox.internal.p2.ui.sdk.ProvSDKMessages; |
24 | 28 |
import org.eclipse.equinox.internal.p2.ui.sdk.UpdateHandler; |
25 | 29 |
import org.eclipse.equinox.p2.core.IProvisioningAgent; |
26 | 30 |
import org.eclipse.equinox.p2.core.ProvisionException; |
31 |
import org.eclipse.equinox.p2.engine.IProfile; |
|
27 | 32 |
import org.eclipse.equinox.p2.engine.IProfileRegistry; |
33 |
import org.eclipse.equinox.p2.metadata.IInstallableUnit; |
|
28 | 34 |
import org.eclipse.equinox.p2.operations.ProfileChangeOperation; |
29 | 35 |
import org.eclipse.equinox.p2.operations.RepositoryTracker; |
30 | 36 |
import org.eclipse.equinox.p2.operations.UpdateOperation; |
31 | 37 |
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager; |
32 | 38 |
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager; |
33 | 39 |
import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob; |
40 |
import org.eclipse.equinox.p2.ui.ProvisioningUI; |
|
34 | 41 |
import org.eclipse.osgi.util.NLS; |
35 | 42 |
import org.eclipse.swt.widgets.Shell; |
36 | 43 |
import org.eclipse.ui.statushandlers.StatusManager; |
... | ... | |
62 | 69 |
File installDirectory = new File(path); |
63 | 70 |
Log.fine("Testing install directory rights: "+installDirectory); |
64 | 71 |
if (!installDirectory.canWrite() || !installDirectory.canExecute()) { |
65 |
Log.warning("Warning: you need administrator privileges to fully update TXM. Some updates might not be fully installed.");
|
|
72 |
Log.warning(NLS.bind("Warning: you need administrator privileges to fully update TXM (installed in {0}). Some updates might not be fully installed.", installDirectory));
|
|
66 | 73 |
} |
67 | 74 |
} catch (Exception e) { |
68 | 75 |
// TODO Auto-generated catch block |
... | ... | |
71 | 78 |
} |
72 | 79 |
} |
73 | 80 |
|
74 |
// Look for a profile. We may not immediately need it in the |
|
75 |
// handler, but if we don't have one, whatever we are trying to do |
|
76 |
// will ultimately fail in a more subtle/low-level way. So determine |
|
77 |
// up front if the system is configured properly. |
|
81 |
// Hacking p2 profile to be able to update installation directory even if -configuration is set |
|
78 | 82 |
try { |
79 |
String profileId = getProvisioningUI().getProfileId(); |
|
80 |
IProvisioningAgent agent = getProvisioningUI().getSession().getProvisioningAgent(); |
|
83 |
ProvisioningUI pui = ProvisioningUI.getDefaultUI(); |
|
81 | 84 |
|
85 |
String profileId = pui.getProfileId(); |
|
86 |
IProvisioningAgent agent = pui.getSession().getProvisioningAgent(); |
|
87 |
|
|
82 | 88 |
if (agent != null) { |
83 |
IProfileRegistry registry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); |
|
84 |
if (registry != null) { |
|
85 |
registry.getProfile(profileId); |
|
89 |
IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); |
|
90 |
|
|
91 |
|
|
92 |
if (profileRegistry != null && profileRegistry instanceof SimpleProfileRegistry) { |
|
93 |
|
|
94 |
SimpleProfileRegistry spr = (SimpleProfileRegistry)profileRegistry; |
|
95 |
|
|
96 |
IProfile iprofile = profileRegistry.getProfile(profileId); |
|
97 |
if (iprofile != null && iprofile instanceof Profile) { |
|
98 |
Profile profile = (Profile)iprofile; |
|
99 |
|
|
100 |
spr.lockProfile(profile); |
|
101 |
|
|
102 |
//System.out.println("Profile: "+profile.getClass()+" = "+profile); |
|
103 |
Iterator<IInstallableUnit> everything = profile.everything(); |
|
104 |
boolean changed = false; |
|
105 |
while(everything.hasNext()) { |
|
106 |
IInstallableUnit iu = everything.next(); |
|
107 |
|
|
108 |
String locked = profile.getInstallableUnitProperty(iu, IProfile.PROP_PROFILE_LOCKED_IU); |
|
109 |
|
|
110 |
if (locked != null && !("0".equals(locked))) { |
|
111 |
profile.setInstallableUnitProperty(iu, IProfile.PROP_PROFILE_LOCKED_IU, "0"); |
|
112 |
changed = true; |
|
113 |
} |
|
114 |
} |
|
115 |
if (changed) { |
|
116 |
spr.updateProfile(profile); |
|
117 |
} |
|
118 |
|
|
119 |
spr.unlockProfile(profile); |
|
120 |
} |
|
86 | 121 |
} |
87 | 122 |
} |
88 | 123 |
|
... | ... | |
105 | 140 |
Log.info("Looking for TXM updates..."); |
106 | 141 |
Object ret = super.execute(event); |
107 | 142 |
Log.info("Done."); |
108 |
|
|
143 |
|
|
109 | 144 |
return ret; |
110 | 145 |
} catch(Exception e) { |
111 | 146 |
Log.severe("Could not update TXM: "+e + "."); |
... | ... | |
124 | 159 |
} |
125 | 160 |
|
126 | 161 |
public static boolean patchGZProfile() { |
127 |
//TODO: is this still useful with TXM 0.7.7 ?
|
|
128 |
String path = System.getProperty("osgi.instance.area"); //$NON-NLS-1$ |
|
162 |
//TODO: is this still useful with TXM 0.7.7 -> yes&no : need to patch when --configuration is set, done by editing the Profile object directly
|
|
163 |
String path = BundleUtils.getInstallDirectory();//System.getProperty("osgi.instance.area"); //$NON-NLS-1$
|
|
129 | 164 |
URL location = null; |
130 | 165 |
try { |
131 | 166 |
location = new URL(path); //$NON-NLS-1$ |
... | ... | |
154 | 189 |
return false; |
155 | 190 |
} else { |
156 | 191 |
try { |
157 |
//2- extract profil from gz profile |
|
192 |
//2- extract profile from gz profile
|
|
158 | 193 |
File profileXMLFile = GZip.uncompress(gzFile, profileDir); |
159 | 194 |
//3- patch xml by removing lock properties |
160 | 195 |
patchProfile(profileXMLFile); |
... | ... | |
332 | 367 |
System.out.println("No artifact repository manager found"); |
333 | 368 |
return false; |
334 | 369 |
} |
335 |
|
|
370 |
|
|
336 | 371 |
Log.fine("Adding update site URL: "+location + "..."); |
337 | 372 |
|
338 | 373 |
try { |
... | ... | |
435 | 470 |
} |
436 | 471 |
|
437 | 472 |
// COPY FROM UpdateHandler class |
438 |
boolean hasNoRepos = false; |
|
439 |
UpdateOperation operation; |
|
473 |
// boolean hasNoRepos = false; |
|
474 |
// UpdateOperation operation; |
|
475 |
// |
|
476 |
// @Override |
|
477 |
// protected void doExecute(LoadMetadataRepositoryJob job) { |
|
478 |
// super.doExecute(job); |
|
479 |
//// //System.out.println("TXMUpdateHandler: doExecute(...)"); |
|
480 |
//// if (hasNoRepos) { |
|
481 |
//// if (getProvisioningUI().getPolicy().getRepositoriesVisible()) { |
|
482 |
//// System.out.println(ProvSDKMessages.UpdateHandler_NoSitesMessage); |
|
483 |
//// } |
|
484 |
//// return; |
|
485 |
//// } |
|
486 |
//// // Report any missing repositories. |
|
487 |
//// job.reportAccumulatedStatus(); |
|
488 |
//// if (continueWorkingWithOperation(operation, getShell())) { |
|
489 |
//// if (operation.getResolutionResult() == Status.OK_STATUS) { |
|
490 |
//// getProvisioningUI().openUpdateWizard(false, operation, job); |
|
491 |
//// } else { |
|
492 |
//// |
|
493 |
//// final RemediationOperation remediationOperation = new RemediationOperation(getProvisioningUI().getSession(), operation.getProfileChangeRequest(), RemedyConfig.getCheckForUpdateRemedyConfigs()); |
|
494 |
//// ProvisioningJob job2 = new ProvisioningJob(ProvSDKMessages.RemediationOperation_ResolveJobName, getProvisioningUI().getSession()) { |
|
495 |
//// @Override |
|
496 |
//// public IStatus runModal(IProgressMonitor monitor) { |
|
497 |
//// monitor.beginTask(ProvSDKMessages.RemediationOperation_ResolveJobTask, RemedyConfig.getAllRemedyConfigs().length); |
|
498 |
//// return remediationOperation.resolveModal(monitor); |
|
499 |
//// } |
|
500 |
//// }; |
|
501 |
//// job2.addJobChangeListener(new JobChangeAdapter() { |
|
502 |
//// public void done(IJobChangeEvent event) { |
|
503 |
//// if (PlatformUI.isWorkbenchRunning()) { |
|
504 |
//// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { |
|
505 |
//// public void run() { |
|
506 |
//// getProvisioningUI().openUpdateWizard(true, operation, remediationOperation, null); |
|
507 |
//// } |
|
508 |
//// }); |
|
509 |
//// } |
|
510 |
//// } |
|
511 |
//// |
|
512 |
//// }); |
|
513 |
//// getProvisioningUI().schedule(job2, StatusManager.SHOW | StatusManager.LOG); |
|
514 |
//// } |
|
515 |
//// } |
|
516 |
// } |
|
517 |
// |
|
518 |
// /** |
|
519 |
// * Answer a boolean indicating whether the caller should continue to work with the |
|
520 |
// * specified operation. This method is used when an operation has been resolved, but |
|
521 |
// * the UI may have further restrictions on continuing with it. |
|
522 |
// * |
|
523 |
// * @param operation the operation in question. It must already be resolved. |
|
524 |
// * @param shell the shell to use for any interaction with the user |
|
525 |
// * @return <code>true</code> if processing of the operation should continue, <code>false</code> if |
|
526 |
// * not. It is up to the implementor to report any errors to the user when answering <code>false</code>. |
|
527 |
// */ |
|
528 |
// public boolean continueWorkingWithOperation(ProfileChangeOperation operation, Shell shell) { |
|
529 |
// //System.out.println("Test if any update available"); |
|
530 |
// Assert.isTrue(operation.getResolutionResult() != null); |
|
531 |
// IStatus status = operation.getResolutionResult(); |
|
532 |
// // user cancelled |
|
533 |
// if (status.getSeverity() == IStatus.CANCEL) |
|
534 |
// return false; |
|
535 |
// |
|
536 |
// // Special case those statuses where we would never want to open a wizard |
|
537 |
// if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { |
|
538 |
// //ProvUI.reportStatus(status, StatusManager.BLOCK); |
|
539 |
// //System.out.println("No update available."); |
|
540 |
// return false; |
|
541 |
// } |
|
542 |
// |
|
543 |
// // there is no plan, so we can't continue. Report any reason found |
|
544 |
// if (operation.getProvisioningPlan() == null && !status.isOK()) { |
|
545 |
// StatusManager.getManager().handle(status, StatusManager.LOG | StatusManager.SHOW); |
|
546 |
// |
|
547 |
// return false; |
|
548 |
// } |
|
549 |
// |
|
550 |
// // Allow the wizard to open otherwise. |
|
551 |
// return true; |
|
552 |
// } |
|
553 |
// |
|
554 |
// protected void doPostLoadBackgroundWork(IProgressMonitor monitor) throws OperationCanceledException { |
|
555 |
// operation = getProvisioningUI().getUpdateOperation(null, null); |
|
556 |
// // check for updates |
|
557 |
// IStatus resolveStatus = operation.resolveModal(monitor); |
|
558 |
// if (resolveStatus.getSeverity() == IStatus.CANCEL) |
|
559 |
// throw new OperationCanceledException(); |
|
560 |
// } |
|
561 |
// |
|
562 |
// protected boolean preloadRepositories() { |
|
563 |
// hasNoRepos = false; |
|
564 |
// RepositoryTracker repoMan = getProvisioningUI().getRepositoryTracker(); |
|
565 |
// if (repoMan.getKnownRepositories(getProvisioningUI().getSession()).length == 0) { |
|
566 |
// hasNoRepos = true; |
|
567 |
// return false; |
|
568 |
// } |
|
569 |
// return super.preloadRepositories(); |
|
570 |
// } |
|
571 |
// |
|
572 |
// @Override |
|
573 |
// protected String getProgressTaskName() { |
|
574 |
// return ProvSDKMessages.UpdateHandler_ProgressTaskName; |
|
575 |
// } |
|
440 | 576 |
|
441 |
@Override |
|
442 |
protected void doExecute(LoadMetadataRepositoryJob job) { |
|
443 |
super.doExecute(job); |
|
444 |
// //System.out.println("TXMUpdateHandler: doExecute(...)"); |
|
445 |
// if (hasNoRepos) { |
|
446 |
// if (getProvisioningUI().getPolicy().getRepositoriesVisible()) { |
|
447 |
// System.out.println(ProvSDKMessages.UpdateHandler_NoSitesMessage); |
|
448 |
// } |
|
449 |
// return; |
|
450 |
// } |
|
451 |
// // Report any missing repositories. |
|
452 |
// job.reportAccumulatedStatus(); |
|
453 |
// if (continueWorkingWithOperation(operation, getShell())) { |
|
454 |
// if (operation.getResolutionResult() == Status.OK_STATUS) { |
|
455 |
// getProvisioningUI().openUpdateWizard(false, operation, job); |
|
456 |
// } else { |
|
457 |
// |
|
458 |
// final RemediationOperation remediationOperation = new RemediationOperation(getProvisioningUI().getSession(), operation.getProfileChangeRequest(), RemedyConfig.getCheckForUpdateRemedyConfigs()); |
|
459 |
// ProvisioningJob job2 = new ProvisioningJob(ProvSDKMessages.RemediationOperation_ResolveJobName, getProvisioningUI().getSession()) { |
|
460 |
// @Override |
|
461 |
// public IStatus runModal(IProgressMonitor monitor) { |
|
462 |
// monitor.beginTask(ProvSDKMessages.RemediationOperation_ResolveJobTask, RemedyConfig.getAllRemedyConfigs().length); |
|
463 |
// return remediationOperation.resolveModal(monitor); |
|
464 |
// } |
|
465 |
// }; |
|
466 |
// job2.addJobChangeListener(new JobChangeAdapter() { |
|
467 |
// public void done(IJobChangeEvent event) { |
|
468 |
// if (PlatformUI.isWorkbenchRunning()) { |
|
469 |
// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { |
|
470 |
// public void run() { |
|
471 |
// getProvisioningUI().openUpdateWizard(true, operation, remediationOperation, null); |
|
472 |
// } |
|
473 |
// }); |
|
474 |
// } |
|
475 |
// } |
|
476 |
// |
|
477 |
// }); |
|
478 |
// getProvisioningUI().schedule(job2, StatusManager.SHOW | StatusManager.LOG); |
|
479 |
// } |
|
480 |
// } |
|
481 |
} |
|
482 | 577 |
|
483 |
/** |
|
484 |
* Answer a boolean indicating whether the caller should continue to work with the |
|
485 |
* specified operation. This method is used when an operation has been resolved, but |
|
486 |
* the UI may have further restrictions on continuing with it. |
|
487 |
* |
|
488 |
* @param operation the operation in question. It must already be resolved. |
|
489 |
* @param shell the shell to use for any interaction with the user |
|
490 |
* @return <code>true</code> if processing of the operation should continue, <code>false</code> if |
|
491 |
* not. It is up to the implementor to report any errors to the user when answering <code>false</code>. |
|
492 |
*/ |
|
493 |
public boolean continueWorkingWithOperation(ProfileChangeOperation operation, Shell shell) { |
|
494 |
//System.out.println("Test if any update available"); |
|
495 |
Assert.isTrue(operation.getResolutionResult() != null); |
|
496 |
IStatus status = operation.getResolutionResult(); |
|
497 |
// user cancelled |
|
498 |
if (status.getSeverity() == IStatus.CANCEL) |
|
499 |
return false; |
|
500 | 578 |
|
501 |
// Special case those statuses where we would never want to open a wizard |
|
502 |
if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { |
|
503 |
//ProvUI.reportStatus(status, StatusManager.BLOCK); |
|
504 |
//System.out.println("No update available."); |
|
505 |
return false; |
|
506 |
} |
|
507 |
|
|
508 |
// there is no plan, so we can't continue. Report any reason found |
|
509 |
if (operation.getProvisioningPlan() == null && !status.isOK()) { |
|
510 |
StatusManager.getManager().handle(status, StatusManager.LOG | StatusManager.SHOW); |
|
511 |
|
|
512 |
return false; |
|
513 |
} |
|
514 |
|
|
515 |
// Allow the wizard to open otherwise. |
|
516 |
return true; |
|
517 |
} |
|
518 |
|
|
519 |
protected void doPostLoadBackgroundWork(IProgressMonitor monitor) throws OperationCanceledException { |
|
520 |
operation = getProvisioningUI().getUpdateOperation(null, null); |
|
521 |
// check for updates |
|
522 |
IStatus resolveStatus = operation.resolveModal(monitor); |
|
523 |
if (resolveStatus.getSeverity() == IStatus.CANCEL) |
|
524 |
throw new OperationCanceledException(); |
|
525 |
} |
|
526 |
|
|
527 |
protected boolean preloadRepositories() { |
|
528 |
hasNoRepos = false; |
|
529 |
RepositoryTracker repoMan = getProvisioningUI().getRepositoryTracker(); |
|
530 |
if (repoMan.getKnownRepositories(getProvisioningUI().getSession()).length == 0) { |
|
531 |
hasNoRepos = true; |
|
532 |
return false; |
|
533 |
} |
|
534 |
return super.preloadRepositories(); |
|
535 |
} |
|
536 |
|
|
537 |
@Override |
|
538 |
protected String getProgressTaskName() { |
|
539 |
return ProvSDKMessages.UpdateHandler_ProgressTaskName; |
|
540 |
} |
|
541 |
|
|
542 |
|
|
543 |
|
|
544 | 579 |
} |
Formats disponibles : Unified diff