Skip to content

Commit

Permalink
allow more permissive decode on open types (do not fail on decode error)
Browse files Browse the repository at this point in the history
  • Loading branch information
egwepas committed Sep 19, 2019
1 parent 661d236 commit 3b55f71
Show file tree
Hide file tree
Showing 11 changed files with 170 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/
package com.ericsson.mts.asn1;

import java.io.EOFException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -18,12 +19,21 @@

public class BitInputStream extends InputStream {
private final InputStream byteStream;
private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
private int currentBit = 0;
private int currentByte;

public BitInputStream(InputStream byteStream) {
this.byteStream = byteStream;
public BitInputStream(final InputStream byteStream) {
this.byteStream = new InputStream(){
@Override
public int read() throws IOException {
int value = byteStream.read();
if(-1 == value){
throw new RuntimeException("reached end of stream");
} else {
return value;
}
}
};
}

public synchronized int read() throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.ericsson.mts.asn1.classhandler;

import com.ericsson.mts.asn1.ASN1Parser;
Expand All @@ -23,6 +22,7 @@
* Handle keyword CLASS
*/
public class ClassHandler {

private static Logger logger = LoggerFactory.getLogger(ClassHandler.class.getSimpleName());
private ArrayList<Field> fields = new ArrayList<>();
private MainRegistry mainRegistry;
Expand All @@ -31,7 +31,7 @@ public class ClassHandler {
* Parse CLASS keyword context
*
* @param mainRegistry main registry
* @param ctx CLASS keyword context
* @param ctx CLASS keyword context
*/
public ClassHandler(MainRegistry mainRegistry, ASN1Parser.ObjectClassDefnContext ctx) {
this.mainRegistry = mainRegistry;
Expand Down Expand Up @@ -113,7 +113,9 @@ public ClassHandler(MainRegistry mainRegistry, ASN1Parser.ObjectClassDefnContext
}

/**
* Return the unique key syntax or the name otherwise ( example : CODE or code in oss made simple 6)
* Return the unique key syntax or the name otherwise ( example : CODE or
* code in oss made simple 6)
*
* @return unique key
*/
public String getUniqueKeyName() {
Expand All @@ -130,7 +132,9 @@ public String getUniqueKeyName() {
}

/**
* Use in open type case. Get the translator with an objectSet and identify with a field name and an unique key
* Use in open type case. Get the translator with an objectSet and identify
* with a field name and an unique key
*
* @param fieldName open type field name
* @param objectSetIdentifier target object set
* @param uniqueKey unique key which identify an object
Expand All @@ -139,16 +143,17 @@ public String getUniqueKeyName() {
public AbstractTranslator getTypeTranslator(String fieldName, String objectSetIdentifier, String uniqueKey) {
AbstractTranslator abstractTranslator = mainRegistry.getClassObjectSet(objectSetIdentifier).getTranslatorForField(uniqueKey, fieldName);
if (abstractTranslator == null) {
throw new RuntimeException();
throw new RuntimeException("Failed to get ClassObjectSet for identifier " + objectSetIdentifier + ", key " + uniqueKey + " and fieldName " + fieldName);
}
return abstractTranslator;
}

/**
* USe to get translator associate with a field name
*
* @param fieldName field name
* @return translator if it's not an open type field, null if it's an open type field or throw an Exception if
* field isn't in the class
* @return translator if it's not an open type field, null if it's an open
* type field or throw an Exception if field isn't in the class
*/
public AbstractTranslator getTypeTranslator(String fieldName) {
for (Field field : fields) {
Expand All @@ -163,6 +168,7 @@ public AbstractTranslator getTypeTranslator(String fieldName) {

/**
* For a given field name, get its syntax
*
* @param fieldName field name
* @return syntax name
*/
Expand All @@ -177,6 +183,7 @@ public String getSyntaxName(String fieldName) {

/**
* Use during classObject parsing.
*
* @return syntax fields
*/
public ArrayList<String> getSyntaxFields() {
Expand All @@ -189,10 +196,10 @@ public ArrayList<String> getSyntaxFields() {

@Override
public String toString() {
return "ClassHandler{" +
"fields=" + fields +
", mainRegistry=" + mainRegistry +
'}';
return "ClassHandler{"
+ "fields=" + fields
+ ", mainRegistry=" + mainRegistry
+ '}';
}

public enum FIELDTYPE {
Expand All @@ -203,15 +210,17 @@ public enum FIELDTYPE {
* Handle field within class
*/
private class Field {

private String name;
private AbstractTranslator type;
private FIELDTYPE qualifier = null;
private String syntax = null;
private String defaultValue = null;

public String getDefaultValue() {
if (getQualifier() == FIELDTYPE.DEFAULT)
if (getQualifier() == FIELDTYPE.DEFAULT) {
return defaultValue;
}
return null;
}

Expand All @@ -221,13 +230,13 @@ public void setDefaultValue(String defaultValue) {

@Override
public String toString() {
return "Field{" +
"name='" + getName() + '\'' +
", type=" + getType() +
", qualifier=" + getQualifier() +
", syntax='" + getSyntax() + '\'' +
", defaultValue='" + defaultValue + '\'' +
'}';
return "Field{"
+ "name='" + getName() + '\''
+ ", type=" + getType()
+ ", qualifier=" + getQualifier()
+ ", syntax='" + getSyntax() + '\''
+ ", defaultValue='" + defaultValue + '\''
+ '}';
}

public String getName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.ericsson.mts.asn1.translator;

import com.ericsson.mts.asn1.ASN1Parser;
Expand All @@ -24,6 +23,7 @@
import java.util.List;

public abstract class AbstractChoiceTranslator extends AbstractTranslator {

protected List<Pair<String, AbstractTranslator>> fieldList = new ArrayList<>();
protected List<Pair<String, AbstractTranslator>> extensionFieldList = new ArrayList<>();
protected boolean optionalExtensionMarker = false;
Expand Down Expand Up @@ -51,8 +51,9 @@ public AbstractTranslator init(MainRegistry mainRegistry, ASN1Parser.ChoiceTypeC
}
});
if (ctx.alternativeTypeLists().optionalExtensionMarker() != null) {
if (ctx.alternativeTypeLists().optionalExtensionMarker().ELLIPSIS() != null)
if (ctx.alternativeTypeLists().optionalExtensionMarker().ELLIPSIS() != null) {
optionalExtensionMarker = true;
}
}
}
}
Expand All @@ -71,18 +72,20 @@ public final void encode(String name, BitArray s, FormatReader reader, Translato
@Override
public void decode(String name, BitInputStream s, FormatWriter writer, TranslatorContext translatorContext, List<String> parameters) throws Exception {
writer.enterObject(name);
doDecode(s, writer);
writer.leaveObject(name);
try {
doDecode(s, writer);
} finally {
writer.leaveObject(name);
}
}

public abstract void doDecode(BitInputStream s, FormatWriter writer) throws Exception;


@Override
public String toString() {
return "AbstractChoiceTranslator{" +
"fieldList=" + fieldList +
", optionalExtensionMarker=" + optionalExtensionMarker +
'}';
return "AbstractChoiceTranslator{"
+ "fieldList=" + fieldList
+ ", optionalExtensionMarker=" + optionalExtensionMarker
+ '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.ericsson.mts.asn1.translator;

import com.ericsson.mts.asn1.ASN1Parser;
Expand All @@ -25,6 +24,7 @@
import java.util.Map;

public abstract class AbstractSequenceOfTranslator extends AbstractTranslator {

protected AbstractTranslator typeTranslator;
protected Constraints constraints;
protected List<String> actualParameters = new ArrayList<>();
Expand Down Expand Up @@ -88,20 +88,23 @@ public final void encode(String inputName, BitArray s, FormatReader reader, Tran
@Override
public final void decode(String name, BitInputStream s, FormatWriter writer, TranslatorContext translatorContext, List<String> parameters) throws Exception {
writer.enterArray(name);
doDecode(s, writer, getRegister(parameters));
writer.leaveArray(name);
try {
doDecode(s, writer, getRegister(parameters));
} finally {
writer.leaveArray(name);
}
}

protected abstract void doDecode(BitInputStream s, FormatWriter writer, Map<String, String> registry) throws Exception;

@Override
public String toString() {
return "AbstractSequenceOfTranslator{" +
"typeTranslator=" + typeTranslator +
", constraints=" + constraints +
", actualParameters=" + actualParameters +
", name='" + name + '\'' +
", parameters=" + parameters +
'}';
return "AbstractSequenceOfTranslator{"
+ "typeTranslator=" + typeTranslator
+ ", constraints=" + constraints
+ ", actualParameters=" + actualParameters
+ ", name='" + name + '\''
+ ", parameters=" + parameters
+ '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.ericsson.mts.asn1.translator;

import com.ericsson.mts.asn1.ASN1Parser;
Expand All @@ -26,6 +25,7 @@
import java.util.concurrent.atomic.AtomicReference;

public abstract class AbstractSequenceTranslator extends AbstractTranslator {

protected List<Field> fieldList = new ArrayList<>();
protected List<Field> additionnalFieldList = new ArrayList<>();
protected boolean hasEllipsis = false;
Expand All @@ -36,14 +36,15 @@ public abstract class AbstractSequenceTranslator extends AbstractTranslator {

public AbstractTranslator init(MainRegistry mainRegistry, ASN1Parser.SequenceTypeContext ctx) throws NotHandledCaseException {
AtomicReference<Boolean> isOptionnal = new AtomicReference<>(false);
if (ctx.extensionAndException() != null)
if (ctx.extensionAndException() != null) {
hasEllipsis = true;
else {
} else {
if (ctx.componentTypeLists().getChild(0).getClass().getSimpleName().compareTo(ASN1Parser.RootComponentTypeListContext.class.getSimpleName()) == 0) {
ctx.componentTypeLists().rootComponentTypeList(0).componentTypeList().componentType().forEach(componentTypeContext -> {
if (componentTypeContext.namedType() != null) {
if (componentTypeContext.DEFAULT_LITERAL() != null)
if (componentTypeContext.DEFAULT_LITERAL() != null) {
throw new NotHandledCaseException();
}
if (componentTypeContext.OPTIONAL_LITERAL() != null) {
isOptionnal.set(true);
rootSequenceOptionalCount++;
Expand All @@ -64,7 +65,6 @@ public AbstractTranslator init(MainRegistry mainRegistry, ASN1Parser.SequenceTyp
}
}


fieldList.add(field);
isOptionnal.set(false);
} else {
Expand All @@ -73,15 +73,17 @@ public AbstractTranslator init(MainRegistry mainRegistry, ASN1Parser.SequenceTyp
});
if (ctx.componentTypeLists().extensionAndException() != null) {
extensionAndException = fieldList.size() + 1;
if (ctx.componentTypeLists().extensionAndException().exceptionSpec() != null)
if (ctx.componentTypeLists().extensionAndException().exceptionSpec() != null) {
throw new NotHandledCaseException();
}
if (ctx.componentTypeLists().extensionAdditions() != null) {
if (ctx.componentTypeLists().extensionAdditions().extensionAdditionList() != null) {
ctx.componentTypeLists().extensionAdditions().extensionAdditionList().extensionAddition().forEach(extensionAdditionContext -> {
if (extensionAdditionContext.componentType() != null) {
if (extensionAdditionContext.componentType().namedType() != null) {
if (extensionAdditionContext.componentType().DEFAULT_LITERAL() != null)
if (extensionAdditionContext.componentType().DEFAULT_LITERAL() != null) {
throw new NotHandledCaseException();
}
if (extensionAdditionContext.componentType().OPTIONAL_LITERAL() != null) {
isOptionnal.set(true);
}
Expand Down Expand Up @@ -112,8 +114,9 @@ public AbstractTranslator init(MainRegistry mainRegistry, ASN1Parser.SequenceTyp
});
}
}
if (ctx.componentTypeLists().optionalExtensionMarker() != null)
if (ctx.componentTypeLists().optionalExtensionMarker() != null) {
optionalExtensionMarker = true;
}
}
} else if (ctx.componentTypeLists().getChild(0).getClass().getSimpleName().compareTo(ASN1Parser.ExtensionAndExceptionContext.class.getSimpleName()) == 0) {
throw new NotHandledCaseException();
Expand Down Expand Up @@ -165,26 +168,30 @@ public final void encode(String name, BitArray s, FormatReader reader, Translato
@Override
public final void decode(String name, BitInputStream s, FormatWriter writer, TranslatorContext translatorContext, List<String> parameters) throws Exception {
writer.enterObject(name);
doDecode(s, writer, new TranslatorContext(), getRegister(parameters));
writer.leaveObject(name);
try {
doDecode(s, writer, new TranslatorContext(), getRegister(parameters));
} finally {
writer.leaveObject(name);
}
}

protected abstract void doDecode(BitInputStream s, FormatWriter writer, TranslatorContext translatorContext, Map<String, String> registry) throws Exception;

@Override
public String toString() {
return "AbstractSequenceTranslator{" +
"fieldList=" + fieldList +
", additionnalFieldList=" + additionnalFieldList +
", hasEllipsis=" + hasEllipsis +
", extensionAndException=" + extensionAndException +
", optionalExtensionMarker=" + optionalExtensionMarker +
", rootSequenceOptionalCount=" + rootSequenceOptionalCount +
", optionalBitmap=" + Arrays.toString(optionalBitmap) +
'}';
return "AbstractSequenceTranslator{"
+ "fieldList=" + fieldList
+ ", additionnalFieldList=" + additionnalFieldList
+ ", hasEllipsis=" + hasEllipsis
+ ", extensionAndException=" + extensionAndException
+ ", optionalExtensionMarker=" + optionalExtensionMarker
+ ", rootSequenceOptionalCount=" + rootSequenceOptionalCount
+ ", optionalBitmap=" + Arrays.toString(optionalBitmap)
+ '}';
}

protected class Field {

String name;
AbstractTranslator type;
boolean isOptionnal;
Expand Down
Loading

0 comments on commit 3b55f71

Please sign in to comment.