/*
|
* 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);
|
}
|
}
|
}
|
}
|