使用JAVA API更新Rally Team成员资格

时间:2014-04-21 11:23:28

标签: java json rally arrays java-api

My Java API将来自其他应用程序的团队成员与Rally进行比较。比较结果在Rally中更新。它需要参考项目名称和Res名称。

代码抛出" java.lang.IndexOutOfBoundsException:索引:0,大小:0"错误。我没有发现错误。有人可以帮忙吗?以下是代码和输出

    package teammembership;

    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    import com.rallydev.rest.RallyRestApi;
    import com.rallydev.rest.request.QueryRequest;
    import com.rallydev.rest.response.QueryResponse;
    import com.rallydev.rest.request.UpdateRequest;
    import com.rallydev.rest.response.UpdateResponse;
    import com.rallydev.rest.util.Fetch;
    import com.rallydev.rest.util.QueryFilter;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.io.*;
    import java.sql.*;
    import javax.xml.parsers.DocumentBuilder;
    import org.apache.soap.util.xml.*;
    import org.w3c.dom.*;
    //import org.json.*;
    //import static projectteammembers.JsonUtil.getJsonValue;

    public class TeamMembership {

        public static Connection makeConnection(String propertiesFile) throws SQLException, Exception {

    Connection conn = null;

    DocumentBuilder docBuilder = XMLParserUtils.getXMLDocBuilder();
    Document doc = docBuilder.parse(new File(propertiesFile));

    // Retrieve database parameters
    Element database = (Element) doc.getElementsByTagName("database").item(0);
    String url = database.getAttribute("url");
    String serviceId = database.getAttribute("serviceId");
    String username = database.getAttribute("username");
    String password = database.getAttribute("password");
    String host = url.substring(url.indexOf("//"), url.indexOf(";"));
    String connectString = "jdbc:oracle:thin:@" + host + "/" + serviceId;

    // Load JDBC Driver
    String driverClass = "oracle.jdbc.driver.OracleDriver";
    Class.forName(driverClass);

    try {
        conn = DriverManager.getConnection(connectString, username, password);

    } catch (SQLException ex) {
        throw new SQLException(ex);
    } catch (Exception ex) {
        throw new Exception(ex);
    }

    return conn;

}


public static void main(String[] args) throws URISyntaxException, IOException, SQLException {

    String host = "https://rally1.rallydev.com";
    String username = "username@abc.com";
    String password = "password";
    //String userRef = "";
    String applicationName = "update team membership";
    //int queryLimit = 4000;
    Connection conn = null;
    String propertiesFile = "";
    propertiesFile = "c:/app/c/properties_prod.xml";
    String projid = "";
    String resid = "";
    //String returnValue = "";
    String selectString = "";

    RallyRestApi restApi = new RallyRestApi(
        new URI(host),
        username,
        password);
    restApi.setApplicationName(applicationName);
    System.out.println(restApi.getWsapiVersion());

    try {

        conn = makeConnection(propertiesFile);


        // Select compared records of Team member present in table1 not in table2
        selectString += "select Prj_name ";
        selectString += ",res_name";
        selectString += " from CUST_table1_v c ";
        selectString += " WHERE NOT EXISTS( select 1 from CUST_table2_v r";
        selectString += " where c.prj_name = r.Prj_name and c.res_name = r.res_name)";

        // Create select statement

        Statement st = (Statement) conn.createStatement();

        // Execute select statement

        ResultSet rs = st.executeQuery(selectString);

        while (rs.next()) {

            projid = rs.getString("Prj_name");
            resid = "(" + rs.getString("res_name") + ")";


            System.out.println(projid);
            System.out.println(resid);

            QueryRequest projectRequest = new QueryRequest("Project");
            projectRequest.setFetch(new Fetch("Name"));
            projectRequest.setQueryFilter(new QueryFilter("Name", "=", projid));
            QueryResponse projectQueryResponse = restApi.query(projectRequest);
            JsonObject projectObj = projectQueryResponse.getResults().get(0).getAsJsonObject();

            QueryRequest userRequest = new QueryRequest("User");
            userRequest.setFetch(new Fetch("UserPermissions", "TeamMemberships"));
            userRequest.setQueryFilter(new QueryFilter("DisplayName", "contains", resid));
            QueryResponse userQueryResponse = restApi.query(userRequest);
            System.out.println(userQueryResponse);
            JsonObject userObject = userQueryResponse.getResults().get(0).getAsJsonObject();
            //JsonObject projectObj = new JsonObject(projid);
            String userRef = userObject.get("_ref").toString();
            System.out.println("Found User with Ref: " + userRef);

            JsonArray existTeamMemberships = (JsonArray) userQueryResponse.getResults().get(0).getAsJsonObject().get("TeamMemberships");

            // add or remove projects for user
            existTeamMemberships.add(projectObj);

            // Setup update fields/values for Team Membership
            JsonObject updateUserTeamMembershipObj = new JsonObject();
            updateUserTeamMembershipObj.add("TeamMemberships", existTeamMemberships);

            UpdateRequest updateTeamMembershipsRequest = new UpdateRequest(userRef, updateUserTeamMembershipObj);
            UpdateResponse updateTeamMembershipResponse = restApi.update(updateTeamMembershipsRequest);


        }



    } catch (Exception e) {
        e.printStackTrace();

    } finally {
        restApi.close();
        conn.close();
    }

}

}

以下是错误输出

    v2.0
    DT-E2E Automation
    (tmanjunath)

    com.rallydev.rest.response.QueryResponse@193d23b
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.rangeCheck(ArrayList.java:635)
        at java.util.ArrayList.get(ArrayList.java:411)
        at com.google.gson.JsonArray.get(JsonArray.java:92)
        at teammembership.TeamMembership.main(TeamMembership.java:125)
    BUILD SUCCESSFUL (total time: 11 seconds)

2 个答案:

答案 0 :(得分:1)

你有一个List(一个确切的ArrayList),它不包含任何内容(没有单个对象),你试图访问第一个对象(它不存在)。这就是错误告诉你的。您尝试访问索引0(列表中的第一个位置)但其中没有元素(因此大小为0)。它出现在第125行附近。由于您在问题中的格式似乎不正确,我只能猜测您问题中的哪一行是第125行(并且我不想通过以下方式读取125行代码方式)。所以我认为异常发生在这里:

JsonObject userObject = userQueryResponse.getResults().get(0).getAsJsonObject();

尝试追踪它。确保从userQueryResponse.getResults()返回的列表包含以下内容:

list = userQueryResponse.getResults();
System.out.println(list.size());

如果没有,那就是你的问题。如果您无法解决问题,请在不发布150行代码的情况下询问有关此问题的具体问题。

答案 1 :(得分:0)

get("_ref").toString()过去常用于旧版本,而您引用的代码较旧。当使用2.0.4 jar(默认情况下在生产中使用最新版本的WS API,v2.0)时,用get("_ref").getAsString()替换它的所有实例。

例如,

String userRef = userObject.get("_ref").toString();

将生成java.lang.NullPointerException:key == null