Hex Artifact Content
Not logged in

Artifact dc8943aa1140bdde71d3970004e8dff2995b7dc9:


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 6f 72 67 2e 69 6e 74 65 72  import org.inter
0040: 6c 65 64 67 65 72 2e 69 6c 70 2e 6c 65 64 67 65  ledger.ilp.ledge
0050: 72 2e 61 64 61 70 74 6f 72 2e 77 73 2e 6a 73 6f  r.adaptor.ws.jso
0060: 6e 72 70 63 2e 4a 73 6f 6e 52 70 63 45 72 72 6f  nrpc.JsonRpcErro
0070: 72 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 69 6e  r;.import org.in
0080: 74 65 72 6c 65 64 67 65 72 2e 69 6c 70 2e 6c 65  terledger.ilp.le
0090: 64 67 65 72 2e 61 64 61 70 74 6f 72 2e 77 73 2e  dger.adaptor.ws.
00a0: 6a 73 6f 6e 72 70 63 2e 4a 73 6f 6e 52 70 63 52  jsonrpc.JsonRpcR
00b0: 65 71 75 65 73 74 4d 65 73 73 61 67 65 3b 0a 69  equestMessage;.i
00c0: 6d 70 6f 72 74 20 6f 72 67 2e 69 6e 74 65 72 6c  mport org.interl
00d0: 65 64 67 65 72 2e 69 6c 70 2e 6c 65 64 67 65 72  edger.ilp.ledger
00e0: 2e 61 64 61 70 74 6f 72 2e 77 73 2e 6a 73 6f 6e  .adaptor.ws.json
00f0: 72 70 63 2e 4a 73 6f 6e 52 70 63 52 65 73 70 6f  rpc.JsonRpcRespo
0100: 6e 73 65 4d 65 73 73 61 67 65 3b 0a 0a 69 6d 70  nseMessage;..imp
0110: 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 44 61  ort java.util.Da
0120: 74 65 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e  te;.import java.
0130: 75 74 69 6c 2e 4d 61 70 3b 0a 69 6d 70 6f 72 74  util.Map;.import
0140: 20 6a 61 76 61 2e 75 74 69 6c 2e 63 6f 6e 63 75   java.util.concu
0150: 72 72 65 6e 74 2e 43 6f 6e 63 75 72 72 65 6e 74  rrent.Concurrent
0160: 48 61 73 68 4d 61 70 3b 0a 0a 2f 2a 2a 0a 20 2a  HashMap;../**. *
0170: 20 41 20 74 69 6d 65 64 20 63 61 63 68 65 20 75   A timed cache u
0180: 73 65 64 20 74 6f 20 6c 69 6e 6b 20 72 65 71 75  sed to link requ
0190: 65 73 74 20 61 6e 64 20 72 65 73 70 6f 6e 73 65  est and response
01a0: 20 6d 65 73 73 61 67 65 73 20 65 78 63 68 61 6e   messages exchan
01b0: 67 65 64 20 77 69 74 68 20 74 68 65 20 52 45 53  ged with the RES
01c0: 54 20 6c 65 64 67 65 72 2e 20 45 6e 74 72 69 65  T ledger. Entrie
01d0: 73 0a 20 2a 20 6f 6c 64 65 72 20 74 68 61 6e 20  s. * older than 
01e0: 61 20 67 69 76 65 6e 20 65 78 70 69 72 79 20 74  a given expiry t
01f0: 69 6d 65 20 61 72 65 20 65 76 69 63 74 65 64 2e  ime are evicted.
0200: 0a 20 2a 20 0a 20 2a 20 3c 70 3e 4e 4f 54 45 3a  . * . * <p>NOTE:
0210: 20 74 69 6d 65 64 20 65 76 69 63 74 69 6f 6e 20   timed eviction 
0220: 63 6f 70 69 65 64 20 66 72 6f 6d 3a 0a 20 2a 20  copied from:. * 
0230: 68 74 74 70 3a 2f 2f 73 74 61 63 6b 6f 76 65 72  http://stackover
0240: 66 6c 6f 77 2e 63 6f 6d 2f 71 75 65 73 74 69 6f  flow.com/questio
0250: 6e 73 2f 33 38 30 32 33 37 30 2f 6a 61 76 61 2d  ns/3802370/java-
0260: 74 69 6d 65 2d 62 61 73 65 64 2d 6d 61 70 2d 63  time-based-map-c
0270: 61 63 68 65 2d 77 69 74 68 2d 65 78 70 69 72 69  ache-with-expiri
0280: 6e 67 2d 6b 65 79 73 0a 20 2a 20 0a 20 2a 20 3c  ng-keys. * . * <
0290: 70 3e 54 4f 44 4f 3a 20 73 68 6f 75 6c 64 20 77  p>TODO: should w
02a0: 65 20 72 61 74 68 65 72 20 75 73 65 20 61 20 47  e rather use a G
02b0: 75 61 76 61 20 63 61 63 68 65 20 69 6e 73 74 65  uava cache inste
02c0: 61 64 20 6f 66 20 72 6f 6c 6c 69 6e 67 20 6f 75  ad of rolling ou
02d0: 72 20 6f 77 6e 3f 0a 20 2a 2f 0a 70 75 62 6c 69  r own?. */.publi
02e0: 63 20 63 6c 61 73 73 20 4a 73 6f 6e 52 70 63 52  c class JsonRpcR
02f0: 65 71 75 65 73 74 52 65 73 70 6f 6e 73 65 4d 61  equestResponseMa
0300: 70 70 65 72 20 7b 0a 0a 20 20 70 75 62 6c 69 63  pper {..  public
0310: 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e   static final in
0320: 74 20 44 45 46 41 55 4c 54 5f 45 56 49 43 49 4f  t DEFAULT_EVICIO
0330: 4e 5f 54 49 4d 45 5f 4d 49 4c 4c 49 53 20 3d 20  N_TIME_MILLIS = 
0340: 31 30 30 30 3b 0a 20 0a 20 20 70 72 69 76 61 74  1000;. .  privat
0350: 65 20 4d 61 70 3c 53 74 72 69 6e 67 2c 20 4a 73  e Map<String, Js
0360: 6f 6e 52 70 63 52 65 71 75 65 73 74 4d 65 73 73  onRpcRequestMess
0370: 61 67 65 3e 20 72 65 71 75 65 73 74 4d 61 70 20  age> requestMap 
0380: 3d 0a 20 20 20 20 20 20 6e 65 77 20 43 6f 6e 63  =.      new Conc
0390: 75 72 72 65 6e 74 48 61 73 68 4d 61 70 3c 53 74  urrentHashMap<St
03a0: 72 69 6e 67 2c 20 4a 73 6f 6e 52 70 63 52 65 71  ring, JsonRpcReq
03b0: 75 65 73 74 4d 65 73 73 61 67 65 3e 28 29 3b 0a  uestMessage>();.
03c0: 20 20 0a 20 20 70 72 69 76 61 74 65 20 4d 61 70    .  private Map
03d0: 3c 53 74 72 69 6e 67 2c 20 4a 73 6f 6e 52 70 63  <String, JsonRpc
03e0: 52 65 73 70 6f 6e 73 65 48 61 6e 64 6c 65 72 3e  ResponseHandler>
03f0: 20 68 61 6e 64 6c 65 72 4d 61 70 20 3d 0a 20 20   handlerMap =.  
0400: 20 20 20 20 6e 65 77 20 43 6f 6e 63 75 72 72 65      new Concurre
0410: 6e 74 48 61 73 68 4d 61 70 3c 53 74 72 69 6e 67  ntHashMap<String
0420: 2c 20 4a 73 6f 6e 52 70 63 52 65 73 70 6f 6e 73  , JsonRpcRespons
0430: 65 48 61 6e 64 6c 65 72 3e 28 29 3b 0a 20 20 0a  eHandler>();.  .
0440: 20 20 70 72 69 76 61 74 65 20 4d 61 70 3c 53 74    private Map<St
0450: 72 69 6e 67 2c 20 4c 6f 6e 67 3e 20 74 69 6d 65  ring, Long> time
0460: 4d 61 70 20 3d 20 6e 65 77 20 43 6f 6e 63 75 72  Map = new Concur
0470: 72 65 6e 74 48 61 73 68 4d 61 70 3c 53 74 72 69  rentHashMap<Stri
0480: 6e 67 2c 20 4c 6f 6e 67 3e 28 29 3b 0a 20 20 0a  ng, Long>();.  .
0490: 20 20 70 72 69 76 61 74 65 20 6c 6f 6e 67 20 65    private long e
04a0: 78 70 69 72 79 49 6e 4d 69 6c 6c 69 73 3b 20 0a  xpiryInMillis; .
04b0: 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 43 6f 6e 73  .  /**.   * Cons
04c0: 74 72 75 63 74 73 20 61 20 6e 65 77 20 3c 63 6f  tructs a new <co
04d0: 64 65 3e 4a 73 6f 6e 52 70 63 52 65 71 75 65 73  de>JsonRpcReques
04e0: 74 52 65 73 70 6f 6e 73 65 4d 61 70 70 65 72 3c  tResponseMapper<
04f0: 2f 63 6f 64 65 3e 20 69 6e 73 74 61 6e 63 65 2e  /code> instance.
0500: 0a 20 20 20 2a 2f 0a 20 20 70 75 62 6c 69 63 20  .   */.  public 
0510: 4a 73 6f 6e 52 70 63 52 65 71 75 65 73 74 52 65  JsonRpcRequestRe
0520: 73 70 6f 6e 73 65 4d 61 70 70 65 72 28 29 20 7b  sponseMapper() {
0530: 0a 20 20 20 20 74 68 69 73 28 44 45 46 41 55 4c  .    this(DEFAUL
0540: 54 5f 45 56 49 43 49 4f 4e 5f 54 49 4d 45 5f 4d  T_EVICION_TIME_M
0550: 49 4c 4c 49 53 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ILLIS);.  }..  /
0560: 2a 2a 0a 20 20 20 2a 20 43 6f 6e 73 74 72 75 63  **.   * Construc
0570: 74 73 20 61 20 6e 65 77 20 3c 63 6f 64 65 3e 4a  ts a new <code>J
0580: 73 6f 6e 52 70 63 52 65 71 75 65 73 74 52 65 73  sonRpcRequestRes
0590: 70 6f 6e 73 65 4d 61 70 70 65 72 3c 2f 63 6f 64  ponseMapper</cod
05a0: 65 3e 20 69 6e 73 74 61 6e 63 65 2e 0a 20 20 20  e> instance..   
05b0: 2a 20 0a 20 20 20 2a 20 40 70 61 72 61 6d 20 65  * .   * @param e
05c0: 78 70 69 72 79 49 6e 4d 69 6c 6c 69 73 0a 20 20  xpiryInMillis.  
05d0: 20 2a 20 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f   *  The amount o
05e0: 66 20 74 69 6d 65 20 61 20 72 65 71 75 65 73 74  f time a request
05f0: 20 63 61 6e 20 73 74 61 79 20 69 6e 20 74 68 65   can stay in the
0600: 20 6d 61 70 20 66 6f 72 20 6c 69 6e 6b 69 6e 67   map for linking
0610: 20 74 6f 20 61 20 72 65 73 70 6f 6e 73 65 20 62   to a response b
0620: 65 66 6f 72 65 20 62 65 69 6e 67 0a 20 20 20 2a  efore being.   *
0630: 20 20 20 20 20 20 65 76 69 63 74 65 64 2e 0a 20        evicted.. 
0640: 20 20 2a 2f 0a 20 20 70 75 62 6c 69 63 20 4a 73    */.  public Js
0650: 6f 6e 52 70 63 52 65 71 75 65 73 74 52 65 73 70  onRpcRequestResp
0660: 6f 6e 73 65 4d 61 70 70 65 72 28 6c 6f 6e 67 20  onseMapper(long 
0670: 65 78 70 69 72 79 49 6e 4d 69 6c 6c 69 73 29 20  expiryInMillis) 
0680: 7b 0a 20 20 20 20 74 68 69 73 2e 65 78 70 69 72  {.    this.expir
0690: 79 49 6e 4d 69 6c 6c 69 73 20 3d 20 65 78 70 69  yInMillis = expi
06a0: 72 79 49 6e 4d 69 6c 6c 69 73 3b 0a 20 20 20 20  ryInMillis;.    
06b0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
06c0: 7d 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 53 74  }..  /**.   * St
06d0: 6f 72 65 73 20 61 20 72 65 71 75 65 73 74 20 6d  ores a request m
06e0: 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 6d 61  essage in the ma
06f0: 70 20 66 6f 72 20 66 75 74 75 72 65 20 6c 69 6e  p for future lin
0700: 6b 69 6e 67 2e 0a 20 20 20 2a 0a 20 20 20 2a 20  king..   *.   * 
0710: 40 70 61 72 61 6d 20 72 65 71 75 65 73 74 0a 20  @param request. 
0720: 20 20 2a 20 20 54 68 65 20 72 65 71 75 65 73 74    *  The request
0730: 20 74 6f 20 73 74 6f 72 65 2e 0a 20 20 20 2a 20   to store..   * 
0740: 40 70 61 72 61 6d 20 72 65 73 70 6f 6e 73 65 48  @param responseH
0750: 61 6e 64 6c 65 72 0a 20 20 20 2a 20 20 41 20 68  andler.   *  A h
0760: 61 6e 64 6c 65 72 20 74 6f 20 75 73 65 20 77 68  andler to use wh
0770: 65 6e 20 61 20 72 65 73 70 6f 6e 73 65 20 69 73  en a response is
0780: 20 72 65 63 65 69 76 65 64 20 66 6f 72 20 74 68   received for th
0790: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 20 2a 20  e request..   * 
07a0: 40 72 65 74 75 72 6e 0a 20 20 20 2a 20 20 54 68  @return.   *  Th
07b0: 65 20 70 72 65 76 69 6f 75 73 20 68 61 6e 64 6c  e previous handl
07c0: 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
07d0: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 2c 20  th the request, 
07e0: 6f 72 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 68  or no previous h
07f0: 61 6e 64 6c 65 72 20 65 78 69 73 74 73 2e 0a 20  andler exists.. 
0800: 20 20 2a 2f 0a 20 20 70 75 62 6c 69 63 20 4a 73    */.  public Js
0810: 6f 6e 52 70 63 52 65 73 70 6f 6e 73 65 48 61 6e  onRpcResponseHan
0820: 64 6c 65 72 20 73 74 6f 72 65 52 65 71 75 65 73  dler storeReques
0830: 74 28 4a 73 6f 6e 52 70 63 52 65 71 75 65 73 74  t(JsonRpcRequest
0840: 4d 65 73 73 61 67 65 20 72 65 71 75 65 73 74 2c  Message request,
0850: 0a 20 20 20 20 20 20 4a 73 6f 6e 52 70 63 52 65  .      JsonRpcRe
0860: 73 70 6f 6e 73 65 48 61 6e 64 6c 65 72 20 72 65  sponseHandler re
0870: 73 70 6f 6e 73 65 48 61 6e 64 6c 65 72 29 20 7b  sponseHandler) {
0880: 0a 0a 20 20 20 20 53 74 72 69 6e 67 20 69 64 20  ..    String id 
0890: 3d 20 72 65 71 75 65 73 74 2e 67 65 74 49 64 28  = request.getId(
08a0: 29 3b 0a 20 20 20 20 69 66 20 28 69 64 20 3d 3d  );.    if (id ==
08b0: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 74   null) {.      t
08c0: 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c  hrow new Illegal
08d0: 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f  ArgumentExceptio
08e0: 6e 28 22 52 65 71 75 65 73 74 20 6d 75 73 74 20  n("Request must 
08f0: 68 61 76 65 20 61 6e 20 49 44 2e 22 29 3b 0a 20  have an ID.");. 
0900: 20 20 20 7d 0a 0a 20 20 20 20 44 61 74 65 20 64     }..    Date d
0910: 61 74 65 20 3d 20 6e 65 77 20 44 61 74 65 28 29  ate = new Date()
0920: 3b 0a 20 20 20 20 74 69 6d 65 4d 61 70 2e 70 75  ;.    timeMap.pu
0930: 74 28 69 64 2c 20 64 61 74 65 2e 67 65 74 54 69  t(id, date.getTi
0940: 6d 65 28 29 29 3b 0a 20 20 20 20 72 65 71 75 65  me());.    reque
0950: 73 74 4d 61 70 2e 70 75 74 28 69 64 2c 20 72 65  stMap.put(id, re
0960: 71 75 65 73 74 29 3b 0a 20 20 20 20 72 65 74 75  quest);.    retu
0970: 72 6e 20 68 61 6e 64 6c 65 72 4d 61 70 2e 70 75  rn handlerMap.pu
0980: 74 28 69 64 2c 20 72 65 73 70 6f 6e 73 65 48 61  t(id, responseHa
0990: 6e 64 6c 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ndler);.  }..  /
09a0: 2a 2a 0a 20 20 20 2a 20 41 6c 6c 6f 77 73 20 74  **.   * Allows t
09b0: 68 65 20 72 65 73 70 6f 6e 73 65 20 6d 61 70 70  he response mapp
09c0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
09d0: 20 72 65 73 70 6f 6e 73 65 20 6d 65 73 73 61 67   response messag
09e0: 65 2c 20 70 6f 73 73 69 62 6c 79 20 63 61 6c 6c  e, possibly call
09f0: 69 6e 67 20 74 68 65 20 72 65 73 70 6f 6e 73 65  ing the response
0a00: 0a 20 20 20 2a 20 68 61 6e 64 6c 65 72 20 6c 69  .   * handler li
0a10: 6e 6b 65 64 20 77 69 74 68 20 74 68 65 20 72 65  nked with the re
0a20: 71 75 65 73 74 2e 0a 20 20 20 2a 0a 20 20 20 2a  quest..   *.   *
0a30: 20 40 70 61 72 61 6d 20 72 65 73 70 6f 6e 73 65   @param response
0a40: 0a 20 20 20 2a 20 20 54 68 65 20 72 65 73 70 6f  .   *  The respo
0a50: 6e 73 65 20 74 6f 20 68 61 6e 64 6c 65 2e 0a 20  nse to handle.. 
0a60: 20 20 2a 2f 0a 20 20 70 75 62 6c 69 63 20 76 6f    */.  public vo
0a70: 69 64 20 68 61 6e 64 6c 65 52 65 73 70 6f 6e 73  id handleRespons
0a80: 65 28 4a 73 6f 6e 52 70 63 52 65 73 70 6f 6e 73  e(JsonRpcRespons
0a90: 65 4d 65 73 73 61 67 65 20 72 65 73 70 6f 6e 73  eMessage respons
0aa0: 65 29 20 7b 0a 20 20 20 20 0a 20 20 20 20 53 74  e) {.    .    St
0ab0: 72 69 6e 67 20 69 64 20 3d 20 72 65 73 70 6f 6e  ring id = respon
0ac0: 73 65 2e 67 65 74 49 64 28 29 3b 0a 20 20 20 20  se.getId();.    
0ad0: 69 66 20 28 69 64 20 3d 3d 20 6e 75 6c 6c 29 20  if (id == null) 
0ae0: 7b 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65  {.      throw ne
0af0: 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e  w IllegalArgumen
0b00: 74 45 78 63 65 70 74 69 6f 6e 28 22 52 65 73 70  tException("Resp
0b10: 6f 6e 73 65 20 6d 75 73 74 20 68 61 76 65 20 61  onse must have a
0b20: 6e 20 49 44 2e 22 29 3b 0a 20 20 20 20 7d 0a 0a  n ID.");.    }..
0b30: 20 20 20 20 4a 73 6f 6e 52 70 63 52 65 71 75 65      JsonRpcReque
0b40: 73 74 4d 65 73 73 61 67 65 20 72 65 71 75 65 73  stMessage reques
0b50: 74 20 3d 20 72 65 71 75 65 73 74 4d 61 70 2e 67  t = requestMap.g
0b60: 65 74 28 69 64 29 3b 0a 20 20 20 20 4a 73 6f 6e  et(id);.    Json
0b70: 52 70 63 52 65 73 70 6f 6e 73 65 48 61 6e 64 6c  RpcResponseHandl
0b80: 65 72 20 72 65 73 70 6f 6e 73 65 48 61 6e 64 6c  er responseHandl
0b90: 65 72 20 3d 20 68 61 6e 64 6c 65 72 4d 61 70 2e  er = handlerMap.
0ba0: 67 65 74 28 69 64 29 3b 0a 20 20 20 20 72 65 6d  get(id);.    rem
0bb0: 6f 76 65 28 69 64 29 3b 0a 0a 20 20 20 20 69 66  ove(id);..    if
0bc0: 20 28 72 65 73 70 6f 6e 73 65 48 61 6e 64 6c 65   (responseHandle
0bd0: 72 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  r != null) {.   
0be0: 20 20 20 72 65 73 70 6f 6e 73 65 48 61 6e 64 6c     responseHandl
0bf0: 65 72 2e 68 61 6e 64 6c 65 52 65 73 70 6f 6e 73  er.handleRespons
0c00: 65 28 72 65 71 75 65 73 74 2c 20 72 65 73 70 6f  e(request, respo
0c10: 6e 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nse);.    }.  }.
0c20: 0a 20 20 2f 2a 2a 20 50 65 72 66 6f 72 6d 73 20  .  /** Performs 
0c30: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0c40: 6f 6e 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  on required. */.
0c50: 20 20 70 72 6f 74 65 63 74 65 64 20 76 6f 69 64    protected void
0c60: 20 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 7b 0a   initialize() {.
0c70: 20 20 20 20 6e 65 77 20 43 6c 65 61 6e 65 72 54      new CleanerT
0c80: 68 72 65 61 64 28 22 4a 73 6f 6e 52 70 63 52 65  hread("JsonRpcRe
0c90: 73 70 6f 6e 73 65 54 69 6d 65 6f 75 74 4d 6f 6e  sponseTimeoutMon
0ca0: 69 74 6f 72 22 29 2e 73 74 61 72 74 28 29 3b 0a  itor").start();.
0cb0: 20 20 7d 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20    }..  /**.   * 
0cc0: 52 65 6d 6f 76 65 73 20 65 6e 74 72 69 65 73 20  Removes entries 
0cd0: 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
0ce0: 6c 6c 79 20 6d 61 6e 61 67 65 64 20 6d 61 70 73  lly managed maps
0cf0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 69 64 2e   for a given id.
0d00: 0a 20 20 20 2a 0a 20 20 20 2a 20 40 70 61 72 61  .   *.   * @para
0d10: 6d 20 69 64 0a 20 20 20 2a 20 20 41 20 75 6e 69  m id.   *  A uni
0d20: 71 75 65 20 72 65 71 75 65 73 74 20 69 64 65 6e  que request iden
0d30: 74 69 66 69 65 72 0a 20 20 20 2a 2f 0a 20 20 70  tifier.   */.  p
0d40: 72 69 76 61 74 65 20 76 6f 69 64 20 72 65 6d 6f  rivate void remo
0d50: 76 65 28 53 74 72 69 6e 67 20 69 64 29 20 7b 0a  ve(String id) {.
0d60: 20 20 20 20 74 69 6d 65 4d 61 70 2e 72 65 6d 6f      timeMap.remo
0d70: 76 65 28 69 64 29 3b 0a 20 20 20 20 68 61 6e 64  ve(id);.    hand
0d80: 6c 65 72 4d 61 70 2e 72 65 6d 6f 76 65 28 69 64  lerMap.remove(id
0d90: 29 3b 0a 20 20 20 20 72 65 71 75 65 73 74 4d 61  );.    requestMa
0da0: 70 2e 72 65 6d 6f 76 65 28 69 64 29 3b 0a 20 20  p.remove(id);.  
0db0: 7d 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 54 68  }..  /**.   * Th
0dc0: 65 20 63 6c 65 61 6e 65 72 20 74 68 72 65 61 64  e cleaner thread
0dd0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 63 61   performs the ca
0de0: 63 68 65 20 65 76 69 63 74 69 6f 6e 20 66 6f 72  che eviction for
0df0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6d 61   the internal ma
0e00: 70 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6d  ps used by the m
0e10: 61 70 70 65 72 2e 0a 20 20 20 2a 2f 0a 20 20 63  apper..   */.  c
0e20: 6c 61 73 73 20 43 6c 65 61 6e 65 72 54 68 72 65  lass CleanerThre
0e30: 61 64 20 65 78 74 65 6e 64 73 20 54 68 72 65 61  ad extends Threa
0e40: 64 20 7b 0a 20 20 20 20 0a 20 20 20 20 70 75 62  d {.    .    pub
0e50: 6c 69 63 20 43 6c 65 61 6e 65 72 54 68 72 65 61  lic CleanerThrea
0e60: 64 28 53 74 72 69 6e 67 20 73 74 72 69 6e 67 29  d(String string)
0e70: 20 7b 0a 20 20 20 20 20 20 73 75 70 65 72 28 73   {.      super(s
0e80: 74 72 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 0a 20  tring);.    }.. 
0e90: 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20 20     @Override.   
0ea0: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 72 75 6e   public void run
0eb0: 28 29 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  () {.      while
0ec0: 20 28 74 72 75 65 29 20 7b 0a 20 20 20 20 20 20   (true) {.      
0ed0: 20 20 63 6c 65 61 6e 4d 61 70 28 29 3b 0a 20 20    cleanMap();.  
0ee0: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
0ef0: 20 20 20 20 20 20 54 68 72 65 61 64 2e 73 6c 65        Thread.sle
0f00: 65 70 28 65 78 70 69 72 79 49 6e 4d 69 6c 6c 69  ep(expiryInMilli
0f10: 73 20 2f 20 32 29 3b 0a 20 20 20 20 20 20 20 20  s / 2);.        
0f20: 7d 20 63 61 74 63 68 20 28 49 6e 74 65 72 72 75  } catch (Interru
0f30: 70 74 65 64 45 78 63 65 70 74 69 6f 6e 20 69 65  ptedException ie
0f40: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 74 68  ) {.          th
0f50: 72 6f 77 20 6e 65 77 20 52 75 6e 74 69 6d 65 45  row new RuntimeE
0f60: 78 63 65 70 74 69 6f 6e 28 69 65 29 3b 0a 20 20  xception(ie);.  
0f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
0f80: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
0f90: 74 65 20 76 6f 69 64 20 63 6c 65 61 6e 4d 61 70  te void cleanMap
0fa0: 28 29 20 7b 0a 20 20 20 20 20 20 6c 6f 6e 67 20  () {.      long 
0fb0: 63 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 6e 65  currentTime = ne
0fc0: 77 20 44 61 74 65 28 29 2e 67 65 74 54 69 6d 65  w Date().getTime
0fd0: 28 29 3b 0a 20 20 20 20 20 20 66 6f 72 20 28 53  ();.      for (S
0fe0: 74 72 69 6e 67 20 69 64 20 3a 20 74 69 6d 65 4d  tring id : timeM
0ff0: 61 70 2e 6b 65 79 53 65 74 28 29 29 20 7b 0a 20  ap.keySet()) {. 
1000: 20 20 20 20 20 20 20 69 66 20 28 63 75 72 72 65         if (curre
1010: 6e 74 54 69 6d 65 20 3e 20 28 74 69 6d 65 4d 61  ntTime > (timeMa
1020: 70 2e 67 65 74 28 69 64 29 20 2b 20 65 78 70 69  p.get(id) + expi
1030: 72 79 49 6e 4d 69 6c 6c 69 73 29 29 20 7b 0a 20  ryInMillis)) {. 
1040: 20 20 20 20 20 20 20 20 20 4a 73 6f 6e 52 70 63           JsonRpc
1050: 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 72  RequestMessage r
1060: 65 71 75 65 73 74 20 3d 20 72 65 71 75 65 73 74  equest = request
1070: 4d 61 70 2e 67 65 74 28 69 64 29 3b 0a 20 20 20  Map.get(id);.   
1080: 20 20 20 20 20 20 20 4a 73 6f 6e 52 70 63 52 65         JsonRpcRe
1090: 73 70 6f 6e 73 65 48 61 6e 64 6c 65 72 20 72 65  sponseHandler re
10a0: 73 70 6f 6e 73 65 48 61 6e 64 6c 65 72 20 3d 20  sponseHandler = 
10b0: 68 61 6e 64 6c 65 72 4d 61 70 2e 67 65 74 28 69  handlerMap.get(i
10c0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
10d0: 20 28 72 65 73 70 6f 6e 73 65 48 61 6e 64 6c 65   (responseHandle
10e0: 72 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  r != null) {.   
10f0: 20 20 20 20 20 20 20 20 20 4a 73 6f 6e 52 70 63           JsonRpc
1100: 52 65 73 70 6f 6e 73 65 4d 65 73 73 61 67 65 20  ResponseMessage 
1110: 72 65 73 70 6f 6e 73 65 20 3d 20 6e 65 77 20 4a  response = new J
1120: 73 6f 6e 52 70 63 52 65 73 70 6f 6e 73 65 4d 65  sonRpcResponseMe
1130: 73 73 61 67 65 28 29 3b 0a 20 20 20 20 20 20 20  ssage();.       
1140: 20 20 20 20 20 4a 73 6f 6e 52 70 63 45 72 72 6f       JsonRpcErro
1150: 72 20 65 72 72 6f 72 20 3d 20 6e 65 77 20 4a 73  r error = new Js
1160: 6f 6e 52 70 63 45 72 72 6f 72 28 29 3b 0a 20 20  onRpcError();.  
1170: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2e            error.
1180: 73 65 74 43 6f 64 65 28 30 29 3b 20 2f 2f 20 54  setCode(0); // T
1190: 4f 44 4f 20 55 73 65 20 63 6f 72 72 65 63 74 20  ODO Use correct 
11a0: 63 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 20  code.           
11b0: 20 65 72 72 6f 72 2e 73 65 74 4d 65 73 73 61 67   error.setMessag
11c0: 65 28 22 54 69 6d 65 64 20 6f 75 74 20 77 61 69  e("Timed out wai
11d0: 74 69 6e 67 20 66 6f 72 20 72 65 73 70 6f 6e 73  ting for respons
11e0: 65 20 74 6f 20 72 65 71 75 65 73 74 2e 20 69 64  e to request. id
11f0: 3a 20 22 20 2b 20 69 64 29 3b 0a 20 20 20 20 20  : " + id);.     
1200: 20 20 20 20 20 20 20 72 65 73 70 6f 6e 73 65 2e         response.
1210: 73 65 74 49 64 28 69 64 29 3b 0a 20 20 20 20 20  setId(id);.     
1220: 20 20 20 20 20 20 20 72 65 73 70 6f 6e 73 65 2e         response.
1230: 73 65 74 45 72 72 6f 72 28 65 72 72 6f 72 29 3b  setError(error);
1240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  .            res
1250: 70 6f 6e 73 65 48 61 6e 64 6c 65 72 2e 68 61 6e  ponseHandler.han
1260: 64 6c 65 52 65 73 70 6f 6e 73 65 28 72 65 71 75  dleResponse(requ
1270: 65 73 74 2c 20 72 65 73 70 6f 6e 73 65 29 3b 0a  est, response);.
1280: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1290: 20 20 20 20 20 20 72 65 6d 6f 76 65 28 69 64 29        remove(id)
12a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 7d    }.    }.  }..}
12c0: 0a                                               .