Showing
10 changed files
with
308 additions
and
90 deletions
1 | -package pl.itcrowd.youtrack.api; | ||
2 | - | ||
3 | -import org.apache.commons.io.IOUtils; | ||
4 | -import pl.itcrowd.youtrack.api.rest.ObjectFactory; | ||
5 | - | ||
6 | -import javax.xml.bind.JAXBContext; | ||
7 | -import javax.xml.bind.JAXBElement; | ||
8 | -import javax.xml.bind.JAXBException; | ||
9 | -import java.io.IOException; | ||
10 | -import java.io.Reader; | ||
11 | -import java.io.StringReader; | ||
12 | - | ||
13 | -//TODO methods from this class should be probably merged with YoutrackUnmarshaller | ||
14 | -public final class ErrorUnmarshaller { | ||
15 | - | ||
16 | - public static String unmarshal(String string) throws JAXBException, IOException | ||
17 | - { | ||
18 | - return unmarshal(new StringReader(string)); | ||
19 | - } | ||
20 | - | ||
21 | - public static String unmarshal(Reader reader) throws JAXBException, IOException | ||
22 | - { | ||
23 | - String content = IOUtils.toString(reader); | ||
24 | - try { | ||
25 | - JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); | ||
26 | - @SuppressWarnings("unchecked") | ||
27 | - final JAXBElement<String> element = (JAXBElement<String>) jaxbContext.createUnmarshaller().unmarshal(new StringReader(content)); | ||
28 | - return element.getValue(); | ||
29 | - } catch (JAXBException e) { | ||
30 | -// TODO we need logging here | ||
31 | - System.err.println("Cannot unmarshal input stream.\n" + content + e); | ||
32 | - throw e; | ||
33 | - } | ||
34 | - } | ||
35 | - | ||
36 | - private ErrorUnmarshaller() | ||
37 | - { | ||
38 | - } | ||
39 | -} |
@@ -345,13 +345,14 @@ public class YoutrackAPI { | @@ -345,13 +345,14 @@ public class YoutrackAPI { | ||
345 | 345 | ||
346 | private String execute(HttpUriRequest request) throws IOException | 346 | private String execute(HttpUriRequest request) throws IOException |
347 | { | 347 | { |
348 | + request.addHeader("Accept","application/xml"); | ||
348 | final HttpResponse response = httpClient.execute(request); | 349 | final HttpResponse response = httpClient.execute(request); |
349 | final StatusLine statusLine = response.getStatusLine(); | 350 | final StatusLine statusLine = response.getStatusLine(); |
350 | final HttpEntity entity = response.getEntity(); | 351 | final HttpEntity entity = response.getEntity(); |
351 | String responseText = entity == null ? null : EntityUtils.toString(entity); | 352 | String responseText = entity == null ? null : EntityUtils.toString(entity); |
352 | if (statusLine.getStatusCode() >= 300) { | 353 | if (statusLine.getStatusCode() >= 300) { |
353 | try { | 354 | try { |
354 | - final String error = ErrorUnmarshaller.unmarshal(responseText); | 355 | + final String error = YoutrackUnmarshaller.unmarshalError(responseText); |
355 | throw new YoutrackErrorException(error, statusLine.getStatusCode()); | 356 | throw new YoutrackErrorException(error, statusLine.getStatusCode()); |
356 | } catch (JAXBException e) { | 357 | } catch (JAXBException e) { |
357 | LOG.error("Cannot unmarshal following response text:\n" + responseText, e); | 358 | LOG.error("Cannot unmarshal following response text:\n" + responseText, e); |
1 | package pl.itcrowd.youtrack.api; | 1 | package pl.itcrowd.youtrack.api; |
2 | 2 | ||
3 | +import org.apache.commons.io.IOUtils; | ||
4 | +import org.apache.commons.logging.Log; | ||
5 | +import org.apache.commons.logging.LogFactory; | ||
6 | +import pl.itcrowd.youtrack.api.exceptions.YoutrackAPIException; | ||
7 | +import pl.itcrowd.youtrack.api.rest.ErrorType; | ||
3 | import pl.itcrowd.youtrack.api.rest.ObjectFactory; | 8 | import pl.itcrowd.youtrack.api.rest.ObjectFactory; |
4 | 9 | ||
5 | import javax.xml.bind.JAXBContext; | 10 | import javax.xml.bind.JAXBContext; |
11 | +import javax.xml.bind.JAXBElement; | ||
6 | import javax.xml.bind.JAXBException; | 12 | import javax.xml.bind.JAXBException; |
13 | +import java.io.IOException; | ||
7 | import java.io.Reader; | 14 | import java.io.Reader; |
15 | +import java.io.Serializable; | ||
8 | import java.io.StringReader; | 16 | import java.io.StringReader; |
9 | 17 | ||
10 | public final class YoutrackUnmarshaller { | 18 | public final class YoutrackUnmarshaller { |
11 | 19 | ||
20 | + private static Log LOG = LogFactory.getLog(YoutrackUnmarshaller.class); | ||
21 | + | ||
22 | + private YoutrackUnmarshaller() | ||
23 | + { | ||
24 | + } | ||
25 | + | ||
26 | + public static String unmarshalError(String string) throws JAXBException, IOException | ||
27 | + { | ||
28 | + return unmarshalError(new StringReader(string)); | ||
29 | + } | ||
30 | + | ||
31 | + public static String unmarshalError(Reader reader) throws JAXBException, IOException | ||
32 | + { | ||
33 | + String content = IOUtils.toString(reader); | ||
34 | + try { | ||
35 | + JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); | ||
36 | + @SuppressWarnings("unchecked") | ||
37 | + final JAXBElement<ErrorType> element = (JAXBElement<ErrorType>) jaxbContext.createUnmarshaller().unmarshal(new StringReader(content)); | ||
38 | + final ErrorType value = element.getValue(); | ||
39 | + final int contentSize = value.getContent().size(); | ||
40 | + if (contentSize == 0) { | ||
41 | + return ""; | ||
42 | + } else if (contentSize == 1) { | ||
43 | + final Serializable serializable = value.getContent().get(0); | ||
44 | + if (serializable instanceof JAXBElement) { | ||
45 | + if ("message".equals(((JAXBElement) serializable).getName().getLocalPart())) { | ||
46 | + final Object messageValue = ((JAXBElement) serializable).getValue(); | ||
47 | + return messageValue == null ? "" : messageValue.toString(); | ||
48 | + } | ||
49 | + } else { | ||
50 | + return serializable == null ? "" : serializable.toString(); | ||
51 | + } | ||
52 | + } else if (contentSize == 2) { | ||
53 | + for (Serializable serializable : value.getContent()) { | ||
54 | + if (serializable instanceof JAXBElement) { | ||
55 | + if ("message".equals(((JAXBElement) serializable).getName().getLocalPart())) { | ||
56 | + final Object messageValue = ((JAXBElement) serializable).getValue(); | ||
57 | + return messageValue == null ? "" : messageValue.toString(); | ||
58 | + } | ||
59 | + } | ||
60 | + } | ||
61 | + } | ||
62 | + throw new YoutrackAPIException("Cannot unserialize error.\n" + content); | ||
63 | + } catch (JAXBException e) { | ||
64 | + LOG.error("Cannot unmarshal error.\n" + content, e); | ||
65 | + throw e; | ||
66 | + } | ||
67 | + } | ||
68 | + | ||
12 | public static Object unmarshall(String string) throws JAXBException | 69 | public static Object unmarshall(String string) throws JAXBException |
13 | { | 70 | { |
14 | return unmarshall(new StringReader(string)); | 71 | return unmarshall(new StringReader(string)); |
@@ -18,8 +75,4 @@ public final class YoutrackUnmarshaller { | @@ -18,8 +75,4 @@ public final class YoutrackUnmarshaller { | ||
18 | { | 75 | { |
19 | return JAXBContext.newInstance(ObjectFactory.class).createUnmarshaller().unmarshal(reader); | 76 | return JAXBContext.newInstance(ObjectFactory.class).createUnmarshaller().unmarshal(reader); |
20 | } | 77 | } |
21 | - | ||
22 | - private YoutrackUnmarshaller() | ||
23 | - { | ||
24 | - } | ||
25 | } | 78 | } |
@@ -108,8 +108,8 @@ public class Comment { | @@ -108,8 +108,8 @@ public class Comment { | ||
108 | * <p/> | 108 | * <p/> |
109 | * Objects of the following type(s) are allowed in the list | 109 | * Objects of the following type(s) are allowed in the list |
110 | * {@link JAXBElement }{@code <}{@link Comment.Value }{@code >} | 110 | * {@link JAXBElement }{@code <}{@link Comment.Value }{@code >} |
111 | - * {@link JAXBElement }{@code <}{@link String }{@code >} | ||
112 | * {@link String } | 111 | * {@link String } |
112 | + * {@link JAXBElement }{@code <}{@link String }{@code >} | ||
113 | */ | 113 | */ |
114 | public List<Serializable> getContent() | 114 | public List<Serializable> getContent() |
115 | { | 115 | { |
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.itcrowd.youtrack.api.rest; | ||
7 | + | ||
8 | +import javax.xml.bind.JAXBElement; | ||
9 | +import javax.xml.bind.annotation.XmlAccessType; | ||
10 | +import javax.xml.bind.annotation.XmlAccessorType; | ||
11 | +import javax.xml.bind.annotation.XmlElementRef; | ||
12 | +import javax.xml.bind.annotation.XmlElementRefs; | ||
13 | +import javax.xml.bind.annotation.XmlMixed; | ||
14 | +import javax.xml.bind.annotation.XmlType; | ||
15 | +import java.io.Serializable; | ||
16 | +import java.util.ArrayList; | ||
17 | +import java.util.List; | ||
18 | + | ||
19 | +/** | ||
20 | + * <p>Java class for errorType complex type. | ||
21 | + * <p/> | ||
22 | + * <p>The following schema fragment specifies the expected content contained within this class. | ||
23 | + * <p/> | ||
24 | + * <pre> | ||
25 | + * <complexType name="errorType"> | ||
26 | + * <complexContent> | ||
27 | + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> | ||
28 | + * <sequence> | ||
29 | + * <element name="message" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> | ||
30 | + * <element name="field" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> | ||
31 | + * </sequence> | ||
32 | + * </restriction> | ||
33 | + * </complexContent> | ||
34 | + * </complexType> | ||
35 | + * </pre> | ||
36 | + */ | ||
37 | +@XmlAccessorType(XmlAccessType.FIELD) | ||
38 | +@XmlType(name = "errorType", propOrder = {"content"}) | ||
39 | +public class ErrorType { | ||
40 | + | ||
41 | + @XmlElementRefs({@XmlElementRef(name = "message", type = JAXBElement.class), @XmlElementRef(name = "field", type = JAXBElement.class)}) | ||
42 | + @XmlMixed | ||
43 | + protected List<Serializable> content; | ||
44 | + | ||
45 | + /** | ||
46 | + * Gets the value of the content property. | ||
47 | + * <p/> | ||
48 | + * <p/> | ||
49 | + * This accessor method returns a reference to the live list, | ||
50 | + * not a snapshot. Therefore any modification you make to the | ||
51 | + * returned list will be present inside the JAXB object. | ||
52 | + * This is why there is not a <CODE>set</CODE> method for the content property. | ||
53 | + * <p/> | ||
54 | + * <p/> | ||
55 | + * For example, to add a new item, do as follows: | ||
56 | + * <pre> | ||
57 | + * getContent().add(newItem); | ||
58 | + * </pre> | ||
59 | + * <p/> | ||
60 | + * <p/> | ||
61 | + * <p/> | ||
62 | + * Objects of the following type(s) are allowed in the list | ||
63 | + * {@link JAXBElement }{@code <}{@link String }{@code >} | ||
64 | + * {@link String } | ||
65 | + * {@link JAXBElement }{@code <}{@link String }{@code >} | ||
66 | + */ | ||
67 | + public List<Serializable> getContent() | ||
68 | + { | ||
69 | + if (content == null) { | ||
70 | + content = new ArrayList<Serializable>(); | ||
71 | + } | ||
72 | + return this.content; | ||
73 | + } | ||
74 | +} |
@@ -37,7 +37,7 @@ import java.util.List; | @@ -37,7 +37,7 @@ import java.util.List; | ||
37 | @XmlType(name = "issueType", propOrder = {"fieldOrComment"}) | 37 | @XmlType(name = "issueType", propOrder = {"fieldOrComment"}) |
38 | public class Issue { | 38 | public class Issue { |
39 | 39 | ||
40 | - @XmlElements({@XmlElement(name = "comment", type = Comment.class), @XmlElement(name = "field", type = Field.class)}) | 40 | + @XmlElements({@XmlElement(name = "field", type = Field.class), @XmlElement(name = "comment", type = Comment.class)}) |
41 | protected List<Object> fieldOrComment; | 41 | protected List<Object> fieldOrComment; |
42 | 42 | ||
43 | @XmlAttribute | 43 | @XmlAttribute |
@@ -61,8 +61,8 @@ public class Issue { | @@ -61,8 +61,8 @@ public class Issue { | ||
61 | * <p/> | 61 | * <p/> |
62 | * <p/> | 62 | * <p/> |
63 | * Objects of the following type(s) are allowed in the list | 63 | * Objects of the following type(s) are allowed in the list |
64 | - * {@link Comment } | ||
65 | * {@link Field } | 64 | * {@link Field } |
65 | + * {@link Comment } | ||
66 | */ | 66 | */ |
67 | public List<Object> getFieldOrComment() | 67 | public List<Object> getFieldOrComment() |
68 | { | 68 | { |
@@ -38,6 +38,10 @@ public class ObjectFactory { | @@ -38,6 +38,10 @@ public class ObjectFactory { | ||
38 | 38 | ||
39 | private final static QName _CommentValue_QNAME = new QName("", "value"); | 39 | private final static QName _CommentValue_QNAME = new QName("", "value"); |
40 | 40 | ||
41 | + private final static QName _ErrorTypeField_QNAME = new QName("", "field"); | ||
42 | + | ||
43 | + private final static QName _ErrorTypeMessage_QNAME = new QName("", "message"); | ||
44 | + | ||
41 | /** | 45 | /** |
42 | * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: pl.itcrowd.youtrack.api.rest | 46 | * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: pl.itcrowd.youtrack.api.rest |
43 | */ | 47 | */ |
@@ -46,27 +50,27 @@ public class ObjectFactory { | @@ -46,27 +50,27 @@ public class ObjectFactory { | ||
46 | } | 50 | } |
47 | 51 | ||
48 | /** | 52 | /** |
49 | - * Create an instance of {@link Comment.Value } | 53 | + * Create an instance of {@link Field } |
50 | */ | 54 | */ |
51 | - public Comment.Value createCommentValue() | 55 | + public Field createField() |
52 | { | 56 | { |
53 | - return new Comment.Value(); | 57 | + return new Field(); |
54 | } | 58 | } |
55 | 59 | ||
56 | /** | 60 | /** |
57 | - * Create an instance of {@link EnumerationValue } | 61 | + * Create an instance of {@link Enumeration } |
58 | */ | 62 | */ |
59 | - public EnumerationValue createEnumerationValue() | 63 | + public Enumeration createEnumeration() |
60 | { | 64 | { |
61 | - return new EnumerationValue(); | 65 | + return new Enumeration(); |
62 | } | 66 | } |
63 | 67 | ||
64 | /** | 68 | /** |
65 | - * Create an instance of {@link Issue } | 69 | + * Create an instance of {@link User } |
66 | */ | 70 | */ |
67 | - public Issue createIssue() | 71 | + public User createUser() |
68 | { | 72 | { |
69 | - return new Issue(); | 73 | + return new User(); |
70 | } | 74 | } |
71 | 75 | ||
72 | /** | 76 | /** |
@@ -78,59 +82,67 @@ public class ObjectFactory { | @@ -78,59 +82,67 @@ public class ObjectFactory { | ||
78 | } | 82 | } |
79 | 83 | ||
80 | /** | 84 | /** |
81 | - * Create an instance of {@link User } | 85 | + * Create an instance of {@link Issues } |
82 | */ | 86 | */ |
83 | - public User createUser() | 87 | + public Issues createIssues() |
84 | { | 88 | { |
85 | - return new User(); | 89 | + return new Issues(); |
86 | } | 90 | } |
87 | 91 | ||
88 | /** | 92 | /** |
89 | - * Create an instance of {@link Issues } | 93 | + * Create an instance of {@link AssigneeList } |
90 | */ | 94 | */ |
91 | - public Issues createIssues() | 95 | + public AssigneeList createAssigneeList() |
92 | { | 96 | { |
93 | - return new Issues(); | 97 | + return new AssigneeList(); |
94 | } | 98 | } |
95 | 99 | ||
96 | /** | 100 | /** |
97 | - * Create an instance of {@link Field } | 101 | + * Create an instance of {@link Field.Value } |
98 | */ | 102 | */ |
99 | - public Field createField() | 103 | + public Field.Value createFieldValue() |
100 | { | 104 | { |
101 | - return new Field(); | 105 | + return new Field.Value(); |
102 | } | 106 | } |
103 | 107 | ||
104 | /** | 108 | /** |
105 | - * Create an instance of {@link Comment } | 109 | + * Create an instance of {@link AssigneeType } |
106 | */ | 110 | */ |
107 | - public Comment createComment() | 111 | + public AssigneeType createAssigneeType() |
108 | { | 112 | { |
109 | - return new Comment(); | 113 | + return new AssigneeType(); |
110 | } | 114 | } |
111 | 115 | ||
112 | /** | 116 | /** |
113 | - * Create an instance of {@link AssigneeList.Assignees } | 117 | + * Create an instance of {@link ErrorType } |
114 | */ | 118 | */ |
115 | - public AssigneeList.Assignees createAssigneeListAssignees() | 119 | + public ErrorType createErrorType() |
116 | { | 120 | { |
117 | - return new AssigneeList.Assignees(); | 121 | + return new ErrorType(); |
118 | } | 122 | } |
119 | 123 | ||
120 | /** | 124 | /** |
121 | - * Create an instance of {@link Enumeration } | 125 | + * Create an instance of {@link AssignedByType } |
122 | */ | 126 | */ |
123 | - public Enumeration createEnumeration() | 127 | + public AssignedByType createAssignedByType() |
124 | { | 128 | { |
125 | - return new Enumeration(); | 129 | + return new AssignedByType(); |
126 | } | 130 | } |
127 | 131 | ||
128 | /** | 132 | /** |
129 | - * Create an instance of {@link AssigneeList } | 133 | + * Create an instance of {@link EnumerationValue } |
130 | */ | 134 | */ |
131 | - public AssigneeList createAssigneeList() | 135 | + public EnumerationValue createEnumerationValue() |
132 | { | 136 | { |
133 | - return new AssigneeList(); | 137 | + return new EnumerationValue(); |
138 | + } | ||
139 | + | ||
140 | + /** | ||
141 | + * Create an instance of {@link AssigneeList.Assignees } | ||
142 | + */ | ||
143 | + public AssigneeList.Assignees createAssigneeListAssignees() | ||
144 | + { | ||
145 | + return new AssigneeList.Assignees(); | ||
134 | } | 146 | } |
135 | 147 | ||
136 | /** | 148 | /** |
@@ -142,36 +154,36 @@ public class ObjectFactory { | @@ -142,36 +154,36 @@ public class ObjectFactory { | ||
142 | } | 154 | } |
143 | 155 | ||
144 | /** | 156 | /** |
145 | - * Create an instance of {@link Field.Value } | 157 | + * Create an instance of {@link Comment } |
146 | */ | 158 | */ |
147 | - public Field.Value createFieldValue() | 159 | + public Comment createComment() |
148 | { | 160 | { |
149 | - return new Field.Value(); | 161 | + return new Comment(); |
150 | } | 162 | } |
151 | 163 | ||
152 | /** | 164 | /** |
153 | - * Create an instance of {@link AssignedByType } | 165 | + * Create an instance of {@link Comment.Value } |
154 | */ | 166 | */ |
155 | - public AssignedByType createAssignedByType() | 167 | + public Comment.Value createCommentValue() |
156 | { | 168 | { |
157 | - return new AssignedByType(); | 169 | + return new Comment.Value(); |
158 | } | 170 | } |
159 | 171 | ||
160 | /** | 172 | /** |
161 | - * Create an instance of {@link AssigneeType } | 173 | + * Create an instance of {@link Issue } |
162 | */ | 174 | */ |
163 | - public AssigneeType createAssigneeType() | 175 | + public Issue createIssue() |
164 | { | 176 | { |
165 | - return new AssigneeType(); | 177 | + return new Issue(); |
166 | } | 178 | } |
167 | 179 | ||
168 | /** | 180 | /** |
169 | - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} | 181 | + * Create an instance of {@link JAXBElement }{@code <}{@link ErrorType }{@code >}} |
170 | */ | 182 | */ |
171 | @XmlElementDecl(namespace = "", name = "error") | 183 | @XmlElementDecl(namespace = "", name = "error") |
172 | - public JAXBElement<String> createError(String value) | 184 | + public JAXBElement<ErrorType> createError(ErrorType value) |
173 | { | 185 | { |
174 | - return new JAXBElement<String>(_Error_QNAME, String.class, null, value); | 186 | + return new JAXBElement<ErrorType>(_Error_QNAME, ErrorType.class, null, value); |
175 | } | 187 | } |
176 | 188 | ||
177 | /** | 189 | /** |
@@ -218,4 +230,22 @@ public class ObjectFactory { | @@ -218,4 +230,22 @@ public class ObjectFactory { | ||
218 | { | 230 | { |
219 | return new JAXBElement<Comment.Value>(_CommentValue_QNAME, Comment.Value.class, Comment.class, value); | 231 | return new JAXBElement<Comment.Value>(_CommentValue_QNAME, Comment.Value.class, Comment.class, value); |
220 | } | 232 | } |
233 | + | ||
234 | + /** | ||
235 | + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} | ||
236 | + */ | ||
237 | + @XmlElementDecl(namespace = "", name = "field", scope = ErrorType.class) | ||
238 | + public JAXBElement<String> createErrorTypeField(String value) | ||
239 | + { | ||
240 | + return new JAXBElement<String>(_ErrorTypeField_QNAME, String.class, ErrorType.class, value); | ||
241 | + } | ||
242 | + | ||
243 | + /** | ||
244 | + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} | ||
245 | + */ | ||
246 | + @XmlElementDecl(namespace = "", name = "message", scope = ErrorType.class) | ||
247 | + public JAXBElement<String> createErrorTypeMessage(String value) | ||
248 | + { | ||
249 | + return new JAXBElement<String>(_ErrorTypeMessage_QNAME, String.class, ErrorType.class, value); | ||
250 | + } | ||
221 | } | 251 | } |
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> | 2 | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
3 | - <xs:element name="error" type="xs:string"/> | 3 | + |
4 | + <xs:include schemaLocation="types.xsd"/> | ||
5 | + | ||
6 | + <xs:element name="error" type="errorType"/> | ||
7 | + | ||
4 | </xs:schema> | 8 | </xs:schema> |
@@ -30,6 +30,13 @@ | @@ -30,6 +30,13 @@ | ||
30 | </xs:simpleContent> | 30 | </xs:simpleContent> |
31 | </xs:complexType> | 31 | </xs:complexType> |
32 | 32 | ||
33 | + <xs:complexType name="errorType" mixed="true"> | ||
34 | + <xs:sequence> | ||
35 | + <xs:element type="xs:string" name="message" minOccurs="0"/> | ||
36 | + <xs:element type="xs:string" name="field" minOccurs="0"/> | ||
37 | + </xs:sequence> | ||
38 | + </xs:complexType> | ||
39 | + | ||
33 | <xs:complexType name="fieldType"> | 40 | <xs:complexType name="fieldType"> |
34 | <xs:sequence id="value" maxOccurs="unbounded" minOccurs="0"> | 41 | <xs:sequence id="value" maxOccurs="unbounded" minOccurs="0"> |
35 | <xs:element name="value"> | 42 | <xs:element name="value"> |
1 | +package pl.itcrowd.youtrack.api.rest; | ||
2 | + | ||
3 | +import org.junit.Test; | ||
4 | +import pl.itcrowd.youtrack.api.YoutrackUnmarshaller; | ||
5 | +import pl.itcrowd.youtrack.api.exceptions.YoutrackAPIException; | ||
6 | + | ||
7 | +import javax.xml.bind.JAXBException; | ||
8 | +import java.io.IOException; | ||
9 | + | ||
10 | +import static junit.framework.Assert.assertEquals; | ||
11 | + | ||
12 | +public class YoutrackUnmarshallerTest { | ||
13 | + | ||
14 | + @Test | ||
15 | + public void unmarshalEmptyError() throws JAXBException, IOException | ||
16 | + { | ||
17 | +// Given | ||
18 | + final String extendedErrorResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><error></error>"; | ||
19 | + | ||
20 | +// When | ||
21 | + final String errorText = YoutrackUnmarshaller.unmarshalError(extendedErrorResponse); | ||
22 | + | ||
23 | +// THen | ||
24 | + assertEquals("", errorText); | ||
25 | + } | ||
26 | + | ||
27 | + @Test | ||
28 | + public void unmarshalError() throws JAXBException, IOException | ||
29 | + { | ||
30 | +// Given | ||
31 | + final String extendedErrorResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><error>Estimated completion time</error>"; | ||
32 | + | ||
33 | +// When | ||
34 | + final String errorText = YoutrackUnmarshaller.unmarshalError(extendedErrorResponse); | ||
35 | + | ||
36 | +// THen | ||
37 | + assertEquals("Estimated completion time", errorText); | ||
38 | + } | ||
39 | + | ||
40 | + @Test | ||
41 | + public void unmarshalExtendedError() throws JAXBException, IOException | ||
42 | + { | ||
43 | +// Given | ||
44 | + final String extendedErrorResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><error><message>Estimate task before starting work on it</message><field>Estimated completion time</field></error>"; | ||
45 | + | ||
46 | +// When | ||
47 | + final String errorText = YoutrackUnmarshaller.unmarshalError(extendedErrorResponse); | ||
48 | + | ||
49 | +// Then | ||
50 | + assertEquals("Estimate task before starting work on it", errorText); | ||
51 | + } | ||
52 | + | ||
53 | + @Test | ||
54 | + public void unmarshalExtendedErrorWithMessageOnly() throws JAXBException, IOException | ||
55 | + { | ||
56 | +// Given | ||
57 | + final String extendedErrorResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><error><message>Estimate task before starting work on it</message></error>"; | ||
58 | + | ||
59 | +// When | ||
60 | + final String errorText = YoutrackUnmarshaller.unmarshalError(extendedErrorResponse); | ||
61 | + | ||
62 | +// Then | ||
63 | + assertEquals("Estimate task before starting work on it", errorText); | ||
64 | + } | ||
65 | + | ||
66 | + @Test | ||
67 | + public void unmarshalExtendedErrorWithEmptyMessage() throws JAXBException, IOException | ||
68 | + { | ||
69 | +// Given | ||
70 | + final String extendedErrorResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><error><message></message><field>Estimated completion time</field></error>"; | ||
71 | + | ||
72 | +// When | ||
73 | + final String errorText = YoutrackUnmarshaller.unmarshalError(extendedErrorResponse); | ||
74 | + | ||
75 | +// Then | ||
76 | + assertEquals("", errorText); | ||
77 | + } | ||
78 | + | ||
79 | + @Test(expected = YoutrackAPIException.class) | ||
80 | + public void unmarshalExtendedErrorWithoutMessage() throws JAXBException, IOException | ||
81 | + { | ||
82 | +// Given | ||
83 | + final String extendedErrorResponse = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><error><field>Estimated completion time</field></error>"; | ||
84 | + | ||
85 | +// When | ||
86 | + YoutrackUnmarshaller.unmarshalError(extendedErrorResponse); | ||
87 | + } | ||
88 | +} |
Please
register
or
login
to post a comment