From e40d126de9ccdd5ca3bf2d787fa377bfc15a8f45 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 3 Jun 2014 08:14:48 +0000 Subject: [PATCH] Merge STF455 staff --- .../etsi/its/tool/elvior/BuiltInCodec.java | 161 ++++++++++++++++++ .../etsi/its/tool/elvior/CodecsProvider.java | 67 ++++++++ .../its/tool/elvior/GetValueStructure.java | 115 +++++++++++++ .../its/tool/elvior/Its_CodecProvider.java | 61 ++++--- .../its/tool/elvior/LibItsCALMllsap_asn1.java | 31 ++++ .../its/tool/elvior/LibItsCALMmsap_asn1.java | 41 +++++ .../etsi/its/tool/elvior/LibItsCam_asn1.java | 3 +- .../etsi/its/tool/elvior/LibItsFntp_asn1.java | 33 ++++ .../etsi/its/tool/elvior/LibItsFsap_asn1.java | 13 ++ .../etsi/its/tool/elvior/LibItsIicp_asn1.java | 33 ++++ .../org/etsi/its/tool/elvior/LibIts_asn1.java | 27 ++- .../etsi/its/tool/elvior/PluginAdapter.java | 35 ++++ .../etsi/its/tool/elvior/res/codec.properties | 7 +- .../etsi/its/tool/elvior/res/ta.properties | 21 ++- .../org/etsi/tool/elvior/TciCDWrapper.java | 47 +++-- 15 files changed, 630 insertions(+), 65 deletions(-) create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/BuiltInCodec.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/CodecsProvider.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/GetValueStructure.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMllsap_asn1.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMmsap_asn1.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/LibItsFntp_asn1.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/LibItsFsap_asn1.java create mode 100644 javasrc/tool/org/etsi/its/tool/elvior/LibItsIicp_asn1.java diff --git a/javasrc/tool/org/etsi/its/tool/elvior/BuiltInCodec.java b/javasrc/tool/org/etsi/its/tool/elvior/BuiltInCodec.java new file mode 100644 index 000000000..64bd52ff5 --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/BuiltInCodec.java @@ -0,0 +1,161 @@ +package org.etsi.its.tool.elvior; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.elvior.ttcn.tritci.TciProvider; +import org.elvior.ttcn.tritci.TriMessageEx; +import org.elvior.ttcn.tritci.TriProvider; +import org.etsi.common.ByteHelper; +import org.etsi.ttcn.tci.RecordValue; +import org.etsi.ttcn.tci.TciCDProvided; +import org.etsi.ttcn.tci.Type; +import org.etsi.ttcn.tci.Value; +import org.etsi.ttcn.tri.TriMessage; + +/** + * + * Note that "Enable Internal Codec" field shall be set to true + * + */ +public class BuiltInCodec implements TciCDProvided { + + /** + * Logger instance + */ + protected final static Logger _logger = Logger.getLogger("org.etsi.its"); + + private String _encodingName; + + /** + * Constructor + */ + public BuiltInCodec(final String encodingName) { + _logger.entering("BuiltInCodec", "BuiltInCodec", encodingName); + + if (encodingName.equals("LibItsDenm_asn1")) { + _encodingName = "DENM_PDU_Descriptions"; + } else if (encodingName.equals("LibItsCam_asn1")) { + _encodingName = "CAM_PDU_Descriptions"; + } else if (encodingName.equals("LibItsCALMmsap_asn1")) { + _encodingName = "CALMmsap"; + } else if (encodingName.equals("LibItsCALMllsap_asn1")) { + _encodingName = "CALMllsap"; + } else if (encodingName.equals("LibItsFntp_asn1")) { + _encodingName = "CALMfntp"; + } else if (encodingName.equals("LibItsFsap_asn1")) { + _encodingName = "CALMfsap"; + } else if (encodingName.equals("LibItsIicp_asn1")) { + _encodingName = "CALMiitsscu"; + } else { + _encodingName = ""; + } + } + + /** + * This operation decodes message according to the encoding rules and returns a TTCN-3 value. + * The decodingHypothesis shall be used to determine whether the encoded value can be decoded. + * If an encoding rule is not self-sufficient, i.e. if the encoded message does not inherently + * contain its type decodingHypothesis shall be used. If the encoded value can be decoded without + * the decoding hypothesis, the distinct null value shall be returned if the type determined from + * the encoded message is not compatible with the decoding hypothesis + * + * @param message The encoded message to be decoded + * @param decodingHypothesis The hypothesis the decoding can be based on + * @return Returns the decoded value, if the value is of a compatible type as the decodingHypothesis, else the distinct value null + * + * See ETSI ES 201 873-6 V4.2.1 - 7.3.2.2.1 decode + */ + @Override + public Value decode(final TriMessage message, final Type decodingHypothesis) { + _logger.entering("BuiltInCodec", "decode", decodingHypothesis.getName()); + + TriMessageEx msg = TriProvider.getInstance().getTriFactory().createMessageEx(); + msg.setEncodedMessage(message.getEncodedMessage()); + if (_logger.isLoggable(Level.ALL)) ByteHelper.dump("BuiltInCodec.decode: ", msg.getEncodedMessage()); + + String type = String.format("%s.%s", _encodingName, decodingHypothesis.getName()); + _logger.info("Type: " + type); + Type asnOriginalType = getTypeForName(type); + // Check which type class the decoding hypothesis is of + Value value = TciProvider.getInstance().getSystemInterface().internalDecode(msg, asnOriginalType); + _logger.exiting("BuiltInCodec", "decode", value.toString()); + return value; + } + + @Override + public TriMessage encode(final Value template) { + _logger.entering("BuiltInCodec", "encode", template.getType().getName()); + + RecordValue asn1Value = (RecordValue)template; + String type = String.format("%s.%s", _encodingName, template.getType().getName()); + _logger.info("Type: " + type); + Type asnOriginalType = getTypeForName(type); + if (asnOriginalType != null) { + RecordValue internalASNEncodecValue = (RecordValue)asnOriginalType.newInstance(); + String[] fields = internalASNEncodecValue.getFieldNames(); + for(String field: fields) { + _logger.info(String.format("Process field %s", field)); + Value fieldValue = asn1Value.getField(field); + if(fieldValue.notPresent()) { + _logger.info(String.format("Field %s was omitted", field)); + internalASNEncodecValue.setFieldOmitted(field); + } else { + _logger.info(String.format("Field %s was added", field)); + internalASNEncodecValue.setField(field, fieldValue); + } + } // End of 'for' statement + _logger.info("Call internal codec"); + TriMessage msg = TciProvider.getInstance().getSystemInterface().internalEncode(internalASNEncodecValue); + ByteHelper.dump("BuiltInCodec.encode: ", msg.getEncodedMessage()); + _logger.exiting("BuiltInCodec", "encode"); + return msg; + } + + _logger.exiting("BuiltInCodec", "encode", "null"); + return null; + } + + private Type getTypeForName(final String type) { + _logger.entering("BuiltInCodec", "getTypeForName", type); + + Type asnOriginalType = TciProvider.getInstance().getTciCDRequired().getTypeForName(type); + if (asnOriginalType == null) { // Failed with default mechanism, try with External Attributes mechanism +// type = decodingHypothesis.getName(); //FIXME External Attributes mechanism does not work + String type_ = ""; + if (type.endsWith("nfSapPrimitivesUp")) { + type_ = String.format("%s.%s", _encodingName, "NFsapPrimitivesUp"); + } else if (type.endsWith("faSapPrimitivesUp")) { + type_ = String.format("%s.%s", _encodingName, "FAsapPrimitivesUp"); + } else if (type.endsWith("mnRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MN_Request_request"); + } else if (type.endsWith("mfCommandRequest")) { + type_ = String.format("%s.%s", _encodingName, "MF_Command_request"); + } else if (type.endsWith("miCommandRequest")) { + type_ = String.format("%s.%s", _encodingName, "MI_Command_request"); + } else if (type.endsWith("miCommandConfirm")) { + type_ = String.format("%s.%s", _encodingName, "MI_Command_confirm"); + } else if (type.endsWith("miRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MI_Request_request"); + } else if (type.endsWith("miRequestConfirm")) { + type_ = String.format("%s.%s", _encodingName, "MI_Request_confirm"); + } else if (type.endsWith("miSetRequest")) { + type_ = String.format("%s.%s", _encodingName, "MI_Set_request"); + } else if (type.endsWith("miSetConfirm")) { + type_ = String.format("%s.%s", _encodingName, "MI_Set_confirm"); + } else if (type.endsWith("miGetRequest")) { + type_ = String.format("%s.%s", _encodingName, "MI_Get_request"); + } else if (type.endsWith("miGetConfirm")) { + type_ = String.format("%s.%s", _encodingName, "MI_Get_confirm"); + } if (type.endsWith("fntpNPDU")) { + type_ = String.format("%s.%s", _encodingName, "INsapPrimitivesUp"); + } + _logger.info("Type: " + type_); + asnOriginalType = TciProvider.getInstance().getTciCDRequired().getTypeForName(type_); + } + + _logger.exiting("BuiltInCodec", "getTypeForName", asnOriginalType.getName()); + return asnOriginalType; + } // End of method getTypeForName + +} // End of class BuiltInCodec diff --git a/javasrc/tool/org/etsi/its/tool/elvior/CodecsProvider.java b/javasrc/tool/org/etsi/its/tool/elvior/CodecsProvider.java new file mode 100644 index 000000000..69cf5d270 --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/CodecsProvider.java @@ -0,0 +1,67 @@ +//package org.etsi.its.tool.elvior; +// +//import java.lang.reflect.Constructor; +//import java.util.Map; +//import java.util.TreeMap; +// +//import org.elvior.ttcn.tritci.TriTciChannel; +//import org.etsi.its.codec.ItsCodecImpl; +//import org.etsi.its.codec.ttcn.LibItsBtp_TypesAndValues.LibItsBtp_TypesAndValuesCodec; +//import org.etsi.ttcn.tci.TciCDProvided; +//import org.etsi.ttcn.tci.TciCDRequired; +// +//public class CodecsProvider { +// +// /** +// * Unique instance of the factory +// */ +// private static CodecsProvider instance = new CodecsProvider(); +// +// /** +// * List of the registered protocol port types +// */ +// protected Map> codecs = new TreeMap>(); +// +// /** +// * Private constructor (Singleton pattern) +// */ +// private CodecsProvider() { +// codecs.put("BtpReq", LibItsBtp_TypesAndValuesCodec.class); +// codecs.put("BtpInd", LibItsBtp_TypesAndValuesCodec.class); +// //codecs.put("FNTPPDU", CamPort.class); +// } +// +// /** +// * Gets the unique factory instance +// * @return ProtocolPortFactory instance +// */ +// public static CodecsProvider getInstance(){ +// return instance; +// } +// +// /** +// * Creates a new instance of the desired codec +// * @param codecName Name of the codec to implement +// * @return The codec instance +// */ +// public TciCDProvided createInstance(final String codecName) { +// TciCDProvided codec = null; +// Class[] ctorParams = { TriTciChannel.getInstance().getClass() }; +// +// try { +// Class cls = codecs.get(codecName); +// +// if (cls == null) { +// throw new RuntimeException("No class registered under " + codecName); +// } +// codec = new LibItsBtp_TypesAndValuesCodec((TciCDRequired)(TriTciChannel.getInstance())); +//// Constructor ctor = cls.getConstructor(ctorParams); +//// codec = (TciCDProvided) ctor.newInstance((TciCDRequired)(TriTciChannel.getInstance())); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// +// return codec; +// } +// +//} // End of class CodecsProvider diff --git a/javasrc/tool/org/etsi/its/tool/elvior/GetValueStructure.java b/javasrc/tool/org/etsi/its/tool/elvior/GetValueStructure.java new file mode 100644 index 000000000..e2cbc86a9 --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/GetValueStructure.java @@ -0,0 +1,115 @@ +package org.etsi.its.tool.elvior; + +import org.elvior.ttcn.tritci.IntegerValueEx; +import org.etsi.ttcn.tci.BitstringValue; +import org.etsi.ttcn.tci.BooleanValue; +import org.etsi.ttcn.tci.CharstringValue; +import org.etsi.ttcn.tci.EnumeratedValue; +import org.etsi.ttcn.tci.HexstringValue; +import org.etsi.ttcn.tci.OctetstringValue; +import org.etsi.ttcn.tci.RecordOfValue; +import org.etsi.ttcn.tci.RecordValue; +import org.etsi.ttcn.tci.TciTypeClass; +import org.etsi.ttcn.tci.UnionValue; +import org.etsi.ttcn.tci.Value; + +public class GetValueStructure { + + static String indent = null; + static StringBuilder buffer = null; + + static public void displayValueStructure(final Value value) { + buffer = new StringBuilder(); + indent = ""; + LogValueDataStructure(value); + System.out.println(buffer.toString()); + } + + static public String getValueStructure(final Value value) { + buffer = new StringBuilder(); + indent = ""; + LogValueDataStructure(value); + return buffer.toString(); + } + + static private void LogValueDataStructure(final Value value) { + if (value.notPresent()) { + buffer.append(indent + value.getClass().getName() + " : omitted" + "\n"); + return; + } + switch (value.getType().getTypeClass()) { + case TciTypeClass.BOOLEAN: { + BooleanValue bv = (BooleanValue)value; + buffer.append(indent + bv.getClass().getName() + " : " + new java.lang.Boolean(bv.getBoolean()) + "\n"); + } + break; + case TciTypeClass.INTEGER: { + IntegerValueEx iv = (IntegerValueEx)value; + buffer.append(indent + iv.getClass().getName() + " : " + iv.getInt64() + "\n"); + } + break; + case TciTypeClass.CHARSTRING: { + CharstringValue csv = (CharstringValue)value; + buffer.append(indent + csv.getClass().getName() + " : " + csv.getString() + "\n"); + } + break; + case TciTypeClass.BITSTRING: { + BitstringValue bv = (BitstringValue)value; + buffer.append(indent + bv.getClass().getName() + " : " + bv.getString() + "\n"); + } + break; + case TciTypeClass.OCTETSTRING: { + OctetstringValue ov = (OctetstringValue)value; + buffer.append(indent + ov.getClass().getName() + " : " + ov.getString() + "\n"); + } + break; + case TciTypeClass.HEXSTRING: { + HexstringValue hv = (HexstringValue)value; + buffer.append(indent + hv.getClass().getName() + " : " + hv.getString() + "\n"); + } + break; + case TciTypeClass.ENUMERATED: { + EnumeratedValue ev = (EnumeratedValue)value; + buffer.append(indent + ev.getClass().getName() + " : " + ev.getEnum() + "\n"); + } + break; + case TciTypeClass.SET: + // No break; + case TciTypeClass.RECORD: { + RecordValue rv = (RecordValue)value; + buffer.append(indent + rv.getClass().getName() + "\n"); + indent += "\t"; + for (String key : rv.getFieldNames()) { + LogValueDataStructure(rv.getField(key)); + } // End of 'for'statement + indent = indent.substring(0, indent.length() -1); + } + break; + case TciTypeClass.ANYTYPE: + // No break; + case TciTypeClass.UNION: { + UnionValue uv = (UnionValue)value; + buffer.append(indent + uv.getClass().getName() + "\n"); + indent += "\t"; + LogValueDataStructure(uv.getVariant(uv.getPresentVariantName())); + indent = indent.substring(0, indent.length() -1); + } + break; + case TciTypeClass.RECORD_OF: + // No break; + case TciTypeClass.SET_OF: { + RecordOfValue rofv = (RecordOfValue)value; + buffer.append(indent + rofv.getClass().getName() + " : " + rofv.getLength() + "\n"); + indent += "\t"; + for (int key = 0; key < rofv.getLength(); key++) { + LogValueDataStructure(rofv.getField(key)); + } // End of 'for'statement + indent = indent.substring(0, indent.length() -1); + } + break; + default: + throw new RuntimeException("Unimplemented class type: " + value.getType().getTypeClass()); + } // End of 'switch' value + } + +} diff --git a/javasrc/tool/org/etsi/its/tool/elvior/Its_CodecProvider.java b/javasrc/tool/org/etsi/its/tool/elvior/Its_CodecProvider.java index 4746f11cb..3b6a98022 100644 --- a/javasrc/tool/org/etsi/its/tool/elvior/Its_CodecProvider.java +++ b/javasrc/tool/org/etsi/its/tool/elvior/Its_CodecProvider.java @@ -10,11 +10,11 @@ import org.elvior.ttcn.tritci.ChannelEventHandler; import org.elvior.ttcn.tritci.TciProvider; import org.elvior.ttcn.tritci.TriTciChannel; import org.etsi.codec.ITCIRequired; +import org.etsi.codec.ITciCDWrapper; import org.etsi.codec.TciCDWrapperFactory; import org.etsi.tool.elvior.TciCDWrapper; import org.etsi.ttcn.codec.CodecFactory; import org.etsi.ttcn.tci.TciCDProvided; -import org.etsi.ttcn.tci.TciCDRequired; import org.etsi.ttcn.tci.Type; import org.etsi.ttcn.tci.Value; import org.etsi.ttcn.tri.TriMessage; @@ -28,12 +28,16 @@ public class Its_CodecProvider implements TciCDProvided, ChannelEventHandler, IT */ private final static Logger _logger = Logger.getLogger("org.etsi.its"); - private TciCDRequired _cdReq; + private ITciCDWrapper _cdReq; + + private CodecFactory _cf; public Its_CodecProvider() { _logger.entering("Its_CodecProvider", "Its_CodecProvider"); // Load Codec settings + _cdReq = null; + _cf = null; try { _properties.load(MainCodec.class.getResourceAsStream("/org/etsi/its/tool/elvior/res/codec.properties")); } catch (IOException e) { @@ -62,7 +66,27 @@ public class Its_CodecProvider implements TciCDProvided, ChannelEventHandler, IT // Register this object as the receiver of events generated by TestCast framework channel.setEventHandler(this); + initializeCodecs(); + } + + private void initializeCodecs() { TciCDWrapperFactory.getInstance().setImpl(new TciCDWrapper()); + _cdReq = TciCDWrapperFactory.getTciCDInstance(); + + // Register External codecs + _cf = CodecFactory.getInstance(); + // TODO Reuse Build-in codec here + + String[] asn1Codecs = _properties.getProperty("ASN.1Codecs", "").split(","); + for (String codec : asn1Codecs) { + System.out.println("getCodec: " + codec); + String[] paths = _properties.getProperty(codec, "").split(","); + try { + _cf.setExternalCodec(paths[0], (TciCDProvided) Class.forName(paths[1]).newInstance()); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + e.printStackTrace(); + } + } // End of 'foreach' loop } public void run() { @@ -118,7 +142,7 @@ public class Its_CodecProvider implements TciCDProvided, ChannelEventHandler, IT return null; } Value value = codec.decode(message, decodingHypothesis); - _logger.exiting("decode", (value != null) ? value.toString() : "(null)"); + _logger.exiting("Its_CodecProvider.decode", (value != null) ? GetValueStructure.getValueStructure(value) : "(null)"); return value; } @@ -150,6 +174,7 @@ public class Its_CodecProvider implements TciCDProvided, ChannelEventHandler, IT if (codec == null) { return null; } + _logger.info("Value to encode: " + GetValueStructure.getValueStructure(value)); TriMessage res = codec.encode(value); _logger.exiting("encode", res.toString()); return res; @@ -163,34 +188,8 @@ public class Its_CodecProvider implements TciCDProvided, ChannelEventHandler, IT * @return The codec associated to the specified encoding identifier */ @Override - public TciCDProvided getCodec(String encodingName) { - _logger.entering("getCodec", encodingName); - - _cdReq = TciProvider.getInstance().getTciCDRequired(); - - // Register External codecs - CodecFactory cf = CodecFactory.getInstance(); - // TODO Reuse Build-in codec here - - String[] asn1Codecs = _properties.getProperty("ASN.1Codecs", "").split(","); - System.out.println("getCodec: " + asn1Codecs); - for (String codec : asn1Codecs) { - System.out.println("getCodec: " + codec); - String[] paths = _properties.getProperty(codec, "").split(","); - try { - cf.setExternalCodec(paths[0], (TciCDProvided) Class.forName(paths[1]).newInstance()); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { - e.printStackTrace(); - } - } // End of 'foreach' loop -// TODO To be removed -// cf.setExternalCodec("LibItsFntp_asn1", cs.getCodec("LibItsFntp_asn1")); -// cf.setExternalCodec("LibItsFsap_asn1", cs.getCodec("LibItsFsap_asn1")); -// cf.setExternalCodec("LibItsIicp_asn1", cs.getCodec("LibItsIicp_asn1")); -// cf.setExternalCodec("LibItsCALMmsap_asn1", cs.getCodec("LibItsCALMmsap_asn1")); -// cf.setExternalCodec("LibItsCALMllsap_asn1", cs.getCodec("LibItsCALMllsap_asn1")); - //TODO: add V2G external codecs (xsd) - + public TciCDProvided getCodec(final String encodingName) { + // FIXME Remove argument here and in the interface ITCIRequired return new Codec(); } diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMllsap_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMllsap_asn1.java new file mode 100644 index 000000000..707e0da5e --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMllsap_asn1.java @@ -0,0 +1,31 @@ +package org.etsi.its.tool.elvior; + +import org.etsi.ttcn.tci.Type; + +public class LibItsCALMllsap_asn1 extends LibIts_asn1 { + + /** + * Constructor + */ + public LibItsCALMllsap_asn1() { + _logger.entering("LibItsCALMllsap_asn1", "LibItsCALMllsap_asn1"); + _encodingName = "CALMllsap"; + } + + protected Type getTypeForName(final String type) { + _logger.entering("LibItsCALMllsap_asn1", "getTypeForName", type); + + String type_ = type; + if (type.endsWith("mnRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MN_Request_request"); + } else if (type.endsWith("msgIn_in")) { + type_ = String.format("%s.%s", _encodingName, "INsapPrimitivesDown"); + } + + Type asnOriginalType = super.getTypeForName(type_); + + _logger.exiting("LibItsCALMllsap_asn1", "getTypeForName", asnOriginalType.getName()); + return asnOriginalType; + } // End of method getTypeForName + +} // End of class LibItsCALMllsap_asn1 diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMmsap_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMmsap_asn1.java new file mode 100644 index 000000000..cc3e1265e --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibItsCALMmsap_asn1.java @@ -0,0 +1,41 @@ +package org.etsi.its.tool.elvior; + +import org.etsi.ttcn.tci.Type; + +public class LibItsCALMmsap_asn1 extends LibIts_asn1 { + + /** + * Constructor + */ + public LibItsCALMmsap_asn1() { + _logger.entering("LibItsCALMmsap_asn1", "LibItsCALMmsap_asn1"); + _encodingName = "CALMmsap"; + } + + protected Type getTypeForName(final String type) { + _logger.entering("LibItsCALMmsap_asn1", "getTypeForName", type); + + String type_ = type; + if (type.endsWith("mfRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MF_Request_request"); + } else if (type.endsWith("mnRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MN_Request_request"); + } else if (type.endsWith("miRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MI_Request_request"); + } else if (type.endsWith("mf_Command_request")) { + type_ = String.format("%s.%s", _encodingName, "MF_Command_request"); + } else if (type.endsWith("mn_Command_request")) { + type_ = String.format("%s.%s", _encodingName, "MN_Command_request"); + } else if (type.endsWith("mi_Command_request")) { + type_ = String.format("%s.%s", _encodingName, "MI_Command_request"); + } else if (type.endsWith("faSapPrimitivesUp")) { + type_ = String.format("%s.%s", _encodingName, "FAsapPrimitivesUp"); + } + + Type asnOriginalType = super.getTypeForName(type_); + + _logger.exiting("LibItsCALMmsap_asn1", "getTypeForName", asnOriginalType.getName()); + return asnOriginalType; + } // End of method getTypeForName + +} // End of class LibItsCALMmsap_asn1 diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibItsCam_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibItsCam_asn1.java index 2000fa157..baba72005 100644 --- a/javasrc/tool/org/etsi/its/tool/elvior/LibItsCam_asn1.java +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibItsCam_asn1.java @@ -8,7 +8,6 @@ package org.etsi.its.tool.elvior; */ public class LibItsCam_asn1 extends LibIts_asn1 { - /** * Constructor */ @@ -17,4 +16,4 @@ public class LibItsCam_asn1 extends LibIts_asn1 { _encodingName = "CAM_PDU_Descriptions"; } -} // End of class BuiltInCodec +} // End of class LibItsCam_asn1 diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibItsFntp_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibItsFntp_asn1.java new file mode 100644 index 000000000..5810e8e45 --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibItsFntp_asn1.java @@ -0,0 +1,33 @@ +package org.etsi.its.tool.elvior; + +import org.etsi.ttcn.tci.Type; + +public class LibItsFntp_asn1 extends LibIts_asn1 { + + /** + * Constructor + */ + public LibItsFntp_asn1() { + _logger.entering("LibItsFntp_asn1", "LibItsFntp_asn1"); + _encodingName = "CALMfntp"; + } + + protected Type getTypeForName(final String type) { + _logger.entering("LibItsFntp_asn1", "getTypeForName", type); + + String type_ = type; + if (type.endsWith("nfSapPrimitivesUp")) { + type_ = String.format("%s.%s", _encodingName, "NFsapPrimitivesUp"); + } else if (type.endsWith("mnRequestRequest")) { + type_ = String.format("%s.%s", _encodingName, "MN_Request_request"); + } else if (type.endsWith("msgIn_nf")) { + type_ = String.format("%s.%s", _encodingName, "NFsapPrimitivesDown"); + } + + Type asnOriginalType = super.getTypeForName(type_); + + _logger.exiting("LibItsFntp_asn1", "getTypeForName", asnOriginalType.getName()); + return asnOriginalType; + } // End of method getTypeForName + +} // End of class LibItsFntp_asn1 diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibItsFsap_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibItsFsap_asn1.java new file mode 100644 index 000000000..f7307f6d7 --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibItsFsap_asn1.java @@ -0,0 +1,13 @@ +package org.etsi.its.tool.elvior; + +public class LibItsFsap_asn1 extends LibIts_asn1 { + + /** + * Constructor + */ + public LibItsFsap_asn1() { + _logger.entering("LibItsFsap_asn1", "LibItsFsap_asn1"); + _encodingName = "CALMfsap"; + } + +} // End of class LibItsFsap_asn1 diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibItsIicp_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibItsIicp_asn1.java new file mode 100644 index 000000000..7b0744bcc --- /dev/null +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibItsIicp_asn1.java @@ -0,0 +1,33 @@ +package org.etsi.its.tool.elvior; + +import org.etsi.ttcn.tci.Type; + +public class LibItsIicp_asn1 extends LibIts_asn1 { + + /** + * Constructor + */ + public LibItsIicp_asn1() { + _logger.entering("LibItsIicp_asn1", "LibItsIicp_asn1"); + _encodingName = "CALMiitsscu"; + } + + protected Type getTypeForName(final String type) { + _logger.entering("LibItsIicp_asn1", "getTypeForName", type); + + String type_ = type; + if (type.endsWith("msg_req")) { + type_ = String.format("%s.%s", _encodingName, "IIC_Request"); + } else if (type.endsWith("msg_resp")) { + type_ = String.format("%s.%s", _encodingName, "IIC_Response"); + } else if (type.endsWith("mcmdRq")) { + type_ = String.format("%s.%s", _encodingName, "McmdRq"); + } + + Type asnOriginalType = super.getTypeForName(type_); + + _logger.exiting("LibItsIicp_asn1", "getTypeForName", asnOriginalType.getName()); + return asnOriginalType; + } // End of method getTypeForName + +} // End of class LibItsIicp_asn1 diff --git a/javasrc/tool/org/etsi/its/tool/elvior/LibIts_asn1.java b/javasrc/tool/org/etsi/its/tool/elvior/LibIts_asn1.java index 652a43e08..d9938510b 100644 --- a/javasrc/tool/org/etsi/its/tool/elvior/LibIts_asn1.java +++ b/javasrc/tool/org/etsi/its/tool/elvior/LibIts_asn1.java @@ -3,12 +3,14 @@ package org.etsi.its.tool.elvior; import java.util.logging.Level; import java.util.logging.Logger; +import org.elvior.ttcn.tritci.IntegerValueEx; import org.elvior.ttcn.tritci.TciProvider; import org.elvior.ttcn.tritci.TriMessageEx; import org.elvior.ttcn.tritci.TriProvider; import org.etsi.common.ByteHelper; import org.etsi.ttcn.tci.RecordValue; import org.etsi.ttcn.tci.TciCDProvided; +import org.etsi.ttcn.tci.TciTypeClass; import org.etsi.ttcn.tci.Type; import org.etsi.ttcn.tci.Value; import org.etsi.ttcn.tri.TriMessage; @@ -62,7 +64,7 @@ public class LibIts_asn1 implements TciCDProvided { Type asnOriginalType = getTypeForName(type); // Check which type class the decoding hypothesis is of _logger.info("asnOriginalType: " + asnOriginalType.getName()); - Value value = TciProvider.getInstance().getSystemInterface().InternalDecode(msg, asnOriginalType); + Value value = TciProvider.getInstance().getSystemInterface().internalDecode(msg, asnOriginalType); _logger.exiting("LibIts_asn1", "decode", value.toString()); return value; } @@ -71,26 +73,37 @@ public class LibIts_asn1 implements TciCDProvided { public TriMessage encode(final Value template) { _logger.entering("LibIts_asn1", "encode", template.getType().getName()); - RecordValue asn1Value = (RecordValue)template; String type = String.format("%s.%s", _encodingName, template.getType().getName()); _logger.info("Type: " + type); Type asnOriginalType = getTypeForName(type); if (asnOriginalType != null) { - RecordValue internalASNEncodecValue = (RecordValue)asnOriginalType.newInstance(); - String[] fields = internalASNEncodecValue.getFieldNames(); + Value internalASNEncodecValue = null; + switch (template.getType().getTypeClass()) { + case TciTypeClass.RECORD: + internalASNEncodecValue = (RecordValue)asnOriginalType.newInstance(); + String[] fields = ((RecordValue)internalASNEncodecValue).getFieldNames(); + RecordValue asn1Value = (RecordValue)template; for(String field: fields) { _logger.info(String.format("Process field %s", field)); Value fieldValue = asn1Value.getField(field); if(fieldValue.notPresent()) { _logger.info(String.format("Field %s was omitted", field)); - internalASNEncodecValue.setFieldOmitted(field); + ((RecordValue)internalASNEncodecValue).setFieldOmitted(field); } else { _logger.info(String.format("Field %s was added", field)); - internalASNEncodecValue.setField(field, fieldValue); + ((RecordValue)internalASNEncodecValue).setField(field, fieldValue); } } // End of 'for' statement + break; + case TciTypeClass.INTEGER: + internalASNEncodecValue = (IntegerValueEx)asnOriginalType.newInstance(); + ((IntegerValueEx)internalASNEncodecValue).setInt64(((IntegerValueEx)template).getInt64()); + break; + default: + throw new RuntimeException("Unimplemented type " + template.getType().getTypeClass()); + } // End of 'switch' statement _logger.info("Call internal codec"); - TriMessage msg = TciProvider.getInstance().getSystemInterface().InternalEncode(internalASNEncodecValue); + TriMessage msg = TciProvider.getInstance().getSystemInterface().internalEncode(internalASNEncodecValue); ByteHelper.dump("LibIts_asn1.encode: ", msg.getEncodedMessage()); _logger.exiting("LibIts_asn1", "encode"); return msg; diff --git a/javasrc/tool/org/etsi/its/tool/elvior/PluginAdapter.java b/javasrc/tool/org/etsi/its/tool/elvior/PluginAdapter.java index b4e4ae4ce..af3dd1bd8 100644 --- a/javasrc/tool/org/etsi/its/tool/elvior/PluginAdapter.java +++ b/javasrc/tool/org/etsi/its/tool/elvior/PluginAdapter.java @@ -545,5 +545,40 @@ public class PluginAdapter implements TriCommunicationSA, TriCommunicationTE, xT _logger.exiting("PluginAdapter", "exec_getCurrentTime", String.format("Return value: %d", returnValue.getNumberOfBits())); } // End of method exec_getCurrentTime + + @Override + public TriStatus triBeginWait(long arg0, TriComponentId arg1) { + throw new RuntimeException(); + } + + @Override + public TriStatus triNextSampling(long arg0, TriPortId arg1) { + throw new RuntimeException(); + } + + @Override + public TriStatus triReadClock(TriLong arg0) { + throw new RuntimeException(); + } + + @Override + public TriStatus triStartClock(long arg0) { + throw new RuntimeException(); + } + + @Override + public void triSAErrorReq(String arg0) { + throw new RuntimeException(); + } + + @Override + public TriStatus triGetStreamValue(TriComponentId arg0, TriPortId arg1, TriAddress arg2, TriMessage arg3) { + throw new RuntimeException(); + } + + @Override + public TriStatus triSetStreamValue(TriComponentId arg0, TriPortId arg1, TriAddress arg2, TriMessage arg3) { + throw new RuntimeException(); + } } // End of class PluginAdapter diff --git a/javasrc/tool/org/etsi/its/tool/elvior/res/codec.properties b/javasrc/tool/org/etsi/its/tool/elvior/res/codec.properties index 101f09882..ccdffe60e 100644 --- a/javasrc/tool/org/etsi/its/tool/elvior/res/codec.properties +++ b/javasrc/tool/org/etsi/its/tool/elvior/res/codec.properties @@ -1,7 +1,12 @@ # Debug level - Authorized values: OFF, ALL, INFO, SEVERE DEBUG_ENABLED=ALL -ASN.1Codecs=CAM,DENM,CDD +ASN.1Codecs=CAM,DENM,CDD,FNTP,FSAP,MSAP,LLSAP,IICP CAM=LibItsCam_asn1,org.etsi.its.tool.elvior.LibItsCam_asn1 DENM=LibItsDenm_asn1,org.etsi.its.tool.elvior.LibItsDenm_asn1 CDD=LibItsContainer_asn1,org.etsi.its.tool.elvior.LibItsContainer_asn1 +FNTP=LibItsFntp_asn1,org.etsi.its.tool.elvior.LibItsFntp_asn1 +FSAP=LibItsFsap_asn1,org.etsi.its.tool.elvior.LibItsFsap_asn1 +MSAP=LibItsCALMmsap_asn1,org.etsi.its.tool.elvior.LibItsCALMmsap_asn1 +LLSAP=LibItsCALMllsap_asn1,org.etsi.its.tool.elvior.LibItsCALMllsap_asn1 +IICP=LibItsIicp_asn1,org.etsi.its.tool.elvior.LibItsIicp_asn1 \ No newline at end of file diff --git a/javasrc/tool/org/etsi/its/tool/elvior/res/ta.properties b/javasrc/tool/org/etsi/its/tool/elvior/res/ta.properties index 3fd9593c1..e51d02485 100644 --- a/javasrc/tool/org/etsi/its/tool/elvior/res/ta.properties +++ b/javasrc/tool/org/etsi/its/tool/elvior/res/ta.properties @@ -11,24 +11,33 @@ geoNetworkingPort=ETH # Define the port/layer configuration for GeoNetworking over IPv6 ipv6OverGeoNetworkingPort=Debug # Define the port/layer configuration for CALM FNTP -#fntpPort=FNTP/ETH fntpPort=FNTP/UdpIp # Define the port/layer configuration for CALM FSAP -fsapPort=FSAP/ETH fsapPort=FSAP/UdpIp +# Define the port/layer configuration for CALM IICP +iicpPort=IICP/UdpIp +# Define the port/layer configuration for CALM ATSP +atspPort=ATSP/UdpIp -UpperTesterSettings=192.168.122.131:2222 +# IP address of UT +# Home laptop VMWare MAC address +#UpperTesterSettings=192.168.122.131:2222 +# ETSI computer MAC address +#UpperTesterSettings=10.7.6.26:2222 +UpperTesterSettings=127.0.0.1:2222 +ConfigTesterSettings=127.0.0.1:2223 +LowerTesterSettings=127.0.0.1:3750:3751 # Peer ITS station LinkLayer_Peer=DEADBEEF000A - # Define the MAC address of the Ethernet interface connected to the IUT device # Home laptop VMWare MAC address -LocalEthernetMAC=005056C00008 +#LocalEthernetMAC=005056C00008 # Home laptop MAC address -#LocalEthernetMAC=4C80938EDB27 +LocalEthernetMAC=24B6FD17162B # ETSI computer MAC address #LocalEthernetMAC=0022191B7FDB +#LocalEthernetMAC=00FF17628B09 # Define the Ethernet type value used by the IUT IutEthernetTypeValue=0x8947 # Node Ethernet addresses diff --git a/javasrc/tool/org/etsi/tool/elvior/TciCDWrapper.java b/javasrc/tool/org/etsi/tool/elvior/TciCDWrapper.java index bb22e832b..2dcbd9047 100644 --- a/javasrc/tool/org/etsi/tool/elvior/TciCDWrapper.java +++ b/javasrc/tool/org/etsi/tool/elvior/TciCDWrapper.java @@ -31,28 +31,40 @@ public class TciCDWrapper implements ITciCDWrapper { } @Override - public IntegerValue getInteger() { - return (IntegerValue)_tciFactory.getInteger().newInstance(); + public IntegerValue setInteger(final Integer value) { + IntegerValue iv = (IntegerValue)_tciFactory.getInteger().newInstance(); + iv.setInteger(value); + return iv; } @Override - public IntegerValue getBigInteger(final BigInteger bigInt) { - System.out.println(">>> getBigInteger" + bigInt); - IntegerValueEx bi = (IntegerValueEx) _tciFactory.getTypeForName("org.elvior.ttcn.tritci.IntegerValueEx"); // FIXME To be solved with Janek + public int getInteger(final IntegerValue iv) { + return iv.getInteger(); + } + + @Override + public IntegerValue setInteger(final BigInteger value) { + System.out.println(">>> getBigInteger" + value); + IntegerValueEx bi = (IntegerValueEx) _tciFactory.getTypeForName("org.elvior.ttcn.tritci.IntegerValueEx"); if (bi != null) { System.out.println("getBigInteger: then"); - bi.setInt64(bigInt.longValue()); + bi.setInt64(value.longValue()); System.out.println("getBigInteger: bi=" + bi); return (IntegerValue)bi; } else { System.out.println("getBigInteger: else"); IntegerValue i = (IntegerValue) _tciFactory.getInteger().newInstance(); System.out.println("getBigInteger: i=" + i); - i.setInteger(bigInt.intValue()); + i.setInteger(value.intValue()); return i; } } + @Override + public long getBigInteger(final IntegerValue iv) { + return ((IntegerValueEx)iv).getInt64(); + } + @Override public OctetstringValue getOctetstring() { return (OctetstringValue)_tciFactory.getOctetstring().newInstance(); @@ -65,32 +77,31 @@ public class TciCDWrapper implements ITciCDWrapper { @Override public Value getUnionValue(final Type decodingHypothesis, final String variantName) { -// System.out.println(">>> getUnionValue: " + decodingHypothesis.getName()); + System.out.println(">>> getUnionValue: " + decodingHypothesis.getName() + ", " + variantName); String variantTypeName = decodingHypothesis.getDefiningModule().getModuleName() + "." + decodingHypothesis.getName() + "." + variantName; -// System.out.println("getUnionValue: variantTypeName=" + variantTypeName); + System.out.println("variantTypeName is " + variantTypeName); Type variantType = _tciFactory.getTypeForName(variantTypeName); if(variantType != null) { -// System.out.println("Variant Type name is: " + variantType.getName()); -// String moduleBase = variantType.getDefiningModule().getBaseName(); -// System.out.println("Variant Type DefiningModule.BaseName is: " + variantType.getName()); -// String moduleObj = variantType.getDefiningModule().getModuleName(); -// System.out.println("Variant Type DefiningModule.ModuleName is: " + variantType.getName()); Value testVal = variantType.newInstance(); if(testVal != null) { -// System.out.println("Variant value has been created."); + System.out.println("Variant value has been created."); return testVal; } - } else { - System.err.println("variantType is null"); } + System.err.println("variantType is null"); + System.out.println("Variant value hasn't been created."); return null; } @Override public Type getTypeForName(final String type) { - return TciProvider.getInstance().getTciCDRequired().getTypeForName(type); +// return TciProvider.getInstance().getTciCDRequired().getTypeForName(type); + System.out.println("TciCDWrapper.getTypeForName" + type); + Type originalType = TciProvider.getInstance().getTciCDRequired().getTypeForName(type); + System.out.println("TciCDWrapper.getTypeForName" + originalType.getName()); + return originalType; } // End of method getTypeForName } // End of class TciCDWrapper -- GitLab