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

org.opalj.br.analyses.cg.ClosedPackagesKey.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.error

/**
 * The ''key'' object to get a function that determines whether a package is closed or not.
 * See [[ClosedPackages]] for further details.
 *
 * This ''key'' reflectively instantiates the analysis that determines whether a package is closed
 * or not. The respective analysis has to extend the abstract [[ClosedPackages]] class.
 * To configure which analysis is used use the key
 * `org.opalj.br.analyses.cg.ClosedPackagesKey.analysis` to specify the name of the class which
 * implements the analysis.
 *
 * @example
 *      {{{
 *      org.opalj.br.analyses.cg {
 *          ClosedPackagesKey {
 *              analysis = "org.opalj.br.analyses.cg.ClosedPackagesConfiguration"
 *              closedPackages = "java(/.*)*"
 *          }
 *      }
 *      }}}
 *
 * @note Please see the documentation of [[ClosedPackages]] and its subtypes for more
 *       information.
 *
 * @note The default configuration is the conservative [[OpenCodeBase]] analysis.
 *
 * @author Michael Reif
 */
object ClosedPackagesKey extends ProjectInformationKey[ClosedPackages, Nothing] {

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

    final val DefaultClosedPackagesAnalysis = "org.opalj.br.analyses.cg.OpenCodeBase"

    /**
     * The [[ClosedPackagesKey]] has no special prerequisites.
     *
     * @return `Nil`.
     */
    override def requirements(project: SomeProject): Seq[ProjectInformationKey[Nothing, Nothing]] = Nil

    /**
     * Reflectively instantiates a ''ClosedPackagesAnalysis'' for the given project.
     * The instantiated class has to satisfy the interface and needs to provide a single
     * constructor parameterized over a Project.
     */
    override def compute(project: SomeProject): ClosedPackages = {
        try {
            val key = ConfigKeyPrefix+"analysis"
            val configuredAnalysis = project.config.as[Option[String]](key)
            val analysisClassName = configuredAnalysis.getOrElse(DefaultClosedPackagesAnalysis)
            val constructor = Class.forName(analysisClassName).getConstructors.head
            constructor.newInstance(project).asInstanceOf[ClosedPackages]
        } catch {
            case t: Throwable =>
                val m = "cannot compute closed packages; all packages are now considered open"
                error("project configuration", m, t)(project.logContext)
                new OpenCodeBase(project)
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy