Hex Artifact Content
Not logged in

Artifact 5ea2e633b62f72b11958c7a72fda467862655361:


0000: 70 61 63 6b 61 67 65 20 6f 72 67 2e 69 6e 74 65  package org.inte
0010: 72 6c 65 64 67 65 72 2e 63 6f 64 65 63 73 2e 6f  rledger.codecs.o
0020: 65 72 2e 69 6c 70 3b 0a 0a 69 6d 70 6f 72 74 20  er.ilp;..import 
0030: 6f 72 67 2e 69 6e 74 65 72 6c 65 64 67 65 72 2e  org.interledger.
0040: 49 6e 74 65 72 6c 65 64 67 65 72 41 64 64 72 65  InterledgerAddre
0050: 73 73 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 69  ss;.import org.i
0060: 6e 74 65 72 6c 65 64 67 65 72 2e 63 6f 64 65 63  nterledger.codec
0070: 73 2e 43 6f 64 65 63 3b 0a 69 6d 70 6f 72 74 20  s.Codec;.import 
0080: 6f 72 67 2e 69 6e 74 65 72 6c 65 64 67 65 72 2e  org.interledger.
0090: 63 6f 64 65 63 73 2e 43 6f 64 65 63 43 6f 6e 74  codecs.CodecCont
00a0: 65 78 74 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e  ext;.import org.
00b0: 69 6e 74 65 72 6c 65 64 67 65 72 2e 63 6f 64 65  interledger.code
00c0: 63 73 2e 49 6e 74 65 72 6c 65 64 67 65 72 50 72  cs.InterledgerPr
00d0: 6f 74 6f 63 6f 6c 45 72 72 6f 72 43 6f 64 65 63  otocolErrorCodec
00e0: 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 69 6e 74  ;.import org.int
00f0: 65 72 6c 65 64 67 65 72 2e 63 6f 64 65 63 73 2e  erledger.codecs.
0100: 6f 65 72 2e 4f 65 72 47 65 6e 65 72 61 6c 69 7a  oer.OerGeneraliz
0110: 65 64 54 69 6d 65 43 6f 64 65 63 2e 4f 65 72 47  edTimeCodec.OerG
0120: 65 6e 65 72 61 6c 69 7a 65 64 54 69 6d 65 3b 0a  eneralizedTime;.
0130: 69 6d 70 6f 72 74 20 6f 72 67 2e 69 6e 74 65 72  import org.inter
0140: 6c 65 64 67 65 72 2e 63 6f 64 65 63 73 2e 6f 65  ledger.codecs.oe
0150: 72 2e 4f 65 72 49 41 35 53 74 72 69 6e 67 43 6f  r.OerIA5StringCo
0160: 64 65 63 2e 4f 65 72 49 41 35 53 74 72 69 6e 67  dec.OerIA5String
0170: 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 69 6e 74  ;.import org.int
0180: 65 72 6c 65 64 67 65 72 2e 63 6f 64 65 63 73 2e  erledger.codecs.
0190: 6f 65 72 2e 4f 65 72 4f 63 74 65 74 53 74 72 69  oer.OerOctetStri
01a0: 6e 67 43 6f 64 65 63 2e 4f 65 72 4f 63 74 65 74  ngCodec.OerOctet
01b0: 53 74 72 69 6e 67 3b 0a 69 6d 70 6f 72 74 20 6f  String;.import o
01c0: 72 67 2e 69 6e 74 65 72 6c 65 64 67 65 72 2e 63  rg.interledger.c
01d0: 6f 64 65 63 73 2e 6f 65 72 2e 4f 65 72 53 65 71  odecs.oer.OerSeq
01e0: 75 65 6e 63 65 4f 66 41 64 64 72 65 73 73 43 6f  uenceOfAddressCo
01f0: 64 65 63 2e 4f 65 72 53 65 71 75 65 6e 63 65 4f  dec.OerSequenceO
0200: 66 41 64 64 72 65 73 73 3b 0a 69 6d 70 6f 72 74  fAddress;.import
0210: 20 6f 72 67 2e 69 6e 74 65 72 6c 65 64 67 65 72   org.interledger
0220: 2e 63 6f 64 65 63 73 2e 70 61 63 6b 65 74 74 79  .codecs.packetty
0230: 70 65 73 2e 49 6e 74 65 72 6c 65 64 67 65 72 50  pes.InterledgerP
0240: 61 63 6b 65 74 54 79 70 65 3b 0a 69 6d 70 6f 72  acketType;.impor
0250: 74 20 6f 72 67 2e 69 6e 74 65 72 6c 65 64 67 65  t org.interledge
0260: 72 2e 69 6c 70 2e 49 6e 74 65 72 6c 65 64 67 65  r.ilp.Interledge
0270: 72 50 72 6f 74 6f 63 6f 6c 45 72 72 6f 72 3b 0a  rProtocolError;.
0280: 69 6d 70 6f 72 74 20 6f 72 67 2e 69 6e 74 65 72  import org.inter
0290: 6c 65 64 67 65 72 2e 69 6c 70 2e 49 6e 74 65 72  ledger.ilp.Inter
02a0: 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f 6c 45 72  ledgerProtocolEr
02b0: 72 6f 72 2e 45 72 72 6f 72 43 6f 64 65 3b 0a 0a  ror.ErrorCode;..
02c0: 69 6d 70 6f 72 74 20 6a 61 76 61 2e 69 6f 2e 49  import java.io.I
02d0: 4f 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f  OException;.impo
02e0: 72 74 20 6a 61 76 61 2e 69 6f 2e 49 6e 70 75 74  rt java.io.Input
02f0: 53 74 72 65 61 6d 3b 0a 69 6d 70 6f 72 74 20 6a  Stream;.import j
0300: 61 76 61 2e 69 6f 2e 4f 75 74 70 75 74 53 74 72  ava.io.OutputStr
0310: 65 61 6d 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61  eam;.import java
0320: 2e 74 69 6d 65 2e 49 6e 73 74 61 6e 74 3b 0a 69  .time.Instant;.i
0330: 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e  mport java.util.
0340: 4c 69 73 74 3b 0a 69 6d 70 6f 72 74 20 6a 61 76  List;.import jav
0350: 61 2e 75 74 69 6c 2e 4f 62 6a 65 63 74 73 3b 0a  a.util.Objects;.
0360: 0a 2f 2a 2a 0a 20 2a 20 3c 70 3e 41 6e 20 69 6d  ./**. * <p>An im
0370: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0380: 7b 40 6c 69 6e 6b 20 43 6f 64 65 63 7d 20 74 68  {@link Codec} th
0390: 61 74 20 72 65 61 64 73 20 61 6e 64 20 77 72 69  at reads and wri
03a0: 74 65 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  tes instances of
03b0: 20 7b 40 6c 69 6e 6b 0a 20 2a 20 49 6e 74 65 72   {@link. * Inter
03c0: 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f 6c 45 72  ledgerProtocolEr
03d0: 72 6f 72 7d 2e 3c 2f 70 3e 0a 20 2a 0a 20 2a 20  ror}.</p>. *. * 
03e0: 3c 70 3e 54 68 65 20 41 53 4e 2e 31 20 4f 45 52  <p>The ASN.1 OER
03f0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61   definition of a
0400: 6e 20 49 6e 74 65 72 6c 65 64 67 65 72 50 72 6f  n InterledgerPro
0410: 74 6f 63 6f 6c 45 72 72 6f 72 20 64 65 66 69 6e  tocolError defin
0420: 65 73 20 69 74 20 61 73 20 61 6e 20 65 78 74 65  es it as an exte
0430: 6e 73 69 62 6c 65 20 73 65 71 75 65 6e 63 65 2e  nsible sequence.
0440: 0a 20 2a 20 54 68 75 73 2c 20 74 68 69 73 20 73  . * Thus, this s
0450: 65 71 75 65 6e 63 65 20 6d 75 73 74 20 68 61 76  equence must hav
0460: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
0470: 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 3c 70 3e 3c   </p>. *. * <p><
0480: 62 3e 50 72 65 73 65 6e 63 65 20 42 69 74 6d 61  b>Presence Bitma
0490: 70 3c 2f 62 3e 20 54 68 65 20 70 72 65 73 65 6e  p</b> The presen
04a0: 63 65 20 62 69 74 6d 61 70 20 69 73 20 65 6e 63  ce bitmap is enc
04b0: 6f 64 65 64 20 61 73 20 61 20 22 62 69 74 20 73  oded as a "bit s
04c0: 74 72 69 6e 67 22 20 77 69 74 68 20 61 20 66 69  tring" with a fi
04d0: 78 65 64 20 73 69 7a 65 0a 20 2a 20 63 6f 6e 73  xed size. * cons
04e0: 74 72 61 69 6e 74 2c 20 61 6e 64 20 68 61 73 20  traint, and has 
04f0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
0500: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 65   field of the se
0510: 71 75 65 6e 63 65 20 74 79 70 65 20 74 68 61 74  quence type that
0520: 20 68 61 73 20 74 68 65 20 6b 65 79 77 6f 72 64   has the keyword
0530: 20 4f 50 54 49 4f 4e 41 4c 20 6f 72 0a 20 2a 20   OPTIONAL or. * 
0540: 44 45 46 41 55 4c 54 2c 20 69 6e 20 73 70 65 63  DEFAULT, in spec
0550: 69 66 69 63 61 74 69 6f 6e 20 6f 72 64 65 72 2e  ification order.
0560: 20 42 65 63 61 75 73 65 20 74 68 65 20 49 6e 74   Because the Int
0570: 65 72 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f 6c  erledgerProtocol
0580: 45 72 72 6f 72 20 68 61 73 20 6e 6f 20 6f 70 74  Error has no opt
0590: 69 6f 6e 61 6c 2f 64 65 66 61 75 6c 74 0a 20 2a  ional/default. *
05a0: 20 76 61 6c 75 65 73 2c 20 74 68 65 72 65 20 69   values, there i
05b0: 73 20 6e 6f 20 70 72 65 73 65 6e 63 65 20 62 69  s no presence bi
05c0: 74 6d 61 70 2e 20 41 73 20 61 6e 20 65 78 61 6d  tmap. As an exam
05d0: 70 6c 65 20 6f 66 20 74 68 69 73 2c 20 72 65 66  ple of this, ref
05e0: 65 72 65 6e 63 65 20 22 4f 76 65 72 76 69 65 77  erence "Overview
05f0: 20 6f 66 20 4f 45 52 20 45 6e 63 6f 64 69 6e 67   of OER Encoding
0600: 22 2c 0a 20 2a 20 65 78 61 6d 70 6c 65 20 42 2c  ",. * example B,
0610: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 73 20   which also has 
0620: 6e 6f 20 70 72 65 73 65 6e 63 65 20 62 69 74 6d  no presence bitm
0630: 61 70 20 73 69 6e 63 65 20 6e 6f 20 66 69 65 6c  ap since no fiel
0640: 64 73 20 61 72 65 20 6f 70 74 69 6f 6e 61 6c 2f  ds are optional/
0650: 64 65 66 61 75 6c 74 2e 3c 2f 70 3e 0a 20 2a 0a  default.</p>. *.
0660: 20 2a 20 3c 70 3e 3c 62 3e 45 78 74 65 6e 73 69   * <p><b>Extensi
0670: 6f 6e 20 50 72 65 73 65 6e 63 65 20 42 69 74 6d  on Presence Bitm
0680: 61 70 3c 2f 62 3e 20 54 68 69 73 20 69 6d 70 6c  ap</b> This impl
0690: 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
06a0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
06b0: 70 70 6f 72 74 20 65 78 74 65 6e 73 69 6f 6e 73  pport extensions
06c0: 2c 0a 20 2a 20 61 6e 64 20 74 68 65 72 65 66 6f  ,. * and therefo
06d0: 72 65 20 64 6f 65 73 20 6e 6f 74 20 65 6e 63 6f  re does not enco
06e0: 64 65 20 6e 6f 72 20 64 65 63 6f 64 65 20 61 6e  de nor decode an
06f0: 20 22 65 78 74 65 6e 73 69 6f 6e 20 70 72 65 73   "extension pres
0700: 65 6e 63 65 20 62 69 74 6d 61 70 22 2e 20 49 66  ence bitmap". If
0710: 20 69 74 20 64 69 64 2c 20 69 6e 20 6f 72 64 65   it did, in orde
0720: 72 20 74 6f 0a 20 2a 20 69 6e 64 69 63 61 74 65  r to. * indicate
0730: 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74   an extension, t
0740: 68 65 20 70 72 65 73 65 6e 63 65 20 62 69 74 6d  he presence bitm
0750: 61 70 20 6d 75 73 74 20 62 65 20 70 72 65 73 65  ap must be prese
0760: 6e 74 2c 20 61 6e 64 20 74 68 65 20 4d 53 42 20  nt, and the MSB 
0770: 6f 66 20 74 68 65 20 62 69 74 6d 61 70 20 6d 75  of the bitmap mu
0780: 73 74 20 62 65 20 31 2c 0a 20 2a 20 61 6e 64 20  st be 1,. * and 
0790: 66 75 72 74 68 65 72 20 72 75 6c 65 73 2e 20 52  further rules. R
07a0: 65 66 65 72 65 6e 63 65 20 73 65 63 74 69 6f 6e  eference section
07b0: 20 32 2e 38 20 22 45 6e 63 6f 64 69 6e 67 20 6f   2.8 "Encoding o
07c0: 66 20 61 20 53 65 71 75 65 6e 63 65 20 54 79 70  f a Sequence Typ
07d0: 65 22 20 69 6e 20 22 4f 76 65 72 76 69 65 77 20  e" in "Overview 
07e0: 6f 66 20 4f 45 52 22 20 66 6f 72 0a 20 2a 20 6d  of OER" for. * m
07f0: 6f 72 65 20 64 65 74 61 69 6c 73 2e 20 3c 2f 70  ore details. </p
0800: 3e 0a 20 2a 0a 20 2a 20 3c 70 3e 3c 62 3e 43 6f  >. *. * <p><b>Co
0810: 6d 70 6f 6e 65 6e 74 73 3c 2f 62 3e 20 54 68 65  mponents</b> The
0820: 20 72 65 73 74 20 6f 66 20 74 68 65 20 70 61 63   rest of the pac
0830: 6b 65 74 20 69 73 20 74 68 65 20 63 6f 6e 63 61  ket is the conca
0840: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  tenation of the 
0850: 65 6e 63 6f 64 69 6e 67 73 20 6f 66 20 74 68 65  encodings of the
0860: 20 66 69 65 6c 64 73 0a 20 2a 20 6f 66 20 74 68   fields. * of th
0870: 65 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 20  e sequence type 
0880: 74 68 61 74 20 61 72 65 20 70 72 65 73 65 6e 74  that are present
0890: 20 69 6e 20 74 68 65 20 76 61 6c 75 65 2c 20 69   in the value, i
08a0: 6e 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  n specification 
08b0: 6f 72 64 65 72 2e 20 3c 2f 70 3e 0a 20 2a 0a 20  order. </p>. *. 
08c0: 2a 20 40 73 65 65 20 22 68 74 74 70 3a 2f 2f 77  * @see "http://w
08d0: 77 77 2e 6f 73 73 2e 63 6f 6d 2f 61 73 6e 31 2f  ww.oss.com/asn1/
08e0: 72 65 73 6f 75 72 63 65 73 2f 62 6f 6f 6b 73 2d  resources/books-
08f0: 77 68 69 74 65 70 61 70 65 72 73 2d 70 75 62 73  whitepapers-pubs
0900: 2f 4f 76 65 72 76 69 65 77 25 32 30 6f 66 25 32  /Overview%20of%2
0910: 30 4f 45 52 2e 70 64 66 22 0a 20 2a 2f 0a 70 75  0OER.pdf". */.pu
0920: 62 6c 69 63 20 63 6c 61 73 73 20 49 6e 74 65 72  blic class Inter
0930: 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f 6c 50 72  ledgerProtocolPr
0940: 6f 74 6f 63 6f 6c 45 72 72 6f 72 4f 65 72 43 6f  otocolErrorOerCo
0950: 64 65 63 20 69 6d 70 6c 65 6d 65 6e 74 73 20 49  dec implements I
0960: 6e 74 65 72 6c 65 64 67 65 72 50 72 6f 74 6f 63  nterledgerProtoc
0970: 6f 6c 45 72 72 6f 72 43 6f 64 65 63 20 7b 0a 0a  olErrorCodec {..
0980: 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20 70 75    @Override.  pu
0990: 62 6c 69 63 20 49 6e 74 65 72 6c 65 64 67 65 72  blic Interledger
09a0: 50 72 6f 74 6f 63 6f 6c 45 72 72 6f 72 20 72 65  ProtocolError re
09b0: 61 64 28 66 69 6e 61 6c 20 43 6f 64 65 63 43 6f  ad(final CodecCo
09c0: 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 20 66  ntext context, f
09d0: 69 6e 61 6c 20 49 6e 70 75 74 53 74 72 65 61 6d  inal InputStream
09e0: 20 69 6e 70 75 74 53 74 72 65 61 6d 29 0a 20 20   inputStream).  
09f0: 20 20 20 20 74 68 72 6f 77 73 20 49 4f 45 78 63      throws IOExc
0a00: 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 4f 62 6a  eption {.    Obj
0a10: 65 63 74 73 2e 72 65 71 75 69 72 65 4e 6f 6e 4e  ects.requireNonN
0a20: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
0a30: 20 20 4f 62 6a 65 63 74 73 2e 72 65 71 75 69 72    Objects.requir
0a40: 65 4e 6f 6e 4e 75 6c 6c 28 69 6e 70 75 74 53 74  eNonNull(inputSt
0a50: 72 65 61 6d 29 3b 0a 0a 20 20 20 20 2f 2f 20 31  ream);..    // 1
0a60: 2e 20 49 6e 74 65 72 6c 65 64 67 65 72 50 72 6f  . InterledgerPro
0a70: 74 6f 63 6f 6c 45 72 72 6f 72 20 68 61 73 20 6e  tocolError has n
0a80: 6f 20 22 70 72 65 73 65 6e 63 65 20 62 69 74 6d  o "presence bitm
0a90: 61 70 22 2e 20 53 65 65 20 6a 61 76 61 64 6f 63  ap". See javadoc
0aa0: 20 66 6f 72 20 74 68 69 73 20 63 6c 61 73 73 20   for this class 
0ab0: 66 6f 72 20 6d 6f 72 65 0a 20 20 20 20 2f 2f 20  for more.    // 
0ac0: 64 65 74 61 69 6c 73 2e 0a 0a 20 20 20 20 2f 2f  details...    //
0ad0: 20 32 2e 20 49 6e 74 65 72 6c 65 64 67 65 72 50   2. InterledgerP
0ae0: 72 6f 74 6f 63 6f 6c 45 72 72 6f 72 20 68 61 73  rotocolError has
0af0: 20 6e 6f 20 22 65 78 74 65 6e 73 69 6f 6e 20 70   no "extension p
0b00: 72 65 73 65 6e 63 65 20 62 69 74 6d 61 70 22 2e  resence bitmap".
0b10: 20 53 65 65 20 6a 61 76 61 64 6f 63 20 66 6f 72   See javadoc for
0b20: 20 74 68 69 73 20 63 6c 61 73 73 0a 20 20 20 20   this class.    
0b30: 2f 2f 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61  // for more deta
0b40: 69 6c 73 2e 0a 0a 20 20 20 20 2f 2f 20 33 2e 20  ils...    // 3. 
0b50: 52 65 61 64 20 74 68 65 20 63 6f 64 65 2c 20 77  Read the code, w
0b60: 68 69 63 68 20 69 73 20 61 6e 20 49 41 35 53 74  hich is an IA5St
0b70: 72 69 6e 67 2e 0a 20 20 20 20 66 69 6e 61 6c 20  ring..    final 
0b80: 53 74 72 69 6e 67 20 63 6f 64 65 20 3d 20 63 6f  String code = co
0b90: 6e 74 65 78 74 2e 72 65 61 64 28 4f 65 72 49 41  ntext.read(OerIA
0ba0: 35 53 74 72 69 6e 67 2e 63 6c 61 73 73 2c 20 69  5String.class, i
0bb0: 6e 70 75 74 53 74 72 65 61 6d 29 2e 67 65 74 56  nputStream).getV
0bc0: 61 6c 75 65 28 29 3b 0a 0a 20 20 20 20 2f 2f 20  alue();..    // 
0bd0: 34 2e 20 52 65 61 64 20 74 68 65 20 6e 61 6d 65  4. Read the name
0be0: 2c 20 77 68 69 63 68 20 69 73 20 61 20 49 41 35  , which is a IA5
0bf0: 53 74 72 69 6e 67 2e 0a 20 20 20 20 66 69 6e 61  String..    fina
0c00: 6c 20 53 74 72 69 6e 67 20 6e 61 6d 65 20 3d 20  l String name = 
0c10: 63 6f 6e 74 65 78 74 2e 72 65 61 64 28 4f 65 72  context.read(Oer
0c20: 49 41 35 53 74 72 69 6e 67 2e 63 6c 61 73 73 2c  IA5String.class,
0c30: 20 69 6e 70 75 74 53 74 72 65 61 6d 29 2e 67 65   inputStream).ge
0c40: 74 56 61 6c 75 65 28 29 3b 0a 0a 20 20 20 20 66  tValue();..    f
0c50: 69 6e 61 6c 20 45 72 72 6f 72 43 6f 64 65 20 65  inal ErrorCode e
0c60: 72 72 6f 72 43 6f 64 65 20 3d 20 45 72 72 6f 72  rrorCode = Error
0c70: 43 6f 64 65 2e 6f 66 28 63 6f 64 65 2c 20 6e 61  Code.of(code, na
0c80: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2f 20 35 2e 20  me);..    // 5. 
0c90: 52 65 61 64 20 74 68 65 20 74 72 69 67 67 65 72  Read the trigger
0ca0: 65 64 42 79 20 61 64 64 72 65 73 73 2c 20 77 68  edBy address, wh
0cb0: 69 63 68 20 69 73 20 61 6e 20 49 6e 74 65 72 6c  ich is an Interl
0cc0: 65 64 67 65 72 41 64 64 72 65 73 73 0a 20 20 20  edgerAddress.   
0cd0: 20 66 69 6e 61 6c 20 49 6e 74 65 72 6c 65 64 67   final Interledg
0ce0: 65 72 41 64 64 72 65 73 73 20 74 72 69 67 67 65  erAddress trigge
0cf0: 72 65 64 42 79 41 64 64 72 65 73 73 20 3d 0a 20  redByAddress =. 
0d00: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 72         context.r
0d10: 65 61 64 28 49 6e 74 65 72 6c 65 64 67 65 72 41  ead(InterledgerA
0d20: 64 64 72 65 73 73 2e 63 6c 61 73 73 2c 20 69 6e  ddress.class, in
0d30: 70 75 74 53 74 72 65 61 6d 29 3b 0a 0a 20 20 20  putStream);..   
0d40: 20 2f 2f 20 36 2e 20 52 65 61 64 20 74 68 65 20   // 6. Read the 
0d50: 66 6f 72 77 61 72 64 65 64 42 79 2c 77 68 69 63  forwardedBy,whic
0d60: 68 20 69 73 20 61 20 53 45 51 55 45 4e 43 45 20  h is a SEQUENCE 
0d70: 4f 46 20 49 6e 74 65 72 6c 65 64 67 65 72 41 64  OF InterledgerAd
0d80: 64 72 65 73 73 0a 20 20 20 20 66 69 6e 61 6c 20  dress.    final 
0d90: 4c 69 73 74 3c 49 6e 74 65 72 6c 65 64 67 65 72  List<Interledger
0da0: 41 64 64 72 65 73 73 3e 20 61 64 64 72 65 73 73  Address> address
0db0: 4c 69 73 74 20 3d 0a 20 20 20 20 20 20 20 20 63  List =.        c
0dc0: 6f 6e 74 65 78 74 2e 72 65 61 64 28 4f 65 72 53  ontext.read(OerS
0dd0: 65 71 75 65 6e 63 65 4f 66 41 64 64 72 65 73 73  equenceOfAddress
0de0: 2e 63 6c 61 73 73 2c 20 69 6e 70 75 74 53 74 72  .class, inputStr
0df0: 65 61 6d 29 2e 67 65 74 49 6e 74 65 72 6c 65 64  eam).getInterled
0e00: 67 65 72 41 64 64 72 65 73 73 65 73 28 29 3b 0a  gerAddresses();.
0e10: 0a 20 20 20 20 2f 2f 20 37 2e 20 52 65 61 64 20  .    // 7. Read 
0e20: 74 68 65 20 74 72 69 67 67 65 72 65 64 41 74 2c  the triggeredAt,
0e30: 20 77 68 69 63 68 20 69 73 20 61 20 54 69 6d 65   which is a Time
0e40: 73 74 61 6d 70 0a 20 20 20 20 66 69 6e 61 6c 20  stamp.    final 
0e50: 49 6e 73 74 61 6e 74 20 74 72 69 67 67 65 72 65  Instant triggere
0e60: 64 41 74 20 3d 20 63 6f 6e 74 65 78 74 2e 72 65  dAt = context.re
0e70: 61 64 28 4f 65 72 47 65 6e 65 72 61 6c 69 7a 65  ad(OerGeneralize
0e80: 64 54 69 6d 65 2e 63 6c 61 73 73 2c 20 69 6e 70  dTime.class, inp
0e90: 75 74 53 74 72 65 61 6d 29 2e 67 65 74 56 61 6c  utStream).getVal
0ea0: 75 65 28 29 3b 0a 0a 20 20 20 20 2f 2f 20 38 2e  ue();..    // 8.
0eb0: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 2c 20   Read the data, 
0ec0: 77 68 69 63 68 20 69 73 20 61 6e 20 4f 63 74 65  which is an Octe
0ed0: 74 53 74 72 69 6e 67 2e 0a 20 20 20 20 66 69 6e  tString..    fin
0ee0: 61 6c 20 62 79 74 65 5b 5d 20 64 61 74 61 20 3d  al byte[] data =
0ef0: 20 63 6f 6e 74 65 78 74 2e 72 65 61 64 28 4f 65   context.read(Oe
0f00: 72 4f 63 74 65 74 53 74 72 69 6e 67 2e 63 6c 61  rOctetString.cla
0f10: 73 73 2c 20 69 6e 70 75 74 53 74 72 65 61 6d 29  ss, inputStream)
0f20: 0a 20 20 20 20 20 20 20 20 2e 67 65 74 56 61 6c  .        .getVal
0f30: 75 65 28 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ue();..    retur
0f40: 6e 20 49 6e 74 65 72 6c 65 64 67 65 72 50 72 6f  n InterledgerPro
0f50: 74 6f 63 6f 6c 45 72 72 6f 72 2e 62 75 69 6c 64  tocolError.build
0f60: 65 72 28 29 0a 20 20 20 20 20 20 20 20 2e 65 72  er().        .er
0f70: 72 6f 72 43 6f 64 65 28 65 72 72 6f 72 43 6f 64  rorCode(errorCod
0f80: 65 29 0a 20 20 20 20 20 20 20 20 2e 74 72 69 67  e).        .trig
0f90: 67 65 72 65 64 42 79 41 64 64 72 65 73 73 28 74  geredByAddress(t
0fa0: 72 69 67 67 65 72 65 64 42 79 41 64 64 72 65 73  riggeredByAddres
0fb0: 73 29 0a 20 20 20 20 20 20 20 20 2e 66 6f 72 77  s).        .forw
0fc0: 61 72 64 65 64 42 79 41 64 64 72 65 73 73 65 73  ardedByAddresses
0fd0: 28 61 64 64 72 65 73 73 4c 69 73 74 29 0a 20 20  (addressList).  
0fe0: 20 20 20 20 20 20 2e 74 72 69 67 67 65 72 65 64        .triggered
0ff0: 41 74 28 74 72 69 67 67 65 72 65 64 41 74 29 0a  At(triggeredAt).
1000: 20 20 20 20 20 20 20 20 2e 64 61 74 61 28 64 61          .data(da
1010: 74 61 29 0a 20 20 20 20 20 20 20 20 2e 62 75 69  ta).        .bui
1020: 6c 64 28 29 3b 0a 20 20 7d 0a 0a 20 20 40 4f 76  ld();.  }..  @Ov
1030: 65 72 72 69 64 65 0a 20 20 70 75 62 6c 69 63 20  erride.  public 
1040: 76 6f 69 64 20 77 72 69 74 65 28 66 69 6e 61 6c  void write(final
1050: 20 43 6f 64 65 63 43 6f 6e 74 65 78 74 20 63 6f   CodecContext co
1060: 6e 74 65 78 74 2c 20 66 69 6e 61 6c 20 49 6e 74  ntext, final Int
1070: 65 72 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f 6c  erledgerProtocol
1080: 45 72 72 6f 72 20 69 6e 73 74 61 6e 63 65 2c 0a  Error instance,.
1090: 20 20 20 20 20 20 66 69 6e 61 6c 20 4f 75 74 70        final Outp
10a0: 75 74 53 74 72 65 61 6d 20 6f 75 74 70 75 74 53  utStream outputS
10b0: 74 72 65 61 6d 29 20 74 68 72 6f 77 73 20 49 4f  tream) throws IO
10c0: 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20  Exception {.    
10d0: 4f 62 6a 65 63 74 73 2e 72 65 71 75 69 72 65 4e  Objects.requireN
10e0: 6f 6e 4e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  onNull(context);
10f0: 0a 20 20 20 20 4f 62 6a 65 63 74 73 2e 72 65 71  .    Objects.req
1100: 75 69 72 65 4e 6f 6e 4e 75 6c 6c 28 69 6e 73 74  uireNonNull(inst
1110: 61 6e 63 65 29 3b 0a 20 20 20 20 4f 62 6a 65 63  ance);.    Objec
1120: 74 73 2e 72 65 71 75 69 72 65 4e 6f 6e 4e 75 6c  ts.requireNonNul
1130: 6c 28 6f 75 74 70 75 74 53 74 72 65 61 6d 29 3b  l(outputStream);
1140: 0a 0a 20 20 20 20 2f 2f 20 31 2e 20 49 6e 74 65  ..    // 1. Inte
1150: 72 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f 6c 45  rledgerProtocolE
1160: 72 72 6f 72 20 68 61 73 20 6e 6f 20 22 70 72 65  rror has no "pre
1170: 73 65 6e 63 65 20 62 69 74 6d 61 70 22 2e 20 53  sence bitmap". S
1180: 65 65 20 6a 61 76 61 64 6f 63 20 66 6f 72 20 74  ee javadoc for t
1190: 68 69 73 20 63 6c 61 73 73 20 66 6f 72 20 6d 6f  his class for mo
11a0: 72 65 0a 20 20 20 20 2f 2f 20 64 65 74 61 69 6c  re.    // detail
11b0: 73 2e 0a 0a 20 20 20 20 2f 2f 20 32 2e 20 49 6e  s...    // 2. In
11c0: 74 65 72 6c 65 64 67 65 72 50 72 6f 74 6f 63 6f  terledgerProtoco
11d0: 6c 45 72 72 6f 72 20 68 61 73 20 6e 6f 20 22 65  lError has no "e
11e0: 78 74 65 6e 73 69 6f 6e 20 70 72 65 73 65 6e 63  xtension presenc
11f0: 65 20 62 69 74 6d 61 70 22 2e 20 53 65 65 20 6a  e bitmap". See j
1200: 61 76 61 64 6f 63 20 66 6f 72 20 74 68 69 73 20  avadoc for this 
1210: 63 6c 61 73 73 0a 20 20 20 20 2f 2f 20 66 6f 72  class.    // for
1220: 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a   more details...
1230: 20 20 20 20 2f 2f 20 33 2e 20 57 72 69 74 65 20      // 3. Write 
1240: 74 68 65 20 70 61 63 6b 65 74 20 74 79 70 65 2e  the packet type.
1250: 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e 77 72 69  .    context.wri
1260: 74 65 28 49 6e 74 65 72 6c 65 64 67 65 72 50 61  te(InterledgerPa
1270: 63 6b 65 74 54 79 70 65 2e 63 6c 61 73 73 2c 20  cketType.class, 
1280: 74 68 69 73 2e 67 65 74 54 79 70 65 49 64 28 29  this.getTypeId()
1290: 2c 20 6f 75 74 70 75 74 53 74 72 65 61 6d 29 3b  , outputStream);
12a0: 0a 0a 20 20 20 20 2f 2f 20 34 2e 20 57 72 69 74  ..    // 4. Writ
12b0: 65 20 74 68 65 20 45 72 72 6f 72 20 63 6f 64 65  e the Error code
12c0: 2c 20 77 68 69 63 68 20 69 73 20 61 6e 20 49 41  , which is an IA
12d0: 35 53 74 72 69 6e 67 2e 0a 20 20 20 20 63 6f 6e  5String..    con
12e0: 74 65 78 74 2e 77 72 69 74 65 28 6e 65 77 20 4f  text.write(new O
12f0: 65 72 49 41 35 53 74 72 69 6e 67 28 69 6e 73 74  erIA5String(inst
1300: 61 6e 63 65 2e 67 65 74 45 72 72 6f 72 43 6f 64  ance.getErrorCod
1310: 65 28 29 2e 67 65 74 43 6f 64 65 28 29 29 2c 20  e().getCode()), 
1320: 6f 75 74 70 75 74 53 74 72 65 61 6d 29 3b 0a 0a  outputStream);..
1330: 20 20 20 20 2f 2f 20 35 2e 20 57 72 69 74 65 20      // 5. Write 
1340: 74 68 65 20 45 72 72 6f 72 20 6e 61 6d 65 2c 20  the Error name, 
1350: 77 68 69 63 68 20 69 73 20 61 20 49 41 35 53 74  which is a IA5St
1360: 72 69 6e 67 2e 0a 20 20 20 20 63 6f 6e 74 65 78  ring..    contex
1370: 74 2e 77 72 69 74 65 28 6e 65 77 20 4f 65 72 49  t.write(new OerI
1380: 41 35 53 74 72 69 6e 67 28 69 6e 73 74 61 6e 63  A5String(instanc
1390: 65 2e 67 65 74 45 72 72 6f 72 43 6f 64 65 28 29  e.getErrorCode()
13a0: 2e 67 65 74 4e 61 6d 65 28 29 29 2c 20 6f 75 74  .getName()), out
13b0: 70 75 74 53 74 72 65 61 6d 29 3b 0a 0a 20 20 20  putStream);..   
13c0: 20 2f 2f 20 35 2e 20 57 72 69 74 65 20 74 68 65   // 5. Write the
13d0: 20 74 72 69 67 67 65 72 65 64 42 79 20 61 64 64   triggeredBy add
13e0: 72 65 73 73 2c 20 77 68 69 63 68 20 69 73 20 61  ress, which is a
13f0: 6e 20 49 6e 74 65 72 6c 65 64 67 65 72 41 64 64  n InterledgerAdd
1400: 72 65 73 73 0a 20 20 20 20 63 6f 6e 74 65 78 74  ress.    context
1410: 2e 77 72 69 74 65 28 69 6e 73 74 61 6e 63 65 2e  .write(instance.
1420: 67 65 74 54 72 69 67 67 65 72 65 64 42 79 41 64  getTriggeredByAd
1430: 64 72 65 73 73 28 29 2c 20 6f 75 74 70 75 74 53  dress(), outputS
1440: 74 72 65 61 6d 29 3b 0a 0a 20 20 20 20 2f 2f 20  tream);..    // 
1450: 36 2e 20 57 72 69 74 65 20 74 68 65 20 66 6f 72  6. Write the for
1460: 77 61 72 64 65 64 42 79 20 61 64 64 72 65 73 73  wardedBy address
1470: 65 73 2c 20 77 68 69 63 68 20 69 73 20 61 20 53  es, which is a S
1480: 45 51 55 45 4e 43 45 20 4f 46 20 49 6e 74 65 72  EQUENCE OF Inter
1490: 6c 65 64 67 65 72 41 64 64 72 65 73 73 0a 20 20  ledgerAddress.  
14a0: 20 20 63 6f 6e 74 65 78 74 2e 77 72 69 74 65 28    context.write(
14b0: 6e 65 77 20 4f 65 72 53 65 71 75 65 6e 63 65 4f  new OerSequenceO
14c0: 66 41 64 64 72 65 73 73 28 69 6e 73 74 61 6e 63  fAddress(instanc
14d0: 65 2e 67 65 74 46 6f 72 77 61 72 64 65 64 42 79  e.getForwardedBy
14e0: 41 64 64 72 65 73 73 65 73 28 29 29 2c 20 6f 75  Addresses()), ou
14f0: 74 70 75 74 53 74 72 65 61 6d 29 3b 0a 0a 20 20  tputStream);..  
1500: 20 20 2f 2f 20 37 2e 20 57 72 69 74 65 20 74 68    // 7. Write th
1510: 65 20 74 72 69 67 67 65 72 65 64 41 74 2c 20 77  e triggeredAt, w
1520: 68 69 63 68 20 69 73 20 61 20 54 69 6d 65 73 74  hich is a Timest
1530: 61 6d 70 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e  amp.    context.
1540: 77 72 69 74 65 28 6e 65 77 20 4f 65 72 47 65 6e  write(new OerGen
1550: 65 72 61 6c 69 7a 65 64 54 69 6d 65 28 69 6e 73  eralizedTime(ins
1560: 74 61 6e 63 65 2e 67 65 74 54 72 69 67 67 65 72  tance.getTrigger
1570: 65 64 41 74 28 29 29 2c 20 6f 75 74 70 75 74 53  edAt()), outputS
1580: 74 72 65 61 6d 29 3b 0a 0a 20 20 20 20 2f 2f 20  tream);..    // 
1590: 38 2e 20 57 72 69 74 65 20 74 68 65 20 64 61 74  8. Write the dat
15a0: 61 2c 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f  a, which is an O
15b0: 63 74 65 74 53 74 72 69 6e 67 2e 0a 20 20 20 20  ctetString..    
15c0: 69 6e 73 74 61 6e 63 65 2e 67 65 74 44 61 74 61  instance.getData
15d0: 28 29 2e 69 66 50 72 65 73 65 6e 74 28 64 61 74  ().ifPresent(dat
15e0: 61 20 2d 3e 20 7b 0a 20 20 20 20 20 20 74 72 79  a -> {.      try
15f0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65   {.        conte
1600: 78 74 2e 77 72 69 74 65 28 4f 65 72 4f 63 74 65  xt.write(OerOcte
1610: 74 53 74 72 69 6e 67 2e 63 6c 61 73 73 2c 20 6e  tString.class, n
1620: 65 77 20 4f 65 72 4f 63 74 65 74 53 74 72 69 6e  ew OerOctetStrin
1630: 67 28 64 61 74 61 29 2c 20 6f 75 74 70 75 74 53  g(data), outputS
1640: 74 72 65 61 6d 29 3b 0a 20 20 20 20 20 20 7d 20  tream);.      } 
1650: 63 61 74 63 68 20 28 49 4f 45 78 63 65 70 74 69  catch (IOExcepti
1660: 6f 6e 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20  on e) {.        
1670: 74 68 72 6f 77 20 6e 65 77 20 52 75 6e 74 69 6d  throw new Runtim
1680: 65 45 78 63 65 70 74 69 6f 6e 28 65 29 3b 0a 20  eException(e);. 
1690: 20 20 20 20 20 7d 0a 20 20 20 20 7d 29 3b 0a 20       }.    });. 
16a0: 20 7d 0a 7d 0a                                    }.}.