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.serviceprovider.manager;
19 import org.eclipse.core.runtime.IProgressMonitor;
20 import org.eclipse.swt.widgets.Display;
22 import java.text.NumberFormat;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.Date;
26 import java.util.HashSet;
27 import java.util.Iterator;
28 import java.util.LinkedList;
29 import java.util.List;
32 import java.util.Vector;
34 import org.oic.simulator.ArrayProperty;
35 import org.oic.simulator.AttributeProperty;
36 import org.oic.simulator.AttributeProperty.Type;
37 import org.oic.simulator.AttributeValue;
38 import org.oic.simulator.AttributeValue.TypeInfo;
39 import org.oic.simulator.AttributeValue.ValueType;
40 import org.oic.simulator.BooleanProperty;
41 import org.oic.simulator.DeviceInfo;
42 import org.oic.simulator.DeviceListener;
43 import org.oic.simulator.DoubleProperty;
44 import org.oic.simulator.ILogger.Level;
45 import org.oic.simulator.IntegerProperty;
46 import org.oic.simulator.PlatformInfo;
47 import org.oic.simulator.SimulatorException;
48 import org.oic.simulator.SimulatorManager;
49 import org.oic.simulator.SimulatorResourceAttribute;
50 import org.oic.simulator.SimulatorResourceModel;
51 import org.oic.simulator.StringProperty;
52 import org.oic.simulator.server.Observer;
53 import org.oic.simulator.server.SimulatorResource;
54 import org.oic.simulator.server.SimulatorResource.AutoUpdateListener;
55 import org.oic.simulator.server.SimulatorResource.AutoUpdateType;
56 import org.oic.simulator.server.SimulatorResource.ObserverListener;
57 import org.oic.simulator.server.SimulatorResource.ResourceModelChangeListener;
58 import org.oic.simulator.server.SimulatorSingleResource;
60 import oic.simulator.serviceprovider.Activator;
61 import oic.simulator.serviceprovider.model.AttributeElement;
62 import oic.simulator.serviceprovider.model.MetaProperty;
63 import oic.simulator.serviceprovider.model.Resource;
64 import oic.simulator.serviceprovider.model.ResourceType;
65 import oic.simulator.serviceprovider.model.SingleResource;
66 import oic.simulator.serviceprovider.utils.AttributeValueStringConverter;
67 import oic.simulator.serviceprovider.utils.Constants;
68 import oic.simulator.serviceprovider.utils.Utility;
71 * This class acts as an interface between the simulator java SDK and the
72 * various UI modules. It maintains all the details of resources and provides
73 * other UI modules with the information required. It also handles model change,
74 * automation, and observer related events from native layer and propagates
75 * those events to the registered UI listeners.
77 public class ResourceManager {
81 private Resource currentResourceInSelection;
83 private ResourceModelChangeListener resourceModelChangeListener;
85 private AutoUpdateListener automationListener;
87 private ObserverListener observer;
89 private DeviceListener deviceListener;
91 private NotificationSynchronizerThread synchronizerThread;
93 private Thread threadHandle;
95 private DeviceInfo deviceInfo;
96 private PlatformInfo platformInfo;
98 private String deviceName;
100 public ResourceManager() {
103 deviceListener = new DeviceListener() {
106 public void onDeviceFound(final String host,
107 final DeviceInfo deviceInfo) {
108 if (null != ResourceManager.this.deviceInfo
109 || null == deviceInfo || null == host) {
112 synchronizerThread.addToQueue(new Runnable() {
115 String rcvdDeviceName = deviceInfo.getName();
116 if (null == rcvdDeviceName) {
119 if (deviceName.equalsIgnoreCase(rcvdDeviceName)) {
120 ResourceManager.this.deviceInfo = deviceInfo;
122 // Notify the UI Listeners
123 UiListenerHandler.getInstance()
124 .deviceInfoReceivedNotification();
131 resourceModelChangeListener = new ResourceModelChangeListener() {
134 public void onResourceModelChanged(final String resourceURI,
135 final SimulatorResourceModel resourceModelN) {
136 synchronizerThread.addToQueue(new Runnable() {
140 if (null == resourceURI || null == resourceModelN) {
144 Display.getDefault().asyncExec(new Runnable() {
147 Resource resource = data
148 .getResourceByURI(resourceURI);
149 if (null != resource) {
151 resource.updateResourceRepresentation(resourceModelN);
152 } catch (NumberFormatException e) {
156 .log(Level.ERROR.ordinal(),
158 "Error while trying to update the attributes.\n"
160 .getSimulatorErrorString(
172 automationListener = new AutoUpdateListener() {
175 public void onUpdateComplete(final String resourceURI,
176 final int automationId) {
177 synchronizerThread.addToQueue(new Runnable() {
181 SingleResource resource = data
182 .getSingleResourceByURI(resourceURI);
183 if (null == resource) {
186 // Checking whether this notification is for an
187 // attribute or a resource
188 if (resource.isResourceAutomationInProgress()) {
189 changeResourceLevelAutomationStatus(resource, false);
190 // Notify the UI listeners
191 UiListenerHandler.getInstance()
192 .automationCompleteUINotification(resource,
194 } else if (resource.isAttributeAutomationInProgress()) {
195 // Find the attribute with the given automation id
196 final AttributeElement attribute = getAttributeWithGivenAutomationId(
197 resource, automationId);
198 if (null != attribute) {
199 attribute.setAutoUpdateState(false);
200 resource.setAttributeAutomationInProgress(isAnyAttributeInAutomation(resource));
202 // Setting the attribute automation status to
204 resource.setAttributeAutomationInProgress(false);
212 observer = new ObserverListener() {
214 public void onObserverChanged(final String resourceURI,
215 final int status, final Observer observer) {
219 if (null == resourceURI || null == observer) {
222 Resource resource = data.getResourceByURI(resourceURI);
223 if (null == resource) {
226 // Update the observers information
228 resource.addObserverInfo(observer);
230 resource.removeObserverInfo(observer);
232 // Notify the UI listeners
233 UiListenerHandler.getInstance()
234 .observerListChangedUINotification(resource);
240 public void onObserverAdded(String resourceURI, Observer observer) {
241 onObserverChanged(resourceURI, 0, observer);
245 public void onObserverRemoved(String resourceURI, Observer observer) {
246 onObserverChanged(resourceURI, 1, observer);
250 synchronizerThread = new NotificationSynchronizerThread();
251 threadHandle = new Thread(synchronizerThread);
252 threadHandle.setName("Simulator service provider event queue");
253 threadHandle.start();
255 // Set the default device name.
256 deviceName = "IoTivity Simulator";
258 SimulatorManager.setDeviceInfo(deviceName);
259 } catch (SimulatorException e) {
263 .log(Level.ERROR.ordinal(),
265 "Error while registering the device info.\n"
266 + Utility.getSimulatorErrorString(e, null));
269 // Set the default platform information.
270 platformInfo = new PlatformInfo();
271 platformInfo.setPlatformID("Samsung Platform Identifier");
272 platformInfo.setManufacturerName("Samsung");
273 platformInfo.setManufacturerUrl("www.samsung.com");
274 platformInfo.setModelNumber("Samsung Model Num01");
275 platformInfo.setDateOfManufacture("2015-09-10T11:10:30Z");
276 platformInfo.setPlatformVersion("PlatformVersion01");
277 platformInfo.setOperationSystemVersion("OSVersion01");
278 platformInfo.setHardwareVersion("HardwareVersion01");
279 platformInfo.setFirmwareVersion("FirwareVersion01");
280 platformInfo.setSupportUrl("http://www.samsung.com/support");
281 platformInfo.setSystemTime("2015-09-10T11:10:30Z");
283 SimulatorManager.setPlatformInfo(platformInfo);
284 } catch (SimulatorException e) {
288 .log(Level.ERROR.ordinal(),
290 "Error while registering the platform info.\n"
291 + Utility.getSimulatorErrorString(e, null));
294 // Get the device information to show other details of the device in UI.
296 SimulatorManager.findDevices("", deviceListener);
297 } catch (SimulatorException e) {
301 .log(Level.ERROR.ordinal(),
303 "Failed to get the local device information.\n"
304 + Utility.getSimulatorErrorString(e, null));
308 private static class NotificationSynchronizerThread implements Runnable {
310 LinkedList<Runnable> notificationQueue = new LinkedList<Runnable>();
314 while (!Thread.interrupted()) {
315 synchronized (this) {
317 while (notificationQueue.isEmpty()) {
321 } catch (InterruptedException e) {
327 synchronized (this) {
328 thread = notificationQueue.pop();
332 } catch (Exception e) {
333 if (e instanceof InterruptedException) {
341 public void addToQueue(Runnable event) {
342 synchronized (this) {
343 notificationQueue.add(event);
349 public void setDeviceInfo(List<MetaProperty> metaProperties) {
350 if (null == metaProperties || metaProperties.size() < 1) {
353 Iterator<MetaProperty> itr = metaProperties.iterator();
357 boolean found = false;
358 while (itr.hasNext()) {
360 propName = prop.getPropName();
361 propValue = prop.getPropValue();
362 if (propName.equals(Constants.DEVICE_NAME)) {
363 this.deviceName = propValue;
374 SimulatorManager.setDeviceInfo(deviceName);
375 } catch (SimulatorException e) {
379 .log(Level.ERROR.ordinal(),
381 "Error while registering the device info.\n"
382 + Utility.getSimulatorErrorString(e, null));
386 public boolean isDeviceInfoValid(List<MetaProperty> metaProperties) {
387 if (null == metaProperties || metaProperties.size() < 1) {
391 Iterator<MetaProperty> itr = metaProperties.iterator();
395 while (itr.hasNext()) {
397 propName = prop.getPropName();
398 propValue = prop.getPropValue();
399 if (propName.equals(Constants.DEVICE_NAME)) {
400 if (null == propValue || propValue.length() < 1) {
409 public List<MetaProperty> getDeviceInfo() {
410 List<MetaProperty> metaProperties = new ArrayList<MetaProperty>();
411 metaProperties.add(new MetaProperty(Constants.DEVICE_NAME, deviceName));
412 if (null != deviceInfo) {
413 metaProperties.add(new MetaProperty(Constants.DEVICE_ID, deviceInfo
415 metaProperties.add(new MetaProperty(Constants.DEVICE_SPEC_VERSION,
416 deviceInfo.getSpecVersion()));
417 metaProperties.add(new MetaProperty(Constants.DEVICE_DMV,
418 deviceInfo.getDataModelVersion()));
420 return metaProperties;
423 public List<MetaProperty> getPlatformInfo() {
424 List<MetaProperty> metaProperties = new ArrayList<MetaProperty>();
425 metaProperties.add(new MetaProperty(Constants.PLATFORM_ID, platformInfo
427 metaProperties.add(new MetaProperty(Constants.PLATFORM_MANUFAC_NAME,
428 platformInfo.getManufacturerName()));
429 metaProperties.add(new MetaProperty(Constants.PLATFORM_MANUFAC_URL,
430 platformInfo.getManufacturerUrl()));
431 metaProperties.add(new MetaProperty(Constants.PLATFORM_MODEL_NO,
432 platformInfo.getModelNumber()));
433 metaProperties.add(new MetaProperty(Constants.PLATFORM_DATE_OF_MANUFAC,
434 platformInfo.getDateOfManufacture()));
435 metaProperties.add(new MetaProperty(Constants.PLATFORM_VERSION,
436 platformInfo.getPlatformVersion()));
437 metaProperties.add(new MetaProperty(Constants.PLATFORM_OS_VERSION,
438 platformInfo.getOperationSystemVersion()));
439 metaProperties.add(new MetaProperty(
440 Constants.PLATFORM_HARDWARE_VERSION, platformInfo
441 .getHardwareVersion()));
442 metaProperties.add(new MetaProperty(
443 Constants.PLATFORM_FIRMWARE_VERSION, platformInfo
444 .getFirmwareVersion()));
445 metaProperties.add(new MetaProperty(Constants.PLATFORM_SUPPORT_URL,
446 platformInfo.getSupportUrl()));
447 metaProperties.add(new MetaProperty(Constants.PLATFORM_SYSTEM_TIME,
448 platformInfo.getSystemTime()));
449 return metaProperties;
452 public void setPlatformInfo(List<MetaProperty> metaProperties) {
453 if (null == metaProperties || metaProperties.size() < 1) {
456 Iterator<MetaProperty> itr = metaProperties.iterator();
460 while (itr.hasNext()) {
462 propName = prop.getPropName();
463 propValue = prop.getPropValue();
464 if (propName.equals(Constants.PLATFORM_ID)) {
465 platformInfo.setPlatformID(propValue);
466 } else if (propName.equals(Constants.PLATFORM_MANUFAC_NAME)) {
467 platformInfo.setManufacturerName(propValue);
468 } else if (propName.equals(Constants.PLATFORM_MANUFAC_URL)) {
469 platformInfo.setManufacturerUrl(propValue);
470 } else if (propName.equals(Constants.PLATFORM_MODEL_NO)) {
471 platformInfo.setModelNumber(propValue);
472 } else if (propName.equals(Constants.PLATFORM_DATE_OF_MANUFAC)) {
473 platformInfo.setDateOfManufacture(propValue);
474 } else if (propName.equals(Constants.PLATFORM_VERSION)) {
475 platformInfo.setPlatformVersion(propValue);
476 } else if (propName.equals(Constants.PLATFORM_OS_VERSION)) {
477 platformInfo.setOperationSystemVersion(propValue);
478 } else if (propName.equals(Constants.PLATFORM_HARDWARE_VERSION)) {
479 platformInfo.setHardwareVersion(propValue);
480 } else if (propName.equals(Constants.PLATFORM_FIRMWARE_VERSION)) {
481 platformInfo.setFirmwareVersion(propValue);
482 } else if (propName.equals(Constants.PLATFORM_SUPPORT_URL)) {
483 platformInfo.setSupportUrl(propValue);
484 } else if (propName.equals(Constants.PLATFORM_SYSTEM_TIME)) {
485 platformInfo.setSystemTime(propValue);
489 SimulatorManager.setPlatformInfo(platformInfo);
490 } catch (SimulatorException e) {
494 .log(Level.ERROR.ordinal(),
496 "Error while registering the platform info.\n"
497 + Utility.getSimulatorErrorString(e, null));
501 public boolean isPlatformInfoValid(List<MetaProperty> metaProperties) {
502 if (null == metaProperties || metaProperties.size() < 1) {
505 Iterator<MetaProperty> itr = metaProperties.iterator();
508 while (itr.hasNext()) {
510 propValue = prop.getPropValue();
511 if (null == propValue || propValue.length() < 1) {
518 public synchronized Resource getCurrentResourceInSelection() {
519 return currentResourceInSelection;
522 public synchronized void setCurrentResourceInSelection(Resource resource) {
523 this.currentResourceInSelection = resource;
526 public boolean isResourceExist(String resourceURI) {
527 return data.isResourceExist(resourceURI);
530 public boolean isAnyResourceExist() {
531 return data.isAnyResourceExist();
534 public boolean createSingleResource(SingleResource resource,
535 Map<String, SimulatorResourceAttribute> attributes)
536 throws SimulatorException {
537 if (null == resource) {
542 // Create the resource.
543 SimulatorResource jSimulatorResource = SimulatorManager
544 .createResource(SimulatorResource.Type.SINGLE,
545 resource.getResourceName(),
546 resource.getResourceURI(),
547 resource.getResourceType());
548 if (null == jSimulatorResource
549 || !(jSimulatorResource instanceof SimulatorSingleResource)) {
552 SimulatorSingleResource jSimulatorSingleResource = (SimulatorSingleResource) jSimulatorResource;
553 resource.setSimulatorResource(jSimulatorSingleResource);
555 // Cancel discoverable property if requested by user.
556 if (!resource.isDiscoverable()) {
557 jSimulatorSingleResource.setDiscoverable(false);
560 // Cancel observable property if requested by user.
561 if (!resource.isObservable()) {
562 jSimulatorSingleResource.setObservable(false);
565 // Set the model change listener.
566 jSimulatorSingleResource
567 .setResourceModelChangeListener(resourceModelChangeListener);
569 // Set the observer listener if the resource is observable.
570 if (resource.isObservable()) {
571 jSimulatorSingleResource.setObserverListener(observer);
575 if (null != attributes && !attributes.isEmpty()) {
576 SimulatorResourceAttribute value;
577 for (Map.Entry<String, SimulatorResourceAttribute> entry : attributes
579 value = entry.getValue();
581 jSimulatorSingleResource.addAttribute(value);
584 // Get the resource model java object reference.
585 resource.setResourceModel(jSimulatorSingleResource
586 .getResourceModel());
588 resource.createResourceRepresentation(jSimulatorSingleResource
592 // Set the resource interfaces.
593 Set<String> interfaces = resource.getResourceInterfaces();
594 if (null != interfaces && !interfaces.isEmpty()) {
595 jSimulatorSingleResource.setInterface(Utility
596 .convertSetToVectorString(resource
597 .getResourceInterfaces()));
600 // Register the resource with the platform.
601 jSimulatorSingleResource.start();
603 // Read the interfaces from the native layer and set it to the
605 resource.setResourceInterfaces(Utility
606 .convertVectorToSet(jSimulatorSingleResource.getInterface()));
608 resource.setStarted(true);
609 } catch (SimulatorException e) {
613 .log(Level.ERROR.ordinal(), new Date(),
614 Utility.getSimulatorErrorString(e, null));
618 // Add to local cache.
619 data.addResource(resource);
621 // Update UI listeners
622 UiListenerHandler.getInstance().resourceCreatedUINotification(
623 ResourceType.SINGLE);
628 .log(Level.INFO.ordinal(), new Date(),
629 "Resource created [" + resource.getResourceURI() + "].");
634 public Resource createResourceByRAML(String configFilePath)
635 throws SimulatorException {
636 SimulatorResource jSimulatorResource;
638 // Create the resource
639 jSimulatorResource = SimulatorManager
640 .createResource(configFilePath);
641 if (null == jSimulatorResource) {
644 } catch (SimulatorException e) {
648 .log(Level.ERROR.ordinal(), new Date(),
649 Utility.getSimulatorErrorString(e, null));
653 if (!(jSimulatorResource instanceof SimulatorSingleResource)) {
657 Resource resource = new SingleResource();
658 resource.setSimulatorResource(jSimulatorResource);
660 // Fetch and locally store the resource name and uri.
661 String uri = jSimulatorResource.getURI();
662 if (null == uri || uri.trim().isEmpty()) {
665 resource.setResourceURI(uri.trim());
667 String name = jSimulatorResource.getName();
668 if (null == name || name.trim().isEmpty()) {
672 resource.setResourceName(name.trim());
678 * This method can set/change the resource uri and name of an already
679 * created resource which is not yet registered with the platform. This
680 * method registers the model change and observer listeners, registers the
681 * resource, fetches the resource attributes, updates the local cache and
682 * notifies the UI listeners.
684 public boolean completeSingleResourceCreationByRAML(Resource resource,
685 String uri, String name, boolean multiInstance)
686 throws SimulatorException {
687 if (null == resource || !(resource instanceof SingleResource)) {
691 SingleResource singleRes = (SingleResource) resource;
693 SimulatorSingleResource jSimulatorSingleResource = (SimulatorSingleResource) resource
694 .getSimulatorResource();
695 if (null == jSimulatorSingleResource) {
699 // Update resource URI and Name if they are changed.
700 String newUri = uri.trim();
701 String newName = name.trim();
704 singleRes.setResourceURI(newUri);
705 singleRes.setResourceName(newName);
707 if (!singleRes.getResourceURI().equals(newUri)) {
708 jSimulatorSingleResource.setURI(newUri);
709 singleRes.setResourceURI(newUri);
711 if (!singleRes.getResourceName().equals(newName)) {
712 jSimulatorSingleResource.setName(newName);
713 singleRes.setResourceName(newName);
717 // Set the model change listener.
718 jSimulatorSingleResource
719 .setResourceModelChangeListener(resourceModelChangeListener);
721 // Set the observer listener if the resource is observable.
722 if (jSimulatorSingleResource.isObservable()) {
723 jSimulatorSingleResource.setObserverListener(observer);
724 singleRes.setObservable(true);
727 // Fetch the resource model.
728 SimulatorResourceModel jResModel = jSimulatorSingleResource
730 if (null == jResModel) {
733 singleRes.setResourceModel(jResModel);
735 // Fetch the basic details of the resource.
736 singleRes.setResourceType(jSimulatorSingleResource
739 .setResourceInterfaces(Utility
740 .convertVectorToSet(jSimulatorSingleResource
743 // Fetch the resource attributes.
744 singleRes.createResourceRepresentation(jSimulatorSingleResource
747 // Register the resource with the platform.
748 jSimulatorSingleResource.start();
749 singleRes.setStarted(true);
751 // Add to local cache.
752 data.addResource(singleRes);
754 // Update UI listeners for single instance creation
756 UiListenerHandler.getInstance().resourceCreatedUINotification(
757 ResourceType.SINGLE);
758 } catch (Exception e) {
762 .log(Level.ERROR.ordinal(), new Date(),
763 Utility.getSimulatorErrorString(e, null));
770 .log(Level.INFO.ordinal(), new Date(),
771 "Resource created [" + resource.getResourceURI() + "].");
775 public Set<SingleResource> createSingleResourceMultiInstances(
776 String configFile, int count, IProgressMonitor progressMonitor)
777 throws SimulatorException {
778 Set<SingleResource> resultSet;
780 resultSet = new HashSet<SingleResource>();
781 Vector<SimulatorResource> jSimulatorResources = SimulatorManager
782 .createResource(configFile, count);
783 if (null == jSimulatorResources || jSimulatorResources.size() < 1) {
786 SimulatorSingleResource jResource;
787 SingleResource resource;
789 for (SimulatorResource jSimulatorResource : jSimulatorResources) {
790 // If the resource creation progress is canceled, then stop the
791 // creation and stop/delete
792 // the resources created already.
793 if (progressMonitor.isCanceled()) {
794 removeSingleResources(resultSet);
797 jResource = (SimulatorSingleResource) jSimulatorResource;
798 resource = new SingleResource();
799 resource.setSimulatorResource(jResource);
801 result = completeSingleResourceCreationByRAML(resource,
802 jResource.getURI(), jResource.getName(), true);
804 resultSet.add(resource);
806 } catch (SimulatorException eInner) {
810 .log(Level.ERROR.ordinal(),
812 Utility.getSimulatorErrorString(eInner,
815 progressMonitor.worked(1);
817 } catch (SimulatorException eOuter) {
821 .log(Level.ERROR.ordinal(), new Date(),
822 Utility.getSimulatorErrorString(eOuter, null));
828 public List<Resource> getResourceList() {
829 List<Resource> resourceList = data.getResources();
830 if (null == resourceList) {
834 Collections.sort(resourceList, Utility.resourceComparator);
839 public List<SingleResource> getSingleResourceList() {
840 List<SingleResource> resourceList = data.getSingleResources();
841 if (null == resourceList) {
845 Collections.sort(resourceList, Utility.singleResourceComparator);
850 public void removeSingleResources(Set<SingleResource> resources)
851 throws SimulatorException {
852 if (null == resources) {
855 Iterator<SingleResource> itr = resources.iterator();
856 while (itr.hasNext()) {
857 removeResource(itr.next());
861 public void removeResource(Resource res) throws SimulatorException {
862 // Unregister the resource from the platform.
863 SimulatorResource simRes = res.getSimulatorResource();
866 } catch (SimulatorException e) {
870 .log(Level.ERROR.ordinal(), new Date(),
871 Utility.getSimulatorErrorString(e, null));
875 // Delete this resource
876 data.deleteResource(res);
881 .log(Level.INFO.ordinal(), new Date(),
882 "Resource deleted [" + res.getResourceURI() + "].");
885 public boolean isUriUnique(List<MetaProperty> properties) {
886 if (null == properties) {
890 Iterator<MetaProperty> itr = properties.iterator();
891 while (itr.hasNext()) {
893 if (prop.getPropName().equals(Constants.RESOURCE_URI)) {
894 String uri = prop.getPropValue();
895 return !data.isResourceExist(uri);
901 public void resourceSelectionChanged(final Resource selectedResource) {
905 if (null != selectedResource) {
906 setCurrentResourceInSelection(selectedResource);
908 setCurrentResourceInSelection(null);
910 // Notify all observers for resource selection change event
911 UiListenerHandler.getInstance()
912 .resourceSelectionChangedUINotification(
918 public List<MetaProperty> getMetaProperties(Resource resource) {
919 if (null != resource) {
921 StringBuilder propValue;
922 List<MetaProperty> metaPropertyList = new ArrayList<MetaProperty>();
924 for (int index = 0; index < Constants.META_PROPERTY_COUNT; index++) {
925 propName = Constants.META_PROPERTIES[index];
926 propValue = new StringBuilder();
927 if (propName.equals(Constants.RESOURCE_NAME)) {
928 propValue.append(resource.getResourceName());
929 } else if (propName.equals(Constants.RESOURCE_URI)) {
930 propValue.append(resource.getResourceURI());
931 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
932 propValue.append(resource.getResourceType());
933 } else if (propName.equals(Constants.INTERFACE_TYPES)) {
934 Set<String> ifTypes = resource.getResourceInterfaces();
935 if (null != ifTypes && !ifTypes.isEmpty()) {
936 Iterator<String> itr = ifTypes.iterator();
937 while (itr.hasNext()) {
938 propValue.append(itr.next());
940 propValue.append(", ");
949 if (null != propValue) {
950 metaPropertyList.add(new MetaProperty(propName, propValue
954 return metaPropertyList;
959 public boolean startResource(Resource resource) throws SimulatorException {
960 if (null == resource) {
963 SimulatorResource server = resource.getSimulatorResource();
964 if (null == server) {
969 resource.setStarted(true);
970 } catch (SimulatorException e) {
974 .log(Level.ERROR.ordinal(),
976 "There is an error while starting the resource.\n"
977 + Utility.getSimulatorErrorString(e, null));
983 public boolean stopResource(Resource resource) throws SimulatorException {
984 if (null == resource) {
987 SimulatorResource server = resource.getSimulatorResource();
988 if (null == server) {
993 resource.setStarted(false);
994 } catch (SimulatorException e) {
998 .log(Level.ERROR.ordinal(),
1000 "There is an error while stopping the resource.\n"
1001 + Utility.getSimulatorErrorString(e, null));
1007 public boolean changeResourceName(Resource resource, String newName)
1008 throws SimulatorException {
1009 if (null == resource || null == newName) {
1013 if (!stopResource(resource)) {
1017 SimulatorResource server = resource.getSimulatorResource();
1019 server.setName(newName);
1020 resource.setResourceName(newName);
1021 } catch (SimulatorException e) {
1025 .log(Level.ERROR.ordinal(),
1027 "There is an error while changing the resource name.\n"
1028 + Utility.getSimulatorErrorString(e, null));
1032 if (!startResource(resource)) {
1039 public boolean changeResourceURI(Resource resource, String newURI)
1040 throws SimulatorException {
1041 if (null == resource || null == newURI) {
1045 if (!stopResource(resource)) {
1049 String curURI = resource.getResourceURI();
1050 setResourceURI(resource, newURI);
1053 if (!startResource(resource)) {
1056 } catch (SimulatorException e) {
1057 setResourceURI(resource, curURI);
1063 public boolean changeResourceType(Resource resource, String newResourceType)
1064 throws SimulatorException {
1065 if (null == resource || null == newResourceType) {
1069 if (!stopResource(resource)) {
1073 String curResourceType = resource.getResourceType();
1074 setResourceType(resource, newResourceType);
1077 if (!startResource(resource)) {
1080 } catch (SimulatorException e) {
1081 setResourceType(resource, curResourceType);
1087 public void setResourceURI(Resource resource, String newURI)
1088 throws SimulatorException {
1089 String curURI = resource.getResourceURI();
1090 SimulatorResource server = resource.getSimulatorResource();
1092 server.setURI(newURI);
1093 data.changeResourceURI(resource, curURI, newURI);
1094 } catch (SimulatorException e) {
1098 .log(Level.ERROR.ordinal(),
1100 "There is an error while changing the resource URI.\n"
1101 + Utility.getSimulatorErrorString(e, null));
1106 public void setResourceType(Resource resource, String newResourceType)
1107 throws SimulatorException {
1108 SimulatorResource server = resource.getSimulatorResource();
1110 server.setResourceType(newResourceType);
1111 resource.setResourceType(newResourceType);
1112 } catch (SimulatorException e) {
1116 .log(Level.ERROR.ordinal(),
1118 "There is an error while changing the resource Type.\n"
1119 + Utility.getSimulatorErrorString(e, null));
1124 public boolean updateResourceProperties(Resource resource,
1125 List<MetaProperty> properties, boolean uriChanged,
1126 boolean nameChanged, boolean resTypeChanged)
1127 throws SimulatorException {
1128 if (null == resource || null == properties) {
1132 // Updating the properties
1133 Iterator<MetaProperty> itr = properties.iterator();
1134 MetaProperty property;
1137 String resName = null;
1138 String resURI = null;
1139 String resType = null;
1140 while (itr.hasNext()) {
1141 property = itr.next();
1142 if (null == property) {
1145 propName = property.getPropName();
1146 propValue = property.getPropValue();
1147 if (propName.equals(Constants.RESOURCE_NAME)) {
1148 resName = propValue;
1149 } else if (propName.equals(Constants.RESOURCE_URI)) {
1151 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
1152 resType = propValue;
1157 if (!changeResourceName(resource, resName)) {
1161 // Notify UI Listeners
1162 UiListenerHandler.getInstance().propertiesChangedUINotification(
1167 if (!changeResourceURI(resource, resURI)) {
1172 if (resTypeChanged) {
1173 if (!changeResourceType(resource, resType)) {
1181 public boolean updateResourceInterfaces(Resource resource,
1182 Set<String> newIfSet) throws SimulatorException {
1183 if (null == resource || null == newIfSet || newIfSet.isEmpty()) {
1187 SimulatorResource jResource = resource.getSimulatorResource();
1188 if (null == jResource) {
1192 Set<String> curIfSet = resource.getResourceInterfaces();
1193 if (null == curIfSet || curIfSet.isEmpty()) {
1197 Iterator<String> itr = curIfSet.iterator();
1198 String interfaceType;
1199 boolean resourceRestartRequired = false;
1200 while (itr.hasNext()) {
1201 interfaceType = itr.next();
1202 if (!newIfSet.contains(interfaceType)) {
1203 resourceRestartRequired = true;
1209 // As there is no support from native layer for interface removal,
1210 // supporting it from the simulator requires restarting the resource
1211 // if any existing interfaces are removed.
1213 if (resourceRestartRequired) {
1214 stopResource(resource);
1215 jResource.setInterface(Utility
1216 .convertSetToVectorString(newIfSet));
1217 startResource(resource);
1219 // Existing interfaces are not removed.
1220 itr = newIfSet.iterator();
1221 while (itr.hasNext()) {
1222 interfaceType = itr.next();
1223 if (!curIfSet.contains(interfaceType)) {
1224 jResource.addInterface(interfaceType);
1228 } catch (SimulatorException e) {
1232 .log(Level.ERROR.ordinal(),
1234 "There is an error while changing the interface types."
1235 + Utility.getSimulatorErrorString(e, null));
1239 // Set the resource interfaces.
1240 resource.setResourceInterfaces(newIfSet);
1245 public boolean attributeValueUpdated(SingleResource resource,
1246 String attributeName, AttributeValue value) {
1247 if (null != resource && null != attributeName && null != value) {
1248 SimulatorSingleResource simRes = (SimulatorSingleResource) resource
1249 .getSimulatorResource();
1250 if (null != simRes) {
1252 simRes.updateAttribute(attributeName, value);
1254 } catch (SimulatorException e) {
1258 .log(Level.ERROR.ordinal(), new Date(),
1259 Utility.getSimulatorErrorString(e, null));
1266 public boolean isResourceStarted(Resource resource) {
1267 if (null == resource) {
1270 return resource.isStarted();
1273 public boolean isPropertyValueInvalid(Resource resource,
1274 List<MetaProperty> properties, String propName) {
1275 if (null == resource || null == properties || null == propName) {
1278 boolean invalid = false;
1280 Iterator<MetaProperty> itr = properties.iterator();
1281 while (itr.hasNext()) {
1283 if (prop.getPropName().equals(propName)) {
1284 String value = prop.getPropValue();
1285 if (propName.equals(Constants.RESOURCE_URI)) {
1286 if (!Utility.isUriValid(value)) {
1289 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
1290 if (!Utility.isResourceTypeValid(value)) {
1294 if (null == value || value.trim().isEmpty()) {
1303 public boolean isPropValueChanged(Resource resource,
1304 List<MetaProperty> properties, String propName) {
1305 if (null == resource || null == properties || null == propName) {
1308 boolean changed = false;
1311 Iterator<MetaProperty> itr = properties.iterator();
1312 while (itr.hasNext()) {
1314 if (prop.getPropName().equals(propName)) {
1315 oldValue = getPropertyValueFromResource(resource, propName);
1316 if (null != oldValue && !prop.getPropValue().equals(oldValue)) {
1325 private String getPropertyValueFromResource(Resource resource,
1327 if (null == resource || null == propName) {
1330 if (propName.equals(Constants.RESOURCE_URI)) {
1331 return resource.getResourceURI();
1332 } else if (propName.equals(Constants.RESOURCE_NAME)) {
1333 return resource.getResourceName();
1334 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
1335 return resource.getResourceType();
1341 public boolean isAttHasRangeOrAllowedValues(SimulatorResourceAttribute att) {
1345 AttributeProperty prop = att.property();
1350 if (prop.getType() == Type.INTEGER) {
1351 IntegerProperty intProperty = prop.asInteger();
1352 if (null != intProperty) {
1353 return (intProperty.hasRange() || intProperty.hasValues());
1357 } else if (prop.getType() == Type.DOUBLE) {
1358 DoubleProperty dblProperty = prop.asDouble();
1359 if (null != dblProperty) {
1360 return (dblProperty.hasRange() || dblProperty.hasValues());
1364 } else if (prop.getType() == Type.STRING) {
1365 StringProperty stringProperty = prop.asString();
1366 if (null != stringProperty) {
1367 return stringProperty.hasValues();
1376 public int startAutomation(SingleResource resource,
1377 AttributeElement attribute, AutoUpdateType autoType,
1378 int autoUpdateInterval) {
1380 if (null != resource && null != attribute) {
1381 SimulatorSingleResource server = (SimulatorSingleResource) resource
1382 .getSimulatorResource();
1383 if (null != server) {
1384 String attrName = attribute.getSimulatorResourceAttribute()
1387 autoId = server.startAttributeUpdation(attrName, autoType,
1388 autoUpdateInterval, automationListener);
1389 } catch (SimulatorException e) {
1393 .log(Level.ERROR.ordinal(),
1395 "[" + e.getClass().getSimpleName() + "]"
1396 + e.code().toString() + "-"
1401 attribute.setAutoUpdateId(autoId);
1402 attribute.setAutoUpdateType(autoType);
1403 attribute.setAutoUpdateInterval(autoUpdateInterval);
1404 attribute.setAutoUpdateState(true);
1405 resource.setAttributeAutomationInProgress(true);
1412 public void stopAutomation(SingleResource resource, AttributeElement att,
1414 if (null != resource) {
1415 SimulatorSingleResource server = (SimulatorSingleResource) resource
1416 .getSimulatorResource();
1417 if (null != server) {
1419 server.stopUpdation(autoId);
1420 } catch (SimulatorException e) {
1424 .log(Level.ERROR.ordinal(),
1426 "[" + e.getClass().getSimpleName() + "]"
1427 + e.code().toString() + "-"
1431 // Change the automation status
1432 att.setAutoUpdateState(false);
1433 resource.setAttributeAutomationInProgress(isAnyAttributeInAutomation(resource));
1438 public boolean startResourceAutomationUIRequest(AutoUpdateType autoType,
1439 int autoUpdateInterval, final SingleResource resource) {
1440 if (null == resource) {
1443 boolean status = false;
1444 // Invoke the native automation method
1445 SimulatorSingleResource resourceServer = (SimulatorSingleResource) resource
1446 .getSimulatorResource();
1447 if (null != resourceServer) {
1450 autoId = resourceServer.startResourceUpdation(autoType,
1451 autoUpdateInterval, automationListener);
1452 } catch (SimulatorException e) {
1456 .log(Level.ERROR.ordinal(), new Date(),
1457 Utility.getSimulatorErrorString(e, null));
1461 // Automation request accepted.
1462 changeResourceLevelAutomationStatus(resource, true);
1464 resource.setAutomationId(autoId);
1466 // Notify the UI listeners in a different thread.
1467 Thread notifyThread = new Thread() {
1469 UiListenerHandler.getInstance()
1470 .resourceAutomationStartedUINotification(
1474 notifyThread.setPriority(Thread.MAX_PRIORITY);
1475 notifyThread.start();
1483 public boolean stopResourceAutomationUIRequest(final SingleResource resource) {
1484 if (null == resource) {
1487 final int autoId = resource.getAutomationId();
1491 SimulatorSingleResource resourceServer = (SimulatorSingleResource) resource
1492 .getSimulatorResource();
1493 if (null == resourceServer) {
1496 // Call native method
1498 resourceServer.stopUpdation(autoId);
1499 } catch (SimulatorException e) {
1503 .log(Level.ERROR.ordinal(), new Date(),
1504 Utility.getSimulatorErrorString(e, null));
1508 // Notify the UI Listeners. Invoke the automation complete callback.
1509 Thread stopThread = new Thread() {
1511 automationListener.onUpdateComplete(resource.getResourceURI(),
1519 private boolean isAnyAttributeInAutomation(SingleResource resource) {
1520 if (null == resource || null == resource.getResourceRepresentation()) {
1524 Map<String, AttributeElement> attributes = resource
1525 .getResourceRepresentation().getAttributes();
1526 if (null == attributes || 0 == attributes.size())
1529 for (Map.Entry<String, AttributeElement> entry : attributes.entrySet()) {
1530 if (entry.getValue().isAutoUpdateInProgress())
1537 // Changes the automation state of the resource and its attributes
1538 private void changeResourceLevelAutomationStatus(SingleResource resource,
1541 if (null == resource || null == resource.getResourceRepresentation()) {
1545 Map<String, AttributeElement> attributes = resource
1546 .getResourceRepresentation().getAttributes();
1547 if (null == attributes || 0 == attributes.size())
1550 for (Map.Entry<String, AttributeElement> entry : attributes.entrySet()) {
1551 entry.getValue().setAutoUpdateState(status);
1554 resource.setResourceAutomationInProgress(status);
1557 private AttributeElement getAttributeWithGivenAutomationId(
1558 SingleResource resource, int automationId) {
1559 if (null == resource || null == resource.getResourceRepresentation()) {
1563 Map<String, AttributeElement> attributes = resource
1564 .getResourceRepresentation().getAttributes();
1565 if (null == attributes || 0 == attributes.size())
1568 for (Map.Entry<String, AttributeElement> entry : attributes.entrySet()) {
1569 if (automationId == entry.getValue().getAutoUpdateId())
1570 return entry.getValue();
1576 public boolean isResourceAutomationStarted(SingleResource resource) {
1577 boolean status = false;
1578 if (null != resource) {
1579 status = resource.isResourceAutomationInProgress();
1584 public boolean isAttributeAutomationStarted(SingleResource resource) {
1585 if (null == resource) {
1588 return resource.isAttributeAutomationInProgress();
1591 public void notifyObserverRequest(Resource resource, int observerId) {
1592 if (null == resource) {
1595 SimulatorResource simulatorResource = resource.getSimulatorResource();
1596 if (null == simulatorResource) {
1600 simulatorResource.notifyObserver(observerId);
1601 } catch (SimulatorException e) {
1605 .log(Level.ERROR.ordinal(), new Date(),
1606 Utility.getSimulatorErrorString(e, null));
1610 public List<String> getAllValuesOfAttribute(SimulatorResourceAttribute att) {
1615 AttributeValue value = att.value();
1616 if (null == value || null == value.get()) {
1620 TypeInfo type = value.typeInfo();
1622 if (type.mBaseType == ValueType.RESOURCEMODEL) {
1626 List<String> values = new ArrayList<String>();
1628 AttributeProperty prop = att.property();
1630 // Adding the current value of the attribute.
1631 values.add(new AttributeValueStringConverter(value).toString());
1635 if (type.mType == ValueType.ARRAY) {
1636 if (type.mDepth == 1) {
1637 ArrayProperty arrayProperty = prop.asArray();
1638 if (null != arrayProperty) {
1639 AttributeProperty childProp = arrayProperty
1640 .getElementProperty();
1641 switch (childProp.getType()) {
1643 IntegerProperty intProperty = childProp.asInteger();
1644 if (null != intProperty) {
1645 values.addAll(getAllValues(att, intProperty,
1650 DoubleProperty dblProperty = childProp.asDouble();
1651 if (null != dblProperty) {
1652 values.addAll(getAllValues(att, dblProperty,
1657 BooleanProperty boolProperty = childProp
1659 if (null != boolProperty) {
1660 values.addAll(getAllValues(att, boolProperty,
1665 StringProperty stringProperty = childProp
1667 if (null != stringProperty) {
1668 values.addAll(getAllValues(att, stringProperty,
1678 switch (prop.getType()) {
1680 IntegerProperty intProperty = prop.asInteger();
1681 if (null != intProperty) {
1682 values.addAll(getAllValues(att, intProperty,
1687 DoubleProperty dblProperty = prop.asDouble();
1688 if (null != dblProperty) {
1689 values.addAll(getAllValues(att, dblProperty,
1694 BooleanProperty boolProperty = prop.asBoolean();
1695 if (null != boolProperty) {
1696 values.addAll(getAllValues(att, boolProperty,
1701 StringProperty stringProperty = prop.asString();
1702 if (null != stringProperty) {
1703 values.addAll(getAllValues(att, stringProperty,
1715 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1716 IntegerProperty intProperty, AttributeProperty.Type type) {
1717 List<String> values = new ArrayList<String>();
1719 if (intProperty.hasRange()) {
1720 int min = (int) intProperty.min();
1721 int max = (int) intProperty.max();
1722 for (int iVal = min; iVal <= max; iVal++) {
1723 values.add(String.valueOf(iVal));
1725 } else if (intProperty.hasValues()) {
1726 for (Integer val : intProperty.getValues()) {
1727 values.add(String.valueOf(val));
1730 AttributeValue value = attribute.value();
1731 if (null != value && null != value.get()) {
1732 // Adding the current value of the attribute.
1733 values.add(String.valueOf(value.get()));
1739 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1740 DoubleProperty dblProperty, AttributeProperty.Type type) {
1741 NumberFormat formatter = NumberFormat.getInstance();
1742 List<String> values = new ArrayList<String>();
1744 if (dblProperty.hasRange()) {
1745 double min = (double) dblProperty.min();
1746 double max = (double) dblProperty.max();
1747 for (double val = min; val <= max; val += 0.1) {
1748 formatter.setMaximumFractionDigits(1);
1749 formatter.setMinimumFractionDigits(1);
1750 values.add(formatter.format(val));
1752 } else if (dblProperty.hasValues()) {
1753 for (Double val : dblProperty.getValues()) {
1754 values.add(String.valueOf(val));
1757 AttributeValue value = attribute.value();
1758 if (null != value && null != value.get()) {
1759 // Adding the current value of the attribute.
1760 values.add(String.valueOf(value.get()));
1766 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1767 BooleanProperty boolProperty, AttributeProperty.Type type) {
1768 List<String> values = new ArrayList<String>();
1770 values.add("false");
1774 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1775 StringProperty stringProperty, AttributeProperty.Type type) {
1776 List<String> values = new ArrayList<String>();
1778 if (stringProperty.hasValues()) {
1779 for (String val : stringProperty.getValues()) {
1780 values.add(String.valueOf(val));
1783 AttributeValue value = attribute.value();
1784 if (null != value && null != value.get()) {
1785 // Adding the current value of the attribute.
1786 values.add(String.valueOf(value.get()));
1792 public int getResourceCount() {
1793 return data.getResourceCount();
1796 public void shutdown() {
1797 threadHandle.interrupt();