【问题标题】:Dynamically create variables for Jelly checkboxes for Jenkins plugin为 Jenkins 插件动态创建 Jelly 复选框的变量
【发布时间】:2014-05-21 20:37:21
【问题描述】:

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

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

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

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

我的floatingBox.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 关系的显式声明布尔值一样运行?

【问题讨论】:

    标签: java jenkins hudson jenkins-plugins jelly


    【解决方案1】:

    我最终确实解决了这个问题。我创建了一个 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);
        ...
     }
    

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多