<segment name="gprsRecord" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.GPRSRecord"> <segment name="pgwRecord" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.PGWRecord">
<field name="sgsnAddressLength" default="0" type="java.lang.Integer" /> <!-- sgsnAddresses --> <segment name="servingNodeAddress" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ServingNodeAddress"> <segment name="seqOf" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.GSNAddress" collection="list" minOccurs="1" occursRef="sgsnAddressLength" > </segment> </segment> <segment name="listOfServiceData" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ListOfServiceData"> <segment name="seqOf" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ChangeOfServiceCondition" collection="list" minOccurs="0" maxOccurs="10"> . . . </segment> </segment> <!-- I have the same segment again here, since I need to save some fields twice into CSV file --> <segment name="listOfServiceData" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ListOfServiceData"> <segment name="seqOf" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ChangeOfServiceCondition" collection="list" minOccurs="1" maxOccurs="10"> <field name="dataVolumeGPRSUplink" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.DataVolumeGPRS" typeHandler="dataVolumeGPRSLinkHandler"/> <field name="dataVolumeGPRSDownlink" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.DataVolumeGPRS" typeHandler="dataVolumeGPRSLinkHandler"/> <field name="changeCondition" type="java.lang.String" typeHandler="changeConditionHandler"/> </segment> </segment>
</segment></segment>
For the first segment I am receiving: "Invalid segment 'seqOf', in segment 'servingNodeAddress' Referenced field 'sgsnAddressLength' must precede this field".Well sgsnAddressLength field already precedes servingNodeAddress.
A segment is a group of fields within a record. Segments are most often used to bind a group of fields to a nested bean object or collection of bean objects, and are configured in a mapping file using a segment element.So from my understanding of segments and records and the quoted part of the documentation above, you have a record inside another record.
Just like repeating fields, if the number of occurrences of a segment is dependent on a preceding field in the same record, the occursRef attribute can be set to the name of the field that controls the number of occurrences.[emphasis mine]. I also think that a nested record can not read a value from it parent via occursRef. From this, if you want to use occursRef the field declaring the value (seqOf) and the segment that then uses this value must be in the same record (or segment).
For the last segment (2nd occurance of listOfServiceData segment) I am receiving: "Invalid segment 'seqOf', in segment 'listOfServiceData', A segment of indeterminate size may not follow another component of indeterminate size".I have written maxOccurs=10 for the last segment, so I am not quite sure how is that indeterminate size?
public class GprsEvent implements Event
{
private GPRSRecord gprsRecord ;
}
public class GPRSRecord implements Serializable
{
private PGWRecord pgwRecord = null;
}
public class PGWRecord implements Serializable
{
// non-complex/non-nested data types
.
.
.
// nested data types - segments in XML file
// First List in the XML example -> name="gsnAddressList"
private ServingNodeAddress servingNodeAddress;
// Second List in the XML example -> name="changeOfServiceConditionList"
private ListOfServiceData listOfServiceData ;
}
// First List in the XML example -> name="gsnAddressList"
public class ServingNodeAddress implements Serializable
{
private List<GSNAddress> gsnAddressList = null;
}
// nested data type class related to Second List in the XML example -> name="changeOfServiceConditionList"
public class ListOfServiceData implements Serializable
{
private List<ChangeOfServiceCondition> changeOfServiceConditionList = null;
}
// nested data type class related to Second List in the XML example -> name="changeOfServiceConditionList"
public class ChangeOfServiceCondition implements Serializable
{
// non-complex/non-nested data types
.
.
.
// nested data type
private EPCQoSInformation qoSInformationNeg = null;
}
// nested data type class related to Second List in the XML example -> name="changeOfServiceConditionList"
public class EPCQoSInformation implements Serializable
{
// non-complex/non-nested data types
private BerInteger qCI = null;
private BerInteger maxRequestedBandwithUL = null;
private BerInteger maxRequestedBandwithDL = null;
private BerInteger guaranteedBitrateUL = null;
private BerInteger guaranteedBitrateDL = null;
private BerInteger aRP = null;
}
<record class="net.atos.tools.radiation.convert.event.gprs.GprsEvent"
name="event" maxOccurs="unbounded" minOccurs="0" order="1">
<segment name="gprsRecord" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.GPRSRecord">
<segment name="pgwRecord" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.PGWRecord">
<segment name="servingNodeAddress" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ServingNodeAddress">
<segment name="gsnAddressList" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.GSNAddress"
collection="list" minOccurs="1" maxOccurs="1" >
</segment>
</segment>
<segment name="listOfServiceData" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ListOfServiceData">
<segment name="changeOfServiceConditionList" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ChangeOfServiceCondition"
collection="list" minOccurs="0" maxOccurs="10">
.
. <!-- fields -->
.
<segment name="qoSInformationNeg" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.EPCQoSInformation">
<field name="qCI" type="org.openmuc.jasn1.ber.types.BerInteger" typeHandler="berIntegerHandler"/>
<field name="maxRequestedBandwithUL" type="org.openmuc.jasn1.ber.types.BerInteger" typeHandler="berIntegerHandler"/>
<field name="maxRequestedBandwithDL" type="org.openmuc.jasn1.ber.types.BerInteger" typeHandler="berIntegerHandler"/>
<field name="guaranteedBitrateUL" type="org.openmuc.jasn1.ber.types.BerInteger" typeHandler="berIntegerHandler"/>
<field name="guaranteedBitrateDL" type="org.openmuc.jasn1.ber.types.BerInteger" typeHandler="berIntegerHandler"/>
<field name="aRP" type="org.openmuc.jasn1.ber.types.BerInteger" typeHandler="berIntegerHandler"/>
</segment>
<field name="datavolumeFBCUplink" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.DataVolumeGPRS" typeHandler="dataVolumeGPRSLinkHandler"/>
<field name="datavolumeFBCDownlink" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.DataVolumeGPRS" typeHandler="dataVolumeGPRSLinkHandler"/>
<field name="serviceConditionChange" type="java.lang.String" typeHandler="changeConditionHandler"/>
.
. <!-- fields -->
.
</segment>
</segment>
<segment name="listOfServiceData" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ListOfServiceData">
<segment name="changeOfServiceConditionList" class="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.ChangeOfServiceCondition"
collection="list" minOccurs="1" maxOccurs="1">
<!-- again the same fields as above, since I have to store them twice -->
<field name="datavolumeFBCUplink" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.DataVolumeGPRS" typeHandler="dataVolumeGPRSLinkHandler"/>
<field name="datavolumeFBCDownlink" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.DataVolumeGPRS" typeHandler="dataVolumeGPRSLinkHandler"/>
<field name="serviceConditionChange" type="java.lang.String" typeHandler="changeConditionHandler"/>
</segment>
</segment>
</segment>
</segment>
</record> Date date; java.text.SimpleDateFormat outputSimpleDateFormatter = new SimpleDateFormat(OUTPUT_TIME_STAMP_PATTERN); try { SimpleDateFormat simpleDateFormat = GRAMMAR_EVENT_VALUE_TIMESTAMP_DISPLAY_FORMAT.get(); if ( utcTimeStamp.contains(PLUS_SIGN_ASCII_HEX_VALUE) ) { date = simpleDateFormat.parse(utcTimeStamp.replace(PLUS_SIGN_ASCII_HEX_VALUE, UTC_PLUS)); } else { date = simpleDateFormat.parse(utcTimeStamp.replace(MINUS_SIGN_ASCII_HEX_VALUE, UTC_MINUS)); }
return outputSimpleDateFormatter.format(date); } catch (java.text.ParseException e) { throw new ConvertException("Error while converting UTC Time Stamp."); }<typeHandler name="timeStampHandler" class="net.atos.tools.radiation.convert.type.TimeStampHandler"> <property name="pattern" value="yyyy-MM-dd HH:mm:ss" /> <property name="timeZoneId" value="Europe/Zagreb" /></typeHandler><field name="recordOpeningTime" type="net.atos.tools.radiation.convert.event.ggsn.egcdr.ggsn.charging.datatypes.TimeStamp" ypeHandler="timeStampHandler" />