View Javadoc

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 com.atlassian.jira.rest.client.internal.json;
18  
19  import com.atlassian.jira.rest.client.api.domain.BasicUser;
20  import com.atlassian.jira.rest.client.api.domain.IssueField;
21  import org.codehaus.jettison.json.JSONException;
22  import org.codehaus.jettison.json.JSONObject;
23  
24  import java.util.HashMap;
25  import java.util.Map;
26  
27  public class IssueFieldJsonParser {
28      private static final String VALUE_ATTRIBUTE = "value";
29  
30      private Map<String, JsonObjectParser> registeredValueParsers = new HashMap<String, JsonObjectParser>() {{
31          put("com.atlassian.jira.plugin.system.customfieldtypes:float", new FloatingPointFieldValueParser());
32          put("com.atlassian.jira.plugin.system.customfieldtypes:userpicker", new FieldValueJsonParser<BasicUser>(new BasicUserJsonParser()));
33          put("java.lang.String", new StringFieldValueParser());
34      }};
35  
36      @SuppressWarnings("unchecked")
37      public IssueField parse(JSONObject jsonObject, String id) throws JSONException {
38          String type = jsonObject.getString("type");
39          final String name = jsonObject.getString("name");
40          final Object valueObject = jsonObject.opt(VALUE_ATTRIBUTE);
41          final Object value;
42          // @todo ugly hack until https://jdog.atlassian.com/browse/JRADEV-3220 is fixed
43          if ("comment".equals(name)) {
44              type = "com.atlassian.jira.Comment";
45          }
46  
47          if (valueObject == null) {
48              value = null;
49          } else {
50              final JsonObjectParser valueParser = registeredValueParsers.get(type);
51              if (valueParser != null) {
52                  value = valueParser.parse(jsonObject);
53              } else {
54                  value = valueObject.toString();
55              }
56          }
57          return new IssueField(id, name, type, value);
58      }
59  
60      static class FieldValueJsonParser<T> implements JsonObjectParser<T> {
61          private final JsonObjectParser<T> jsonParser;
62  
63          public FieldValueJsonParser(JsonObjectParser<T> jsonParser) {
64              this.jsonParser = jsonParser;
65          }
66  
67          @Override
68          public T parse(JSONObject json) throws JSONException {
69              final JSONObject valueObject = json.optJSONObject(VALUE_ATTRIBUTE);
70              if (valueObject == null) {
71                  throw new JSONException("Expected JSONObject with [" + VALUE_ATTRIBUTE + "] attribute present.");
72              }
73              return jsonParser.parse(valueObject);
74          }
75      }
76  
77  
78      static class FloatingPointFieldValueParser implements JsonObjectParser<Double> {
79  
80          @Override
81          public Double parse(JSONObject jsonObject) throws JSONException {
82              final String s = JsonParseUtil.getNullableString(jsonObject, VALUE_ATTRIBUTE);
83              if (s == null) {
84                  return null;
85              }
86              try {
87                  return Double.parseDouble(s);
88              } catch (NumberFormatException e) {
89                  throw new JSONException("[" + s + "] is not a valid floating point number");
90              }
91          }
92      }
93  
94      static class StringFieldValueParser implements JsonObjectParser<String> {
95  
96          @Override
97          public String parse(JSONObject jsonObject) throws JSONException {
98              return JsonParseUtil.getNullableString(jsonObject, VALUE_ATTRIBUTE);
99          }
100     }
101 
102 
103 }