All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opalj.br.analyses.cg.ClassExtensibilityKey.scala Maven / Gradle / Ivy

The newest version!
/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package br
package analyses
package cg

import net.ceedubs.ficus.Ficus._

import org.opalj.log.OPALLogger

/**
 * The ''key'' object to get a function that determines whether a type is directly
 * extensible or not.
 *
 * @see [[ClassExtensibility]] for further information.
 * @author Michael Reif
 */
object ClassExtensibilityKey extends ProjectInformationKey[ClassExtensibility, Nothing] {

    final val ConfigKeyPrefix = "org.opalj.br.analyses.cg.ClassExtensibilityKey."

    final val DefaultClassExtensibilityAnalysis = {
        "org.opalj.br.analyses.cg.DefaultClassExtensibility"
    }

    /**
     * The [[ClassExtensibilityKey]] has the [[ClosedPackagesKey]] as prerequisite.
     */
    override def requirements(project: SomeProject): ProjectInformationKeys = Seq(ClosedPackagesKey)

    /**
     * Computes the direct type extensibility information for the given project.
     */
    override def compute(project: SomeProject): ClassExtensibility = {
        val configKey = ConfigKeyPrefix+"analysis"
        try {
            val configuredAnalysis = project.config.as[Option[String]](configKey)
            val analysisClassName = configuredAnalysis.getOrElse(DefaultClassExtensibilityAnalysis)
            val constructor = Class.forName(analysisClassName).getConstructors.head
            constructor.newInstance(project).asInstanceOf[ClassExtensibility]
        } catch {
            case t: Throwable =>
                val m = "cannot compute the extensibility of classes; extensibility will be unknown"
                OPALLogger.error("project configuration", m, t)(project.logContext)
                new ClassExtensibility {
                    def isClassExtensible(t: ObjectType): Answer = Unknown
                }
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy