diff options
Diffstat (limited to 'bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis')
12 files changed, 0 insertions, 493 deletions
diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/Analyze.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/Analyze.scala deleted file mode 100644 index 2f2d034679d..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/Analyze.scala +++ /dev/null @@ -1,28 +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.plugin.classanalysis - -import org.objectweb.asm._ -import java.io.{InputStream, File} -import com.yahoo.container.plugin.util.IO.withFileInputStream - -/** - * Main entry point for class analysis - * @author tonytv - */ -object Analyze { - def analyzeClass(classFile : File) : ClassFileMetaData = { - try { - withFileInputStream(classFile) { fileInputStream => - analyzeClass(fileInputStream) - } - } catch { - case e : RuntimeException => throw new RuntimeException("An error occurred when analyzing " + classFile.getPath, e) - } - } - - def analyzeClass(inputStream : InputStream) : ClassFileMetaData = { - val visitor = new AnalyzeClassVisitor() - new ClassReader(inputStream).accept(visitor, ClassReader.SKIP_DEBUG) - visitor.result - } -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.scala deleted file mode 100644 index 539684f2024..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.scala +++ /dev/null @@ -1,102 +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.plugin.classanalysis - -import org.objectweb.asm._ -import com.yahoo.osgi.annotation.{ExportPackage, Version} -import collection.mutable - -/** - * Picks up classes used in class files. - * @author tonytv - */ -private class AnalyzeClassVisitor extends ClassVisitor(Opcodes.ASM6) with AnnotationVisitorTrait with AttributeVisitorTrait { - private var name : String = null - protected val imports : ImportsSet = mutable.Set() - protected var exportPackageAnnotation: Option[ExportPackageAnnotation] = None - - - override def visitAttribute(attribute: Attribute): Unit = super.visitAttribute(attribute) - - override def visitMethod(access: Int, name: String, desc: String, signature: String, - exceptions: Array[String]): MethodVisitor = { - - imports ++= (Type.getReturnType(desc) +: Type.getArgumentTypes(desc)).flatMap(getClassName) - - imports ++= Option(exceptions) getOrElse(Array()) flatMap internalNameToClassName - - AnalyzeSignatureVisitor.analyzeMethod(signature, this) - new AnalyzeMethodVisitor(this) - } - - override def visitField(access: Int, name: String, desc: String, signature: String, value: AnyRef): FieldVisitor = { - imports ++= getClassName(Type.getType(desc)).toList - - AnalyzeSignatureVisitor.analyzeField(signature, this) - new FieldVisitor(Opcodes.ASM6) with SubVisitorTrait with AttributeVisitorTrait with AnnotationVisitorTrait { - val analyzeClassVisitor = AnalyzeClassVisitor.this - - override def visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor = super.visitAnnotation(desc, visible) - override def visitAttribute(attribute: Attribute): Unit = super.visitAttribute(attribute) - override def visitEnd(): Unit = super.visitEnd() - } - } - - override def visit(version: Int, access: Int, name: String, signature: String, superName: String, interfaces: Array[String]) { - this.name = internalNameToClassName(name).get - - imports ++= (superName +: interfaces) flatMap internalNameToClassName - AnalyzeSignatureVisitor.analyzeClass(signature, this) - } - - override def visitInnerClass(name: String, outerName: String, innerName: String, access: Int) {} - override def visitOuterClass(owner: String, name: String, desc: String) {} - override def visitSource(source: String, debug: String) {} - override def visitEnd() {} - - def addImports(imports: TraversableOnce[String]) { - this.imports ++= imports - } - - override def visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor = { - if (Type.getType(desc).getClassName == classOf[ExportPackage].getName) { - visitExportPackage() - } else { - super.visitAnnotation(desc, visible) - } - } - - def visitExportPackage(): AnnotationVisitor = { - def defaultVersionValue[T](name: String) = classOf[Version].getMethod(name).getDefaultValue().asInstanceOf[T] - - new AnnotationVisitor(Opcodes.ASM6) { - var major: Int = defaultVersionValue("major") - var minor: Int = defaultVersionValue("minor") - var micro: Int = defaultVersionValue("micro") - var qualifier: String = defaultVersionValue("qualifier") - - override def visit(name: String, value: AnyRef) { - def valueAsInt = value.asInstanceOf[Int] - - name match { - case "major" => major = valueAsInt - case "minor" => minor = valueAsInt - case "micro" => micro = valueAsInt - case "qualifier" => qualifier = value.asInstanceOf[String] - } - } - - override def visitEnd() { - exportPackageAnnotation = Some(ExportPackageAnnotation(major, minor, micro, qualifier)) - } - - override def visitEnum(name: String, desc: String, value: String) {} - override def visitArray(name: String): AnnotationVisitor = this - override def visitAnnotation(name: String, desc: String): AnnotationVisitor = this - } - } - - def result = { - assert(!imports.contains("int")) - new ClassFileMetaData(name, imports.toSet, exportPackageAnnotation) - } -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.scala deleted file mode 100644 index a8032b6a912..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.scala +++ /dev/null @@ -1,88 +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.plugin.classanalysis - -import org.objectweb.asm._ - -/** - * Picks up classes used in method bodies. - * @author tonytv - */ -private class AnalyzeMethodVisitor(val analyzeClassVisitor : AnalyzeClassVisitor) - extends MethodVisitor(Opcodes.ASM6) with AnnotationVisitorTrait with AttributeVisitorTrait with SubVisitorTrait { - - - override def visitParameterAnnotation(parameter: Int, desc: String, visible: Boolean): AnnotationVisitor = super.visitParameterAnnotation(parameter, desc, visible) - override def visitAnnotationDefault(): AnnotationVisitor = super.visitAnnotationDefault() - override def visitAttribute(attribute: Attribute): Unit = super.visitAttribute(attribute) - override def visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor = super.visitAnnotation(desc, visible) - override def visitEnd(): Unit = super.visitEnd() - - override def visitMultiANewArrayInsn(desc: String, dims: Int) { - imports ++= getClassName(Type.getType(desc)).toList - } - - - override def visitMethodInsn(opcode: Int, owner: String, name: String, desc: String, itf: Boolean) { - imports ++= internalNameToClassName(owner) - imports ++= Type.getArgumentTypes(desc).flatMap(getClassName) - imports ++= getClassName(Type.getReturnType(desc)) - } - - override def visitFieldInsn(opcode: Int, owner: String, name: String, desc: String) { - imports ++= internalNameToClassName(owner) ++ getClassName(Type.getType(desc)).toList - - } - - override def visitTypeInsn(opcode: Int, `type` : String) { - imports ++= internalNameToClassName(`type`) - } - - override def visitTryCatchBlock(start: Label, end: Label, handler: Label, `type` : String) { - if (`type` != null) //null means finally block - imports ++= internalNameToClassName(`type`) - } - - override def visitLocalVariable(name: String, desc: String, signature: String, start: Label, end: Label, index: Int) { - imports += Type.getType(desc).getClassName - } - - override def visitLdcInsn(constant: AnyRef) { - constant match { - case typeConstant: Type => imports ++= getClassName(typeConstant) - case _ => - } - } - - override def visitInvokeDynamicInsn(name: String, desc: String, bootstrapMethod: Handle, bootstrapMethodArgs: AnyRef*) { - bootstrapMethodArgs.foreach { - case typeConstant: Type => - imports ++= getClassName(typeConstant) - case handle: Handle => - imports ++= internalNameToClassName(handle.getOwner) - imports ++= Type.getArgumentTypes(desc).flatMap(getClassName) - case _ : Number => - case _ : String => - case other => throw new AssertionError(s"Unexpected type ${other.getClass} with value '$other'") - } - } - - override def visitMaxs(maxStack: Int, maxLocals: Int) {} - override def visitLineNumber(line: Int, start: Label) {} - //only for debugging - override def visitLookupSwitchInsn(dflt: Label, keys: Array[Int], labels: Array[Label]) {} - - - override def visitTableSwitchInsn(min: Int, max: Int, dflt: Label, labels: Label*): Unit = super.visitTableSwitchInsn(min, max, dflt, labels: _*) - override def visitIincInsn(`var` : Int, increment: Int) {} - override def visitLabel(label: Label) {} - override def visitJumpInsn(opcode: Int, label: Label) {} - override def visitVarInsn(opcode: Int, `var` : Int) {} - override def visitIntInsn(opcode: Int, operand: Int) {} - override def visitInsn(opcode: Int) {} - override def visitFrame(`type` : Int, nLocal: Int, local: Array[AnyRef], nStack: Int, stack: Array[AnyRef]) {} - override def visitCode() {} -} - - - - diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.scala deleted file mode 100644 index 5bb8304cf1e..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.scala +++ /dev/null @@ -1,68 +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.plugin.classanalysis - -import org.objectweb.asm.Opcodes -import org.objectweb.asm.signature.{SignatureReader, SignatureVisitor} - - -/** - * @author tonytv - */ - -private class AnalyzeSignatureVisitor(val analyzeClassVisitor: AnalyzeClassVisitor) - extends SignatureVisitor(Opcodes.ASM6) - with SubVisitorTrait { - - - override def visitEnd(): Unit = super.visitEnd() - - override def visitClassType(className: String) { - imports ++= internalNameToClassName(className) - } - - override def visitFormalTypeParameter(name: String) {} - - override def visitClassBound() = this - - override def visitInterfaceBound() = this - - override def visitSuperclass() = this - - override def visitInterface() = this - - override def visitParameterType() = this - - override def visitReturnType() = this - - override def visitExceptionType() = this - - override def visitBaseType(descriptor: Char) {} - - override def visitTypeVariable(name: String) {} - - override def visitArrayType() = this - - override def visitInnerClassType(name: String) {} - - override def visitTypeArgument() {} - - override def visitTypeArgument(wildcard: Char) = this -} - - -object AnalyzeSignatureVisitor { - def analyzeClass(signature: String, analyzeClassVisitor: AnalyzeClassVisitor) { - if (signature != null) { - new SignatureReader(signature).accept(new AnalyzeSignatureVisitor(analyzeClassVisitor)) - } - } - - def analyzeMethod(signature: String, analyzeClassVisitor: AnalyzeClassVisitor) { - analyzeClass(signature, analyzeClassVisitor) - } - - def analyzeField(signature: String, analyzeClassVisitor: AnalyzeClassVisitor) { - if (signature != null) - new SignatureReader(signature).acceptType(new AnalyzeSignatureVisitor(analyzeClassVisitor)) - } -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnnotationVisitorTrait.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnnotationVisitorTrait.scala deleted file mode 100644 index 0bf6ee4a6b4..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AnnotationVisitorTrait.scala +++ /dev/null @@ -1,39 +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.plugin.classanalysis - -import org.objectweb.asm.{Opcodes, AnnotationVisitor, Type} - -/** - * Picks up classes used in annotations. - * @author tonytv - */ -private trait AnnotationVisitorTrait { - protected val imports: ImportsSet - - def visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor = { - imports ++= getClassName(Type.getType(desc)).toList - - visitAnnotationDefault() - } - - def visitAnnotationDefault(): AnnotationVisitor = - new AnnotationVisitor(Opcodes.ASM6) { - override def visit(name: String, value: AnyRef) {} - - override def visitEnum(name: String, desc: String, value: String) { - imports ++= getClassName(Type.getType(desc)).toList - } - - override def visitArray(name: String): AnnotationVisitor = this - - override def visitAnnotation(name: String, desc: String): AnnotationVisitor = { - imports ++= getClassName(Type.getType(desc)).toList - this - } - - override def visitEnd() {} - } - - def visitParameterAnnotation(parameter: Int, desc: String, visible: Boolean): AnnotationVisitor = - visitAnnotation(desc, visible) -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AttributeVisitorTrait.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AttributeVisitorTrait.scala deleted file mode 100644 index 454bea99f29..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/AttributeVisitorTrait.scala +++ /dev/null @@ -1,15 +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.plugin.classanalysis - -import org.objectweb.asm.{Type, Attribute} - -/** - * @author tonytv - */ -private trait AttributeVisitorTrait { - protected val imports: ImportsSet - - def visitAttribute(attribute: Attribute) { - imports ++= getClassName(Type.getObjectType(attribute.`type`)).toList - } -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.scala deleted file mode 100644 index fb395749895..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.scala +++ /dev/null @@ -1,10 +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.plugin.classanalysis - -/** - * The result of analyzing a .class file. - * @author tonytv - */ -sealed case class ClassFileMetaData(name:String, - referencedClasses : Set[String], - exportPackage : Option[ExportPackageAnnotation]) diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.scala deleted file mode 100644 index f9dc459fcc7..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.scala +++ /dev/null @@ -1,24 +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.plugin.classanalysis - -import com.yahoo.container.plugin.util.Strings - -/** - * @author tonytv - */ -case class ExportPackageAnnotation(major: Int, minor: Int, micro: Int, qualifier: String) { - requireNonNegative(major, "major") - requireNonNegative(minor, "minor") - requireNonNegative(micro, "micro") - require(qualifier.matches("""(\p{Alpha}|\p{Digit}|_|-)*"""), - exportPackageError("qualifier must follow the format (alpha|digit|'_'|'-')* but was '%s'.".format(qualifier))) - - - private def requireNonNegative(i: Int, fieldName: String) { - require(i >= 0, exportPackageError("%s must be non-negative but was %d.".format(fieldName, i))) - } - - private def exportPackageError(s: String) = "ExportPackage anntotation: " + s - - def osgiVersion : String = (List(major, minor, micro) ++ Strings.noneIfEmpty(qualifier)).mkString(".") -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/PackageTally.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/PackageTally.scala deleted file mode 100644 index 2d2460cc9fd..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/PackageTally.scala +++ /dev/null @@ -1,46 +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.plugin.classanalysis - -import com.yahoo.container.plugin.util.Maps - -/** - * - * @author tonytv - */ -final class PackageTally (private val definedPackagesMap : Map[String, Option[ExportPackageAnnotation]], - referencedPackagesUnfiltered : Set[String]) { - - val referencedPackages = referencedPackagesUnfiltered diff definedPackages - - def definedPackages = definedPackagesMap.keySet - - def exportedPackages = definedPackagesMap collect { case (name, Some(export)) => (name, export) } - - /** - * Represents the classes for two package tallies that are deployed as a single unit. - * - * ExportPackageAnnotations from this has precedence over the other. - */ - def combine(other: PackageTally): PackageTally = { - new PackageTally( - Maps.combine(definedPackagesMap, other.definedPackagesMap)(_ orElse _), - referencedPackages ++ other.referencedPackages) - } -} - - -object PackageTally { - def fromAnalyzedClassFiles(analyzedClassFiles : Seq[ClassFileMetaData]) : PackageTally = { - combine( - for (metaData <- analyzedClassFiles) - yield { - new PackageTally( - Map(Packages.packageName(metaData.name) -> metaData.exportPackage), - metaData.referencedClasses.map(Packages.packageName)) - }) - } - - def combine(packageTallies : Iterable[PackageTally]) : PackageTally = (empty /: packageTallies)(_.combine(_)) - - val empty : PackageTally = new PackageTally(Map(), Set()) -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/Packages.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/Packages.scala deleted file mode 100644 index 517ef2626f9..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/Packages.scala +++ /dev/null @@ -1,27 +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.plugin.classanalysis - -/** - * Utility methods related to packages. - * @author tonytv - */ -object Packages { - case class PackageMetaData(definedPackages: Set[String], referencedExternalPackages: Set[String]) - - def packageName(fullClassName: String) = { - def nullIfNotFound(index : Int) = if (index == -1) 0 else index - - fullClassName.substring(0, nullIfNotFound(fullClassName.lastIndexOf("."))) - } - - - - def analyzePackages(allClasses: Seq[ClassFileMetaData]): PackageMetaData = { - val (definedPackages, referencedClasses) = - (for (classMetaData <- allClasses) - yield (packageName(classMetaData.name), classMetaData.referencedClasses.map(packageName))). - unzip - - PackageMetaData(definedPackages.toSet, referencedClasses.flatten.toSet diff definedPackages.toSet) - } -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/SubVisitorTrait.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/SubVisitorTrait.scala deleted file mode 100644 index 06ccfa7b88c..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/SubVisitorTrait.scala +++ /dev/null @@ -1,19 +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.plugin.classanalysis - -import collection.mutable - -/** - * A visitor that's run for sub construct of a class - * and forwards all its imports the the owning ClassVisitor at the end. - * @author tonytv - */ -private trait SubVisitorTrait { - val analyzeClassVisitor : AnalyzeClassVisitor - - val imports : ImportsSet = mutable.Set() - - def visitEnd() { - analyzeClassVisitor.addImports(imports) - } -} diff --git a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/package.scala b/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/package.scala deleted file mode 100644 index 631884c58e3..00000000000 --- a/bundle-plugin/src/main/scala/com/yahoo/container/plugin/classanalysis/package.scala +++ /dev/null @@ -1,27 +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.plugin - -import org.objectweb.asm.Type -import collection.mutable - -package object classanalysis { - type ImportsSet = mutable.Set[String] - - def internalNameToClassName(internalClassName: String) : Option[String] = { - internalClassName match { - case null => None - case _ => getClassName(Type.getObjectType(internalClassName)) - } - } - - def getClassName(aType: Type): Option[String] = { - import Type._ - - aType.getSort match { - case ARRAY => getClassName(aType.getElementType) - case OBJECT => Some(aType.getClassName) - case _ => None - } - } -} - |