001// Generated by delombok at Fri Oct 04 16:05:59 CEST 2024
002/*
003 * Copyright (c) 2010-2024 Mark Allen, Norbert Bartels.
004 *
005 * Permission is hereby granted, free of charge, to any person obtaining a copy
006 * of this software and associated documentation files (the "Software"), to deal
007 * in the Software without restriction, including without limitation the rights
008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
009 * copies of the Software, and to permit persons to whom the Software is
010 * furnished to do so, subject to the following conditions:
011 *
012 * The above copyright notice and this permission notice shall be included in
013 * all copies or substantial portions of the Software.
014 *
015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
021 * THE SOFTWARE.
022 */
023package com.restfb.types;
024
025import static java.util.Collections.unmodifiableList;
026import java.util.ArrayList;
027import java.util.Date;
028import java.util.List;
029import com.restfb.Facebook;
030import com.restfb.JsonMapper;
031import com.restfb.JsonMapper.JsonMappingCompleted;
032import com.restfb.annotation.GraphAPI;
033import com.restfb.exception.FacebookJsonMappingException;
034import com.restfb.json.JsonObject;
035import com.restfb.types.features.HasComments;
036import com.restfb.types.features.HasCreatedTime;
037import com.restfb.types.features.HasMessage;
038
039/**
040 * Represents the <a href="https://developers.facebook.com/docs/graph-api/reference/comment">Comment Graph API type</a>.
041 *
042 * @author <a href="http://restfb.com">Mark Allen</a>
043 * @since 1.5
044 */
045public class Comment extends FacebookType implements HasComments, HasCreatedTime, HasMessage {
046  /**
047   * User who posted the comment.
048   */
049  @Facebook
050  private From from;
051  /**
052   * Text contents of the comment.
053   */
054  @Facebook
055  private String message;
056  /**
057   * Date on which the comment was created.
058   */
059  @Facebook("created_time")
060  private Date createdTime;
061  /**
062   * Duplicate mapping for "likes" since FB can return it differently in different situations.
063   * <p>
064   * -- GETTER -- The likes on this post.
065   * <p>
066   * Sometimes this can be {@code null} - check {@link #getLikeCount()} instead in that case.
067   */
068  @Facebook
069  private Likes likes;
070  /**
071   * The reactions for this post.
072   */
073  @Facebook
074  private Reactions reactions;
075  /**
076   * The number of likes on this comment.
077   *
078   * @since 1.6.10
079   */
080  @Facebook("like_count")
081  private Long likeCount;
082  /**
083   * Number of replies to this comment.
084   */
085  @Facebook("comment_count")
086  private long commentCount;
087  /**
088   * This field is returned only if the authenticated user can remove this comment.
089   *
090   * @since 1.6.10
091   */
092  @Facebook("can_remove")
093  private Boolean canRemove;
094  /**
095   * This field is returned only if the authenticated user likes this comment
096   *
097   * @since 1.6.10
098   */
099  @Facebook("user_likes")
100  private Boolean userLikes;
101  /**
102   * If this comment is a reply, this field returns the parent comment, otherwise no value
103   *
104   * @since 1.6.13
105   */
106  @Facebook
107  private Comment parent;
108  /**
109   * Specifies whether you can reply to this comment
110   *
111   * @since 1.6.13
112   */
113  @Facebook("can_comment")
114  private Boolean canComment;
115  /**
116   * Whether the viewer can hide this comment
117   *
118   * @since 1.7.1
119   */
120  @Facebook("can_hide")
121  private Boolean canHide;
122  /**
123   * Whether the viewer can send a private reply to this comment (Page viewers only)
124   */
125  @Facebook("can_reply_privately")
126  @GraphAPI(since = "2.5")
127  private Boolean canReplyPrivately;
128  /**
129   * For comments with private replies, gets conversation between the Page and author of the comment (Page viewers only)
130   */
131  @Facebook("private_reply_conversation")
132  @GraphAPI(since = "2.5")
133  private Conversation privateReplyConversation;
134  /**
135   * Whether this comment is hidden. The original poster can still see the comment, along with the page admin and anyone
136   * else tagged in the comment
137   *
138   * @since 1.7.1
139   */
140  @Facebook("is_hidden")
141  private Boolean isHidden;
142  /**
143   * Whether the viewer can like this comment
144   */
145  @Facebook("can_like")
146  private Boolean canLike;
147  /**
148   * Parent object this comment was made on.
149   *
150   * @since 1.7.1
151   */
152  @Facebook
153  private NamedFacebookType object;
154  /**
155   * The permanent static URL to the comment
156   */
157  @Facebook("permalink_url")
158  private String permalinkUrl;
159  /**
160   * The replies to this comment
161   */
162  @Facebook("comments")
163  private Comments comments;
164  /**
165   * Attachment (image) added to a comment.
166   * <p>
167   * To force Facebook to fill the <code>attachment</code> field you have to fetch the comment with the
168   * <code>fields=attachment</code> parameter, otherwise the attachments are <code>null</code>.
169   */
170  @Facebook
171  private StoryAttachment attachment;
172  @Facebook("message_tags")
173  private transient String rawMessageTags;
174  private List<MessageTag> messageTags = new ArrayList<>();
175  private static final long serialVersionUID = 2L;
176
177  /**
178   * Post-JSON-mapping operation that populates the {@code messageTags} field "by hand".
179   * 
180   * @param jsonMapper
181   *          The {@code JsonMapper} that was used to map to this type.
182   */
183  @JsonMappingCompleted
184  protected void jsonMappingCompleted(JsonMapper jsonMapper) {
185    if (rawMessageTags == null) {
186      return;
187    }
188    try {
189      messageTags = jsonMapper.toJavaList(rawMessageTags, MessageTag.class);
190      return;
191    } catch (FacebookJsonMappingException je) {
192    }
193    // message tags not in Graph API 2.5 format, ignore this exception and try another way
194    try {
195      JsonObject rawMessageTagsObject = jsonMapper.toJavaObject(rawMessageTags, JsonObject.class);
196      for (String key : rawMessageTagsObject.names()) {
197        String tagArrayString = rawMessageTagsObject.get(key).toString();
198        messageTags.addAll(jsonMapper.toJavaList(tagArrayString, MessageTag.class));
199      }
200    } catch (FacebookJsonMappingException je) {
201    }
202    // cannot parse message tags, but don't break the flow here
203  }
204
205  /**
206   * Objects tagged in the message (Users, Pages, etc.)
207   *
208   * @return Objects tagged in the message (Users, Pages, etc.)
209   * @since 1.6.10
210   */
211  public List<MessageTag> getMessageTags() {
212    return unmodifiableList(messageTags);
213  }
214
215  public void addMessageTag(MessageTag messageTag) {
216    messageTags.add(messageTag);
217  }
218
219  public void removeMessageTag(MessageTag messageTag) {
220    messageTags.remove(messageTag);
221  }
222
223  /**
224   * User who posted the comment.
225   *
226   * @return User who posted the comment.
227   */
228  @java.lang.SuppressWarnings("all")
229  public From getFrom() {
230    return this.from;
231  }
232
233  /**
234   * User who posted the comment.
235   */
236  @java.lang.SuppressWarnings("all")
237  public void setFrom(final From from) {
238    this.from = from;
239  }
240
241  /**
242   * Text contents of the comment.
243   *
244   * @return Text contents of the comment.
245   */
246  @Override
247  @java.lang.SuppressWarnings("all")
248  public String getMessage() {
249    return this.message;
250  }
251
252  /**
253   * Text contents of the comment.
254   */
255  @java.lang.SuppressWarnings("all")
256  public void setMessage(final String message) {
257    this.message = message;
258  }
259
260  /**
261   * Date on which the comment was created.
262   *
263   * @return Date on which the comment was created.
264   */
265  @Override
266  @java.lang.SuppressWarnings("all")
267  public Date getCreatedTime() {
268    return this.createdTime;
269  }
270
271  /**
272   * Date on which the comment was created.
273   */
274  @java.lang.SuppressWarnings("all")
275  public void setCreatedTime(final Date createdTime) {
276    this.createdTime = createdTime;
277  }
278
279  /**
280   * Duplicate mapping for "likes" since FB can return it differently in different situations.
281   * <p>
282   * -- GETTER -- The likes on this post.
283   * <p>
284   * Sometimes this can be {@code null} - check {@link #getLikeCount()} instead in that case.
285   *
286   * @return The likes on this comment.
287   */
288  @java.lang.SuppressWarnings("all")
289  public Likes getLikes() {
290    return this.likes;
291  }
292
293  /**
294   * Duplicate mapping for "likes" since FB can return it differently in different situations.
295   * <p>
296   * -- GETTER -- The likes on this post.
297   * <p>
298   * Sometimes this can be {@code null} - check {@link #getLikeCount()} instead in that case.
299   */
300  @java.lang.SuppressWarnings("all")
301  public void setLikes(final Likes likes) {
302    this.likes = likes;
303  }
304
305  /**
306   * The reactions for this post.
307   *
308   * @return The reactions for this post.
309   */
310  @java.lang.SuppressWarnings("all")
311  public Reactions getReactions() {
312    return this.reactions;
313  }
314
315  /**
316   * The reactions for this post.
317   */
318  @java.lang.SuppressWarnings("all")
319  public void setReactions(final Reactions reactions) {
320    this.reactions = reactions;
321  }
322
323  /**
324   * The number of likes on this comment.
325   *
326   * @return The number of likes on this comment.
327   * @since 1.6.10
328   */
329  @java.lang.SuppressWarnings("all")
330  public Long getLikeCount() {
331    return this.likeCount;
332  }
333
334  /**
335   * The number of likes on this comment.
336   *
337   * @since 1.6.10
338   */
339  @java.lang.SuppressWarnings("all")
340  public void setLikeCount(final Long likeCount) {
341    this.likeCount = likeCount;
342  }
343
344  /**
345   * Number of replies to this comment.
346   *
347   * @return Number of replies to this comment
348   */
349  @java.lang.SuppressWarnings("all")
350  public long getCommentCount() {
351    return this.commentCount;
352  }
353
354  /**
355   * Number of replies to this comment.
356   */
357  @java.lang.SuppressWarnings("all")
358  public void setCommentCount(final long commentCount) {
359    this.commentCount = commentCount;
360  }
361
362  /**
363   * This field is returned only if the authenticated user can remove this comment.
364   *
365   * @return This field is returned only if the authenticated user can remove this comment.
366   * @since 1.6.10
367   */
368  @java.lang.SuppressWarnings("all")
369  public Boolean getCanRemove() {
370    return this.canRemove;
371  }
372
373  /**
374   * This field is returned only if the authenticated user can remove this comment.
375   *
376   * @since 1.6.10
377   */
378  @java.lang.SuppressWarnings("all")
379  public void setCanRemove(final Boolean canRemove) {
380    this.canRemove = canRemove;
381  }
382
383  /**
384   * This field is returned only if the authenticated user likes this comment
385   *
386   * @return This field is returned only if the authenticated user likes this comment.
387   * @since 1.6.10
388   */
389  @java.lang.SuppressWarnings("all")
390  public Boolean getUserLikes() {
391    return this.userLikes;
392  }
393
394  /**
395   * This field is returned only if the authenticated user likes this comment
396   *
397   * @since 1.6.10
398   */
399  @java.lang.SuppressWarnings("all")
400  public void setUserLikes(final Boolean userLikes) {
401    this.userLikes = userLikes;
402  }
403
404  /**
405   * If this comment is a reply, this field returns the parent comment, otherwise no value
406   *
407   * @return the parent Comment
408   * @since 1.6.13
409   */
410  @java.lang.SuppressWarnings("all")
411  public Comment getParent() {
412    return this.parent;
413  }
414
415  /**
416   * If this comment is a reply, this field returns the parent comment, otherwise no value
417   *
418   * @since 1.6.13
419   */
420  @java.lang.SuppressWarnings("all")
421  public void setParent(final Comment parent) {
422    this.parent = parent;
423  }
424
425  /**
426   * Specifies whether you can reply to this comment
427   *
428   * @return can_comment
429   * @since 1.6.13
430   */
431  @java.lang.SuppressWarnings("all")
432  public Boolean getCanComment() {
433    return this.canComment;
434  }
435
436  /**
437   * Specifies whether you can reply to this comment
438   *
439   * @since 1.6.13
440   */
441  @java.lang.SuppressWarnings("all")
442  public void setCanComment(final Boolean canComment) {
443    this.canComment = canComment;
444  }
445
446  /**
447   * Whether the viewer can hide this comment
448   *
449   * @return can_hide
450   * @since 1.7.1
451   */
452  @java.lang.SuppressWarnings("all")
453  public Boolean getCanHide() {
454    return this.canHide;
455  }
456
457  /**
458   * Whether the viewer can hide this comment
459   *
460   * @since 1.7.1
461   */
462  @java.lang.SuppressWarnings("all")
463  public void setCanHide(final Boolean canHide) {
464    this.canHide = canHide;
465  }
466
467  /**
468   * Whether the viewer can send a private reply to this comment (Page viewers only)
469   *
470   * @return Whether the viewer can send a private reply to this comment
471   */
472  @GraphAPI(since = "2.5")
473  @java.lang.SuppressWarnings("all")
474  public Boolean getCanReplyPrivately() {
475    return this.canReplyPrivately;
476  }
477
478  /**
479   * Whether the viewer can send a private reply to this comment (Page viewers only)
480   */
481  @java.lang.SuppressWarnings("all")
482  public void setCanReplyPrivately(final Boolean canReplyPrivately) {
483    this.canReplyPrivately = canReplyPrivately;
484  }
485
486  /**
487   * For comments with private replies, gets conversation between the Page and author of the comment (Page viewers only)
488   *
489   * @return conversation between Page and author of the comment
490   */
491  @GraphAPI(since = "2.5")
492  @java.lang.SuppressWarnings("all")
493  public Conversation getPrivateReplyConversation() {
494    return this.privateReplyConversation;
495  }
496
497  /**
498   * For comments with private replies, gets conversation between the Page and author of the comment (Page viewers only)
499   */
500  @java.lang.SuppressWarnings("all")
501  public void setPrivateReplyConversation(final Conversation privateReplyConversation) {
502    this.privateReplyConversation = privateReplyConversation;
503  }
504
505  /**
506   * Whether this comment is hidden. The original poster can still see the comment, along with the page admin and anyone
507   * else tagged in the comment
508   *
509   * @return is_hidden
510   * @since 1.7.1
511   */
512  @java.lang.SuppressWarnings("all")
513  public Boolean getIsHidden() {
514    return this.isHidden;
515  }
516
517  /**
518   * Whether this comment is hidden. The original poster can still see the comment, along with the page admin and anyone
519   * else tagged in the comment
520   *
521   * @since 1.7.1
522   */
523  @java.lang.SuppressWarnings("all")
524  public void setIsHidden(final Boolean isHidden) {
525    this.isHidden = isHidden;
526  }
527
528  /**
529   * Whether the viewer can like this comment
530   *
531   * @return can_like
532   */
533  @java.lang.SuppressWarnings("all")
534  public Boolean getCanLike() {
535    return this.canLike;
536  }
537
538  /**
539   * Whether the viewer can like this comment
540   */
541  @java.lang.SuppressWarnings("all")
542  public void setCanLike(final Boolean canLike) {
543    this.canLike = canLike;
544  }
545
546  /**
547   * Parent object this comment was made on.
548   *
549   * @return object
550   * @since 1.7.1
551   */
552  @java.lang.SuppressWarnings("all")
553  public NamedFacebookType getObject() {
554    return this.object;
555  }
556
557  /**
558   * Parent object this comment was made on.
559   *
560   * @since 1.7.1
561   */
562  @java.lang.SuppressWarnings("all")
563  public void setObject(final NamedFacebookType object) {
564    this.object = object;
565  }
566
567  /**
568   * The permanent static URL to the comment
569   *
570   * @return permanent static url
571   */
572  @java.lang.SuppressWarnings("all")
573  public String getPermalinkUrl() {
574    return this.permalinkUrl;
575  }
576
577  /**
578   * The permanent static URL to the comment
579   */
580  @java.lang.SuppressWarnings("all")
581  public void setPermalinkUrl(final String permalinkUrl) {
582    this.permalinkUrl = permalinkUrl;
583  }
584
585  /**
586   * The replies to this comment
587   *
588   * @return replies
589   */
590  @Override
591  @java.lang.SuppressWarnings("all")
592  public Comments getComments() {
593    return this.comments;
594  }
595
596  /**
597   * The replies to this comment
598   */
599  @java.lang.SuppressWarnings("all")
600  public void setComments(final Comments comments) {
601    this.comments = comments;
602  }
603
604  /**
605   * Attachment (image) added to a comment.
606   * <p>
607   * To force Facebook to fill the <code>attachment</code> field you have to fetch the comment with the
608   * <code>fields=attachment</code> parameter, otherwise the attachments are <code>null</code>.
609   *
610   * @return Attachment on the comment
611   */
612  @java.lang.SuppressWarnings("all")
613  public StoryAttachment getAttachment() {
614    return this.attachment;
615  }
616
617  /**
618   * Attachment (image) added to a comment.
619   * <p>
620   * To force Facebook to fill the <code>attachment</code> field you have to fetch the comment with the
621   * <code>fields=attachment</code> parameter, otherwise the attachments are <code>null</code>.
622   */
623  @java.lang.SuppressWarnings("all")
624  public void setAttachment(final StoryAttachment attachment) {
625    this.attachment = attachment;
626  }
627}