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.ymlMap<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 {@Autowiredprivate 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/ 中


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},

9.修改菜单项接口ActionMenuBuilder参数
编辑 {CB}\bugs\tracker\browseTrackerAjaxActionMenuHandlers.js 文件
修改变量 MORE_MENU_ACTION_MENU_BUILDER 的值为 testMoreActionMenuBuilder

10. 重启 codebeamer
11.验证效果

