blob: 9d4da9df22f34ff7fc7b0e79b525724fa0e80881 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2021 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.build.site;
import java.io.*;
import java.net.*;
import java.util.*;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile;
import org.eclipse.equinox.simpleconfigurator.manipulator.SimpleConfiguratorManipulator;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.pde.internal.build.*;
/**
* Temporary utilities until P2 and FrameworkAdmin are graduated into the SDK.
*
* @since 3.4
*/
public class P2Utils {
/**
* Returns bundles defined by the 'bundles.info' file in the
* specified location, or <code>null</code> if none. The "bundles.info" file
* is assumed to be at a fixed relative location to the specified file. This
* method will also look for a "source.info". If available, any source
* bundles found will also be added to the returned list.
*
* @param platformHome absolute path in the local file system to an installation
* @return URLs of all bundles in the installation or <code>null</code> if not able
* to locate a bundles.info
*/
public static URL[] readBundlesTxt(String platformHome) {
SimpleConfiguratorManipulator manipulator = BundleHelper.getDefault().acquireService(SimpleConfiguratorManipulator.class);
File root = new File(platformHome);
File bundlesTxt = new File(root, "configuration/" + SimpleConfiguratorManipulator.BUNDLES_INFO_PATH); //$NON-NLS-1$
File sourceTxt = new File(root, "configuration/" + SimpleConfiguratorManipulator.SOURCE_INFO_PATH); //$NON-NLS-1$
List<BundleInfo> infos = new ArrayList<>();
try {
//streams are closed for us
if (bundlesTxt.exists())
infos.addAll(Arrays.asList(manipulator.loadConfiguration(new FileInputStream(bundlesTxt), root.toURI())));
if (sourceTxt.exists())
infos.addAll(Arrays.asList(manipulator.loadConfiguration(new FileInputStream(sourceTxt), root.toURI())));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URL[] bundles = null;
if (infos.size() > 0) {
bundles = new URL[infos.size()];
for (int i = 0; i < bundles.length; i++) {
try {
bundles[i] = new File(infos.get(i).getLocation()).toURL();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
bundles = new URL[0];
}
return bundles;
}
/**
* Creates a bundles.info file in the given directory containing the name,
* version, location, start level and expected state of every bundle in the
* given collection. Will also create a source.info file containing
* a lsit of all source bundles found in the given collection. Uses special
* defaults for the start level and auto start settings. Returns the URL
* location of the bundle.txt or <code>null</code> if there was a problem
* creating it.
*
* @param bundles collection of IPluginModelBase objects to write into the bundles.info/source.info
* @param directory directory to create the bundles.info and source.info files in
* @return URL location of the bundles.info or <code>null</code>
*/
public static File writeBundlesTxt(Collection<BundleDescription> bundles, File directory, ProductFile productFile, boolean refactoredRuntime) {
List<BundleInfo> bundleInfos = new ArrayList<>(bundles.size());
List<BundleInfo> sourceInfos = new ArrayList<>(bundles.size());
ShapeAdvisor advisor = new ShapeAdvisor();
int defaultStartLevel = 4;
Properties props = productFile != null ? productFile.getConfigProperties() : null;
if (props != null && props.containsKey("osgi.bundles.defaultStartLevel")) { //$NON-NLS-1$
try {
defaultStartLevel = Integer.parseInt(props.getProperty("osgi.bundles.defaultStartLevel")); //$NON-NLS-1$
} catch (NumberFormatException e) {
//ignore and keep 4
}
}
Map<String, BundleInfo> userInfos = productFile != null ? productFile.getConfigurationInfo() : null;
for (BundleDescription desc : bundles) {
if (desc != null) {
String modelName = desc.getSymbolicName();
URI location = null;
try {
location = new URI("plugins/" + (String) advisor.getFinalShape(desc)[0]); //$NON-NLS-1$
} catch (URISyntaxException e) {
continue;
}
BundleInfo info = new BundleInfo();
info.setLocation(location);
info.setSymbolicName(modelName);
info.setVersion(desc.getVersion().toString());
if (userInfos != null && userInfos.size() > 0) {
if (userInfos.containsKey(modelName)) {
BundleInfo userInfo = userInfos.get(modelName);
int start = userInfo.getStartLevel();
if (start <= 0)
start = defaultStartLevel;
info.setStartLevel(start);
info.setMarkedAsStarted(userInfo.isMarkedAsStarted());
} else {
info.setStartLevel(defaultStartLevel);
info.setMarkedAsStarted(false);
}
} else {
if (IPDEBuildConstants.BUNDLE_SIMPLE_CONFIGURATOR.equals(modelName)) {
info.setStartLevel(1);
info.setMarkedAsStarted(true);
} else if (IPDEBuildConstants.BUNDLE_EQUINOX_COMMON.equals(modelName)) {
info.setStartLevel(2);
info.setMarkedAsStarted(true);
} else if (IPDEBuildConstants.BUNDLE_OSGI.equals(modelName)) {
info.setStartLevel(-1);
info.setMarkedAsStarted(true);
} else if (IPDEBuildConstants.BUNDLE_CORE_RUNTIME.equals(modelName)) {
info.setStartLevel(refactoredRuntime ? 4 : 2);
info.setMarkedAsStarted(true);
} else if (IPDEBuildConstants.BUNDLE_DS.equals(modelName)) {
info.setStartLevel(2);
info.setMarkedAsStarted(true);
} else {
info.setStartLevel(defaultStartLevel);
info.setMarkedAsStarted(false);
}
}
if (Utils.isSourceBundle(desc))
sourceInfos.add(info);
else
bundleInfos.add(info);
}
}
File bundlesTxt = new File(directory, SimpleConfiguratorManipulator.BUNDLES_INFO_PATH);
File srcBundlesTxt = new File(directory, SimpleConfiguratorManipulator.SOURCE_INFO_PATH);
File base = directory.getParentFile();
BundleInfo[] infos = bundleInfos.toArray(new BundleInfo[bundleInfos.size()]);
BundleInfo[] sources = sourceInfos.toArray(new BundleInfo[sourceInfos.size()]);
SimpleConfiguratorManipulator manipulator = BundleHelper.getDefault().acquireService(SimpleConfiguratorManipulator.class);
try {
manipulator.saveConfiguration(infos, bundlesTxt, base.toURI());
manipulator.saveConfiguration(sources, srcBundlesTxt, base.toURI());
} catch (IOException e) {
return null;
}
return bundlesTxt;
}
}