Return-Path: Delivered-To: apmail-hadoop-hbase-dev-archive@locus.apache.org Received: (qmail 10026 invoked from network); 28 Feb 2008 06:26:57 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Feb 2008 06:26:57 -0000 Received: (qmail 81002 invoked by uid 500); 28 Feb 2008 06:26:52 -0000 Delivered-To: apmail-hadoop-hbase-dev-archive@hadoop.apache.org Received: (qmail 80981 invoked by uid 500); 28 Feb 2008 06:26:52 -0000 Mailing-List: contact hbase-dev-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hbase-dev@hadoop.apache.org Delivered-To: mailing list hbase-dev@hadoop.apache.org Received: (qmail 80972 invoked by uid 99); 28 Feb 2008 06:26:52 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 27 Feb 2008 22:26:52 -0800 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of mafish@gmail.com designates 64.233.178.249 as permitted sender) Received: from [64.233.178.249] (HELO hs-out-0708.google.com) (64.233.178.249) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 28 Feb 2008 06:26:18 +0000 Received: by hs-out-0708.google.com with SMTP id 23so1649584hsn.13 for ; Wed, 27 Feb 2008 22:26:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=bTmFzzTwV5aOpqMhaWedgIhmY6M+DiidYYSxlJK62xI=; b=nZPBqE8bG6OWYEVK3YQwr6dNMUNR4uvECXtqF15XxlA3pippNx6bOaxgwthuJoq4z5xlfvEkSaixZqW+Sslh+RXB10fjrFSJand8ZNSG0O0GJ0PSEfVK2QZJLdJoJkVj+lTVO/FL2HU2ERNcUMR0EaVE9p/TImBh7EnTrlWgmAI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type; b=lnaBbXX+zthhpCu7wzEnbstXH1kFsm8NxDPJILeidvv4fRXrkeU84hHmEsmhtq/RxHSYcEPeGOwfx3PAeWvmXW2NC8viHa7zndFx3eYuam3g5SYkYDXT0wyBynqsOkt2BvJYo7+W/mYdo3fApcLQW+ysJCRAweBKXVgg7wX2nJc= Received: by 10.100.177.15 with SMTP id z15mr14589504ane.112.1204179966702; Wed, 27 Feb 2008 22:26:06 -0800 (PST) Received: by 10.100.111.14 with HTTP; Wed, 27 Feb 2008 22:26:06 -0800 (PST) Message-ID: <944750dd0802272226t54f33459p512defc738697ff6@mail.gmail.com> Date: Thu, 28 Feb 2008 14:26:06 +0800 From: "Mafish Liu" To: hbase-dev@hadoop.apache.org Subject: Getting start with hbase-based program. MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_29316_26369938.1204179966731" X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_29316_26369938.1204179966731 Content-Type: multipart/alternative; boundary="----=_Part_29317_14857872.1204179966731" ------=_Part_29317_14857872.1204179966731 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, all: I wrote this guild to tell how to start to program with hbase. Please give a review to check if there are any errors or improvements. Attachment is an example. Getting start with hbase-based program. This guild is for those who are fresh to hbase. It can teach you to get involved with basic hbase operations about in 30 minutes, including: --connect to hbase --create/delete tables --add/read/modify/delete columns --add/read/modify/delete values For more details, please refer to hbase java doc. And also, hbase test example is your good teacher. == Before Start == Before start, be sure that you already have your hadoop and hbase run. Please follow "hbase in ten minutes" for details. == Connect to hbase == Steps to connect to hbase: 1. Read configuration file. 2. Get HBaseAdmin. HBaseAdmin is the entry to access hbase tables. ... //configuration file HBaseConfiguration hbaseConf = new HBaseConfiguration(); //connect to hbase. HBaseAdmin hbaseAdmin = new HBaseAdmin(hbaseConf); ... == Create tables == Steps to create tables: 1. Decide table name. 2. Decide column families. 3. Create tables //table name Text tableName = new Text(TABLENAME); //column family Text columnFamily = new Text (COLUMNFAMILY); //column descriptor HColumnDescriptor column = new HColumnDescriptor( columnFamily.toString()); //table descriptor HTableDescriptor table = new HTableDescriptor(tableName.toString()); //add column into table table.addFamily(column); //create table try { hbaseAdmin.createTable(table); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } == get all table names == Use method listTables() in class org.apache.hadoop.hbase.HBaseAdmin. == delete table == You can delte a table by simply giving a table name. hbaseAdmin.deleteTable(table); == read all column names == Step to get all column names: 1. Get table descriptor by table name. 2. Get column family set. Set colNames = null; //get table descriptor by table name HTableDescriptor tableDesc = null; HTableDescriptor[] tableDescs = hbaseAdmin.listTables(); for (HTableDescriptor t : tableDescs) { if (t.getName().toString().equals(TABLENAME)) tableDesc = t; } //get all column names colNames = tableDesc.getFamilies().keySet(); == add/delete/modify column == Please refer to method addColumn(), deleteColumn(), modifyColumn() in class org.apache.hadoop.hbase.HBaseAdmin. Note that you need to disable table by call hbaseAdmin.disableTable() method before the operation and hbaseAdmin.enableTable() after. == insert/update data in table == Step to add data into table: 1. Get HTable by table name. 2. Start atomic insert/update 3. Perform insert/update 4. Commit //get HTable by name HTable table = new HTable (hbaseConf, TABLENAME); //start insert long lockid = table.startUpdate(ROW); //insert byte[] value = VALUE.toString().getBytes("UTF-8"); table.put(lockid, COLUMNFAMILY1, value); //commit table.commit(lockid); == read column values == HashMap> results = new HashMap(); //get table HTable table = new HTable (hbaseConf, TABLENAME); //get scanner HScannerInterface scanner = table.obtainScanner(new Text[]{COLUMNFAMILY1}, new Text("")); //scan table HStoreKey key = new HStoreKey(); TreeMap resultOfRow = new TreeMap(); while(scanner.next(key, resultOfRow)) { results.put(key.getRow(), resultOfRow); key = new HStoreKey(); resultOfRow = new TreeMap(); } -- Mafish@gmail.com Institute of Computing Technology, Chinese Academy of Sciences, Beijing. ------=_Part_29317_14857872.1204179966731 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, all:
  I wrote this guild to tell how to start to program with hbase. Please give a review to
check if there are any errors or improvements.
  Attachment is an example.

Getting start with hbase-based program.

This guild is for those who are fresh to hbase. It can teach you to
get involved with basic hbase operations about in 30 minutes, including:
--connect to hbase
--create/delete tables
--add/read/modify/delete columns
--add/read/modify/delete values

For more details, please refer to hbase java doc. And also, hbase test
example is your good teacher.

== Before Start ==

Before start, be sure that you already have your hadoop and hbase run.
Please follow "hbase in ten minutes" for details.

== Connect to hbase ==
Steps to connect to hbase:
1. Read configuration file.
2. Get HBaseAdmin. HBaseAdmin is the entry to access hbase tables.
    ...
    //configuration file
    HBaseConfiguration hbaseConf = new HBaseConfiguration();
    //connect to hbase.
    HBaseAdmin hbaseAdmin = new HBaseAdmin(hbaseConf);
    ...

== Create tables ==
Steps to create tables:
1. Decide table name.
2. Decide column families.
3. Create tables
  
        //table name
        Text tableName = new Text(TABLENAME);
        //column family
        Text columnFamily = new Text (COLUMNFAMILY);
        //column descriptor
        HColumnDescriptor column = new HColumnDescriptor(columnFamily.toString());
        //table descriptor
        HTableDescriptor table = new HTableDescriptor(tableName.toString());
        //add column into table
        table.addFamily(column);
       
        //create table
        try {
            hbaseAdmin.createTable(table);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

== get all table names ==
Use method listTables() in class org.apache.hadoop.hbase.HBaseAdmin.

== delete table ==
You can delte a table by simply giving a table name.
        hbaseAdmin.deleteTable(table);

== read all column names ==
Step to get all column names:
1. Get table descriptor by table name.
2. Get column family set.

        Set<Text> colNames = null;
        //get table descriptor by table name
        HTableDescriptor tableDesc = null;
        HTableDescriptor[] tableDescs = hbaseAdmin.listTables();
        for (HTableDescriptor t : tableDescs) {
            if (t.getName().toString().equals(TABLENAME))
                tableDesc = t;
        }
       
        //get all column names
        colNames = tableDesc.getFamilies().keySet();


== add/delete/modify column ==
Please refer to method addColumn(), deleteColumn(), modifyColumn() in
class org.apache.hadoop.hbase.HBaseAdmin.

Note that you need to disable table by call hbaseAdmin.disableTable()
method before the operation and hbaseAdmin.enableTable() after.

== insert/update data in table ==
Step to add data into table:
1. Get HTable by table name.
2. Start atomic insert/update
3. Perform insert/update
4. Commit
        //get HTable by name
        HTable table = new HTable (hbaseConf, TABLENAME);
        //start insert
        long lockid = table.startUpdate(ROW);
        //insert
        byte[] value = VALUE.toString().getBytes("UTF-8");
        table.put(lockid, COLUMNFAMILY1, value);
        //commit
        table.commit(lockid);

== read column values ==

        HashMap<Text, TreeMap<Text,byte[]>> results = new HashMap();
       
        //get table
        HTable table = new HTable (hbaseConf, TABLENAME);
        //get scanner
        HScannerInterface scanner = table.obtainScanner(new Text[]{COLUMNFAMILY1}, new Text(""));
        //scan table
        HStoreKey key = new HStoreKey();
        TreeMap<Text, byte[]> resultOfRow = new TreeMap<Text, byte[]>();

        while(scanner.next(key, resultOfRow)) {
            results.put(key.getRow(), resultOfRow);
            key = new HStoreKey();
            resultOfRow = new TreeMap<Text, byte[]>();
        }


--
Mafish@gmail.com
Institute of Computing Technology, Chinese Academy of Sciences, Beijing.
------=_Part_29317_14857872.1204179966731-- ------=_Part_29316_26369938.1204179966731 Content-Type: text/x-java; name=HTableTest.java Content-Transfer-Encoding: base64 X-Attachment-Id: f_fd6xffgh0 Content-Disposition: attachment; filename=HTableTest.java cGFja2FnZSBjbi5hYy5pY3QuaGxhOwoKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBv cnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwppbXBvcnQgamF2YS51 dGlsLlRyZWVNYXA7CgppbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGJhc2UuSEJhc2VBZG1pbjsK aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhiYXNlLkhCYXNlQ29uZmlndXJhdGlvbjsKaW1wb3J0 IG9yZy5hcGFjaGUuaGFkb29wLmhiYXNlLkhDb2x1bW5EZXNjcmlwdG9yOwppbXBvcnQgb3JnLmFw YWNoZS5oYWRvb3AuaGJhc2UuSFNjYW5uZXJJbnRlcmZhY2U7CmltcG9ydCBvcmcuYXBhY2hlLmhh ZG9vcC5oYmFzZS5IU3RvcmVLZXk7CmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5oYmFzZS5IVGFi bGU7CmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5oYmFzZS5IVGFibGVEZXNjcmlwdG9yOwppbXBv cnQgb3JnLmFwYWNoZS5oYWRvb3AuaGJhc2UuTWFzdGVyTm90UnVubmluZ0V4Y2VwdGlvbjsKaW1w b3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLlRleHQ7CgovKioKICogVGhpcyBjbGFzcyBkZW1vbnN0 cmF0ZXMgdGhlIGJhc2ljIGhiYXNlIG9wZXJhdGlvbnMsIGluY2x1ZGluZzoKICogLS1jb25uZWN0 IHRvIGhiYXNlCiAqIC0tY3JlYXRlL2RlbGV0ZSB0YWJsZXMKICogLS1pbnNlcnQvbW9kaWZ5L2Rl bGV0ZSBjb2x1bW5zIAogKiAtLWluc2VydC9tb2RpZnkvZGVsZXRlIHZhbHVlcwogKiBAYXV0aG9y IG1hZmlzaEBnbWFpbC5jb20KICoKICovCnB1YmxpYyBjbGFzcyBIVGFibGVUZXN0IHsKCS8vdGFi bGUgbmFtZQoJcHVibGljIHN0YXRpYyBmaW5hbCBUZXh0IFRBQkxFTkFNRSA9IG5ldyBUZXh0KCJ0 ZXN0dGFibGUiKTsKCS8vY29sdW1uIGZhbWlseSAxCglwdWJsaWMgc3RhdGljIGZpbmFsIFRleHQg Q09MVU1ORkFNSUxZMT0gbmV3IFRleHQgKCJ0ZXN0aW5mbzE6Iik7CgkvL2NvbHVtbiBmYW1pbHkg MgoJcHVibGljIHN0YXRpYyBmaW5hbCBUZXh0IENPTFVNTkZBTUlMWTIgPSBuZXcgVGV4dCgidGVz dGluZm8yOiIpOwoJLy9yb3cKCXB1YmxpYyBzdGF0aWMgZmluYWwgVGV4dCBST1cgPSBuZXcgVGV4 dCgicm93Iik7CgkvL3ZhbHVlCglwdWJsaWMgc3RhdGljIGZpbmFsIFRleHQgVkFMVUUgPSBuZXcg VGV4dCgidmFsdWUiKTsKCS8qKiByZWFkIGNvbmZpZ3VyYXRpb24gZmlsZSovCglwcml2YXRlIEhC YXNlQ29uZmlndXJhdGlvbiBoYmFzZUNvbmYgPSBudWxsOwoJLyoqIEhCYXNlQWRtaW4gaXMgdGhl IGtleSB0byBhY2Nlc3MgaGJhc2UgdGFibGVzICovCglwcml2YXRlIEhCYXNlQWRtaW4gaGJhc2VB ZG1pbiA9IG51bGw7CgkKCS8qKgoJICogY29ubmVjdCB0byBoYmFzZSBtYXN0ZXIuCgkgKi8KCXB1 YmxpYyBIVGFibGVUZXN0ICgpIHsKCQl0aGlzLmhiYXNlQ29uZiA9IG5ldyBIQmFzZUNvbmZpZ3Vy YXRpb24gKCk7CgkJdHJ5IHsKCQkJLy9jb25uZWN0IHRvIGhiYXNlIG1hc3Rlci4KCQkJdGhpcy5o YmFzZUFkbWluID0gbmV3IEhCYXNlQWRtaW4oaGJhc2VDb25mKTsKCQl9IGNhdGNoIChNYXN0ZXJO b3RSdW5uaW5nRXhjZXB0aW9uIGUpIHsKCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQl9Cgl9CgkK CS8qKgoJICogQHJldHVybiBIQmFzZUFkbWluIAoJICovCglwdWJsaWMgSEJhc2VBZG1pbiBnZXRB ZG1pbiAoKSB7CgkJcmV0dXJuIHRoaXMuaGJhc2VBZG1pbjsKCX0KCQoJLyoqCgkgKiAgY3JlYXRl IHRhYmxlIHdoaWNoIGlzIG5hbWVkIFRBQkxFTkFNRSB3aXRoIGNvbmx1bW4gQ09MVU1ORkFNSUxZ MQoJICogQHRocm93cyBJT0V4Y2VwdGlvbgoJICovCglwdWJsaWMgdm9pZCBjcmVhdGVUYWJsZSgp IHRocm93cyBJT0V4Y2VwdGlvbnsKCgkJLy9jb2x1bW4gZGVzY3JpcHRvcgoJCUhDb2x1bW5EZXNj cmlwdG9yIGNvbHVtbiA9IG5ldyBIQ29sdW1uRGVzY3JpcHRvcihDT0xVTU5GQU1JTFkxLnRvU3Ry aW5nKCkpOwoJCS8vdGFibGUgZGVzY3JpcHRvcgoJCUhUYWJsZURlc2NyaXB0b3IgdGFibGUgPSBu ZXcgSFRhYmxlRGVzY3JpcHRvcihUQUJMRU5BTUUudG9TdHJpbmcoKSk7CgkJLy9hZGQgY29sdW1u IGludG8gdGFibGUKCQl0YWJsZS5hZGRGYW1pbHkoY29sdW1uKTsKCQkvL2NyZWF0ZSB0YWJsZQoJ CWNyZWF0ZVRhYmxlKHRhYmxlKTsKCX0KCQoJLyoqCgkgKiBjcmVhdGUgdGFibGUKCSAqIEBwYXJh bSB0YWJsZURlcyB0YWJsZSBkZXNjcmlwdG9yCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCgkgKi8K CXB1YmxpYyB2b2lkIGNyZWF0ZVRhYmxlKEhUYWJsZURlc2NyaXB0b3IgdGFibGVEZXMpIHRocm93 cyBJT0V4Y2VwdGlvbiB7CgkJdGhpcy5oYmFzZUFkbWluLmNyZWF0ZVRhYmxlKHRhYmxlRGVzKTsK CX0KCQoJLyoqCgkgKiBkZWxldGUgdGFibGUKCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KCSAqLwoJ cHVibGljIHZvaWQgZGVsZXRlVGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb257CgkJdGhpcy5oYmFz ZUFkbWluLmRlbGV0ZVRhYmxlKFRBQkxFTkFNRSk7Cgl9CgkKCS8qKgoJICogIGFkZCBhIGNvbHVt biBmYW1pbHkKCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KCSAqLwoJcHVibGljIHZvaWQgYWRkQ29s dW1uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCQl0aGlzLmhiYXNlQWRtaW4uZGlzYWJsZVRhYmxl KFRBQkxFTkFNRSk7CgkJSENvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IG5ldyBIQ29sdW1uRGVz Y3JpcHRvciAoQ09MVU1ORkFNSUxZMi50b1N0cmluZygpKTsKCQl0aGlzLmhiYXNlQWRtaW4uYWRk Q29sdW1uKFRBQkxFTkFNRSwgY29sRGVzYyk7CgkJdGhpcy5oYmFzZUFkbWluLmVuYWJsZVRhYmxl KFRBQkxFTkFNRSk7CgkJCgl9CgkKCS8qKgoJICogZGVsZXRlIGEgY29sdW1uIGZhbWlseQoJICog QHRocm93cyBJT0V4Y2VwdGlvbgoJICovCglwdWJsaWMgdm9pZCBkZWxldGVDb2x1bW4oKSB0aHJv d3MgSU9FeGNlcHRpb257CgkJdGhpcy5oYmFzZUFkbWluLmRpc2FibGVUYWJsZShUQUJMRU5BTUUp OwoJCXRoaXMuaGJhc2VBZG1pbi5kZWxldGVDb2x1bW4oVEFCTEVOQU1FLCBDT0xVTU5GQU1JTFkx KTsKCQl0aGlzLmhiYXNlQWRtaW4uZW5hYmxlVGFibGUoVEFCTEVOQU1FKTsKCX0KCQoJLyoqCgkg KiBtb2RpZnkgY29sdW1uIGZhbWlseSBuYW1lIGZyb20gQ09MVU1ORkFNSUxZMSB0byBDT0xVTU5G QU1JTFkyCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyB2b2lkIG1vZGlmeUNv bHVtbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJdGhpcy5oYmFzZUFkbWluLmRpc2FibGVUYWJs ZShUQUJMRU5BTUUpOwoJCUhDb2x1bW5EZXNjcmlwdG9yIGNvbERlc2MgPSBuZXcgSENvbHVtbkRl c2NyaXB0b3IoQ09MVU1ORkFNSUxZMS50b1N0cmluZygpKTsKCQl0aGlzLmhiYXNlQWRtaW4ubW9k aWZ5Q29sdW1uKFRBQkxFTkFNRSwgQ09MVU1ORkFNSUxZMiwgY29sRGVzYyk7CgkJdGhpcy5oYmFz ZUFkbWluLmVuYWJsZVRhYmxlKFRBQkxFTkFNRSk7Cgl9CgkKCS8qKgoJICogcmVhZCBhbGwgY29s dW1uIGZhbWlseSBuYW1lcwoJICogQHJldHVybiBBIFNldDxUZXh0PiB3aXRoIGZhbWlseSBuYW1l cy4gCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBTZXQ8VGV4dD4gcmVhZEFs bENvbE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCQlTZXQ8VGV4dD4gY29sTmFtZXMgPSBu dWxsOwoJCS8vZ2V0IHRhYmxlIGRlc2NyaXB0b3IKCQlIVGFibGVEZXNjcmlwdG9yIHRhYmxlRGVz YyA9IG51bGw7CgkJSFRhYmxlRGVzY3JpcHRvcltdIHRhYmxlRGVzY3MgPSBoYmFzZUFkbWluLmxp c3RUYWJsZXMoKTsKCQlmb3IgKEhUYWJsZURlc2NyaXB0b3IgdCA6IHRhYmxlRGVzY3MpIHsKCQkJ aWYgKHQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKFRBQkxFTkFNRS50b1N0cmluZygpKSkg CgkJCQl0YWJsZURlc2MgPSB0OwoJCQllbHNlIHsKCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigi Tm8gc3VjaCB0YWJsZToiICsgVEFCTEVOQU1FKTsKCQkJfQoJCX0KCQkKCQkvL2dldCBhbGwgY29s dW1uIG5hbWVzCgkJY29sTmFtZXMgPSB0YWJsZURlc2MuZ2V0RmFtaWxpZXMoKS5rZXlTZXQoKTsK CQlyZXR1cm4gY29sTmFtZXM7Cgl9CgkKCS8qKgoJICogYWRkIGRhdGEgaW50byB0YWJsZS4KCSAq IEB0aHJvd3MgSU9FeGNlcHRpb24KCSAqLwoJcHVibGljIHZvaWQgYWRkRGF0YUludG9UYWJsZSgp IHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJLy9nZXQgSFRhYmxlIGJ5IG5hbWUKCQlIVGFibGUgdGFi bGUgPSBuZXcgSFRhYmxlIChoYmFzZUNvbmYsIFRBQkxFTkFNRSk7CgkJLy9zdGFydCBpbnNlcnQg dmFsdWVzIGludG8gcm93ICJyb3ciLgoJCS8vaWYgeW91IHdhbnQgdG8gaW5zZXJ0L3VwZGF0ZSBt dWx0aXBsZSByb3dzLCAKCQkvL3JlbWVtYmVyIGdpdmUgZGlmZmVyZW50IHJvdyBuYW1lIGZvciBl YWNoIHJvdy4KCQlsb25nIGxvY2tpZCA9IHRhYmxlLnN0YXJ0VXBkYXRlKFJPVyk7CgkJLy9pbnNl cnQKCQlieXRlW10gdmFsdWUgPSBWQUxVRS50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpOwoJ CXRhYmxlLnB1dChsb2NraWQsIENPTFVNTkZBTUlMWTEsIHZhbHVlKTsKCQkvL2NvbW1pdAoJCXRh YmxlLmNvbW1pdChsb2NraWQpOwoJfQoJCgkvKioKCSAqIHJlYWQgYWxsIHZhbHVlIGZyb20gdGFi bGUgVEFCTEVOQU1FCgkgKiBAcmV0dXJuIGEgSGFzaE1hcCBvZiByb3ctPihjb2x1bW4tPnZhbHVl KQoJICogQHRocm93cyBJT0V4Y2VwdGlvbgoJICovCglwdWJsaWMgSGFzaE1hcDxUZXh0LCBUcmVl TWFwPFRleHQsYnl0ZVtdPj4gIGdldEFsbFZhbHVlcyAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoJ CUhhc2hNYXA8VGV4dCwgVHJlZU1hcDxUZXh0LGJ5dGVbXT4+IHJlc3VsdHMgPSBuZXcgSGFzaE1h cCgpOwoJCQoJCS8vZ2V0IHRhYmxlCgkJSFRhYmxlIHRhYmxlID0gbmV3IEhUYWJsZSAoaGJhc2VD b25mLCBUQUJMRU5BTUUpOwoJCS8vZ2V0IHNjYW5uZXIKCQlIU2Nhbm5lckludGVyZmFjZSBzY2Fu bmVyID0gdGFibGUub2J0YWluU2Nhbm5lcihuZXcgVGV4dFtde0NPTFVNTkZBTUlMWTF9LCBuZXcg VGV4dCgiIikpOwoJCS8vc2NhbiB0YWJsZQoJCUhTdG9yZUtleSBrZXkgPSBuZXcgSFN0b3JlS2V5 KCk7CgkJVHJlZU1hcDxUZXh0LCBieXRlW10+IHJlc3VsdE9mUm93ID0gbmV3IFRyZWVNYXA8VGV4 dCwgYnl0ZVtdPigpOwoKCQl3aGlsZShzY2FubmVyLm5leHQoa2V5LCByZXN1bHRPZlJvdykpIHsK CQkJcmVzdWx0cy5wdXQoa2V5LmdldFJvdygpLCByZXN1bHRPZlJvdyk7CgkJCWtleSA9IG5ldyBI U3RvcmVLZXkoKTsKCQkJcmVzdWx0T2ZSb3cgPSBuZXcgVHJlZU1hcDxUZXh0LCBieXRlW10+KCk7 CgkJfQoJCXJldHVybiByZXN1bHRzOwkKCX0KfQ== ------=_Part_29316_26369938.1204179966731--