Better handle undefined resource type
Previously all undefined resource was defined as holding a string type value - Now if the processed value is numerical, the resource is defined as holding a double value
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/DefaultResourceConfigBuilder.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/DefaultResourceConfigBuilder.java
index 0e06d1c..11b3390 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/DefaultResourceConfigBuilder.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/DefaultResourceConfigBuilder.java
@@ -11,6 +11,7 @@
package org.eclipse.sensinact.gateway.core;
import org.eclipse.sensinact.gateway.common.primitive.Modifiable;
+import org.eclipse.sensinact.gateway.core.AttributeBuilder.Requirement;
/**
* The default {@link ResourceConfigBuilder} is in charge of create the
@@ -30,42 +31,49 @@
* @see org.eclipse.sensinact.gateway.core.ResourceConfigBuilder#getResourceConfig(org.eclipse.sensinact.gateway.core.ResourceDescriptor)
*/
@Override
- public ResourceConfig getResourceConfig(ResourceDescriptor resourceConfigDescriptor) {
- Class<? extends Resource> resourceType = (resourceConfigDescriptor.resourceType() == null)
+ public ResourceConfig getResourceConfig(ResourceDescriptor resourceDescriptor) {
+ Class<? extends Resource> resourceType = (resourceDescriptor.resourceType() == null)
? this.getDefaultResourceType()
- : resourceConfigDescriptor.resourceType();
+ : resourceDescriptor.resourceType();
- Class<? extends ResourceConfig> resourceConfigType = resourceConfigDescriptor.resourceConfigType();
-
- Class<? extends ResourceImpl> resourceImplementationType = resourceConfigDescriptor
- .resourceImplementationType();
+ Class<? extends ResourceConfig> resourceConfigType = resourceDescriptor.resourceConfigType();
+ Class<? extends ResourceImpl> resourceImplementationType = resourceDescriptor.resourceImplementationType();
ResourceConfig resourceConfig = null;
try {
resourceConfig = resourceConfigType.newInstance();
-
} catch (Exception e) {
return null;
}
TypeConfig typeConfig = new TypeConfig(resourceType);
typeConfig.setImplementationClass(resourceImplementationType);
-
+
resourceConfig.setTypeConfig(typeConfig);
if (ActionResource.class.isAssignableFrom(resourceType)) {
return resourceConfig;
}
- if (resourceConfigDescriptor.updatePolicy() != null) {
- resourceConfig.setUpdatePolicy(resourceConfigDescriptor.updatePolicy());
- } else {
+ if (resourceDescriptor.updatePolicy() != null)
+ resourceConfig.setUpdatePolicy(resourceDescriptor.updatePolicy());
+ else
resourceConfig.setUpdatePolicy(this.getDefaultUpdatePolicy());
- }
- if (resourceConfigDescriptor.modifiable() == null) {
- resourceConfigDescriptor.withModifiable(this.getDefaultModifiable());
- }
- if (resourceConfigDescriptor.dataType() == null) {
- resourceConfigDescriptor.withDataType(this.getDefaultDataType());
- }
+
+ RequirementBuilder requirementBuider = new RequirementBuilder(Requirement.MODIFIABLE, resourceDescriptor.resourceName());
+ if (resourceDescriptor.modifiable() == null) {
+ requirementBuider.put(resourceDescriptor.serviceName(), this.getDefaultModifiable());
+ resourceDescriptor.withModifiable(this.getDefaultModifiable());
+ } else
+ requirementBuider.put(resourceDescriptor.serviceName(), resourceDescriptor.modifiable());
+ resourceConfig.addRequirementBuilder(requirementBuider);
+
+ requirementBuider = new RequirementBuilder(Requirement.TYPE, resourceDescriptor.resourceName());
+ if (resourceDescriptor.dataType() == null) {
+ requirementBuider.put(resourceDescriptor.serviceName(), this.getDefaultDataType());
+ resourceDescriptor.withDataType(this.getDefaultDataType());
+ } else
+ requirementBuider.put(resourceDescriptor.serviceName(), resourceDescriptor.dataType());
+ resourceConfig.addRequirementBuilder(requirementBuider);
+
return resourceConfig;
}
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java
index 4cd9572..23a090f 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java
@@ -238,10 +238,10 @@
*/
public ResourceBuilder getResourceBuilder(ResourceDescriptor descriptor) {
ResourceConfig resourceConfig = this.configuration().getResourceConfig(descriptor);
-
if (resourceConfig == null) {
return null;
}
+ descriptor.withDataType(null);
return configureResourceBuilder(resourceConfig, descriptor);
}
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/RequirementBuilder.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/RequirementBuilder.java
index 27b4f5c..638a817 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/RequirementBuilder.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/RequirementBuilder.java
@@ -47,19 +47,25 @@
* @param value
*/
public void put(String service, Object value) {
- if (service == null || service.length() == 0) {
- this.put(value);
-
- } else {
+ this.put(service,value,false);
+ }
+
+ /**
+ * @param service
+ * @param value
+ */
+ public void put(String service, Object value, boolean multiple) {
+ if (service == null || service.length() == 0)
+ this.values.put(ResourceConfig.ALL_TARGETS, value);
+ else
this.values.put(service, value);
- }
}
/**
* @param value
*/
public void put(Object value) {
- this.values.put(ResourceConfig.ALL_TARGETS, value);
+ this.put(ResourceConfig.ALL_TARGETS, value,false);
}
/**
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ResourceConfig.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ResourceConfig.java
index ed15b47..7d1d646 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ResourceConfig.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ResourceConfig.java
@@ -28,6 +28,7 @@
* @author <a href="mailto:christophe.munilla@cea.fr">Christophe Munilla</a>
*/
public class ResourceConfig implements Nameable {
+
public static final String ALL_TARGETS = "#ANY_TARGET#";
public static final String ALL_PROFILES = "#ANY_PROFILE#";
@@ -45,11 +46,6 @@
this.requirementBuilders = new ArrayList<RequirementBuilder>();
}
- /**
- * @inheritDoc
- *
- * @see Nameable#getName()
- */
@Override
public String getName() {
return this.getName(ResourceConfig.ALL_TARGETS);
@@ -73,21 +69,31 @@
/**
* Configures the name of the resource to build
*
- * @param name
- * the name of the resource to build
+ * @param service the String name of the service for which to define the name
+ * @param name the name to be set
*/
public void configureName(String service, String name) {
+ this.configureName(service, name, false);
+ }
+
+ /**
+ * Configures the name of the resource to build
+ *
+ * @param service the String name of the service for which to define the name
+ * @param name the name to be set
+ */
+ public void configureName(String service, String name, boolean multiple) {
int index = -1;
if ((index = this.requirementBuilders.indexOf(new Name<RequirementBuilder>(Resource.NAME))) > -1) {
- this.requirementBuilders.get(index).put(service, name);
+ this.requirementBuilders.get(index).put(service, name, multiple);
} else {
RequirementBuilder builder = new RequirementBuilder(Requirement.VALUE, Resource.NAME);
- builder.put(service, name);
+ builder.put(service, name, multiple);
this.requirementBuilders.add(builder);
}
}
-
+
/**
* Returns the {@link TypeConfig} which applies on {@link ResourceImpl}
* instances based on this ResourceConfig
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java
index b74348f..bbc29e7 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java
@@ -44,12 +44,18 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.FileInputStream;
import java.io.IOException;
import java.security.AccessController;
import java.security.InvalidKeyException;
import java.security.PrivilegedAction;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ServiceLoader;
+import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceImpl.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceImpl.java
index 7324c5a..eab13e9 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceImpl.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceImpl.java
@@ -13,6 +13,7 @@
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Enumeration;
+import java.util.Iterator;
import java.util.List;
import org.eclipse.sensinact.gateway.common.execution.Executable;
@@ -231,10 +232,57 @@
return;
}
ResourceImpl resource = this.getResource(resourceId);
- if (resource == null) {
- ResourceDescriptor descriptor = super.getModelInstance().configuration().getResourceDescriptor()
- .withServiceName(super.getName()).withResourceName(resourceId);
-
+ if (resource == null) {
+ Class<?> dataType = null;
+ for(Iterator<?> it = data.iterator();it.hasNext();) {
+ ResourceProcessableData rpd = (ResourceProcessableData) it.next();
+ if(rpd.getAttributeId()!=null && !DataResource.VALUE.equals(rpd.getAttributeId()))
+ continue;
+ Object obj = rpd.getData();
+ Class<?> clazz = obj==null?null:obj.getClass();
+ if(clazz == null)
+ break;
+ if(clazz.isPrimitive()) {
+ switch(clazz.getName()) {
+ case "byte":
+ case "short":
+ case "int":
+ case "long":
+ case "float":
+ case "double":
+ dataType = double.class;
+ break;
+ case "boolean":
+ dataType = boolean.class;
+ break;
+ case "char":
+ dataType = String.class;
+ break;
+ }
+ } else if (obj instanceof Number) {
+ switch(clazz.getName()) {
+ case "java.lang.Byte":
+ case "java.lang.Short":
+ case "java.lang.Integer":
+ case "java.lang.Long":
+ case "java.lang.Float":
+ case "java.lang.Double":
+ dataType = double.class;
+ break;
+ default:
+ dataType = String.class;
+ break;
+ }
+ } else
+ dataType = String.class;
+ break;
+ }
+ ResourceDescriptor descriptor = super.getModelInstance().configuration(
+ ).getResourceDescriptor(
+ ).withServiceName(super.getName()
+ ).withResourceName(resourceId
+ ).withDataType(dataType);
+
ResourceBuilder builder = super.getModelInstance().getResourceBuilder(descriptor,
this.modelInstance.configuration().getResourceBuildPolicy());
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceProviderImpl.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceProviderImpl.java
index e34dbda..7749983 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceProviderImpl.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ServiceProviderImpl.java
@@ -544,16 +544,15 @@
if (service != null && SensiNactResourceModelConfiguration.BuildPolicy.isBuildPolicy(buildPolicy,
SensiNactResourceModelConfiguration.BuildPolicy.BUILD_COMPLETE_ON_DESCRIPTION)) {
- List<ResourceConfig> resources = super.modelInstance.configuration()
- .getResourceConfigs(super.modelInstance.getProfile(), serviceName);
+ List<ResourceConfig> resources = super.modelInstance.configuration().getResourceConfigs(
+ super.modelInstance.getProfile(), serviceName);
if (super.modelInstance.getProfile() != null
&& !ResourceConfig.ALL_PROFILES.equals(super.modelInstance.getProfile())) {
resources.addAll(super.modelInstance.configuration().getResourceConfigs(ResourceConfig.ALL_PROFILES,
serviceName));
}
- ResourceConfig defaultResourceConfig = super.modelInstance.configuration()
- .getDefaultResourceConfig(serviceName);
+ ResourceConfig defaultResourceConfig = super.modelInstance.configuration().getDefaultResourceConfig(serviceName);
if (defaultResourceConfig != null) {
defaultResourceConfig.configureName(serviceName, serviceName);