com.signalfx.shaded.jetty.util.ModuleLocation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of signalfx-java Show documentation
Show all versions of signalfx-java Show documentation
Bare minimum core library needed to sending metrics to SignalFx from Java clients
The newest version!
//
// ========================================================================
// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package com.signalfx.shaded.jetty.util;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Optional;
import java.util.function.Function;
import com.signalfx.shaded.jetty.util.log.Log;
import com.signalfx.shaded.jetty.util.log.Logger;
import static java.lang.invoke.MethodType.methodType;
/**
* Equivalent of ...
*
*
* Module module = clazz.getModule();
* if (module != null)
* {
* Configuration configuration = module.getLayer().configuration();
* Optional resolvedModule = configuration.findModule(module.getName());
* if (resolvedModule.isPresent())
* {
* ModuleReference moduleReference = resolvedModule.get().reference();
* Optional location = moduleReference.location();
* if (location.isPresent())
* {
* return location.get();
* }
* }
* }
* return null;
*
*
* In Jetty 10, this entire class can be moved to direct calls to java.lang.Module in TypeUtil.getModuleLocation()
*/
class ModuleLocation implements Function, URI>
{
private static final Logger LOG = Log.getLogger(ModuleLocation.class);
private final Class> classModule;
private final MethodHandle handleGetModule;
private final MethodHandle handleGetLayer;
private final MethodHandle handleConfiguration;
private final MethodHandle handleGetName;
private final MethodHandle handleOptionalResolvedModule;
private final MethodHandle handleReference;
private final MethodHandle handleLocation;
public ModuleLocation()
{
MethodHandles.Lookup lookup = MethodHandles.lookup();
ClassLoader loader = ClassLoader.getSystemClassLoader();
try
{
classModule = loader.loadClass("java.lang.Module");
handleGetModule = lookup.findVirtual(Class.class, "getModule", methodType(classModule));
Class> classLayer = loader.loadClass("java.lang.ModuleLayer");
handleGetLayer = lookup.findVirtual(classModule, "getLayer", methodType(classLayer));
Class> classConfiguration = loader.loadClass("java.lang.module.Configuration");
handleConfiguration = lookup.findVirtual(classLayer, "configuration", methodType(classConfiguration));
handleGetName = lookup.findVirtual(classModule, "getName", methodType(String.class));
Method findModuleMethod = classConfiguration.getMethod("findModule", String.class);
handleOptionalResolvedModule = lookup.findVirtual(classConfiguration, "findModule", methodType(findModuleMethod.getReturnType(), String.class));
Class> classResolvedModule = loader.loadClass("java.lang.module.ResolvedModule");
Class> classReference = loader.loadClass("java.lang.module.ModuleReference");
handleReference = lookup.findVirtual(classResolvedModule, "reference", methodType(classReference));
Method locationMethod = classReference.getMethod("location");
handleLocation = lookup.findVirtual(classReference, "location", methodType(locationMethod.getReturnType()));
}
catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e)
{
throw new UnsupportedOperationException("Not supported on this runtime", e);
}
}
@Override
public URI apply(Class> clazz)
{
try
{
// Module module = clazz.getModule();
Object module = handleGetModule.invoke(clazz);
if (module == null)
{
return null;
}
// ModuleLayer layer = module.getLayer();
Object layer = handleGetLayer.invoke(module);
if (layer == null)
{
return null;
}
// Configuration configuration = layer.configuration();
Object configuration = handleConfiguration.invoke(layer);
if (configuration == null)
{
return null;
}
// String moduleName = module.getName();
String moduleName = (String)handleGetName.invoke(module);
if (moduleName == null)
{
return null;
}
// Optional optionalResolvedModule = configuration.findModule(moduleName);
Optional> optionalResolvedModule = (Optional>)handleOptionalResolvedModule.invoke(configuration, moduleName);
if (!optionalResolvedModule.isPresent())
{
return null;
}
// ResolveModule resolved = optionalResolvedModule.get();
Object resolved = optionalResolvedModule.get();
// ModuleReference moduleReference = resolved.reference();
Object moduleReference = handleReference.invoke(resolved);
// Optional location = moduleReference.location();
Optional location = (Optional)handleLocation.invoke(moduleReference);
if (location != null || location.isPresent())
{
return location.get();
}
}
catch (Throwable ignored)
{
if (LOG.isDebugEnabled())
{
LOG.ignore(ignored);
}
}
return null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy