当前位置: 首页 > news >正文

CodeBeamer 二次开发 实现多环境切换Tracker更多按钮菜单项

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/ 中

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