blob: 5c18df9e4f79874f63316234fb900325c862f981 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Sonatype Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sonatype Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.osgi.runtime;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.apache.maven.MavenExecutionException;
import org.apache.maven.artifact.Artifact;
import org.codehaus.plexus.util.IOUtil;
import org.eclipse.sisu.equinox.embedder.EquinoxRuntimeLocator.EquinoxRuntimeDescription;
import org.eclipse.tycho.dev.DevBundleInfo;
import org.eclipse.tycho.dev.DevWorkspaceResolver;
import org.eclipse.tycho.model.BundleConfiguration;
import org.eclipse.tycho.model.PluginRef;
import org.eclipse.tycho.model.ProductConfiguration;
class WorkspaceTychoOsgiRuntimeLocator {
private final DevWorkspaceResolver workspaceState;
private final File stateLocation;
/**
* dev.properties entries of bundles resolved by this resolver instance.
*/
private Properties deventries = new Properties();
private WorkspaceTychoOsgiRuntimeLocator(DevWorkspaceResolver workspaceState) {
this.workspaceState = workspaceState;
stateLocation = workspaceState.getStateLocation();
}
public boolean addProduct(EquinoxRuntimeDescription result, Artifact pom) throws MavenExecutionException {
ProductConfiguration product;
try {
product = ProductConfiguration.read(new File(pom.getFile().getParentFile(), pom.getArtifactId()
+ ".product"));
} catch (IOException e) {
return false;
}
// the above fails with IOException if .product file is not available or can't be read
// we get here only when we have valid product instance
Set<String> missing = new LinkedHashSet<>();
for (PluginRef pluginRef : product.getPlugins()) {
DevBundleInfo bundleInfo = workspaceState.getBundleInfo(pluginRef.getId(), pluginRef.getVersion());
if (bundleInfo != null) {
addBundle(result, bundleInfo);
} else {
missing.add(pluginRef.toString());
}
}
if (!missing.isEmpty()) {
throw new MavenExecutionException("Inconsistent m2e-tycho workspace state, missing bundles: "
+ missing.toString(), (Throwable) null);
}
Map<String, BundleConfiguration> bundleConfigurations = product.getPluginConfiguration();
if (bundleConfigurations != null) {
for (BundleConfiguration bundleConfiguration : bundleConfigurations.values()) {
result.addBundleStartLevel(bundleConfiguration.getId(), bundleConfiguration.getStartLevel(),
bundleConfiguration.isAutoStart());
}
}
return true;
}
public static WorkspaceTychoOsgiRuntimeLocator getResolver(DevWorkspaceResolver workspaceResolver) {
if (workspaceResolver.getStateLocation() == null) {
return null;
}
return new WorkspaceTychoOsgiRuntimeLocator(workspaceResolver);
}
public boolean addBundle(EquinoxRuntimeDescription result, Artifact pom) {
DevBundleInfo bundleInfo = workspaceState.getBundleInfo(pom.getFile().getParentFile());
if (bundleInfo == null) {
return false;
}
addBundle(result, bundleInfo);
return true;
}
private void addBundle(EquinoxRuntimeDescription result, DevBundleInfo bundleInfo) {
result.addBundle(bundleInfo.getLocation());
if (bundleInfo.getDevEntries() != null) {
this.deventries.put(bundleInfo.getSymbolicName(), bundleInfo.getDevEntries());
}
}
public void addPlatformProperties(EquinoxRuntimeDescription result) throws MavenExecutionException {
result.addPlatformProperty("osgi.install.area", stateLocation.getAbsolutePath());
File devproperties = new File(stateLocation, "dev.properties");
try {
OutputStream os = new BufferedOutputStream(new FileOutputStream(devproperties));
try {
deventries.store(os, null);
} finally {
IOUtil.close(os);
}
result.addPlatformProperty("osgi.dev", devproperties.toURI().toURL().toExternalForm());
} catch (IOException e) {
throw new MavenExecutionException("Could not write dev.properties", e);
}
}
}