1. 新增YamlLoader.java

package com.intland.codebeamer.config.yaml;

import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class YamlLoader {

    public final static YamlConfig config = YamlLoader.load();

    public static YamlConfig load() {
        // 1. 加载 application.yml
        Map<String, Object> mainConfig = load("application.yml");
        Map<String, Object> config = new HashMap<>(mainConfig);

        // 2. 获取当前激活的环境
        String activeProfile = getActiveProfile(mainConfig);

        // 3. 加载对应环境的配置
        if (activeProfile != null) {
            Map<String, Object> profileConfig = load("application-" + activeProfile + ".yml");
            config.putAll(profileConfig);
        }
        return new YamlConfig(config);
    }

    private static Map<String, Object> load(String filename) {
        try (InputStream input = YamlLoader.class.getClassLoader().getResourceAsStream(filename)) {
            if (input != null) {
                Yaml yaml = new Yaml();
                return yaml.load(input);
            }
        } catch (Exception e) {
            throw new RuntimeException("读取配置文件失败:" + filename);
        }
        return new HashMap<>();
    }

    private static String getActiveProfile(Map<String, Object> config) {
        return getProperty(config, "spring.profiles.active");
    }

    public static String getProperty(Map<String, Object> config, String keyPath) {
        String[] keys = keyPath.split("\\.");
        Object current = config;

        for (String key : keys) {
            if (current instanceof Map) {
                current = ((Map<?, ?>) current).get(key);
            } else {
                return null;
            }
        }
        return (String) current;
    }

}

2.新增YamlConfig.java

package com.intland.codebeamer.config.yaml;

import lombok.AllArgsConstructor;

import java.util.Map;

@AllArgsConstructor
public class YamlConfig {

    private Map<String, Object> config;

    public String getProperty(String property) {
        return YamlLoader.getProperty(config, property);
    }

}

3.新增 TrackerContentMenuProperties.class

package com.intland.codebeamer.config.menu;

import com.intland.codebeamer.config.yaml.YamlLoader;

public class TrackerContentMenuProperties {

    public final static String actives = YamlLoader.config.getProperty("cb.tracker.content-menu.actions");

}

4. 新增 TestMoreActionMenuBuilder.class

package com.intland.codebeamer.ui.view.actionmenubuilder;

import com.intland.codebeamer.persistence.dto.UserDto;
import com.intland.codebeamer.taglib.actionmenu.model.ActionItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Component
public class TestMoreActionMenuBuilder extends TrackerListContextActionMenuBuilder {

    @Autowired
    private TrackerMoreMenuActionMenuBuilder trackerMoreMenuActionMenuBuilder;


    public Map<String, ActionItem> doBuild(HttpServletRequest request, UserDto user, Object subject) throws Exception {
        // 保留原按钮
        Map<String, ActionItem> actionMap = trackerMoreMenuActionMenuBuilder.doBuild(request, user, subject);
        // 新增按钮
        actionMap.put("testView", new ActionItem(
                "tracker.issues.import.label",
                "#",
                this.createJavascriptUrl("alert('123');"),
                "tracker.issues.import.tooltip"
        ));

        return actionMap;
    }

}

5. 新增 application.yml

spring:
  profiles:
    active: test

6. 新增 application-test.yml

cb:
  tracker:
    content-menu:
      actions: testView

7. 编译java为class放入codebeamer目录

 将配置文件与编译后的class文件放入 {CB}/tomcat/webapps/cb/WEB-INF/classes/ 中

imageimage

8.修改Tracker更多按钮菜单项

编辑  {CB}\bugs\tracker\includes\initTrackerContextMenu.jsp 文件
在 41行 新增代码

<%@ page import="com.intland.codebeamer.config.menu.TrackerContentMenuProperties" %>
<%
    pageContext.setAttribute(
		"customActions",
		TrackerContentMenuProperties.actives
	);
%>

修改两处 var 为 actionKeys 的 value,加上 ${customActions},

image

 9.修改菜单项接口ActionMenuBuilder参数

编辑  {CB}\bugs\tracker\browseTrackerAjaxActionMenuHandlers.js 文件
修改变量 MORE_MENU_ACTION_MENU_BUILDER 的值为 testMoreActionMenuBuilder

image

10. 重启 codebeamer

11.验证效果

image

 

Posted on 2025-12-28 16:48  荆楚尬聊娃  阅读(3)  评论(0)    收藏  举报