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 jSimulatorSingleResource
594 .setInterface(Utility.convertSetToVectorString(resource
595 .getResourceInterfaces()));
597 // Register the resource with the platform.
598 jSimulatorSingleResource.start();
599 resource.setStarted(true);
600 } catch (SimulatorException e) {
604 .log(Level.ERROR.ordinal(), new Date(),
605 Utility.getSimulatorErrorString(e, null));
609 // Add to local cache.
610 data.addResource(resource);
612 // Update UI listeners
613 UiListenerHandler.getInstance().resourceCreatedUINotification(
614 ResourceType.SINGLE);
619 .log(Level.INFO.ordinal(), new Date(),
620 "Resource created [" + resource.getResourceURI() + "].");
625 public Resource createResourceByRAML(String configFilePath)
626 throws SimulatorException {
627 SimulatorResource jSimulatorResource;
629 // Create the resource
630 jSimulatorResource = SimulatorManager
631 .createResource(configFilePath);
632 if (null == jSimulatorResource) {
635 } catch (SimulatorException e) {
639 .log(Level.ERROR.ordinal(), new Date(),
640 Utility.getSimulatorErrorString(e, null));
644 if (!(jSimulatorResource instanceof SimulatorSingleResource)) {
648 Resource resource = new SingleResource();
649 resource.setSimulatorResource(jSimulatorResource);
651 // Fetch and locally store the resource name and uri.
652 String uri = jSimulatorResource.getURI();
653 if (null == uri || uri.trim().isEmpty()) {
656 resource.setResourceURI(uri.trim());
658 String name = jSimulatorResource.getName();
659 if (null == name || name.trim().isEmpty()) {
663 resource.setResourceName(name.trim());
669 * This method can set/change the resource uri and name of an already
670 * created resource which is not yet registered with the platform. This
671 * method registers the model change and observer listeners, registers the
672 * resource, fetches the resource attributes, updates the local cache and
673 * notifies the UI listeners.
675 public boolean completeSingleResourceCreationByRAML(Resource resource,
676 String uri, String name, boolean multiInstance)
677 throws SimulatorException {
678 if (null == resource || !(resource instanceof SingleResource)) {
682 SingleResource singleRes = (SingleResource) resource;
684 SimulatorSingleResource jSimulatorSingleResource = (SimulatorSingleResource) resource
685 .getSimulatorResource();
686 if (null == jSimulatorSingleResource) {
690 // Update resource URI and Name if they are changed.
691 String newUri = uri.trim();
692 String newName = name.trim();
695 singleRes.setResourceURI(newUri);
696 singleRes.setResourceName(newName);
698 if (!singleRes.getResourceURI().equals(newUri)) {
699 jSimulatorSingleResource.setURI(newUri);
700 singleRes.setResourceURI(newUri);
702 if (!singleRes.getResourceName().equals(newName)) {
703 jSimulatorSingleResource.setName(newName);
704 singleRes.setResourceName(newName);
708 // Set the model change listener.
709 jSimulatorSingleResource
710 .setResourceModelChangeListener(resourceModelChangeListener);
712 // Set the observer listener if the resource is observable.
713 if (jSimulatorSingleResource.isObservable()) {
714 jSimulatorSingleResource.setObserverListener(observer);
715 singleRes.setObservable(true);
718 // Fetch the resource model.
719 SimulatorResourceModel jResModel = jSimulatorSingleResource
721 if (null == jResModel) {
724 singleRes.setResourceModel(jResModel);
726 // Fetch the basic details of the resource.
727 singleRes.setResourceType(jSimulatorSingleResource
730 .setResourceInterfaces(Utility
731 .convertVectorToSet(jSimulatorSingleResource
734 // Fetch the resource attributes.
735 singleRes.createResourceRepresentation(jSimulatorSingleResource
738 // Register the resource with the platform.
739 jSimulatorSingleResource.start();
740 singleRes.setStarted(true);
742 // Add to local cache.
743 data.addResource(singleRes);
745 // Update UI listeners for single instance creation
747 UiListenerHandler.getInstance().resourceCreatedUINotification(
748 ResourceType.SINGLE);
749 } catch (Exception e) {
753 .log(Level.ERROR.ordinal(), new Date(),
754 Utility.getSimulatorErrorString(e, null));
761 .log(Level.INFO.ordinal(), new Date(),
762 "Resource created [" + resource.getResourceURI() + "].");
766 public Set<SingleResource> createSingleResourceMultiInstances(
767 String configFile, int count, IProgressMonitor progressMonitor)
768 throws SimulatorException {
769 Set<SingleResource> resultSet;
771 resultSet = new HashSet<SingleResource>();
772 Vector<SimulatorResource> jSimulatorResources = SimulatorManager
773 .createResource(configFile, count);
774 if (null == jSimulatorResources || jSimulatorResources.size() < 1) {
777 SimulatorSingleResource jResource;
778 SingleResource resource;
780 for (SimulatorResource jSimulatorResource : jSimulatorResources) {
781 // If the resource creation progress is canceled, then stop the
782 // creation and stop/delete
783 // the resources created already.
784 if (progressMonitor.isCanceled()) {
785 removeSingleResources(resultSet);
788 jResource = (SimulatorSingleResource) jSimulatorResource;
789 resource = new SingleResource();
790 resource.setSimulatorResource(jResource);
792 result = completeSingleResourceCreationByRAML(resource,
793 jResource.getURI(), jResource.getName(), true);
795 resultSet.add(resource);
797 } catch (SimulatorException eInner) {
801 .log(Level.ERROR.ordinal(),
803 Utility.getSimulatorErrorString(eInner,
806 progressMonitor.worked(1);
808 } catch (SimulatorException eOuter) {
812 .log(Level.ERROR.ordinal(), new Date(),
813 Utility.getSimulatorErrorString(eOuter, null));
819 public List<Resource> getResourceList() {
820 List<Resource> resourceList = data.getResources();
821 if (null == resourceList) {
825 Collections.sort(resourceList, Utility.resourceComparator);
830 public List<SingleResource> getSingleResourceList() {
831 List<SingleResource> resourceList = data.getSingleResources();
832 if (null == resourceList) {
836 Collections.sort(resourceList, Utility.singleResourceComparator);
841 public void removeSingleResources(Set<SingleResource> resources)
842 throws SimulatorException {
843 if (null == resources) {
846 Iterator<SingleResource> itr = resources.iterator();
847 while (itr.hasNext()) {
848 removeResource(itr.next());
852 public void removeResource(Resource res) throws SimulatorException {
853 // Unregister the resource from the platform.
854 SimulatorResource simRes = res.getSimulatorResource();
857 } catch (SimulatorException e) {
861 .log(Level.ERROR.ordinal(), new Date(),
862 Utility.getSimulatorErrorString(e, null));
866 // Delete this resource
867 data.deleteResource(res);
872 .log(Level.INFO.ordinal(), new Date(),
873 "Resource deleted [" + res.getResourceURI() + "].");
876 public boolean isUriUnique(List<MetaProperty> properties) {
877 if (null == properties) {
881 Iterator<MetaProperty> itr = properties.iterator();
882 while (itr.hasNext()) {
884 if (prop.getPropName().equals(Constants.RESOURCE_URI)) {
885 String uri = prop.getPropValue();
886 return !data.isResourceExist(uri);
892 public void resourceSelectionChanged(final Resource selectedResource) {
896 if (null != selectedResource) {
897 setCurrentResourceInSelection(selectedResource);
899 setCurrentResourceInSelection(null);
901 // Notify all observers for resource selection change event
902 UiListenerHandler.getInstance()
903 .resourceSelectionChangedUINotification(
909 public List<MetaProperty> getMetaProperties(Resource resource) {
910 if (null != resource) {
912 StringBuilder propValue;
913 List<MetaProperty> metaPropertyList = new ArrayList<MetaProperty>();
915 for (int index = 0; index < Constants.META_PROPERTY_COUNT; index++) {
916 propName = Constants.META_PROPERTIES[index];
917 propValue = new StringBuilder();
918 if (propName.equals(Constants.RESOURCE_NAME)) {
919 propValue.append(resource.getResourceName());
920 } else if (propName.equals(Constants.RESOURCE_URI)) {
921 propValue.append(resource.getResourceURI());
922 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
923 propValue.append(resource.getResourceType());
924 } else if (propName.equals(Constants.INTERFACE_TYPES)) {
925 Set<String> ifTypes = resource.getResourceInterfaces();
926 if (null != ifTypes && !ifTypes.isEmpty()) {
927 Iterator<String> itr = ifTypes.iterator();
928 while (itr.hasNext()) {
929 propValue.append(itr.next());
931 propValue.append(", ");
940 if (null != propValue) {
941 metaPropertyList.add(new MetaProperty(propName, propValue
945 return metaPropertyList;
950 public boolean startResource(Resource resource) throws SimulatorException {
951 if (null == resource) {
954 SimulatorResource server = resource.getSimulatorResource();
955 if (null == server) {
960 resource.setStarted(true);
961 } catch (SimulatorException e) {
965 .log(Level.ERROR.ordinal(),
967 "There is an error while starting the resource.\n"
968 + Utility.getSimulatorErrorString(e, null));
974 public boolean stopResource(Resource resource) throws SimulatorException {
975 if (null == resource) {
978 SimulatorResource server = resource.getSimulatorResource();
979 if (null == server) {
984 resource.setStarted(false);
985 } catch (SimulatorException e) {
989 .log(Level.ERROR.ordinal(),
991 "There is an error while stopping the resource.\n"
992 + Utility.getSimulatorErrorString(e, null));
998 public boolean changeResourceName(Resource resource, String newName)
999 throws SimulatorException {
1000 if (null == resource || null == newName) {
1004 if (!stopResource(resource)) {
1008 SimulatorResource server = resource.getSimulatorResource();
1010 server.setName(newName);
1011 resource.setResourceName(newName);
1012 } catch (SimulatorException e) {
1016 .log(Level.ERROR.ordinal(),
1018 "There is an error while changing the resource name.\n"
1019 + Utility.getSimulatorErrorString(e, null));
1023 if (!startResource(resource)) {
1030 public boolean changeResourceURI(Resource resource, String newURI)
1031 throws SimulatorException {
1032 if (null == resource || null == newURI) {
1036 if (!stopResource(resource)) {
1040 String curURI = resource.getResourceURI();
1041 setResourceURI(resource, newURI);
1044 if (!startResource(resource)) {
1047 } catch (SimulatorException e) {
1048 setResourceURI(resource, curURI);
1054 public boolean changeResourceType(Resource resource, String newResourceType)
1055 throws SimulatorException {
1056 if (null == resource || null == newResourceType) {
1060 if (!stopResource(resource)) {
1064 String curResourceType = resource.getResourceType();
1065 setResourceType(resource, newResourceType);
1068 if (!startResource(resource)) {
1071 } catch (SimulatorException e) {
1072 setResourceType(resource, curResourceType);
1078 public void setResourceURI(Resource resource, String newURI)
1079 throws SimulatorException {
1080 String curURI = resource.getResourceURI();
1081 SimulatorResource server = resource.getSimulatorResource();
1083 server.setURI(newURI);
1084 data.changeResourceURI(resource, curURI, newURI);
1085 } catch (SimulatorException e) {
1089 .log(Level.ERROR.ordinal(),
1091 "There is an error while changing the resource URI.\n"
1092 + Utility.getSimulatorErrorString(e, null));
1097 public void setResourceType(Resource resource, String newResourceType)
1098 throws SimulatorException {
1099 SimulatorResource server = resource.getSimulatorResource();
1101 server.setResourceType(newResourceType);
1102 resource.setResourceType(newResourceType);
1103 } catch (SimulatorException e) {
1107 .log(Level.ERROR.ordinal(),
1109 "There is an error while changing the resource Type.\n"
1110 + Utility.getSimulatorErrorString(e, null));
1115 public boolean updateResourceProperties(Resource resource,
1116 List<MetaProperty> properties, boolean uriChanged,
1117 boolean nameChanged, boolean resTypeChanged)
1118 throws SimulatorException {
1119 if (null == resource || null == properties) {
1123 // Updating the properties
1124 Iterator<MetaProperty> itr = properties.iterator();
1125 MetaProperty property;
1128 String resName = null;
1129 String resURI = null;
1130 String resType = null;
1131 while (itr.hasNext()) {
1132 property = itr.next();
1133 if (null == property) {
1136 propName = property.getPropName();
1137 propValue = property.getPropValue();
1138 if (propName.equals(Constants.RESOURCE_NAME)) {
1139 resName = propValue;
1140 } else if (propName.equals(Constants.RESOURCE_URI)) {
1142 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
1143 resType = propValue;
1148 if (!changeResourceName(resource, resName)) {
1152 // Notify UI Listeners
1153 UiListenerHandler.getInstance().propertiesChangedUINotification(
1158 if (!changeResourceURI(resource, resURI)) {
1163 if (resTypeChanged) {
1164 if (!changeResourceType(resource, resType)) {
1172 public boolean updateResourceInterfaces(Resource resource,
1173 Set<String> newIfSet) throws SimulatorException {
1174 if (null == resource || null == newIfSet || newIfSet.isEmpty()) {
1178 SimulatorResource jResource = resource.getSimulatorResource();
1179 if (null == jResource) {
1183 Set<String> curIfSet = resource.getResourceInterfaces();
1184 if (null == curIfSet || curIfSet.isEmpty()) {
1188 Iterator<String> itr = curIfSet.iterator();
1189 String interfaceType;
1190 boolean resourceRestartRequired = false;
1191 while (itr.hasNext()) {
1192 interfaceType = itr.next();
1193 if (!newIfSet.contains(interfaceType)) {
1194 resourceRestartRequired = true;
1200 // As there is no support from native layer for interface removal,
1201 // supporting it from the simulator requires restarting the resource
1202 // if any existing interfaces are removed.
1204 if (resourceRestartRequired) {
1205 stopResource(resource);
1206 jResource.setInterface(Utility
1207 .convertSetToVectorString(newIfSet));
1208 startResource(resource);
1210 // Existing interfaces are not removed.
1211 itr = newIfSet.iterator();
1212 while (itr.hasNext()) {
1213 interfaceType = itr.next();
1214 if (!curIfSet.contains(interfaceType)) {
1215 jResource.addInterface(interfaceType);
1219 } catch (SimulatorException e) {
1223 .log(Level.ERROR.ordinal(),
1225 "There is an error while changing the interface types."
1226 + Utility.getSimulatorErrorString(e, null));
1230 // Set the resource interfaces.
1231 resource.setResourceInterfaces(newIfSet);
1236 public boolean attributeValueUpdated(SingleResource resource,
1237 String attributeName, AttributeValue value) {
1238 if (null != resource && null != attributeName && null != value) {
1239 SimulatorSingleResource simRes = (SimulatorSingleResource) resource
1240 .getSimulatorResource();
1241 if (null != simRes) {
1243 simRes.updateAttribute(attributeName, value);
1245 } catch (SimulatorException e) {
1249 .log(Level.ERROR.ordinal(), new Date(),
1250 Utility.getSimulatorErrorString(e, null));
1257 public boolean isResourceStarted(Resource resource) {
1258 if (null == resource) {
1261 return resource.isStarted();
1264 public boolean isPropertyValueInvalid(Resource resource,
1265 List<MetaProperty> properties, String propName) {
1266 if (null == resource || null == properties || null == propName) {
1269 boolean invalid = false;
1271 Iterator<MetaProperty> itr = properties.iterator();
1272 while (itr.hasNext()) {
1274 if (prop.getPropName().equals(propName)) {
1275 String value = prop.getPropValue();
1276 if (propName.equals(Constants.RESOURCE_URI)) {
1277 if (!Utility.isUriValid(value)) {
1280 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
1281 if (!Utility.isResourceTypeValid(value)) {
1285 if (null == value || value.trim().isEmpty()) {
1294 public boolean isPropValueChanged(Resource resource,
1295 List<MetaProperty> properties, String propName) {
1296 if (null == resource || null == properties || null == propName) {
1299 boolean changed = false;
1302 Iterator<MetaProperty> itr = properties.iterator();
1303 while (itr.hasNext()) {
1305 if (prop.getPropName().equals(propName)) {
1306 oldValue = getPropertyValueFromResource(resource, propName);
1307 if (null != oldValue && !prop.getPropValue().equals(oldValue)) {
1316 private String getPropertyValueFromResource(Resource resource,
1318 if (null == resource || null == propName) {
1321 if (propName.equals(Constants.RESOURCE_URI)) {
1322 return resource.getResourceURI();
1323 } else if (propName.equals(Constants.RESOURCE_NAME)) {
1324 return resource.getResourceName();
1325 } else if (propName.equals(Constants.RESOURCE_TYPE)) {
1326 return resource.getResourceType();
1332 public boolean isAttHasRangeOrAllowedValues(SimulatorResourceAttribute att) {
1336 AttributeProperty prop = att.property();
1341 if (prop.getType() == Type.INTEGER) {
1342 IntegerProperty intProperty = prop.asInteger();
1343 if (null != intProperty) {
1344 return (intProperty.hasRange() || intProperty.hasValues());
1348 } else if (prop.getType() == Type.DOUBLE) {
1349 DoubleProperty dblProperty = prop.asDouble();
1350 if (null != dblProperty) {
1351 return (dblProperty.hasRange() || dblProperty.hasValues());
1355 } else if (prop.getType() == Type.STRING) {
1356 StringProperty stringProperty = prop.asString();
1357 if (null != stringProperty) {
1358 return stringProperty.hasValues();
1367 public int startAutomation(SingleResource resource,
1368 AttributeElement attribute, AutoUpdateType autoType,
1369 int autoUpdateInterval) {
1371 if (null != resource && null != attribute) {
1372 SimulatorSingleResource server = (SimulatorSingleResource) resource
1373 .getSimulatorResource();
1374 if (null != server) {
1375 String attrName = attribute.getSimulatorResourceAttribute()
1378 autoId = server.startAttributeUpdation(attrName, autoType,
1379 autoUpdateInterval, automationListener);
1380 } catch (SimulatorException e) {
1384 .log(Level.ERROR.ordinal(),
1386 "[" + e.getClass().getSimpleName() + "]"
1387 + e.code().toString() + "-"
1392 attribute.setAutoUpdateId(autoId);
1393 attribute.setAutoUpdateType(autoType);
1394 attribute.setAutoUpdateInterval(autoUpdateInterval);
1395 attribute.setAutoUpdateState(true);
1396 resource.setAttributeAutomationInProgress(true);
1403 public void stopAutomation(SingleResource resource, AttributeElement att,
1405 if (null != resource) {
1406 SimulatorSingleResource server = (SimulatorSingleResource) resource
1407 .getSimulatorResource();
1408 if (null != server) {
1410 server.stopUpdation(autoId);
1411 } catch (SimulatorException e) {
1415 .log(Level.ERROR.ordinal(),
1417 "[" + e.getClass().getSimpleName() + "]"
1418 + e.code().toString() + "-"
1422 // Change the automation status
1423 att.setAutoUpdateState(false);
1424 resource.setAttributeAutomationInProgress(isAnyAttributeInAutomation(resource));
1429 public boolean startResourceAutomationUIRequest(AutoUpdateType autoType,
1430 int autoUpdateInterval, final SingleResource resource) {
1431 if (null == resource) {
1434 boolean status = false;
1435 // Invoke the native automation method
1436 SimulatorSingleResource resourceServer = (SimulatorSingleResource) resource
1437 .getSimulatorResource();
1438 if (null != resourceServer) {
1441 autoId = resourceServer.startResourceUpdation(autoType,
1442 autoUpdateInterval, automationListener);
1443 } catch (SimulatorException e) {
1447 .log(Level.ERROR.ordinal(), new Date(),
1448 Utility.getSimulatorErrorString(e, null));
1452 // Automation request accepted.
1453 changeResourceLevelAutomationStatus(resource, true);
1455 resource.setAutomationId(autoId);
1457 // Notify the UI listeners in a different thread.
1458 Thread notifyThread = new Thread() {
1460 UiListenerHandler.getInstance()
1461 .resourceAutomationStartedUINotification(
1465 notifyThread.setPriority(Thread.MAX_PRIORITY);
1466 notifyThread.start();
1474 public boolean stopResourceAutomationUIRequest(final SingleResource resource) {
1475 if (null == resource) {
1478 final int autoId = resource.getAutomationId();
1482 SimulatorSingleResource resourceServer = (SimulatorSingleResource) resource
1483 .getSimulatorResource();
1484 if (null == resourceServer) {
1487 // Call native method
1489 resourceServer.stopUpdation(autoId);
1490 } catch (SimulatorException e) {
1494 .log(Level.ERROR.ordinal(), new Date(),
1495 Utility.getSimulatorErrorString(e, null));
1499 // Notify the UI Listeners. Invoke the automation complete callback.
1500 Thread stopThread = new Thread() {
1502 automationListener.onUpdateComplete(resource.getResourceURI(),
1510 private boolean isAnyAttributeInAutomation(SingleResource resource) {
1511 if (null == resource || null == resource.getResourceRepresentation()) {
1515 Map<String, AttributeElement> attributes = resource
1516 .getResourceRepresentation().getAttributes();
1517 if (null == attributes || 0 == attributes.size())
1520 for (Map.Entry<String, AttributeElement> entry : attributes.entrySet()) {
1521 if (entry.getValue().isAutoUpdateInProgress())
1528 // Changes the automation state of the resource and its attributes
1529 private void changeResourceLevelAutomationStatus(SingleResource resource,
1532 if (null == resource || null == resource.getResourceRepresentation()) {
1536 Map<String, AttributeElement> attributes = resource
1537 .getResourceRepresentation().getAttributes();
1538 if (null == attributes || 0 == attributes.size())
1541 for (Map.Entry<String, AttributeElement> entry : attributes.entrySet()) {
1542 entry.getValue().setAutoUpdateState(status);
1545 resource.setResourceAutomationInProgress(status);
1548 private AttributeElement getAttributeWithGivenAutomationId(
1549 SingleResource resource, int automationId) {
1550 if (null == resource || null == resource.getResourceRepresentation()) {
1554 Map<String, AttributeElement> attributes = resource
1555 .getResourceRepresentation().getAttributes();
1556 if (null == attributes || 0 == attributes.size())
1559 for (Map.Entry<String, AttributeElement> entry : attributes.entrySet()) {
1560 if (automationId == entry.getValue().getAutoUpdateId())
1561 return entry.getValue();
1567 public boolean isResourceAutomationStarted(SingleResource resource) {
1568 boolean status = false;
1569 if (null != resource) {
1570 status = resource.isResourceAutomationInProgress();
1575 public boolean isAttributeAutomationStarted(SingleResource resource) {
1576 if (null == resource) {
1579 return resource.isAttributeAutomationInProgress();
1582 public void notifyObserverRequest(Resource resource, int observerId) {
1583 if (null == resource) {
1586 SimulatorResource simulatorResource = resource.getSimulatorResource();
1587 if (null == simulatorResource) {
1591 simulatorResource.notifyObserver(observerId);
1592 } catch (SimulatorException e) {
1596 .log(Level.ERROR.ordinal(), new Date(),
1597 Utility.getSimulatorErrorString(e, null));
1601 public List<String> getAllValuesOfAttribute(SimulatorResourceAttribute att) {
1606 AttributeValue value = att.value();
1607 if (null == value || null == value.get()) {
1611 TypeInfo type = value.typeInfo();
1613 if (type.mBaseType == ValueType.RESOURCEMODEL) {
1617 List<String> values = new ArrayList<String>();
1619 AttributeProperty prop = att.property();
1621 // Adding the current value of the attribute.
1622 values.add(new AttributeValueStringConverter(value).toString());
1626 if (type.mType == ValueType.ARRAY) {
1627 if (type.mDepth == 1) {
1628 ArrayProperty arrayProperty = prop.asArray();
1629 if (null != arrayProperty) {
1630 AttributeProperty childProp = arrayProperty
1631 .getElementProperty();
1632 switch (childProp.getType()) {
1634 IntegerProperty intProperty = childProp.asInteger();
1635 if (null != intProperty) {
1636 values.addAll(getAllValues(att, intProperty,
1641 DoubleProperty dblProperty = childProp.asDouble();
1642 if (null != dblProperty) {
1643 values.addAll(getAllValues(att, dblProperty,
1648 BooleanProperty boolProperty = childProp
1650 if (null != boolProperty) {
1651 values.addAll(getAllValues(att, boolProperty,
1656 StringProperty stringProperty = childProp
1658 if (null != stringProperty) {
1659 values.addAll(getAllValues(att, stringProperty,
1669 switch (prop.getType()) {
1671 IntegerProperty intProperty = prop.asInteger();
1672 if (null != intProperty) {
1673 values.addAll(getAllValues(att, intProperty,
1678 DoubleProperty dblProperty = prop.asDouble();
1679 if (null != dblProperty) {
1680 values.addAll(getAllValues(att, dblProperty,
1685 BooleanProperty boolProperty = prop.asBoolean();
1686 if (null != boolProperty) {
1687 values.addAll(getAllValues(att, boolProperty,
1692 StringProperty stringProperty = prop.asString();
1693 if (null != stringProperty) {
1694 values.addAll(getAllValues(att, stringProperty,
1706 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1707 IntegerProperty intProperty, AttributeProperty.Type type) {
1708 List<String> values = new ArrayList<String>();
1710 if (intProperty.hasRange()) {
1711 int min = (int) intProperty.min();
1712 int max = (int) intProperty.max();
1713 for (int iVal = min; iVal <= max; iVal++) {
1714 values.add(String.valueOf(iVal));
1716 } else if (intProperty.hasValues()) {
1717 for (Integer val : intProperty.getValues()) {
1718 values.add(String.valueOf(val));
1721 AttributeValue value = attribute.value();
1722 if (null != value && null != value.get()) {
1723 // Adding the current value of the attribute.
1724 values.add(String.valueOf(value.get()));
1730 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1731 DoubleProperty dblProperty, AttributeProperty.Type type) {
1732 NumberFormat formatter = NumberFormat.getInstance();
1733 List<String> values = new ArrayList<String>();
1735 if (dblProperty.hasRange()) {
1736 double min = (double) dblProperty.min();
1737 double max = (double) dblProperty.max();
1738 for (double val = min; val <= max; val += 0.1) {
1739 formatter.setMaximumFractionDigits(1);
1740 formatter.setMinimumFractionDigits(1);
1741 values.add(formatter.format(val));
1743 } else if (dblProperty.hasValues()) {
1744 for (Double val : dblProperty.getValues()) {
1745 values.add(String.valueOf(val));
1748 AttributeValue value = attribute.value();
1749 if (null != value && null != value.get()) {
1750 // Adding the current value of the attribute.
1751 values.add(String.valueOf(value.get()));
1757 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1758 BooleanProperty boolProperty, AttributeProperty.Type type) {
1759 List<String> values = new ArrayList<String>();
1761 values.add("false");
1765 public List<String> getAllValues(SimulatorResourceAttribute attribute,
1766 StringProperty stringProperty, AttributeProperty.Type type) {
1767 List<String> values = new ArrayList<String>();
1769 if (stringProperty.hasValues()) {
1770 for (String val : stringProperty.getValues()) {
1771 values.add(String.valueOf(val));
1774 AttributeValue value = attribute.value();
1775 if (null != value && null != value.get()) {
1776 // Adding the current value of the attribute.
1777 values.add(String.valueOf(value.get()));
1783 public int getResourceCount() {
1784 return data.getResourceCount();
1787 public void shutdown() {
1788 threadHandle.interrupt();