1   /*
2    * Copyright (C) 2010 Atlassian
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package samples;
18  
19  import com.atlassian.jira.rest.client.JiraRestClient;
20  import com.atlassian.jira.rest.client.NullProgressMonitor;
21  import com.atlassian.jira.rest.client.domain.BasicIssue;
22  import com.atlassian.jira.rest.client.domain.BasicProject;
23  import com.atlassian.jira.rest.client.domain.BasicWatchers;
24  import com.atlassian.jira.rest.client.domain.Comment;
25  import com.atlassian.jira.rest.client.domain.Issue;
26  import com.atlassian.jira.rest.client.domain.SearchResult;
27  import com.atlassian.jira.rest.client.domain.Transition;
28  import com.atlassian.jira.rest.client.domain.input.ComplexIssueInputFieldValue;
29  import com.atlassian.jira.rest.client.domain.input.FieldInput;
30  import com.atlassian.jira.rest.client.domain.input.TransitionInput;
31  import com.atlassian.jira.rest.client.internal.ServerVersionConstants;
32  import com.atlassian.jira.rest.client.internal.jersey.JerseyJiraRestClientFactory;
33  import com.google.common.collect.Lists;
34  import org.codehaus.jettison.json.JSONException;
35  
36  import java.net.URI;
37  import java.net.URISyntaxException;
38  import java.util.Arrays;
39  import java.util.Collection;
40  import java.util.List;
41  
42  /**
43   * A sample code how to use JRJC library 
44   *
45   * @since v0.1
46   */
47  public class Example1 {
48  
49  	private static URI jiraServerUri = URI.create("http://localhost:2990/jira");
50  	private static boolean quiet = false;
51  
52  	public static void main(String[] args) throws URISyntaxException, JSONException {
53  		parseArgs(args);
54  
55  		final JerseyJiraRestClientFactory factory = new JerseyJiraRestClientFactory();
56  		final JiraRestClient restClient = factory.createWithBasicHttpAuthentication(jiraServerUri, "admin", "admin");
57  		final NullProgressMonitor pm = new NullProgressMonitor();
58  		final int buildNumber = restClient.getMetadataClient().getServerInfo(pm).getBuildNumber();
59  
60  		// first let's get and print all visible projects (only jira4.3+)
61  		if (buildNumber >= ServerVersionConstants.BN_JIRA_4_3) {
62  			final Iterable<BasicProject> allProjects = restClient.getProjectClient().getAllProjects(pm);
63  			for (BasicProject project : allProjects) {
64  				println(project);
65  			}
66  		}
67  
68  		// let's now print all issues matching a JQL string (here: all assigned issues)
69  		if (buildNumber >= ServerVersionConstants.BN_JIRA_4_3) {
70  			final SearchResult searchResult = restClient.getSearchClient().searchJql("assignee is not EMPTY", pm);
71  			for (BasicIssue issue : searchResult.getIssues()) {
72  				println(issue.getKey());
73  			}
74  		}
75  
76  		final Issue issue = restClient.getIssueClient().getIssue("TST-7", pm);
77  
78  		println(issue);
79  
80  		// now let's vote for it
81  		restClient.getIssueClient().vote(issue.getVotesUri(), pm);
82  
83  		// now let's watch it
84  		final BasicWatchers watchers = issue.getWatchers();
85  		if (watchers != null) {
86  			restClient.getIssueClient().watch(watchers.getSelf(), pm);
87  		}
88  
89  		// now let's start progress on this issue
90  		final Iterable<Transition> transitions = restClient.getIssueClient().getTransitions(issue.getTransitionsUri(), pm);
91  		final Transition startProgressTransition = getTransitionByName(transitions, "Start Progress");
92  		restClient.getIssueClient().transition(issue.getTransitionsUri(), new TransitionInput(startProgressTransition.getId()), pm);
93  
94  		// and now let's resolve it as Incomplete
95  		final Transition resolveIssueTransition = getTransitionByName(transitions, "Resolve Issue");
96  		final Collection<FieldInput> fieldInputs;
97  
98  		// Starting from JIRA 5, fields are handled in different way -
99  		if (buildNumber > ServerVersionConstants.BN_JIRA_5) {
100 			fieldInputs = Arrays.asList(new FieldInput("resolution", ComplexIssueInputFieldValue.with("name", "Incomplete")));
101 		}
102 		else {
103 			fieldInputs = Arrays.asList(new FieldInput("resolution", "Incomplete"));
104 		}
105 		final TransitionInput transitionInput = new TransitionInput(resolveIssueTransition.getId(), fieldInputs, Comment.valueOf("My comment"));
106 		restClient.getIssueClient().transition(issue.getTransitionsUri(), transitionInput, pm);
107 
108 	}
109 
110 	private static void println(Object o) {
111 		if (!quiet) {
112 			System.out.println(o);
113 		}
114 	}
115 
116 	private static void parseArgs(String[] argsArray) throws URISyntaxException {
117 		final List<String> args = Lists.newArrayList(argsArray);
118 		if (args.contains("-q")) {
119 			quiet = true;
120 			args.remove(args.indexOf("-q"));
121 		}
122 
123 		if (!args.isEmpty()) {
124 			jiraServerUri = new URI(args.get(0));
125 		}
126 	}
127 
128 	private static Transition getTransitionByName(Iterable<Transition> transitions, String transitionName) {
129 		for (Transition transition : transitions) {
130 			if (transition.getName().equals(transitionName)) {
131 				return transition;
132 			}
133 		}
134 		return null;
135 	}
136 
137 }