Commit 841ca03a355c4f19aa447cc5128fe2caf076ce17
1 parent
edab96f4
Add getBundle method to YoutrackAPI
Showing
10 changed files
with
332 additions
and
2 deletions
@@ -24,6 +24,12 @@ | @@ -24,6 +24,12 @@ | ||
24 | <artifactId>commons-io</artifactId> | 24 | <artifactId>commons-io</artifactId> |
25 | <version>2.3</version> | 25 | <version>2.3</version> |
26 | </dependency> | 26 | </dependency> |
27 | + <dependency> | ||
28 | + <groupId>org.mockito</groupId> | ||
29 | + <artifactId>mockito-all</artifactId> | ||
30 | + <version>1.9.0-rc1</version> | ||
31 | + <scope>test</scope> | ||
32 | + </dependency> | ||
27 | </dependencies> | 33 | </dependencies> |
28 | 34 | ||
29 | <build> | 35 | <build> |
@@ -31,6 +31,7 @@ import pl.com.it_crowd.youtrack.api.exceptions.NoResultFoundException; | @@ -31,6 +31,7 @@ import pl.com.it_crowd.youtrack.api.exceptions.NoResultFoundException; | ||
31 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackAPIException; | 31 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackAPIException; |
32 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; | 32 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; |
33 | import pl.com.it_crowd.youtrack.api.rest.AssigneeList; | 33 | import pl.com.it_crowd.youtrack.api.rest.AssigneeList; |
34 | +import pl.com.it_crowd.youtrack.api.rest.Enumeration; | ||
34 | import pl.com.it_crowd.youtrack.api.rest.Issue; | 35 | import pl.com.it_crowd.youtrack.api.rest.Issue; |
35 | import pl.com.it_crowd.youtrack.api.rest.Issues; | 36 | import pl.com.it_crowd.youtrack.api.rest.Issues; |
36 | import pl.com.it_crowd.youtrack.api.rest.User; | 37 | import pl.com.it_crowd.youtrack.api.rest.User; |
@@ -61,6 +62,8 @@ import java.util.regex.Pattern; | @@ -61,6 +62,8 @@ import java.util.regex.Pattern; | ||
61 | public class YoutrackAPI { | 62 | public class YoutrackAPI { |
62 | // ------------------------------ FIELDS ------------------------------ | 63 | // ------------------------------ FIELDS ------------------------------ |
63 | 64 | ||
65 | + private final static QName Enumeration_QNAME = new QName("", "enumeration"); | ||
66 | + | ||
64 | private final static QName Issue_QNAME = new QName("", "issue"); | 67 | private final static QName Issue_QNAME = new QName("", "issue"); |
65 | 68 | ||
66 | private HttpClient httpClient; | 69 | private HttpClient httpClient; |
@@ -241,6 +244,29 @@ public class YoutrackAPI { | @@ -241,6 +244,29 @@ public class YoutrackAPI { | ||
241 | } | 244 | } |
242 | } | 245 | } |
243 | 246 | ||
247 | + public Enumeration getBundle(String customField) throws IOException, JAXBException | ||
248 | + { | ||
249 | + final URI uri; | ||
250 | + try { | ||
251 | + uri = new URIBuilder(serviceLocation + "/rest/admin/customfield/bundle/" + customField).build(); | ||
252 | + } catch (URISyntaxException e) { | ||
253 | + throw new RuntimeException(e); | ||
254 | + } | ||
255 | + final Object result = YoutrackUnmarshaller.unmarshall(execute(new HttpGet(uri))); | ||
256 | + if (result instanceof Enumeration) { | ||
257 | + return (Enumeration) result; | ||
258 | + } else if (result instanceof JAXBElement) { | ||
259 | + final JAXBElement jaxbElement = (JAXBElement) result; | ||
260 | + if (Enumeration_QNAME.equals(jaxbElement.getName())) { | ||
261 | + return (Enumeration) ((JAXBElement) result).getValue(); | ||
262 | + } else { | ||
263 | + throw new YoutrackAPIException("Unexpected type: " + jaxbElement.getValue()); | ||
264 | + } | ||
265 | + } else { | ||
266 | + throw new YoutrackAPIException("Unexpected type: " + result); | ||
267 | + } | ||
268 | + } | ||
269 | + | ||
244 | public List<User> getIndividualAssignees(String project) throws IOException, JAXBException | 270 | public List<User> getIndividualAssignees(String project) throws IOException, JAXBException |
245 | { | 271 | { |
246 | final URI uri; | 272 | final URI uri; |
1 | +// | ||
2 | +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-833 | ||
3 | +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> | ||
4 | +// Any modifications to this file will be lost upon recompilation of the source schema. | ||
5 | +// | ||
6 | +package pl.com.it_crowd.youtrack.api.rest; | ||
7 | + | ||
8 | +import javax.xml.bind.annotation.XmlAccessType; | ||
9 | +import javax.xml.bind.annotation.XmlAccessorType; | ||
10 | +import javax.xml.bind.annotation.XmlAttribute; | ||
11 | +import javax.xml.bind.annotation.XmlElement; | ||
12 | +import javax.xml.bind.annotation.XmlType; | ||
13 | +import java.util.ArrayList; | ||
14 | +import java.util.List; | ||
15 | + | ||
16 | +/** | ||
17 | + * <p>Java class for enumerationType complex type. | ||
18 | + * <p/> | ||
19 | + * <p>The following schema fragment specifies the expected content contained within this class. | ||
20 | + * <p/> | ||
21 | + * <pre> | ||
22 | + * <complexType name="enumerationType"> | ||
23 | + * <complexContent> | ||
24 | + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> | ||
25 | + * <sequence> | ||
26 | + * <element name="value" type="{}enumerationValueType" maxOccurs="unbounded" minOccurs="0"/> | ||
27 | + * </sequence> | ||
28 | + * <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" /> | ||
29 | + * </restriction> | ||
30 | + * </complexContent> | ||
31 | + * </complexType> | ||
32 | + * </pre> | ||
33 | + */ | ||
34 | +@XmlAccessorType(XmlAccessType.FIELD) | ||
35 | +@XmlType(name = "enumerationType", propOrder = {"values"}) | ||
36 | +public class Enumeration { | ||
37 | +// ------------------------------ FIELDS ------------------------------ | ||
38 | + | ||
39 | + @XmlAttribute | ||
40 | + protected String name; | ||
41 | + | ||
42 | + @XmlElement(name = "value") | ||
43 | + protected List<EnumerationValue> values; | ||
44 | + | ||
45 | +// --------------------- GETTER / SETTER METHODS --------------------- | ||
46 | + | ||
47 | + /** | ||
48 | + * Gets the value of the name property. | ||
49 | + * | ||
50 | + * @return possible object is | ||
51 | + * {@link String } | ||
52 | + */ | ||
53 | + public String getName() | ||
54 | + { | ||
55 | + return name; | ||
56 | + } | ||
57 | + | ||
58 | + /** | ||
59 | + * Sets the value of the name property. | ||
60 | + * | ||
61 | + * @param value allowed object is | ||
62 | + * {@link String } | ||
63 | + */ | ||
64 | + public void setName(String value) | ||
65 | + { | ||
66 | + this.name = value; | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * Gets the value of the values property. | ||
71 | + * <p/> | ||
72 | + * <p/> | ||
73 | + * This accessor method returns a reference to the live list, | ||
74 | + * not a snapshot. Therefore any modification you make to the | ||
75 | + * returned list will be present inside the JAXB object. | ||
76 | + * This is why there is not a <CODE>set</CODE> method for the values property. | ||
77 | + * <p/> | ||
78 | + * <p/> | ||
79 | + * For example, to add a new item, do as follows: | ||
80 | + * <pre> | ||
81 | + * getValues().add(newItem); | ||
82 | + * </pre> | ||
83 | + * <p/> | ||
84 | + * <p/> | ||
85 | + * <p/> | ||
86 | + * Objects of the following type(s) are allowed in the list | ||
87 | + * {@link EnumerationValue } | ||
88 | + */ | ||
89 | + public List<EnumerationValue> getValues() | ||
90 | + { | ||
91 | + if (values == null) { | ||
92 | + values = new ArrayList<EnumerationValue>(); | ||
93 | + } | ||
94 | + return this.values; | ||
95 | + } | ||
96 | +} |
1 | +// | ||
2 | +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-833 | ||
3 | +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> | ||
4 | +// Any modifications to this file will be lost upon recompilation of the source schema. | ||
5 | +// | ||
6 | +package pl.com.it_crowd.youtrack.api.rest; | ||
7 | + | ||
8 | +import javax.xml.bind.annotation.XmlAccessType; | ||
9 | +import javax.xml.bind.annotation.XmlAccessorType; | ||
10 | +import javax.xml.bind.annotation.XmlAttribute; | ||
11 | +import javax.xml.bind.annotation.XmlType; | ||
12 | +import javax.xml.bind.annotation.XmlValue; | ||
13 | + | ||
14 | +/** | ||
15 | + * <p>Java class for enumerationValueType complex type. | ||
16 | + * <p/> | ||
17 | + * <p>The following schema fragment specifies the expected content contained within this class. | ||
18 | + * <p/> | ||
19 | + * <pre> | ||
20 | + * <complexType name="enumerationValueType"> | ||
21 | + * <simpleContent> | ||
22 | + * <extension base="<http://www.w3.org/2001/XMLSchema>string"> | ||
23 | + * <attribute name="colorIndex" type="{http://www.w3.org/2001/XMLSchema}long" /> | ||
24 | + * </extension> | ||
25 | + * </simpleContent> | ||
26 | + * </complexType> | ||
27 | + * </pre> | ||
28 | + */ | ||
29 | +@XmlAccessorType(XmlAccessType.FIELD) | ||
30 | +@XmlType(name = "enumerationValueType", propOrder = {"value"}) | ||
31 | +public class EnumerationValue { | ||
32 | +// ------------------------------ FIELDS ------------------------------ | ||
33 | + | ||
34 | + @XmlAttribute | ||
35 | + protected Long colorIndex; | ||
36 | + | ||
37 | + @XmlValue | ||
38 | + protected String value; | ||
39 | + | ||
40 | +// --------------------- GETTER / SETTER METHODS --------------------- | ||
41 | + | ||
42 | + /** | ||
43 | + * Gets the value of the colorIndex property. | ||
44 | + * | ||
45 | + * @return possible object is | ||
46 | + * {@link Long } | ||
47 | + */ | ||
48 | + public Long getColorIndex() | ||
49 | + { | ||
50 | + return colorIndex; | ||
51 | + } | ||
52 | + | ||
53 | + /** | ||
54 | + * Sets the value of the colorIndex property. | ||
55 | + * | ||
56 | + * @param value allowed object is | ||
57 | + * {@link Long } | ||
58 | + */ | ||
59 | + public void setColorIndex(Long value) | ||
60 | + { | ||
61 | + this.colorIndex = value; | ||
62 | + } | ||
63 | + | ||
64 | + /** | ||
65 | + * Gets the value of the value property. | ||
66 | + * | ||
67 | + * @return possible object is | ||
68 | + * {@link String } | ||
69 | + */ | ||
70 | + public String getValue() | ||
71 | + { | ||
72 | + return value; | ||
73 | + } | ||
74 | + | ||
75 | + /** | ||
76 | + * Sets the value of the value property. | ||
77 | + * | ||
78 | + * @param value allowed object is | ||
79 | + * {@link String } | ||
80 | + */ | ||
81 | + public void setValue(String value) | ||
82 | + { | ||
83 | + this.value = value; | ||
84 | + } | ||
85 | +} |
@@ -31,6 +31,8 @@ public class ObjectFactory { | @@ -31,6 +31,8 @@ public class ObjectFactory { | ||
31 | 31 | ||
32 | private final static QName _CommentValue_QNAME = new QName("", "value"); | 32 | private final static QName _CommentValue_QNAME = new QName("", "value"); |
33 | 33 | ||
34 | + private final static QName _Enumeration_QNAME = new QName("", "enumeration"); | ||
35 | + | ||
34 | private final static QName _Error_QNAME = new QName("", "error"); | 36 | private final static QName _Error_QNAME = new QName("", "error"); |
35 | 37 | ||
36 | private final static QName _Int_QNAME = new QName("", "int"); | 38 | private final static QName _Int_QNAME = new QName("", "int"); |
@@ -115,6 +117,31 @@ public class ObjectFactory { | @@ -115,6 +117,31 @@ public class ObjectFactory { | ||
115 | } | 117 | } |
116 | 118 | ||
117 | /** | 119 | /** |
120 | + * Create an instance of {@link Enumeration } | ||
121 | + */ | ||
122 | + public Enumeration createEnumeration() | ||
123 | + { | ||
124 | + return new Enumeration(); | ||
125 | + } | ||
126 | + | ||
127 | + /** | ||
128 | + * Create an instance of {@link JAXBElement }{@code <}{@link Enumeration }{@code >}} | ||
129 | + */ | ||
130 | + @XmlElementDecl(namespace = "", name = "enumeration") | ||
131 | + public JAXBElement<Enumeration> createEnumeration(Enumeration value) | ||
132 | + { | ||
133 | + return new JAXBElement<Enumeration>(_Enumeration_QNAME, Enumeration.class, null, value); | ||
134 | + } | ||
135 | + | ||
136 | + /** | ||
137 | + * Create an instance of {@link EnumerationValue } | ||
138 | + */ | ||
139 | + public EnumerationValue createEnumerationValue() | ||
140 | + { | ||
141 | + return new EnumerationValue(); | ||
142 | + } | ||
143 | + | ||
144 | + /** | ||
118 | * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} | 145 | * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} |
119 | */ | 146 | */ |
120 | @XmlElementDecl(namespace = "", name = "error") | 147 | @XmlElementDecl(namespace = "", name = "error") |
1 | -<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" | ||
2 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | 1 | +<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
3 | xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"> | 2 | xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"> |
4 | 3 | ||
5 | 4 | ||
@@ -25,6 +24,17 @@ | @@ -25,6 +24,17 @@ | ||
25 | 24 | ||
26 | <jxb:globalBindings localScoping="nested"/> | 25 | <jxb:globalBindings localScoping="nested"/> |
27 | 26 | ||
27 | + <jxb:bindings node=".//xs:complexType[@name='enumerationType']"> | ||
28 | + <jxb:bindings node="./xs:sequence[@id='enumerationTypeValue']"> | ||
29 | + <jxb:property name="values"/> | ||
30 | + </jxb:bindings> | ||
31 | + <jxb:class name="Enumeration"/> | ||
32 | + </jxb:bindings> | ||
33 | + | ||
34 | + <jxb:bindings node=".//xs:complexType[@name='enumerationValueType']"> | ||
35 | + <jxb:class name="EnumerationValue"/> | ||
36 | + </jxb:bindings> | ||
37 | + | ||
28 | <jxb:bindings node=".//xs:complexType[@name='fieldType']"> | 38 | <jxb:bindings node=".//xs:complexType[@name='fieldType']"> |
29 | <jxb:bindings node="./xs:sequence[@id='value']"> | 39 | <jxb:bindings node="./xs:sequence[@id='value']"> |
30 | <jxb:property name="values"/> | 40 | <jxb:property name="values"/> |
src/main/xsd/bundle.xml
0 → 100644
src/main/xsd/bundle.xsd
0 → 100644
@@ -15,6 +15,21 @@ | @@ -15,6 +15,21 @@ | ||
15 | <xs:attribute type="xs:string" name="isIndividualAssignee" use="optional"/> | 15 | <xs:attribute type="xs:string" name="isIndividualAssignee" use="optional"/> |
16 | </xs:complexType> | 16 | </xs:complexType> |
17 | 17 | ||
18 | + <xs:complexType name="enumerationType"> | ||
19 | + <xs:sequence id="enumerationTypeValue"> | ||
20 | + <xs:element type="enumerationValueType" name="value" maxOccurs="unbounded" minOccurs="0"/> | ||
21 | + </xs:sequence> | ||
22 | + <xs:attribute type="xs:string" name="name"/> | ||
23 | + </xs:complexType> | ||
24 | + | ||
25 | + <xs:complexType name="enumerationValueType"> | ||
26 | + <xs:simpleContent> | ||
27 | + <xs:extension base="xs:string"> | ||
28 | + <xs:attribute type="xs:long" name="colorIndex" use="optional"/> | ||
29 | + </xs:extension> | ||
30 | + </xs:simpleContent> | ||
31 | + </xs:complexType> | ||
32 | + | ||
18 | <xs:complexType name="fieldType"> | 33 | <xs:complexType name="fieldType"> |
19 | <xs:sequence id="value" maxOccurs="unbounded" minOccurs="0"> | 34 | <xs:sequence id="value" maxOccurs="unbounded" minOccurs="0"> |
20 | <xs:element name="value"> | 35 | <xs:element name="value"> |
1 | package pl.com.it_crowd.youtrack.api.rest; | 1 | package pl.com.it_crowd.youtrack.api.rest; |
2 | 2 | ||
3 | import junit.framework.Assert; | 3 | import junit.framework.Assert; |
4 | +import org.apache.commons.io.input.ReaderInputStream; | ||
5 | +import org.apache.http.HttpEntity; | ||
6 | +import org.apache.http.HttpResponse; | ||
4 | import org.apache.http.HttpStatus; | 7 | import org.apache.http.HttpStatus; |
8 | +import org.apache.http.StatusLine; | ||
5 | import org.apache.http.auth.AuthenticationException; | 9 | import org.apache.http.auth.AuthenticationException; |
10 | +import org.apache.http.client.HttpClient; | ||
11 | +import org.apache.http.client.methods.HttpUriRequest; | ||
6 | import org.junit.Test; | 12 | import org.junit.Test; |
7 | import pl.com.it_crowd.youtrack.api.Command; | 13 | import pl.com.it_crowd.youtrack.api.Command; |
8 | import pl.com.it_crowd.youtrack.api.Filter; | 14 | import pl.com.it_crowd.youtrack.api.Filter; |
@@ -15,8 +21,15 @@ import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; | @@ -15,8 +21,15 @@ import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; | ||
15 | 21 | ||
16 | import javax.xml.bind.JAXBException; | 22 | import javax.xml.bind.JAXBException; |
17 | import java.io.IOException; | 23 | import java.io.IOException; |
24 | +import java.io.StringReader; | ||
18 | import java.util.List; | 25 | import java.util.List; |
19 | 26 | ||
27 | +import static org.junit.Assert.assertEquals; | ||
28 | +import static org.junit.Assert.assertNotNull; | ||
29 | +import static org.mockito.Matchers.any; | ||
30 | +import static org.mockito.Mockito.mock; | ||
31 | +import static org.mockito.Mockito.when; | ||
32 | + | ||
20 | /** | 33 | /** |
21 | * This test requires Youtrack instance with "Test(TST)" project to be running and expects following JVM params: | 34 | * This test requires Youtrack instance with "Test(TST)" project to be running and expects following JVM params: |
22 | * youtrackLocation, youtrackUsername and youtrackPassword. | 35 | * youtrackLocation, youtrackUsername and youtrackPassword. |
@@ -104,6 +117,43 @@ public class YoutrackAPITest { | @@ -104,6 +117,43 @@ public class YoutrackAPITest { | ||
104 | } | 117 | } |
105 | 118 | ||
106 | @Test | 119 | @Test |
120 | + public void getBundle() throws Exception | ||
121 | + { | ||
122 | +// Given | ||
123 | + final HttpResponse httpResponse = mock(HttpResponse.class); | ||
124 | + final HttpEntity httpEntity = mock(HttpEntity.class); | ||
125 | + final String response = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><enumeration name=\"Priorities\"><value colorIndex=\"20\">Show-stopper</value><value colorIndex=\"19\">Critical</value><value colorIndex=\"18\">Major</value><value colorIndex=\"17\">Normal</value><value colorIndex=\"16\">Minor</value></enumeration>"; | ||
126 | + when(httpEntity.getContent()).thenReturn(new ReaderInputStream(new StringReader(response))); | ||
127 | + when(httpEntity.getContentLength()).thenReturn((long) response.getBytes().length); | ||
128 | + when(httpResponse.getEntity()).thenReturn(httpEntity); | ||
129 | + final StatusLine statusLine = mock(StatusLine.class); | ||
130 | + when(statusLine.getStatusCode()).thenReturn(200); | ||
131 | + when(httpResponse.getStatusLine()).thenReturn(statusLine); | ||
132 | + final HttpClient httpClient = mock(HttpClient.class); | ||
133 | + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(httpResponse); | ||
134 | + final YoutrackAPI youtrackAPI = new YoutrackAPI("zonk", httpClient); | ||
135 | + | ||
136 | +// When | ||
137 | + final Enumeration priorities = youtrackAPI.getBundle("Priorities"); | ||
138 | + | ||
139 | +// Then | ||
140 | + assertNotNull(priorities); | ||
141 | + assertEquals("Priorities", priorities.getName()); | ||
142 | + assertNotNull(priorities.getValues()); | ||
143 | + assertEquals(5, priorities.getValues().size()); | ||
144 | + assertEquals("Show-stopper", priorities.getValues().get(0).getValue()); | ||
145 | + assertEquals(new Long(20), priorities.getValues().get(0).getColorIndex()); | ||
146 | + assertEquals("Critical", priorities.getValues().get(1).getValue()); | ||
147 | + assertEquals(new Long(19), priorities.getValues().get(1).getColorIndex()); | ||
148 | + assertEquals("Major", priorities.getValues().get(2).getValue()); | ||
149 | + assertEquals(new Long(18), priorities.getValues().get(2).getColorIndex()); | ||
150 | + assertEquals("Normal", priorities.getValues().get(3).getValue()); | ||
151 | + assertEquals(new Long(17), priorities.getValues().get(3).getColorIndex()); | ||
152 | + assertEquals("Minor", priorities.getValues().get(4).getValue()); | ||
153 | + assertEquals(new Long(16), priorities.getValues().get(4).getColorIndex()); | ||
154 | + } | ||
155 | + | ||
156 | + @Test | ||
107 | public void getIndividualAssignees() throws IOException, JAXBException | 157 | public void getIndividualAssignees() throws IOException, JAXBException |
108 | { | 158 | { |
109 | final YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); | 159 | final YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); |
Please
register
or
login
to post a comment