2 * Copyright 2015 Samsung Electronics All Rights Reserved.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package oic.simulator.clientcontroller.view;
19 import java.util.List;
22 import oic.simulator.clientcontroller.Activator;
23 import oic.simulator.clientcontroller.listener.IFindResourceUIListener;
24 import oic.simulator.clientcontroller.manager.ResourceManager;
25 import oic.simulator.clientcontroller.remoteresource.RemoteResource;
26 import oic.simulator.clientcontroller.utils.Constants;
27 import oic.simulator.clientcontroller.view.dialogs.FindResourceWizard;
28 import oic.simulator.clientcontroller.view.dialogs.LoadRAMLDialog;
29 import oic.simulator.clientcontroller.view.dialogs.ResourceWizardDialog;
31 import org.eclipse.jface.dialogs.MessageDialog;
32 import org.eclipse.jface.viewers.ISelectionChangedListener;
33 import org.eclipse.jface.viewers.IStructuredSelection;
34 import org.eclipse.jface.viewers.ITreeContentProvider;
35 import org.eclipse.jface.viewers.LabelProvider;
36 import org.eclipse.jface.viewers.SelectionChangedEvent;
37 import org.eclipse.jface.viewers.TreeViewer;
38 import org.eclipse.jface.viewers.Viewer;
39 import org.eclipse.jface.window.Window;
40 import org.eclipse.jface.wizard.WizardDialog;
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.custom.CTabFolder;
43 import org.eclipse.swt.custom.CTabItem;
44 import org.eclipse.swt.events.MenuAdapter;
45 import org.eclipse.swt.events.MenuEvent;
46 import org.eclipse.swt.events.SelectionAdapter;
47 import org.eclipse.swt.events.SelectionEvent;
48 import org.eclipse.swt.graphics.Color;
49 import org.eclipse.swt.graphics.Image;
50 import org.eclipse.swt.layout.GridData;
51 import org.eclipse.swt.layout.GridLayout;
52 import org.eclipse.swt.widgets.Button;
53 import org.eclipse.swt.widgets.Composite;
54 import org.eclipse.swt.widgets.Display;
55 import org.eclipse.swt.widgets.Group;
56 import org.eclipse.swt.widgets.Menu;
57 import org.eclipse.swt.widgets.MenuItem;
58 import org.eclipse.swt.widgets.Tree;
59 import org.eclipse.ui.PlatformUI;
60 import org.eclipse.ui.dialogs.FilteredTree;
61 import org.eclipse.ui.dialogs.PatternFilter;
62 import org.eclipse.ui.part.ViewPart;
65 * This class manages and shows the resource manager view in the perspective.
67 public class ResourceManagerView extends ViewPart {
69 public static final String VIEW_ID = "oic.simulator.clientcontroller.view.resourcemanager";
71 private Button findResButton;
72 private Button refreshButton;
74 private TreeViewer treeViewer;
75 private TreeViewer favTreeViewer;
77 private CTabFolder folder;
78 private CTabItem foundResTab;
79 private CTabItem favResTab;
81 private ResourceManager resourceManager;
83 private IFindResourceUIListener findListener;
85 private Boolean foundResource;
87 private MessageDialog findDialog;
89 private MessageDialog refreshDialog;
91 private Thread sleepThreadHandle;
93 public ResourceManagerView() {
94 resourceManager = Activator.getDefault().getResourceManager();
96 findListener = new IFindResourceUIListener() {
99 public void onNewResourceFound(final RemoteResource resource) {
100 System.out.println("View: onNewResourceFound");
101 if (null == resource) {
104 // Changing the status of the find operation.
105 setFoundResource(true);
107 // Interrupt the sleep thread.
108 if (null != sleepThreadHandle && sleepThreadHandle.isAlive()) {
109 sleepThreadHandle.interrupt();
112 // Update the tree viewer
113 Display.getDefault().asyncExec(new Runnable() {
116 if (!treeViewer.getControl().isDisposed()) {
117 treeViewer.refresh();
120 if (!favTreeViewer.getControl().isDisposed()) {
121 favTreeViewer.refresh();
124 // Close the find dialog
125 if (null != findDialog) {
126 boolean status = findDialog.close();
128 .println("dialog close status: " + status);
131 // Close the refresh dialog
132 if (null != refreshDialog) {
133 boolean status = refreshDialog.close();
135 .println("dialog close status: " + status);
144 public void createPartControl(Composite parent) {
145 Composite compContent = new Composite(parent, SWT.NONE);
146 compContent.setLayout(new GridLayout());
147 GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
148 compContent.setLayoutData(gd);
150 Composite buttonComp = new Composite(compContent, SWT.NONE);
151 buttonComp.setLayout(new GridLayout(2, false));
154 gd.horizontalAlignment = SWT.FILL;
155 gd.grabExcessHorizontalSpace = true;
157 buttonComp.setLayoutData(gd);
159 findResButton = new Button(buttonComp, SWT.PUSH);
160 findResButton.setText("Find Resources");
161 findResButton.setToolTipText("Find OIC resources");
165 findResButton.setLayoutData(gd);
167 refreshButton = new Button(buttonComp, SWT.PUSH);
168 refreshButton.setText("Refresh");
169 refreshButton.setToolTipText("Restart the search once again");
173 refreshButton.setLayoutData(gd);
175 // Create a Tab Folder.
176 folder = new CTabFolder(compContent, SWT.BORDER);
177 gd = new GridData(SWT.FILL, SWT.FILL, true, true);
178 folder.setLayoutData(gd);
179 folder.setSimple(false);
180 folder.setUnselectedCloseVisible(false);
181 folder.setUnselectedImageVisible(false);
182 folder.addSelectionListener(new SelectionAdapter() {
184 public void widgetSelected(SelectionEvent e) {
186 * CTabItem selectedTab = folder.getSelection(); if(selectedTab
187 * == foundResTab) { System.out.println("Found resources tab");
188 * } else { System.out.println("Favorite resources tab"); }
191 treeViewer.setSelection(null);
192 favTreeViewer.setSelection(null);
193 resourceManager.resourceSelectionChanged(null);
197 createFoundResourcesArea();
199 createFavoriteResourcesArea();
201 folder.setSelection(foundResTab);
203 findDialog = new MessageDialog(Display.getDefault().getActiveShell(),
204 "Finding Servers", null,
205 "Finding the requested servers\nPlease wait...",
206 MessageDialog.INFORMATION, new String[] { "Cancel" }, 0);
207 // findDialog.setBlockOnOpen(false);
209 refreshDialog = new MessageDialog(
210 Display.getDefault().getActiveShell(),
213 "Refreshing the search and finding the requested servers once again\nPlease wait...",
214 MessageDialog.INFORMATION, new String[] { "Cancel" }, 0);
215 // refreshDialog.setBlockOnOpen(false);
219 addManagerListeners();
221 // Setting the initial visibility of refresh based on the last known
223 Set<String> prevSearchTypes = resourceManager.getLastKnownSearchTypes();
224 if (null == prevSearchTypes || prevSearchTypes.size() < 1) {
225 refreshButton.setEnabled(false);
227 refreshButton.setEnabled(true);
231 private void createFoundResourcesArea() {
232 foundResTab = new CTabItem(folder, SWT.NULL);
233 foundResTab.setText("Found Resources");
235 // Create a group to show all the discovered resources.
236 // Adding the group to the folder.
237 Group resourceGroup = new Group(folder, SWT.NONE);
238 // resourceGroup.setText("Discovered Resources");
240 Color color = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
241 resourceGroup.setBackground(color);
243 resourceGroup.setLayout(new GridLayout(1, false));
244 GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
245 resourceGroup.setLayoutData(gd);
247 PatternFilter filter = new PatternFilter();
248 FilteredTree filteredTree = new FilteredTree(resourceGroup,
249 SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE, filter, true);
250 treeViewer = filteredTree.getViewer();
251 treeViewer.getTree().setLayoutData(
252 new GridData(SWT.FILL, SWT.FILL, true, true));
253 treeViewer.setContentProvider(new TreeContentProvider());
254 treeViewer.setLabelProvider(new TreeLabelProvider());
255 treeViewer.setInput(new Object());
257 addMenuToFoundResources();
259 foundResTab.setControl(resourceGroup);
262 private void addMenuToFoundResources() {
264 if (null != treeViewer) {
265 final Tree resourceTreeHead = treeViewer.getTree();
266 if (null != resourceTreeHead) {
267 // Below code creates menu entries and shows them on right
268 // clicking a resource
269 final Menu menu = new Menu(resourceTreeHead);
270 resourceTreeHead.setMenu(menu);
271 menu.addMenuListener(new MenuAdapter() {
273 public void menuShown(MenuEvent e) {
274 // Clear existing menu items
275 MenuItem[] items = menu.getItems();
276 for (int index = 0; index < items.length; index++) {
277 items[index].dispose();
279 MenuItem uploadRAMLItem = new MenuItem(menu, SWT.NONE);
280 uploadRAMLItem.setText("Upload RAML Configuration");
282 .addSelectionListener(new SelectionAdapter() {
284 public void widgetSelected(SelectionEvent e) {
285 // Open the RAML configuration dialog if
286 // RAML file is not yet uploaded for the
287 // currently selected resource
288 RemoteResource resource = resourceManager
289 .getCurrentResourceInSelection();
290 if (null == resource) {
293 if (!resource.isConfigUploaded()) {
294 // Open the dialog in a separate
296 PlatformUI.getWorkbench()
298 .syncExec(new Thread() {
301 LoadRAMLDialog ramlDialog = new LoadRAMLDialog(
305 .open() != Window.OK) {
308 String configFilePath = ramlDialog
309 .getConfigFilePath();
310 if (null == configFilePath
317 "Invalid RAML Config path",
318 "Configuration file path is invalid.");
324 .getCurrentResourceInSelection(),
330 .openInformation(Display
334 "Configuration file for the selected resource is already uploaded");
339 RemoteResource resource = resourceManager
340 .getCurrentResourceInSelection();
341 if (null == resource) {
344 String menuText = !resource.isFavorite() ? "Add to favorites"
345 : "Remove from favorites";
346 MenuItem addToFavMenuItem = new MenuItem(menu, SWT.NONE);
347 addToFavMenuItem.setText(menuText);
349 .addSelectionListener(new SelectionAdapter() {
351 public void widgetSelected(SelectionEvent e) {
352 RemoteResource resource = (RemoteResource) ((IStructuredSelection) treeViewer
355 if (null == resource) {
358 System.out.println("Selected resource:"
359 + resource.getResourceURI());
360 if (!resource.isFavorite()) {
362 .addResourcetoFavorites(resource);
365 .removeResourceFromFavorites(resource);
367 .removeResourceURIFromFavorites(resource);
369 favTreeViewer.refresh();
378 private void createFavoriteResourcesArea() {
379 favResTab = new CTabItem(folder, SWT.NULL);
380 favResTab.setText("Favorite Resources");
382 // Create a group to show all the discovered resources.
383 // Adding the group to the folder.
384 Group resourceGroup = new Group(folder, SWT.NONE);
385 // resourceGroup.setText("Discovered Resources");
387 Color color = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
388 resourceGroup.setBackground(color);
390 resourceGroup.setLayout(new GridLayout(1, false));
391 GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
392 resourceGroup.setLayoutData(gd);
394 PatternFilter filter = new PatternFilter();
395 FilteredTree filteredTree = new FilteredTree(resourceGroup,
396 SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE, filter, true);
397 favTreeViewer = filteredTree.getViewer();
398 favTreeViewer.getTree().setLayoutData(
399 new GridData(SWT.FILL, SWT.FILL, true, true));
400 favTreeViewer.setContentProvider(new FavTreeContentProvider());
401 favTreeViewer.setLabelProvider(new TreeLabelProvider());
402 favTreeViewer.setInput(new Object());
404 favResTab.setControl(resourceGroup);
406 addMenuToFavResources();
409 private void addMenuToFavResources() {
410 if (null != favTreeViewer) {
411 final Tree resourceTreeHead = favTreeViewer.getTree();
412 if (null != resourceTreeHead) {
413 // Below code creates menu entries and shows them on right
414 // clicking a resource
415 final Menu menu = new Menu(resourceTreeHead);
416 resourceTreeHead.setMenu(menu);
417 menu.addMenuListener(new MenuAdapter() {
419 public void menuShown(MenuEvent e) {
420 // Clear existing menu items
421 MenuItem[] items = menu.getItems();
422 for (int index = 0; index < items.length; index++) {
423 items[index].dispose();
425 MenuItem addToFavMenuItem = new MenuItem(menu, SWT.NONE);
426 addToFavMenuItem.setText("Remove from favorites");
428 .addSelectionListener(new SelectionAdapter() {
430 public void widgetSelected(SelectionEvent e) {
431 RemoteResource resource = (RemoteResource) ((IStructuredSelection) favTreeViewer
434 if (null == resource) {
438 .removeResourceFromFavorites(resource);
440 .removeResourceURIFromFavorites(resource);
441 favTreeViewer.refresh();
450 private void addUIListeners() {
451 findResButton.addSelectionListener(new SelectionAdapter() {
453 public void widgetSelected(SelectionEvent e) {
454 PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
458 FindResourceWizard findWizard = new FindResourceWizard();
459 ResourceWizardDialog wizardDialog = new ResourceWizardDialog(
460 PlatformUI.getWorkbench().getDisplay()
461 .getActiveShell(), findWizard);
462 int open = wizardDialog.open();
463 if (open == WizardDialog.OK) {
464 // Setting initial value on starting the find
466 setFoundResource(false);
468 Set<String> searchTypes = findWizard
470 if (null != searchTypes) {
471 System.out.println(searchTypes);
472 // Call native method to clear existing
474 // the given search types.
475 resourceManager.deleteResources(searchTypes);
478 treeViewer.refresh();
479 favTreeViewer.refresh();
481 // Call native method to find Resources
482 boolean result = resourceManager
483 .findResourceRequest(searchTypes);
485 searchUIOperation(false);
488 .openError(Display.getDefault()
490 "Find Resource status",
491 "Operation failed due to some problems in core layer.");
494 // Store this information for refresh
497 .setLastKnownSearchTypes(searchTypes);
499 // Change the refresh visibility
500 refreshButton.setEnabled(true);
508 refreshButton.addSelectionListener(new SelectionAdapter() {
510 public void widgetSelected(SelectionEvent e) {
511 Set<String> searchTypes = resourceManager
512 .getLastKnownSearchTypes();
513 if (null == searchTypes) {
516 setFoundResource(false);
518 // Call native method to clear existing resources of the given
520 resourceManager.deleteResources(searchTypes);
523 treeViewer.refresh();
524 favTreeViewer.refresh();
526 // Call native method to find Resources
527 boolean result = resourceManager
528 .findResourceRequest(searchTypes);
530 searchUIOperation(true);
533 .openError(Display.getDefault().getActiveShell(),
534 "Find Resource status",
535 "Operation failed due to some problems in core layer.");
540 // Below code adds a listener to the tree for selection changes
541 // and notifies the resource manager
542 ISelectionChangedListener treeSelectionListener = new ISelectionChangedListener() {
545 public void selectionChanged(SelectionChangedEvent e) {
546 if (e.getSelection().isEmpty()) {
549 if (e.getSelection() instanceof IStructuredSelection) {
550 IStructuredSelection selection = (IStructuredSelection) e
552 RemoteResource resource = (RemoteResource) selection
554 if (null == resource) {
557 System.out.println("Selected resource: "
558 + resource.getResourceURI());
559 resourceManager.resourceSelectionChanged(resource);
564 treeViewer.addSelectionChangedListener(treeSelectionListener);
565 favTreeViewer.addSelectionChangedListener(treeSelectionListener);
568 // If refresh is true, then Refresh Dialog else Find Dialog will be shown.
569 private void searchUIOperation(boolean refresh) {
570 final MessageDialog targetDialog;
572 targetDialog = refreshDialog;
574 targetDialog = findDialog;
576 // Open the dialog in a new thread.
577 PlatformUI.getWorkbench().getDisplay().syncExec(new Thread() {
581 if (isFoundResource()) {
582 setFoundResource(false);
586 PlatformUI.getWorkbench().getDisplay().asyncExec(new Thread() {
589 targetDialog.open(); // This method returns once the
590 // cancel button is pressed.
592 // Interrupt the sleep thread.
593 if (null != sleepThreadHandle
594 && sleepThreadHandle.isAlive()) {
595 sleepThreadHandle.interrupt();
598 // Set the status of find.
599 setFoundResource(false);
603 // Thread for find time-out.
604 sleepThreadHandle = new Thread() {
609 Thread.sleep(Constants.FIND_RESOURCES_TIMEOUT * 1000);
610 } catch (InterruptedException e) {
611 System.out.println("Interrupted during sleep.");
615 child = new Thread() {
618 if (null != targetDialog) {
619 targetDialog.close();
621 // Check if any new resources are
623 // Is no new resources, then display a
625 if (!isFoundResource()) {
631 "No servers are available as of now.\n"
632 + "Please check the servers' status and press"
633 + "'Refresh' button to restart the search.");
635 // Resetting the status to false for
637 setFoundResource(false);
643 PlatformUI.getWorkbench().getDisplay().syncExec(child);
646 sleepThreadHandle.start();
651 private void addManagerListeners() {
652 resourceManager.addFindresourceUIListener(findListener);
656 public void dispose() {
657 // Unregister the listener
658 if (null != findListener) {
659 resourceManager.removeFindresourceUIListener(findListener);
660 resourceManager.resourceSelectionChanged(null);
666 public void setFocus() {
667 // TODO Auto-generated method stub
671 public synchronized void setFoundResource(boolean value) {
672 foundResource = value;
675 public synchronized boolean isFoundResource() {
676 return foundResource;
680 class TreeContentProvider implements ITreeContentProvider {
683 public void dispose() {
687 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
692 public Object[] getChildren(Object parent) {
697 public Object[] getElements(Object parent) {
698 System.out.println("Inside getElements()");
699 List<RemoteResource> resourceList = Activator.getDefault()
700 .getResourceManager().getResourceList();
701 return resourceList.toArray();
705 public Object getParent(Object child) {
710 public boolean hasChildren(Object parent) {
716 class FavTreeContentProvider implements ITreeContentProvider {
719 public void dispose() {
723 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
728 public Object[] getChildren(Object parent) {
733 public Object[] getElements(Object parent) {
734 System.out.println("Inside getElements()");
735 List<RemoteResource> resourceList = Activator.getDefault()
736 .getResourceManager().getFavResourceList();
737 return resourceList.toArray();
741 public Object getParent(Object child) {
746 public boolean hasChildren(Object parent) {
752 class TreeLabelProvider extends LabelProvider {
754 public String getText(Object element) {
755 RemoteResource resource = (RemoteResource) element;
756 return resource.getResourceURI();
760 public Image getImage(Object element) {
761 RemoteResource resource = (RemoteResource) element;
762 ResourceManager resourceManager = Activator.getDefault()
763 .getResourceManager();
764 return resourceManager.getImage(resource.getResourceURI());