- package io.jvz.eclipse;
- /*******************************************************************************
- * Copyright (c) 2010-2011 Jason van Zyl
- * 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
- *******************************************************************************/
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.Writer;
- import java.util.List;
- import java.util.Properties;
- import org.apache.maven.model.Dependency;
- import org.apache.maven.model.Model;
- import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
- import org.codehaus.plexus.component.annotations.Component;
- import org.codehaus.plexus.component.annotations.Requirement;
- import org.codehaus.plexus.logging.Logger;
- import org.codehaus.plexus.util.FileUtils;
- import org.eclipse.osgi.service.resolver.BundleDescription;
- import org.eclipse.osgi.service.resolver.State;
- import org.eclipse.osgi.service.resolver.StateObjectFactory;
- import org.eclipse.tycho.core.TargetEnvironment;
- import org.eclipse.tycho.core.osgitools.EquinoxResolver;
- import org.eclipse.tycho.core.osgitools.targetplatform.EclipseInstallationLayout;
- import org.eclipse.tycho.core.utils.ExecutionEnvironmentUtils;
- import org.eclipse.tycho.core.utils.PlatformPropertiesUtils;
- import org.osgi.framework.BundleException;
- import copied.org.eclipse.tycho.core.osgitools.DependencyComputer;
- import copied.org.eclipse.tycho.core.osgitools.DependencyComputer.DependencyEntry;
- @Component(role = EclipseInstallationToMavenRepositoryConverter.class)
- public class DefaultEclipseInstallationToMavenRepositoryConverter implements EclipseInstallationToMavenRepositoryConverter {
- @Requirement
- private Logger logger;
- @Requirement
- private EclipseInstallationLayout eclipseInstallation;
- @Requirement
- private EquinoxResolver resolver;
- @Requirement
- private DependencyComputer dependencyComputer;
- @Requirement(hint="eclipse")
- private GroupIdSynthesizer groupIdSynthesizer;
- @Requirement(hint="eclipse")
- private ArtifactIdSynthesizer artifactIdSynthesizer;
- @Requirement(hint="eclipse")
- private VersionSynthesizer versionSynthesizer;
- private static StateObjectFactory factory = StateObjectFactory.defaultFactory;
- public static final String SYSTEM_BUNDLE_SYMBOLIC_NAME = "system.bundle";
- public void convert(File eclipseInstallationLocation, File mavenRepository) throws BundleException {
- eclipseInstallation.setLocation(eclipseInstallationLocation);
- Properties properties = getPlatformProperties(new Properties(), null);
- State state = factory.createState(true);
- state.setPlatformProperties(properties);
- long id = 1;
- for (File bundle : eclipseInstallation.getPlugins(eclipseInstallationLocation)) {
- logger.debug("Adding: " + bundle);
- resolver.addBundle(state, id++, bundle, false);
- }
- state.resolve();
- BundleDescription[] bundles = state.getBundles();
- logger.info("Number of bundles: " + bundles.length);
- MavenXpp3Writer mavenWriter = new MavenXpp3Writer();
- for (BundleDescription bundleDescription : bundles) {
- //
- // Right now we will only deal with bundles that are in the form of JARS. I'm not sure how to deal with
- // bundles that are in exploded form.
- //
- File bundleLocation = new File(bundleDescription.getLocation());
- if(bundleLocation.isDirectory()) {
- continue;
- }
- Model model = createMavenModel(state, bundleDescription);
- try {
- // groupId = org.eclipse.ant
- // artifactId = org.eclipse.ant.core
- // version = 1.0.0
- //
- // org/eclipse/ant/org.eclilpse.ant.core/1.0.0/org.eclipse.ant.core-1.0.0.pom
- //
- String baseName = model.getArtifactId() + "-" + model.getVersion();
- File baseDirectory = new File(mavenRepository, model.getGroupId().replace('.', '/') + '/' + model.getArtifactId() + '/' + model.getVersion());
- if (!baseDirectory.exists()) {
- baseDirectory.mkdirs();
- }
- File modelFile = new File(baseDirectory, baseName + ".pom");
- File artifactFile = new File(baseDirectory, baseName + ".jar");
- //
- // Write out the POM
- //
- Writer writer = new FileWriter(modelFile);
- mavenWriter.write(writer, model);
- //
- // Write out the artifact
- //
- FileUtils.copyFile(bundleLocation, artifactFile);
- } catch (IOException e) {
- logger.error("Error: "+e.getMessage());
- }
- }
- }
- private Model createMavenModel(State state, BundleDescription bd) {
- Model model = createModel(bd);
- List<DependencyEntry> bundleDependencies = dependencyComputer.computeDependencies(state.getStateHelper(), bd, true);
- for (DependencyEntry d : bundleDependencies) {
- model.addDependency(dependency(d.desc));
- }
- return model;
- }
- protected Model createModel(BundleDescription bd) {
- Model model = new Model();
- model.setModelVersion("4.0.0");
- model.setGroupId(groupIdSynthesizer.convert(bd.getSymbolicName()));
- model.setArtifactId(artifactIdSynthesizer.convert(bd.getSymbolicName()));
- model.setVersion(versionSynthesizer.convert(bd.getVersion().toString()));
- return model;
- }
- protected Dependency dependency(BundleDescription bd) {
- Dependency d = new Dependency();
- d.setGroupId(groupIdSynthesizer.convert(bd.getSymbolicName()));
- d.setArtifactId(artifactIdSynthesizer.convert(bd.getSymbolicName()));
- d.setVersion(versionSynthesizer.convert(bd.getVersion().toString()));
- return d;
- }
- //
- //
- //
- protected Properties getPlatformProperties(Properties properties, TargetEnvironment environment) {
- if (environment != null) {
- properties.put(PlatformPropertiesUtils.OSGI_OS, environment.getOs());
- properties.put(PlatformPropertiesUtils.OSGI_WS, environment.getWs());
- properties.put(PlatformPropertiesUtils.OSGI_ARCH, environment.getArch());
- }
- ExecutionEnvironmentUtils.loadVMProfile(properties);
- //
- // Put Equinox OSGi resolver into development mode.
- // See http://www.nabble.com/Re:-resolving-partially-p18449054.html
- //
- properties.put(org.eclipse.osgi.framework.internal.core.Constants.OSGI_RESOLVER_MODE, org.eclipse.osgi.framework.internal.core.Constants.DEVELOPMENT_MODE);
- return properties;
- }
- }