View Javadoc
1   package org.argeo.cms.e4.monitoring;
2   
3   import java.io.IOException;
4   import java.util.ArrayList;
5   import java.util.Arrays;
6   import java.util.Comparator;
7   import java.util.Dictionary;
8   import java.util.List;
9   
10  import javax.annotation.PostConstruct;
11  
12  import org.argeo.cms.CmsException;
13  import org.argeo.util.LangUtils;
14  import org.eclipse.jface.viewers.ColumnLabelProvider;
15  import org.eclipse.jface.viewers.ITreeContentProvider;
16  import org.eclipse.jface.viewers.TreeViewer;
17  import org.eclipse.jface.viewers.TreeViewerColumn;
18  import org.eclipse.jface.viewers.Viewer;
19  import org.eclipse.swt.SWT;
20  import org.eclipse.swt.graphics.Image;
21  import org.eclipse.swt.widgets.Composite;
22  import org.osgi.framework.BundleContext;
23  import org.osgi.framework.Constants;
24  import org.osgi.framework.FrameworkUtil;
25  import org.osgi.framework.InvalidSyntaxException;
26  import org.osgi.service.cm.Configuration;
27  import org.osgi.service.cm.ConfigurationAdmin;
28  
29  public class OsgiConfigurationsView {
30  	private final static BundleContext bc = FrameworkUtil.getBundle(OsgiConfigurationsView.class).getBundleContext();
31  
32  	@PostConstruct
33  	public void createPartControl(Composite parent) {
34  		ConfigurationAdmin configurationAdmin = bc.getService(bc.getServiceReference(ConfigurationAdmin.class));
35  
36  		TreeViewer viewer = new TreeViewer(parent);
37  		// viewer.getTree().setHeaderVisible(true);
38  
39  		TreeViewerColumn tvc = new TreeViewerColumn(viewer, SWT.NONE);
40  		tvc.getColumn().setWidth(400);
41  		tvc.setLabelProvider(new ColumnLabelProvider() {
42  			private static final long serialVersionUID = 835407996597566763L;
43  
44  			@Override
45  			public String getText(Object element) {
46  				if (element instanceof Configuration) {
47  					return ((Configuration) element).getPid();
48  				} else if (element instanceof Prop) {
49  					return ((Prop) element).key;
50  				}
51  				return super.getText(element);
52  			}
53  
54  			@Override
55  			public Image getImage(Object element) {
56  				if (element instanceof Configuration)
57  					return OsgiExplorerImages.CONFIGURATION;
58  				return null;
59  			}
60  
61  		});
62  
63  		tvc = new TreeViewerColumn(viewer, SWT.NONE);
64  		tvc.getColumn().setWidth(400);
65  		tvc.setLabelProvider(new ColumnLabelProvider() {
66  			private static final long serialVersionUID = 6999659261190014687L;
67  
68  			@Override
69  			public String getText(Object element) {
70  				if (element instanceof Configuration) {
71  					// return ((Configuration) element).getFactoryPid();
72  					return null;
73  				} else if (element instanceof Prop) {
74  					return ((Prop) element).value.toString();
75  				}
76  				return super.getText(element);
77  			}
78  		});
79  
80  		viewer.setContentProvider(new ConfigurationsContentProvider());
81  		viewer.setInput(configurationAdmin);
82  	}
83  
84  	static class ConfigurationsContentProvider implements ITreeContentProvider {
85  		private static final long serialVersionUID = -4892768279440981042L;
86  		private ConfigurationComparator configurationComparator = new ConfigurationComparator();
87  
88  		@Override
89  		public void dispose() {
90  		}
91  
92  		@Override
93  		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
94  		}
95  
96  		@Override
97  		public Object[] getElements(Object inputElement) {
98  			ConfigurationAdmin configurationAdmin = (ConfigurationAdmin) inputElement;
99  			try {
100 				Configuration[] configurations = configurationAdmin.listConfigurations(null);
101 				Arrays.sort(configurations, configurationComparator);
102 				return configurations;
103 			} catch (IOException | InvalidSyntaxException e) {
104 				throw new CmsException("Cannot list configurations", e);
105 			}
106 		}
107 
108 		@Override
109 		public Object[] getChildren(Object parentElement) {
110 			if (parentElement instanceof Configuration) {
111 				List<Prop> res = new ArrayList<>();
112 				Configuration configuration = (Configuration) parentElement;
113 				Dictionary<String, Object> props = configuration.getProperties();
114 				keys: for (String key : LangUtils.keys(props)) {
115 					if (Constants.SERVICE_PID.equals(key))
116 						continue keys;
117 					if (ConfigurationAdmin.SERVICE_FACTORYPID.equals(key))
118 						continue keys;
119 					res.add(new Prop(configuration, key, props.get(key)));
120 				}
121 				return res.toArray(new Prop[res.size()]);
122 			}
123 			return null;
124 		}
125 
126 		@Override
127 		public Object getParent(Object element) {
128 			if (element instanceof Prop)
129 				return ((Prop) element).configuration;
130 			return null;
131 		}
132 
133 		@Override
134 		public boolean hasChildren(Object element) {
135 			if (element instanceof Configuration)
136 				return true;
137 			return false;
138 		}
139 
140 	}
141 
142 	static class Prop {
143 		final Configuration configuration;
144 		final String key;
145 		final Object value;
146 
147 		public Prop(Configuration configuration, String key, Object value) {
148 			this.configuration = configuration;
149 			this.key = key;
150 			this.value = value;
151 		}
152 
153 	}
154 
155 	static class ConfigurationComparator implements Comparator<Configuration> {
156 
157 		@Override
158 		public int compare(Configuration o1, Configuration o2) {
159 			return o1.getPid().compareTo(o2.getPid());
160 		}
161 
162 	}
163 }