From torque-dev-return-3712-apmail-db-torque-dev-archive=db.apache.org@db.apache.org Sun Nov 23 17:09:51 2003 Return-Path: Delivered-To: apmail-db-torque-dev-archive@www.apache.org Received: (qmail 79733 invoked from network); 23 Nov 2003 17:09:51 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 23 Nov 2003 17:09:51 -0000 Received: (qmail 90669 invoked by uid 500); 23 Nov 2003 17:09:43 -0000 Delivered-To: apmail-db-torque-dev-archive@db.apache.org Received: (qmail 90655 invoked by uid 500); 23 Nov 2003 17:09:43 -0000 Mailing-List: contact torque-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Apache Torque Developers List" Reply-To: "Apache Torque Developers List" Delivered-To: mailing list torque-dev@db.apache.org Received: (qmail 90634 invoked from network); 23 Nov 2003 17:09:42 -0000 Received: from unknown (HELO smtp5.jaring.my) (61.6.32.55) by daedalus.apache.org with SMTP; 23 Nov 2003 17:09:42 -0000 Received: from webmail2.jaring.my ([61.6.32.100]) by smtp5.jaring.my (8.12.10/8.12.10) with ESMTP id hANH9gVB089036; Mon, 24 Nov 2003 01:09:43 +0800 (MYT) (envelope-from ywchiu@paradigm.com.my) Received: (from www@localhost) by webmail2.jaring.my (8.12.9p2/8.12.9/Submit) id hANH9b1O039592; Mon, 24 Nov 2003 01:09:37 +0800 (MYT) (envelope-from ywchiu@paradigm.com.my) Received: from j26.chk.jaring.my (j26.chk.jaring.my [161.142.39.92]) by webmail.jaring.my (IMP) with HTTP for ; Mon, 24 Nov 2003 01:09:36 +0800 Message-ID: <1069607376.3fc0e9d0f1d9c@webmail.jaring.my> Date: Mon, 24 Nov 2003 01:09:36 +0800 From: CHIU YEE WEAY To: Daniel Rall Cc: Apache Torque Developers List Subject: FW: Enhancement to the SQL task to support index and unique MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-MOQ1069607376b360073096c941c81dd01af9cdd3c1e2" User-Agent: JARING Webmail v1.2 (http://www.jaring.my) X-Originating-IP: 161.142.39.92 X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N ---MOQ1069607376b360073096c941c81dd01af9cdd3c1e2 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Greetings Dan, Would you like to look at this and give me some feedbacks ? Thanks. Chiu Yee Weay Systems Engineer Paradigm Systems Sdn Bhd --------------------------------------------------------------------- From: CHIU YEE WEAY Subject: Enhancement to the SQL task to support index and unique Date: Thu, 6 Nov 2003 20:52:43 +0800 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0037_01C3A4A7.F0C5E2A0" Greetings, I have refined the getIndices method as followed : /** * Retrieves a list of unique/non unique indices for a given table. * * @param dbMeta JDBC metadata. * @param tableName Table from which to retrieve index information. * @param unique Flag to indicate whther to retrieve unique/non unique indices. * @return A list of unique/non unique indices in tableName. * @throws SQLException */ public Collection getIndices(DatabaseMetaData dbMeta, String tableName, boolean unique) throws SQLException { Hashtable indices = new Hashtable(); ResultSet indexInfo = null; try { indexInfo = dbMeta.getIndexInfo(null, dbSchema, tableName, unique, false); while (indexInfo.next()) { boolean nonUnique = indexInfo.getBoolean(4); short type = indexInfo.getShort(7); String indexName = indexInfo.getString(6); String columnName = indexInfo.getString(9); if (type != DatabaseMetaData.tableIndexStatistic && nonUnique != unique) { Object[] index = (Object[]) indices.get(indexName); List indexColumns; if (index == null) { index = new Object[2]; index[0] = indexName; indexColumns = new ArrayList(); } else { indexColumns = (ArrayList) index[1]; } indexColumns.add(columnName); index[1] = indexColumns; indices.put(indexName, index); } } } finally { if (indexInfo != null) { indexInfo.close(); } } return indices.values(); } The full updated source file is also attached. I have tested manually this class with some DBMSs, e.g. mssql, and it works fine. I do not have any idea how to write the JUnit test case for this type of ANT task. Can anyone do the test for me ? Or give me some hints on this ? Thanks. Chiu Yee Weay Systems Engineer Paradigm Systems Sdn Bhd -----Original Message----- From: Xavier Maysonnave [mailto:xavier@omondo.com] Sent: Wednesday, November 05, 2003 4:53 PM To: Apache Torque Developers List Subject: Re: Enhancement to the SQL task to support index and unique Hi, This could be a good idea. I already have a hack who manages the indexes with torque. But there is some caveats in your proposition. A foreign key could generate an index and when you reverse the database and try to generate your sql code your database could complain. Some databases generate automatically an index while some others need a defined index on a foreign key. The same rule apply to primary keys. The easiest solution is the following and the job is almost done in my code. I need to add two new rules in the db.props file : indexFilterOnPrimaryKeys and indexFilterOnForeignKeys This rule is specific to a target database. With this done I can filter indexes in a clever way. Regards. Chiu Yee Weay wrote: > Greetings Martin and all, > > The task TorqueJDBCTransformTask does support the generation of XML > schema for tables with columns, primary key and foreign keys, but not > for index and unique constraints. Are there reasons behind ? The task > should have generated the index and unique constraints as parts of the > XML schema. > > Here, I have written a method for retrieving the index information for > tables. Please review : > > /** > * Retrieves a list of unique/non unique indices for a given table. > * > * @param dbMeta JDBC metadata. > * @param tableName Table from which to retrieve index information. > * @param unique Flag to indicate whther to retrieve unique/non > unique indices. > * @return A list of unique/non unique indices in > tableName. > * @throws SQLException > */ > public Collection getIndices(DatabaseMetaData dbMeta, String > tableName, boolean unique) > throws SQLException > { > Hashtable indices = new Hashtable(); > ResultSet indexInfo = null; > try > { > indexInfo = dbMeta.getIndexInfo(null, dbSchema, tableName, > unique, false); > while (indexInfo.next()) > { > short type = indexInfo.getShort(7); > if (type != DatabaseMetaData.tableIndexStatistic) > { > boolean nonUnique = indexInfo.getBoolean(4); > if (nonUnique != unique) > { > String indexName = indexInfo.getString(6); > short ordinalPosition = indexInfo.getShort(8); > String columnName = indexInfo.getString(9); > > Object[] index = (Object[]) > indices.get(indexName); > Vector indexColumns; > if (index == null) > { > index = new Object[2]; > index[0] = indexName; > indexColumns = new Vector(); > } > else > { > indexColumns = (Vector) index[1]; > } > if (indexColumns.size() < ordinalPosition) { > indexColumns.setSize(ordinalPosition); > } > indexColumns.setElementAt(columnName, > ordinalPosition - 1); > index[1] = indexColumns; > > indices.put(indexName, index); > } > } > } > } > finally > { > if (indexInfo != null) > { > indexInfo.close(); > } > } > return indices.values(); > } > > Attached please find the updated source file for > TorqueJDBCTransformTask.java, with the new getIndices method and changes > in the execute method, which are not yet committed to the CVS. > > If you all agree with the changes, I would like the updates to be > committed to the CVS. But I do not have the rights to do that, thus, can > someone, probably Martin, please help me to do this ? > > Thanks. > > Chiu Yee Weay > Systems Engineer > Paradigm Systems Sdn Bhd > --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org For additional commands, e-mail: torque-dev-help@db.apache.org ---------------------------------------------------------------- This e-mail has been sent via JARING webmail at http://www.jaring.my ---MOQ1069607376b360073096c941c81dd01af9cdd3c1e2 Content-Type: text/plain; name="TorqueJDBCTransformTask.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="TorqueJDBCTransformTask.java" cGFja2FnZSBvcmcuYXBhY2hlLnRvcnF1ZS50YXNrOwoKLyogPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogVGhlIEFw YWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKiBDb3B5cmlnaHQgKGMpIDIw MDEtMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCiAqIHJl c2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5 IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEu IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w eXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs b3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxp c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCiAqICAgIHRo ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK ICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBp bmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKICogICAgaWYgYW55LCBtdXN0IGluY2x1 ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKICogICAgICAgIlRoaXMgcHJvZHVjdCBp bmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCiAqICAgICAgICBBcGFjaGUgU29mdHdh cmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgogKiAgICBBbHRlcm5hdGVs eSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYs CiAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBu b3JtYWxseSBhcHBlYXIuCiAqCiAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBT b2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQKICogICAgIkFwYWNoZSBUdXJiaW5lIiBtdXN0IG5vdCBi ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwogKiAgICBkZXJpdmVkIGZyb20g dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yCiAqICAg IHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAq CiAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2Fs bGVkICJBcGFjaGUiLAogKiAgICAiQXBhY2hlIFR1cmJpbmUiLCBub3IgbWF5ICJBcGFjaGUiIGFw cGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0CiAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv biBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUg SVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FS UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB TlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUg U09GVFdBUkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBU TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgog KiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF UiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBU SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNV Q0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9m IHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBi ZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKICogaW5m b3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCiAq IDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KICovCgppbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0 U3RyZWFtOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKCmltcG9ydCBqYXZhLnNxbC5Db25u ZWN0aW9uOwppbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKaW1wb3J0IGphdmEuc3Fs LkRyaXZlck1hbmFnZXI7CmltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CmltcG9ydCBqYXZhLnNx bC5TUUxFeGNlcHRpb247CmltcG9ydCBqYXZhLnNxbC5UeXBlczsKCmltcG9ydCBqYXZhLnV0aWwu QXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwu SGFzaHRhYmxlOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxp c3Q7CmltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50 LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKCmltcG9y dCBvcmcuYXBhY2hlLnRvcnF1ZS5lbmdpbmUuZGF0YWJhc2UubW9kZWwuVHlwZU1hcDsKaW1wb3J0 IG9yZy5hcGFjaGUudG9ycXVlLmVuZ2luZS5kYXRhYmFzZS50cmFuc2Zvcm0uRFREUmVzb2x2ZXI7 CgppbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbDsKaW1wb3J0IG9yZy5h cGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudFR5cGVJbXBsOwoKaW1wb3J0IG9yZy5hcGFjaGUueG1s LnNlcmlhbGl6ZS5NZXRob2Q7CmltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0 Rm9ybWF0OwppbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLlhNTFNlcmlhbGl6ZXI7Cgpp bXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CgovKioK ICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYW4gWE1MIHNjaGVtYSBvZiBhbiBleGlzdGluZyBkYXRh YmFzZSBmcm9tCiAqIEpEQkMgbWV0YWRhdGEuCiAqCiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRv Omp2YW56eWxAcGVyaWFwdC5jb20iPkphc29uIHZhbiBaeWw8L2E+CiAqIEBhdXRob3IgPGEgaHJl Zj0ibWFpbHRvOmZlZG9yLmthcnBlbGV2aXRjaEBiYXJyYS5jb20iPkZlZG9yIEthcnBlbGV2aXRj aDwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86eXdjaGl1QHBhcmFkaWdtLmNvbS5teSI+ Q2hpdSBZZWUgV2VheTwvYT4KICogQHZlcnNpb24gJElkOiBUb3JxdWVKREJDVHJhbnNmb3JtVGFz ay5qYXZhLHYgMS42IDIwMDMvMDgvMjIgMTc6MDE6NDIgbXBvZXNjaGwgRXhwICQKICovCnB1Ymxp YyBjbGFzcyBUb3JxdWVKREJDVHJhbnNmb3JtVGFzayBleHRlbmRzIFRhc2sKewogICAgLyoqIE5h bWUgb2YgWE1MIGRhdGFiYXNlIHNjaGVtYSBwcm9kdWNlZC4gKi8KICAgIHByb3RlY3RlZCBTdHJp bmcgeG1sU2NoZW1hOwoKICAgIC8qKiBKREJDIFVSTC4gKi8KICAgIHByb3RlY3RlZCBTdHJpbmcg ZGJVcmw7CgogICAgLyoqIEpEQkMgZHJpdmVyLiAqLwogICAgcHJvdGVjdGVkIFN0cmluZyBkYkRy aXZlcjsKCiAgICAvKiogSkRCQyB1c2VyIG5hbWUuICovCiAgICBwcm90ZWN0ZWQgU3RyaW5nIGRi VXNlcjsKCiAgICAvKiogSkRCQyBwYXNzd29yZC4gKi8KICAgIHByb3RlY3RlZCBTdHJpbmcgZGJQ YXNzd29yZDsKCiAgICAvKiogREIgc2NoZW1hIHRvIHVzZS4gKi8KICAgIHByb3RlY3RlZCBTdHJp bmcgZGJTY2hlbWE7CgogICAgLyoqIERPTSBkb2N1bWVudCBwcm9kdWNlZC4gKi8KICAgIHByb3Rl Y3RlZCBEb2N1bWVudEltcGwgZG9jOwoKICAgIC8qKiBUaGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50 LiAqLwogICAgcHJvdGVjdGVkIE5vZGUgZGF0YWJhc2VOb2RlOwoKICAgIC8qKiBIYXNodGFibGUg b2YgY29sdW1ucyB0aGF0IGhhdmUgcHJpbWFyeSBrZXlzLiAqLwogICAgcHJvdGVjdGVkIEhhc2h0 YWJsZSBwcmltYXJ5S2V5czsKCiAgICAvKiogSGFzaHRhYmxlIHRvIHRyYWNrIHdoYXQgdGFibGUg YSBjb2x1bW4gYmVsb25ncyB0by4gKi8KICAgIHByb3RlY3RlZCBIYXNodGFibGUgY29sdW1uVGFi bGVNYXA7CgogICAgcHJvdGVjdGVkIGJvb2xlYW4gc2FtZUphdmFOYW1lOwoKICAgIHByaXZhdGUg WE1MU2VyaWFsaXplciB4bWxTZXJpYWxpemVyOwoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGJTY2hl bWEoKQogICAgewogICAgICAgIHJldHVybiBkYlNjaGVtYTsKICAgIH0KCiAgICBwdWJsaWMgdm9p ZCBzZXREYlNjaGVtYShTdHJpbmcgZGJTY2hlbWEpCiAgICB7CiAgICAgICAgdGhpcy5kYlNjaGVt YSA9IGRiU2NoZW1hOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERiVXJsKFN0cmluZyB2KQog ICAgewogICAgICAgIGRiVXJsID0gdjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXREYkRyaXZl cihTdHJpbmcgdikKICAgIHsKICAgICAgICBkYkRyaXZlciA9IHY7CiAgICB9CgogICAgcHVibGlj IHZvaWQgc2V0RGJVc2VyKFN0cmluZyB2KQogICAgewogICAgICAgIGRiVXNlciA9IHY7CiAgICB9 CgogICAgcHVibGljIHZvaWQgc2V0RGJQYXNzd29yZChTdHJpbmcgdikKICAgIHsKICAgICAgICBk YlBhc3N3b3JkID0gdjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlIChTdHJp bmcgdikKICAgIHsKICAgICAgICB4bWxTY2hlbWEgPSB2OwogICAgfQoKICAgIHB1YmxpYyB2b2lk IHNldFNhbWVKYXZhTmFtZShib29sZWFuIHYpCiAgICB7CiAgICAgICAgdGhpcy5zYW1lSmF2YU5h bWUgPSB2OwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZUphdmFOYW1lKCkKICAgIHsK ICAgICAgICByZXR1cm4gdGhpcy5zYW1lSmF2YU5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBE ZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24K ICAgICAqLwogICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgog ICAgewogICAgICAgIGxvZygiVG9ycXVlIC0gSkRCQ1RvWE1MU2NoZW1hIHN0YXJ0aW5nIik7CiAg ICAgICAgbG9nKCJZb3VyIERCIHNldHRpbmdzIGFyZToiKTsKICAgICAgICBsb2coImRyaXZlciA6 ICIgKyBkYkRyaXZlcik7CiAgICAgICAgbG9nKCJVUkwgOiAiICsgZGJVcmwpOwogICAgICAgIGxv ZygidXNlciA6ICIgKyBkYlVzZXIpOwogICAgICAgIC8vIGxvZygicGFzc3dvcmQgOiAiICsgZGJQ YXNzd29yZCk7CiAgICAgICAgbG9nKCJzY2hlbWEgOiAiICsgZGJTY2hlbWEpOwoKICAgICAgICBE b2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbChudWxsLCAiZGF0 YWJhc2UiLCBudWxsLAogICAgICAgICAgICAgICAgRFREUmVzb2x2ZXIuV0VCX1NJVEVfRFREKTsK ICAgICAgICBkb2MgPSBuZXcgRG9jdW1lbnRJbXBsKGRvY1R5cGUpOwogICAgICAgIGRvYy5hcHBl bmRDaGlsZChkb2MuY3JlYXRlQ29tbWVudCgKICAgICAgICAgICAgICAgICIgQXV0b2dlbmVyYXRl ZCBieSBKREJDVG9YTUxTY2hlbWEhICIpKTsKCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAg ICAgICBnZW5lcmF0ZVhNTCgpOwogICAgICAgICAgICBsb2coeG1sU2NoZW1hKTsKICAgICAgICAg ICAgeG1sU2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKAogICAgICAgICAgICAgICAgICAg IG5ldyBQcmludFdyaXRlcigKICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVh bSh4bWxTY2hlbWEpKSwKICAgICAgICAgICAgICAgICAgICBuZXcgT3V0cHV0Rm9ybWF0KE1ldGhv ZC5YTUwsIG51bGwsIHRydWUpKTsKICAgICAgICAgICAgeG1sU2VyaWFsaXplci5zZXJpYWxpemUo ZG9jKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgIHsKICAg ICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgIH0KICAgICAgICBs b2coIlRvcnF1ZSAtIEpEQkNUb1hNTFNjaGVtYSBmaW5pc2hlZCIpOwogICAgfQoKICAgIC8qKgog ICAgICogR2VuZXJhdGVzIGFuIFhNTCBkYXRhYmFzZSBzY2hlbWEgZnJvbSBKREJDIG1ldGFkYXRh LgogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGEgZ2VuZXJpYyBleGNlcHRpb24uCiAg ICAgKi8KICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlWE1MKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAg ewogICAgICAgIC8vIExvYWQgdGhlIEludGVyYmFzZSBEcml2ZXIuCiAgICAgICAgQ2xhc3MuZm9y TmFtZShkYkRyaXZlcik7CiAgICAgICAgbG9nKCJEQiBkcml2ZXIgc3VjZXNzZnVseSBpbnN0YW50 aWF0ZWQiKTsKCiAgICAgICAgLy8gQXR0ZW10cCB0byBjb25uZWN0IHRvIGEgZGF0YWJhc2UuCiAg ICAgICAgQ29ubmVjdGlvbiBjb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oZGJVcmws IGRiVXNlciwgZGJQYXNzd29yZCk7CiAgICAgICAgbG9nKCJEQiBjb25uZWN0aW9uIGVzdGFibGlz aGVkIik7CgogICAgICAgIC8vIEdldCB0aGUgZGF0YWJhc2UgTWV0YWRhdGEuCiAgICAgICAgRGF0 YWJhc2VNZXRhRGF0YSBkYk1ldGFEYXRhID0gY29uLmdldE1ldGFEYXRhKCk7CgogICAgICAgIC8v IFRoZSBkYXRhYmFzZSBtYXAuCiAgICAgICAgTGlzdCB0YWJsZUxpc3QgPSBnZXRUYWJsZU5hbWVz KGRiTWV0YURhdGEpOwoKICAgICAgICBkYXRhYmFzZU5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgi ZGF0YWJhc2UiKTsKCiAgICAgICAgLy8gQnVpbGQgYSBkYXRhYmFzZS13aWRlIGNvbHVtbiAtPiB0 YWJsZSBtYXAuCiAgICAgICAgY29sdW1uVGFibGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CgogICAg ICAgIGxvZygiQnVpbGRpbmcgY29sdW1uL3RhYmxlIG1hcC4uLiIpOwogICAgICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgdGFibGVMaXN0LnNpemUoKTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAg U3RyaW5nIGN1clRhYmxlID0gKFN0cmluZykgdGFibGVMaXN0LmdldChpKTsKICAgICAgICAgICAg TGlzdCBjb2x1bW5zID0gZ2V0Q29sdW1ucyhkYk1ldGFEYXRhLCBjdXJUYWJsZSk7CgogICAgICAg ICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbnMuc2l6ZSgpOyBqKyspCiAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgIExpc3QgY29sID0gKExpc3QpIGNvbHVtbnMuZ2V0KGopOwogICAg ICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBjb2wuZ2V0KDApOwoKICAgICAgICAg ICAgICAgIGNvbHVtblRhYmxlTWFwLnB1dChuYW1lLCBjdXJUYWJsZSk7CiAgICAgICAgICAgIH0K ICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVMaXN0LnNpemUoKTsg aSsrKQogICAgICAgIHsKICAgICAgICAgICAgLy8gQWRkIFRhYmxlLgogICAgICAgICAgICBTdHJp bmcgY3VyVGFibGUgPSAoU3RyaW5nKSB0YWJsZUxpc3QuZ2V0KGkpOwogICAgICAgICAgICAvLyBk Yk1hcC5hZGRUYWJsZShjdXJUYWJsZSk7CiAgICAgICAgICAgIGxvZygiUHJvY2Vzc2luZyB0YWJs ZTogIiArIGN1clRhYmxlKTsKCiAgICAgICAgICAgIEVsZW1lbnQgdGFibGUgPSBkb2MuY3JlYXRl RWxlbWVudCgidGFibGUiKTsKICAgICAgICAgICAgdGFibGUuc2V0QXR0cmlidXRlKCJuYW1lIiwg Y3VyVGFibGUpOwogICAgICAgICAgICBpZiAoaXNTYW1lSmF2YU5hbWUoKSkKICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgdGFibGUuc2V0QXR0cmlidXRlKCJqYXZhTmFtZSIsIGN1clRhYmxl KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRkIENvbHVtbnMuCiAgICAgICAgICAg IC8vIFRhYmxlTWFwIHRibE1hcCA9IGRiTWFwLmdldFRhYmxlKGN1clRhYmxlKTsKCiAgICAgICAg ICAgIExpc3QgY29sdW1ucyA9IGdldENvbHVtbnMoZGJNZXRhRGF0YSwgY3VyVGFibGUpOwogICAg ICAgICAgICBMaXN0IHByaW1LZXlzID0gZ2V0UHJpbWFyeUtleXMoZGJNZXRhRGF0YSwgY3VyVGFi bGUpOwogICAgICAgICAgICBDb2xsZWN0aW9uIGZvcmduS2V5cyA9IGdldEZvcmVpZ25LZXlzKGRi TWV0YURhdGEsIGN1clRhYmxlKTsKICAgICAgICAgICAgQ29sbGVjdGlvbiBpbmRpY2VzID0gZ2V0 SW5kaWNlcyhkYk1ldGFEYXRhLCBjdXJUYWJsZSwgZmFsc2UpOwogICAgICAgICAgICBDb2xsZWN0 aW9uIHVuaXF1ZXMgPSBnZXRJbmRpY2VzKGRiTWV0YURhdGEsIGN1clRhYmxlLCB0cnVlKTsKCiAg ICAgICAgICAgIC8vIFNldCB0aGUgcHJpbWFyeSBrZXlzLgogICAgICAgICAgICBwcmltYXJ5S2V5 cyA9IG5ldyBIYXNodGFibGUoKTsKCiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcHJp bUtleXMuc2l6ZSgpOyBrKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0cmluZyBj dXJQcmltYXJ5S2V5ID0gKFN0cmluZykgcHJpbUtleXMuZ2V0KGspOwogICAgICAgICAgICAgICAg cHJpbWFyeUtleXMucHV0KGN1clByaW1hcnlLZXksIGN1clByaW1hcnlLZXkpOwogICAgICAgICAg ICB9CgogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbnMuc2l6ZSgpOyBqKysp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExpc3QgY29sID0gKExpc3QpIGNvbHVtbnMu Z2V0KGopOwogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBjb2wuZ2V0KDAp OwogICAgICAgICAgICAgICAgSW50ZWdlciB0eXBlID0gKChJbnRlZ2VyKSBjb2wuZ2V0KDEpKTsK ICAgICAgICAgICAgICAgIGludCBzaXplID0gKChJbnRlZ2VyKSBjb2wuZ2V0KDIpKS5pbnRWYWx1 ZSgpOwoKICAgICAgICAgICAgICAgIC8vIEZyb20gRGF0YWJhc2VNZXRhRGF0YS5qYXZhCiAgICAg ICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gSW5kaWNhdGVzIGNvbHVtbiBtaWdodCBu b3QgYWxsb3cgTlVMTCB2YWx1ZXMuICBIdWg/CiAgICAgICAgICAgICAgICAvLyBNaWdodD8gQm95 LCB0aGF0J3MgYSBkZWZpbml0aXZlIGFuc3dlci4KICAgICAgICAgICAgICAgIC8qIGludCBjb2x1 bW5Ob051bGxzID0gMDsgKi8KCiAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgY29sdW1uIGRl ZmluaXRlbHkgYWxsb3dzIE5VTEwgdmFsdWVzLgogICAgICAgICAgICAgICAgLyogaW50IGNvbHVt bk51bGxhYmxlID0gMTsgKi8KCiAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgTlVMTEFCSUxJ VFkgb2YgY29sdW1uIGlzIHVua25vd24uCiAgICAgICAgICAgICAgICAvKiBpbnQgY29sdW1uTnVs bGFibGVVbmtub3duID0gMjsgKi8KCiAgICAgICAgICAgICAgICBJbnRlZ2VyIG51bGxUeXBlID0g KEludGVnZXIpIGNvbC5nZXQoMyk7CiAgICAgICAgICAgICAgICBTdHJpbmcgZGVmVmFsdWUgPSAo U3RyaW5nKSBjb2wuZ2V0KDQpOwoKICAgICAgICAgICAgICAgIEVsZW1lbnQgY29sdW1uID0gZG9j LmNyZWF0ZUVsZW1lbnQoImNvbHVtbiIpOwogICAgICAgICAgICAgICAgY29sdW1uLnNldEF0dHJp YnV0ZSgibmFtZSIsIG5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGlzU2FtZUphdmFOYW1lKCkp CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEF0dHJpYnV0 ZSgiamF2YU5hbWUiLCBuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNv bHVtbi5zZXRBdHRyaWJ1dGUoInR5cGUiLCBUeXBlTWFwLmdldFRvcnF1ZVR5cGUodHlwZSkpOwoK ICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCAmJiAodHlwZS5pbnRWYWx1ZSgpID09IFR5cGVz LkNIQVIKICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5pbnRWYWx1ZSgpID09IFR5cGVz LlZBUkNIQVIKICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5pbnRWYWx1ZSgpID09IFR5 cGVzLkxPTkdWQVJDSEFSCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuaW50VmFsdWUo KSA9PSBUeXBlcy5ERUNJTUFMCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuaW50VmFs dWUoKSA9PSBUeXBlcy5OVU1FUklDKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICBjb2x1bW4uc2V0QXR0cmlidXRlKCJzaXplIiwgU3RyaW5nLnZhbHVlT2Yoc2l6ZSkpOwog ICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChudWxsVHlwZS5pbnRWYWx1ZSgp ID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEF0 dHJpYnV0ZSgicmVxdWlyZWQiLCAidHJ1ZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAg ICAgICAgIGlmIChwcmltYXJ5S2V5cy5jb250YWluc0tleShuYW1lKSkKICAgICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc2V0QXR0cmlidXRlKCJwcmltYXJ5S2V5Iiwg InRydWUiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZGVmVmFsdWUg IT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyB0cmltIG91 dCBwYXJlbnMgJiBxdW90ZXMgb3V0IG9mIGRlZiB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAv LyBtYWtlcyBzZW5zZSBmb3IgTVNTUUwuIG5vdCBzdXJlIGFib3V0IG90aGVycy4KICAgICAgICAg ICAgICAgICAgICBpZiAoZGVmVmFsdWUuc3RhcnRzV2l0aCgiKCIpICYmIGRlZlZhbHVlLmVuZHNX aXRoKCIpIikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBk ZWZWYWx1ZSA9IGRlZlZhbHVlLnN1YnN0cmluZygxLCBkZWZWYWx1ZS5sZW5ndGgoKSAtIDEpOwog ICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZlZhbHVlLnN0 YXJ0c1dpdGgoIiciKSAmJiBkZWZWYWx1ZS5lbmRzV2l0aCgiJyIpKQogICAgICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmVmFsdWUgPSBkZWZWYWx1ZS5zdWJzdHJp bmcoMSwgZGVmVmFsdWUubGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAg ICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRBdHRyaWJ1dGUoImRlZmF1bHQiLCBkZWZWYWx1ZSk7 CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YWJsZS5hcHBlbmRDaGlsZChjb2x1 bW4pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBGb3JlaWduIGtleXMgZm9yIHRoaXMg dGFibGUuCiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbCA9IGZvcmduS2V5cy5pdGVyYXRvcigp OyBsLmhhc05leHQoKTspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE9iamVjdFtdIGZv cktleSA9IChPYmplY3RbXSkgbC5uZXh0KCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgZm9yZWln bktleVRhYmxlID0gKFN0cmluZykgZm9yS2V5WzBdOwogICAgICAgICAgICAgICAgTGlzdCByZWZz ID0gKExpc3QpIGZvcktleVsxXTsKICAgICAgICAgICAgICAgIEVsZW1lbnQgZmsgPSBkb2MuY3Jl YXRlRWxlbWVudCgiZm9yZWlnbi1rZXkiKTsKICAgICAgICAgICAgICAgIGZrLnNldEF0dHJpYnV0 ZSgiZm9yZWlnblRhYmxlIiwgZm9yZWlnbktleVRhYmxlKTsKICAgICAgICAgICAgICAgIGZvciAo aW50IG0gPSAwOyBtIDwgcmVmcy5zaXplKCk7IG0rKykKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICBFbGVtZW50IHJlZiA9IGRvYy5jcmVhdGVFbGVtZW50KCJyZWZlcmVuY2Ui KTsKICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSByZWZEYXRhID0gKFN0cmluZ1tdKSByZWZz LmdldChtKTsKICAgICAgICAgICAgICAgICAgICByZWYuc2V0QXR0cmlidXRlKCJsb2NhbCIsIHJl ZkRhdGFbMF0pOwogICAgICAgICAgICAgICAgICAgIHJlZi5zZXRBdHRyaWJ1dGUoImZvcmVpZ24i LCByZWZEYXRhWzFdKTsKICAgICAgICAgICAgICAgICAgICBmay5hcHBlbmRDaGlsZChyZWYpOwog ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoZmspOwog ICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJbmRpY2VzIGZvciB0aGlzIHRhYmxlLgogICAg ICAgICAgICBmb3IgKEl0ZXJhdG9yIG4gPSBpbmRpY2VzLml0ZXJhdG9yKCk7IG4uaGFzTmV4dCgp OykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgT2JqZWN0W10gaW5kZXggPSAoT2JqZWN0 W10pIG4ubmV4dCgpOwogICAgICAgICAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IChTdHJpbmcp IGluZGV4WzBdOwogICAgICAgICAgICAgICAgTGlzdCBpbmRleENvbHVtbnMgPSAoTGlzdCkgaW5k ZXhbMV07CiAgICAgICAgICAgICAgICBFbGVtZW50IGluZGV4RWxlbWVudCA9IGRvYy5jcmVhdGVF bGVtZW50KCJpbmRleCIpOwogICAgICAgICAgICAgICAgaW5kZXhFbGVtZW50LnNldEF0dHJpYnV0 ZSgibmFtZSIsIGluZGV4TmFtZSk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBvID0gMDsgbyA8 IGluZGV4Q29sdW1ucy5zaXplKCk7IG8rKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgICAgICBTdHJpbmcgaW5kZXhDb2x1bW4gPSAoU3RyaW5nKSBpbmRleENvbHVtbnMuZ2V0KG8p OwogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaW5kZXhDb2x1bW5FbGVtZW50ID0gZG9jLmNy ZWF0ZUVsZW1lbnQoImluZGV4LWNvbHVtbiIpOwogICAgICAgICAgICAgICAgICAgIGluZGV4Q29s dW1uRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBpbmRleENvbHVtbik7CiAgICAgICAgICAg ICAgICAgICAgaW5kZXhFbGVtZW50LmFwcGVuZENoaWxkKGluZGV4Q29sdW1uRWxlbWVudCk7CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YWJsZS5hcHBlbmRDaGlsZChpbmRleEVs ZW1lbnQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBVbmlxdWVzIGZvciB0aGlzIHRh YmxlLgogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHAgPSB1bmlxdWVzLml0ZXJhdG9yKCk7IHAu aGFzTmV4dCgpOykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgT2JqZWN0W10gdW5pcXVl ID0gKE9iamVjdFtdKSBwLm5leHQoKTsKICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUg PSAoU3RyaW5nKSB1bmlxdWVbMF07CiAgICAgICAgICAgICAgICBMaXN0IGluZGV4Q29sdW1ucyA9 IChMaXN0KSB1bmlxdWVbMV07CiAgICAgICAgICAgICAgICBFbGVtZW50IHVuaXF1ZUVsZW1lbnQg PSBkb2MuY3JlYXRlRWxlbWVudCgidW5pcXVlIik7CiAgICAgICAgICAgICAgICB1bmlxdWVFbGVt ZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGluZGV4TmFtZSk7CiAgICAgICAgICAgICAgICBib29s ZWFuIGlzUHJpbWFyeUtleSA9IChpbmRleENvbHVtbnMuc2l6ZSgpID09IHByaW1LZXlzLnNpemUo KSk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBxID0gMDsgcSA8IGluZGV4Q29sdW1ucy5zaXpl KCk7IHErKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5k ZXhDb2x1bW4gPSAoU3RyaW5nKSBpbmRleENvbHVtbnMuZ2V0KHEpOwogICAgICAgICAgICAgICAg ICAgIEVsZW1lbnQgdW5pcXVlQ29sdW1uRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJ1bmlx dWUtY29sdW1uIik7CiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29sdW1uRWxlbWVudC5zZXRB dHRyaWJ1dGUoIm5hbWUiLCBpbmRleENvbHVtbik7CiAgICAgICAgICAgICAgICAgICAgdW5pcXVl RWxlbWVudC5hcHBlbmRDaGlsZCh1bmlxdWVDb2x1bW5FbGVtZW50KTsKICAgICAgICAgICAgICAg ICAgICBpZiAoISBwcmltYXJ5S2V5cy5jb250YWluc0tleShpbmRleENvbHVtbikpCiAgICAgICAg ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnlLZXkgPSBmYWxz ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg ICBpZiAoISBpc1ByaW1hcnlLZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgdGFibGUuYXBwZW5kQ2hpbGQodW5pcXVlRWxlbWVudCk7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KCiAgICAgICAgICAgIGRhdGFiYXNlTm9kZS5hcHBlbmRDaGlsZCh0YWJsZSk7 CiAgICAgICAgfQogICAgICAgIGRvYy5hcHBlbmRDaGlsZChkYXRhYmFzZU5vZGUpOwogICAgfQoK ICAgIC8qKgogICAgICogR2V0IGFsbCB0aGUgdGFibGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgZGF0 YWJhc2UgdGhhdCBhcmUgbm90CiAgICAgKiBzeXN0ZW0gdGFibGVzLgogICAgICoKICAgICAqIEBw YXJhbSBkYk1ldGEgSkRCQyBkYXRhYmFzZSBtZXRhZGF0YS4KICAgICAqIEByZXR1cm4gVGhlIGxp c3Qgb2YgYWxsIHRoZSB0YWJsZXMgaW4gYSBkYXRhYmFzZS4KICAgICAqIEB0aHJvd3MgU1FMRXhj ZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBMaXN0IGdldFRhYmxlTmFtZXMoRGF0YWJhc2VNZXRh RGF0YSBkYk1ldGEpCiAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgewogICAgICAgIGxv ZygiR2V0dGluZyB0YWJsZSBsaXN0Li4uIik7CiAgICAgICAgTGlzdCB0YWJsZXMgPSBuZXcgQXJy YXlMaXN0KCk7CiAgICAgICAgUmVzdWx0U2V0IHRhYmxlTmFtZXMgPSBudWxsOwogICAgICAgIC8v IHRoZXNlIGFyZSB0aGUgZW50aXR5IHR5cGVzIHdlIHdhbnQgZnJvbSB0aGUgZGF0YWJhc2UKICAg ICAgICBTdHJpbmdbXSB0eXBlcyA9IHsiVEFCTEUiLCAiVklFVyJ9OwogICAgICAgIHRyeQogICAg ICAgIHsKICAgICAgICAgICAgdGFibGVOYW1lcyA9IGRiTWV0YS5nZXRUYWJsZXMobnVsbCwgZGJT Y2hlbWEsICIlIiwgdHlwZXMpOwogICAgICAgICAgICB3aGlsZSAodGFibGVOYW1lcy5uZXh0KCkp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGFibGVOYW1lcy5n ZXRTdHJpbmcoMyk7CiAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHRhYmxlTmFtZXMuZ2V0 U3RyaW5nKDQpOwogICAgICAgICAgICAgICAgdGFibGVzLmFkZChuYW1lKTsKICAgICAgICAgICAg fQogICAgICAgIH0KICAgICAgICBmaW5hbGx5CiAgICAgICAgewogICAgICAgICAgICBpZiAodGFi bGVOYW1lcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0YWJsZU5hbWVz LmNsb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhYmxlczsK ICAgIH0KCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIGNvbHVtbiBuYW1lcyBhbmQg dHlwZXMgZm9yIGEgZ2l2ZW4gdGFibGUgZnJvbQogICAgICogSkRCQyBtZXRhZGF0YS4gIEl0IHJl dHVybnMgYSBMaXN0IG9mIExpc3RzLiAgRWFjaCBlbGVtZW50CiAgICAgKiBvZiB0aGUgcmV0dXJu ZWQgTGlzdCBpcyBhIExpc3Qgd2l0aDoKICAgICAqCiAgICAgKiBlbGVtZW50IDAgPT4gYSBTdHJp bmcgb2JqZWN0IGZvciB0aGUgY29sdW1uIG5hbWUuCiAgICAgKiBlbGVtZW50IDEgPT4gYW4gSW50 ZWdlciBvYmplY3QgZm9yIHRoZSBjb2x1bW4gdHlwZS4KICAgICAqIGVsZW1lbnQgMiA9PiBzaXpl IG9mIHRoZSBjb2x1bW4uCiAgICAgKiBlbGVtZW50IDMgPT4gbnVsbCB0eXBlLgogICAgICoKICAg ICAqIEBwYXJhbSBkYk1ldGEgSkRCQyBtZXRhZGF0YS4KICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg VGFibGUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBjb2x1bW4gaW5mb3JtYXRpb24uCiAgICAgKiBA cmV0dXJuIFRoZSBsaXN0IG9mIGNvbHVtbnMgaW4gPGNvZGU+dGFibGVOYW1lPC9jb2RlPi4KICAg ICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBMaXN0IGdldENvbHVt bnMoRGF0YWJhc2VNZXRhRGF0YSBkYk1ldGEsIFN0cmluZyB0YWJsZU5hbWUpCiAgICAgICAgICAg IHRocm93cyBTUUxFeGNlcHRpb24KICAgIHsKICAgICAgICBMaXN0IGNvbHVtbnMgPSBuZXcgQXJy YXlMaXN0KCk7CiAgICAgICAgUmVzdWx0U2V0IGNvbHVtblNldCA9IG51bGw7CiAgICAgICAgdHJ5 CiAgICAgICAgewogICAgICAgICAgICBjb2x1bW5TZXQgPSBkYk1ldGEuZ2V0Q29sdW1ucyhudWxs LCBkYlNjaGVtYSwgdGFibGVOYW1lLCBudWxsKTsKICAgICAgICAgICAgd2hpbGUgKGNvbHVtblNl dC5uZXh0KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY29s dW1uU2V0LmdldFN0cmluZyg0KTsKICAgICAgICAgICAgICAgIEludGVnZXIgc3FsVHlwZSA9IG5l dyBJbnRlZ2VyKGNvbHVtblNldC5nZXRTdHJpbmcoNSkpOwogICAgICAgICAgICAgICAgSW50ZWdl ciBzaXplID0gbmV3IEludGVnZXIoY29sdW1uU2V0LmdldEludCg3KSk7CiAgICAgICAgICAgICAg ICBJbnRlZ2VyIG51bGxUeXBlID0gbmV3IEludGVnZXIoY29sdW1uU2V0LmdldEludCgxMSkpOwog ICAgICAgICAgICAgICAgU3RyaW5nIGRlZlZhbHVlID0gY29sdW1uU2V0LmdldFN0cmluZygxMyk7 CgogICAgICAgICAgICAgICAgTGlzdCBjb2wgPSBuZXcgQXJyYXlMaXN0KDUpOwogICAgICAgICAg ICAgICAgY29sLmFkZChuYW1lKTsKICAgICAgICAgICAgICAgIGNvbC5hZGQoc3FsVHlwZSk7CiAg ICAgICAgICAgICAgICBjb2wuYWRkKHNpemUpOwogICAgICAgICAgICAgICAgY29sLmFkZChudWxs VHlwZSk7CiAgICAgICAgICAgICAgICBjb2wuYWRkKGRlZlZhbHVlKTsKICAgICAgICAgICAgICAg IGNvbHVtbnMuYWRkKGNvbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxs eQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNvbHVtblNldCAhPSBudWxsKQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICBjb2x1bW5TZXQuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAg ICAgIH0KICAgICAgICByZXR1cm4gY29sdW1uczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHJp ZXZlcyBhIGxpc3Qgb2YgdGhlIGNvbHVtbnMgY29tcG9zaW5nIHRoZSBwcmltYXJ5IGtleSBmb3Ig YSBnaXZlbgogICAgICogdGFibGUuCiAgICAgKgogICAgICogQHBhcmFtIGRiTWV0YSBKREJDIG1l dGFkYXRhLgogICAgICogQHBhcmFtIHRhYmxlTmFtZSBUYWJsZSBmcm9tIHdoaWNoIHRvIHJldHJp ZXZlIFBLIGluZm9ybWF0aW9uLgogICAgICogQHJldHVybiBBIGxpc3Qgb2YgdGhlIHByaW1hcnkg a2V5IHBhcnRzIGZvciA8Y29kZT50YWJsZU5hbWU8L2NvZGU+LgogICAgICogQHRocm93cyBTUUxF eGNlcHRpb24KICAgICAqLwogICAgcHVibGljIExpc3QgZ2V0UHJpbWFyeUtleXMoRGF0YWJhc2VN ZXRhRGF0YSBkYk1ldGEsIFN0cmluZyB0YWJsZU5hbWUpCiAgICAgICAgICAgIHRocm93cyBTUUxF eGNlcHRpb24KICAgIHsKICAgICAgICBMaXN0IHBrID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAg IFJlc3VsdFNldCBwYXJ0cyA9IG51bGw7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAg ICBwYXJ0cyA9IGRiTWV0YS5nZXRQcmltYXJ5S2V5cyhudWxsLCBkYlNjaGVtYSwgdGFibGVOYW1l KTsKICAgICAgICAgICAgd2hpbGUgKHBhcnRzLm5leHQoKSkKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgcGsuYWRkKHBhcnRzLmdldFN0cmluZyg0KSk7CiAgICAgICAgICAgIH0KICAgICAg ICB9CiAgICAgICAgZmluYWxseQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHBhcnRzICE9IG51 bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhcnRzLmNsb3NlKCk7CiAgICAgICAg ICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBrOwogICAgfQoKICAgIC8qKgogICAgICog UmV0cmlldmVzIGEgbGlzdCBvZiBmb3JlaWduIGtleSBjb2x1bW5zIGZvciBhIGdpdmVuIHRhYmxl LgogICAgICoKICAgICAqIEBwYXJhbSBkYk1ldGEgSkRCQyBtZXRhZGF0YS4KICAgICAqIEBwYXJh bSB0YWJsZU5hbWUgVGFibGUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBGSyBpbmZvcm1hdGlvbi4K ICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIGZvcmVpZ24ga2V5cyBpbiA8Y29kZT50YWJsZU5hbWU8 L2NvZGU+LgogICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIENv bGxlY3Rpb24gZ2V0Rm9yZWlnbktleXMoRGF0YWJhc2VNZXRhRGF0YSBkYk1ldGEsIFN0cmluZyB0 YWJsZU5hbWUpCiAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgewogICAgICAgIEhhc2h0 YWJsZSBma3MgPSBuZXcgSGFzaHRhYmxlKCk7CiAgICAgICAgUmVzdWx0U2V0IGZvcmVpZ25LZXlz ID0gbnVsbDsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVpZ25LZXlzID0g ZGJNZXRhLmdldEltcG9ydGVkS2V5cyhudWxsLCBkYlNjaGVtYSwgdGFibGVOYW1lKTsKICAgICAg ICAgICAgd2hpbGUgKGZvcmVpZ25LZXlzLm5leHQoKSkKICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgU3RyaW5nIHJlZlRhYmxlTmFtZSA9IGZvcmVpZ25LZXlzLmdldFN0cmluZygzKTsgLy9y ZWZlcmVuY2VkIHRhYmxlIG5hbWUKICAgICAgICAgICAgICAgIFN0cmluZyByZWZDb2x1bW5OYW1l ID0gZm9yZWlnbktleXMuZ2V0U3RyaW5nKDQpOyAvL2ZvcmVpZ24gY29sdW1uCiAgICAgICAgICAg ICAgICBTdHJpbmcgbG9jYWxDb2x1bW5OYW1lID0gZm9yZWlnbktleXMuZ2V0U3RyaW5nKDgpOyAv L2xvY2FsIGNvbHVtbgoKICAgICAgICAgICAgICAgIE9iamVjdFtdIGZrID0gKE9iamVjdFtdKSBm a3MuZ2V0KHJlZlRhYmxlTmFtZSk7CiAgICAgICAgICAgICAgICBMaXN0IHJlZnM7CiAgICAgICAg ICAgICAgICBpZiAoZmsgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICBmayA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgICAgICAgICAgICAgZmtbMF0gPSByZWZU YWJsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICByZWZzID0gKEFycmF5TGlzdCkgZmtbMV07CiAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICBTdHJpbmdbXSByZWYgPSBuZXcgU3RyaW5nWzJdOwogICAgICAg ICAgICAgICAgcmVmWzBdID0gbG9jYWxDb2x1bW5OYW1lOwogICAgICAgICAgICAgICAgcmVmWzFd ID0gcmVmQ29sdW1uTmFtZTsKICAgICAgICAgICAgICAgIHJlZnMuYWRkKHJlZik7CiAgICAgICAg ICAgICAgICBma1sxXSA9IHJlZnM7CiAgICAgICAgICAgICAgICBma3MucHV0KHJlZlRhYmxlTmFt ZSwgZmspOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkKICAgICAgICB7 CiAgICAgICAgICAgIGlmIChmb3JlaWduS2V5cyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICBmb3JlaWduS2V5cy5jbG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQog ICAgICAgIHJldHVybiBma3MudmFsdWVzKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2 ZXMgYSBsaXN0IG9mIHVuaXF1ZS9ub24gdW5pcXVlIGluZGljZXMgZm9yIGEgZ2l2ZW4gdGFibGUu CiAgICAgKgogICAgICogQHBhcmFtIGRiTWV0YSBKREJDIG1ldGFkYXRhLgogICAgICogQHBhcmFt IHRhYmxlTmFtZSBUYWJsZSBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGluZGV4IGluZm9ybWF0aW9u LgogICAgICogQHBhcmFtIHVuaXF1ZSBGbGFnIHRvIGluZGljYXRlIHdodGhlciB0byByZXRyaWV2 ZSB1bmlxdWUvbm9uIHVuaXF1ZSBpbmRpY2VzLgogICAgICogQHJldHVybiBBIGxpc3Qgb2YgdW5p cXVlL25vbiB1bmlxdWUgaW5kaWNlcyBpbiA8Y29kZT50YWJsZU5hbWU8L2NvZGU+LgogICAgICog QHRocm93cyBTUUxFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIENvbGxlY3Rpb24gZ2V0SW5k aWNlcyhEYXRhYmFzZU1ldGFEYXRhIGRiTWV0YSwgU3RyaW5nIHRhYmxlTmFtZSwgYm9vbGVhbiB1 bmlxdWUpCiAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgewogICAgICAgIEhhc2h0YWJs ZSBpbmRpY2VzID0gbmV3IEhhc2h0YWJsZSgpOwogICAgICAgIFJlc3VsdFNldCBpbmRleEluZm8g PSBudWxsOwogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgaW5kZXhJbmZvID0gZGJN ZXRhLmdldEluZGV4SW5mbyhudWxsLCBkYlNjaGVtYSwgdGFibGVOYW1lLCB1bmlxdWUsIGZhbHNl KTsKICAgICAgICAgICAgd2hpbGUgKGluZGV4SW5mby5uZXh0KCkpCiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgIGJvb2xlYW4gbm9uVW5pcXVlID0gaW5kZXhJbmZvLmdldEJvb2xlYW4oNCk7 CiAgICAgICAgICAgICAgICBzaG9ydCB0eXBlID0gaW5kZXhJbmZvLmdldFNob3J0KDcpOwogICAg ICAgICAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9IGluZGV4SW5mby5nZXRTdHJpbmcoNik7CiAg ICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uTmFtZSA9IGluZGV4SW5mby5nZXRTdHJpbmcoOSk7 CgogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gRGF0YWJhc2VNZXRhRGF0YS50YWJsZUluZGV4 U3RhdGlzdGljICYmIG5vblVuaXF1ZSAhPSB1bmlxdWUpCiAgICAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgICAgT2JqZWN0W10gaW5kZXggPSAoT2JqZWN0W10pIGluZGljZXMuZ2V0KGlu ZGV4TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgTGlzdCBpbmRleENvbHVtbnM7CiAgICAgICAg ICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG5ldyBPYmplY3RbMl07CiAgICAgICAgICAgICAg ICAgICAgICAgIGluZGV4WzBdID0gaW5kZXhOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBp bmRleENvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAg ICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAgICAgICAgIGluZGV4Q29sdW1ucyA9IChBcnJheUxpc3QpIGluZGV4WzFdOwogICAgICAgICAg ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbmRleENvbHVtbnMuYWRkKGNvbHVtbk5h bWUpOwogICAgICAgICAgICAgICAgICAgIGluZGV4WzFdID0gaW5kZXhDb2x1bW5zOwogICAgICAg ICAgICAgICAgICAgIGluZGljZXMucHV0KGluZGV4TmFtZSwgaW5kZXgpOwogICAgICAgICAgICAg ICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkKICAgICAgICB7CiAg ICAgICAgICAgIGlmIChpbmRleEluZm8gIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgaW5kZXhJbmZvLmNsb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAg cmV0dXJuIGluZGljZXMudmFsdWVzKCk7CiAgICB9Cn0KCg== ---MOQ1069607376b360073096c941c81dd01af9cdd3c1e2 Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org For additional commands, e-mail: torque-dev-help@db.apache.org ---MOQ1069607376b360073096c941c81dd01af9cdd3c1e2--