Java SDK and Eclipse plugin for simulator.
[platform/upstream/iotivity.git] / service / simulator / java / eclipse-plugin / ServiceProviderPlugin / src / oic / simulator / serviceprovider / view / ResourceObserverView.java
1 /*
2  * Copyright 2015 Samsung Electronics All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package oic.simulator.serviceprovider.view;
18
19 import java.util.Iterator;
20 import java.util.Map;
21 import java.util.Set;
22
23 import oic.simulator.serviceprovider.Activator;
24 import oic.simulator.serviceprovider.listener.IObserverListChangedUIListener;
25 import oic.simulator.serviceprovider.listener.IResourceSelectionChangedUIListener;
26 import oic.simulator.serviceprovider.manager.ResourceManager;
27 import oic.simulator.serviceprovider.resource.ObserverDetail;
28 import oic.simulator.serviceprovider.resource.SimulatorResource;
29 import oic.simulator.serviceprovider.utils.Constants;
30
31 import org.eclipse.jface.viewers.CellEditor;
32 import org.eclipse.jface.viewers.CheckboxCellEditor;
33 import org.eclipse.jface.viewers.ColumnLabelProvider;
34 import org.eclipse.jface.viewers.EditingSupport;
35 import org.eclipse.jface.viewers.IStructuredContentProvider;
36 import org.eclipse.jface.viewers.StyledCellLabelProvider;
37 import org.eclipse.jface.viewers.TableViewer;
38 import org.eclipse.jface.viewers.TableViewerColumn;
39 import org.eclipse.jface.viewers.Viewer;
40 import org.eclipse.jface.viewers.ViewerCell;
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.graphics.Image;
43 import org.eclipse.swt.layout.GridData;
44 import org.eclipse.swt.layout.GridLayout;
45 import org.eclipse.swt.widgets.Composite;
46 import org.eclipse.swt.widgets.Display;
47 import org.eclipse.swt.widgets.Table;
48 import org.eclipse.ui.part.ViewPart;
49
50 /**
51  * This class manages and shows the resource observer view in the perspective.
52  */
53 public class ResourceObserverView extends ViewPart {
54     public static final String                  VIEW_ID       = "oic.simulator.serviceprovider.view.observer";
55
56     private TableViewer                         tblViewer;
57
58     private final String[]                      columnHeaders = {
59             "Client Address", "Port", "Notify"               };
60
61     private final Integer[]                     columnWidth   = { 150, 75, 50 };
62
63     private IResourceSelectionChangedUIListener resourceSelectionChangedListener;
64
65     private IObserverListChangedUIListener      resourceObserverListChangedListener;
66
67     private ResourceManager                     resourceManagerRef;
68
69     public ResourceObserverView() {
70
71         resourceManagerRef = Activator.getDefault().getResourceManager();
72
73         resourceSelectionChangedListener = new IResourceSelectionChangedUIListener() {
74
75             @Override
76             public void onResourceSelectionChange() {
77                 Display.getDefault().asyncExec(new Runnable() {
78
79                     @Override
80                     public void run() {
81                         if (null != tblViewer) {
82                             changeButtonStatus();
83                             updateViewer(getData(resourceManagerRef
84                                     .getCurrentResourceInSelection()));
85                         }
86                     }
87                 });
88             }
89         };
90
91         resourceObserverListChangedListener = new IObserverListChangedUIListener() {
92
93             @Override
94             public void onObserverListChanged(final String resourceURI) {
95                 Display.getDefault().asyncExec(new Runnable() {
96
97                     @Override
98                     public void run() {
99                         if (null == resourceURI) {
100                             return;
101                         }
102                         SimulatorResource resource = resourceManagerRef
103                                 .getCurrentResourceInSelection();
104                         if (null == resource) {
105                             return;
106                         }
107                         if (resource.getResourceURI().equals(resourceURI)) {
108                             if (null != tblViewer) {
109                                 updateViewer(getData(resource));
110                             }
111                         }
112                     }
113                 });
114
115             }
116         };
117     }
118
119     private Map<Integer, ObserverDetail> getData(SimulatorResource resource) {
120         if (null == resource) {
121             return null;
122         }
123         return resource.getObserver();
124     }
125
126     private void updateViewer(Map<Integer, ObserverDetail> observer) {
127         if (null != tblViewer) {
128             Table tbl = tblViewer.getTable();
129             if (null != observer && observer.size() > 0) {
130                 tblViewer.setInput(observer.entrySet().toArray());
131                 if (!tbl.isDisposed()) {
132                     tbl.setLinesVisible(true);
133                 }
134             } else {
135                 if (!tbl.isDisposed()) {
136                     tbl.removeAll();
137                     tbl.setLinesVisible(false);
138                 }
139             }
140         }
141     }
142
143     @Override
144     public void createPartControl(Composite parent) {
145         parent.setLayout(new GridLayout(1, false));
146
147         tblViewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
148                 | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
149
150         createColumns(tblViewer);
151
152         // make lines and header visible
153         final Table table = tblViewer.getTable();
154         table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
155         table.setHeaderVisible(true);
156         table.setLinesVisible(true);
157
158         tblViewer.setContentProvider(new ObserverContentProvider());
159
160         addManagerListeners();
161
162         // Check whether there is any resource selected already
163         Map<Integer, ObserverDetail> observerList = getData(resourceManagerRef
164                 .getCurrentResourceInSelection());
165         if (null != observerList) {
166             updateViewer(observerList);
167         }
168     }
169
170     public void createColumns(TableViewer tableViewer) {
171         TableViewerColumn addressColumn = new TableViewerColumn(tableViewer,
172                 SWT.NONE);
173         addressColumn.getColumn().setWidth(columnWidth[0]);
174         addressColumn.getColumn().setText(columnHeaders[0]);
175         addressColumn.setLabelProvider(new StyledCellLabelProvider() {
176             @Override
177             public void update(ViewerCell cell) {
178                 Object element = cell.getElement();
179                 if (element instanceof Map.Entry) {
180                     @SuppressWarnings("unchecked")
181                     Map.Entry<Integer, ObserverDetail> observer = (Map.Entry<Integer, ObserverDetail>) element;
182                     cell.setText(observer.getValue().getObserverInfo()
183                             .getAddress());
184                 }
185             }
186         });
187
188         TableViewerColumn portColumn = new TableViewerColumn(tableViewer,
189                 SWT.NONE);
190         portColumn.getColumn().setWidth(columnWidth[1]);
191         portColumn.getColumn().setText(columnHeaders[1]);
192         portColumn.setLabelProvider(new StyledCellLabelProvider() {
193             @Override
194             public void update(ViewerCell cell) {
195                 Object element = cell.getElement();
196                 if (element instanceof Map.Entry) {
197                     @SuppressWarnings("unchecked")
198                     Map.Entry<Integer, ObserverDetail> observer = (Map.Entry<Integer, ObserverDetail>) element;
199                     cell.setText(String.valueOf(observer.getValue()
200                             .getObserverInfo().getPort()));
201                 }
202             }
203         });
204
205         TableViewerColumn notifyColumn = new TableViewerColumn(tableViewer,
206                 SWT.NONE);
207         notifyColumn.getColumn().setWidth(columnWidth[2]);
208         notifyColumn.getColumn().setText(columnHeaders[2]);
209         notifyColumn.setLabelProvider(new ColumnLabelProvider() {
210
211             @Override
212             public String getText(Object element) {
213                 return "";
214             }
215
216             @Override
217             public Image getImage(Object element) {
218                 @SuppressWarnings("unchecked")
219                 Map.Entry<Integer, ObserverDetail> observer = (Map.Entry<Integer, ObserverDetail>) element;
220                 if (observer.getValue().isClicked()) {
221                     return Activator.getDefault().getImageRegistry()
222                             .get(Constants.NOTIFY_BUTTON_SELECTED);
223                 }
224                 return Activator.getDefault().getImageRegistry()
225                         .get(Constants.NOTIFY_BUTTON_UNSELECTED);
226             }
227         });
228         notifyColumn.setEditingSupport(new NotifyEditor(tableViewer));
229     }
230
231     private void addManagerListeners() {
232         resourceManagerRef
233                 .addResourceSelectionChangedUIListener(resourceSelectionChangedListener);
234         resourceManagerRef
235                 .addObserverListChangedUIListener(resourceObserverListChangedListener);
236     }
237
238     class ObserverContentProvider implements IStructuredContentProvider {
239
240         @Override
241         public void dispose() {
242         }
243
244         @Override
245         public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
246         }
247
248         @Override
249         public Object[] getElements(Object element) {
250             return (Object[]) element;
251         }
252
253     }
254
255     class NotifyEditor extends EditingSupport {
256
257         private final TableViewer viewer;
258
259         public NotifyEditor(TableViewer viewer) {
260             super(viewer);
261             this.viewer = viewer;
262         }
263
264         @Override
265         protected boolean canEdit(Object arg0) {
266             return true;
267         }
268
269         @Override
270         protected CellEditor getCellEditor(Object element) {
271             return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
272         }
273
274         @Override
275         protected Object getValue(Object element) {
276             System.out.println("getValue()");
277             @SuppressWarnings("unchecked")
278             Map.Entry<Integer, ObserverDetail> observer = (Map.Entry<Integer, ObserverDetail>) element;
279             return observer.getValue().isClicked();
280         }
281
282         @Override
283         protected void setValue(Object element, Object value) {
284             System.out.println("setValue()");
285             // Change the button status of all the resources
286             changeButtonStatus();
287
288             @SuppressWarnings("unchecked")
289             Map.Entry<Integer, ObserverDetail> observer = (Map.Entry<Integer, ObserverDetail>) element;
290             observer.getValue().setClicked(true);
291             viewer.refresh();
292
293             // Call Native Method
294             resourceManagerRef.notifyObserverRequest(
295                     resourceManagerRef.getCurrentResourceInSelection(),
296                     observer.getValue().getObserverInfo().getId());
297         }
298     }
299
300     private void changeButtonStatus() {
301         SimulatorResource resource = resourceManagerRef
302                 .getCurrentResourceInSelection();
303         if (null == resource) {
304             return;
305         }
306         Map<Integer, ObserverDetail> observerMap = resource.getObserver();
307         if (null == observerMap) {
308             return;
309         }
310         Set<Integer> keySet = observerMap.keySet();
311         Iterator<Integer> itr = keySet.iterator();
312         while (itr.hasNext()) {
313             observerMap.get(itr.next()).setClicked(false);
314         }
315     }
316
317     @Override
318     public void dispose() {
319         // Unregister the listener
320         if (null != resourceSelectionChangedListener) {
321             resourceManagerRef
322                     .removeResourceSelectionChangedUIListener(resourceSelectionChangedListener);
323         }
324
325         if (null != resourceObserverListChangedListener) {
326             resourceManagerRef
327                     .removeObserverListChangedUIListener(resourceObserverListChangedListener);
328         }
329         super.dispose();
330     }
331
332     @Override
333     public void setFocus() {
334     }
335
336 }