Fix Restlet v2 `Message#getAttributes` calls (#6796)

Fixes #6563
This commit is contained in:
Mateusz Rzeszutek 2022-10-05 22:29:05 +02:00 committed by GitHub
parent d9eff461d8
commit 0e84d10e58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 34 deletions

View File

@ -132,26 +132,6 @@ tasks.register("printMuzzleReferences") {
} }
} }
val projectRepositories = mutableListOf<RemoteRepository>().apply {
// Manually add mavenCentral until https://github.com/gradle/gradle/issues/17295
// Adding mavenLocal is much more complicated but hopefully isn't required for normal usage of
// Muzzle.
add(
RemoteRepository.Builder(
"MavenCentral", "default", "https://repo.maven.apache.org/maven2/")
.build())
for (repository in repositories) {
if (repository is MavenArtifactRepository) {
add(
RemoteRepository.Builder(
repository.getName(),
"default",
repository.url.toString())
.build())
}
}
}.toList()
val hasRelevantTask = gradle.startParameter.taskNames.any { val hasRelevantTask = gradle.startParameter.taskNames.any {
// removing leading ':' if present // removing leading ':' if present
val taskName = it.removePrefix(":") val taskName = it.removePrefix(":")
@ -167,18 +147,21 @@ if (hasRelevantTask) {
afterEvaluate { afterEvaluate {
var runAfter = muzzle var runAfter = muzzle
// the project repositories need to be retrieved after evaluation, before that the list is just empty
val projectRepositories = getProjectRepositories(project)
for (muzzleDirective in muzzleConfig.directives.get()) { for (muzzleDirective in muzzleConfig.directives.get()) {
logger.info("configured ${muzzleDirective}") logger.info("configured $muzzleDirective")
if (muzzleDirective.coreJdk.get()) { if (muzzleDirective.coreJdk.get()) {
runAfter = addMuzzleTask(muzzleDirective, null, runAfter) runAfter = addMuzzleTask(muzzleDirective, null, runAfter)
} else { } else {
for (singleVersion in muzzleDirectiveToArtifacts(muzzleDirective, system, session)) { for (singleVersion in muzzleDirectiveToArtifacts(muzzleDirective, system, session, projectRepositories)) {
runAfter = addMuzzleTask(muzzleDirective, singleVersion, runAfter) runAfter = addMuzzleTask(muzzleDirective, singleVersion, runAfter)
} }
if (muzzleDirective.assertInverse.get()) { if (muzzleDirective.assertInverse.get()) {
for (inverseDirective in inverseOf(muzzleDirective, system, session)) { for (inverseDirective in inverseOf(muzzleDirective, system, session, projectRepositories)) {
for (singleVersion in muzzleDirectiveToArtifacts(inverseDirective, system, session)) { for (singleVersion in muzzleDirectiveToArtifacts(inverseDirective, system, session, projectRepositories)) {
runAfter = addMuzzleTask(inverseDirective, singleVersion, runAfter) runAfter = addMuzzleTask(inverseDirective, singleVersion, runAfter)
} }
} }
@ -188,6 +171,18 @@ if (hasRelevantTask) {
} }
} }
fun getProjectRepositories(project: Project): List<RemoteRepository> {
return project.repositories
.filterIsInstance<MavenArtifactRepository>()
.map {
RemoteRepository.Builder(
it.name,
"default",
it.url.toString())
.build()
}
}
fun createInstrumentationClassloader(): ClassLoader { fun createInstrumentationClassloader(): ClassLoader {
logger.info("Creating instrumentation class loader for: $path") logger.info("Creating instrumentation class loader for: $path")
val muzzleShadowJar = shadowModule.get().archiveFile.get() val muzzleShadowJar = shadowModule.get().archiveFile.get()
@ -309,7 +304,7 @@ fun createClassLoaderForTask(muzzleTaskConfiguration: Configuration): ClassLoade
return classpathLoader(muzzleTaskConfiguration + files(muzzleBootstrapShadowJar), ClassLoader.getPlatformClassLoader()) return classpathLoader(muzzleTaskConfiguration + files(muzzleBootstrapShadowJar), ClassLoader.getPlatformClassLoader())
} }
fun inverseOf(muzzleDirective: MuzzleDirective, system: RepositorySystem, session: RepositorySystemSession): Set<MuzzleDirective> { fun inverseOf(muzzleDirective: MuzzleDirective, system: RepositorySystem, session: RepositorySystemSession, repos: List<RemoteRepository>): Set<MuzzleDirective> {
val inverseDirectives = mutableSetOf<MuzzleDirective>() val inverseDirectives = mutableSetOf<MuzzleDirective>()
val allVersionsArtifact = DefaultArtifact( val allVersionsArtifact = DefaultArtifact(
@ -325,7 +320,6 @@ fun inverseOf(muzzleDirective: MuzzleDirective, system: RepositorySystem, sessio
"jar", "jar",
muzzleDirective.versions.get()) muzzleDirective.versions.get())
val repos = projectRepositories
val allRangeRequest = VersionRangeRequest().apply { val allRangeRequest = VersionRangeRequest().apply {
repositories = repos repositories = repos
artifact = allVersionsArtifact artifact = allVersionsArtifact
@ -374,7 +368,7 @@ fun filterVersions(range: VersionRangeResult, skipVersions: Set<String>) = seque
} }
}.distinct().take(RANGE_COUNT_LIMIT) }.distinct().take(RANGE_COUNT_LIMIT)
fun muzzleDirectiveToArtifacts(muzzleDirective: MuzzleDirective, system: RepositorySystem, session: RepositorySystemSession) = sequence<Artifact> { fun muzzleDirectiveToArtifacts(muzzleDirective: MuzzleDirective, system: RepositorySystem, session: RepositorySystemSession, repos: List<RemoteRepository>) = sequence<Artifact> {
val directiveArtifact: Artifact = DefaultArtifact( val directiveArtifact: Artifact = DefaultArtifact(
muzzleDirective.group.get(), muzzleDirective.group.get(),
muzzleDirective.module.get(), muzzleDirective.module.get(),
@ -383,7 +377,7 @@ fun muzzleDirectiveToArtifacts(muzzleDirective: MuzzleDirective, system: Reposit
muzzleDirective.versions.get()) muzzleDirective.versions.get())
val rangeRequest = VersionRangeRequest().apply { val rangeRequest = VersionRangeRequest().apply {
repositories = projectRepositories repositories = repos
artifact = directiveArtifact artifact = directiveArtifact
} }
val rangeResult = system.resolveVersionRange(session, rangeRequest) val rangeResult = system.resolveVersionRange(session, rangeRequest)

View File

@ -6,7 +6,9 @@ muzzle {
pass { pass {
group.set("org.restlet") group.set("org.restlet")
module.set("org.restlet") module.set("org.restlet")
versions.set("[1.0.0, 1.2-M1)") // TODO: rename this module to restlet-1.1
versions.set("[1.1.0, 1.2-M1)")
extraDependency("com.noelios.restlet:com.noelios.restlet")
assertInverse.set(true) assertInverse.set(true)
} }
} }

View File

@ -4,8 +4,8 @@ plugins {
muzzle { muzzle {
pass { pass {
group.set("org.restlet") group.set("org.restlet.jse")
module.set("org.restlet.jse") module.set("org.restlet")
versions.set("[2.0.0,)") versions.set("[2.0.0,)")
assertInverse.set(true) assertInverse.set(true)
} }

View File

@ -5,25 +5,67 @@
package io.opentelemetry.instrumentation.restlet.v2_0.internal; package io.opentelemetry.instrumentation.restlet.v2_0.internal;
import static java.util.Collections.emptySet;
import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapGetter;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import javax.annotation.Nullable;
import org.restlet.Message; import org.restlet.Message;
import org.restlet.Request; import org.restlet.Request;
import org.restlet.util.Series; import org.restlet.util.Series;
final class RestletHeadersGetter implements TextMapGetter<Request> { final class RestletHeadersGetter implements TextMapGetter<Request> {
private static final MethodHandle GET_ATTRIBUTES;
static {
MethodHandle getAttributes = null;
MethodHandles.Lookup lookup = MethodHandles.lookup();
try {
getAttributes =
lookup.findVirtual(Message.class, "getAttributes", MethodType.methodType(Map.class));
} catch (NoSuchMethodException | IllegalAccessException e) {
// changed the return type to ConcurrentMap in version 2.1
try {
getAttributes =
lookup.findVirtual(
Message.class, "getAttributes", MethodType.methodType(ConcurrentMap.class));
} catch (NoSuchMethodException | IllegalAccessException ex) {
// ignored
}
}
GET_ATTRIBUTES = getAttributes;
}
@Override @Override
public Iterable<String> keys(Request carrier) { public Iterable<String> keys(Request carrier) {
return getHeaders(carrier).getNames(); Series<?> headers = getHeaders(carrier);
return headers == null ? emptySet() : headers.getNames();
} }
@Override @Override
public String get(Request carrier, String key) { public String get(Request carrier, String key) {
Series<?> headers = getHeaders(carrier); Series<?> headers = getHeaders(carrier);
return headers.getFirstValue(key, /* ignoreCase = */ true); return headers == null ? null : headers.getFirstValue(key, /* ignoreCase = */ true);
} }
@SuppressWarnings("unchecked")
@Nullable
static Series<?> getHeaders(Message carrier) { static Series<?> getHeaders(Message carrier) {
return (Series<?>) carrier.getAttributes().get("org.restlet.http.headers"); if (GET_ATTRIBUTES == null) {
return null;
}
try {
Map<String, Object> attributes = (Map<String, Object>) GET_ATTRIBUTES.invoke(carrier);
return (Series<?>) attributes.get("org.restlet.http.headers");
} catch (Throwable e) {
return null;
}
} }
} }