Hex Artifact Content
Not logged in

Artifact 63020c5fe9567ab37b6d332190ccaf6adbc85c5d:


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 69 6c 70 2e 6c 65 64 67  rledger.ilp.ledg
0020: 65 72 2e 61 64 61 70 74 6f 72 2e 77 73 3b 0a 0a  er.adaptor.ws;..
0030: 69 6d 70 6f 72 74 20 63 6f 6d 2e 66 61 73 74 65  import com.faste
0040: 72 78 6d 6c 2e 6a 61 63 6b 73 6f 6e 2e 63 6f 72  rxml.jackson.cor
0050: 65 2e 4a 73 6f 6e 50 72 6f 63 65 73 73 69 6e 67  e.JsonProcessing
0060: 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72  Exception;.impor
0070: 74 20 63 6f 6d 2e 66 61 73 74 65 72 78 6d 6c 2e  t com.fasterxml.
0080: 6a 61 63 6b 73 6f 6e 2e 64 61 74 61 62 69 6e 64  jackson.databind
0090: 2e 4f 62 6a 65 63 74 4d 61 70 70 65 72 3b 0a 69  .ObjectMapper;.i
00a0: 6d 70 6f 72 74 20 6f 72 67 2e 69 6e 74 65 72 6c  mport org.interl
00b0: 65 64 67 65 72 2e 69 6c 70 2e 6c 65 64 67 65 72  edger.ilp.ledger
00c0: 2e 61 64 61 70 74 6f 72 2e 77 73 2e 6a 73 6f 6e  .adaptor.ws.json
00d0: 72 70 63 2e 4a 73 6f 6e 52 70 63 4d 65 73 73 61  rpc.JsonRpcMessa
00e0: 67 65 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73  ge;.import org.s
00f0: 6c 66 34 6a 2e 4c 6f 67 67 65 72 3b 0a 69 6d 70  lf4j.Logger;.imp
0100: 6f 72 74 20 6f 72 67 2e 73 6c 66 34 6a 2e 4c 6f  ort org.slf4j.Lo
0110: 67 67 65 72 46 61 63 74 6f 72 79 3b 0a 69 6d 70  ggerFactory;.imp
0120: 6f 72 74 20 6f 72 67 2e 73 70 72 69 6e 67 66 72  ort org.springfr
0130: 61 6d 65 77 6f 72 6b 2e 77 65 62 2e 73 6f 63 6b  amework.web.sock
0140: 65 74 2e 43 6c 6f 73 65 53 74 61 74 75 73 3b 0a  et.CloseStatus;.
0150: 69 6d 70 6f 72 74 20 6f 72 67 2e 73 70 72 69 6e  import org.sprin
0160: 67 66 72 61 6d 65 77 6f 72 6b 2e 77 65 62 2e 73  gframework.web.s
0170: 6f 63 6b 65 74 2e 54 65 78 74 4d 65 73 73 61 67  ocket.TextMessag
0180: 65 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73 70  e;.import org.sp
0190: 72 69 6e 67 66 72 61 6d 65 77 6f 72 6b 2e 77 65  ringframework.we
01a0: 62 2e 73 6f 63 6b 65 74 2e 57 65 62 53 6f 63 6b  b.socket.WebSock
01b0: 65 74 53 65 73 73 69 6f 6e 3b 0a 69 6d 70 6f 72  etSession;.impor
01c0: 74 20 6f 72 67 2e 73 70 72 69 6e 67 66 72 61 6d  t org.springfram
01d0: 65 77 6f 72 6b 2e 77 65 62 2e 73 6f 63 6b 65 74  ework.web.socket
01e0: 2e 68 61 6e 64 6c 65 72 2e 54 65 78 74 57 65 62  .handler.TextWeb
01f0: 53 6f 63 6b 65 74 48 61 6e 64 6c 65 72 3b 0a 0a  SocketHandler;..
0200: 2f 2a 2a 0a 20 2a 20 41 20 4a 53 4f 4e 2d 52 50  /**. * A JSON-RP
0210: 43 20 62 61 73 65 64 20 65 78 74 65 6e 73 69 6f  C based extensio
0220: 6e 20 74 6f 20 61 20 77 65 62 20 73 6f 63 6b 65  n to a web socke
0230: 74 20 68 61 6e 64 6c 65 72 2e 0a 20 2a 2f 0a 70  t handler.. */.p
0240: 75 62 6c 69 63 20 63 6c 61 73 73 20 4a 73 6f 6e  ublic class Json
0250: 52 70 63 57 65 62 53 6f 63 6b 65 74 48 61 6e 64  RpcWebSocketHand
0260: 6c 65 72 20 65 78 74 65 6e 64 73 20 54 65 78 74  ler extends Text
0270: 57 65 62 53 6f 63 6b 65 74 48 61 6e 64 6c 65 72  WebSocketHandler
0280: 20 7b 0a 0a 20 20 70 72 69 76 61 74 65 20 73 74   {..  private st
0290: 61 74 69 63 20 66 69 6e 61 6c 20 4c 6f 67 67 65  atic final Logge
02a0: 72 20 6c 6f 67 20 3d 20 4c 6f 67 67 65 72 46 61  r log = LoggerFa
02b0: 63 74 6f 72 79 2e 67 65 74 4c 6f 67 67 65 72 28  ctory.getLogger(
02c0: 4a 73 6f 6e 52 70 63 57 65 62 53 6f 63 6b 65 74  JsonRpcWebSocket
02d0: 48 61 6e 64 6c 65 72 2e 63 6c 61 73 73 29 3b 0a  Handler.class);.
02e0: 0a 20 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c  .  private final
02f0: 20 4f 62 6a 65 63 74 4d 61 70 70 65 72 20 6d 61   ObjectMapper ma
0300: 70 70 65 72 3b 0a 20 20 70 72 69 76 61 74 65 20  pper;.  private 
0310: 4a 73 6f 6e 52 70 63 57 65 62 53 6f 63 6b 65 74  JsonRpcWebSocket
0320: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
0330: 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 43 6f 6e  ..  /**.   * Con
0340: 73 74 72 75 63 74 73 20 61 20 6e 65 77 20 3c 63  structs a new <c
0350: 6f 64 65 3e 4a 73 6f 6e 52 70 63 57 65 62 53 6f  ode>JsonRpcWebSo
0360: 63 6b 65 74 48 61 6e 64 6c 65 72 3c 2f 63 6f 64  cketHandler</cod
0370: 65 3e 20 69 6e 73 74 61 6e 63 65 2e 0a 20 20 20  e> instance..   
0380: 2a 20 40 70 61 72 61 6d 20 63 68 61 6e 6e 65 6c  * @param channel
0390: 0a 20 20 20 2a 20 20 54 68 65 20 63 68 61 6e 6e  .   *  The chann
03a0: 65 6c 20 74 68 61 74 20 74 68 69 73 20 68 61 6e  el that this han
03b0: 64 6c 65 72 20 62 65 6c 6f 6e 67 73 20 74 6f 2e  dler belongs to.
03c0: 0a 20 20 20 2a 20 40 70 61 72 61 6d 20 6d 61 70  .   * @param map
03d0: 70 65 72 0a 20 20 20 2a 20 20 41 6e 20 6f 62 6a  per.   *  An obj
03e0: 65 63 74 20 6d 61 70 70 65 72 20 74 6f 20 75 73  ect mapper to us
03f0: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 4a  e when parsing J
0400: 53 4f 4e 20 6d 65 73 73 61 67 65 73 2e 0a 20 20  SON messages..  
0410: 20 2a 2f 0a 20 20 70 75 62 6c 69 63 20 4a 73 6f   */.  public Jso
0420: 6e 52 70 63 57 65 62 53 6f 63 6b 65 74 48 61 6e  nRpcWebSocketHan
0430: 64 6c 65 72 28 4a 73 6f 6e 52 70 63 57 65 62 53  dler(JsonRpcWebS
0440: 6f 63 6b 65 74 43 68 61 6e 6e 65 6c 20 63 68 61  ocketChannel cha
0450: 6e 6e 65 6c 2c 20 4f 62 6a 65 63 74 4d 61 70 70  nnel, ObjectMapp
0460: 65 72 20 6d 61 70 70 65 72 29 20 7b 0a 20 20 20  er mapper) {.   
0470: 20 0a 20 20 20 20 74 68 69 73 2e 6d 61 70 70 65   .    this.mappe
0480: 72 20 3d 20 6d 61 70 70 65 72 3b 0a 20 20 20 20  r = mapper;.    
0490: 74 68 69 73 2e 63 68 61 6e 6e 65 6c 20 3d 20 63  this.channel = c
04a0: 68 61 6e 6e 65 6c 3b 0a 20 20 7d 0a 0a 20 20 40  hannel;.  }..  @
04b0: 4f 76 65 72 72 69 64 65 0a 20 20 70 75 62 6c 69  Override.  publi
04c0: 63 20 76 6f 69 64 20 61 66 74 65 72 43 6f 6e 6e  c void afterConn
04d0: 65 63 74 69 6f 6e 45 73 74 61 62 6c 69 73 68 65  ectionEstablishe
04e0: 64 28 57 65 62 53 6f 63 6b 65 74 53 65 73 73 69  d(WebSocketSessi
04f0: 6f 6e 20 73 65 73 73 69 6f 6e 29 20 74 68 72 6f  on session) thro
0500: 77 73 20 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20  ws Exception {. 
0510: 20 20 20 0a 20 20 20 20 6c 6f 67 2e 64 65 62 75     .    log.debu
0520: 67 28 22 4f 70 65 6e 69 6e 67 20 73 65 73 73 69  g("Opening sessi
0530: 6f 6e 20 69 64 20 7b 7d 20 22 2c 20 73 65 73 73  on id {} ", sess
0540: 69 6f 6e 2e 67 65 74 49 64 28 29 29 3b 0a 20 20  ion.getId());.  
0550: 20 20 74 68 69 73 2e 63 68 61 6e 6e 65 6c 2e 6f    this.channel.o
0560: 6e 43 6f 6e 6e 65 63 74 69 6f 6e 45 73 74 61 62  nConnectionEstab
0570: 6c 69 73 68 65 64 28 73 65 73 73 69 6f 6e 29 3b  lished(session);
0580: 0a 20 20 20 20 73 75 70 65 72 2e 61 66 74 65 72  .    super.after
0590: 43 6f 6e 6e 65 63 74 69 6f 6e 45 73 74 61 62 6c  ConnectionEstabl
05a0: 69 73 68 65 64 28 73 65 73 73 69 6f 6e 29 3b 0a  ished(session);.
05b0: 20 20 7d 0a 0a 20 20 40 4f 76 65 72 72 69 64 65    }..  @Override
05c0: 0a 20 20 70 72 6f 74 65 63 74 65 64 20 76 6f 69  .  protected voi
05d0: 64 20 68 61 6e 64 6c 65 54 65 78 74 4d 65 73 73  d handleTextMess
05e0: 61 67 65 28 57 65 62 53 6f 63 6b 65 74 53 65 73  age(WebSocketSes
05f0: 73 69 6f 6e 20 73 65 73 73 69 6f 6e 2c 20 54 65  sion session, Te
0600: 78 74 4d 65 73 73 61 67 65 20 6d 65 73 73 61 67  xtMessage messag
0610: 65 29 20 74 68 72 6f 77 73 20 45 78 63 65 70 74  e) throws Except
0620: 69 6f 6e 20 7b 0a 20 20 20 20 0a 20 20 20 20 6c  ion {.    .    l
0630: 6f 67 2e 74 72 61 63 65 28 22 4a 73 6f 6e 20 52  og.trace("Json R
0640: 70 63 20 6d 65 73 73 61 67 65 20 72 65 63 65 69  pc message recei
0650: 76 65 64 3a 20 22 20 2b 20 6d 65 73 73 61 67 65  ved: " + message
0660: 2e 67 65 74 50 61 79 6c 6f 61 64 28 29 29 3b 0a  .getPayload());.
0670: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
0680: 4a 73 6f 6e 52 70 63 4d 65 73 73 61 67 65 20 72  JsonRpcMessage r
0690: 70 63 4d 65 73 73 61 67 65 20 3d 20 6d 61 70 70  pcMessage = mapp
06a0: 65 72 2e 72 65 61 64 56 61 6c 75 65 28 6d 65 73  er.readValue(mes
06b0: 73 61 67 65 2e 67 65 74 50 61 79 6c 6f 61 64 28  sage.getPayload(
06c0: 29 2c 20 4a 73 6f 6e 52 70 63 4d 65 73 73 61 67  ), JsonRpcMessag
06d0: 65 2e 63 6c 61 73 73 29 3b 0a 20 20 20 20 20 20  e.class);.      
06e0: 74 68 69 73 2e 63 68 61 6e 6e 65 6c 2e 6f 6e 4d  this.channel.onM
06f0: 65 73 73 61 67 65 28 72 70 63 4d 65 73 73 61 67  essage(rpcMessag
0700: 65 29 3b 0a 20 20 20 20 7d 20 63 61 74 63 68 20  e);.    } catch 
0710: 28 4a 73 6f 6e 50 72 6f 63 65 73 73 69 6e 67 45  (JsonProcessingE
0720: 78 63 65 70 74 69 6f 6e 20 6a 70 65 29 20 7b 0a  xception jpe) {.
0730: 20 20 20 20 20 20 6c 6f 67 2e 65 72 72 6f 72 28        log.error(
0740: 22 49 6e 76 61 6c 69 64 20 6a 73 6f 6e 2d 72 70  "Invalid json-rp
0750: 63 20 6d 65 73 73 61 67 65 20 72 65 63 65 69 76  c message receiv
0760: 65 64 3a 5c 6e 20 7b 7d 22 2c 20 6d 65 73 73 61  ed:\n {}", messa
0770: 67 65 2e 67 65 74 50 61 79 6c 6f 61 64 28 29 2c  ge.getPayload(),
0780: 20 6a 70 65 29 3b 0a 20 20 20 20 20 20 74 68 72   jpe);.      thr
0790: 6f 77 20 6a 70 65 3b 0a 20 20 20 20 7d 0a 20 20  ow jpe;.    }.  
07a0: 7d 0a 0a 20 20 40 4f 76 65 72 72 69 64 65 0a 20  }..  @Override. 
07b0: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 68 61 6e   public void han
07c0: 64 6c 65 54 72 61 6e 73 70 6f 72 74 45 72 72 6f  dleTransportErro
07d0: 72 28 57 65 62 53 6f 63 6b 65 74 53 65 73 73 69  r(WebSocketSessi
07e0: 6f 6e 20 73 65 73 73 69 6f 6e 2c 20 54 68 72 6f  on session, Thro
07f0: 77 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 29  wable exception)
0800: 20 74 68 72 6f 77 73 20 45 78 63 65 70 74 69 6f   throws Exceptio
0810: 6e 20 7b 0a 20 20 20 20 0a 20 20 20 20 6c 6f 67  n {.    .    log
0820: 2e 65 72 72 6f 72 28 22 45 72 72 6f 72 20 69 6e  .error("Error in
0830: 20 73 65 73 73 69 6f 6e 20 69 64 20 7b 7d 22 2c   session id {}",
0840: 20 73 65 73 73 69 6f 6e 2e 67 65 74 49 64 28 29   session.getId()
0850: 2c 20 65 78 63 65 70 74 69 6f 6e 29 3b 0a 20 20  , exception);.  
0860: 20 20 74 68 69 73 2e 63 68 61 6e 6e 65 6c 2e 6f    this.channel.o
0870: 6e 54 72 61 6e 73 70 6f 72 74 45 72 72 6f 72 28  nTransportError(
0880: 65 78 63 65 70 74 69 6f 6e 29 3b 0a 20 20 20 20  exception);.    
0890: 73 75 70 65 72 2e 68 61 6e 64 6c 65 54 72 61 6e  super.handleTran
08a0: 73 70 6f 72 74 45 72 72 6f 72 28 73 65 73 73 69  sportError(sessi
08b0: 6f 6e 2c 20 65 78 63 65 70 74 69 6f 6e 29 3b 0a  on, exception);.
08c0: 20 20 7d 0a 0a 20 20 40 4f 76 65 72 72 69 64 65    }..  @Override
08d0: 0a 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 61  .  public void a
08e0: 66 74 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  fterConnectionCl
08f0: 6f 73 65 64 28 57 65 62 53 6f 63 6b 65 74 53 65  osed(WebSocketSe
0900: 73 73 69 6f 6e 20 73 65 73 73 69 6f 6e 2c 20 43  ssion session, C
0910: 6c 6f 73 65 53 74 61 74 75 73 20 73 74 61 74 75  loseStatus statu
0920: 73 29 20 74 68 72 6f 77 73 20 45 78 63 65 70 74  s) throws Except
0930: 69 6f 6e 20 7b 0a 20 20 20 20 0a 20 20 20 20 6c  ion {.    .    l
0940: 6f 67 2e 64 65 62 75 67 28 22 43 6c 6f 73 69 6e  og.debug("Closin
0950: 67 20 73 65 73 73 69 6f 6e 20 69 64 20 7b 7d 2c  g session id {},
0960: 20 63 6c 6f 73 65 20 73 74 61 74 75 73 20 69 73   close status is
0970: 20 7b 7d 20 22 2c 20 73 65 73 73 69 6f 6e 2e 67   {} ", session.g
0980: 65 74 49 64 28 29 2c 20 73 74 61 74 75 73 29 3b  etId(), status);
0990: 0a 20 20 20 20 74 68 69 73 2e 63 68 61 6e 6e 65  .    this.channe
09a0: 6c 2e 6f 6e 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  l.onConnectionCl
09b0: 6f 73 65 64 28 73 74 61 74 75 73 29 3b 0a 20 20  osed(status);.  
09c0: 20 20 73 75 70 65 72 2e 61 66 74 65 72 43 6f 6e    super.afterCon
09d0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 73 65  nectionClosed(se
09e0: 73 73 69 6f 6e 2c 20 73 74 61 74 75 73 29 3b 0a  ssion, status);.
09f0: 20 20 7d 0a 0a 7d 0a                               }..}.