diff options
Diffstat (limited to 'src/main/java/com/gitblit/tickets/TicketSerializer.java')
-rw-r--r-- | src/main/java/com/gitblit/tickets/TicketSerializer.java | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/main/java/com/gitblit/tickets/TicketSerializer.java b/src/main/java/com/gitblit/tickets/TicketSerializer.java new file mode 100644 index 00000000..2a71af33 --- /dev/null +++ b/src/main/java/com/gitblit/tickets/TicketSerializer.java @@ -0,0 +1,175 @@ +/* + * Copyright 2013 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.tickets; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import com.gitblit.models.TicketModel; +import com.gitblit.models.TicketModel.Change; +import com.gitblit.models.TicketModel.Score; +import com.gitblit.utils.ArrayUtils; +import com.gitblit.utils.JsonUtils.ExcludeField; +import com.gitblit.utils.JsonUtils.GmtDateTypeAdapter; +import com.google.gson.ExclusionStrategy; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; + +/** + * Serializes and deserializes tickets, change, and journals. + * + * @author James Moger + * + */ +public class TicketSerializer { + + protected static final Type JOURNAL_TYPE = new TypeToken<Collection<Change>>() {}.getType(); + + public static List<Change> deserializeJournal(String json) { + Collection<Change> list = gson().fromJson(json, JOURNAL_TYPE); + return new ArrayList<Change>(list); + } + + public static TicketModel deserializeTicket(String json) { + return gson().fromJson(json, TicketModel.class); + } + + public static TicketLabel deserializeLabel(String json) { + return gson().fromJson(json, TicketLabel.class); + } + + public static TicketMilestone deserializeMilestone(String json) { + return gson().fromJson(json, TicketMilestone.class); + } + + + public static String serializeJournal(List<Change> changes) { + try { + Gson gson = gson(); + return gson.toJson(changes); + } catch (Exception e) { + // won't happen + } + return null; + } + + public static String serialize(TicketModel ticket) { + if (ticket == null) { + return null; + } + try { + Gson gson = gson( + new ExcludeField("com.gitblit.models.TicketModel$Attachment.content"), + new ExcludeField("com.gitblit.models.TicketModel$Attachment.deleted"), + new ExcludeField("com.gitblit.models.TicketModel$Comment.deleted")); + return gson.toJson(ticket); + } catch (Exception e) { + // won't happen + } + return null; + } + + public static String serialize(Change change) { + if (change == null) { + return null; + } + try { + Gson gson = gson( + new ExcludeField("com.gitblit.models.TicketModel$Attachment.content")); + return gson.toJson(change); + } catch (Exception e) { + // won't happen + } + return null; + } + + public static String serialize(TicketLabel label) { + if (label == null) { + return null; + } + try { + Gson gson = gson(); + return gson.toJson(label); + } catch (Exception e) { + // won't happen + } + return null; + } + + public static String serialize(TicketMilestone milestone) { + if (milestone == null) { + return null; + } + try { + Gson gson = gson(); + return gson.toJson(milestone); + } catch (Exception e) { + // won't happen + } + return null; + } + + // build custom gson instance with GMT date serializer/deserializer + // http://code.google.com/p/google-gson/issues/detail?id=281 + public static Gson gson(ExclusionStrategy... strategies) { + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(Date.class, new GmtDateTypeAdapter()); + builder.registerTypeAdapter(Score.class, new ScoreTypeAdapter()); + if (!ArrayUtils.isEmpty(strategies)) { + builder.setExclusionStrategies(strategies); + } + return builder.create(); + } + + private static class ScoreTypeAdapter implements JsonSerializer<Score>, JsonDeserializer<Score> { + + private ScoreTypeAdapter() { + } + + @Override + public synchronized JsonElement serialize(Score score, Type type, + JsonSerializationContext jsonSerializationContext) { + return new JsonPrimitive(score.getValue()); + } + + @Override + public synchronized Score deserialize(JsonElement jsonElement, Type type, + JsonDeserializationContext jsonDeserializationContext) { + try { + int value = jsonElement.getAsInt(); + for (Score score : Score.values()) { + if (score.getValue() == value) { + return score; + } + } + return Score.not_reviewed; + } catch (Exception e) { + throw new JsonSyntaxException(jsonElement.getAsString(), e); + } + } + } +} |