| /******************************************************************************* |
| * Copyright (c) 2013 Ericsson AB and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Ericsson AB - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.p2.touchpoint.eclipse; |
| |
| import java.io.*; |
| import java.net.URISyntaxException; |
| import org.eclipse.core.runtime.URIUtil; |
| import org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry; |
| import org.eclipse.equinox.internal.provisional.frameworkadmin.*; |
| import org.eclipse.equinox.p2.core.*; |
| |
| /** |
| * Given an eclipse installation folder and / or an eclipse configuration |
| * folder, this class creates the agent representing the system point at. |
| */ |
| public class AgentFromInstall { |
| // Input |
| private File configurationFolder; |
| private File installFolder; |
| private IProvisioningAgentProvider agentProvider; |
| |
| // Figured out |
| private String profileId; |
| private String p2DataAreaURI; |
| private String userSpecifiedProfileId; |
| |
| private AgentFromInstall(IProvisioningAgentProvider agentProvider, File installFolder, File configurationFolder, |
| String profileId) { |
| this.installFolder = installFolder; |
| this.configurationFolder = configurationFolder; |
| this.agentProvider = agentProvider; |
| this.userSpecifiedProfileId = profileId; |
| } |
| |
| /** |
| * Creates an agent deriving the p2 data area from the information contained in |
| * the installFolder or the configurationFolder. In the returned agent, the |
| * services will be initialized such that the SELF variable is bound to the |
| * default profile referred to in the configuration files. |
| * |
| * @param agentProvider an instance of an agent provider from which the |
| * agent will be created. |
| * @param installFolder null or a file referring to the installation |
| * folder of eclipse. |
| * @param configurationFolder null or a file referring to the configuration |
| * folder of eclipse. |
| * @param profileId null or the name of the expected profile. This |
| * value is used when the detection of the profile id |
| * from the configuration file does not succeed. |
| */ |
| static public IProvisioningAgent createAgentFrom(IProvisioningAgentProvider agentProvider, File installFolder, |
| File configurationFolder, String profileId) { |
| AgentFromInstall newInstance = new AgentFromInstall(agentProvider, installFolder, configurationFolder, |
| profileId); |
| return newInstance.loadAgent(); |
| } |
| |
| private IProvisioningAgent loadAgent() { |
| if (installFolder != null) { |
| if (!installFolder.exists()) |
| return null; |
| initializeFromConfigFiles(); |
| } else { |
| initializeByGuessing(); |
| } |
| if (profileId == null) |
| profileId = userSpecifiedProfileId; |
| |
| if (profileId == null || p2DataAreaURI == null) { |
| return null; |
| } |
| return createAgent(); |
| } |
| |
| public IProvisioningAgent createAgent() { |
| IProvisioningAgent agent = null; |
| try { |
| agent = agentProvider.createAgent(URIUtil.fromString(p2DataAreaURI)); |
| } catch (ProvisionException e) { |
| // Can't happen |
| } catch (URISyntaxException e) { |
| // Can't happen since we are always constructing the string from code that |
| // manipulate files (included the code in the Manipulator) |
| } |
| agent.registerService("FORCED_SELF", profileId); //$NON-NLS-1$ |
| return agent; |
| } |
| |
| private boolean initializeFromConfigFiles() { |
| FrameworkAdmin fwk = LazyManipulator.getFrameworkAdmin(); |
| if (fwk == null) |
| return false; |
| Manipulator manipulator = fwk.getManipulator(); |
| LauncherData launcherData = manipulator.getLauncherData(); |
| launcherData.setFwConfigLocation(configurationFolder != null ? configurationFolder |
| : new File(installFolder, "configuration/config.ini")); //$NON-NLS-1$ |
| launcherData.setHome(installFolder); |
| try { |
| manipulator.load(); |
| } catch (IllegalStateException e) { |
| return false; |
| } catch (FrameworkAdminRuntimeException e) { |
| return false; |
| } catch (IOException e) { |
| return false; |
| } |
| profileId = manipulator.getConfigData().getProperty("eclipse.p2.profile"); //$NON-NLS-1$ |
| p2DataAreaURI = manipulator.getConfigData().getProperty("eclipse.p2.data.area"); //$NON-NLS-1$ |
| return true; |
| } |
| |
| private void initializeByGuessing() { |
| File p2Folder = new File(configurationFolder, "p2"); //$NON-NLS-1$ |
| if (!p2Folder.exists()) { |
| p2Folder = new File(configurationFolder.getParentFile(), "p2"); //$NON-NLS-1$ |
| if (!p2Folder.exists()) |
| return; |
| } |
| p2DataAreaURI = p2Folder.toURI().toASCIIString(); |
| if (profileId == null) { |
| profileId = findProfile(getProfileRegistryFolder(p2Folder)); |
| } |
| } |
| |
| private static File getProfileRegistryFolder(File p2Folder) { |
| return new File(p2Folder, "org.eclipse.equinox.p2.engine/profileRegistry/"); //$NON-NLS-1$ |
| } |
| |
| private static String findProfile(File profileDirectory) { |
| final String PROFILE_EXT = ".profile"; //$NON-NLS-1$ |
| File[] profileDirectories = profileDirectory.listFiles((FileFilter) pathname -> pathname.getName().endsWith(PROFILE_EXT) && pathname.isDirectory()); |
| if (profileDirectories.length == 1) { |
| String directoryName = profileDirectories[0].getName(); |
| return SimpleProfileRegistry.unescape(directoryName.substring(0, directoryName.lastIndexOf(PROFILE_EXT))); |
| } |
| |
| return null; |
| } |
| } |