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);