Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 58391200BB1 for ; Thu, 3 Nov 2016 11:43:17 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 56CFF160AFF; Thu, 3 Nov 2016 10:43:17 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 2249B160AFE for ; Thu, 3 Nov 2016 11:43:15 +0100 (CET) Received: (qmail 28963 invoked by uid 500); 3 Nov 2016 10:43:15 -0000 Mailing-List: contact user-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@ignite.apache.org Delivered-To: mailing list user@ignite.apache.org Received: (qmail 28952 invoked by uid 99); 3 Nov 2016 10:43:15 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Nov 2016 10:43:15 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 4B6D918030C for ; Thu, 3 Nov 2016 10:43:14 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 2.38 X-Spam-Level: ** X-Spam-Status: No, score=2.38 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=2, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_SORBS_SPAM=0.5, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=disabled Authentication-Results: spamd3-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id JAr-yJC5sCKt for ; Thu, 3 Nov 2016 10:43:12 +0000 (UTC) Received: from mail-yw0-f171.google.com (mail-yw0-f171.google.com [209.85.161.171]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTPS id 9352F5FC6A for ; Thu, 3 Nov 2016 10:43:11 +0000 (UTC) Received: by mail-yw0-f171.google.com with SMTP id r204so38287859ywb.0 for ; Thu, 03 Nov 2016 03:43:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=KaVQsxvmcbPKSdoCBzlKDxYhN5pxpjejNirdUj+VE+8=; b=f2PD+3l6gpEmR37TBCgMXoxArxkudQLQQa6pp+n+irsnKv/RcPqPLwjC1Gad5DJprd 7Hu3mcSaRPTbaA/U2R8EvDcHB84HGHkMeAab4dU+fzxpzuratqR0VssNks8pG4DVLf4E FEI07B1dq93moeCqYpz17wkMWbquRQ9j1cUgNnDPv74s2UKgGWDphcAkAmFmRAcNw04y iFrUO+7m+g4fzBMwVr0U0wNU65Y9C/TpWVaXrAlvnFo8kv5FYfjwENgP4yVQRwIBkH/Y JXbQJHbOIFX/HBasEUCLfXQKlnK+uJrAoQl06JoQXpv6jrkPVvrw4XEDfbZ/ewmB6Oif JjaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=KaVQsxvmcbPKSdoCBzlKDxYhN5pxpjejNirdUj+VE+8=; b=XfA7pQvHgnCX+9xFj/lW39RDtcRmyC3Cxw1l0pYdaaS/1BPW+pN943XnrceM85L8S2 iUVYeZ9C4akrI7HnpiBWq3JEzR3WTbblj8bxSqTtDdCZ+KmEGWgjTW5I0RtO2e51IUxQ Mw7vwi2njcmoSHXmJIDV4Ll0qPAdUe65HYdDTpUb2/5w1ejOCM4jdyn+19rkrpUKq2cn 4BVJRJTHYQrFcQ5MadHBU/b1fpbSXz5B80+KqgFtOMA0GThgYic+XcGA/GkX/96w6wB8 r/CAE/qc9r1Va2y+RSTk6U526GE5wRWcFVblXHrNLI+WU3oYIbW9qY27dIuZJvqncoQf mK7Q== X-Gm-Message-State: ABUngvd5UG9LQ6nEczplmDxvVVIPlMNFRJT2lGTd1p4iSOtEr9NNowYm9GVeUgEwgueC2vQLBIJeH1StPPYgDg== X-Received: by 10.107.178.148 with SMTP id b142mr8037532iof.69.1478169754828; Thu, 03 Nov 2016 03:42:34 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.55.198 with HTTP; Thu, 3 Nov 2016 03:41:54 -0700 (PDT) In-Reply-To: References: From: Anil Date: Thu, 3 Nov 2016 16:11:54 +0530 Message-ID: Subject: Re: DataStreamer is closed To: user@ignite.apache.org Content-Type: multipart/mixed; boundary=001a114c98b82b1dba0540633751 archived-at: Thu, 03 Nov 2016 10:43:17 -0000 --001a114c98b82b1dba0540633751 Content-Type: multipart/alternative; boundary=001a114c98b82b1db6054063374f --001a114c98b82b1db6054063374f Content-Type: text/plain; charset=UTF-8 Hi Anton, No. ignite nodes looks good. I have attached my KafkaCacheDataStreamer class and following is the code to listen to the kafka topic. IgniteCache is created using java configuration. I see cache size is zero after adding the entries to cache as well from KafkaCacheDataStreamer. Not sure how to log whether the entries added to cache or not. KafkaCacheDataStreamer kafkaStreamer = new KafkaCacheDataStreamer(); Properites pros = new Properites() // kafka properties ConsumerConfig consumerConfig = new ConsumerConfig(props); try { IgniteDataStreamer stmr = ignite.dataStreamer(CacheManager.PERSON_CACHE); // allow overwriting cache data stmr.allowOverwrite(true); kafkaStreamer.setIgnite(ignite); kafkaStreamer.setStreamer(stmr); // set the topic kafkaStreamer.setTopic(kafkaConfig.getString("topic", "TestTopic")); // set the number of threads to process Kafka streams kafkaStreamer.setThreads(1); // set Kafka consumer configurations kafkaStreamer.setConsumerConfig(consumerConfig); // set decoders kafkaStreamer.setKeyDecoder(new StringDecoder(new VerifiableProperties())); kafkaStreamer.setValueDecoder(new StringDecoder(new VerifiableProperties())); kafkaStreamer.setMultipleTupleExtractor(new StreamMultipleTupleExtractor() { @Override public Map extract(String msg) { Map entries = new HashMap<>(); try { KafkaMessage request = Json.decodeValue(msg, KafkaMessage.class); IgniteCache cache = CacheManager.getCache(); if (CollectionUtils.isNotEmpty(request.getPersons())){ String id = null; for (Person ib : request.getPersons()){ if (StringUtils.isNotBlank(ib.getId())){ id = ib.getId(); if (null != ib.isDeleted() && Boolean.TRUE.equals(ib.isDeleted())){ cache.remove(id); }else { // no need to store the id. so setting null. ib.setId(null); entries.put(id, ib); } } } }else { } }catch (Exception ex){ logger.error("Error while updating the cache - {} {} " ,msg, ex); } return entries; } }); kafkaStreamer.start(); }catch (Exception ex){ logger.error("Error in kafka data streamer ", ex); } Please let me know if you see any issues. thanks. On 3 November 2016 at 15:59, Anton Vinogradov wrote: > Anil, > > Could you provide getStreamer() code and full logs? > Possible, ignite node was disconnected and this cause DataStreamer closure. > > On Thu, Nov 3, 2016 at 1:17 PM, Anil wrote: > >> HI, >> >> I have created custom kafka data streamer for my use case and i see >> following exception. >> >> java.lang.IllegalStateException: Data streamer has been closed. >> at org.apache.ignite.internal.processors.datastreamer.DataStrea >> merImpl.enterBusy(DataStreamerImpl.java:360) >> at org.apache.ignite.internal.processors.datastreamer.DataStrea >> merImpl.addData(DataStreamerImpl.java:507) >> at org.apache.ignite.internal.processors.datastreamer.DataStrea >> merImpl.addData(DataStreamerImpl.java:498) >> at net.juniper.cs.cache.KafkaCacheDataStreamer.addMessage(Kafka >> CacheDataStreamer.java:128) >> at net.juniper.cs.cache.KafkaCacheDataStreamer$1.run(KafkaCache >> DataStreamer.java:176) >> at java.util.concurrent.Executors$RunnableAdapter.call( >> Executors.java:511) >> at java.util.concurrent.FutureTask.run(FutureTask.java:266) >> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool >> Executor.java:1142) >> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo >> lExecutor.java:617) >> at java.lang.Thread.run(Thread.java:745) >> >> >> >> addMessage method is >> >> @Override >> protected void addMessage(T msg) { >> if (getMultipleTupleExtractor() == null){ >> Map.Entry e = getSingleTupleExtractor().extract(msg); >> >> if (e != null) >> getStreamer().addData(e); >> >> } else { >> Map m = getMultipleTupleExtractor().extract(msg); >> if (m != null && !m.isEmpty()){ >> getStreamer().addData(m); >> } >> } >> } >> >> >> Do you see any issue ? Please let me know if you need any additional >> information. thanks. >> >> Thanks. >> > > --001a114c98b82b1db6054063374f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi Anton,
No. ignite nodes looks good.

<= /div>
I have attached my KafkaCacheDataStreamer class and following is = the code to listen to the kafka topic. IgniteCache is created using java co= nfiguration.

I see cache size is zero after adding= the entries to cache as well from KafkaCacheDataStreamer. Not sure how to = log whether the entries added to cache or not.

KafkaCacheDataStreamer<String, String, Person> kafkaStreamer =3D ne= w KafkaCacheDataStreamer<String, String, Person>();

=C2=A0Properites pros =3D new Properites() // kafka properties
=C2=A0ConsumerConfig consumerConfig =3D new ConsumerConfig(props);
=C2=A0 =C2=A0
=C2=A0 =C2=A0 try {
=C2=A0 =C2=A0 Ignite= DataStreamer<String, Person> stmr =3D ignite.dataStreamer(CacheManage= r.PERSON_CACHE);
=C2=A0 =C2=A0 =C2=A0 =C2=A0// allow overwriting ca= che data
=C2=A0 =C2=A0 =C2=A0 =C2=A0stmr.allowOverwrite(true);
=C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0kafkaStr= eamer.setIgnite(ignite);
=C2=A0 =C2=A0 =C2=A0 =C2=A0kafkaStreamer.s= etStreamer(stmr);
=C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2= =A0 =C2=A0 =C2=A0// set the topic
=C2=A0 =C2=A0 =C2=A0 =C2=A0kafkaStr= eamer.setTopic(kafkaConfig.getString("topic", "TestTopic&quo= t;));

=C2=A0 =C2=A0 =C2=A0 =C2=A0// set the number o= f threads to process Kafka streams
=C2=A0 =C2=A0 =C2=A0 =C2=A0kafka= Streamer.setThreads(1);
=C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2= =A0 =C2=A0 = =C2=A0 =C2=A0// set Kafka consumer configurations
=C2=A0= =C2=A0 =C2=A0 =C2=A0kafkaStreamer.setConsumerConfig(consumerConfig);
=C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0// set deco= ders
=C2=A0 =C2=A0 =C2=A0 =C2=A0kafkaStreamer.setKeyDecoder(new Str= ingDecoder(new VerifiableProperties()));
=C2=A0 =C2=A0 =C2=A0 =C2= =A0kafkaStreamer.setValueDecoder(new StringDecoder(new VerifiableProperties= ()));
=C2=A0 =C2=A0 =C2=A0 =C2=A0kafkaStreamer.setMultipleTupleExtr= actor(new StreamMultipleTupleExtractor<String, String, Person>() {
=C2=A0 =C2=A0 @Override
=C2=A0 =C2=A0 public Map<String,= Person> extract(String msg) {
=C2=A0 =C2=A0 Map<String, Pe= rson> entries =3D new HashMap<>();
=C2=A0 =C2=A0 try {
=C2=A0 =C2=A0 KafkaMessage request =3D Json.decodeValue(msg, Kafk= aMessage.class);
=C2=A0 =C2=A0 IgniteCache<String, Person>= cache =3D CacheManager.getCache();
=C2=A0 =C2=A0
=C2= =A0 =C2=A0 = if (CollectionUtils.isNotEmpty(request.getPersons())){
=C2=A0 =C2=A0 String id =3D null;
=C2=A0 =C2=A0 for (Pers= on ib : request.getPersons()){ =C2=A0 =C2=A0
=C2=A0 =C2=A0 = if (StringUtils.isNotBlank(ib.getId())){
=C2=A0 =C2=A0 id =3D= ib.getId();
=C2=A0 =C2=A0 if (null !=3D ib.isDeleted() &= & Boolean.TRUE.equals(ib.isDeleted())){
=C2=A0 =C2=A0 ca= che.remove(id);
=C2=A0 =C2=A0 }else {
=C2=A0 =C2=A0= <= /span>// no need to store the id. so setting null.
=C2=A0 =C2=A0 = ib.setId(null);
=C2=A0 =C2=A0 entries.put(id, ib);
=C2=A0 =C2=A0 }
=C2=A0 =C2=A0 }
=C2=A0 =C2= =A0 <= /span>}
=C2=A0 =C2=A0 }else {
=C2=A0 =C2=A0
<= div>=C2=A0 =C2=A0 }
=C2=A0 =C2=A0 }catch (Exception ex){
= =C2=A0 =C2=A0 logger.error("Error while updating the cache - {} {} &q= uot; ,msg, ex);
=C2=A0 =C2=A0 }
=C2=A0 =C2=A0
=C2=A0 =C2=A0 return entries;
=C2=A0 =C2=A0 }
=C2=A0 = =C2=A0 });
=C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 =C2=A0 = =C2=A0kafkaStreamer.start();
=C2=A0 =C2=A0 }catch (Exception ex){
=C2=A0 =C2=A0 logger.error("Error in kafka data streamer ",= ex);
=C2=A0 =C2=A0 }


= Please let me know if you see any issues. thanks.

On 3 November 2016 at 15:59, An= ton Vinogradov <avinogradov@gridgain.com> wrote:
<= blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px= #ccc solid;padding-left:1ex">
Anil,=C2=A0

Could you provide=C2=A0getStreamer() code and full logs?
= Possible, ignite node was disconnected and= this cause DataStreamer closure.

On Thu, Nov 3, 2016 at 1:17 PM, Anil <= anilklce@gmail.com> wrote:
=
HI,

I have created custom kafka data st= reamer for my use case and i see following exception.

<= div>
java.lang.IllegalStateException: Data streamer has been close= d.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 at org.apache.ignite.internal.processors.datastrea= mer.DataStreamerImpl.enterBusy(DataStreamerImpl.java:360)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 at org.apache.ignite.internal.processors.datastreamer.DataSt= reamerImpl.addData(DataStreamerImpl.java:507)
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 at o= rg.apache.ignite.internal.processors.datastreamer.DataStreame= rImpl.addData(DataStreamerImpl.java:498)
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 at net.juniper.cs.cache.KafkaCacheDataStreamer.addMessage(K= afkaCacheDataStreamer.java:128)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = at net.juniper.cs.cache.KafkaCacheDataStreamer$1.run(KafkaCacheDa= taStreamer.java:176)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 at java.util.con= current.Executors$RunnableAdapter.call(Executors.java:511)
<= div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 at java.util.concurrent.FutureTask.run= (FutureTask.java:266)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 at java.util.co= ncurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:114= 2)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 at java.util.concurrent.ThreadPoo<= wbr>lExecutor$Worker.run(ThreadPoolExecutor.java:617)
=C2=A0= =C2=A0 =C2=A0 =C2=A0 at java.lang.Thread.run(Thread.java:745)



addMessage method is = =C2=A0

=C2=A0@Override
=C2=A0 =C2= =A0 protected void addMessage(T msg) {
=C2=A0 =C2=A0 if (getMultipleTupleExtractor() =3D=3D nu= ll){
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Map.Entry<K, V&= gt; e =3D getSingleTupleExtractor().extract(msg);

=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (e !=3D null)
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 getStreamer().addDa= ta(e);

=C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
<= div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Map<K, V> m =3D getMult= ipleTupleExtractor().extract(msg);
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 if (m !=3D null && !m.isEmpty()){
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 getStreamer().addData(= m);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 }

=

Do you see any issue ? Please let me know if you need a= ny additional information. thanks.

Thanks.


--001a114c98b82b1db6054063374f-- --001a114c98b82b1dba0540633751 Content-Type: application/octet-stream; name="KafkaDataSteamer.java" Content-Disposition: attachment; filename="KafkaDataSteamer.java" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iv282aiz0 DQppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQppbXBvcnQgamF2YS51dGlsLkxpc3Q7DQppbXBv cnQgamF2YS51dGlsLk1hcDsNCmltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsNCmltcG9ydCBqYXZh LnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7DQppbXBvcnQgamF2YS51dGlsLmNvbmN1 cnJlbnQuRXhlY3V0b3JzOw0KaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ow0K DQppbXBvcnQgb3JnLmFwYWNoZS5pZ25pdGUuSWduaXRlRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5h cGFjaGUuaWduaXRlLnN0cmVhbS5TdHJlYW1BZGFwdGVyOw0KaW1wb3J0IG9yZy5zbGY0ai5Mb2dn ZXI7DQppbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7DQoNCmltcG9ydCBrYWZrYS5jb25z dW1lci5Db25zdW1lckNvbmZpZzsNCmltcG9ydCBrYWZrYS5jb25zdW1lci5Db25zdW1lckl0ZXJh dG9yOw0KaW1wb3J0IGthZmthLmNvbnN1bWVyLkthZmthU3RyZWFtOw0KaW1wb3J0IGthZmthLmph dmFhcGkuY29uc3VtZXIuQ29uc3VtZXJDb25uZWN0b3I7DQppbXBvcnQga2Fma2EubWVzc2FnZS5N ZXNzYWdlQW5kTWV0YWRhdGE7DQppbXBvcnQga2Fma2Euc2VyaWFsaXplci5EZWNvZGVyOw0KDQpw dWJsaWMgY2xhc3MgS2Fma2FDYWNoZURhdGFTdHJlYW1lcjxULCBLLCBWPiBleHRlbmRzIFN0cmVh bUFkYXB0ZXI8VCwgSywgVj4gew0KICAgIA0KCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBM b2dnZXJGYWN0b3J5LmdldExvZ2dlcihLYWZrYUNhY2hlRGF0YVN0cmVhbWVyLmNsYXNzKTsNCgkN CgkvKiogUmV0cnkgdGltZW91dC4gKi8NCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERG TFRfUkVUUllfVElNRU9VVCA9IDEwMDAwOw0KDQogICAgLyoqIEV4ZWN1dG9yIHVzZWQgdG8gc3Vi bWl0IGthZmthIHN0cmVhbXMuICovDQogICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0 b3I7DQoNCiAgICAvKiogVG9waWMuICovDQogICAgcHJpdmF0ZSBTdHJpbmcgdG9waWM7DQoNCiAg ICAvKiogTnVtYmVyIG9mIHRocmVhZHMgdG8gcHJvY2VzcyBrYWZrYSBzdHJlYW1zLiAqLw0KICAg IHByaXZhdGUgaW50IHRocmVhZHM7DQoNCiAgICAvKiogS2Fma2EgY29uc3VtZXIgY29uZmlnLiAq Lw0KICAgIHByaXZhdGUgQ29uc3VtZXJDb25maWcgY29uc3VtZXJDZmc7DQoNCiAgICAvKiogS2V5 IGRlY29kZXIuICovDQogICAgcHJpdmF0ZSBEZWNvZGVyPFQ+IGtleURlY29kZXI7DQoNCiAgICAv KiogVmFsdWUgZGVjb2Rlci4gKi8NCiAgICBwcml2YXRlIERlY29kZXI8VD4gdmFsRGVjb2RlcjsN Cg0KICAgIC8qKiBLYWZrYSBjb25zdW1lciBjb25uZWN0b3IuICovDQogICAgcHJpdmF0ZSBDb25z dW1lckNvbm5lY3RvciBjb25zdW1lcjsNCg0KICAgIC8qKiBSZXRyeSB0aW1lb3V0LiAqLw0KICAg IHByaXZhdGUgbG9uZyByZXRyeVRpbWVvdXQgPSBERkxUX1JFVFJZX1RJTUVPVVQ7DQoNCiAgICAv KiogU3RvcHBlZC4gKi8NCiAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZDsNCg0K ICAgIC8qKg0KICAgICAqIFNldHMgdGhlIHRvcGljIG5hbWUuDQogICAgICoNCiAgICAgKiBAcGFy YW0gdG9waWMgVG9waWMgbmFtZS4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRUb3BpYyhT dHJpbmcgdG9waWMpIHsNCiAgICAgICAgdGhpcy50b3BpYyA9IHRvcGljOw0KICAgIH0NCg0KICAg IC8qKg0KICAgICAqIFNldHMgdGhlIHRocmVhZHMuDQogICAgICoNCiAgICAgKiBAcGFyYW0gdGhy ZWFkcyBOdW1iZXIgb2YgdGhyZWFkcy4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRUaHJl YWRzKGludCB0aHJlYWRzKSB7DQogICAgICAgIHRoaXMudGhyZWFkcyA9IHRocmVhZHM7DQogICAg fQ0KDQogICAgLyoqDQogICAgICogU2V0cyB0aGUgY29uc3VtZXIgY29uZmlnLg0KICAgICAqDQog ICAgICogQHBhcmFtIGNvbnN1bWVyQ2ZnIENvbnN1bWVyIGNvbmZpZ3VyYXRpb24uDQogICAgICov DQogICAgcHVibGljIHZvaWQgc2V0Q29uc3VtZXJDb25maWcoQ29uc3VtZXJDb25maWcgY29uc3Vt ZXJDZmcpIHsNCiAgICAgICAgdGhpcy5jb25zdW1lckNmZyA9IGNvbnN1bWVyQ2ZnOw0KICAgIH0N Cg0KICAgIC8qKg0KICAgICAqIFNldHMgdGhlIGtleSBkZWNvZGVyLg0KICAgICAqDQogICAgICog QHBhcmFtIGtleURlY29kZXIgS2V5IGRlY29kZXIuDQogICAgICovDQogICAgcHVibGljIHZvaWQg c2V0S2V5RGVjb2RlcihEZWNvZGVyPFQ+IGtleURlY29kZXIpIHsNCiAgICAgICAgdGhpcy5rZXlE ZWNvZGVyID0ga2V5RGVjb2RlcjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTZXRzIHRoZSB2 YWx1ZSBkZWNvZGVyLg0KICAgICAqDQogICAgICogQHBhcmFtIHZhbERlY29kZXIgVmFsdWUgZGVj b2Rlci4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZURlY29kZXIoRGVjb2RlcjxU PiB2YWxEZWNvZGVyKSB7DQogICAgICAgIHRoaXMudmFsRGVjb2RlciA9IHZhbERlY29kZXI7DQog ICAgfQ0KDQogICAgLyoqDQogICAgICogU2V0cyB0aGUgcmV0cnkgdGltZW91dC4NCiAgICAgKg0K ICAgICAqIEBwYXJhbSByZXRyeVRpbWVvdXQgUmV0cnkgdGltZW91dC4NCiAgICAgKi8NCiAgICBw dWJsaWMgdm9pZCBzZXRSZXRyeVRpbWVvdXQobG9uZyByZXRyeVRpbWVvdXQpIHsNCi8vICAgICAg ICBBLmVuc3VyZShyZXRyeVRpbWVvdXQgPiAwLCAicmV0cnlUaW1lb3V0ID4gMCIpOw0KICAgIAlp ZiAocmV0cnlUaW1lb3V0IDw9IDApew0KICAgIAkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4 Y2VwdGlvbigicmV0cnlUaW1lb3V0IG1pc3QgYmUgZ3JlYXRlciB0aGFuIDAiKTsNCiAgICAJCQ0K ICAgIAl9DQogICAgICAgIHRoaXMucmV0cnlUaW1lb3V0ID0gcmV0cnlUaW1lb3V0Ow0KICAgIH0N Cg0KICAgIA0KICAgIEBPdmVycmlkZQ0KICAgIHByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2UoVCBt c2cpIHsNCiAgICAJdHJ5IHsNCiAgICAJCWlmIChnZXRNdWx0aXBsZVR1cGxlRXh0cmFjdG9yKCkg PT0gbnVsbCl7DQogICAgICAgICAgICAgICAgTWFwLkVudHJ5PEssIFY+IGUgPSBnZXRTaW5nbGVU dXBsZUV4dHJhY3RvcigpLmV4dHJhY3QobXNnKTsNCg0KICAgICAgICAgICAgICAgIGlmIChlICE9 IG51bGwpDQogICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbWVyKCkuYWRkRGF0YShlKTsNCg0K ICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBNYXA8SywgVj4gbSA9IGdldE11 bHRpcGxlVHVwbGVFeHRyYWN0b3IoKS5leHRyYWN0KG1zZyk7DQogICAgICAgICAgICAgICAgaWYg KG0gIT0gbnVsbCAmJiAhbS5pc0VtcHR5KCkpew0KICAgICAgICAgICAgICAgICAgICBnZXRTdHJl YW1lcigpLmFkZERhdGEobSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCQ0K ICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGV4KXsNCiAgICAJCWxvZy5lcnJvcigiRXhjZXB0aW9uIHdo aWxlIGFkZGluZyB0byBzdHJlYW1lciAiLCBleCk7DQogICAgCX0NCiAgICB9DQogICAgLyoqDQog ICAgICogU3RhcnRzIHN0cmVhbWVyLg0KICAgICAqDQogICAgICogQHRocm93cyBJZ25pdGVFeGNl cHRpb24gSWYgZmFpbGVkLg0KICAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgew0KICAg ICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGdldFN0cmVhbWVyKCksICJzdHJlYW1lciIpOw0K ICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGdldElnbml0ZSgpLCAiaWduaXRlIik7DQog ICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwodG9waWMsICJ0b3BpYyIpOw0KICAgICAgICBP YmplY3RzLnJlcXVpcmVOb25OdWxsKGtleURlY29kZXIsICJrZXkgZGVjb2RlciIpOw0KICAgICAg ICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHZhbERlY29kZXIsICJ2YWx1ZSBkZWNvZGVyIik7DQog ICAgICAgIA0KICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNvbnN1bWVyQ2ZnLCAia2Fm a2EgY29uc3VtZXIgY29uZmlnIik7DQogICAgICAgIGlmKHRocmVhZHMgPD0gMCl7DQogICAgICAg IAl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaHJlYWRzIGNhbm5vdCBiZSB6 ZXJvIik7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdW1lciA9IGthZmthLmNvbnN1bWVyLkNv bnN1bWVyLmNyZWF0ZUphdmFDb25zdW1lckNvbm5lY3Rvcihjb25zdW1lckNmZyk7DQoNCiAgICAg ICAgTWFwPFN0cmluZywgSW50ZWdlcj4gdG9waWNDbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7DQoN CiAgICAgICAgdG9waWNDbnRNYXAucHV0KHRvcGljLCB0aHJlYWRzKTsNCg0KICAgICAgICBNYXA8 U3RyaW5nLCBMaXN0PEthZmthU3RyZWFtPFQsIFQ+Pj4gY29uc3VtZXJNYXAgPQ0KICAgICAgICAg ICAgY29uc3VtZXIuY3JlYXRlTWVzc2FnZVN0cmVhbXModG9waWNDbnRNYXAsIGtleURlY29kZXIs IHZhbERlY29kZXIpOw0KDQogICAgICAgIExpc3Q8S2Fma2FTdHJlYW08VCwgVD4+IHN0cmVhbXMg PSBjb25zdW1lck1hcC5nZXQodG9waWMpOw0KICAgICAgICANCiAgICAgICAgbG9nLmluZm8oIkth ZmthIGlzIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkiKTsgICAgICAgICAgICAgICAgDQogICAgICAg IGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCh0aHJlYWRzKTsNCg0KICAg ICAgICBzdG9wcGVkID0gZmFsc2U7DQoNCiAgICAgICAgLy8gTm93IGNyZWF0ZSBhbiBvYmplY3Qg dG8gY29uc3VtZSB0aGUgbWVzc2FnZXMuDQogICAgICAgIGZvciAoZmluYWwgS2Fma2FTdHJlYW08 VCwgVD4gc3RyZWFtIDogc3RyZWFtcykgew0KICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5l dyBSdW5uYWJsZSgpIHsNCiAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVu KCkgew0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3BwZWQpIHsNCiAgICAgICAgICAg ICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDb25z dW1lckl0ZXJhdG9yPFQsIFQ+IGl0ID0gc3RyZWFtLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKSAm JiAhc3RvcHBlZDsgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VB bmRNZXRhZGF0YTxULCBUPiBtc2cgPSBpdC5uZXh0KCk7DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxvZy5pbmZvKCJNZXNzYWdlIHJlY2lldmVkIHt9ICIsIG1zZy5tZXNzYWdlKCkp OyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCWFkZE1lc3NhZ2UobXNnLm1lc3NhZ2UoKSk7DQovLyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbWVyKCkuYWRkRGF0YShtc2cua2V5 KCksIG1zZy5tZXNzYWdlKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJNZXNzYWdlIGlzIGln bm9yZWQgZHVlIHRvIGFuIGVycm9yIFttc2c9IiArIG1zZyArICddJywgZSk7DQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQog ICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAo RXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk1l c3NhZ2UgY2FuJ3QgYmUgY29uc3VtZWQgZnJvbSBzdHJlYW0uIFJldHJ5IGFmdGVyICIgKyByZXRy eVRpbWVvdXQgKyAiIG1zLiIsIGUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5 IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHJldHJ5VGlt ZW91dCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvLyBOby1vcC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAg ICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAg IC8qKg0KICAgICAqIFN0b3BzIHN0cmVhbWVyLg0KICAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHN0 b3AoKSB7DQogICAgICAgIHN0b3BwZWQgPSB0cnVlOw0KDQogICAgICAgIGlmIChjb25zdW1lciAh PSBudWxsKQ0KICAgICAgICAgICAgY29uc3VtZXIuc2h1dGRvd24oKTsNCg0KICAgICAgICBpZiAo ZXhlY3V0b3IgIT0gbnVsbCkgew0KICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsNCg0K ICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dG9yLmF3YWl0VGVy bWluYXRpb24oNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkNCiAgICAgICAgICAgICAgICAg ICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbG9n LmRlYnVnKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgY29uc3VtZXIgdGhyZWFkcyB0byBzaHV0IGRv d24sIGV4aXRpbmcgdW5jbGVhbmx5LiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0 Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICBpZiAobG9nLmlz RGVidWdFbmFibGVkKCkpDQogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW50ZXJydXB0 ZWQgZHVyaW5nIHNodXRkb3duLCBleGl0aW5nIHVuY2xlYW5seS4iKTsNCiAgICAgICAgICAgIH0N CiAgICAgICAgfQ0KICAgIH0NCg0KfQ0K --001a114c98b82b1dba0540633751--