Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for API Tools Annotations to Tycho #3035

Merged
merged 1 commit into from
Nov 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,25 @@ If you are reading this in the browser, then you can quickly jump to specific ve

## 5.0.0 (under development)

### support for PDE Api Tools Annotations

Tycho now supports PDE Api Tools Annotations to be added to the project automatically.

To enable this add

```xml
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-apitools-plugin</artifactId>
<version>${tycho-version}</version>
</plugin>
```

to your project and make sure it has the `org.eclipse.pde.api.tools.apiAnalysisNature` nature enabled in the `.project` file, for details how to use these see:

- https://help.eclipse.org/latest/topic/org.eclipse.pde.doc.user/reference/api-tooling/api_javadoc_tags.htm
- https://help.eclipse.org/latest/topic/org.eclipse.pde.doc.user/reference/api/org/eclipse/pde/api/tools/annotations/package-summary.html

### new tycho-repository-plugin

Tycho now contains a new `tycho-repository-plugin` that can be used to package OSGi repositories.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public void execute() throws MojoExecutionException, MojoFailureException {
}
Optional<EclipseProject> eclipseProject = projectManager.getEclipseProject(project);
if (eclipseProject.isEmpty()
|| !eclipseProject.get().hasNature("org.eclipse.pde.api.tools.apiAnalysisNature")) {
|| !eclipseProject.get().hasNature(ApiPlugin.NATURE_ID)) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*******************************************************************************
* Copyright (c) 2023 Christoph Läubrich 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:
* Christoph Läubrich - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.apitools;

import java.util.Optional;

import javax.inject.Inject;

import org.apache.maven.SessionScoped;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.tycho.classpath.ClasspathContributor;
import org.eclipse.tycho.core.TychoProjectManager;
import org.eclipse.tycho.core.osgitools.AbstractSpecificationClasspathContributor;
import org.eclipse.tycho.model.project.EclipseProject;
import org.osgi.framework.VersionRange;

@Component(role = ClasspathContributor.class, hint = "apitools-annotations")
@SessionScoped
public class ApiAnnotationsClasspathContributor extends AbstractSpecificationClasspathContributor {

private static final String PACKAGE_NAME = "org.eclipse.pde.api.tools.annotations";
private static final String GROUP_ID = "org.eclipse.pde";
private static final String ARTIFACT_ID = "org.eclipse.pde.api.tools.annotations";
private static final VersionRange VERSION = new VersionRange("[1,2)");
private TychoProjectManager projectManager;

@Inject
public ApiAnnotationsClasspathContributor(MavenSession session, TychoProjectManager projectManager) {
super(session, PACKAGE_NAME, GROUP_ID, ARTIFACT_ID);
this.projectManager = projectManager;
}

@Override
protected VersionRange getSpecificationVersion(MavenProject project) {
return VERSION;
}

@Override
protected boolean isValidProject(MavenProject project) {
Optional<EclipseProject> eclipseProject = projectManager.getEclipseProject(project);
if (eclipseProject.isPresent()) {
return eclipseProject.get().hasNature(ApiPlugin.NATURE_ID);
}
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,24 @@ protected AbstractSpecificationClasspathContributor(MavenSession session, String

@Override
public final List<ClasspathEntry> getAdditionalClasspathEntries(MavenProject project, String scope) {
VersionRange specificationVersion = getSpecificationVersion(project);
Optional<ResolvedArtifactKey> mavenBundle = findBundle(project, specificationVersion);
if (mavenBundle.isPresent()) {
ResolvedArtifactKey resolved = mavenBundle.get();
logger.debug("Resolved " + packageName + " to " + resolved.getId() + " " + resolved.getVersion() + " @ "
+ resolved.getLocation());
return List.of(new DefaultClasspathEntry(resolved, List.of(accessRule)));
if (isValidProject(project)) {
VersionRange specificationVersion = getSpecificationVersion(project);
Optional<ResolvedArtifactKey> mavenBundle = findBundle(project, specificationVersion);
if (mavenBundle.isPresent()) {
ResolvedArtifactKey resolved = mavenBundle.get();
logger.debug("Resolved " + packageName + " to " + resolved.getId() + " " + resolved.getVersion() + " @ "
+ resolved.getLocation());
return List.of(new DefaultClasspathEntry(resolved, List.of(accessRule)));
}
logger.warn("Cannot resolve specification package " + packageName + ", classpath might be incomplete");
}
logger.warn("Cannot resolve specification package " + packageName + ", classpath might be incomplete");
return Collections.emptyList();
}

protected boolean isValidProject(MavenProject project) {
return true;
}

protected Optional<ResolvedArtifactKey> findBundle(MavenProject project, VersionRange specificationVersion) {
Optional<ResolvedArtifactKey> mavenBundle = mavenBundleResolver.resolveMavenBundle(project, session,
MavenArtifactKey.of(PublisherHelper.CAPABILITY_NS_JAVA_PACKAGE, packageName,
Expand Down
7 changes: 7 additions & 0 deletions tycho-its/projects/api-tools/annotations/.classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src/"/>
<classpathentry kind="output" path="bin"/>
</classpath>
34 changes: 34 additions & 0 deletions tycho-its/projects/api-tools/annotations/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>api-bundle-2</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
</natures>
</projectDescription>
8 changes: 8 additions & 0 deletions tycho-its/projects/api-tools/annotations/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Plugin with API
Bundle-SymbolicName: api-bundle-2
Bundle-Version: 0.0.1.qualifier
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=11))"
Export-Package: bundle
Automatic-Module-Name: bundle
4 changes: 4 additions & 0 deletions tycho-its/projects/api-tools/annotations/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = .,\
META-INF/
23 changes: 23 additions & 0 deletions tycho-its/projects/api-tools/annotations/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.tycho.tycho-its</groupId>
<artifactId>api-bundle-2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>${tycho-version}</version>
<extensions>true</extensions>
</plugin>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-apitools-plugin</artifactId>
<version>${tycho-version}</version>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package bundle;

import org.eclipse.pde.api.tools.annotations.NoExtend;

@NoExtend
public interface ApiInterface2 {

void sayHello();

}
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,11 @@ public void testSingleJar() throws Exception {
verifier.executeGoals(List.of("clean", "verify"));
verifier.verifyErrorFreeLog();
}

@Test
public void testAnnotations() throws Exception {
Verifier verifier = getVerifier("api-tools/annotations", true, true);
verifier.executeGoals(List.of("clean", "verify"));
verifier.verifyErrorFreeLog();
}
}
Loading