Imported Upstream version 1.1.0
[platform/upstream/iotivity.git] / service / simulator / java / eclipse-plugin / ServiceProviderPlugin / src / oic / simulator / serviceprovider / view / MetaPropertiesView.java
index 8f8ff18..d5fd2d6 100644 (file)
 
 package oic.simulator.serviceprovider.view;
 
-import java.util.List;
-
-import oic.simulator.serviceprovider.Activator;
-import oic.simulator.serviceprovider.listener.IResourceSelectionChangedUIListener;
-import oic.simulator.serviceprovider.manager.ResourceManager;
-import oic.simulator.serviceprovider.resource.MetaProperty;
-import oic.simulator.serviceprovider.resource.SimulatorResource;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.EditingSupport;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.TextCellEditor;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.part.ViewPart;
 
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.oic.simulator.SimulatorException;
+
+import oic.simulator.serviceprovider.Activator;
+import oic.simulator.serviceprovider.listener.ISelectionChangedListener;
+import oic.simulator.serviceprovider.manager.ResourceManager;
+import oic.simulator.serviceprovider.manager.UiListenerHandler;
+import oic.simulator.serviceprovider.model.MetaProperty;
+import oic.simulator.serviceprovider.model.Resource;
+import oic.simulator.serviceprovider.model.SingleResource;
+import oic.simulator.serviceprovider.utils.Constants;
+import oic.simulator.serviceprovider.utils.Utility;
+import oic.simulator.serviceprovider.view.dialogs.UpdateResourceInterfaceDialog;
+
 /**
  * This class manages and shows the meta properties view in the perspective.
  */
 public class MetaPropertiesView extends ViewPart {
 
-    public static final String                  VIEW_ID       = "oic.simulator.serviceprovider.view.metaproperties";
+    public static final String        VIEW_ID       = "oic.simulator.serviceprovider.view.metaproperties";
+
+    private TableViewer               tableViewer;
 
-    private TableViewer                         tableViewer;
+    private final String[]            columnHeaders = { "Property", "Value" };
 
-    private final String[]                      columnHeaders = { "Property",
-            "Value"                                          };
+    private final Integer[]           columnWidth   = { 150, 150 };
 
-    private final Integer[]                     columnWidth   = { 150, 150 };
+    private ISelectionChangedListener resourceSelectionChangedListener;
 
-    private IResourceSelectionChangedUIListener resourceSelectionChangedListener;
+    private ResourceManager           resourceManagerRef;
 
-    private ResourceManager                     resourceManagerRef;
+    private Set<String>               updatedIfSet;
+
+    private List<MetaProperty>        properties;
+
+    private boolean                   enable_edit;
+    private Button                    editBtn;
+    private Button                    cancelBtn;
+
+    private Map<String, String>       ifTypes;
 
     public MetaPropertiesView() {
 
         resourceManagerRef = Activator.getDefault().getResourceManager();
 
-        resourceSelectionChangedListener = new IResourceSelectionChangedUIListener() {
+        resourceSelectionChangedListener = new ISelectionChangedListener() {
 
             @Override
-            public void onResourceSelectionChange() {
+            public void onResourceSelectionChange(final Resource resource) {
                 Display.getDefault().asyncExec(new Runnable() {
 
                     @Override
                     public void run() {
                         if (null != tableViewer) {
-                            updateViewer(getData());
+                            properties = getData(resource);
+                            updateViewer(properties);
                         }
+                        updateEditControls(resource);
                     }
                 });
             }
@@ -77,8 +111,8 @@ public class MetaPropertiesView extends ViewPart {
     }
 
     @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new GridLayout(1, false));
+    public void createPartControl(final Composite parent) {
+        parent.setLayout(new GridLayout(2, false));
 
         tableViewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
                 | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
@@ -87,28 +121,245 @@ public class MetaPropertiesView extends ViewPart {
 
         // Make lines and header visible
         final Table table = tableViewer.getTable();
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+        gd.horizontalSpan = 2;
+        table.setLayoutData(gd);
         table.setHeaderVisible(true);
         table.setLinesVisible(true);
 
         tableViewer.setContentProvider(new PropertycontentProvider());
 
+        editBtn = new Button(parent, SWT.PUSH);
+        editBtn.setText("Edit");
+        gd = new GridData();
+        gd.widthHint = 50;
+        editBtn.setLayoutData(gd);
+        editBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                if (editBtn.getText().equals("Edit")) {
+                    cancelBtn.setEnabled(true);
+                    editBtn.setText("Save");
+                    setEnableEdit(true);
+
+                    Resource resource = resourceManagerRef
+                            .getCurrentResourceInSelection();
+                    if (null != resource) {
+                        updatedIfSet = resource.getResourceInterfaces();
+                    }
+                } else {
+                    Resource resourceInSelection = resourceManagerRef
+                            .getCurrentResourceInSelection();
+                    if (null != resourceInSelection) {
+
+                        // Null Check
+                        boolean result = resourceManagerRef
+                                .isPropertyValueInvalid(resourceInSelection,
+                                        properties, Constants.RESOURCE_URI);
+                        if (result) {
+                            MessageDialog.openError(parent.getShell(),
+                                    "Invalid Resource URI.",
+                                    Constants.INVALID_URI_MESSAGE);
+                            return;
+                        }
+
+                        result = resourceManagerRef.isPropertyValueInvalid(
+                                resourceInSelection, properties,
+                                Constants.RESOURCE_NAME);
+                        if (result) {
+                            MessageDialog.openError(parent.getShell(),
+                                    "Invalid Input",
+                                    "Resource Name is invalid.");
+                            return;
+                        }
+
+                        result = resourceManagerRef.isPropertyValueInvalid(
+                                resourceInSelection, properties,
+                                Constants.RESOURCE_TYPE);
+                        if (result) {
+                            MessageDialog.openError(parent.getShell(),
+                                    "Invalid Resource Type.",
+                                    Constants.INVALID_RESOURCE_TYPE_MESSAGE);
+                            return;
+                        }
+
+                        boolean update = false;
+                        boolean uriChange = false;
+                        boolean typeChange = false;
+                        boolean nameChange = false;
+                        boolean interfaceChange = false;
+
+                        if (resourceManagerRef.isPropValueChanged(
+                                resourceInSelection, properties,
+                                Constants.RESOURCE_NAME)) {
+                            update = true;
+                            nameChange = true;
+                        }
+
+                        if (resourceManagerRef.isPropValueChanged(
+                                resourceInSelection, properties,
+                                Constants.RESOURCE_URI)) {
+                            // Check whether the new URI is unique.
+                            if (!resourceManagerRef.isUriUnique(properties)) {
+                                MessageDialog.openError(parent.getShell(),
+                                        "Resource URI in use",
+                                        "Resource URI is in use. Please try a different URI.");
+                                return;
+                            }
+
+                            update = true;
+                            uriChange = true;
+                        }
+
+                        if (resourceManagerRef.isPropValueChanged(
+                                resourceInSelection, properties,
+                                Constants.RESOURCE_TYPE)) {
+                            update = true;
+                            typeChange = true;
+                        }
+                        // Checking whether any changes made in resource
+                        // interfaces by
+                        // comparing the current interface set and updated
+                        // interface set.
+                        Set<String> curIfSet = resourceInSelection
+                                .getResourceInterfaces();
+                        if (null != curIfSet && null != updatedIfSet) {
+                            if (curIfSet.size() != updatedIfSet.size()) {
+                                update = true;
+                                interfaceChange = true;
+                            } else {
+                                Iterator<String> itr = updatedIfSet.iterator();
+                                while (itr.hasNext()) {
+                                    if (!curIfSet.contains(itr.next())) {
+                                        update = true;
+                                        interfaceChange = true;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (update) {
+                            if (uriChange || typeChange || interfaceChange) {
+                                if (resourceManagerRef
+                                        .isResourceStarted(resourceInSelection)) {
+                                    update = MessageDialog.openQuestion(
+                                            parent.getShell(),
+                                            "Save Details",
+                                            "Resource will be restarted to take the changes."
+                                                    + " Do you want to continue?");
+                                    if (!update) {
+                                        return;
+                                    }
+                                }
+                            }
+                            try {
+                                if (uriChange || nameChange || typeChange)
+                                    result = Activator
+                                            .getDefault()
+                                            .getResourceManager()
+                                            .updateResourceProperties(
+                                                    resourceManagerRef
+                                                            .getCurrentResourceInSelection(),
+                                                    properties, uriChange,
+                                                    nameChange, typeChange);
+                                if (interfaceChange)
+                                    result = Activator
+                                            .getDefault()
+                                            .getResourceManager()
+                                            .updateResourceInterfaces(
+                                                    resourceInSelection,
+                                                    updatedIfSet);
+
+                            } catch (SimulatorException ex) {
+                                result = false;
+                            }
+                            if (!result) {
+                                MessageDialog.openInformation(
+                                        parent.getShell(), "Operation status",
+                                        "Failed to update the resource properties.");
+
+                                // Reset the old property values.
+                                properties = getData(resourceManagerRef
+                                        .getCurrentResourceInSelection());
+                                updateViewer(properties);
+                            }
+                        }
+                    }
+                    cancelBtn.setEnabled(false);
+                    editBtn.setText("Edit");
+                    setEnableEdit(false);
+                }
+            }
+        });
+
+        cancelBtn = new Button(parent, SWT.PUSH);
+        cancelBtn.setText("Cancel");
+        cancelBtn.setEnabled(false);
+        gd = new GridData();
+        gd.widthHint = 70;
+        cancelBtn.setLayoutData(gd);
+        cancelBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                Resource res = resourceManagerRef
+                        .getCurrentResourceInSelection();
+                if (null != res) {
+                    properties = getData(res);
+                }
+                updateViewer(properties);
+
+                cancelBtn.setEnabled(false);
+                editBtn.setText("Edit");
+                setEnableEdit(false);
+                if (null != updatedIfSet)
+                    updatedIfSet.clear();
+            }
+        });
+
+        // Get the supported interfaces.
+        Map<String, String> ifTypesSupported = Utility
+                .getResourceInterfaces(SingleResource.class);
+        if (null != ifTypesSupported && !ifTypesSupported.isEmpty()) {
+            ifTypes = new HashMap<String, String>();
+            String key;
+            for (Map.Entry<String, String> entry : ifTypesSupported.entrySet()) {
+                key = entry.getValue() + " (" + entry.getKey() + ")";
+                ifTypes.put(key, entry.getKey());
+            }
+        }
+
         addManagerListeners();
 
         // Check whether there is any resource selected already
-        List<MetaProperty> propertyList = getData();
-        if (null != propertyList) {
-            updateViewer(propertyList);
+        Resource resource = resourceManagerRef.getCurrentResourceInSelection();
+        properties = getData(resource);
+        if (null != properties) {
+            updateViewer(properties);
         }
+        updateEditControls(resource);
+    }
 
+    private void updateEditControls(Object obj) {
+        if (!editBtn.isDisposed() && !cancelBtn.isDisposed()) {
+
+            if (editBtn.getText().equals("Save")) {
+                editBtn.setText("Edit");
+                setEnableEdit(false);
+            }
+
+            if (null == obj) {
+                editBtn.setEnabled(false);
+            } else {
+                editBtn.setEnabled(true);
+            }
+            cancelBtn.setEnabled(false);
+        }
     }
 
-    private List<MetaProperty> getData() {
-        SimulatorResource resourceInSelection = resourceManagerRef
-                .getCurrentResourceInSelection();
-        if (null != resourceInSelection) {
+    private List<MetaProperty> getData(Resource resource) {
+        if (null != resource) {
             List<MetaProperty> metaPropertyList = resourceManagerRef
-                    .getMetaProperties(resourceInSelection);
+                    .getMetaProperties(resource);
             return metaPropertyList;
         } else {
             return null;
@@ -118,34 +369,30 @@ public class MetaPropertiesView extends ViewPart {
     private void updateViewer(List<MetaProperty> metaPropertyList) {
         if (null != tableViewer) {
             Table tbl = tableViewer.getTable();
+            if (tbl.isDisposed()) {
+                return;
+            }
             if (null != metaPropertyList) {
                 tableViewer.setInput(metaPropertyList.toArray());
-                if (!tbl.isDisposed()) {
-                    tbl.setLinesVisible(true);
-                }
+                tbl.setLinesVisible(true);
             } else {
-                if (!tbl.isDisposed()) {
-                    tbl.removeAll();
-                    tbl.setLinesVisible(false);
-                }
+                tbl.removeAll();
+                tbl.setLinesVisible(false);
             }
         }
     }
 
-    public void createColumns(TableViewer tableViewer) {
+    public void createColumns(final TableViewer tableViewer) {
         TableViewerColumn propName = new TableViewerColumn(tableViewer,
                 SWT.NONE);
         propName.getColumn().setWidth(columnWidth[0]);
         propName.getColumn().setText(columnHeaders[0]);
-        propName.setLabelProvider(new ColumnLabelProvider() {
+        propName.setLabelProvider(new StyledCellLabelProvider() {
             @Override
-            public String getText(Object element) {
-                MetaProperty prop = (MetaProperty) element;
-                if (null != prop) {
-                    return prop.getPropName();
-                } else {
-                    return "";
-                }
+            public void update(ViewerCell cell) {
+                MetaProperty prop = (MetaProperty) cell.getElement();
+                cell.setText(prop.getPropName());
+                super.update(cell);
             }
         });
 
@@ -153,25 +400,24 @@ public class MetaPropertiesView extends ViewPart {
                 SWT.NONE);
         propValue.getColumn().setWidth(columnWidth[1]);
         propValue.getColumn().setText(columnHeaders[1]);
-        propValue.setLabelProvider(new ColumnLabelProvider() {
+        propValue.setLabelProvider(new StyledCellLabelProvider() {
             @Override
-            public String getText(Object element) {
-                MetaProperty prop = (MetaProperty) element;
-                if (null != prop) {
-                    return prop.getPropValue();
-                } else {
-                    return "";
-                }
+            public void update(ViewerCell cell) {
+                MetaProperty prop = (MetaProperty) cell.getElement();
+                cell.setText(prop.getPropValue());
+                super.update(cell);
             }
         });
+        propValue.setEditingSupport(new PropValueEditor(tableViewer));
     }
 
     private void addManagerListeners() {
-        resourceManagerRef
-                .addResourceSelectionChangedUIListener(resourceSelectionChangedListener);
+        UiListenerHandler.getInstance().addResourceSelectionChangedUIListener(
+                resourceSelectionChangedListener);
     }
 
-    class PropertycontentProvider implements IStructuredContentProvider {
+    private static class PropertycontentProvider implements
+            IStructuredContentProvider {
 
         @Override
         public void dispose() {
@@ -185,19 +431,120 @@ public class MetaPropertiesView extends ViewPart {
         public Object[] getElements(Object element) {
             return (Object[]) element;
         }
-
     }
 
     @Override
     public void dispose() {
         // Unregister the listener
         if (null != resourceSelectionChangedListener) {
-            resourceManagerRef
-                    .removeResourceSelectionChangedUIListener(resourceSelectionChangedListener);
+            UiListenerHandler.getInstance()
+                    .removeResourceSelectionChangedUIListener(
+                            resourceSelectionChangedListener);
         }
         super.dispose();
     }
 
+    class PropValueEditor extends EditingSupport {
+
+        private final TableViewer viewer;
+
+        public PropValueEditor(TableViewer viewer) {
+            super(viewer);
+            this.viewer = viewer;
+        }
+
+        @Override
+        protected boolean canEdit(Object element) {
+            return true;
+        }
+
+        @Override
+        protected CellEditor getCellEditor(final Object element) {
+            if (!getEnableEdit()) {
+                return null;
+            }
+            String propName = ((MetaProperty) element).getPropName();
+            CellEditor editor = new TextCellEditor(viewer.getTable());
+            if (null != propName && propName.equals(Constants.INTERFACE_TYPES)) {
+                editor.setStyle(SWT.READ_ONLY);
+                final Text txt = (Text) editor.getControl();
+                txt.addModifyListener(new ModifyListener() {
+                    @Override
+                    public void modifyText(ModifyEvent e) {
+                        if (null == updatedIfSet) {
+                            return;
+                        }
+                        // Form the result set of interfaces with check-box that
+                        // will be shown in the dialog for editing.
+                        Map<String, String> curResInterfaces = new HashMap<String, String>();
+                        for (Map.Entry<String, String> entry : ifTypes
+                                .entrySet()) {
+                            if (updatedIfSet.contains(entry.getValue())) {
+                                curResInterfaces.put(entry.getKey(),
+                                        entry.getValue());
+                            }
+                        }
+
+                        // Show the dialog for editing the resource interfaces.
+                        UpdateResourceInterfaceDialog ad = new UpdateResourceInterfaceDialog(
+                                Display.getDefault().getActiveShell(),
+                                curResInterfaces, ifTypes);
+                        if (ad.open() == Window.OK) {
+                            // Update the local copy of the current resource
+                            // interfaces to keep the state for save operation.
+                            updatedIfSet.clear();
+                            StringBuilder newPropValue = new StringBuilder();
+                            for (Map.Entry<String, String> entry : curResInterfaces
+                                    .entrySet()) {
+                                if (!newPropValue.toString().isEmpty()) {
+                                    newPropValue.append(", ");
+                                }
+                                String value = ifTypes.get(entry.getKey());
+                                newPropValue.append(value);
+
+                                updatedIfSet.add(value);
+                            }
+                            // Update the model
+                            MetaProperty prop = (MetaProperty) element;
+                            prop.setPropValue(newPropValue.toString());
+                            // Update the viewer in a separate UI thread.
+                            Display.getDefault().asyncExec(new Runnable() {
+                                @Override
+                                public void run() {
+                                    viewer.refresh(element, true);
+                                }
+                            });
+                        }
+                    }
+                });
+            }
+            return editor;
+        }
+
+        @Override
+        protected Object getValue(Object element) {
+            return ((MetaProperty) element).getPropValue();
+        }
+
+        @Override
+        protected void setValue(Object element, Object value) {
+            MetaProperty prop = (MetaProperty) element;
+            if (prop.getPropName().equals(Constants.INTERFACE_TYPES)) {
+                return;
+            }
+            prop.setPropValue(String.valueOf(value));
+            viewer.update(element, null);
+        }
+    }
+
+    private synchronized Boolean getEnableEdit() {
+        return enable_edit;
+    }
+
+    private synchronized void setEnableEdit(boolean value) {
+        enable_edit = value;
+    }
+
     @Override
     public void setFocus() {
     }