EN · DE · RU · FR · ES

#228: MerlinPlugin.kt

plugins/org.projectforge.plugins.merlin/src/main/kotlin/org/projectforge/plugins/merlin/MerlinPlugin.kt Тип: Kotlin · Роль: Регистрация плагина · Исходник: plugins/org.projectforge.plugins.merlin/src/main/kotlin/org/projectforge/plugins/merlin/MerlinPlugin.kt 120 строк · 76 кода · 33 комментария · 11 пустых
Класс регистрации плагина, расширяющий AbstractPlugin. Объявляет имя модуля, регистрирует DAO, пункты меню, ресурсы i18n и логику checkAccess для плагина Merlin.

Структура кода

Аннотации: author, micromata

Классы: MerlinPlugin

Объекты: etc

Супертип(ы): AbstractPlugin

Функции (3): initialize, ensureUserLogSubscription, createUserLogSubscriptionMenuItem

Свойства (7): merlinTemplateDao, menuCreator, attachmentsService, attachmentsServicesRest, ID, RESOURCE_BUNDLE_NAME, username

Импорты: 18 пакетов

Пакет: org.projectforge.plugins.merlin

Исходный код (сокращён)

package org.projectforge.plugins.merlin

import org.projectforge.Constants
import org.projectforge.common.logging.LogEventLoggerNameMatcher
import org.projectforge.common.logging.LogSubscription
import org.projectforge.framework.jcr.AttachmentsService
import org.projectforge.framework.persistence.user.api.ThreadLocalUserContext
import org.projectforge.menu.MenuItem
import org.projectforge.menu.MenuItemTargetType
import org.projectforge.menu.builder.MenuCreator
import org.projectforge.menu.builder.MenuItemDef
import org.projectforge.menu.builder.MenuItemDefId
import org.projectforge.plugins.core.AbstractPlugin
import org.projectforge.plugins.core.PluginAdminService
import org.projectforge.plugins.merlin.rest.MerlinAttachmentsActionListener
import org.projectforge.rest.AttachmentsServicesRest
import org.projectforge.rest.admin.LogViewerPageRest
import org.projectforge.rest.config.JacksonConfiguration
import org.projectforge.rest.core.PagesResolver
import org.projectforge.web.WicketSupport

/**
 * Инициализация вашего плагина. Зарегистрируйте все компоненты, такие как файлы i18n, объекты доступа к данным и т.д.
 *
 * @author Kai Reinhard (k.reinhard@micromata.de)
 */
class MerlinPlugin :
    AbstractPlugin(
        ID,
        "Merlin-Word®-Templates",
        "Плагин для шаблонов Microsoft Word® (с переменными, зависимыми переменными, а также последовательным выполнением). Полезен для контрактов, серийных документов и т.д."
    ) {

    override fun initialize() {
        val merlinTemplateDao = WicketSupport.get(MerlinTemplateDao::class.java)
        val menuCreator = WicketSupport.get(MenuCreator::class.java)
        val attachmentsService = WicketSupport.get(AttachmentsService::class.java)
        val attachmentsServicesRest = WicketSupport.get(AttachmentsServicesRest::class.java)
        // Регистрируем:
        register(MerlinTemplateDao::class.java, merlinTemplateDao, "plugins.merlin")

        // Будет отправлено клиенту, но должно игнорироваться при отправке обратно:
        JacksonConfiguration.registerAllowedUnknownProperties(
            MerlinVariable::class.java,
            "allowedValuesFormatted",
            "mappingMasterValues",
        )

        menuCreator.register(
            MenuItemDefId.MISC,
            MenuItemDef(info.id, "plugins.merlin.menu", "${Constants.REACT_APP_PATH}merlin")
        )

        // Всё, что связано с i18n:
        addResourceBundle(RESOURCE_BUNDLE_NAME)

        attachmentsServicesRest.register(
            ID,
            MerlinAttachmentsActionListener(attachmentsService, merlinTemplateDao)
        )
    }

    companion object {
        const val ID = PluginAdminService.PLUGIN_MERLIN_ID
        const val RESOURCE_BUNDLE_NAME = "MerlinI18nResources"

        fun ensureUserLogSubscription(): LogSubscription {
            val username = ThreadLocalUserContext.loggedInUser!!.username ?: throw InternalError("Пользователь не указан")
            return LogSubscription.ensureSubscription(
                title = "Merlin",
                user = username,
                create = { title, user ->
                    LogSubscription(
                        title,
                        user,
                        LogEventLoggerNameMatcher("de.micromata.merlin", "org.projectforge.plugins.merlin"),
                        maxSize = 10000,
                    )
                })
        }

        /**
         * Также вызывает [ensureUserLogSubscription].
         */
        fun createUserLogSubscriptionMenuItem(): MenuItem {
            return MenuItem(
                "logViewer",
                i18nKey = "plugins.merlin.viewLogs",
                url = PagesResolver.getDynamicPageUrl(
                    LogViewerPageRest::class.java,
                    id = ensureUserLogSubscription().id
                ),
                type = MenuItemTargetType.REDIRECT,
            )
        }
    }
}

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024 -> 2025.
3785f8347 Миграция в процессе...
67805f2fc ThreadLocalUserContext.user -> ThreadLocalUserContext.loggedInUser (переименовано для избежания недопонимания в коде).
b6092df09 Авторские права 2023 -> 2024