2014-10-11 6 views
1

вот код, который я использую для запроса «подписки», а затем возвращаю ссылку на рабочую область, к которой я хочу обратиться:с Rally api v2.0, я не могу получить доступ к списку рабочих областей при запросе объекта подписки

public static String query_for_workspace(String ws, RallyRestApi r) throws IOException{ 

    String Wspace_ref=null; 
    //Read Subscription 
    QueryRequest subscriptionRequest = new QueryRequest("Subscriptions"); 
    subscriptionRequest.setFetch(new Fetch("Name", "Workspaces")); 

    QueryResponse subscriptionQueryResponse = r.query(subscriptionRequest); 
    String subName = subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Name").toString(); 
    System.out.println("Read Subscription: " + subName); 

    // Grab Workspaces Collection 
    JsonArray myWorkspaces = subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Workspaces").getAsJsonArray(); 

    // iterates through all workspaces and fetch 'ref' (string attribute) of the useful workspace 
    for (int i=0; i<myWorkspaces.size(); i++) { 
     JsonObject workspaceObject = myWorkspaces.get(i).getAsJsonObject(); 
     String workspaceRef = workspaceObject.get("_ref").getAsString();     
     GetRequest workspaceRequest = new GetRequest(workspaceRef); 
     workspaceRequest.setFetch(new Fetch("Name")); 
     GetResponse workspaceResponse = r.get(workspaceRequest); 
     JsonObject workspaceObj = workspaceResponse.getObject(); 
     String workspaceName = workspaceObj.get("Name").getAsString(); 
     if(workspaceName.equals(ws)){ 
      System.out.printf("Workspace found ==> %s\n", workspaceName); 
      Wspace_ref=workspaceRef; 
     } 
    } 
    return Wspace_ref; 
} 

ошибка происходит от этой линии:

JsonArray myWorkspaces=subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Workspaces").getAsJsonArray(); 

Этот код работает с 1.x API. Как получить доступ к списку рабочих пространств в 2.x?

Спасибо!

ответ

3

В Rally api v2.0 возможность возврата дочерних коллекций в том же ответе была удалена по соображениям производительности. В v2.0 выборка коллекции вернет объект со счетчиком и URL-адресом, из которого можно получить данные коллекции.

В старых версиях WS API определенные списки выборки создали много рекурсивных вызовов, и все коллекции, включенные в выборку, делают вызов довольно дорогостоящим. В WS API версии 2.0 этого не произойдет, так как для получения объектов коллекций потребуется отдельный вызов.

Итак, я считаю, в этой ситуации, если вы обновляете свой код на:

public static String query_for_workspace(String ws, RallyRestApi r) throws IOException{ 

    String Wspace_ref=null; 
    //Read Subscription 
    QueryRequest subscriptionRequest = new QueryRequest("Subscriptions"); 

    QueryResponse subscriptionQueryResponse = r.query(subscriptionRequest); 
    String subName = subscriptionQueryResponse.getResults().get(0).getAsJsonObject().get("Name").toString(); 
    System.out.println("Read Subscription: " + subName); 

    //Grab Workspaces Collection 
    QueryRequest workspaceRequest = new QueryRequest(subscriptionQueryResponse.getResults().get(0).getAsJsonObject().getAsJsonObject("Workspaces")); 
    workspaceRequest.setFetch(new Fetch("Name", "_ref”)); 

    JsonArray myWorkspaces = r.query(workspaceRequest).getResults(); 

    //Iterate through the Workspaces to find the correct one 
    String workspaceName = ""; 

    for (int i=0; i<myWorkspaces.size(); i++){ 
     workspaceName = myWorkspaces.get(i).getAsJsonObject().get("Name").getAsString(); 
     if(workspaceName.equals(ws)){ 
      System.out.printf("Workspace found ==> %s\n", workspaceName); 
      Wspace_ref = myWorkspaces.get(i).getAsJsonObject().get("_ref").getAsString(); 
     } 
    } 
    return Wspace_ref; 
} 

Это должно обеспечить реф вам нужно.