summaryrefslogtreecommitdiffstats
path: root/container-di/src/main/scala/com/yahoo/container/di/osgi/OsgiUtil.scala
diff options
context:
space:
mode:
Diffstat (limited to 'container-di/src/main/scala/com/yahoo/container/di/osgi/OsgiUtil.scala')
-rw-r--r--container-di/src/main/scala/com/yahoo/container/di/osgi/OsgiUtil.scala143
1 files changed, 0 insertions, 143 deletions
diff --git a/container-di/src/main/scala/com/yahoo/container/di/osgi/OsgiUtil.scala b/container-di/src/main/scala/com/yahoo/container/di/osgi/OsgiUtil.scala
deleted file mode 100644
index 3769eed6d2d..00000000000
--- a/container-di/src/main/scala/com/yahoo/container/di/osgi/OsgiUtil.scala
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.container.di.osgi
-
-import java.nio.file.{Files, Path, Paths}
-import java.util.function.Predicate
-import java.util.jar.{JarEntry, JarFile}
-import java.util.logging.{Level, Logger}
-import java.util.stream.Collectors
-
-import com.google.common.io.Files.fileTreeTraverser
-import com.yahoo.component.ComponentSpecification
-import com.yahoo.container.di.Osgi.RelativePath
-import com.yahoo.osgi.maven.ProjectBundleClassPaths
-import com.yahoo.osgi.maven.ProjectBundleClassPaths.BundleClasspathMapping
-import org.osgi.framework.Bundle
-import org.osgi.framework.wiring.BundleWiring
-
-import scala.collection.JavaConverters._
-
-/**
- * Tested by com.yahoo.application.container.jersey.JerseyTest
- * @author Tony Vaagenes
- */
-object OsgiUtil {
- private val log = Logger.getLogger(getClass.getName)
- private val classFileTypeSuffix = ".class"
-
- def getClassEntriesInBundleClassPath(bundle: Bundle, packagesToScan: Set[String]) = {
- val bundleWiring = bundle.adapt(classOf[BundleWiring])
-
- def listClasses(path: String, recurse: Boolean): Iterable[RelativePath] = {
- val options =
- if (recurse) BundleWiring.LISTRESOURCES_LOCAL | BundleWiring.LISTRESOURCES_RECURSE
- else BundleWiring.LISTRESOURCES_LOCAL
-
- bundleWiring.listResources(path, "*" + classFileTypeSuffix, options).asScala
- }
-
- if (packagesToScan.isEmpty) listClasses("/", recurse = true)
- else packagesToScan flatMap { packageName => listClasses(packageToPath(packageName), recurse = false) }
- }
-
- def getClassEntriesForBundleUsingProjectClassPathMappings(classLoader: ClassLoader,
- bundleSpec: ComponentSpecification,
- packagesToScan: Set[String]) = {
- classEntriesFrom(
- bundleClassPathMapping(bundleSpec, classLoader).classPathElements.asScala.toList,
- packagesToScan)
- }
-
- private def bundleClassPathMapping(bundleSpec: ComponentSpecification,
- classLoader: ClassLoader): BundleClasspathMapping = {
-
- val projectBundleClassPaths = loadProjectBundleClassPaths(classLoader)
-
- if (projectBundleClassPaths.mainBundle.bundleSymbolicName == bundleSpec.getName) {
- projectBundleClassPaths.mainBundle
- } else {
- log.log(Level.WARNING, s"Dependencies of the bundle $bundleSpec will not be scanned. Please file a feature request if you need this" )
- matchingBundleClassPathMapping(bundleSpec, projectBundleClassPaths.providedDependencies.asScala.toList)
- }
- }
-
- def matchingBundleClassPathMapping(bundleSpec: ComponentSpecification,
- providedBundlesClassPathMappings: List[BundleClasspathMapping]): BundleClasspathMapping = {
- providedBundlesClassPathMappings.
- find(_.bundleSymbolicName == bundleSpec.getName).
- getOrElse(throw new RuntimeException("No such bundle: " + bundleSpec))
- }
-
- private def loadProjectBundleClassPaths(classLoader: ClassLoader): ProjectBundleClassPaths = {
- val classPathMappingsFileLocation = classLoader.getResource(ProjectBundleClassPaths.CLASSPATH_MAPPINGS_FILENAME)
- if (classPathMappingsFileLocation == null)
- throw new RuntimeException(s"Couldn't find ${ProjectBundleClassPaths.CLASSPATH_MAPPINGS_FILENAME} in the class path.")
-
- ProjectBundleClassPaths.load(Paths.get(classPathMappingsFileLocation.toURI))
- }
-
- private def classEntriesFrom(classPathEntries: List[String], packagesToScan: Set[String]): Iterable[RelativePath] = {
- val packagePathsToScan = packagesToScan map packageToPath
-
- classPathEntries.flatMap { entry =>
- val path = Paths.get(entry)
- if (Files.isDirectory(path)) classEntriesInPath(path, packagePathsToScan)
- else if (Files.isRegularFile(path) && path.getFileName.toString.endsWith(".jar")) classEntriesInJar(path, packagePathsToScan)
- else throw new RuntimeException("Unsupported path " + path + " in the class path")
- }
- }
-
- private def classEntriesInPath(rootPath: Path, packagePathsToScan: Traversable[String]): Traversable[RelativePath] = {
- def relativePathToClass(pathToClass: Path): RelativePath = {
- val relativePath = rootPath.relativize(pathToClass)
- relativePath.toString
- }
-
- val fileIterator =
- if (packagePathsToScan.isEmpty) fileTreeTraverser().preOrderTraversal(rootPath.toFile).asScala
- else packagePathsToScan.view flatMap { packagePath => fileTreeTraverser().children(rootPath.resolve(packagePath).toFile).asScala }
-
- for {
- file <- fileIterator
- if file.isFile
- if file.getName.endsWith(classFileTypeSuffix)
- } yield relativePathToClass(file.toPath)
- }
-
-
- private def classEntriesInJar(jarPath: Path, packagePathsToScan: Set[String]): Traversable[RelativePath] = {
- def packagePath(name: String) = {
- name.lastIndexOf('/') match {
- case -1 => name
- case n => name.substring(0, n)
- }
- }
-
- val acceptedPackage: Predicate[String] =
- if (packagePathsToScan.isEmpty) (name: String) => true
- else (name: String) => packagePathsToScan(packagePath(name))
-
- var jarFile: JarFile = null
- try {
- jarFile = new JarFile(jarPath.toFile)
- jarFile.stream().
- map[String] { entry: JarEntry => entry.getName}.
- filter { name: String => name.endsWith(classFileTypeSuffix)}.
- filter(acceptedPackage).
- collect(Collectors.toList()).
- asScala
- } finally {
- if (jarFile != null) jarFile.close()
- }
- }
-
- def packageToPath(packageName: String) = packageName.replaceAllLiterally(".", "/")
-
- implicit class JavaPredicate[T](f: T => Boolean) extends Predicate[T] {
- override def test(t: T): Boolean = f(t)
- }
-
- implicit class JavaFunction[T, R](f: T => R) extends java.util.function.Function[T, R] {
- override def apply(t: T): R = f(t)
- }
-}