]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.project/src/org/simantics/project/management/install/InstallerUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.project / src / org / simantics / project / management / install / InstallerUtil.java
1 package org.simantics.project.management.install;\r
2 \r
3 import java.io.IOException;\r
4 \r
5 import org.eclipse.core.runtime.IPath;\r
6 import org.eclipse.core.runtime.IProgressMonitor;\r
7 import org.eclipse.core.runtime.IStatus;\r
8 import org.eclipse.core.runtime.SubMonitor;\r
9 import org.eclipse.equinox.internal.provisional.p2.installer.InstallAdvisor;\r
10 import org.eclipse.equinox.internal.provisional.p2.installer.InstallDescription;\r
11 import org.eclipse.equinox.p2.core.IProvisioningAgent;\r
12 import org.eclipse.equinox.p2.core.IProvisioningAgentProvider;\r
13 import org.eclipse.equinox.p2.core.ProvisionException;\r
14 import org.eclipse.equinox.p2.core.UIServices;\r
15 import org.osgi.framework.BundleContext;\r
16 import org.osgi.framework.ServiceReference;\r
17 import org.simantics.project.management.P2Util;\r
18 import org.simantics.project.management.TrustAllCertificates;\r
19 \r
20 /**\r
21  * P2 installer util.\r
22  * \r
23  * Heavily inspired by org.eclipse.equinox.p2.installer project.\r
24  * \r
25  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
26  */\r
27 public class InstallerUtil {\r
28 \r
29         private static final String SYS_PROP_INSTALL_DESCRIPTION = "org.eclipse.equinox.p2.installDescription";\r
30         \r
31         public static IStatus install(InstallAdvisor advisor, InstallDescription description, IProgressMonitor monitor) throws Exception {\r
32                 if (advisor == null)\r
33                         advisor = getDefaultAdvisor();\r
34                 if (description == null)\r
35                         description = getDefaultDescription(SubMonitor.convert(monitor));\r
36 \r
37                 advisor.prepareInstallDescription(description);\r
38                 IProvisioningAgent agent = startAgent(description);             \r
39                 \r
40                 InstallUpdateProductOperation operation = new InstallUpdateProductOperation(agent, description);\r
41                 \r
42                 IStatus status = advisor.performInstall(operation);\r
43                 if (!status.isOK()) {\r
44 //                      ShowMessage.showStatus(status);\r
45                 }\r
46                 advisor.setResult(status);\r
47                 advisor.stop();\r
48                 agent.stop();\r
49                 return status;\r
50         }\r
51         \r
52         public static InstallDescription getDefaultDescription(SubMonitor monitor) throws Exception {\r
53                 String site = System.getProperty(SYS_PROP_INSTALL_DESCRIPTION);\r
54                 return InstallDescriptionParser.createDescription(site, monitor);\r
55                 \r
56         }\r
57         \r
58         public static InstallAdvisor getDefaultAdvisor() {\r
59                 InstallAdvisor advisor = new DefaultInstallAdvisor();\r
60                 advisor.start();\r
61                 return advisor;\r
62         }\r
63         \r
64         public static IProvisioningAgent startAgent(InstallDescription description) throws Exception {\r
65                 IPath installLocation = description.getInstallLocation();\r
66                 if (installLocation == null)\r
67                         throw new Exception("No install location");\r
68                 \r
69                 try {\r
70                         // Create recruiter\r
71                         IProvisioningAgentProvider provider = P2Util.getProvisioningAgentProvider();\r
72                         \r
73                         // Set agent location if specified. Contains P2 install data\r
74                         IPath agentLocation = description.getAgentLocation();\r
75                         \r
76                         // Recruit Agent - Permission to provision\r
77                         IProvisioningAgent agent = provider.createAgent(agentLocation == null ? null : agentLocation.toFile().toURI());\r
78                         \r
79                         // Omit "This bundle is not certified" dialog.                  \r
80                         UIServices serviceUI = new TrustAllCertificates();\r
81                         agent.registerService("org.eclipse.equinox.p2.core.UIServices", serviceUI);\r
82                         \r
83                         \r
84                         return agent;\r
85                 } catch (ProvisionException e) {\r
86                         throw new Exception("Cannot create agent", e);\r
87                 }\r
88         }\r
89 \r
90         \r
91         /**\r
92          * Copied from ServiceHelper because we need to obtain services\r
93          * before p2 has been started.\r
94          */\r
95         public static Object getService(BundleContext context, String name) {\r
96                 if (context == null)\r
97                         return null;\r
98                 ServiceReference reference = context.getServiceReference(name);\r
99                 if (reference == null)\r
100                         return null;\r
101                 Object result = context.getService(reference);\r
102                 context.ungetService(reference);\r
103                 return result;\r
104         }\r
105         \r
106         \r
107         public static void launchProduct(InstallDescription description) throws Exception {\r
108                 IPath installLocation = description.getInstallLocation();\r
109                 IPath toRun = installLocation.append(description.getLauncherName());\r
110                 try {\r
111                         Runtime.getRuntime().exec(toRun.toString(), null, installLocation.toFile());\r
112                 } catch (IOException e) {\r
113                         throw new Exception("Lanuching an app failed", e);\r
114                 }\r
115 \r
116         }\r
117 }\r