Skip to content
This repository has been archived by the owner on Jun 14, 2024. It is now read-only.

Commit

Permalink
#4 Parsed first two ok.
Browse files Browse the repository at this point in the history
  • Loading branch information
baardl committed Apr 9, 2021
1 parent 3206cc9 commit 036b458
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
import no.entra.bacnet.parseandmap.ParserResult;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.List;

import static no.entra.bacnet.apdu.ArrayTag.ARRAY1_END;
import static no.entra.bacnet.apdu.ArrayTag.ARRAY1_START;
import static org.slf4j.LoggerFactory.getLogger;

/*
Expand Down Expand Up @@ -99,12 +97,13 @@
*/
public class ReadObjectPropertiesResultParser {
private static final Logger log = getLogger(ReadObjectPropertiesResultParser.class);

public static ParserResult<ReadObjectPropertiesResult> parse(String hexString) throws BacnetParserException {
ParserResult<ReadObjectPropertiesResult> parserResult = new ParserResult<>();
ReadObjectPropertiesResult readObjectPropertiesResult = null;
parserResult.setInitialHexString(hexString);
ObjectId objectId = null;
List<ReadPropertyResult> readPropertyResults = new ArrayList<>();
// List<ReadPropertyResult> readPropertyResults = new ArrayList<>();
OctetReader objectPropertiesReader = new OctetReader(hexString);
if (!objectPropertiesReader.hasNext() || !objectPropertiesReader.next().equals(SDContextTag.TAG0LENGTH4)) {
parserResult.setUnparsedHexString(objectPropertiesReader.unprocessedHexString());
Expand All @@ -119,28 +118,38 @@ public static ParserResult<ReadObjectPropertiesResult> parse(String hexString) t
readObjectPropertiesResult = new ReadObjectPropertiesResult(objectId);
parserResult.setParsedObject(readObjectPropertiesResult);

int numberOfOctetsRead = objectIdResult.getNumberOfOctetsRead();
objectPropertiesReader.next(numberOfOctetsRead); //Discard and move pointer
while (objectPropertiesReader.hasNext()) {
try {
String unprocessedHexString = objectPropertiesReader.unprocessedHexString();
if (unprocessedHexString.startsWith(ARRAY1_END.toString())) {
int numberOfOctetsRead = 5;
if (objectPropertiesReader.next().equals(ARRAY1_START)) {
while (objectPropertiesReader.hasNext()) {
try {
String unprocessedHexString = objectPropertiesReader.unprocessedHexString();
if (unprocessedHexString.startsWith(ARRAY1_END.toString())) {
break;
}
ParserResult<ReadPropertyResult> propertyParserResult = ReadPropertyResultParser.parse(unprocessedHexString);
if (parserResult.isParsedOk()) {
readObjectPropertiesResult.addReadPropertyResult(propertyParserResult.getParsedObject());
numberOfOctetsRead = propertyParserResult.getNumberOfOctetsRead();
objectPropertiesReader.next(numberOfOctetsRead);
}
} catch (IllegalStateException e) {
parserResult.setUnparsedHexString(objectPropertiesReader.unprocessedHexString());
parserResult.setErrorMessage(e.getMessage());
parserResult.setParsedOk(false);
break;
} catch (BacnetParserException e) {
log.trace("Could not parse ReadObjectPropertiesResult from hexString: {}. Unparsed: {} ", hexString, e.getParserResult().getUnparsedHexString());
break;
}
ParserResult<ReadPropertyResult> propertyParserResult = ReadPropertyResultParser.parse(unprocessedHexString);
if (parserResult.isParsedOk()) {
readPropertyResults.add(propertyParserResult.getParsedObject());
numberOfOctetsRead = parserResult.getNumberOfOctetsRead();
objectPropertiesReader.next(numberOfOctetsRead);
}
} catch (BacnetParserException e) {
log.trace("Could not parse ReadObjectPropertiesResult from hexString: {}. Unparsed: {} ", hexString, e.getParserResult().getUnparsedHexString());
break;
}
} else {
parserResult.setParsedOk(false);
parserResult.setErrorMessage("Could not parse ObjectId");
parserResult.setUnparsedHexString(objectIdResult.getUnparsedHexString());
}
} else {
parserResult.setParsedOk(false);
parserResult.setErrorMessage("Could not parse ObjectId");
parserResult.setErrorMessage("Missing array/sequence of ReadPropertyResult");
parserResult.setUnparsedHexString(objectIdResult.getUnparsedHexString());
}
return parserResult;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import no.entra.bacnet.parseandmap.ParserResult;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

/*
Expand Down Expand Up @@ -103,6 +105,10 @@ void parse() throws BacnetParserException {
assertNotNull(propertiesResult);
ObjectId objectId = new ObjectId(ObjectType.AnalogValue, 0);
assertEquals(objectId, propertiesResult.getObjectId());
List<ReadPropertyResult> resultList = propertiesResult.getResults();
assertNotNull(resultList);
assertEquals(2, resultList.size());

}

@Test
Expand Down

0 comments on commit 036b458

Please sign in to comment.