/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.timeline; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.commons.field.ALNumberField; import com.aimluck.commons.field.ALStringField; import com.aimluck.eip.cayenne.om.portlet.EipTTimeline; import com.aimluck.eip.common.ALData; import com.aimluck.eip.common.ALEipManager; import com.aimluck.eip.common.ALEipUser; import com.aimluck.eip.fileupload.beans.FileuploadBean; import com.aimluck.eip.util.ALEipUtils; import com.aimluck.eip.util.ALLocalizationUtils; /** * タイムライントピックのResultData <BR> * */ public class TimelineResultData implements ALData { /** トピック ID */ private ALNumberField timeline_id; /** 親トピック ID */ private ALNumberField parent_id; /** 所有者 ID */ private ALNumberField owner_id; /** タイムラインのタイプ */ private String timeline_type; /** アプリケーションID **/ private String app_id; /** 公開/非公開フラグ */ private boolean is_public; /** 新着フラグ */ private boolean new_topic; /** メモ */ private ALStringField note; /** 返信数 */ private ALNumberField reply_count; /** 登録者名 */ private ALStringField create_user; /** 作成日 */ private ALDateTimeField create_date; /** 更新日 */ private ALDateTimeField update_date; /** 子トピックオブジェクト */ private List<TimelineResultData> coTopicList; /** 子アクティビティオブジェクト */ private List<TimelineResultData> coActivityList; /** いいねオブジェクト */ private List<TimelineLikeResultData> likeList; /** Urlオブジェクト */ private List<TimelineUrlResultData> urlList; /** いいねをしたか */ private boolean like; /** 添付ファイルリスト */ private List<FileuploadBean> attachmentFileList = null; /** 更新情報の場合のURLのGETparams */ private ALStringField params; /** 更新情報の場合のportletId */ private String portletId; /** いいね!の数 */ private int likeCount; private ALEipUser user = null; /** キーワード */ private ALStringField keyword; /** * * */ @Override public void initField() { timeline_id = new ALNumberField(); parent_id = new ALNumberField(); owner_id = new ALNumberField(); params = new ALStringField(); note = new ALStringField(); note.setTrim(false); reply_count = new ALNumberField(); create_user = new ALStringField(); create_date = new ALDateTimeField(); update_date = new ALDateTimeField(); is_public = true; new_topic = false; like = false; attachmentFileList = new ArrayList<FileuploadBean>(); likeCount = 0; keyword = new ALStringField(); } /** * @return */ public ALNumberField getTimelineId() { return timeline_id; } /** * @param i */ public void setTimelineId(long i) { timeline_id.setValue(i); } /** * @param i */ public void setParentId(long i) { parent_id.setValue(i); } /** * @param i */ public ALNumberField getParentId() { return parent_id; } /** * @param i */ public void setOwnerId(long i) { owner_id.setValue(i); } /** * @return */ public ALNumberField getOwnerId() { return owner_id; } public ALStringField getOwnerName() { ALStringField field = new ALStringField(); ALEipUser user = getUser(); if (user != null) { field.setValue(user.getAliasName().getValue()); } return field; } /** * @return String */ public String getNote() { return ALEipUtils.getMessageList(note.getValue(), keyword.getValue()); } private static final int PRE_NOTE_LENGTH = 500; /** * 続きを見るを表示するかどうかの判定 * * @return boolean */ public boolean isLongNote() { return note.getValue().length() > PRE_NOTE_LENGTH; } /** * 部分文字列の最後がアドレスのときTrueを返します。 * * @param 部分文字列sub * @return */ private boolean isLastWordAddress(String sub) { if (sub.indexOf("http") != -1 && sub.lastIndexOf("http") > sub.lastIndexOf(" ") && sub.lastIndexOf("http") > sub.lastIndexOf("\n")) { return true; // httpが最後の行にある } if (sub.indexOf("h") != -1 && sub.lastIndexOf("h") > sub.lastIndexOf(" ") && sub.lastIndexOf("h") > sub.lastIndexOf("\n")) { String nextSub = note.getValue().substring( sub.lastIndexOf("h"), sub.lastIndexOf("h") + 4); if (nextSub.equals("http")) { return true;// httpのhだけが部分文字列に含まれている時 } } return false; } /** * 部分文字列の最後が検索キーワードのときTrueを返します。 * * @param 部分文字列sub * @return */ private boolean isLastWordKeyword(String sub) { if (sub.indexOf(keyword.getValue()) != -1 // 投稿の中にキーワードを含む && sub.lastIndexOf(keyword.getValue()) > sub.lastIndexOf(" ") && sub.lastIndexOf(keyword.getValue()) > sub.lastIndexOf("\n")) { return true; // キーワードが最後の行にある } char firstChar = keyword.getValue().charAt(0); int lenOverdKeyword = keyword.getValue().length();// キーワードの文字数 if (sub.indexOf(firstChar) != -1 // 投稿の中にキーワードの1文字目を含む && sub.lastIndexOf(firstChar) > sub.lastIndexOf(" ") && sub.lastIndexOf(firstChar) > sub.lastIndexOf("\n")) { String nextSub = note.getValue().substring( sub.lastIndexOf(firstChar), sub.lastIndexOf(firstChar) + lenOverdKeyword); if (nextSub.equals(keyword.getValue())) { return true;// キーワードの1文字目だけが部分文字列に含まれている時 } } return false; } private boolean hasKeyword(String sub) { if (keyword.getValue() != null && !"".equals(keyword.getValue())) { return true; } else { return false; } } /** * 続きを読むで隠されない部分を返します。 * * @return String */ public String getPreviewNote() { if (isLongNote()) { try { String subnote = ALEipUtils.getMessageList(note.getValue().substring( 0, PRE_NOTE_LENGTH), keyword.getValue()); String sub = note.getValue().substring(0, PRE_NOTE_LENGTH); if (!isLastWordAddress(sub) && (!hasKeyword(sub) || !isLastWordKeyword(sub))) { return subnote; } sub = note.getValue(); int i; for (i = PRE_NOTE_LENGTH; i < sub.length() && sub.charAt(i) != ' ' && sub.charAt(i) != '\n'; i++) { } subnote = ALEipUtils.getMessageList(note.getValue().substring(0, i), keyword .getValue()); return subnote; } catch (Exception ex) { // 文字数のカウントに失敗した場合は文字を丸めずに返す return getNote(); } } else { if (EipTTimeline.TIMELINE_TYPE_ACTIVITY.equals(timeline_type)) { return ALEipUtils .highlihgtKeywords(note.toString(), keyword.toString()); } else { return getNote(); } } } /** * 続きを読むで隠される部分を返します。 * * @return String */ public String getDetailNote() { if (isLongNote()) { String subnote = ALEipUtils.getMessageList( note.getValue().substring(PRE_NOTE_LENGTH), keyword.getValue()); String sub = note.getValue().substring(0, PRE_NOTE_LENGTH); if (!isLastWordAddress(sub) && (!hasKeyword(sub) || !isLastWordKeyword(sub))) { return subnote; } // 最後の行にアドレス又はキーワードが含まれていた場合 sub = note.getValue(); int i; for (i = PRE_NOTE_LENGTH; i < sub.length() && sub.charAt(i) != ' ' && sub.charAt(i) != '\n'; i++) { } subnote = ALEipUtils.getMessageList(note.getValue().substring(i), keyword .getValue()); return subnote; } else { return null; } } public boolean isDetailNote() { if (getDetailNote() != null && !"".equals(getDetailNote())) { return true; } else { return false; } } /** * @param string */ public void setNote(String string) { note.setValue(string); } /** * @return */ public ALDateTimeField getCreateDate() { return ALEipUtils.getFormattedTime(create_date); } /** * @return */ public ALDateTimeField getUpdateDate() { return ALEipUtils.getFormattedTime(update_date); } /** * @param string */ public void setCreateDate(Date date) { create_date.setValue(date); } /** * @param string */ public void setUpdateDate(Date date) { if (date == null) { return; } this.update_date.setValue(date); } public ALStringField getCreateUser() { return create_user; } public void setCreateUser(String str) { create_user.setValue(str); } public String getReplyCountText() { return ALLocalizationUtils.getl10nFormat( "TIMELINE_REPLAY_COUNT_TEXT", reply_count.toString()); } public String getLikeCountText() { return ALLocalizationUtils.getl10nFormat( "TIMELINE_LIKE_COUNT_TEXT", likeCount); } /** * 公開/非公開フラグ. * * @return */ public boolean isPublic() { return is_public; } /** * @return */ public void setPublicFlag(boolean bool) { is_public = bool; } public boolean isNew() { return new_topic; } public void setNewTopicFlag(boolean bool) { new_topic = bool; } public void setReplyCount(long count) { reply_count.setValue(count); } public ALNumberField getReplyCount() { return reply_count; } /** * @return coTopicList */ public List<TimelineResultData> getCoTopicList() { return coTopicList; } /** * @param coTopicList * セットする coTopicList */ public void setCoTopicList(List<TimelineResultData> coTopicList) { this.coTopicList = coTopicList == null ? new ArrayList<TimelineResultData>(0) : coTopicList; } /** * @return coActivityList */ public List<TimelineResultData> getCoActivityList() { return coActivityList; } /** * @param coActivityList * セットする coActivityList */ public void setCoActivityList(List<TimelineResultData> coActivityList) { this.coActivityList = coActivityList == null ? new ArrayList<TimelineResultData>(0) : coActivityList; } /** * @return likeList */ public List<TimelineLikeResultData> getLikeList() { return likeList; } /** * @param likeList * セットする likeList */ public void setLikeList(List<TimelineLikeResultData> likeList) { this.likeList = likeList; } /** * @return urlList */ public List<TimelineUrlResultData> getUrlList() { return urlList; } /** * @param urlList * セットする urlList */ public void setUrlList(List<TimelineUrlResultData> urlList) { this.urlList = urlList; } public Integer getReplyCountInteger() { return Integer.valueOf((int) reply_count.getValue()); } public boolean hasPhoto() { ALEipUser user = getUser(); if (user != null) { return user.hasPhoto(); } else { return false; } } /** * @return attachmentFileList */ public List<FileuploadBean> getAttachmentFileList() { return attachmentFileList; } /** * @param attachmentFileList * セットする attachmentFileList */ public void setAttachmentFileList(List<FileuploadBean> attachmentFileList) { this.attachmentFileList = attachmentFileList == null ? new ArrayList<FileuploadBean>(0) : attachmentFileList; } /** * @return like */ public boolean isLike() { return like; } /** * @param like * セットする like */ public void setLike(boolean like) { this.like = like; } /** * @param timeline_type * セットする timeline_type */ public void setTimelineType(String timeline_type) { this.timeline_type = timeline_type; } /** * @return timeline_type */ public String getTimelineType() { return timeline_type; } /** * @param timeline_type * セットする app_id */ public void setAppId(String app_id) { this.app_id = app_id; } /** * @return app_id */ public String getAppId() { return app_id; } public boolean isNotActivityParent() { if (app_id == null) { return true; } if (app_id.isEmpty()) { return true; } return !(app_id.equals("ACTIVITY_PARENT")); } /** * @param params * セットする params */ public void setParams(String params) { this.params.setValue(params); } /** * @return params */ public ALStringField getParams() { return params; } public String getPopupUrl() { String portletParams = this.getParams().getValue(); if (portletParams != null && portletParams.length() > 0) { StringBuilder b = new StringBuilder(portletParams); // if (portletParams.indexOf("?") > -1) { // b.append("&activityId=").append(id); // } else { // b.append("?activityId=").append(id); // } return b.toString(); } else { return ""; } } public int getLikeCount() { return likeCount; } public void setLikeCount(int likeCount) { this.likeCount = likeCount; } /** * @return photoModified */ public long getPhotoModified() { ALEipUser user = getUser(); if (user != null) { return user.getPhotoModified(); } else { return 0; } } public ALEipUser getUser() { if (user == null) { user = ALEipManager.getInstance().getUser( Integer.valueOf((int) this.owner_id.getValue())); } return user; } /** * @param portletId * セットする portletId */ public void setPortletId(String portletId) { this.portletId = portletId; } /** * @return portletId */ public String getPortletId() { return portletId; } /** * @return keyword */ public ALStringField getKeyword() { return keyword; } /** * @param keyword * セットする keyword */ public void setKeyword(String keyword) { this.keyword.setValue(keyword); } }