2016-01-09 10 views
1

В настоящее время я придерживаюсь очень простой, но запутанной проблемы при использовании StringTokenizer. То, что я пытаюсь добиться ниже:Условно добавление строки в StringTokenizer

У меня есть URL-строки, как:

http://xxx:port/jira/rest/api/2/search?jql=project='TP' AND 
(status='Ready for INT Deployment' or status = 'Ready for UAT Deployment') 

Выше базовая строка. Теперь я хочу, чтобы динамически добавлять больше параметров запроса к вышеуказанному URL, как показано ниже:

"AND (key=NN-1234 OR key=NN-4321 OR key=NN-65343.....)" 

Вот мой код:

private String getPartialIssueList() { 
    String listFromProperties = getPropertyValue("propagateList"); 
    StringTokenizer token = new StringTokenizer(listFromProperties, ","); 
    StringBuilder partialListString = new StringBuilder(); 
    partialListString.append(" AND key="); 

    while (token.hasMoreElements()) { 
     partialListString.append(token.nextElement() + " OR key=" + token.nextElement()); 
    } 
    return partialListString.toString(); 
} 

Каким-то образом это работает только если у меня есть 2 входа. Я хочу, чтобы после базового URL-кода добавлялся «AND» с последующим открытием скобок »(« а затем key = «значение из свойств», значение 2 из свойств, значение 3 из свойств, а затем закрытие скобки »)». Независимо от количества идентификаторов JIRA, которые у меня есть в файле свойств, он должен продолжать добавлять «OR key = NN-5432 OR key =« NN-9875 »и т. Д.

Это результат, который я ищу:

http://xxx:port/jira/rest/api/2/search?jql=project='TP' AND 
(status='Ready for INT Deployment' or status = 'Ready for UAT Deployment') AND 
(key=NN-09876 OR key=NN-09873 OR key=NN-09376 OR key=NN-02876) 

в настоящее время значения для propagateList в файле свойств

propagateList="NN-09876","NN-65432","NN-65430" 

Может кто-то пожалуйста, помогите на это?

ответ

2

Вам необходимо отдельно подготовить основные условия.

private String getPartialIssueList() { 
    String listFromProperties = getPropertyValue("propagateList"); 
    StringTokenizer token = new StringTokenizer(listFromProperties, ","); 
    StringBuilder partialListString = new StringBuilder(); 
    partialListString.append(" AND "); 
    partialListString.append("("); 

    // Prepare key condition 
    StringBuilder orKeys = new StringBuilder(); 
    while(token.hasMoreElements()) { 
     // Replace token.nextToken() to token.nextToken().replaceAll("\"", "") if you don't want quotes 
     orKeys.append("key=" + token.nextToken() + " OR "); 
    } 
    // Remove last "OR" and concatenate 
    partialListString.append(orKeys.toString().replaceAll(" OR $", "")); 
    partialListString.append(")"); 

    return partialListString.toString(); 
} 

Результат:

System.out.println(getPartialIssueList()); 
AND (key="NN-09876" OR key="NN-65432" OR key="NN-65430") 

Теперь конкатенации база URL для вас динамического запроса:

String base = "http://xxx:port/jira/rest/api/2/search?jql=project='TP' AND (status='Ready for INT Deployment' or status = 'Ready for UAT Deployment')"; 
base += getPartialIssueList(); 
System.out.println(base); 
------------------------------------------ 
http://xxx:port/jira/rest/api/2/search?jql=project='TP' AND 
(status='Ready for INT Deployment' or status = 'Ready for UAT Deployment') AND 
(key="NN-09876" OR key="NN-65432" OR key="NN-65430") 
+0

Работал отлично для меня, большое вам спасибо. Мне не хватало удаления последнего ИЛИ. Ваша помощь работала как шарм! – YogendraJ

0

Я попробовал ваш код с этими изменениями, и она отлично работает. Пожалуйста, дайте мне знать, если это что-то не так.

private String getPartialIssueList() { 
    String listFromProperties = getPropertyValue("propagateList"); 
    StringTokenizer token = new StringTokenizer(listFromProperties, ","); 
    StringBuilder partialListString = new StringBuilder(); 
    partialListString.append(" AND (key="); // updated with ( 

    while (token.hasMoreTokens()) { // used tokens as it is a string 
     partialListString.append(token.nextToken() + " OR key=" + token.nextElement()); 
    } 
    partialListString.append(")"); // added closed bracket 
    return partialListString.toString(); 
} 

private String getPropertyValue(String propagateList) { // list is seperated by commas 
    return "'Ready for INT Deployment', 'Ready for UAT Deployment'"; 
} 
+0

Вот выход. 'AND (key = 'Ready for INT Deployment' OR key = 'Ready for UAT Deployment')' – user2503849

+0

Пробовали ли вы эти 3 или 5 значения? Я думаю, что это закончится неудачей, так как именно то, что у меня было с кодом с добавлением добавления ")" в конце. – YogendraJ

+0

Я попытался с введенным вами вводом, но не с 3 или 5 значениями. – user2503849

0

Следующий код дает вывод, что вы ожидали

private static String getPartialIssueList() { 
      String listFromProperties = "NN-09876, NN-65432, NN-65430"; 
      StringTokenizer token = new StringTokenizer(listFromProperties, ","); 
      StringBuilder partialListString = new StringBuilder(); 
      partialListString.append(" AND key="); 

      while (token.hasMoreTokens()) { 

       partialListString.append(token.nextToken()); 
       if(token.hasMoreTokens()) { 
        partialListString.append(" OR key="); 
       } else { 
        break; 
       } 
      } 
      return partialListString.toString(); 
    } 

метод nextElement() должен быть вызван после того, как видим, если есть следующий элемент, используя hasMoreElements(). Ваш код работает только с четными вводами, потому что после каждой проверки он вызывает nextElement() дважды, поэтому, если после проверки он выполняет два элемента, и если есть только один, первый вызов работает, а второй выдает исключение NoSuchMethodException.

+0

Спасибо Dev. Как и принятый ответ, это тоже дает мне результаты, которые мне нужны.Однако, когда я сравнивал производительность обоих, принятый ответ работает быстрее. Это из-за дополнительной проверки цикла while? – YogendraJ