/******************************************************************************* * Copyright (c) 2015 Frank Becker and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Frank Becker - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.bugzilla.rest.core; import java.io.InputStreamReader; import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale; import java.util.Map.Entry; import java.util.TimeZone; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpClient; import org.eclipse.mylyn.tasks.core.IRepositoryPerson; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper; import org.eclipse.mylyn.tasks.core.data.TaskData; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; public class BugzillaRestGetTaskComments extends BugzillaRestGetRequest<ArrayList<TaskAttribute>> { private final TaskData taskData; public BugzillaRestGetTaskComments(CommonHttpClient client, TaskData taskData) { super(client, "/bug/" + taskData.getTaskId() + "/comment?", null); //$NON-NLS-1$ //$NON-NLS-2$ this.taskData = taskData; } @Override protected ArrayList<TaskAttribute> parseFromJson(InputStreamReader in) { TypeToken<ArrayList<TaskAttribute>> type = new TypeToken<ArrayList<TaskAttribute>>() { }; return new GsonBuilder().registerTypeAdapter(type.getType(), new JSonTaskDataDeserializer()) .create() .fromJson(in, type.getType()); } BugzillaRestTaskSchema taskSchema = BugzillaRestTaskSchema.getDefault(); private class JSonTaskDataDeserializer implements JsonDeserializer<ArrayList<TaskAttribute>> { @Override public ArrayList<TaskAttribute> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { ArrayList<TaskAttribute> response = new ArrayList<TaskAttribute>(); for (Entry<String, JsonElement> commentEntry : ((JsonObject) json.getAsJsonObject().get("bugs")) //$NON-NLS-1$ .entrySet()) { for (JsonElement jsonElement : ((JsonObject) commentEntry.getValue()).get("comments") //$NON-NLS-1$ .getAsJsonArray()) { JsonObject comment = (JsonObject) jsonElement; int count = comment.get("count").getAsInt(); //$NON-NLS-1$ if (count == 0) { TaskAttribute desc = taskData.getRoot().getMappedAttribute(taskSchema.DESCRIPTION.getKey()); desc.setValue(comment.get("text").getAsString()); //$NON-NLS-1$ TaskAttribute cid = desc.getAttribute(taskSchema.COMMENT_NUMBER.getKey()); cid.setValue(comment.get("id").getAsString()); //$NON-NLS-1$ TaskAttribute cidp = desc.getAttribute(taskSchema.COMMENT_ISPRIVATE.getKey()); cidp.setValue(comment.get("is_private").getAsBoolean() ? "1" : "0"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ response.add(desc); } else { TaskAttribute attribute = taskData.getRoot() .createAttribute(TaskAttribute.PREFIX_COMMENT + count); TaskCommentMapper taskComment = TaskCommentMapper.createFrom(attribute); taskComment.setCommentId(comment.get("id").getAsString()); //$NON-NLS-1$ taskComment.setNumber(count); taskComment.setUrl(taskData.getRepositoryUrl() + "/show_bug.cgi?id=" //$NON-NLS-1$ + taskData.getTaskId() + "#c" + count); //$NON-NLS-1$ IRepositoryPerson author = taskData.getAttributeMapper() .getTaskRepository() .createPerson(comment.get("creator").getAsString()); //$NON-NLS-1$ author.setName(comment.get("creator").getAsString()); //$NON-NLS-1$ taskComment.setAuthor(author); JsonElement isPrivate = comment.get("is_private"); //$NON-NLS-1$ if (isPrivate != null) { taskComment.setIsPrivate(isPrivate.getAsBoolean()); } else { taskComment.setIsPrivate(null); } try { SimpleDateFormat iso8601Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", //$NON-NLS-1$ Locale.US); iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC")); //$NON-NLS-1$ Date tempDate = iso8601Format.parse(comment.get("creation_time").getAsString()); //$NON-NLS-1$ taskComment.setCreationDate(tempDate); } catch (ParseException e) { com.google.common.base.Throwables.propagate(new CoreException(new Status(IStatus.ERROR, BugzillaRestCore.ID_PLUGIN, "Can not parse Date (" + comment.get("creation_time").getAsString() + ")"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } if (comment.get("text").getAsString() != null) { //$NON-NLS-1$ String commentText = comment.get("text").getAsString().trim(); //$NON-NLS-1$ taskComment.setText(commentText); } taskComment.applyTo(attribute); response.add(attribute); } } } return response; } } }