, ParserDataType> typeMap = new HashMap<>(length << 1);
+ for(int i = 0; i < length; i ++){
final ParserDataType dt = values[i];
+
primitiveWrapperMap.put(dt.primitiveType, dt.objectiveType);
wrapperPrimitiveMap.put(dt.objectiveType, dt.primitiveType);
typeMap.put(dt.primitiveType, dt);
@@ -276,7 +280,6 @@ public static Object getValueOrSelf(final Class> fieldType, final Object value
* @return The primitive or objective value.
* @throws CodecException If the value cannot be interpreted as primitive or objective.
*/
- @SuppressWarnings("ReturnOfNull")
public static Object getValue(final Class> fieldType, final String value) throws CodecException{
if(fieldType == String.class)
return value;
@@ -292,24 +295,58 @@ public static Object getValue(final Class> fieldType, final String value) thro
: val);
}
-
private static Object toNumber(final String text, final Class> objectiveType){
- Object response = null;
+ Object result = null;
if(isNumeric(text)){
try{
- final Method method = objectiveType.getDeclaredMethod(METHOD_VALUE_OF, String.class, int.class);
- final boolean hexadecimal = text.startsWith("0x");
- response = method.invoke(null, (hexadecimal? text.substring(2): text), (hexadecimal? 16: 10));
+ final BigInteger decValue = (text.startsWith("0x")
+ ? new BigInteger(text.substring(2), 16)
+ : new BigInteger(text));
+ final int maxBytes = (int)objectiveType.getDeclaredField("BYTES")
+ .get(null);
+ if(decValue.bitCount() <= maxBytes << 3){
+ //extract decimal value as object
+ final byte[] byteArray = decValue.toByteArray();
+ if(maxBytes == Byte.BYTES)
+ result = byteArray[0];
+ else{
+ long value = 0l;
+ for(int i = 0, length = byteArray.length; i < length; i ++)
+ value |= (byteArray[i] & 0xFFl) << (Byte.SIZE * (length - 1 - i));
+
+ if(maxBytes == Short.BYTES)
+ result = (short)value;
+ else if(maxBytes == Integer.BYTES)
+ result = (int)value;
+ else if(maxBytes == Long.BYTES)
+ result = value;
+ }
+ }
}
- catch(final NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored){}
+ catch(final NoSuchFieldException | IllegalAccessException ignored){}
}
- return response;
+ return result;
}
private static boolean isNumeric(final String text){
return (isHexadecimalNumber(text) || isDecimalNumber(text));
}
+ /**
+ * Returns the primitive or objective type (depending on the field type) data stored as a string value.
+ *
+ * @param value The string value to be interpreted.
+ * @return The primitive or objective value as an unsigned number (e.g. `(byte)0xFF` is 255 rather than -1).
+ */
+ public static Number getBigNumber(final String value){
+ if(value == null || value.isEmpty())
+ return null;
+
+ return (value.startsWith("0x")
+ ? new BigInteger(value.substring(2), 16)
+ : new BigDecimal(value));
+ }
+
/**
* Checks if the text contains only Unicode digits.
@@ -349,8 +386,9 @@ private static boolean isHexadecimalNumber(final String text){
}
private static boolean isBaseNumber(final CharSequence text, final int offset, final int radix){
- for(int i = offset; i < text.length(); i ++){
+ for(int i = offset, length = text.length(); i < length; i ++){
final char chr = text.charAt(i);
+
if(Character.digit(chr, radix) < 0)
return true;
}
diff --git a/src/main/java/io/github/mtrevisan/boxon/logs/EventLogger.java b/src/main/java/io/github/mtrevisan/boxon/logs/EventLogger.java
index e2bc50e96..da9265918 100644
--- a/src/main/java/io/github/mtrevisan/boxon/logs/EventLogger.java
+++ b/src/main/java/io/github/mtrevisan/boxon/logs/EventLogger.java
@@ -33,6 +33,7 @@
import java.util.Collection;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.StringJoiner;
@@ -79,7 +80,7 @@ public void loadingCodecsFrom(final Class>[] basePackageClasses){
public void loadingCodec(final Class>[] codecClasses){
if(LOGGER.isInfoEnabled()){
final StringJoiner sj = new StringJoiner(", ", "[", "]");
- for(int i = 0; i < codecClasses.length; i ++)
+ for(int i = 0, length = codecClasses.length; i < length; i ++)
sj.add(codecClasses[i].getSimpleName());
info("Loading codecs: {}", sj.toString());
@@ -105,7 +106,7 @@ public void loadingTemplatesFrom(final Class>[] basePackageClasses){
private static StringJoiner joinPackageNames(final Class>[] basePackageClasses){
final StringJoiner sj = new StringJoiner(", ", "[", "]");
- for(int i = 0; i < basePackageClasses.length; i ++)
+ for(int i = 0, length = basePackageClasses.length; i < length; i ++)
sj.add(basePackageClasses[i].getPackageName());
return sj;
}
@@ -225,8 +226,9 @@ private static Object[] extractParameters(final Object[] parameters){
}
private static Collection collectPackages(final Object[] parameters){
- final Collection packages = new HashSet<>(parameters.length);
- for(int i = 0; i < parameters.length; i ++)
+ final int length = parameters.length;
+ final Collection packages = new HashSet<>(length);
+ for(int i = 0; i < length; i ++)
packages.add(((Class>)parameters[i]).getPackageName());
return packages;
}
diff --git a/src/main/java/io/github/mtrevisan/boxon/semanticversioning/Version.java b/src/main/java/io/github/mtrevisan/boxon/semanticversioning/Version.java
index b92be844a..8aae5fd1f 100644
--- a/src/main/java/io/github/mtrevisan/boxon/semanticversioning/Version.java
+++ b/src/main/java/io/github/mtrevisan/boxon/semanticversioning/Version.java
@@ -234,7 +234,7 @@ private static void validateToken(final String type, final String token) throws
}
private static void validatePreRelease(final String[] preRelease) throws VersionException{
- for(int i = 0; i < preRelease.length; i ++)
+ for(int i = 0, length = preRelease.length; i < length; i ++)
validatePreRelease(preRelease[i]);
}
@@ -247,7 +247,7 @@ private static void validatePreRelease(final String pr){
}
private static void validateBuild(final String[] build) throws VersionException{
- for(int i = 0; i < build.length; i ++)
+ for(int i = 0, length = build.length; i < length; i ++)
validateBuild(build[i]);
}
@@ -404,7 +404,7 @@ private static int compareToIdentifiers(final String[] preRelease, final String[
private static int compareIdentifierArrays(final String[] preRelease, final String[] otherPreRelease){
int result = (otherPreRelease.length - preRelease.length);
- for(int i = 0; i < getLeastCommonArrayLength(preRelease, otherPreRelease); i ++){
+ for(int i = 0, length = getLeastCommonArrayLength(preRelease, otherPreRelease); i < length; i ++){
result = compareIdentifiers(preRelease[i], otherPreRelease[i]);
if(result != 0)
break;
@@ -440,8 +440,9 @@ private static int compareIdentifiers(final String identifier1, final String ide
*/
private static boolean containsOnlyValidChars(String text){
text = text.toUpperCase(Locale.ROOT);
- for(int i = 0; i < text.length(); i ++){
+ for(int i = 0, length = text.length(); i < length; i ++){
final char chr = text.charAt(i);
+
if(chr != '-' && (chr < 'A' || chr > 'Z'))
return false;
}
diff --git a/src/test/java/io/github/mtrevisan/boxon/MapIterationSpeedTest.java b/src/test/java/io/github/mtrevisan/boxon/MapIterationSpeedTest.java
new file mode 100644
index 000000000..e592b5165
--- /dev/null
+++ b/src/test/java/io/github/mtrevisan/boxon/MapIterationSpeedTest.java
@@ -0,0 +1,55 @@
+package io.github.mtrevisan.boxon;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+
+class MapIterationSpeedTest{
+
+ public static void main(String[] args) {
+ // Creazione di una mappa con un gran numero di elementi
+ Map context = generateTestData(1000000);
+
+ // Test del metodo tradizionale
+ long startTime = System.currentTimeMillis();
+ iterateTraditionally(context);
+ long traditionalTime = System.currentTimeMillis() - startTime;
+ System.out.println("Tempo impiegato per l'iterazione tradizionale: " + traditionalTime + " ms");
+
+ // Test del metodo parallelo
+ startTime = System.currentTimeMillis();
+ iterateInParallel(context);
+ long parallelTime = System.currentTimeMillis() - startTime;
+ System.out.println("Tempo impiegato per l'iterazione parallela: " + parallelTime + " ms");
+ }
+
+ // Genera una mappa di test con un numero specifico di elementi
+ private static Map generateTestData(int size) {
+ Map testData = new HashMap<>();
+ Random random = new Random();
+ for (int i = 0; i < size; i++) {
+ testData.put("key" + i, random.nextInt());
+ }
+ return testData;
+ }
+
+ // Iterazione tradizionale sulla mappa
+ private static void iterateTraditionally(Map context) {
+ for (Map.Entry entry : context.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ // Operazioni da eseguire su ogni entry
+ }
+ }
+
+ // Iterazione parallela sulla mappa
+ private static void iterateInParallel(Map context) {
+ context.entrySet().forEach(entry -> {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ // Operazioni da eseguire su ogni entry
+ });
+ }
+
+}
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/ComposerTest.java b/src/test/java/io/github/mtrevisan/boxon/core/ComposerTest.java
index a231caacd..ee722b780 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/ComposerTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/ComposerTest.java
@@ -46,7 +46,7 @@ class ComposerTest{
@Test
void parseAndComposeSingleMessageHex() throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withContextPair("deviceTypes", deviceTypes)
.withContextFunction(ParserTest.class, "headerLength")
@@ -76,7 +76,7 @@ void parseAndComposeSingleMessageHex() throws NoSuchMethodException, AnnotationE
@Test
void parseAndComposeSingleMessageASCII() throws AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GV350M", (byte)0xCF);
+ .with((byte)0xCF, "QUECLINK_GV350M");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/ComposerThreadedTest.java b/src/test/java/io/github/mtrevisan/boxon/core/ComposerThreadedTest.java
index fe822164d..897c71dd5 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/ComposerThreadedTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/ComposerThreadedTest.java
@@ -48,7 +48,7 @@ class ComposerThreadedTest{
void concurrencySingleParserSingleCore() throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withContextPair("deviceTypes", deviceTypes)
.withContextFunction(ParserTest.class, "headerLength")
@@ -74,7 +74,7 @@ void concurrencySingleParserSingleCore() throws NoSuchMethodException, Annotatio
void concurrencyMultipleParserSingleCore() throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withContextPair("deviceTypes", deviceTypes)
.withContextFunction(ParserTest.class, "headerLength")
@@ -102,7 +102,7 @@ void concurrencyMultipleParserSingleCore() throws NoSuchMethodException, Annotat
void concurrencyMultipleParserMultipleCore() throws NoSuchMethodException, AnnotationException, TemplateException,
ConfigurationException, ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
//compose:
int threadCount = 10;
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorTest.java b/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorTest.java
index c9b7dc409..89157af52 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorTest.java
@@ -45,7 +45,7 @@ class ConfiguratorTest{
@Test
void getConfigurations() throws AnnotationException, ConfigurationException, CodecException, TemplateException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withDefaultCodecs()
.withConfiguration(REGConfigurationASCII.class)
@@ -63,14 +63,14 @@ void getConfigurations() throws AnnotationException, ConfigurationException, Cod
ConfigurationKey.CONFIGURATION_PROTOCOL_VERSION_BOUNDARIES.toString()));
Assertions.assertEquals("{longDescription:The command AT+GTREG is used to do things.,maxProtocol:2.8,shortDescription:AT+GTREG}", jsonHeader);
- Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTP,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:int},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
+ Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTPS,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:short},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
Assertions.assertEquals("[1.18,1.19,1.20,1.21,1.35,1.36,2.8]", jsonProtocolVersionBoundaries);
}
@Test
void getProtocolVersionBoundaries() throws AnnotationException, ConfigurationException, TemplateException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withDefaultCodecs()
.withConfigurationsFrom(REGConfigurationASCII.class)
@@ -87,7 +87,7 @@ void getProtocolVersionBoundaries() throws AnnotationException, ConfigurationExc
@Test
void getConfigurationsByProtocol() throws AnnotationException, ConfigurationException, CodecException, TemplateException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withDefaultCodecs()
.withConfigurationsFrom(REGConfigurationASCII.class)
@@ -103,13 +103,13 @@ void getConfigurationsByProtocol() throws AnnotationException, ConfigurationExce
String jsonFields = PrettyPrintMap.toString(configuration.get(ConfigurationKey.CONFIGURATION_FIELDS.toString()));
Assertions.assertEquals("{longDescription:The command AT+GTREG is used to do things.,shortDescription:AT+GTREG}", jsonHeader);
- Assertions.assertEquals("{Maximum download retry count:{minValue:0,fieldType:int,maxValue:3,defaultValue:0},Download timeout:{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:20},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:int},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,fieldType:int}}", jsonFields);
+ Assertions.assertEquals("{Maximum download retry count:{minValue:0,fieldType:int,maxValue:3,defaultValue:0},Download timeout:{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:20},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:short},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,fieldType:int}}", jsonFields);
}
@Test
void composeSingleConfigurationMessage() throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withDefaultCodecs()
.withConfigurationsFrom(REGConfigurationASCII.class)
@@ -129,7 +129,7 @@ void composeSingleConfigurationMessage() throws NoSuchMethodException, Annotatio
));
configurationData.put("Update mode", 0);
configurationData.put("Maximum download retry count", 2);
- configurationData.put("Message counter", 123);
+ configurationData.put("Message counter", (short)123);
configurationData.put("Operation mode", 1);
configurationData.put("Password", "pass");
configurationData.put("Download timeout", 25);
@@ -139,7 +139,7 @@ void composeSingleConfigurationMessage() throws NoSuchMethodException, Annotatio
configurationData);
Assertions.assertFalse(composeResult.hasError());
- Assertions.assertEquals("AT+GTREG=pass,1,1,0,2,25,0,http://url.com@username@password,3600,3600,6,,7b$",
+ Assertions.assertEquals("AT+GTREG=pass,1,1,0,2,25,0,http://url.com@username@password,3600,3600,06,,7B$",
new String(composeResult.getMessage()));
}
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorThreadedTest.java b/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorThreadedTest.java
index dd89bbaf6..7a48a371f 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorThreadedTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/ConfiguratorThreadedTest.java
@@ -46,7 +46,7 @@ class ConfiguratorThreadedTest{
void concurrencySingleParserSingleCore() throws AnnotationException, ConfigurationException, CodecException, TemplateException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withDefaultCodecs()
.withConfiguration(REGConfigurationASCII.class)
@@ -63,7 +63,7 @@ void concurrencySingleParserSingleCore() throws AnnotationException, Configurati
ConfigurationKey.CONFIGURATION_PROTOCOL_VERSION_BOUNDARIES.toString()));
Assertions.assertEquals("{longDescription:The command AT+GTREG is used to do things.,maxProtocol:2.8,shortDescription:AT+GTREG}", jsonHeader);
- Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTP,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:int},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
+ Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTPS,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:short},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
Assertions.assertEquals("[1.18,1.19,1.20,1.21,1.35,1.36,2.8]", jsonProtocolVersionBoundaries);
},
10
@@ -74,7 +74,7 @@ void concurrencySingleParserSingleCore() throws AnnotationException, Configurati
void concurrencyMultipleParserSingleCore() throws AnnotationException, ConfigurationException, CodecException, TemplateException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withDefaultCodecs()
.withConfiguration(REGConfigurationASCII.class)
@@ -93,7 +93,7 @@ void concurrencyMultipleParserSingleCore() throws AnnotationException, Configura
ConfigurationKey.CONFIGURATION_PROTOCOL_VERSION_BOUNDARIES.toString()));
Assertions.assertEquals("{longDescription:The command AT+GTREG is used to do things.,maxProtocol:2.8,shortDescription:AT+GTREG}", jsonHeader);
- Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTP,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:int},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
+ Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTPS,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:short},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
Assertions.assertEquals("[1.18,1.19,1.20,1.21,1.35,1.36,2.8]", jsonProtocolVersionBoundaries);
},
10
@@ -104,7 +104,7 @@ void concurrencyMultipleParserSingleCore() throws AnnotationException, Configura
void concurrencyMultipleParserMultipleCore() throws AnnotationException, ConfigurationException, CodecException, TemplateException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
MultithreadingHelper.testMultithreading(
() -> {
@@ -123,7 +123,7 @@ void concurrencyMultipleParserMultipleCore() throws AnnotationException, Configu
ConfigurationKey.CONFIGURATION_PROTOCOL_VERSION_BOUNDARIES.toString()));
Assertions.assertEquals("{longDescription:The command AT+GTREG is used to do things.,maxProtocol:2.8,shortDescription:AT+GTREG}", jsonHeader);
- Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTP,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:int},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
+ Assertions.assertEquals("{Operation mode report interval:{minValue:3600,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.21,fieldType:int},Maximum download retry count:{alternatives:[{maxProtocol:1.20,minValue:0,fieldType:int,maxValue:3,defaultValue:0},{minValue:0,fieldType:int,maxValue:3,minProtocol:1.21,defaultValue:1}]},Download timeout:{alternatives:[{maxProtocol:1.18,minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,defaultValue:10},{minValue:5,unitOfMeasure:min,fieldType:int,maxValue:30,minProtocol:1.19,defaultValue:20}]},Weekday:{defaultValue:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY],enumeration:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]},Update Over-The-Air:{defaultValue:FALSE,mutuallyExclusive:true,enumeration:[TRUE, FALSE]},Header:{charset:UTF-8,defaultValue:GTREG,fieldType:String},Download protocol:{alternatives:[{maxProtocol:1.35,enumeration:[HTTP, HTTPS],defaultValue:HTTP,mutuallyExclusive:true},{enumeration:[HTTP, HTTPS],minProtocol:1.36,defaultValue:HTTPS,mutuallyExclusive:true}]},Download URL:{pattern:.{0,100},charset:UTF-8,fields:{URL:{pattern:https?://.{0,92},fieldType:String},password:{pattern:.{1,32},fieldType:String},username:{pattern:.{1,32},fieldType:String}}},Update mode:{minValue:0,maxValue:1,defaultValue:1,fieldType:int},Message counter:{minValue:0,maxValue:65535,fieldType:short},Operation mode:{minValue:0,maxValue:3,defaultValue:0,fieldType:int},Motion report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int},Password:{charset:UTF-8,defaultValue:gb200s,pattern:[0-9a-zA-Z]{4,20},fieldType:String},Motionless report interval:{maxProtocol:1.20,minValue:90,unitOfMeasure:s,maxValue:86400,defaultValue:3600,minProtocol:1.19,fieldType:int}}", jsonFields);
Assertions.assertEquals("[1.18,1.19,1.20,1.21,1.35,1.36,2.8]", jsonProtocolVersionBoundaries);
},
10
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/DescriptorTest.java b/src/test/java/io/github/mtrevisan/boxon/core/DescriptorTest.java
index 8aef6f652..1e3a7d959 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/DescriptorTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/DescriptorTest.java
@@ -49,7 +49,7 @@ class DescriptorTest{
@Test
void description() throws AnnotationException, ConfigurationException, CodecException, TemplateException, NoSuchMethodException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withContextPair("deviceTypes", deviceTypes)
.withContextFunction(ParserTest.class.getDeclaredMethod("headerLength"))
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/DescriptorThreadedTest.java b/src/test/java/io/github/mtrevisan/boxon/core/DescriptorThreadedTest.java
index 8ae083307..e0669b2c6 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/DescriptorThreadedTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/DescriptorThreadedTest.java
@@ -45,7 +45,7 @@ class DescriptorThreadedTest{
void concurrencySingleParserSingleCore() throws AnnotationException, ConfigurationException, CodecException, TemplateException,
NoSuchMethodException, ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withContextPair("deviceTypes", deviceTypes)
.withContextFunction(ParserTest.class.getDeclaredMethod("headerLength"))
@@ -69,7 +69,7 @@ void concurrencySingleParserSingleCore() throws AnnotationException, Configurati
void concurrencyMultipleParserSingleCore() throws NoSuchMethodException, TemplateException, ConfigurationException, AnnotationException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Core core = CoreBuilder.builder()
.withContextPair("deviceTypes", deviceTypes)
.withContextFunction(ParserTest.class.getDeclaredMethod("headerLength"))
@@ -95,7 +95,7 @@ void concurrencyMultipleParserSingleCore() throws NoSuchMethodException, Templat
void concurrencyMultipleParserMultipleCore() throws NoSuchMethodException, TemplateException, ConfigurationException,
AnnotationException, ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
int threadCount = 10;
AtomicInteger counter = new AtomicInteger();
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/ParserTest.java b/src/test/java/io/github/mtrevisan/boxon/core/ParserTest.java
index ec6b07641..3d0b5d94e 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/ParserTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/ParserTest.java
@@ -44,7 +44,7 @@ class ParserTest{
public static void main(String[] args) throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
//if it is wanted `headerLength` to be a variable and not a method:
//- remove Map context = Collections.singletonMap("deviceTypes", deviceTypes); above
@@ -86,7 +86,7 @@ private static int headerLength(){
@Test
void parseMultipleMessagesHex() throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
@@ -107,7 +107,7 @@ void parseMultipleMessagesHex() throws NoSuchMethodException, AnnotationExceptio
@Test
void parseMultipleMessagesASCII() throws AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GV350M", (byte)0xCF);
+ .with((byte)0xCF, "QUECLINK_GV350M");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
@@ -127,8 +127,8 @@ void parseMultipleMessagesASCII() throws AnnotationException, TemplateException,
@Test
void parseMultipleMessagesHexASCII() throws NoSuchMethodException, AnnotationException, TemplateException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46)
- .with("QUECLINK_GV350M", (byte)0xCF);
+ .with((byte)0x46, "QUECLINK_GB200S")
+ .with((byte)0xCF, "QUECLINK_GV350M");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
@@ -151,8 +151,8 @@ void parseMultipleMessagesHexASCII() throws NoSuchMethodException, AnnotationExc
@Test
void parseMultipleMessagesASCIIHex() throws AnnotationException, TemplateException, NoSuchMethodException, ConfigurationException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46)
- .with("QUECLINK_GV350M", (byte)0xCF);
+ .with((byte)0x46, "QUECLINK_GB200S")
+ .with((byte)0xCF, "QUECLINK_GV350M");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/ParserThreadedTest.java b/src/test/java/io/github/mtrevisan/boxon/core/ParserThreadedTest.java
index 94d5129a3..e8fb8279c 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/ParserThreadedTest.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/ParserThreadedTest.java
@@ -50,7 +50,7 @@ class ParserThreadedTest{
void concurrencySingleParserSingleCore() throws NoSuchMethodException, TemplateException, ConfigurationException, AnnotationException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
@@ -80,7 +80,7 @@ void concurrencySingleParserSingleCore() throws NoSuchMethodException, TemplateE
void concurrencyMultipleParserSingleCore() throws NoSuchMethodException, TemplateException, ConfigurationException, AnnotationException,
ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
Core core = CoreBuilder.builder()
.withContext(context)
@@ -112,7 +112,7 @@ void concurrencyMultipleParserSingleCore() throws NoSuchMethodException, Templat
void concurrencyMultipleParserMultipleCore() throws NoSuchMethodException, TemplateException, ConfigurationException,
AnnotationException, ExecutionException, InterruptedException{
DeviceTypes deviceTypes = DeviceTypes.create()
- .with("QUECLINK_GB200S", (byte)0x46);
+ .with((byte)0x46, "QUECLINK_GB200S");
Map context = Collections.singletonMap("deviceTypes", deviceTypes);
AtomicInteger errors = new AtomicInteger();
diff --git a/src/test/java/io/github/mtrevisan/boxon/core/codecs/queclink/DeviceTypes.java b/src/test/java/io/github/mtrevisan/boxon/core/codecs/queclink/DeviceTypes.java
index 63452454a..f6e474025 100644
--- a/src/test/java/io/github/mtrevisan/boxon/core/codecs/queclink/DeviceTypes.java
+++ b/src/test/java/io/github/mtrevisan/boxon/core/codecs/queclink/DeviceTypes.java
@@ -32,7 +32,7 @@
public class DeviceTypes{
- private final Map deviceTypes;
+ private final Map deviceTypes;
public static DeviceTypes create(){
@@ -45,8 +45,8 @@ private DeviceTypes(){
}
- public DeviceTypes with(final String deviceTypeName, final byte deviceTypeCode){
- deviceTypes.put(deviceTypeName, deviceTypeCode);
+ public DeviceTypes with(final byte deviceTypeCode, final String deviceTypeName){
+ deviceTypes.put(deviceTypeCode, deviceTypeName);
return this;
}
@@ -60,24 +60,33 @@ boolean has(final byte deviceTypeCode){
return false;
}
- public String getDeviceTypeName(final byte deviceTypeCode){
- for(final Map.Entry deviceType : deviceTypes.entrySet())
- if(deviceType.getValue().equals(deviceTypeCode))
+ public byte getDeviceTypeCode(final String deviceTypeName){
+ for(final Map.Entry deviceType : deviceTypes.entrySet())
+ if(deviceType.getValue().equals(deviceTypeName))
return deviceType.getKey();
- final String actualCode = Integer.toHexString(deviceTypeCode & 0x0000_00FF);
- final StringJoiner sj = new StringJoiner(", 0x", "[0x", "]");
- for(final Map.Entry deviceType : deviceTypes.entrySet())
- sj.add(Integer.toHexString(deviceType.getValue() & 0x0000_00FF));
- throw new IllegalArgumentException("Cannot parse message from another device, device type is 0x" + actualCode.toUpperCase(Locale.ROOT)
- + ", should be one of " + sj);
+ throw new IllegalArgumentException("Given device name is not recognized: " + deviceTypeName);
+ }
+
+ public String getDeviceTypeName(final byte deviceTypeCode){
+ final String deviceTypeName = deviceTypes.get(deviceTypeCode);
+
+ if(deviceTypeName == null){
+ final String actualCode = Integer.toHexString(deviceTypeCode & 0x0000_00FF);
+ final StringJoiner sj = new StringJoiner(", 0x", "[0x", "]");
+ for(final Map.Entry deviceType : deviceTypes.entrySet())
+ sj.add(Integer.toHexString(deviceType.getKey() & 0x0000_00FF));
+ throw new IllegalArgumentException("Cannot parse message from another device, device type is 0x"
+ + actualCode.toUpperCase(Locale.ROOT) + ", should be one of " + sj);
+ }
+ return deviceTypeName;
}
@Override
public String toString(){
final StringJoiner sj = new StringJoiner(", ", "[", "]");
- for(final Map.Entry