View Javadoc
1   package org.argeo.eclipse.ui.jcr.lists;
2   
3   import java.text.DateFormat;
4   import java.text.DecimalFormat;
5   import java.text.NumberFormat;
6   import java.text.SimpleDateFormat;
7   
8   import javax.jcr.Node;
9   import javax.jcr.PropertyType;
10  import javax.jcr.RepositoryException;
11  import javax.jcr.Value;
12  
13  import org.argeo.eclipse.ui.EclipseUiException;
14  import org.eclipse.jface.viewers.ColumnLabelProvider;
15  
16  /** Base implementation of a label provider for controls that display JCR Nodes */
17  public class SimpleJcrNodeLabelProvider extends ColumnLabelProvider {
18  	private static final long serialVersionUID = -5215787695436221993L;
19  
20  	private final static String DEFAULT_DATE_FORMAT = "EEE, dd MMM yyyy";
21  	private final static String DEFAULT_NUMBER_FORMAT = "#,##0.0";
22  
23  	private DateFormat dateFormat;
24  	private NumberFormat numberFormat;
25  
26  	final private String propertyName;
27  
28  	/**
29  	 * Default Label provider for a given property of a node. Using default
30  	 * pattern for date and number formating
31  	 */
32  	public SimpleJcrNodeLabelProvider(String propertyName) {
33  		this.propertyName = propertyName;
34  		dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
35  		numberFormat = DecimalFormat.getInstance();
36  		((DecimalFormat) numberFormat).applyPattern(DEFAULT_NUMBER_FORMAT);
37  	}
38  
39  	/**
40  	 * Label provider for a given property of a node optionally precising date
41  	 * and/or number format patterns
42  	 */
43  	public SimpleJcrNodeLabelProvider(String propertyName,
44  			String dateFormatPattern, String numberFormatPattern) {
45  		this.propertyName = propertyName;
46  		dateFormat = new SimpleDateFormat(
47  				dateFormatPattern == null ? DEFAULT_DATE_FORMAT
48  						: dateFormatPattern);
49  		numberFormat = DecimalFormat.getInstance();
50  		((DecimalFormat) numberFormat)
51  				.applyPattern(numberFormatPattern == null ? DEFAULT_NUMBER_FORMAT
52  						: numberFormatPattern);
53  	}
54  
55  	@Override
56  	public String getText(Object element) {
57  		try {
58  			Node currNode = (Node) element;
59  
60  			if (currNode.hasProperty(propertyName)) {
61  				if (currNode.getProperty(propertyName).isMultiple()) {
62  					StringBuilder builder = new StringBuilder();
63  					for (Value value : currNode.getProperty(propertyName)
64  							.getValues()) {
65  						String currStr = getSingleValueAsString(value);
66  						if (notEmptyString(currStr))
67  							builder.append(currStr).append("; ");
68  					}
69  					if (builder.length() > 0)
70  						builder.deleteCharAt(builder.length() - 2);
71  
72  					return builder.toString();
73  				} else
74  					return getSingleValueAsString(currNode.getProperty(
75  							propertyName).getValue());
76  			} else
77  				return "";
78  		} catch (RepositoryException re) {
79  			throw new EclipseUiException("Unable to get text from row", re);
80  		}
81  	}
82  
83  	private String getSingleValueAsString(Value value)
84  			throws RepositoryException {
85  		switch (value.getType()) {
86  		case PropertyType.STRING:
87  			return value.getString();
88  		case PropertyType.BOOLEAN:
89  			return "" + value.getBoolean();
90  		case PropertyType.DATE:
91  			return dateFormat.format(value.getDate().getTime());
92  		case PropertyType.LONG:
93  			return "" + value.getLong();
94  		case PropertyType.DECIMAL:
95  			return numberFormat.format(value.getDecimal());
96  		case PropertyType.DOUBLE:
97  			return numberFormat.format(value.getDouble());
98  		case PropertyType.NAME:
99  			return value.getString();
100 		default:
101 			throw new EclipseUiException("Unimplemented label provider "
102 					+ "for property type " + value.getType()
103 					+ " while getting property " + propertyName + " - value: "
104 					+ value.getString());
105 
106 		}
107 	}
108 
109 	private boolean notEmptyString(String string) {
110 		return string != null && !"".equals(string.trim());
111 	}
112 
113 	public void setDateFormat(String dateFormatPattern) {
114 		dateFormat = new SimpleDateFormat(dateFormatPattern);
115 	}
116 
117 	public void setNumberFormat(String numberFormatPattern) {
118 		((DecimalFormat) numberFormat).applyPattern(numberFormatPattern);
119 	}
120 }