| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |