View Javadoc
1   package org.argeo.tracker.ui;
2   
3   import java.text.DateFormat;
4   import java.text.SimpleDateFormat;
5   import java.util.Calendar;
6   
7   import javax.jcr.Node;
8   import javax.jcr.Property;
9   import javax.jcr.RepositoryException;
10  
11  import org.argeo.activities.ActivitiesNames;
12  import org.argeo.cms.util.UserAdminUtils;
13  import org.argeo.connect.AppService;
14  import org.argeo.connect.ConnectConstants;
15  import org.argeo.connect.ConnectNames;
16  import org.argeo.connect.UserAdminService;
17  import org.argeo.connect.util.ConnectJcrUtils;
18  import org.argeo.eclipse.ui.EclipseUiUtils;
19  import org.argeo.tracker.TrackerException;
20  import org.argeo.tracker.TrackerNames;
21  import org.argeo.tracker.core.TrackerUtils;
22  import org.eclipse.jface.viewers.ColumnLabelProvider;
23  
24  /** Centralise label providers for Argeo tracker to keep packages simple */
25  public class TrackerLps {
26  
27  	// FIXME provide a better management of date patterns
28  	private final static String SIMPLE_DATE_PATTERN = "dd MMM yyyy";
29  
30  	public class DnLabelProvider extends ColumnLabelProvider {
31  		private static final long serialVersionUID = -848512622910895692L;
32  		private final UserAdminService userAdminService;
33  		private final String propName;
34  
35  		public DnLabelProvider(UserAdminService userAdminService, String propName) {
36  			this.userAdminService = userAdminService;
37  			this.propName = propName;
38  		}
39  
40  		@Override
41  		public String getText(Object element) {
42  			Node entity = (Node) element;
43  			String dn = ConnectJcrUtils.get(entity, propName);
44  			if (EclipseUiUtils.notEmpty(dn))
45  				return userAdminService.getUserDisplayName(dn);
46  			else
47  				return "";
48  		}
49  	}
50  
51  	public class VersionDateLabelProvider extends ColumnLabelProvider {
52  		private static final long serialVersionUID = -7883411659009058536L;
53  
54  		@Override
55  		public String getText(Object element) {
56  			Node version = (Node) element;
57  			String date = ConnectJcrUtils.getDateFormattedAsString(version, TrackerNames.TRACKER_RELEASE_DATE,
58  					SIMPLE_DATE_PATTERN);
59  			if (date == null)
60  				date = ConnectJcrUtils.getDateFormattedAsString(version, TrackerNames.TRACKER_TARGET_DATE,
61  						SIMPLE_DATE_PATTERN);
62  
63  			if (date == null)
64  				date = " - ";
65  			return date;
66  		}
67  	}
68  
69  	public class DateLabelProvider extends ColumnLabelProvider {
70  		private static final long serialVersionUID = 8003688506253830216L;
71  
72  		private final String propName;
73  
74  		public DateLabelProvider(String propName) {
75  			this.propName = propName;
76  		}
77  
78  		@Override
79  		public String getText(Object element) {
80  			Node milestone = (Node) element;
81  			String dateStr = "";
82  			try {
83  				if (milestone.hasProperty(propName))
84  					dateStr = ConnectJcrUtils.getDateFormattedAsString(milestone, propName, SIMPLE_DATE_PATTERN);
85  				else if (ConnectNames.CONNECT_CLOSE_DATE.equals(propName))
86  					dateStr = " Open ";
87  				else
88  					dateStr = " - ";
89  			} catch (RepositoryException e) {
90  				throw new TrackerException("Cannot retrieve " + propName + " date for " + milestone, e);
91  			}
92  			return dateStr;
93  		}
94  	}
95  
96  	public class PriorityLabelProvider extends ColumnLabelProvider {
97  		private static final long serialVersionUID = -6190366293616451065L;
98  
99  		@Override
100 		public String getText(Object element) {
101 			Node issue = (Node) element;
102 			try {
103 				if (issue.hasProperty(TrackerNames.TRACKER_PRIORITY)) {
104 					long priorityL = issue.getProperty(TrackerNames.TRACKER_PRIORITY).getLong();
105 					String priorityStr = TrackerUtils.MAPS_ISSUE_PRIORITIES.get("" + priorityL);
106 					return priorityStr;
107 				}
108 			} catch (RepositoryException e) {
109 				throw new TrackerException("Unable to get isssue priority for " + issue, e);
110 			}
111 			return "";
112 		}
113 	}
114 
115 	public class CommentNbLabelProvider extends ColumnLabelProvider {
116 		private static final long serialVersionUID = -1685888796850965318L;
117 
118 		@Override
119 		public String getText(Object element) {
120 			Node issue = (Node) element;
121 			try {
122 				// TODO enhance to also count children comments once this
123 				// concept has been implemented
124 				if (issue.hasNode(TrackerNames.TRACKER_COMMENTS)) {
125 					long commentNb = issue.getNode(TrackerNames.TRACKER_COMMENTS).getNodes().getSize();
126 					if (commentNb > 0)
127 						return commentNb + " comments";
128 				}
129 			} catch (RepositoryException e) {
130 				throw new TrackerException("Unable to get isssue priority for " + issue, e);
131 			}
132 			return "None yet";
133 		}
134 	}
135 
136 	public class MilestoneLabelProvider extends ColumnLabelProvider {
137 		private static final long serialVersionUID = -2359291146337869742L;
138 		private AppService appService;
139 
140 		public MilestoneLabelProvider(AppService appService) {
141 			this.appService = appService;
142 		}
143 
144 		// TODO make it clickable
145 		@Override
146 		public String getText(Object element) {
147 			Node issue = (Node) element;
148 			try {
149 				String muid = ConnectJcrUtils.get(issue, TrackerNames.TRACKER_MILESTONE_UID);
150 				if (EclipseUiUtils.notEmpty(muid)) {
151 					Node m = appService.getEntityByUid(issue.getSession(), null, muid);
152 					if (m != null)
153 						return ConnectJcrUtils.get(m, Property.JCR_TITLE);
154 				}
155 			} catch (RepositoryException e) {
156 				throw new TrackerException("Unable to get milestone name for " + issue, e);
157 			}
158 			return "";
159 		}
160 	}
161 
162 	public class ImportanceLabelProvider extends ColumnLabelProvider {
163 		private static final long serialVersionUID = 7920611707085451018L;
164 
165 		@Override
166 		public String getText(Object element) {
167 			Node issue = (Node) element;
168 			try {
169 				if (issue.hasProperty(TrackerNames.TRACKER_IMPORTANCE)) {
170 					long importanceL = issue.getProperty(TrackerNames.TRACKER_IMPORTANCE).getLong();
171 					String importanceStr = "" + importanceL;
172 					return TrackerUtils.MAPS_ISSUE_IMPORTANCES.get(importanceStr);
173 				}
174 			} catch (RepositoryException e) {
175 				throw new TrackerException("Unable to get isssue importance for " + issue, e);
176 			}
177 			return "";
178 		}
179 	}
180 
181 	public class IssueCommentOverviewLabelProvider extends ColumnLabelProvider {
182 		private static final long serialVersionUID = 3580821684409015205L;
183 
184 		private DateFormat df = new SimpleDateFormat(ConnectConstants.DEFAULT_DATE_TIME_FORMAT);
185 
186 		@Override
187 		public String getText(Object element) {
188 			Node comment = (Node) element;
189 			String createdBy = ConnectJcrUtils.get(comment, ActivitiesNames.ACTIVITIES_REPORTED_BY);
190 			if (EclipseUiUtils.isEmpty(createdBy))
191 				createdBy = ConnectJcrUtils.get(comment, Property.JCR_CREATED_BY);
192 			Calendar createdOn = ConnectJcrUtils.getDateValue(comment, ActivitiesNames.ACTIVITIES_ACTIVITY_DATE);
193 			if (createdOn == null)
194 				createdOn = ConnectJcrUtils.getDateValue(comment, Property.JCR_CREATED);
195 			String lastUpdatedBy = ConnectJcrUtils.get(comment, Property.JCR_LAST_MODIFIED_BY);
196 			Calendar lastUpdatedOn = ConnectJcrUtils.getDateValue(comment, Property.JCR_LAST_MODIFIED);
197 
198 			if (createdBy.equalsIgnoreCase(lastUpdatedBy))
199 				lastUpdatedBy = null;
200 			long t1Millis = createdOn.getTimeInMillis() + 300000;
201 			long t2Millis = createdOn.getTimeInMillis();
202 			if (t2Millis < t1Millis)
203 				lastUpdatedOn = null;
204 
205 			String createdOnStr = df.format(createdOn.getTime());
206 			ConnectJcrUtils.getDateFormattedAsString(comment, Property.JCR_CREATED,
207 					ConnectConstants.DEFAULT_DATE_TIME_FORMAT);
208 			StringBuilder builder = new StringBuilder();
209 			builder.append(UserAdminUtils.getUserLocalId(createdBy)).append(" on ").append(createdOnStr);
210 			if (lastUpdatedOn != null) {
211 				builder.append(" (last edited ");
212 				if (EclipseUiUtils.notEmpty(lastUpdatedBy))
213 					builder.append("by ").append(UserAdminUtils.getUserLocalId(lastUpdatedBy)).append(" ");
214 				builder.append("on ").append(df.format(lastUpdatedOn.getTime())).append(")");
215 			}
216 			return builder.toString();
217 		}
218 	}
219 }