View Javadoc
1   package org.argeo.people.ui;
2   
3   import static org.argeo.eclipse.ui.EclipseUiUtils.notEmpty;
4   
5   import javax.jcr.Node;
6   import javax.jcr.Property;
7   import javax.jcr.RepositoryException;
8   
9   import org.argeo.connect.ConnectConstants;
10  import org.argeo.connect.resources.ResourcesService;
11  import org.argeo.connect.ui.ConnectUiConstants;
12  import org.argeo.connect.ui.ConnectUiSnippets;
13  import org.argeo.connect.util.ConnectJcrUtils;
14  import org.argeo.connect.util.ConnectUtils;
15  import org.argeo.people.ContactValueCatalogs;
16  import org.argeo.people.PeopleException;
17  import org.argeo.people.PeopleNames;
18  import org.argeo.people.PeopleService;
19  import org.argeo.people.PeopleTypes;
20  import org.argeo.people.util.PeopleJcrUtils;
21  
22  /**
23   * Some helper methods to generate html snippets TODO refactor this once the
24   * internationalization has been implemented.
25   */
26  public class PeopleUiSnippets {
27  
28  	/**
29  	 * Creates a snippet with all information we have about the name of a given
30  	 * person
31  	 */
32  	public static String getLongName(Node node) {
33  		String salutation = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_SALUTATION);
34  		String firstName = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_FIRST_NAME);
35  		String lastName = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_LAST_NAME);
36  		String title = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_HONORIFIC_TITLE);
37  		String suffix = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_NAME_SUFFIX);
38  		String nickName = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_NICKNAME);
39  		String maidenName = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_MAIDEN_NAME);
40  		String middleName = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_MIDDLE_NAME);
41  
42  		if (notEmpty(salutation) || notEmpty(title) || notEmpty(suffix) || notEmpty(nickName) || notEmpty(maidenName)
43  				|| notEmpty(middleName)) {
44  			StringBuilder builder = new StringBuilder();
45  			// builder.append("<i>");
46  			builder.append(salutation);
47  			if (notEmpty(title))
48  				builder.append(" ").append(title);
49  			builder.append(" ").append(firstName);
50  			if (notEmpty(middleName))
51  				builder.append(" \"").append(middleName).append("\" ");
52  			builder.append(" ").append(lastName);
53  			builder.append(" ").append(suffix);
54  
55  			if (notEmpty(maidenName) || notEmpty(nickName)) {
56  				builder.append(" <i>(");
57  				if (notEmpty(maidenName))
58  					builder.append("Born: ").append(maidenName);
59  
60  				if (notEmpty(maidenName) && notEmpty(nickName))
61  					builder.append(", ");
62  				if (notEmpty(nickName))
63  					builder.append("aka: ").append(nickName);
64  				builder.append(")</i>");
65  			}
66  			return ConnectUtils.replaceAmpersand(builder.toString());
67  		} // useless otherwise
68  		else
69  			return "";
70  	}
71  
72  	/** creates the display ReadOnly HTML snippet for various contacts */
73  	public static String getContactDisplaySnippet(ResourcesService resourcesService, Node node) {
74  		try {
75  			StringBuilder builder = new StringBuilder();
76  
77  			if (node.isNodeType(PeopleTypes.PEOPLE_POSTAL_ADDRESS))
78  				builder.append(getAddressDisplayValue(resourcesService, node));
79  			else {
80  				String value = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_CONTACT_VALUE);
81  				if (node.isNodeType(PeopleTypes.PEOPLE_URL) || node.isNodeType(PeopleTypes.PEOPLE_SOCIAL_MEDIA))
82  					builder.append(ConnectUiSnippets.getUrlLink(value));
83  				else if (node.isNodeType(PeopleTypes.PEOPLE_MAIL))
84  					builder.append(ConnectUiSnippets.getMailLink(value));
85  				else if (node.isNodeType(PeopleTypes.PEOPLE_PHONE))
86  					builder.append(ConnectUiSnippets.getPhoneLink(value));
87  				else
88  					// if (node.isNodeType(PeopleTypes.PEOPLE_IMPP))
89  					builder.append(value);
90  			}
91  			builder.append(getContactMetaData(node));
92  			return ConnectUtils.replaceAmpersand(builder.toString());
93  
94  		} catch (RepositoryException re) {
95  			throw new PeopleException("Error while generating contact " + "display HTML snippet ", re);
96  		}
97  	}
98  
99  	/** creates the display ReadOnly HTML snippet for a work address */
100 	public static String getWorkAddress(ResourcesService resourcesService, Node contactNode, Node referencedEntity) {
101 		StringBuilder builder = new StringBuilder();
102 		// the referenced org
103 		if (referencedEntity != null)
104 			builder.append(ConnectJcrUtils.get(referencedEntity, Property.JCR_TITLE));
105 		// current contact meta data
106 		builder.append(getContactMetaData(contactNode));
107 		// Referenced org primary address
108 		if (referencedEntity != null) {
109 			Node primaryAddress = PeopleJcrUtils.getPrimaryContact(referencedEntity, PeopleTypes.PEOPLE_POSTAL_ADDRESS);
110 			if (primaryAddress != null) {
111 				builder.append("<br />");
112 				builder.append(getAddressDisplayValue(resourcesService, primaryAddress));
113 			}
114 		}
115 		return ConnectUtils.replaceAmpersand(builder.toString());
116 	}
117 
118 	/**
119 	 * creates the display ReadOnly HTML snippet for various contact metadata
120 	 */
121 	public static String getContactMetaData(Node node) {
122 		StringBuilder builder = new StringBuilder();
123 
124 		// TODO make this more reliable
125 		Node contactable = ConnectJcrUtils.getParent(ConnectJcrUtils.getParent(node));
126 		String nature = null;
127 		if (ConnectJcrUtils.isNodeType(contactable, PeopleTypes.PEOPLE_PERSON))
128 			nature = ConnectJcrUtils.isNodeType(node, PeopleTypes.PEOPLE_CONTACT_REF)
129 					? ContactValueCatalogs.CONTACT_CAT_OFFICE : ContactValueCatalogs.CONTACT_CAT_HOME;
130 		String category = ConnectJcrUtils.get(node, Property.JCR_TITLE);
131 		String label = ConnectJcrUtils.get(node, Property.JCR_DESCRIPTION);
132 
133 		if (notEmpty(nature) || notEmpty(category) || notEmpty(label)) {
134 			builder.append(ConnectUiConstants.NB_DOUBLE_SPACE + "[");
135 
136 			if (notEmpty(nature)) {
137 				builder.append(nature).append(notEmpty(category) ? " " : "");
138 			}
139 			if (notEmpty(category)) {
140 				builder.append(category);
141 			}
142 
143 			if (notEmpty(label)) {
144 				if (notEmpty(nature) || notEmpty(category))
145 					builder.append(", ");
146 				builder.append(label);
147 			}
148 			builder.append("]");
149 		}
150 		return ConnectUtils.replaceAmpersand(builder.toString());
151 	}
152 
153 	/** creates an address Display value */
154 	public static String getAddressDisplayValue(ResourcesService resourcesService, Node node) {
155 		String street = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_STREET);
156 		String street2 = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_STREET_COMPLEMENT);
157 		String zip = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_ZIP_CODE);
158 		String city = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_CITY);
159 		String state = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_STATE);
160 		String country = ConnectJcrUtils.get(node, PeopleNames.PEOPLE_COUNTRY);
161 
162 		StringBuilder builder = new StringBuilder();
163 
164 		if (notEmpty(street))
165 			builder.append(street);
166 
167 		if (notEmpty(street2)) {
168 			if (builder.length() > 0)
169 				builder.append(", ");
170 			builder.append(street2);
171 		}
172 
173 		if (notEmpty(zip)) {
174 			if (builder.length() > 0)
175 				builder.append(", ");
176 			builder.append(zip);
177 		}
178 
179 		if (notEmpty(city)) {
180 			if (builder.length() > 0)
181 				if (notEmpty(zip))
182 					builder.append(" ");
183 				else
184 					builder.append(", ");
185 			builder.append(city);
186 		}
187 
188 		if (notEmpty(state)) {
189 			if (builder.length() > 0)
190 				builder.append(", ");
191 			builder.append(state);
192 		}
193 
194 		if (notEmpty(country)) {
195 			country = resourcesService.getEncodedTagValue(ConnectJcrUtils.getSession(node),
196 					ConnectConstants.RESOURCE_COUNTRY, country);
197 
198 			if (builder.length() > 0)
199 				builder.append(", ");
200 			builder.append(country.toUpperCase());
201 		}
202 		return builder.toString();
203 	}
204 
205 	/** creates the localisation snippet */
206 	public static String getLocalisationInfo(ResourcesService resourcesService, PeopleService peopleService,
207 			Node entity) {
208 		String town = PeopleJcrUtils.getTownFromItem(peopleService, entity);
209 		String country = PeopleJcrUtils.getCountryFromItem(peopleService, entity);
210 		if (notEmpty(town) || notEmpty(country)) {
211 			StringBuilder builder = new StringBuilder();
212 			builder.append("[");
213 			if (notEmpty(town)) {
214 				builder.append(town);
215 				if (notEmpty(country))
216 					builder.append(", ");
217 			}
218 			if (notEmpty(country)) {
219 				country = resourcesService.getEncodedTagValue(ConnectJcrUtils.getSession(entity),
220 						ConnectConstants.RESOURCE_COUNTRY, country);
221 				builder.append(country);
222 			}
223 			builder.append("]");
224 			return builder.toString();
225 		} else
226 			return "";
227 	}
228 
229 	/**
230 	 * Returns primary contacts (phone, mail, website) as links if they exist
231 	 */
232 	public static String getPrimaryContacts(Node entity) {
233 		StringBuilder builder = new StringBuilder();
234 
235 		String tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_MOBILE);
236 		if (notEmpty(tmpStr))
237 			tmpStr = ConnectUiSnippets.getPhoneLink(tmpStr) + " (Mobile)";
238 		String tmpStr2 = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_TELEPHONE_NUMBER);
239 		if (notEmpty(tmpStr2))
240 			tmpStr2 = ConnectUiSnippets.getPhoneLink(tmpStr2);
241 		tmpStr = ConnectJcrUtils.concatIfNotEmpty(tmpStr, tmpStr2, " / ");
242 		if (notEmpty(tmpStr))
243 			builder.append(tmpStr).append(ConnectUiConstants.NB_DOUBLE_SPACE);
244 
245 		tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_MAIL);
246 		if (notEmpty(tmpStr))
247 			builder.append(ConnectUiSnippets.getMailLink(tmpStr)).append(ConnectUiConstants.NB_DOUBLE_SPACE);
248 
249 		tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_URL);
250 		if (notEmpty(tmpStr))
251 			builder.append(ConnectUiSnippets.getUrlLink(tmpStr)).append(ConnectUiConstants.NB_DOUBLE_SPACE);
252 
253 		String result = builder.toString();
254 		if (result.lastIndexOf(ConnectUiConstants.NB_DOUBLE_SPACE) > 0)
255 			result = result.substring(0, result.lastIndexOf(ConnectUiConstants.NB_DOUBLE_SPACE));
256 		return ConnectUtils.replaceAmpersand(result);
257 	}
258 
259 	/**
260 	 * 
261 	 * @param entity
262 	 * @param label
263 	 *            an optional label to be displayed first
264 	 * @return
265 	 */
266 	public static String getEntityContact(PeopleService peopleService, Node entity, String label) {
267 		try {
268 			// local cache
269 			Node person = null, org = null;
270 
271 			if (entity.isNodeType(PeopleTypes.PEOPLE_PERSON)) {
272 				person = entity;
273 				Node currContact = PeopleJcrUtils.getPrimaryContact(person, PeopleTypes.PEOPLE_POSTAL_ADDRESS);
274 				if (!(currContact == null || !currContact.isNodeType(PeopleTypes.PEOPLE_CONTACT_REF))) {
275 					org = peopleService.getEntityByUid(ConnectJcrUtils.getSession(currContact), null,
276 							ConnectJcrUtils.get(currContact, PeopleNames.PEOPLE_REF_UID));
277 				}
278 			} else if (entity.isNodeType(PeopleTypes.PEOPLE_ORG))
279 				org = entity;
280 
281 			StringBuilder builder = new StringBuilder();
282 
283 			builder.append("<b>");
284 			if (notEmpty(label))
285 				builder.append(label);
286 			if (org != null)
287 				builder.append(ConnectJcrUtils.get(org, Property.JCR_TITLE)).append("<br/>");
288 			builder.append("</b>");
289 			if (person != null)
290 				builder.append(peopleService.getDisplayName(person)).append("<br/>");
291 
292 			String pam = getEntityPhoneAndMailFormatted(entity);
293 			if (notEmpty(pam))
294 				builder.append(pam);
295 			return ConnectUtils.replaceAmpersand(builder.toString());
296 		} catch (RepositoryException re) {
297 			throw new PeopleException("Unable to create contact snippet for node " + entity, re);
298 		}
299 	}
300 
301 	public static String getEntityPhoneAndMailFormatted(Node entity) {
302 		StringBuilder builder = new StringBuilder();
303 		// phones
304 		String tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_MOBILE);
305 		String tmpStr2 = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_TELEPHONE_NUMBER);
306 		if (notEmpty(tmpStr) && notEmpty(tmpStr2))
307 			builder.append(ConnectUiSnippets.getPhoneLink(tmpStr)).append("(Mobile) / ").append(tmpStr2)
308 					.append("<br/>");
309 		else if (notEmpty(tmpStr) || notEmpty(tmpStr2))
310 			builder.append(ConnectUiSnippets.getPhoneLink(tmpStr)).append(tmpStr2).append("<br/>");
311 
312 		// mail
313 		tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_MAIL);
314 		if (notEmpty(tmpStr))
315 			builder.append(ConnectUiSnippets.getMailLink(tmpStr)).append("<br/>");
316 		return ConnectUtils.replaceAmpersand(builder.toString());
317 	}
318 
319 	/**
320 	 * Simply gets a snippet to display clickable primary contacts
321 	 * 
322 	 * @param entity
323 	 * @return
324 	 */
325 	public static String getPrimaryContacts(PeopleService peopleService, Node entity) {
326 		StringBuilder builder = new StringBuilder();
327 		// phones
328 		String tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_MOBILE);
329 		String tmpStr2 = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_TELEPHONE_NUMBER);
330 		if (notEmpty(tmpStr) && notEmpty(tmpStr2))
331 			builder.append(ConnectUiSnippets.getPhoneLink(tmpStr)).append("(Mobile) / ").append(tmpStr2)
332 					.append("<br/>");
333 		else if (notEmpty(tmpStr) || notEmpty(tmpStr2))
334 			builder.append(ConnectUiSnippets.getPhoneLink(tmpStr)).append(tmpStr2).append("<br/>");
335 
336 		// mail
337 		tmpStr = PeopleJcrUtils.getPrimaryContactValue(entity, PeopleTypes.PEOPLE_MAIL);
338 		if (notEmpty(tmpStr))
339 			builder.append(ConnectUiSnippets.getMailLink(tmpStr)).append("<br/>");
340 		return ConnectUtils.replaceAmpersand(builder.toString());
341 	}
342 }