3

对于熟悉 Jenkins 插件的 Jelly 标签的任何人,您都知道标签的 @checked 值使用特定的 getter/setter 格式。

我的插件使用接口值解析 XML,我需要在项目页面上为 XML 中的每个值动态创建复选框(通过 floatingBox.jelly)。我从配置页面输入了 XML 文件,插件操作解析 xml 并将字符串列表传递给果冻,其中它当前根据列表生成复选框。

我的困境是以允许插件将@checked 值传达给1)将检查值传递给一些唯一的动态创建的java布尔变量2)将值保存在所述变量中并返回的方式来构建我的java / jelly关系。

我目前正在使用 Hashtable 来存储我的键值对,但无法使用单个方法调用成功设置值和返回值。

我的 floatBox.jelly:

<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt" xmlns:local="local">
<div class="test-trend-caption" style="color:red;text-align:center" >Select Build Interfaces</div>
    <div>
        <j:forEach var="i" items="${it.getActions().get(0).getInterfaces()}">
            <div style="text-align:left">
                <f:checkbox title="${i}" checked="${it.getActions().get(0).getCheckedInterfaces(i)}"/>
            </div>
            <br/>
        </j:forEach>       
    </div>

我的插件操作代码:

public boolean getCheckedInterfaces(String name) {
    for (Map.Entry entry : checkedInterfaces.entrySet()) {
        if (entry.getValue().equals(name)) {
            return (Boolean)entry.getKey();
        }
    }
    return false;
}

public void setCheckedInterfaces(String name) {
    checkedInterfaces.put(name, true);
}

public void parseInterfaces() throws IOException, InstantiationException, IllegalAccessException {
    if (getInterfacesPath()!=null || getInterfacesPath()!="") {
        GroovyClassLoader loader = new GroovyClassLoader();
        Class groovyClass = loader.parseClass(new File("C:\\...\\src\\main\\groovy\\xmlTest.groovy"));
        GroovyObject groovyObj = (GroovyObject)groovyClass.newInstance();
        final Object args = (Object)getInterfacesPath();
        ArrayList<String> temp = (ArrayList<String>)groovyObj.invokeMethod("parseXML", args);
        if (interfaces.isEmpty()) 
            interfaces.addAll(temp);
        else {
            interfaces.clear();
            interfaces.addAll(temp);
        }
    }

是否有另一种范式可以尝试初始化和管理这些值,以便它们像复选框-java 关系的明确声明的布尔值一样运行?

4

1 回答 1

0

我最终确实解决了这个问题。我创建了一个 JavaScript 函数,它读取表格复选框的值并将输出分配给一个隐藏的输入,该输入通过 @QueryParameter 提供给我的 Java 代码。见下文。

Jelly/HTML表单调用JS函数并发布Java:

<form style="float:right" method="post" action="forcePromotion?name=${p.name}" onsubmit="saveChecksForce()">
  <f:submit value="${%Force promotion}" />
  <input id="ServerList" name="serverList" type="hidden" />
</form>

以及 JS 函数:

function saveChecksForce() {
  var c = window.document.getElementById("ServerChecklist").rows;
  var checkedservers = "";
  for (var i = 0; i & lt; c.length; i++) {
    if (c[i].cells[1] != null) {
      if (c[i].cells[1].children[0] != null) {
        if (c[i].cells[1].children[0].checked == true) {
          checkedservers = checkedservers + c[i].cells[0].innerHTML + ",";
        }
      }
    }
  }
  window.document.getElementById('ServerList').value = checkedservers;
}

其中“ServerChecklist”是我的表格 ID,复选框位于单列中。然后表单执行操作,并调用 Java 代码:

 public HttpResponse doForcePromotion(@QueryParameter("name") String name, @QueryParameter("serverList") String serverList) throws IOException, InterruptedException {
    setEnvVars(serverList);
    this.getProject().checkPermission(Promotion.PROMOTE);
    ...
 }
于 2014-12-05T20:56:50.950 回答