diff options
Diffstat (limited to 'java/openjdk7/files/patch-7u76-b31')
-rw-r--r-- | java/openjdk7/files/patch-7u76-b31 | 42160 |
1 files changed, 42160 insertions, 0 deletions
diff --git a/java/openjdk7/files/patch-7u76-b31 b/java/openjdk7/files/patch-7u76-b31 new file mode 100644 index 000000000000..fc2391ef18ee --- /dev/null +++ b/java/openjdk7/files/patch-7u76-b31 @@ -0,0 +1,42160 @@ +--- ./.hgtags Mon Sep 08 12:14:23 2014 -0700 ++++ ./.hgtags Mon Jan 05 11:48:37 2015 -0800 +@@ -470,11 +470,19 @@ + fa242615607fa5f6cdd1ae93bc2fb9cc2100c179 jdk7u65-b18 + 64dbd70735c775bef1faf873e4bec65d73d597cb jdk7u65-b19 + 90f56be6f9d90f66e558c4e08084e2b169738fba jdk7u65-b32 ++d4397128f8b65eb96287128575dd1a3da6a7825b jdk7u80-b00 ++90564f0970e92b844122be27f051655aef6dc423 jdk7u80-b01 ++36e8397bf04d972519b80ca9e24e68a2ed1e4dbd jdk7u80-b02 + b6da128e8a7957f139933a48580e201e938c4684 jdk7u65-b20 + d6a1d32534d188e73f7962d40d21584c44e65acd jdk7u67-b01 + 64dbd70735c775bef1faf873e4bec65d73d597cb jdk7u65-b40 + 9dfdf107c6971cd30c7e1f656cddc6b8d495c290 jdk7u65-b31 + fe700de0735dc4e8ce5a50971ad3ea3dc052d21d jdk7u65-b33 ++d6a1d32534d188e73f7962d40d21584c44e65acd jdk7u67-b01 ++d3b934344cb17238ea27cd1e0b824f856addc815 jdk7u67-b31 ++79c6f8d257776b93485f4c1014dfcf61cc75a667 jdk7u67-b32 ++5aef2a187827f1e7f48a619af4bee118ca99efea jdk7u67-b33 ++b86df0257fad12e8802fe43d53e932b7b0253112 jdk7u67-b34 + 48eb3345e05fe904d2e92067da0abd04a9b375e4 jdk7u66-b00 + 4fb9423d086d86d212257afd6fc79957f737af5b jdk7u66-b01 + 964663d4303723fbcb16cf05e857576c08c237ae jdk7u66-b09 +@@ -500,3 +508,51 @@ + e9663e434024cb6e011013e774445a056417bb3b jdk7u71-b11 + 78aa78b55b843697a630ed886962ab07d1b76358 jdk7u71-b12 + 9fc5aeb0e0a8c97b1cd263a55f3aeb030cbcdf89 jdk7u71-b13 ++ade1a91dba7391ef319a2fc646138387e6416436 jdk7u71-b14 ++423ddccf39073af15eb78623f89f1080612b5b3d jdk7u72-b01 ++5f985e54beec37de3ad2261d82665d378143a8dc jdk7u72-b02 ++e6e679e8dc418d9174668f445af10e2a6d71ce39 jdk7u72-b03 ++32b4ccb2a7ada38639a4869a5628bda061d8563e jdk7u72-b04 ++15e7f04f32510469be2ab44b4547cb8acb19d04a jdk7u72-b05 ++9c732ba56ec06696e218f7b70ddc432295638d79 jdk7u72-b06 ++a7679adac6cc7ff6a2893e4df447c39937f59eda jdk7u72-b07 ++44a9b66255b9b8a200c0e53338145bac86381576 jdk7u72-b08 ++66c1df24154b1c8c67fd9bed0b6d366452a46fb0 jdk7u72-b09 ++a8993ba5a86938e6bd9ab7c41401610b0e36afce jdk7u72-b10 ++8d695cc7268f902f235506ac8d3849a4dd118bee jdk7u72-b11 ++965b19722fce7a8303b89fc9288f7b6a9cf70922 jdk7u72-b12 ++9c6095c8748ba80aa1ffd14f978b24e50abcfdc1 jdk7u72-b13 ++fa606411d8fd650334b6f90d626399e13e77740f jdk7u72-b14 ++f42462b4dfd81539eacf90955d2d26e1dc1686c0 jdk7u72-b30 ++891bb800d7b2abff392669276f9e55ff30ba9962 jdk7u72-b31 ++569e053e97b4fecaf1371f7cf2645394edb8a11a jdk7u75-b00 ++618b221a71a962f1d62a5b02db1b4256bad9441a jdk7u75-b01 ++eb36016211cb5d412c779836bd8efbf133cbf6f5 jdk7u75-b02 ++134f5183bd712b940056508bcd0988cce7a60ec7 jdk7u75-b03 ++dcc07fe8d380a63c22086abeb62a5a9780b3639c jdk7u75-b04 ++5acf5e095d7b3a9364b278911047a4fad15a1ae7 jdk7u75-b05 ++709239275717263b600f6c8816b023de3442eb0f jdk7u75-b06 ++79414f9ef336b48c3766a7e994ac3efce3877b61 jdk7u75-b07 ++0fa6cf059c5c262a410220bfb9ec7d83d44a8030 jdk7u75-b08 ++109dfa012fb50a65c9dcb5eb36c530a2001d139b jdk7u75-b09 ++a90c928524da634a18ea5a9ca2d6aba839c9bf8a jdk7u75-b10 ++ae1470a6681851d99608269ac902383ce44c9f10 jdk7u75-b11 ++cca6b8a583cef75117297d9522adc33f7ab516c2 jdk7u75-b12 ++669bd350d550600a3f0c4556da9bc4bb6006dc5c jdk7u75-b13 ++7d45f621855a37b70a239edc6f8ac3b75ca7862b jdk7u75-b30 ++37b5893cb60f897f28b1999be7f88335409beda5 jdk7u75-b31 ++b39439fb5dcdef664c7a6cd638642b22c79f2393 jdk7u76-b00 ++dc25c29542f743722854fe37336630b23ebccfff jdk7u76-b01 ++7402e2fd4c2865f4605fe4d84fa43883029e221d jdk7u76-b02 ++d0967df4a33229cf4e297a4892972bc30f23daad jdk7u76-b03 ++e840541117dcf21601adb496a8ba2a54b019f3db jdk7u76-b04 ++369a28aac29d6cfadfd4ef6930e5b1c2c622b826 jdk7u76-b05 ++9304abb58c14bfe3314141ea4176db757e5b5d4f jdk7u76-b06 ++6065e7008ae5fa5ae730f8d2318fedac821c50c1 jdk7u76-b07 ++c891034902a4d6d2db813bd128dca273c7640baf jdk7u76-b08 ++a85cb73f4f32c7faad49b77c307adbd11d481dd1 jdk7u76-b09 ++fc18a1bf57b62578466a4de68314bba79721c8fd jdk7u76-b10 ++4f5b251f1daa41a9143636a9b8aaf0cf4ce00f26 jdk7u76-b11 ++01d1d34f82f30de97a61f8b0048c61aa17d0dd12 jdk7u76-b12 ++a9728fbea214dbf6f58567e729fdc5276f3c704f jdk7u76-b13 ++a788e9c5671436bb711f0e185cd74b17220d6e35 jdk7u76-b30 +--- ./corba/.hgtags Mon Sep 08 12:14:31 2014 -0700 ++++ ./corba/.hgtags Mon Jan 05 11:49:17 2015 -0800 +@@ -472,11 +472,19 @@ + b7f66b9f9e8e099428ed7640a184f6135b77e40d jdk7u65-b18 + 50ddba8882e7e95150418a30bfc3ee62e3c28c6c jdk7u65-b19 + dae3f20d2306622e39606d0dc967147de174afce jdk7u65-b32 ++1a3aa4637b80fabbd069ae88c241efcb3520fc49 jdk7u80-b00 ++df1decc820934ad8bf91c853e81c88d4f7590e25 jdk7u80-b01 ++2444fa7df7e3e07f2533f6c875c3a8e408048f6c jdk7u80-b02 + ac05dfedf008e83c2044666a70635cf82e932e41 jdk7u65-b20 + 244756837ab4b214decd0e6f26b0071a483f143f jdk7u67-b01 + 50ddba8882e7e95150418a30bfc3ee62e3c28c6c jdk7u65-b40 + d2f7358b01d3d8b877b2ec2ca2989bd1daf17472 jdk7u65-b31 + 2067d7202adcedb80fa676dacb22a0b73d5e8548 jdk7u65-b33 ++244756837ab4b214decd0e6f26b0071a483f143f jdk7u67-b01 ++507cb7e62dfed67b467a1767d9c56d276551d6f3 jdk7u67-b31 ++aef9e24b79543a3b58bb4575266b9b87ca84e4e1 jdk7u67-b32 ++7c1d15d36a6c40b4a4f75bc03729136a104d2434 jdk7u67-b33 ++f026080f4fcc9eca5589d8747c66bfa123c5a87d jdk7u67-b34 + 5b8210c41bc41135687028bcb000ca116e2090f6 jdk7u66-b00 + 9f0f0bdd4cfb01a5d64f9528b7ffda3974171120 jdk7u66-b01 + 596d979a5d4deb9d10b068479276cd4b2a12432e jdk7u66-b09 +@@ -502,3 +510,51 @@ + 3e804dc3cea9ff145f375a50a161f3e173e8d3f6 jdk7u71-b11 + cc3072067ae8ac685d400ced4c0f144d6a1d9f1e jdk7u71-b12 + 1616089899e25679d6cf70c77023f2a37ff85ad1 jdk7u71-b13 ++701e1d5cea2e8065d2282eb3ebe31b6829a72a95 jdk7u71-b14 ++287c772d7245396a7a6c7fc409ca8d21ba1ae2c5 jdk7u72-b01 ++92552d17915bdf467fe758293eded9e6290f4ce2 jdk7u72-b02 ++ae522462810fd74a92b4408b12b036bed5ea3efe jdk7u72-b03 ++42a799212f4a287be3d2fd272b9faa3c65326b05 jdk7u72-b04 ++a2d4167edbf96cdfda04e829d2baa361ade14bf5 jdk7u72-b05 ++01922ce7611b852c7fdc4c0f88c9500c55eccd50 jdk7u72-b06 ++b5a2d85c7fce5461d8e1be7e89a891a3ce40f805 jdk7u72-b07 ++2b6d8a79df83bc5732ef7c65c51cfe9feac52559 jdk7u72-b08 ++c62534f0e97dc7100da18b0b9c034d846f7067dc jdk7u72-b09 ++62668c37376f462cfe7bfdfa001f902f52d450ef jdk7u72-b10 ++39828d500dfef8045eb5b531182a09ea6ecdfb71 jdk7u72-b11 ++990f51c3edeb4f25d0be95d51b23e5a4e8e02f06 jdk7u72-b12 ++9e0c893977bba3ed7820f173d386e197f3c06e7b jdk7u72-b13 ++bd80d0c18ccd97669dd8392dbde5cd91f647ee1d jdk7u72-b14 ++66da7f46eff05df2aa3bb9b5c1f7ee47a75828a5 jdk7u72-b30 ++4fefe5c11ddb650e681e2dd5e8ac8dfeb15e6afd jdk7u72-b31 ++88772da384953fed254492c3ea9da498381081f2 jdk7u75-b00 ++0466441d71122c9af252ec17f597f228dbf64578 jdk7u75-b01 ++9aa7fe309fa584ff782ab9d557632321747ba11e jdk7u75-b02 ++c734b5009fc92667af13c36b1f23e153a3e2dfca jdk7u75-b03 ++f55967c261230a4fcc8d71ecfe58f2f47ea50393 jdk7u75-b04 ++86369ed6e77c65496f2c167c00ed48d1e488845c jdk7u75-b05 ++6831d2ff20362464a754f53bf8eb3ec1aacd6271 jdk7u75-b06 ++33cf9bbc4ff36cb9e65e9fc22eabd606b98b6b8c jdk7u75-b07 ++160cce8c24c4af6481426c931e400dfec29fe0d1 jdk7u75-b08 ++ac5f25a05f13d81e4e18f5447e60dddee77d8d17 jdk7u75-b09 ++c762a8187b1fe223b92aca3aaf7ee2dfe03e2ae6 jdk7u75-b10 ++e05b02f8d5c988e55e985d767420e0b7e35d996e jdk7u75-b11 ++45136140d2bcf28009271a047eea9a89c95378d7 jdk7u75-b12 ++fb49daa5d7f89cbe60ff4b598c6b3e976ad04e4d jdk7u75-b13 ++f3d39b94209598ba90e221d60ff3325dbe37fe2e jdk7u75-b30 ++94386a790f9469f9da1328a7d0c2a2d63f03404b jdk7u75-b31 ++2d6f594ce6c5dafc1ad9a9368186817212120d84 jdk7u76-b00 ++b4d4ec688a281a362524291f2cff15c59b85dbb5 jdk7u76-b01 ++c24e65a16f334611f95a8ae46769375b20818b74 jdk7u76-b02 ++a1de50d45daa0728ea269a9e19e7d83208eec894 jdk7u76-b03 ++806fb93eff9b30b3b36b46e04ef25fd62b28e674 jdk7u76-b04 ++62f9b33fc90163c4d6b0953405c29f6328d9cd40 jdk7u76-b05 ++89194b328cd0e4ef0d672d97e818e58ebf52a23b jdk7u76-b06 ++9e17d3cd8fd256417dbecf751d6ac3f8195411b1 jdk7u76-b07 ++f224787154b09e211cbb78f99889f6f6c394e60b jdk7u76-b08 ++220b87dd1f9b26d3167582c699b6f41ac3516696 jdk7u76-b09 ++b10583d82c01a621beb89a4a8e0f4830cdda703b jdk7u76-b10 ++c947bf709139b13476a1df4ca8a92583fb1de5a4 jdk7u76-b11 ++14f0846f4d1b8373e3e3cce10901f37341bf6980 jdk7u76-b12 ++0db41b697138ce89f15c49eef1dc670f94a27d89 jdk7u76-b13 ++71a8665159f2f014b1869f3d723d3b6fbe878a16 jdk7u76-b30 +--- ./corba/src/share/classes/com/sun/corba/se/impl/corba/AnyImpl.java Mon Sep 08 12:14:31 2014 -0700 ++++ ./corba/src/share/classes/com/sun/corba/se/impl/corba/AnyImpl.java Mon Jan 05 11:49:17 2015 -0800 +@@ -587,7 +587,7 @@ + java.lang.Object[] objholder = new java.lang.Object[1]; + objholder[0] = object; + long[] longholder = new long[1]; +- TCUtility.unmarshalIn(in, typeCode, longholder, objholder); ++ TCUtility.unmarshalIn(in, realType(), longholder, objholder); + value = longholder[0]; + object = objholder[0]; + stream = null; +--- ./corba/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java Mon Sep 08 12:14:31 2014 -0700 ++++ ./corba/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java Mon Jan 05 11:49:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -35,7 +35,8 @@ + import java.io.OutputStream; + import java.io.ObjectOutputStream; + import java.io.ObjectOutput; +-import java.util.Hashtable; ++import java.util.Map; ++import java.util.HashMap; + + import org.omg.CORBA.INTERNAL; + +@@ -49,7 +50,7 @@ + */ + private class HookPutFields extends ObjectOutputStream.PutField + { +- private Hashtable fields = new Hashtable(); ++ private Map<String,Object> fields = new HashMap<>(); + + /** + * Put the value of the named boolean field into the persistent field. +@@ -140,7 +141,6 @@ + public OutputStreamHook() + throws java.io.IOException { + super(); +- + } + + public void defaultWriteObject() throws IOException { +--- ./corba/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java Mon Sep 08 12:14:31 2014 -0700 ++++ ./corba/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java Mon Jan 05 11:49:17 2015 -0800 +@@ -253,6 +253,13 @@ + // registered with the selector. Otherwise if the bytes + // are read on the connection it will attempt a time stamp + // but the cache will be null, resulting in NPE. ++ ++ // A connection needs to be timestamped before putting to the cache. ++ // Otherwise the newly created connection (with 0 timestamp) could be ++ // incorrectly reclaimed by concurrent reclaim() call OR if there ++ // will be no events on this connection then it could be reclaimed ++ // by upcoming reclaim() call. ++ getConnectionCache().stampTime(connection); + getConnectionCache().put(this, connection); + + if (connection.shouldRegisterServerReadEvent()) { +--- ./hotspot/.hgtags Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/.hgtags Mon Jan 05 11:51:17 2015 -0800 +@@ -690,11 +690,26 @@ + d006213be74730453cf5c3ce31f1d1d505334419 jdk7u65-b18 + 1d8226b3e9896656451801393eb3ae394faeb638 jdk7u65-b19 + c43b0b843f897a4d8cf0a3566b017b87230dd3b4 jdk7u65-b32 ++b92f390febd01615af4a736b4f830f6052aa1d09 hs24.80-b00 ++1448ebfef4f1aae0174eca983ad05507730ca6fd hs24.80-b01 ++b1d29549dca7e36a4d050af5a54f8f56963a5c7d hs24.80-b02 ++ff18bcebe2943527cdbc094375c38c27ec7f2442 hs24.80-b03 ++1b9722b5134a8e565d8b8fe851849e034beff057 hs24.80-b04 ++04d6919c44db8c9d811ef0ac4775a579f854cdfc hs24.80-b05 ++ee18e60e7e8da9f1912895af353564de0330a2b1 hs24.80-b06 ++05fe7a87d14908eb3f21a0d29fc72cee2f996b7f jdk7u80-b00 ++e2533d62ca887078e4b952a75a75680cfb7894b9 jdk7u80-b01 ++bad107a5d096b070355c5a2d80aa50bc5576144b jdk7u80-b02 + d3c9265e12fa115052f18d1e3d379143b56bbf63 jdk7u65-b20 + 39776d90970221dd260187acb4c37631e41a66a9 jdk7u67-b01 + 1d8226b3e9896656451801393eb3ae394faeb638 jdk7u65-b40 + cf8b3a090e597e59177c5f67d44cdec12309777f jdk7u65-b31 + df855c3f4d31dd7db081d68e3054518380127893 jdk7u65-b33 ++39776d90970221dd260187acb4c37631e41a66a9 jdk7u67-b01 ++7152f5f6395c66c8d6389100d880882d5cfe9af3 jdk7u67-b31 ++4fb7952ebba8ba45be16bdc64184259e8076ffcf jdk7u67-b32 ++a20f1b6311e10b755d949a088e7aeca2ba088a59 jdk7u67-b33 ++39c07d2fb4d3d97bf3bb53c1c1e199709c5c49fe jdk7u67-b34 + 6b37a189944aaa09e81d97d394496464d16bee42 jdk7u66-b00 + 121dc94194d9234e2b13c867d875e23e1bdd6abd jdk7u66-b01 + f28ea516eb0b9e99f1e342954ab4642456af4da1 jdk7u66-b09 +@@ -720,3 +735,51 @@ + d6cb97651f0bd8d61f4d22aa7550145bbe6fb051 jdk7u71-b11 + 959b4e5d2e3111920c198187f3bc66eba3e457f1 jdk7u71-b12 + 608f470d22689bab17bab0ea1dbee3e1a0802d5b jdk7u71-b13 ++ad909197a1ce2df483a20ff9ac380382f779a9d3 jdk7u71-b14 ++1bd3adac3aac3c29c81303812b35f484ff90cb2b jdk7u72-b01 ++0caed46767e35c00eff69b22acf984d98eb66b3d jdk7u72-b02 ++3a2934191de4bb8ca9d2faca93f3381e521e8cac jdk7u72-b03 ++e4708cde2898df4c936595aacb57bc5b4e15869a jdk7u72-b04 ++137e0859cd296cb8d9f9e327112ddc793ed59318 jdk7u72-b05 ++4d9d227d70f33b70461230172386217317954312 jdk7u72-b06 ++ece56f93f37b41b9c8875e54fbd8010277f6b460 jdk7u72-b07 ++439c695a7aa03652ab92681120434b9ce8cdd2b7 jdk7u72-b08 ++a27f16d45457a68a723acca621cb11bc173a0eb6 jdk7u72-b09 ++e6508ab77271d1d3ce7b5f60d91a7334fdacb03a jdk7u72-b10 ++c17a8487086433e14cd22373039a8b6b48e7cbb8 jdk7u72-b11 ++a9e695f0d831f115720a4dcad3d33e0003b0acad jdk7u72-b12 ++ac701f87d1ea46033c69f3e1cb84fc0a971da70c jdk7u72-b13 ++d9b56c6bdddb6f9d8242230f5fdd58f9c7d30ea5 jdk7u72-b14 ++a6ae698522bfab3c595a4f8c2c3ee7e8939eb1bb jdk7u72-b30 ++492a2abed4ca015459e24f7348233531b7e929d2 jdk7u72-b31 ++e6b6d91b3934c281086f8efacb0926e7451cc18b jdk7u75-b00 ++9096ac248b379a0f3012f18c7289ec47cdef8459 jdk7u75-b01 ++a6964b2822d906eab9c923cdd723cf3dd4facfcd jdk7u75-b02 ++6c1a8b7ed616311a932715428620e262076bb68a jdk7u75-b03 ++2480d9d778301a3f88b0ab8ee35a585df82528e5 jdk7u75-b04 ++d81faf9016ce5c9f98264b1f724b3d6d85b12c07 jdk7u75-b05 ++2ec4b796b1de3cfe58f051111dfd70ab367e553e jdk7u75-b06 ++1d3906064cae18fdb0ff9a2045f2d8d48067bcd1 jdk7u75-b07 ++dfcf951330b6f7c1a3cb88c819e94f680054a970 jdk7u75-b08 ++ca20e7886db63792593f048f7308aed383775829 jdk7u75-b09 ++5a0321dcf89383c31f3c6e4827b3275f9ef09a5e jdk7u75-b10 ++82dcfb646bd5bc9f3674cb02ea9ba2598cff6bbe jdk7u75-b11 ++18b74ded3ffc2e6fc5a3853f923c8dd49849dee1 jdk7u75-b12 ++384fba17a49738baddeb55a4bfcf00b01af199ef jdk7u75-b13 ++0c7d7c067c46fa0ddcb9170bed1d52f52a9ec831 jdk7u75-b30 ++db9672d640ffd4e81348bdb718afab76032d8858 jdk7u75-b31 ++3c01618f40c059bf192c0b16176b144113965ea7 jdk7u76-b00 ++7b5d132c3a70f3c0667fe9df4cae045b46673267 jdk7u76-b01 ++10c2cb5743cac7d6fedc9307af8450283367e5e2 jdk7u76-b02 ++99a8d8e3f1c6311853bfc0a86de503830cd3db1a jdk7u76-b03 ++15079dd9fd20f252d4c6dc6972508d3375cf5af2 jdk7u76-b04 ++0ac38b5b642738fb27b446b0c1bc6108f31f197c jdk7u76-b05 ++8580db8e38a232978f69fe627f3373e12c467803 jdk7u76-b06 ++475a5cf6fc80c085c1be11b502ef44e7206c73d3 jdk7u76-b07 ++64a7fa638019deebae59be4a4a262cfa1d7947ad jdk7u76-b08 ++103eec0b084f7dfa0afce1ed9adebd6a9fab1aa8 jdk7u76-b09 ++82b681cadc354b08b0aa2858d9b7f78576a8c1a4 jdk7u76-b10 ++fd16bf65cfed7208af5740977a6699d18ac103b2 jdk7u76-b11 ++e375023d196199ffb263cb15739f7218e1621be6 jdk7u76-b12 ++a395c29532e5322657c542d54dd957940cf2f523 jdk7u76-b13 ++98f0c5279ba76eb1b5741dc67f7b5f10e7508449 jdk7u76-b30 +--- ./hotspot/agent/src/os/linux/libproc.h Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/agent/src/os/linux/libproc.h Mon Jan 05 11:51:17 2015 -0800 +@@ -34,19 +34,7 @@ + #include "libproc_md.h" + #endif + +-#if defined(sparc) || defined(sparcv9) +-/* +- If _LP64 is defined ptrace.h should be taken from /usr/include/asm-sparc64 +- otherwise it should be from /usr/include/asm-sparc +- These two files define pt_regs structure differently +-*/ +-#ifdef _LP64 +-#include "asm-sparc64/ptrace.h" +-#else +-#include "asm-sparc/ptrace.h" +-#endif +- +-#endif //sparc or sparcv9 ++#include <linux/ptrace.h> + + /************************************************************************************ + +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -61,8 +61,9 @@ + long h = 0; + int s = 0; + int len = buf.length; ++ // Emulate the unsigned int in java_lang_String::hash_code + while (len-- > 0) { +- h = 31*h + (0xFFL & buf[s]); ++ h = 31*h + (0xFFFFFFFFL & buf[s]); + s++; + } + return h & 0xFFFFFFFFL; +--- ./hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Jan 05 11:51:17 2015 -0800 +@@ -158,6 +158,7 @@ + _JVM_GetStackTraceElement + _JVM_GetSystemPackage + _JVM_GetSystemPackages ++ _JVM_GetTemporaryDirectory + _JVM_GetThreadStateNames + _JVM_GetThreadStateValues + _JVM_GetVersionInfo +--- ./hotspot/make/bsd/makefiles/mapfile-vers-product Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-product Mon Jan 05 11:51:17 2015 -0800 +@@ -158,6 +158,7 @@ + _JVM_GetStackTraceElement + _JVM_GetSystemPackage + _JVM_GetSystemPackages ++ _JVM_GetTemporaryDirectory + _JVM_GetThreadStateNames + _JVM_GetThreadStateValues + _JVM_GetVersionInfo +--- ./hotspot/make/hotspot_version Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/hotspot_version Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -31,11 +31,11 @@ + # + + # Don't put quotes (fail windows build). +-HOTSPOT_VM_COPYRIGHT=Copyright 2014 ++HOTSPOT_VM_COPYRIGHT=Copyright 2015 + + HS_MAJOR_VER=24 +-HS_MINOR_VER=71 +-HS_BUILD_NUMBER=01 ++HS_MINOR_VER=76 ++HS_BUILD_NUMBER=04 + + JDK_MAJOR_VER=1 + JDK_MINOR_VER=7 +--- ./hotspot/make/jprt.properties Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/jprt.properties Mon Jan 05 11:51:17 2015 -0800 +@@ -38,7 +38,7 @@ + + # This tells jprt what default release we want to build + +-jprt.hotspot.default.release=jdk7u40 ++jprt.hotspot.default.release=jdk7u60 + + jprt.tools.default.release=${jprt.submit.option.release?${jprt.submit.option.release}:${jprt.hotspot.default.release}} + +@@ -54,97 +54,92 @@ + # Define the Solaris platforms we want for the various releases + jprt.my.solaris.sparc.jdk8=solaris_sparc_5.10 + jprt.my.solaris.sparc.jdk7=solaris_sparc_5.10 +-jprt.my.solaris.sparc.jdk7u40=${jprt.my.solaris.sparc.jdk7} ++jprt.my.solaris.sparc.jdk7u60=${jprt.my.solaris.sparc.jdk7} + jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}} + + jprt.my.solaris.sparcv9.jdk8=solaris_sparcv9_5.10 + jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10 +-jprt.my.solaris.sparcv9.jdk7u40=${jprt.my.solaris.sparcv9.jdk7} ++jprt.my.solaris.sparcv9.jdk7u60=${jprt.my.solaris.sparcv9.jdk7} + jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}} + + jprt.my.solaris.i586.jdk8=solaris_i586_5.10 + jprt.my.solaris.i586.jdk7=solaris_i586_5.10 +-jprt.my.solaris.i586.jdk7u40=${jprt.my.solaris.i586.jdk7} ++jprt.my.solaris.i586.jdk7u60=${jprt.my.solaris.i586.jdk7} + jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}} + + jprt.my.solaris.x64.jdk8=solaris_x64_5.10 + jprt.my.solaris.x64.jdk7=solaris_x64_5.10 +-jprt.my.solaris.x64.jdk7u40=${jprt.my.solaris.x64.jdk7} ++jprt.my.solaris.x64.jdk7u60=${jprt.my.solaris.x64.jdk7} + jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}} + + jprt.my.linux.i586.jdk8=linux_i586_2.6 + jprt.my.linux.i586.jdk7=linux_i586_2.6 +-jprt.my.linux.i586.jdk7u40=${jprt.my.linux.i586.jdk7} ++jprt.my.linux.i586.jdk7u60=${jprt.my.linux.i586.jdk7} + jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}} + + jprt.my.linux.x64.jdk8=linux_x64_2.6 + jprt.my.linux.x64.jdk7=linux_x64_2.6 +-jprt.my.linux.x64.jdk7u40=${jprt.my.linux.x64.jdk7} ++jprt.my.linux.x64.jdk7u60=${jprt.my.linux.x64.jdk7} + jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}} + + jprt.my.linux.ppc.jdk8=linux_ppc_2.6 + jprt.my.linux.ppc.jdk7=linux_ppc_2.6 +-jprt.my.linux.ppc.jdk7u40=${jprt.my.linux.ppc.jdk7} ++jprt.my.linux.ppc.jdk7u60=${jprt.my.linux.ppc.jdk7} + jprt.my.linux.ppc=${jprt.my.linux.ppc.${jprt.tools.default.release}} + + jprt.my.linux.ppcv2.jdk8=linux_ppcv2_2.6 + jprt.my.linux.ppcv2.jdk7=linux_ppcv2_2.6 +-jprt.my.linux.ppcv2.jdk7u40=${jprt.my.linux.ppcv2.jdk7} ++jprt.my.linux.ppcv2.jdk7u60=${jprt.my.linux.ppcv2.jdk7} + jprt.my.linux.ppcv2=${jprt.my.linux.ppcv2.${jprt.tools.default.release}} + +-jprt.my.linux.ppcsflt.jdk8=linux_ppcsflt_2.6 +-jprt.my.linux.ppcsflt.jdk7=linux_ppcsflt_2.6 +-jprt.my.linux.ppcsflt.jdk7u40=${jprt.my.linux.ppcsflt.jdk7} +-jprt.my.linux.ppcsflt=${jprt.my.linux.ppcsflt.${jprt.tools.default.release}} +- + jprt.my.linux.armvfp.jdk8=linux_armvfp_2.6 + jprt.my.linux.armvfp.jdk7=linux_armvfp_2.6 +-jprt.my.linux.armvfp.jdk7u40=${jprt.my.linux.armvfp.jdk7} ++jprt.my.linux.armvfp.jdk7u60=${jprt.my.linux.armvfp.jdk7} + jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}} + + jprt.my.linux.armvfpsflt.jdk8=linux_armvfpsflt_2.6 + jprt.my.linux.armvfpsflt.jdk7=linux_armvfpsflt_2.6 +-jprt.my.linux.armvfpsflt.jdk7u40=${jprt.my.linux.armvfpsflt.jdk7} ++jprt.my.linux.armvfpsflt.jdk7u60=${jprt.my.linux.armvfpsflt.jdk7} + jprt.my.linux.armvfpsflt=${jprt.my.linux.armvfpsflt.${jprt.tools.default.release}} + + jprt.my.linux.armvfphflt.jdk8=linux_armvfphflt_2.6 + jprt.my.linux.armvfphflt.jdk7=linux_armvfphflt_2.6 +-jprt.my.linux.armvfphflt.jdk7u40=${jprt.my.linux.armvfphflt.jdk7} ++jprt.my.linux.armvfphflt.jdk7u60=${jprt.my.linux.armvfphflt.jdk7} + jprt.my.linux.armvfphflt=${jprt.my.linux.armvfphflt.${jprt.tools.default.release}} + + jprt.my.linux.armv6.jdk8=linux_armv6_2.6 + jprt.my.linux.armv6.jdk7=linux_armv6_2.6 +-jprt.my.linux.armv6.jdk7u40=${jprt.my.linux.armv6.jdk7} ++jprt.my.linux.armv6.jdk7u60=${jprt.my.linux.armv6.jdk7} + jprt.my.linux.armv6=${jprt.my.linux.armv6.${jprt.tools.default.release}} + + jprt.my.linux.armvs.jdk8=linux_armvs_2.6 + jprt.my.linux.armvs.jdk7=linux_armvs_2.6 +-jprt.my.linux.armvs.jdk7u40=${jprt.my.linux.armvs.jdk7} ++jprt.my.linux.armvs.jdk7u60=${jprt.my.linux.armvs.jdk7} + jprt.my.linux.armvs=${jprt.my.linux.armvs.${jprt.tools.default.release}} + + jprt.my.linux.armvh.jdk8=linux_armvh_2.6 + jprt.my.linux.armvh.jdk7=linux_armvh_2.6 +-jprt.my.linux.armvh.jdk7u40=${jprt.my.linux.armvh.jdk7} ++jprt.my.linux.armvh.jdk7u60=${jprt.my.linux.armvh.jdk7} + jprt.my.linux.armvh=${jprt.my.linux.armvh.${jprt.tools.default.release}} + + jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6 + jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6 +-jprt.my.linux.armsflt.jdk7u40=${jprt.my.linux.armsflt.jdk7} ++jprt.my.linux.armsflt.jdk7u60=${jprt.my.linux.armsflt.jdk7} + jprt.my.linux.armsflt=${jprt.my.linux.armsflt.${jprt.tools.default.release}} + + jprt.my.macosx.x64.jdk8=macosx_x64_10.7 + jprt.my.macosx.x64.jdk7=macosx_x64_10.7 +-jprt.my.macosx.x64.jdk7u40=${jprt.my.macosx.x64.jdk7} ++jprt.my.macosx.x64.jdk7u60=${jprt.my.macosx.x64.jdk7} + jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}} + + jprt.my.windows.i586.jdk8=windows_i586_5.1 + jprt.my.windows.i586.jdk7=windows_i586_5.1 +-jprt.my.windows.i586.jdk7u40=${jprt.my.windows.i586.jdk7} ++jprt.my.windows.i586.jdk7u60=${jprt.my.windows.i586.jdk7} + jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}} + + jprt.my.windows.x64.jdk8=windows_x64_5.2 + jprt.my.windows.x64.jdk7=windows_x64_5.2 +-jprt.my.windows.x64.jdk7u40=${jprt.my.windows.x64.jdk7} ++jprt.my.windows.x64.jdk7u60=${jprt.my.windows.x64.jdk7} + jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}} + + # Standard list of jprt build targets for this source tree +@@ -172,7 +167,6 @@ + ${jprt.my.linux.i586}-{productEmb|fastdebugEmb|debugEmb}, \ + ${jprt.my.linux.ppc}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.ppcv2}-{productEmb|fastdebugEmb}, \ +- ${jprt.my.linux.ppcsflt}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.armvfp}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.armsflt}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.armvfpsflt}-{productEmb|fastdebugEmb}, \ +@@ -183,7 +177,7 @@ + + jprt.build.targets.jdk8=${jprt.build.targets.all} + jprt.build.targets.jdk7=${jprt.build.targets.all} +-jprt.build.targets.jdk7u40=${jprt.build.targets.all} ++jprt.build.targets.jdk7u60=${jprt.build.targets.all} + jprt.build.targets=${jprt.build.targets.${jprt.tools.default.release}} + + # Subset lists of test targets for this source tree +@@ -476,7 +470,7 @@ + + jprt.test.targets.jdk8=${jprt.test.targets.standard} + jprt.test.targets.jdk7=${jprt.test.targets.standard} +-jprt.test.targets.jdk7u40=${jprt.test.targets.jdk7} ++jprt.test.targets.jdk7u60=${jprt.test.targets.jdk7} + jprt.test.targets=${jprt.test.targets.${jprt.tools.default.release}} + + # The default test/Makefile targets that should be run +@@ -536,7 +530,7 @@ + + jprt.make.rule.test.targets.jdk8=${jprt.make.rule.test.targets.standard} + jprt.make.rule.test.targets.jdk7=${jprt.make.rule.test.targets.standard} +-jprt.make.rule.test.targets.jdk7u40=${jprt.make.rule.test.targets.jdk7} ++jprt.make.rule.test.targets.jdk7u60=${jprt.make.rule.test.targets.jdk7} + jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}} + + # 7155453: Work-around to prevent popups on OSX from blocking test completion +--- ./hotspot/make/linux/makefiles/mapfile-vers-debug Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-debug Mon Jan 05 11:51:17 2015 -0800 +@@ -123,7 +123,7 @@ + JVM_GetClassModifiers; + JVM_GetClassName; + JVM_GetClassNameUTF; +- JVM_GetClassSignature; ++ JVM_GetClassSignature; + JVM_GetClassSigners; + JVM_GetComponentType; + JVM_GetDeclaredClasses; +@@ -160,6 +160,7 @@ + JVM_GetStackTraceElement; + JVM_GetSystemPackage; + JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; + JVM_GetThreadStateNames; + JVM_GetThreadStateValues; + JVM_GetVersionInfo; +--- ./hotspot/make/linux/makefiles/mapfile-vers-product Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-product Mon Jan 05 11:51:17 2015 -0800 +@@ -160,6 +160,7 @@ + JVM_GetStackTraceElement; + JVM_GetSystemPackage; + JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; + JVM_GetThreadStateNames; + JVM_GetThreadStateValues; + JVM_GetVersionInfo; +--- ./hotspot/make/solaris/makefiles/mapfile-vers Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/make/solaris/makefiles/mapfile-vers Mon Jan 05 11:51:17 2015 -0800 +@@ -160,6 +160,7 @@ + JVM_GetStackTraceElement; + JVM_GetSystemPackage; + JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; + JVM_GetThreadStateNames; + JVM_GetThreadStateValues; + JVM_GetVersionInfo; +--- ./hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1745,7 +1745,7 @@ + + inline void swap( Register s1, Register s2, Register d ); + inline void swap( Register s1, int simm13a, Register d); +- inline void swap( Address& a, Register d, int offset = 0 ); ++ inline void swap( const Address& a, Register d, int offset = 0 ); + + // pp 232 + +--- ./hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -347,7 +347,7 @@ + inline void Assembler::swap( Register s1, Register s2, Register d) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(swap_op3) | rs1(s1) | rs2(s2) ); } + inline void Assembler::swap( Register s1, int simm13a, Register d) { v9_dep(); emit_data( op(ldst_op) | rd(d) | op3(swap_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); } + +-inline void Assembler::swap( Address& a, Register d, int offset ) { ++inline void Assembler::swap( const Address& a, Register d, int offset ) { + relocate(a.rspec(offset)); + if (a.has_index()) { assert(offset == 0, ""); swap( a.base(), a.index(), d ); } + else { swap( a.base(), a.disp() + offset, d ); } +--- ./hotspot/src/cpu/sparc/vm/copy_sparc.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/copy_sparc.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -184,7 +184,7 @@ + assert(MinObjAlignmentInBytes >= BytesPerLong, "need alternate implementation"); + + if (value == 0 && UseBlockZeroing && +- (count > (BlockZeroingLowLimit >> LogHeapWordSize))) { ++ (count > (size_t)(BlockZeroingLowLimit >> LogHeapWordSize))) { + // Call it only when block zeroing is used + ((_zero_Fn)StubRoutines::zero_aligned_words())(tohw, count); + } else { +--- ./hotspot/src/cpu/sparc/vm/frame_sparc.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/frame_sparc.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -282,8 +282,8 @@ + + // next two fns read and write Lmonitors value, + private: +- BasicObjectLock* interpreter_frame_monitors() const { return *interpreter_frame_monitors_addr(); } +- void interpreter_frame_set_monitors(BasicObjectLock* monitors) { *interpreter_frame_monitors_addr() = monitors; } ++ BasicObjectLock* interpreter_frame_monitors() const; ++ void interpreter_frame_set_monitors(BasicObjectLock* monitors); + #else + public: + inline interpreterState get_interpreterState() const { +--- ./hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -217,6 +217,13 @@ + return (methodOop*)sp_addr_at( Lmethod->sp_offset_in_saved_window()); + } + ++inline BasicObjectLock* frame::interpreter_frame_monitors() const { ++ return *interpreter_frame_monitors_addr(); ++} ++ ++inline void frame::interpreter_frame_set_monitors(BasicObjectLock* monitors) { ++ *interpreter_frame_monitors_addr() = monitors; ++} + + // Constant pool cache + +--- ./hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1142,50 +1142,81 @@ + // Hoist any int/ptr/long's in the first 6 to int regs. + // Hoist any flt/dbl's in the first 16 dbl regs. + int j = 0; // Count of actual args, not HALVES +- for( int i=0; i<total_args_passed; i++, j++ ) { +- switch( sig_bt[i] ) { ++ VMRegPair param_array_reg; // location of the argument in the parameter array ++ for (int i = 0; i < total_args_passed; i++, j++) { ++ param_array_reg.set_bad(); ++ switch (sig_bt[i]) { + case T_BOOLEAN: + case T_BYTE: + case T_CHAR: + case T_INT: + case T_SHORT: +- regs[i].set1( int_stk_helper( j ) ); break; ++ regs[i].set1(int_stk_helper(j)); ++ break; + case T_LONG: +- assert( sig_bt[i+1] == T_VOID, "expecting half" ); ++ assert(sig_bt[i+1] == T_VOID, "expecting half"); + case T_ADDRESS: // raw pointers, like current thread, for VM calls + case T_ARRAY: + case T_OBJECT: +- regs[i].set2( int_stk_helper( j ) ); ++ regs[i].set2(int_stk_helper(j)); + break; + case T_FLOAT: +- if ( j < 16 ) { +- // V9ism: floats go in ODD registers +- regs[i].set1(as_FloatRegister(1 + (j<<1))->as_VMReg()); +- } else { +- // V9ism: floats go in ODD stack slot +- regs[i].set1(VMRegImpl::stack2reg(1 + (j<<1))); ++ // Per SPARC Compliance Definition 2.4.1, page 3P-12 available here ++ // http://www.sparc.org/wp-content/uploads/2014/01/SCD.2.4.1.pdf.gz ++ // ++ // "When a callee prototype exists, and does not indicate variable arguments, ++ // floating-point values assigned to locations %sp+BIAS+128 through %sp+BIAS+248 ++ // will be promoted to floating-point registers" ++ // ++ // By "promoted" it means that the argument is located in two places, an unused ++ // spill slot in the "parameter array" (starts at %sp+BIAS+128), and a live ++ // float register. In most cases, there are 6 or fewer arguments of any type, ++ // and the standard parameter array slots (%sp+BIAS+128 to %sp+BIAS+176 exclusive) ++ // serve as shadow slots. Per the spec floating point registers %d6 to %d16 ++ // require slots beyond that (up to %sp+BIAS+248). ++ // ++ { ++ // V9ism: floats go in ODD registers and stack slots ++ int float_index = 1 + (j << 1); ++ param_array_reg.set1(VMRegImpl::stack2reg(float_index)); ++ if (j < 16) { ++ regs[i].set1(as_FloatRegister(float_index)->as_VMReg()); ++ } else { ++ regs[i] = param_array_reg; ++ } + } + break; + case T_DOUBLE: +- assert( sig_bt[i+1] == T_VOID, "expecting half" ); +- if ( j < 16 ) { +- // V9ism: doubles go in EVEN/ODD regs +- regs[i].set2(as_FloatRegister(j<<1)->as_VMReg()); +- } else { +- // V9ism: doubles go in EVEN/ODD stack slots +- regs[i].set2(VMRegImpl::stack2reg(j<<1)); ++ { ++ assert(sig_bt[i + 1] == T_VOID, "expecting half"); ++ // V9ism: doubles go in EVEN/ODD regs and stack slots ++ int double_index = (j << 1); ++ param_array_reg.set2(VMRegImpl::stack2reg(double_index)); ++ if (j < 16) { ++ regs[i].set2(as_FloatRegister(double_index)->as_VMReg()); ++ } else { ++ // V9ism: doubles go in EVEN/ODD stack slots ++ regs[i] = param_array_reg; ++ } + } + break; +- case T_VOID: regs[i].set_bad(); j--; break; // Do not count HALVES ++ case T_VOID: ++ regs[i].set_bad(); ++ j--; ++ break; // Do not count HALVES + default: + ShouldNotReachHere(); + } +- if (regs[i].first()->is_stack()) { +- int off = regs[i].first()->reg2stack(); ++ // Keep track of the deepest parameter array slot. ++ if (!param_array_reg.first()->is_valid()) { ++ param_array_reg = regs[i]; ++ } ++ if (param_array_reg.first()->is_stack()) { ++ int off = param_array_reg.first()->reg2stack(); + if (off > max_stack_slots) max_stack_slots = off; + } +- if (regs[i].second()->is_stack()) { +- int off = regs[i].second()->reg2stack(); ++ if (param_array_reg.second()->is_stack()) { ++ int off = param_array_reg.second()->reg2stack(); + if (off > max_stack_slots) max_stack_slots = off; + } + } +@@ -1193,8 +1224,8 @@ + #else // _LP64 + // V8 convention: first 6 things in O-regs, rest on stack. + // Alignment is willy-nilly. +- for( int i=0; i<total_args_passed; i++ ) { +- switch( sig_bt[i] ) { ++ for (int i = 0; i < total_args_passed; i++) { ++ switch (sig_bt[i]) { + case T_ADDRESS: // raw pointers, like current thread, for VM calls + case T_ARRAY: + case T_BOOLEAN: +@@ -1204,23 +1235,23 @@ + case T_INT: + case T_OBJECT: + case T_SHORT: +- regs[i].set1( int_stk_helper( i ) ); ++ regs[i].set1(int_stk_helper(i)); + break; + case T_DOUBLE: + case T_LONG: +- assert( sig_bt[i+1] == T_VOID, "expecting half" ); +- regs[i].set_pair( int_stk_helper( i+1 ), int_stk_helper( i ) ); ++ assert(sig_bt[i + 1] == T_VOID, "expecting half"); ++ regs[i].set_pair(int_stk_helper(i + 1), int_stk_helper(i)); + break; + case T_VOID: regs[i].set_bad(); break; + default: + ShouldNotReachHere(); + } + if (regs[i].first()->is_stack()) { +- int off = regs[i].first()->reg2stack(); ++ int off = regs[i].first()->reg2stack(); + if (off > max_stack_slots) max_stack_slots = off; + } + if (regs[i].second()->is_stack()) { +- int off = regs[i].second()->reg2stack(); ++ int off = regs[i].second()->reg2stack(); + if (off > max_stack_slots) max_stack_slots = off; + } + } +@@ -1369,11 +1400,10 @@ + const Register rOop = src.first()->as_Register(); + const Register rHandle = L5; + int oop_slot = rOop->input_number() * VMRegImpl::slots_per_word + oop_handle_offset; +- int offset = oop_slot*VMRegImpl::stack_slot_size; +- Label skip; ++ int offset = oop_slot * VMRegImpl::stack_slot_size; + __ st_ptr(rOop, SP, offset + STACK_BIAS); + if (is_receiver) { +- *receiver_offset = oop_slot * VMRegImpl::stack_slot_size; ++ *receiver_offset = offset; + } + map->set_oop(VMRegImpl::stack2reg(oop_slot)); + __ add(SP, offset + STACK_BIAS, rHandle); +--- ./hotspot/src/cpu/sparc/vm/sparc.ad Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/sparc.ad Mon Jan 05 11:51:17 2015 -0800 +@@ -1978,7 +1978,7 @@ + // to implement the UseStrictFP mode. + const bool Matcher::strict_fp_requires_explicit_rounding = false; + +-// Are floats conerted to double when stored to stack during deoptimization? ++// Are floats converted to double when stored to stack during deoptimization? + // Sparc does not handle callee-save floats. + bool Matcher::float_in_double() { return false; } + +@@ -3216,7 +3216,7 @@ + // are owned by the CALLEE. Holes should not be nessecary in the + // incoming area, as the Java calling convention is completely under + // the control of the AD file. Doubles can be sorted and packed to +-// avoid holes. Holes in the outgoing arguments may be nessecary for ++// avoid holes. Holes in the outgoing arguments may be necessary for + // varargs C calling conventions. + // Note 3: Region 0-3 is even aligned, with pad2 as needed. Region 3-5 is + // even aligned with pad0 as needed. +@@ -3282,7 +3282,7 @@ + %} + + // Body of function which returns an OptoRegs array locating +- // arguments either in registers or in stack slots for callin ++ // arguments either in registers or in stack slots for calling + // C. + c_calling_convention %{ + // This is obviously always outgoing +--- ./hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -89,7 +89,7 @@ + private: + + #ifdef PRODUCT +-#define inc_counter_np(a,b,c) (0) ++#define inc_counter_np(a,b,c) + #else + #define inc_counter_np(counter, t1, t2) \ + BLOCK_COMMENT("inc_counter " #counter); \ +@@ -1126,7 +1126,7 @@ + Label& L_loop, bool use_prefetch, bool use_bis); + + void disjoint_copy_core(Register from, Register to, Register count, int log2_elem_size, +- int iter_size, CopyLoopFunc copy_loop_func) { ++ int iter_size, StubGenerator::CopyLoopFunc copy_loop_func) { + Label L_copy; + + assert(log2_elem_size <= 3, "the following code should be changed"); +@@ -1277,7 +1277,7 @@ + __ inc(from, 8); + __ sllx(O3, left_shift, O3); + +- disjoint_copy_core(from, to, count, log2_elem_size, 16, copy_16_bytes_shift_loop); ++ disjoint_copy_core(from, to, count, log2_elem_size, 16, &StubGenerator::copy_16_bytes_shift_loop); + + __ inccc(count, count_dec>>1 ); // + 8 bytes + __ brx(Assembler::negative, true, Assembler::pn, L_copy_last_bytes); +@@ -2156,7 +2156,7 @@ + __ dec(count, 4); // The cmp at the beginning guaranty count >= 4 + __ sllx(O3, 32, O3); + +- disjoint_copy_core(from, to, count, 2, 16, copy_16_bytes_loop); ++ disjoint_copy_core(from, to, count, 2, 16, &StubGenerator::copy_16_bytes_loop); + + __ br(Assembler::always, false, Assembler::pt, L_copy_4_bytes); + __ delayed()->inc(count, 4); // restore 'count' +@@ -2437,7 +2437,7 @@ + // count >= 0 (original count - 8) + __ mov(from, from64); + +- disjoint_copy_core(from64, to64, count, 3, 64, copy_64_bytes_loop); ++ disjoint_copy_core(from64, to64, count, 3, 64, &StubGenerator::copy_64_bytes_loop); + + // Restore O4(offset0), O5(offset8) + __ sub(from64, from, offset0); +--- ./hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -48,7 +48,8 @@ + sparc64_family = 14, + M_family = 15, + T_family = 16, +- T1_model = 17 ++ T1_model = 17, ++ sparc5_instructions = 18 + }; + + enum Feature_Flag_Set { +@@ -73,6 +74,7 @@ + M_family_m = 1 << M_family, + T_family_m = 1 << T_family, + T1_model_m = 1 << T1_model, ++ sparc5_instructions_m = 1 << sparc5_instructions, + + generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m, + generic_v9_m = generic_v8_m | v9_instructions_m, +@@ -117,6 +119,7 @@ + static bool has_vis3() { return (_features & vis3_instructions_m) != 0; } + static bool has_blk_init() { return (_features & blk_init_instructions_m) != 0; } + static bool has_cbcond() { return (_features & cbcond_instructions_m) != 0; } ++ static bool has_sparc5_instr() { return (_features & sparc5_instructions_m) != 0; } + + static bool supports_compare_and_exchange() + { return has_v9(); } +@@ -127,6 +130,7 @@ + + static bool is_M_series() { return is_M_family(_features); } + static bool is_T4() { return is_T_family(_features) && has_cbcond(); } ++ static bool is_T7() { return is_T_family(_features) && has_sparc5_instr(); } + + // Fujitsu SPARC64 + static bool is_sparc64() { return (_features & sparc64_family_m) != 0; } +@@ -146,7 +150,7 @@ + static const char* cpu_features() { return _features_str; } + + static intx prefetch_data_size() { +- return is_T4() ? 32 : 64; // default prefetch block size on sparc ++ return is_T4() && !is_T7() ? 32 : 64; // default prefetch block size on sparc + } + + // Prefetch +--- ./hotspot/src/os/bsd/vm/os_bsd.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/os_bsd.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1297,9 +1297,20 @@ + ////////////////////////////////////////////////////////////////////////////// + // thread local storage + ++// Restore the thread pointer if the destructor is called. This is in case ++// someone from JNI code sets up a destructor with pthread_key_create to run ++// detachCurrentThread on thread death. Unless we restore the thread pointer we ++// will hang or crash. When detachCurrentThread is called the key will be set ++// to null and we will not be called again. If detachCurrentThread is never ++// called we could loop forever depending on the pthread implementation. ++static void restore_thread_pointer(void* p) { ++ Thread* thread = (Thread*) p; ++ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); ++} ++ + int os::allocate_thread_local_storage() { + pthread_key_t key; +- int rslt = pthread_key_create(&key, NULL); ++ int rslt = pthread_key_create(&key, restore_thread_pointer); + assert(rslt == 0, "cannot allocate thread local storage"); + return (int)key; + } +@@ -4422,11 +4433,15 @@ + // and if UserSignalHandler is installed all bets are off + if (CheckJNICalls) { + if (libjsig_is_loaded) { +- tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); ++ if (PrintJNIResolving) { ++ tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); ++ } + check_signals = false; + } + if (AllowUserSignalHandlers) { +- tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); ++ if (PrintJNIResolving) { ++ tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); ++ } + check_signals = false; + } + } +--- ./hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -197,7 +197,38 @@ + } + + +-// check if the given path is considered a secure directory for ++// Check if the given statbuf is considered a secure directory for ++// the backing store files. Returns true if the directory is considered ++// a secure location. Returns false if the statbuf is a symbolic link or ++// if an error occurred. ++// ++static bool is_statbuf_secure(struct stat *statp) { ++ if (S_ISLNK(statp->st_mode) || !S_ISDIR(statp->st_mode)) { ++ // The path represents a link or some non-directory file type, ++ // which is not what we expected. Declare it insecure. ++ // ++ return false; ++ } ++ // We have an existing directory, check if the permissions are safe. ++ // ++ if ((statp->st_mode & (S_IWGRP|S_IWOTH)) != 0) { ++ // The directory is open for writing and could be subjected ++ // to a symlink or a hard link attack. Declare it insecure. ++ // ++ return false; ++ } ++ // See if the uid of the directory matches the effective uid of the process. ++ // ++ if (statp->st_uid != geteuid()) { ++ // The directory was not created by this user, declare it insecure. ++ // ++ return false; ++ } ++ return true; ++} ++ ++ ++// Check if the given path is considered a secure directory for + // the backing store files. Returns true if the directory exists + // and is considered a secure location. Returns false if the path + // is a symbolic link or if an error occurred. +@@ -211,27 +242,185 @@ + return false; + } + +- // the path exists, now check it's mode +- if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) { +- // the path represents a link or some non-directory file type, +- // which is not what we expected. declare it insecure. +- // ++ // The path exists, see if it is secure. ++ return is_statbuf_secure(&statbuf); ++} ++ ++ ++// Check if the given directory file descriptor is considered a secure ++// directory for the backing store files. Returns true if the directory ++// exists and is considered a secure location. Returns false if the path ++// is a symbolic link or if an error occurred. ++// ++static bool is_dirfd_secure(int dir_fd) { ++ struct stat statbuf; ++ int result = 0; ++ ++ RESTARTABLE(::fstat(dir_fd, &statbuf), result); ++ if (result == OS_ERR) { + return false; + } +- else { +- // we have an existing directory, check if the permissions are safe. +- // +- if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) { +- // the directory is open for writing and could be subjected +- // to a symlnk attack. declare it insecure. +- // +- return false; ++ ++ // The path exists, now check its mode. ++ return is_statbuf_secure(&statbuf); ++} ++ ++ ++// Check to make sure fd1 and fd2 are referencing the same file system object. ++// ++static bool is_same_fsobject(int fd1, int fd2) { ++ struct stat statbuf1; ++ struct stat statbuf2; ++ int result = 0; ++ ++ RESTARTABLE(::fstat(fd1, &statbuf1), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ RESTARTABLE(::fstat(fd2, &statbuf2), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ ++ if ((statbuf1.st_ino == statbuf2.st_ino) && ++ (statbuf1.st_dev == statbuf2.st_dev)) { ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++ ++// Open the directory of the given path and validate it. ++// Return a DIR * of the open directory. ++// ++static DIR *open_directory_secure(const char* dirname) { ++ // Open the directory using open() so that it can be verified ++ // to be secure by calling is_dirfd_secure(), opendir() and then check ++ // to see if they are the same file system object. This method does not ++ // introduce a window of opportunity for the directory to be attacked that ++ // calling opendir() and is_directory_secure() does. ++ int result; ++ DIR *dirp = NULL; ++ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result); ++ if (result == OS_ERR) { ++ // Directory doesn't exist or is a symlink, so there is nothing to cleanup. ++ if (PrintMiscellaneous && Verbose) { ++ if (errno == ELOOP) { ++ warning("directory %s is a symlink and is not secure\n", dirname); ++ } else { ++ warning("could not open directory %s: %s\n", dirname, strerror(errno)); ++ } + } ++ return dirp; ++ } ++ int fd = result; ++ ++ // Determine if the open directory is secure. ++ if (!is_dirfd_secure(fd)) { ++ // The directory is not a secure directory. ++ os::close(fd); ++ return dirp; ++ } ++ ++ // Open the directory. ++ dirp = ::opendir(dirname); ++ if (dirp == NULL) { ++ // The directory doesn't exist, close fd and return. ++ os::close(fd); ++ return dirp; ++ } ++ ++ // Check to make sure fd and dirp are referencing the same file system object. ++ if (!is_same_fsobject(fd, dirfd(dirp))) { ++ // The directory is not secure. ++ os::close(fd); ++ os::closedir(dirp); ++ dirp = NULL; ++ return dirp; ++ } ++ ++ // Close initial open now that we know directory is secure ++ os::close(fd); ++ ++ return dirp; ++} ++ ++// NOTE: The code below uses fchdir(), open() and unlink() because ++// fdopendir(), openat() and unlinkat() are not supported on all ++// versions. Once the support for fdopendir(), openat() and unlinkat() ++// is available on all supported versions the code can be changed ++// to use these functions. ++ ++// Open the directory of the given path, validate it and set the ++// current working directory to it. ++// Return a DIR * of the open directory and the saved cwd fd. ++// ++static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) { ++ ++ // Open the directory. ++ DIR* dirp = open_directory_secure(dirname); ++ if (dirp == NULL) { ++ // Directory doesn't exist or is insecure, so there is nothing to cleanup. ++ return dirp; ++ } ++ int fd = dirfd(dirp); ++ ++ // Open a fd to the cwd and save it off. ++ int result; ++ RESTARTABLE(::open(".", O_RDONLY), result); ++ if (result == OS_ERR) { ++ *saved_cwd_fd = -1; ++ } else { ++ *saved_cwd_fd = result; ++ } ++ ++ // Set the current directory to dirname by using the fd of the directory. ++ result = fchdir(fd); ++ ++ return dirp; ++} ++ ++// Close the directory and restore the current working directory. ++// ++static void close_directory_secure_cwd(DIR* dirp, int saved_cwd_fd) { ++ ++ int result; ++ // If we have a saved cwd change back to it and close the fd. ++ if (saved_cwd_fd != -1) { ++ result = fchdir(saved_cwd_fd); ++ ::close(saved_cwd_fd); ++ } ++ ++ // Close the directory. ++ os::closedir(dirp); ++} ++ ++// Check if the given file descriptor is considered a secure. ++// ++static bool is_file_secure(int fd, const char *filename) { ++ ++ int result; ++ struct stat statbuf; ++ ++ // Determine if the file is secure. ++ RESTARTABLE(::fstat(fd, &statbuf), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("fstat failed on %s: %s\n", filename, strerror(errno)); ++ } ++ return false; ++ } ++ if (statbuf.st_nlink > 1) { ++ // A file with multiple links is not expected. ++ if (PrintMiscellaneous && Verbose) { ++ warning("file %s has multiple links\n", filename); ++ } ++ return false; + } + return true; + } + +- + // return the user name for the given user id + // + // the caller is expected to free the allocated memory. +@@ -317,9 +506,11 @@ + + const char* tmpdirname = os::get_temp_directory(); + ++ // open the temp directory + DIR* tmpdirp = os::opendir(tmpdirname); + + if (tmpdirp == NULL) { ++ // Cannot open the directory to get the user name, return. + return NULL; + } + +@@ -344,25 +535,14 @@ + strcat(usrdir_name, "/"); + strcat(usrdir_name, dentry->d_name); + +- DIR* subdirp = os::opendir(usrdir_name); ++ // open the user directory ++ DIR* subdirp = open_directory_secure(usrdir_name); + + if (subdirp == NULL) { + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); + continue; + } + +- // Since we don't create the backing store files in directories +- // pointed to by symbolic links, we also don't follow them when +- // looking for the files. We check for a symbolic link after the +- // call to opendir in order to eliminate a small window where the +- // symlink can be exploited. +- // +- if (!is_directory_secure(usrdir_name)) { +- FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); +- os::closedir(subdirp); +- continue; +- } +- + struct dirent* udentry; + char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal); + errno = 0; +@@ -465,26 +645,6 @@ + } + + +-// remove file +-// +-// this method removes the file with the given file name in the +-// named directory. +-// +-static void remove_file(const char* dirname, const char* filename) { +- +- size_t nbytes = strlen(dirname) + strlen(filename) + 2; +- char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); +- +- strcpy(path, dirname); +- strcat(path, "/"); +- strcat(path, filename); +- +- remove_file(path); +- +- FREE_C_HEAP_ARRAY(char, path, mtInternal); +-} +- +- + // cleanup stale shared memory resources + // + // This method attempts to remove all stale shared memory files in +@@ -496,16 +656,11 @@ + // + static void cleanup_sharedmem_resources(const char* dirname) { + +- // open the user temp directory +- DIR* dirp = os::opendir(dirname); +- ++ int saved_cwd_fd; ++ // open the directory and set the current working directory to it ++ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); + if (dirp == NULL) { +- // directory doesn't exist, so there is nothing to cleanup +- return; +- } +- +- if (!is_directory_secure(dirname)) { +- // the directory is not a secure directory ++ // directory doesn't exist or is insecure, so there is nothing to cleanup + return; + } + +@@ -519,6 +674,7 @@ + // + struct dirent* entry; + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); ++ + errno = 0; + while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { + +@@ -529,7 +685,7 @@ + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { + + // attempt to remove all unexpected files, except "." and ".." +- remove_file(dirname, entry->d_name); ++ unlink(entry->d_name); + } + + errno = 0; +@@ -552,11 +708,14 @@ + if ((pid == os::current_process_id()) || + (kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) { + +- remove_file(dirname, entry->d_name); ++ unlink(entry->d_name); + } + errno = 0; + } +- os::closedir(dirp); ++ ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); ++ + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); + } + +@@ -613,19 +772,54 @@ + return -1; + } + ++ int saved_cwd_fd; ++ // open the directory and set the current working directory to it ++ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); ++ if (dirp == NULL) { ++ // Directory doesn't exist or is insecure, so cannot create shared ++ // memory file. ++ return -1; ++ } ++ ++ // Open the filename in the current directory. ++ // Cannot use O_TRUNC here; truncation of an existing file has to happen ++ // after the is_file_secure() check below. + int result; +- +- RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result); ++ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result); + if (result == OS_ERR) { + if (PrintMiscellaneous && Verbose) { +- warning("could not create file %s: %s\n", filename, strerror(errno)); ++ if (errno == ELOOP) { ++ warning("file %s is a symlink and is not secure\n", filename); ++ } else { ++ warning("could not create file %s: %s\n", filename, strerror(errno)); ++ } + } ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); ++ + return -1; + } ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); + + // save the file descriptor + int fd = result; + ++ // check to see if the file is secure ++ if (!is_file_secure(fd, filename)) { ++ ::close(fd); ++ return -1; ++ } ++ ++ // truncate the file to get rid of any existing data ++ RESTARTABLE(::ftruncate(fd, (off_t)0), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("could not truncate shared memory file: %s\n", strerror(errno)); ++ } ++ ::close(fd); ++ return -1; ++ } + // set the file size + RESTARTABLE(::ftruncate(fd, (off_t)size), result); + if (result == OS_ERR) { +@@ -683,8 +877,15 @@ + THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + } + } ++ int fd = result; + +- return result; ++ // check to see if the file is secure ++ if (!is_file_secure(fd, filename)) { ++ ::close(fd); ++ return -1; ++ } ++ ++ return fd; + } + + // create a named shared memory region. returns the address of the +@@ -716,13 +917,21 @@ + char* dirname = get_user_tmp_dir(user_name); + char* filename = get_sharedmem_filename(dirname, vmid); + ++ // get the short filename ++ char* short_filename = strrchr(filename, '/'); ++ if (short_filename == NULL) { ++ short_filename = filename; ++ } else { ++ short_filename++; ++ } ++ + // cleanup any stale shared memory files + cleanup_sharedmem_resources(dirname); + + assert(((size > 0) && (size % os::vm_page_size() == 0)), + "unexpected PerfMemory region size"); + +- fd = create_sharedmem_resources(dirname, filename, size); ++ fd = create_sharedmem_resources(dirname, short_filename, size); + + FREE_C_HEAP_ARRAY(char, user_name, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); +@@ -839,12 +1048,12 @@ + // constructs for the file and the shared memory mapping. + if (mode == PerfMemory::PERF_MODE_RO) { + mmap_prot = PROT_READ; +- file_flags = O_RDONLY; ++ file_flags = O_RDONLY | O_NOFOLLOW; + } + else if (mode == PerfMemory::PERF_MODE_RW) { + #ifdef LATER + mmap_prot = PROT_READ | PROT_WRITE; +- file_flags = O_RDWR; ++ file_flags = O_RDWR | O_NOFOLLOW; + #else + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + "Unsupported access mode"); +--- ./hotspot/src/os/linux/vm/os_linux.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os/linux/vm/os_linux.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1103,9 +1103,20 @@ + ////////////////////////////////////////////////////////////////////////////// + // thread local storage + ++// Restore the thread pointer if the destructor is called. This is in case ++// someone from JNI code sets up a destructor with pthread_key_create to run ++// detachCurrentThread on thread death. Unless we restore the thread pointer we ++// will hang or crash. When detachCurrentThread is called the key will be set ++// to null and we will not be called again. If detachCurrentThread is never ++// called we could loop forever depending on the pthread implementation. ++static void restore_thread_pointer(void* p) { ++ Thread* thread = (Thread*) p; ++ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); ++} ++ + int os::allocate_thread_local_storage() { + pthread_key_t key; +- int rslt = pthread_key_create(&key, NULL); ++ int rslt = pthread_key_create(&key, restore_thread_pointer); + assert(rslt == 0, "cannot allocate thread local storage"); + return (int)key; + } +--- ./hotspot/src/os/linux/vm/perfMemory_linux.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os/linux/vm/perfMemory_linux.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -197,7 +197,38 @@ + } + + +-// check if the given path is considered a secure directory for ++// Check if the given statbuf is considered a secure directory for ++// the backing store files. Returns true if the directory is considered ++// a secure location. Returns false if the statbuf is a symbolic link or ++// if an error occurred. ++// ++static bool is_statbuf_secure(struct stat *statp) { ++ if (S_ISLNK(statp->st_mode) || !S_ISDIR(statp->st_mode)) { ++ // The path represents a link or some non-directory file type, ++ // which is not what we expected. Declare it insecure. ++ // ++ return false; ++ } ++ // We have an existing directory, check if the permissions are safe. ++ // ++ if ((statp->st_mode & (S_IWGRP|S_IWOTH)) != 0) { ++ // The directory is open for writing and could be subjected ++ // to a symlink or a hard link attack. Declare it insecure. ++ // ++ return false; ++ } ++ // See if the uid of the directory matches the effective uid of the process. ++ // ++ if (statp->st_uid != geteuid()) { ++ // The directory was not created by this user, declare it insecure. ++ // ++ return false; ++ } ++ return true; ++} ++ ++ ++// Check if the given path is considered a secure directory for + // the backing store files. Returns true if the directory exists + // and is considered a secure location. Returns false if the path + // is a symbolic link or if an error occurred. +@@ -211,22 +242,180 @@ + return false; + } + +- // the path exists, now check it's mode +- if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) { +- // the path represents a link or some non-directory file type, +- // which is not what we expected. declare it insecure. +- // ++ // The path exists, see if it is secure. ++ return is_statbuf_secure(&statbuf); ++} ++ ++ ++// Check if the given directory file descriptor is considered a secure ++// directory for the backing store files. Returns true if the directory ++// exists and is considered a secure location. Returns false if the path ++// is a symbolic link or if an error occurred. ++// ++static bool is_dirfd_secure(int dir_fd) { ++ struct stat statbuf; ++ int result = 0; ++ ++ RESTARTABLE(::fstat(dir_fd, &statbuf), result); ++ if (result == OS_ERR) { + return false; + } +- else { +- // we have an existing directory, check if the permissions are safe. +- // +- if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) { +- // the directory is open for writing and could be subjected +- // to a symlnk attack. declare it insecure. +- // +- return false; ++ ++ // The path exists, now check its mode. ++ return is_statbuf_secure(&statbuf); ++} ++ ++ ++// Check to make sure fd1 and fd2 are referencing the same file system object. ++// ++static bool is_same_fsobject(int fd1, int fd2) { ++ struct stat statbuf1; ++ struct stat statbuf2; ++ int result = 0; ++ ++ RESTARTABLE(::fstat(fd1, &statbuf1), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ RESTARTABLE(::fstat(fd2, &statbuf2), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ ++ if ((statbuf1.st_ino == statbuf2.st_ino) && ++ (statbuf1.st_dev == statbuf2.st_dev)) { ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++ ++// Open the directory of the given path and validate it. ++// Return a DIR * of the open directory. ++// ++static DIR *open_directory_secure(const char* dirname) { ++ // Open the directory using open() so that it can be verified ++ // to be secure by calling is_dirfd_secure(), opendir() and then check ++ // to see if they are the same file system object. This method does not ++ // introduce a window of opportunity for the directory to be attacked that ++ // calling opendir() and is_directory_secure() does. ++ int result; ++ DIR *dirp = NULL; ++ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ if (errno == ELOOP) { ++ warning("directory %s is a symlink and is not secure\n", dirname); ++ } else { ++ warning("could not open directory %s: %s\n", dirname, strerror(errno)); ++ } + } ++ return dirp; ++ } ++ int fd = result; ++ ++ // Determine if the open directory is secure. ++ if (!is_dirfd_secure(fd)) { ++ // The directory is not a secure directory. ++ os::close(fd); ++ return dirp; ++ } ++ ++ // Open the directory. ++ dirp = ::opendir(dirname); ++ if (dirp == NULL) { ++ // The directory doesn't exist, close fd and return. ++ os::close(fd); ++ return dirp; ++ } ++ ++ // Check to make sure fd and dirp are referencing the same file system object. ++ if (!is_same_fsobject(fd, dirfd(dirp))) { ++ // The directory is not secure. ++ os::close(fd); ++ os::closedir(dirp); ++ dirp = NULL; ++ return dirp; ++ } ++ ++ // Close initial open now that we know directory is secure ++ os::close(fd); ++ ++ return dirp; ++} ++ ++// NOTE: The code below uses fchdir(), open() and unlink() because ++// fdopendir(), openat() and unlinkat() are not supported on all ++// versions. Once the support for fdopendir(), openat() and unlinkat() ++// is available on all supported versions the code can be changed ++// to use these functions. ++ ++// Open the directory of the given path, validate it and set the ++// current working directory to it. ++// Return a DIR * of the open directory and the saved cwd fd. ++// ++static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) { ++ ++ // Open the directory. ++ DIR* dirp = open_directory_secure(dirname); ++ if (dirp == NULL) { ++ // Directory doesn't exist or is insecure, so there is nothing to cleanup. ++ return dirp; ++ } ++ int fd = dirfd(dirp); ++ ++ // Open a fd to the cwd and save it off. ++ int result; ++ RESTARTABLE(::open(".", O_RDONLY), result); ++ if (result == OS_ERR) { ++ *saved_cwd_fd = -1; ++ } else { ++ *saved_cwd_fd = result; ++ } ++ ++ // Set the current directory to dirname by using the fd of the directory. ++ result = fchdir(fd); ++ ++ return dirp; ++} ++ ++// Close the directory and restore the current working directory. ++// ++static void close_directory_secure_cwd(DIR* dirp, int saved_cwd_fd) { ++ ++ int result; ++ // If we have a saved cwd change back to it and close the fd. ++ if (saved_cwd_fd != -1) { ++ result = fchdir(saved_cwd_fd); ++ ::close(saved_cwd_fd); ++ } ++ ++ // Close the directory. ++ os::closedir(dirp); ++} ++ ++// Check if the given file descriptor is considered a secure. ++// ++static bool is_file_secure(int fd, const char *filename) { ++ ++ int result; ++ struct stat statbuf; ++ ++ // Determine if the file is secure. ++ RESTARTABLE(::fstat(fd, &statbuf), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("fstat failed on %s: %s\n", filename, strerror(errno)); ++ } ++ return false; ++ } ++ if (statbuf.st_nlink > 1) { ++ // A file with multiple links is not expected. ++ if (PrintMiscellaneous && Verbose) { ++ warning("file %s has multiple links\n", filename); ++ } ++ return false; + } + return true; + } +@@ -317,9 +506,11 @@ + + const char* tmpdirname = os::get_temp_directory(); + ++ // open the temp directory + DIR* tmpdirp = os::opendir(tmpdirname); + + if (tmpdirp == NULL) { ++ // Cannot open the directory to get the user name, return. + return NULL; + } + +@@ -344,7 +535,8 @@ + strcat(usrdir_name, "/"); + strcat(usrdir_name, dentry->d_name); + +- DIR* subdirp = os::opendir(usrdir_name); ++ // open the user directory ++ DIR* subdirp = open_directory_secure(usrdir_name); + + if (subdirp == NULL) { + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); +@@ -465,26 +657,6 @@ + } + + +-// remove file +-// +-// this method removes the file with the given file name in the +-// named directory. +-// +-static void remove_file(const char* dirname, const char* filename) { +- +- size_t nbytes = strlen(dirname) + strlen(filename) + 2; +- char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); +- +- strcpy(path, dirname); +- strcat(path, "/"); +- strcat(path, filename); +- +- remove_file(path); +- +- FREE_C_HEAP_ARRAY(char, path, mtInternal); +-} +- +- + // cleanup stale shared memory resources + // + // This method attempts to remove all stale shared memory files in +@@ -496,16 +668,11 @@ + // + static void cleanup_sharedmem_resources(const char* dirname) { + +- // open the user temp directory +- DIR* dirp = os::opendir(dirname); +- ++ int saved_cwd_fd; ++ // open the directory ++ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); + if (dirp == NULL) { +- // directory doesn't exist, so there is nothing to cleanup +- return; +- } +- +- if (!is_directory_secure(dirname)) { +- // the directory is not a secure directory ++ // directory doesn't exist or is insecure, so there is nothing to cleanup + return; + } + +@@ -519,6 +686,7 @@ + // + struct dirent* entry; + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); ++ + errno = 0; + while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { + +@@ -527,9 +695,8 @@ + if (pid == 0) { + + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { +- + // attempt to remove all unexpected files, except "." and ".." +- remove_file(dirname, entry->d_name); ++ unlink(entry->d_name); + } + + errno = 0; +@@ -551,12 +718,14 @@ + // + if ((pid == os::current_process_id()) || + (kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) { +- +- remove_file(dirname, entry->d_name); ++ unlink(entry->d_name); + } + errno = 0; + } +- os::closedir(dirp); ++ ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); ++ + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); + } + +@@ -613,19 +782,54 @@ + return -1; + } + ++ int saved_cwd_fd; ++ // open the directory and set the current working directory to it ++ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); ++ if (dirp == NULL) { ++ // Directory doesn't exist or is insecure, so cannot create shared ++ // memory file. ++ return -1; ++ } ++ ++ // Open the filename in the current directory. ++ // Cannot use O_TRUNC here; truncation of an existing file has to happen ++ // after the is_file_secure() check below. + int result; +- +- RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result); ++ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result); + if (result == OS_ERR) { + if (PrintMiscellaneous && Verbose) { +- warning("could not create file %s: %s\n", filename, strerror(errno)); ++ if (errno == ELOOP) { ++ warning("file %s is a symlink and is not secure\n", filename); ++ } else { ++ warning("could not create file %s: %s\n", filename, strerror(errno)); ++ } + } ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); ++ + return -1; + } ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); + + // save the file descriptor + int fd = result; + ++ // check to see if the file is secure ++ if (!is_file_secure(fd, filename)) { ++ ::close(fd); ++ return -1; ++ } ++ ++ // truncate the file to get rid of any existing data ++ RESTARTABLE(::ftruncate(fd, (off_t)0), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("could not truncate shared memory file: %s\n", strerror(errno)); ++ } ++ ::close(fd); ++ return -1; ++ } + // set the file size + RESTARTABLE(::ftruncate(fd, (off_t)size), result); + if (result == OS_ERR) { +@@ -683,8 +887,15 @@ + THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + } + } ++ int fd = result; + +- return result; ++ // check to see if the file is secure ++ if (!is_file_secure(fd, filename)) { ++ ::close(fd); ++ return -1; ++ } ++ ++ return fd; + } + + // create a named shared memory region. returns the address of the +@@ -715,6 +926,13 @@ + + char* dirname = get_user_tmp_dir(user_name); + char* filename = get_sharedmem_filename(dirname, vmid); ++ // get the short filename ++ char* short_filename = strrchr(filename, '/'); ++ if (short_filename == NULL) { ++ short_filename = filename; ++ } else { ++ short_filename++; ++ } + + // cleanup any stale shared memory files + cleanup_sharedmem_resources(dirname); +@@ -722,7 +940,7 @@ + assert(((size > 0) && (size % os::vm_page_size() == 0)), + "unexpected PerfMemory region size"); + +- fd = create_sharedmem_resources(dirname, filename, size); ++ fd = create_sharedmem_resources(dirname, short_filename, size); + + FREE_C_HEAP_ARRAY(char, user_name, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); +@@ -839,12 +1057,12 @@ + // constructs for the file and the shared memory mapping. + if (mode == PerfMemory::PERF_MODE_RO) { + mmap_prot = PROT_READ; +- file_flags = O_RDONLY; ++ file_flags = O_RDONLY | O_NOFOLLOW; + } + else if (mode == PerfMemory::PERF_MODE_RW) { + #ifdef LATER + mmap_prot = PROT_READ | PROT_WRITE; +- file_flags = O_RDWR; ++ file_flags = O_RDWR | O_NOFOLLOW; + #else + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + "Unsupported access mode"); +--- ./hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -199,7 +199,38 @@ + } + + +-// check if the given path is considered a secure directory for ++// Check if the given statbuf is considered a secure directory for ++// the backing store files. Returns true if the directory is considered ++// a secure location. Returns false if the statbuf is a symbolic link or ++// if an error occurred. ++// ++static bool is_statbuf_secure(struct stat *statp) { ++ if (S_ISLNK(statp->st_mode) || !S_ISDIR(statp->st_mode)) { ++ // The path represents a link or some non-directory file type, ++ // which is not what we expected. Declare it insecure. ++ // ++ return false; ++ } ++ // We have an existing directory, check if the permissions are safe. ++ // ++ if ((statp->st_mode & (S_IWGRP|S_IWOTH)) != 0) { ++ // The directory is open for writing and could be subjected ++ // to a symlink or a hard link attack. Declare it insecure. ++ // ++ return false; ++ } ++ // See if the uid of the directory matches the effective uid of the process. ++ // ++ if (statp->st_uid != geteuid()) { ++ // The directory was not created by this user, declare it insecure. ++ // ++ return false; ++ } ++ return true; ++} ++ ++ ++// Check if the given path is considered a secure directory for + // the backing store files. Returns true if the directory exists + // and is considered a secure location. Returns false if the path + // is a symbolic link or if an error occurred. +@@ -213,27 +244,185 @@ + return false; + } + +- // the path exists, now check it's mode +- if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) { +- // the path represents a link or some non-directory file type, +- // which is not what we expected. declare it insecure. +- // ++ // The path exists, see if it is secure. ++ return is_statbuf_secure(&statbuf); ++} ++ ++ ++// Check if the given directory file descriptor is considered a secure ++// directory for the backing store files. Returns true if the directory ++// exists and is considered a secure location. Returns false if the path ++// is a symbolic link or if an error occurred. ++// ++static bool is_dirfd_secure(int dir_fd) { ++ struct stat statbuf; ++ int result = 0; ++ ++ RESTARTABLE(::fstat(dir_fd, &statbuf), result); ++ if (result == OS_ERR) { + return false; + } +- else { +- // we have an existing directory, check if the permissions are safe. +- // +- if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) { +- // the directory is open for writing and could be subjected +- // to a symlnk attack. declare it insecure. +- // +- return false; ++ ++ // The path exists, now check its mode. ++ return is_statbuf_secure(&statbuf); ++} ++ ++ ++// Check to make sure fd1 and fd2 are referencing the same file system object. ++// ++static bool is_same_fsobject(int fd1, int fd2) { ++ struct stat statbuf1; ++ struct stat statbuf2; ++ int result = 0; ++ ++ RESTARTABLE(::fstat(fd1, &statbuf1), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ RESTARTABLE(::fstat(fd2, &statbuf2), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ ++ if ((statbuf1.st_ino == statbuf2.st_ino) && ++ (statbuf1.st_dev == statbuf2.st_dev)) { ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++ ++// Open the directory of the given path and validate it. ++// Return a DIR * of the open directory. ++// ++static DIR *open_directory_secure(const char* dirname) { ++ // Open the directory using open() so that it can be verified ++ // to be secure by calling is_dirfd_secure(), opendir() and then check ++ // to see if they are the same file system object. This method does not ++ // introduce a window of opportunity for the directory to be attacked that ++ // calling opendir() and is_directory_secure() does. ++ int result; ++ DIR *dirp = NULL; ++ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result); ++ if (result == OS_ERR) { ++ // Directory doesn't exist or is a symlink, so there is nothing to cleanup. ++ if (PrintMiscellaneous && Verbose) { ++ if (errno == ELOOP) { ++ warning("directory %s is a symlink and is not secure\n", dirname); ++ } else { ++ warning("could not open directory %s: %s\n", dirname, strerror(errno)); ++ } + } ++ return dirp; ++ } ++ int fd = result; ++ ++ // Determine if the open directory is secure. ++ if (!is_dirfd_secure(fd)) { ++ // The directory is not a secure directory. ++ os::close(fd); ++ return dirp; ++ } ++ ++ // Open the directory. ++ dirp = ::opendir(dirname); ++ if (dirp == NULL) { ++ // The directory doesn't exist, close fd and return. ++ os::close(fd); ++ return dirp; ++ } ++ ++ // Check to make sure fd and dirp are referencing the same file system object. ++ if (!is_same_fsobject(fd, dirp->dd_fd)) { ++ // The directory is not secure. ++ os::close(fd); ++ os::closedir(dirp); ++ dirp = NULL; ++ return dirp; ++ } ++ ++ // Close initial open now that we know directory is secure ++ os::close(fd); ++ ++ return dirp; ++} ++ ++// NOTE: The code below uses fchdir(), open() and unlink() because ++// fdopendir(), openat() and unlinkat() are not supported on all ++// versions. Once the support for fdopendir(), openat() and unlinkat() ++// is available on all supported versions the code can be changed ++// to use these functions. ++ ++// Open the directory of the given path, validate it and set the ++// current working directory to it. ++// Return a DIR * of the open directory and the saved cwd fd. ++// ++static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) { ++ ++ // Open the directory. ++ DIR* dirp = open_directory_secure(dirname); ++ if (dirp == NULL) { ++ // Directory doesn't exist or is insecure, so there is nothing to cleanup. ++ return dirp; ++ } ++ int fd = dirp->dd_fd; ++ ++ // Open a fd to the cwd and save it off. ++ int result; ++ RESTARTABLE(::open(".", O_RDONLY), result); ++ if (result == OS_ERR) { ++ *saved_cwd_fd = -1; ++ } else { ++ *saved_cwd_fd = result; ++ } ++ ++ // Set the current directory to dirname by using the fd of the directory. ++ result = fchdir(fd); ++ ++ return dirp; ++} ++ ++// Close the directory and restore the current working directory. ++// ++static void close_directory_secure_cwd(DIR* dirp, int saved_cwd_fd) { ++ ++ int result; ++ // If we have a saved cwd change back to it and close the fd. ++ if (saved_cwd_fd != -1) { ++ result = fchdir(saved_cwd_fd); ++ ::close(saved_cwd_fd); ++ } ++ ++ // Close the directory. ++ os::closedir(dirp); ++} ++ ++// Check if the given file descriptor is considered a secure. ++// ++static bool is_file_secure(int fd, const char *filename) { ++ ++ int result; ++ struct stat statbuf; ++ ++ // Determine if the file is secure. ++ RESTARTABLE(::fstat(fd, &statbuf), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("fstat failed on %s: %s\n", filename, strerror(errno)); ++ } ++ return false; ++ } ++ if (statbuf.st_nlink > 1) { ++ // A file with multiple links is not expected. ++ if (PrintMiscellaneous && Verbose) { ++ warning("file %s has multiple links\n", filename); ++ } ++ return false; + } + return true; + } + +- + // return the user name for the given user id + // + // the caller is expected to free the allocated memory. +@@ -308,9 +497,11 @@ + + const char* tmpdirname = os::get_temp_directory(); + ++ // open the temp directory + DIR* tmpdirp = os::opendir(tmpdirname); + + if (tmpdirp == NULL) { ++ // Cannot open the directory to get the user name, return. + return NULL; + } + +@@ -335,7 +526,8 @@ + strcat(usrdir_name, "/"); + strcat(usrdir_name, dentry->d_name); + +- DIR* subdirp = os::opendir(usrdir_name); ++ // open the user directory ++ DIR* subdirp = open_directory_secure(usrdir_name); + + if (subdirp == NULL) { + FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); +@@ -502,26 +694,6 @@ + } + + +-// remove file +-// +-// this method removes the file with the given file name in the +-// named directory. +-// +-static void remove_file(const char* dirname, const char* filename) { +- +- size_t nbytes = strlen(dirname) + strlen(filename) + 2; +- char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); +- +- strcpy(path, dirname); +- strcat(path, "/"); +- strcat(path, filename); +- +- remove_file(path); +- +- FREE_C_HEAP_ARRAY(char, path, mtInternal); +-} +- +- + // cleanup stale shared memory resources + // + // This method attempts to remove all stale shared memory files in +@@ -533,16 +705,11 @@ + // + static void cleanup_sharedmem_resources(const char* dirname) { + +- // open the user temp directory +- DIR* dirp = os::opendir(dirname); +- ++ int saved_cwd_fd; ++ // open the directory ++ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); + if (dirp == NULL) { +- // directory doesn't exist, so there is nothing to cleanup +- return; +- } +- +- if (!is_directory_secure(dirname)) { +- // the directory is not a secure directory ++ // directory doesn't exist or is insecure, so there is nothing to cleanup + return; + } + +@@ -556,6 +723,7 @@ + // + struct dirent* entry; + char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); ++ + errno = 0; + while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { + +@@ -566,7 +734,7 @@ + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { + + // attempt to remove all unexpected files, except "." and ".." +- remove_file(dirname, entry->d_name); ++ unlink(entry->d_name); + } + + errno = 0; +@@ -589,11 +757,14 @@ + if ((pid == os::current_process_id()) || + (kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) { + +- remove_file(dirname, entry->d_name); ++ unlink(entry->d_name); + } + errno = 0; + } +- os::closedir(dirp); ++ ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); ++ + FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); + } + +@@ -650,19 +821,54 @@ + return -1; + } + ++ int saved_cwd_fd; ++ // open the directory and set the current working directory to it ++ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); ++ if (dirp == NULL) { ++ // Directory doesn't exist or is insecure, so cannot create shared ++ // memory file. ++ return -1; ++ } ++ ++ // Open the filename in the current directory. ++ // Cannot use O_TRUNC here; truncation of an existing file has to happen ++ // after the is_file_secure() check below. + int result; +- +- RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result); ++ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result); + if (result == OS_ERR) { + if (PrintMiscellaneous && Verbose) { +- warning("could not create file %s: %s\n", filename, strerror(errno)); ++ if (errno == ELOOP) { ++ warning("file %s is a symlink and is not secure\n", filename); ++ } else { ++ warning("could not create file %s: %s\n", filename, strerror(errno)); ++ } + } ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); ++ + return -1; + } ++ // close the directory and reset the current working directory ++ close_directory_secure_cwd(dirp, saved_cwd_fd); + + // save the file descriptor + int fd = result; + ++ // check to see if the file is secure ++ if (!is_file_secure(fd, filename)) { ++ ::close(fd); ++ return -1; ++ } ++ ++ // truncate the file to get rid of any existing data ++ RESTARTABLE(::ftruncate(fd, (off_t)0), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("could not truncate shared memory file: %s\n", strerror(errno)); ++ } ++ ::close(fd); ++ return -1; ++ } + // set the file size + RESTARTABLE(::ftruncate(fd, (off_t)size), result); + if (result == OS_ERR) { +@@ -698,8 +904,15 @@ + THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + } + } ++ int fd = result; + +- return result; ++ // check to see if the file is secure ++ if (!is_file_secure(fd, filename)) { ++ ::close(fd); ++ return -1; ++ } ++ ++ return fd; + } + + // create a named shared memory region. returns the address of the +@@ -731,13 +944,21 @@ + char* dirname = get_user_tmp_dir(user_name); + char* filename = get_sharedmem_filename(dirname, vmid); + ++ // get the short filename ++ char* short_filename = strrchr(filename, '/'); ++ if (short_filename == NULL) { ++ short_filename = filename; ++ } else { ++ short_filename++; ++ } ++ + // cleanup any stale shared memory files + cleanup_sharedmem_resources(dirname); + + assert(((size > 0) && (size % os::vm_page_size() == 0)), + "unexpected PerfMemory region size"); + +- fd = create_sharedmem_resources(dirname, filename, size); ++ fd = create_sharedmem_resources(dirname, short_filename, size); + + FREE_C_HEAP_ARRAY(char, user_name, mtInternal); + FREE_C_HEAP_ARRAY(char, dirname, mtInternal); +@@ -854,12 +1075,12 @@ + // constructs for the file and the shared memory mapping. + if (mode == PerfMemory::PERF_MODE_RO) { + mmap_prot = PROT_READ; +- file_flags = O_RDONLY; ++ file_flags = O_RDONLY | O_NOFOLLOW; + } + else if (mode == PerfMemory::PERF_MODE_RW) { + #ifdef LATER + mmap_prot = PROT_READ | PROT_WRITE; +- file_flags = O_RDWR; ++ file_flags = O_RDWR | O_NOFOLLOW; + #else + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + "Unsupported access mode"); +--- ./hotspot/src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -28,7 +28,7 @@ + #include "runtime/os.hpp" + #include "runtime/threadLocalStorage.hpp" + +-#include <asm-sparc/traps.h> ++#include <asm/traps.h> + + void MacroAssembler::read_ccr_trap(Register ccr_save) { + // No implementation +--- ./hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -79,12 +79,12 @@ + __asm__ volatile( + "1: \n\t" + " ldx [%2], %%o2\n\t" +- " add %0, %%o2, %%o3\n\t" ++ " add %1, %%o2, %%o3\n\t" + " casx [%2], %%o2, %%o3\n\t" + " cmp %%o2, %%o3\n\t" + " bne %%xcc, 1b\n\t" + " nop\n\t" +- " add %0, %%o2, %0\n\t" ++ " add %1, %%o2, %0\n\t" + : "=r" (rv) + : "r" (add_value), "r" (dest) + : "memory", "o2", "o3"); +--- ./hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -118,7 +118,7 @@ + *ret_sp = os::Linux::ucontext_get_sp(uc); + } + if (ret_fp) { +- *ret_fp = os::Linux::ucontext_get_fp(uc); ++ *ret_fp = (intptr_t*)NULL; + } + } else { + // construct empty ExtendedPC for return value checking +@@ -136,18 +136,15 @@ + + frame os::fetch_frame_from_context(void* ucVoid) { + intptr_t* sp; +- intptr_t* fp; +- ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp); +- return frame(sp, fp, epc.pc()); ++ ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, NULL); ++ return frame(sp, frame::unpatchable, epc.pc()); + } + + frame os::get_sender_for_C_frame(frame* fr) { +- return frame(fr->sender_sp(), fr->link(), fr->sender_pc()); ++ return frame(fr->sender_sp(), frame::unpatchable, fr->sender_pc()); + } + + frame os::current_frame() { +- fprintf(stderr, "current_frame()"); +- + intptr_t* sp = StubRoutines::Sparc::flush_callers_register_windows_func()(); + frame myframe(sp, frame::unpatchable, + CAST_FROM_FN_PTR(address, os::current_frame)); +@@ -302,29 +299,30 @@ + if (context == NULL) return; + + ucontext_t *uc = (ucontext_t*)context; ++ sigcontext* sc = (sigcontext*)context; + intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); + + st->print_cr("Register to memory mapping:"); + st->cr(); + + // this is only for the "general purpose" registers +- st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON__G1]); +- st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON__G2]); +- st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON__G3]); +- st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON__G4]); +- st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON__G5]); +- st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON__G6]); +- st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON__G7]); ++ st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON_G1]); ++ st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON_G2]); ++ st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON_G3]); ++ st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON_G4]); ++ st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON_G5]); ++ st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON_G6]); ++ st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON_G7]); + st->cr(); + +- st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON__O0]); +- st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON__O1]); +- st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON__O2]); +- st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON__O3]); +- st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON__O4]); +- st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON__O5]); +- st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON__O6]); +- st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON__O7]); ++ st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON_O0]); ++ st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON_O1]); ++ st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON_O2]); ++ st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON_O3]); ++ st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON_O4]); ++ st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON_O5]); ++ st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON_O6]); ++ st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON_O7]); + st->cr(); + + st->print("L0="); print_location(st, sp[L0->sp_offset_in_saved_window()]); +@@ -525,7 +523,7 @@ + if (nativeInstruction_at(*pc)->is_ic_miss_trap()) { + #ifdef ASSERT + #ifdef TIERED +- CodeBlob* cb = CodeCache::find_blob_unsafe(pc); ++ CodeBlob* cb = CodeCache::find_blob_unsafe(*pc); + assert(cb->is_compiled_by_c2(), "Wrong compiler"); + #endif // TIERED + #endif // ASSERT +--- ./hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -55,7 +55,7 @@ + + if (detect_niagara()) { + NOT_PRODUCT(if (PrintMiscellaneous && Verbose) tty->print_cr("Detected Linux on Niagara");) +- features = niagara1_m; ++ features = niagara1_m | T_family_m; + } + + return features; +--- ./hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -899,7 +899,7 @@ + */ + char* hint = (char*) (Linux::initial_thread_stack_bottom() - + ((StackYellowPages + StackRedPages + 1) * page_size)); +- char* codebuf = os::reserve_memory(page_size, hint); ++ char* codebuf = os::pd_attempt_reserve_memory_at(page_size, hint); + if ( (codebuf == NULL) || (!os::commit_memory(codebuf, page_size, true)) ) { + return; // No matter, we tried, best effort. + } +--- ./hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -75,13 +75,19 @@ + do_sysinfo(SI_ARCHITECTURE_64, "sparcv9", &features, generic_v9_m); + + // Extract valid instruction set extensions. +- uint_t av; +- uint_t avn = os::Solaris::getisax(&av, 1); +- assert(avn == 1, "should only return one av"); ++ uint_t avs[2]; ++ uint_t avn = os::Solaris::getisax(avs, 2); ++ assert(avn <= 2, "should return two or less av's"); ++ uint_t av = avs[0]; + + #ifndef PRODUCT +- if (PrintMiscellaneous && Verbose) +- tty->print_cr("getisax(2) returned: " PTR32_FORMAT, av); ++ if (PrintMiscellaneous && Verbose) { ++ tty->print("getisax(2) returned: " PTR32_FORMAT, av); ++ if (avn > 1) { ++ tty->print(", " PTR32_FORMAT, avs[1]); ++ } ++ tty->cr(); ++ } + #endif + + if (av & AV_SPARC_MUL32) features |= hardware_mul32_m; +@@ -91,6 +97,13 @@ + if (av & AV_SPARC_POPC) features |= hardware_popc_m; + if (av & AV_SPARC_VIS) features |= vis1_instructions_m; + if (av & AV_SPARC_VIS2) features |= vis2_instructions_m; ++ if (avn > 1) { ++ uint_t av2 = avs[1]; ++#ifndef AV2_SPARC_SPARC5 ++#define AV2_SPARC_SPARC5 0x00000008 /* The 29 new fp and sub instructions */ ++#endif ++ if (av2 & AV2_SPARC_SPARC5) features |= sparc5_instructions_m; ++ } + + // Next values are not defined before Solaris 10 + // but Solaris 8 is used for jdk6 update builds. +--- ./hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -89,8 +89,8 @@ + public: + ArgumentMap *_vars; + ArgumentMap *_stack; +- short _stack_height; +- short _max_stack; ++ int _stack_height; ++ int _max_stack; + bool _initialized; + ArgumentMap empty_map; + +@@ -158,6 +158,9 @@ + + void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) { + clear_bits(vars, _arg_local); ++ if (vars.contains_allocated()) { ++ _allocated_escapes = true; ++ } + } + + void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars, bool merge) { +--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -2676,7 +2676,7 @@ + ClassFileStream* cfs = stream(); + u1* current_start = cfs->current(); + +- guarantee_property(attribute_byte_length > sizeof(u2), ++ guarantee_property(attribute_byte_length >= sizeof(u2), + "Invalid BootstrapMethods attribute length %u in class file %s", + attribute_byte_length, + CHECK); +--- ./hotspot/src/share/vm/classfile/stackMapFrame.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapFrame.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -54,15 +54,19 @@ + return frame; + } + +-bool StackMapFrame::has_new_object() const { ++// Return true if frame has an uninitialized (new) object that differs ++// from the target frame's object. ++bool StackMapFrame::has_nonmatching_new_object(const StackMapFrame *target_frame) const { + int32_t i; + for (i = 0; i < _max_locals; i++) { +- if (_locals[i].is_uninitialized()) { ++ if (_locals[i].is_uninitialized() && ++ !_locals[i].equals(target_frame->_locals[i])) { + return true; + } + } + for (i = 0; i < _stack_size; i++) { +- if (_stack[i].is_uninitialized()) { ++ if (_stack[i].is_uninitialized() && ++ !_stack[i].equals(target_frame->_stack[i])) { + return true; + } + } +--- ./hotspot/src/share/vm/classfile/stackMapFrame.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapFrame.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -155,8 +155,9 @@ + const methodHandle m, VerificationType thisKlass, TRAPS); + + // Search local variable type array and stack type array. +- // Return true if an uninitialized object is found. +- bool has_new_object() const; ++ // Return true if an uninitialized object is found that is ++ // not equal to the corresponding object on the target frame. ++ bool has_nonmatching_new_object(const StackMapFrame *target_frame) const; + + // Search local variable type array and stack type array. + // Set every element with type of old_object to new_object. +--- ./hotspot/src/share/vm/classfile/stackMapTable.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapTable.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -70,24 +70,26 @@ + + bool StackMapTable::match_stackmap( + StackMapFrame* frame, int32_t target, +- bool match, bool update, ErrorContext* ctx, TRAPS) const { ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const { + int index = get_index_from_offset(target); +- return match_stackmap(frame, target, index, match, update, ctx, THREAD); ++ return match_stackmap(frame, target, index, match, update, handler, ctx, THREAD); + } + + // Match and/or update current_frame to the frame in stackmap table with + // specified offset and frame index. Return true if the two frames match. ++// handler is true if the frame in stackmap_table is for an exception handler. + // +-// The values of match and update are: _match__update_ ++// The values of match and update are: _match__update__handler + // +-// checking a branch target/exception handler: true false ++// checking a branch target: true false false ++// checking an exception handler: true false true + // linear bytecode verification following an +-// unconditional branch: false true ++// unconditional branch: false true false + // linear bytecode verification not following an +-// unconditional branch: true true ++// unconditional branch: true true false + bool StackMapTable::match_stackmap( + StackMapFrame* frame, int32_t target, int32_t frame_index, +- bool match, bool update, ErrorContext* ctx, TRAPS) const { ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const { + if (frame_index < 0 || frame_index >= _frame_count) { + *ctx = ErrorContext::missing_stackmap(frame->offset()); + frame->verifier()->verify_error( +@@ -98,11 +100,9 @@ + StackMapFrame *stackmap_frame = _frame_array[frame_index]; + bool result = true; + if (match) { +- // when checking handler target, match == true && update == false +- bool is_exception_handler = !update; + // Has direct control flow from last instruction, need to match the two + // frames. +- result = frame->is_assignable_to(stackmap_frame, is_exception_handler, ++ result = frame->is_assignable_to(stackmap_frame, handler, + ctx, CHECK_VERIFY_(frame->verifier(), result)); + } + if (update) { +@@ -126,7 +126,7 @@ + StackMapFrame* frame, int32_t target, TRAPS) const { + ErrorContext ctx; + bool match = match_stackmap( +- frame, target, true, false, &ctx, CHECK_VERIFY(frame->verifier())); ++ frame, target, true, false, false, &ctx, CHECK_VERIFY(frame->verifier())); + if (!match || (target < 0 || target >= _code_length)) { + frame->verifier()->verify_error(ctx, + "Inconsistent stackmap frames at branch target %d", target); +@@ -134,12 +134,14 @@ + } + // check if uninitialized objects exist on backward branches + check_new_object(frame, target, CHECK_VERIFY(frame->verifier())); +- frame->verifier()->update_furthest_jump(target); + } + + void StackMapTable::check_new_object( + const StackMapFrame* frame, int32_t target, TRAPS) const { +- if (frame->offset() > target && frame->has_new_object()) { ++ int frame_index = get_index_from_offset(target); ++ assert(frame_index >= 0 && frame_index < _frame_count, "bad frame index"); ++ if (frame->offset() > target && ++ frame->has_nonmatching_new_object(_frame_array[frame_index])) { + frame->verifier()->verify_error( + ErrorContext::bad_code(frame->offset()), + "Uninitialized object exists on backward branch %d", target); +--- ./hotspot/src/share/vm/classfile/stackMapTable.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapTable.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -74,12 +74,12 @@ + // specified offset. Return true if the two frames match. + bool match_stackmap( + StackMapFrame* current_frame, int32_t offset, +- bool match, bool update, ErrorContext* ctx, TRAPS) const; ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const; + // Match and/or update current_frame to the frame in stackmap table with + // specified offset and frame index. Return true if the two frames match. + bool match_stackmap( + StackMapFrame* current_frame, int32_t offset, int32_t frame_index, +- bool match, bool update, ErrorContext* ctx, TRAPS) const; ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const; + + // Check jump instructions. Make sure there are no uninitialized + // instances on backward branch. +--- ./hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1872,11 +1872,12 @@ + instanceKlass::cast(WK_KLASS(Reference_klass))->set_reference_type(REF_OTHER); + instanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass)); + +- initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK); ++ initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Cleaner_klass), scan, CHECK); + instanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT); + instanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK); + instanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL); + instanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM); ++ instanceKlass::cast(WK_KLASS(Cleaner_klass))->set_reference_type(REF_CLEANER); + + // JSR 292 classes + WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass); +--- ./hotspot/src/share/vm/classfile/systemDictionary.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/systemDictionary.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -126,6 +126,7 @@ + do_klass(WeakReference_klass, java_lang_ref_WeakReference, Pre ) \ + do_klass(FinalReference_klass, java_lang_ref_FinalReference, Pre ) \ + do_klass(PhantomReference_klass, java_lang_ref_PhantomReference, Pre ) \ ++ do_klass(Cleaner_klass, sun_misc_Cleaner, Pre ) \ + do_klass(Finalizer_klass, java_lang_ref_Finalizer, Pre ) \ + \ + do_klass(Thread_klass, java_lang_Thread, Pre ) \ +--- ./hotspot/src/share/vm/classfile/verifier.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -630,8 +630,6 @@ + // flow from current instruction to the next + // instruction in sequence + +- set_furthest_jump(0); +- + Bytecodes::Code opcode; + while (!bcs.is_last_bytecode()) { + // Check for recursive re-verification before each bytecode. +@@ -1551,14 +1549,14 @@ + case Bytecodes::_invokespecial : + case Bytecodes::_invokestatic : + verify_invoke_instructions( +- &bcs, code_length, ¤t_frame, +- &this_uninit, return_type, cp, CHECK_VERIFY(this)); ++ &bcs, code_length, ¤t_frame, (bci >= ex_min && bci < ex_max), ++ &this_uninit, return_type, cp, &stackmap_table, CHECK_VERIFY(this)); + no_control_flow = false; break; + case Bytecodes::_invokeinterface : + case Bytecodes::_invokedynamic : + verify_invoke_instructions( +- &bcs, code_length, ¤t_frame, +- &this_uninit, return_type, cp, CHECK_VERIFY(this)); ++ &bcs, code_length, ¤t_frame, (bci >= ex_min && bci < ex_max), ++ &this_uninit, return_type, cp, &stackmap_table, CHECK_VERIFY(this)); + no_control_flow = false; break; + case Bytecodes::_new : + { +@@ -1788,7 +1786,7 @@ + // If matched, current_frame will be updated by this method. + bool matches = stackmap_table->match_stackmap( + current_frame, this_offset, stackmap_index, +- !no_control_flow, true, &ctx, CHECK_VERIFY_(this, 0)); ++ !no_control_flow, true, false, &ctx, CHECK_VERIFY_(this, 0)); + if (!matches) { + // report type error + verify_error(ctx, "Instruction type does not match stack map"); +@@ -1835,7 +1833,7 @@ + } + ErrorContext ctx; + bool matches = stackmap_table->match_stackmap( +- new_frame, handler_pc, true, false, &ctx, CHECK_VERIFY(this)); ++ new_frame, handler_pc, true, false, true, &ctx, CHECK_VERIFY(this)); + if (!matches) { + verify_error(ctx, "Stack map does not match the one at " + "exception handler %d", handler_pc); +@@ -2401,8 +2399,9 @@ + + void ClassVerifier::verify_invoke_init( + RawBytecodeStream* bcs, u2 ref_class_index, VerificationType ref_class_type, +- StackMapFrame* current_frame, u4 code_length, bool *this_uninit, +- constantPoolHandle cp, TRAPS) { ++ StackMapFrame* current_frame, u4 code_length, bool in_try_block, ++ bool *this_uninit, constantPoolHandle cp, StackMapTable* stackmap_table, ++ TRAPS) { + u2 bci = bcs->bci(); + VerificationType type = current_frame->pop_stack( + VerificationType::reference_check(), CHECK_VERIFY(this)); +@@ -2418,35 +2417,38 @@ + return; + } + +- // Make sure that this call is not jumped over. +- if (bci < furthest_jump()) { +- verify_error(ErrorContext::bad_code(bci), +- "Bad <init> method call from inside of a branch"); +- return; +- } ++ // If this invokespecial call is done from inside of a TRY block then make ++ // sure that all catch clause paths end in a throw. Otherwise, this can ++ // result in returning an incomplete object. ++ if (in_try_block) { ++ ExceptionTable exhandlers(_method()); ++ int exlength = exhandlers.length(); ++ for(int i = 0; i < exlength; i++) { ++ // Reacquire the table in case a GC happened ++ ExceptionTable exhandlers(_method()); ++ u2 start_pc = exhandlers.start_pc(i); ++ u2 end_pc = exhandlers.end_pc(i); + +- // Check if this call is done from inside of a TRY block. If so, make +- // sure that all catch clause paths end in a throw. Otherwise, this +- // can result in returning an incomplete object. +- ExceptionTable exhandlers(_method()); +- int exlength = exhandlers.length(); +- for(int i = 0; i < exlength; i++) { +- u2 start_pc = exhandlers.start_pc(i); +- u2 end_pc = exhandlers.end_pc(i); +- +- if (bci >= start_pc && bci < end_pc) { +- if (!ends_in_athrow(exhandlers.handler_pc(i))) { +- verify_error(ErrorContext::bad_code(bci), +- "Bad <init> method call from after the start of a try block"); +- return; +- } else if (VerboseVerification) { +- ResourceMark rm; +- tty->print_cr( +- "Survived call to ends_in_athrow(): %s", +- current_class()->name()->as_C_string()); ++ if (bci >= start_pc && bci < end_pc) { ++ if (!ends_in_athrow(exhandlers.handler_pc(i))) { ++ verify_error(ErrorContext::bad_code(bci), ++ "Bad <init> method call from after the start of a try block"); ++ return; ++ } else if (VerboseVerification) { ++ ResourceMark rm; ++ tty->print_cr( ++ "Survived call to ends_in_athrow(): %s", ++ current_class()->name()->as_C_string()); ++ } + } + } +- } ++ ++ // Check the exception handler target stackmaps with the locals from the ++ // incoming stackmap (before initialize_object() changes them to outgoing ++ // state). ++ verify_exception_handler_targets(bci, true, current_frame, ++ stackmap_table, CHECK_VERIFY(this)); ++ } // in_try_block + + current_frame->initialize_object(type, current_type()); + *this_uninit = true; +@@ -2502,6 +2504,13 @@ + } + } + } ++ // Check the exception handler target stackmaps with the locals from the ++ // incoming stackmap (before initialize_object() changes them to outgoing ++ // state). ++ if (in_try_block) { ++ verify_exception_handler_targets(bci, *this_uninit, current_frame, ++ stackmap_table, CHECK_VERIFY(this)); ++ } + current_frame->initialize_object(type, new_class_type); + } else { + verify_error(ErrorContext::bad_type(bci, current_frame->stack_top_ctx()), +@@ -2512,8 +2521,8 @@ + + void ClassVerifier::verify_invoke_instructions( + RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame, +- bool *this_uninit, VerificationType return_type, +- constantPoolHandle cp, TRAPS) { ++ bool in_try_block, bool *this_uninit, VerificationType return_type, ++ constantPoolHandle cp, StackMapTable* stackmap_table, TRAPS) { + // Make sure the constant pool item is the right type + u2 index = bcs->get_index_u2(); + Bytecodes::Code opcode = bcs->raw_code(); +@@ -2649,7 +2658,8 @@ + opcode != Bytecodes::_invokedynamic) { + if (method_name == vmSymbols::object_initializer_name()) { // <init> method + verify_invoke_init(bcs, index, ref_class_type, current_frame, +- code_length, this_uninit, cp, CHECK_VERIFY(this)); ++ code_length, in_try_block, this_uninit, cp, stackmap_table, ++ CHECK_VERIFY(this)); + } else { // other methods + // Ensures that target class is assignable to method class. + if (opcode == Bytecodes::_invokespecial) { +--- ./hotspot/src/share/vm/classfile/verifier.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -257,9 +257,6 @@ + + ErrorContext _error_context; // contains information about an error + +- // Used to detect illegal jumps over calls to super() and this() in ctors. +- int32_t _furthest_jump; +- + void verify_method(methodHandle method, TRAPS); + char* generate_code_data(methodHandle m, u4 code_length, TRAPS); + void verify_exception_handler_table(u4 code_length, char* code_data, +@@ -302,8 +299,9 @@ + + void verify_invoke_init( + RawBytecodeStream* bcs, u2 ref_index, VerificationType ref_class_type, +- StackMapFrame* current_frame, u4 code_length, bool* this_uninit, +- constantPoolHandle cp, TRAPS); ++ StackMapFrame* current_frame, u4 code_length, bool in_try_block, ++ bool* this_uninit, constantPoolHandle cp, StackMapTable* stackmap_table, ++ TRAPS); + + // Used by ends_in_athrow() to push all handlers that contain bci onto + // the handler_stack, if the handler is not already on the stack. +@@ -317,8 +315,8 @@ + + void verify_invoke_instructions( + RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame, +- bool* this_uninit, VerificationType return_type, +- constantPoolHandle cp, TRAPS); ++ bool in_try_block, bool* this_uninit, VerificationType return_type, ++ constantPoolHandle cp, StackMapTable* stackmap_table, TRAPS); + + VerificationType get_newarray_type(u2 index, u2 bci, TRAPS); + void verify_anewarray(u2 bci, u2 index, constantPoolHandle cp, +@@ -413,19 +411,6 @@ + + TypeOrigin ref_ctx(const char* str, TRAPS); + +- // Keep track of the furthest branch done in a method to make sure that +- // there are no branches over calls to super() or this() from inside of +- // a constructor. +- int32_t furthest_jump() { return _furthest_jump; } +- +- void set_furthest_jump(int32_t target) { +- _furthest_jump = target; +- } +- +- void update_furthest_jump(int32_t target) { +- if (target > _furthest_jump) _furthest_jump = target; +- } +- + }; + + inline int ClassVerifier::change_sig_to_verificationType( +--- ./hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -81,6 +81,7 @@ + template(java_lang_ref_WeakReference, "java/lang/ref/WeakReference") \ + template(java_lang_ref_FinalReference, "java/lang/ref/FinalReference") \ + template(java_lang_ref_PhantomReference, "java/lang/ref/PhantomReference") \ ++ template(sun_misc_Cleaner, "sun/misc/Cleaner") \ + template(java_lang_ref_Finalizer, "java/lang/ref/Finalizer") \ + template(java_lang_reflect_AccessibleObject, "java/lang/reflect/AccessibleObject") \ + template(java_lang_reflect_Method, "java/lang/reflect/Method") \ +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -2752,10 +2752,12 @@ + } + } + +-void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList<FreeChunk>* fl) { +- assert(fl->count() == 0, "Precondition."); +- assert(word_sz < CompactibleFreeListSpace::IndexSetSize, +- "Precondition"); ++// Used by par_get_chunk_of_blocks() for the chunks from the ++// indexed_free_lists. Looks for a chunk with size that is a multiple ++// of "word_sz" and if found, splits it into "word_sz" chunks and add ++// to the free list "fl". "n" is the maximum number of chunks to ++// be added to "fl". ++bool CompactibleFreeListSpace:: par_get_chunk_of_blocks_IFL(size_t word_sz, size_t n, FreeList<FreeChunk>* fl) { + + // We'll try all multiples of word_sz in the indexed set, starting with + // word_sz itself and, if CMSSplitIndexedFreeListBlocks, try larger multiples, +@@ -2836,11 +2838,15 @@ + Mutex::_no_safepoint_check_flag); + ssize_t births = _indexedFreeList[word_sz].split_births() + num; + _indexedFreeList[word_sz].set_split_births(births); +- return; ++ return true; + } + } ++ return found; + } +- // Otherwise, we'll split a block from the dictionary. ++} ++ ++FreeChunk* CompactibleFreeListSpace::get_n_way_chunk_to_split(size_t word_sz, size_t n) { ++ + FreeChunk* fc = NULL; + FreeChunk* rem_fc = NULL; + size_t rem; +@@ -2852,16 +2858,12 @@ + _dictionary->min_size()), + FreeBlockDictionary<FreeChunk>::atLeast); + if (fc != NULL) { +- _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk +- dictionary()->dict_census_udpate(fc->size(), +- true /*split*/, +- false /*birth*/); + break; + } else { + n--; + } + } +- if (fc == NULL) return; ++ if (fc == NULL) return NULL; + // Otherwise, split up that block. + assert((ssize_t)n >= 1, "Control point invariant"); + assert(fc->is_free(), "Error: should be a free block"); +@@ -2883,10 +2885,14 @@ + // dictionary and return, leaving "fl" empty. + if (n == 0) { + returnChunkToDictionary(fc); +- assert(fl->count() == 0, "We never allocated any blocks"); +- return; ++ return NULL; + } + ++ _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk ++ dictionary()->dict_census_udpate(fc->size(), ++ true /*split*/, ++ false /*birth*/); ++ + // First return the remainder, if any. + // Note that we hold the lock until we decide if we're going to give + // back the remainder to the dictionary, since a concurrent allocation +@@ -2919,7 +2925,24 @@ + _indexedFreeList[rem].return_chunk_at_head(rem_fc); + smallSplitBirth(rem); + } +- assert((ssize_t)n > 0 && fc != NULL, "Consistency"); ++ assert(n * word_sz == fc->size(), ++ err_msg("Chunk size " SIZE_FORMAT " is not exactly splittable by " ++ SIZE_FORMAT " sized chunks of size " SIZE_FORMAT, ++ fc->size(), n, word_sz)); ++ return fc; ++} ++ ++void CompactibleFreeListSpace:: par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t targetted_number_of_chunks, FreeList<FreeChunk>* fl) { ++ ++ FreeChunk* fc = get_n_way_chunk_to_split(word_sz, targetted_number_of_chunks); ++ ++ if (fc == NULL) { ++ return; ++ } ++ ++ size_t n = fc->size() / word_sz; ++ ++ assert((ssize_t)n > 0, "Consistency"); + // Now do the splitting up. + // Must do this in reverse order, so that anybody attempting to + // access the main chunk sees it as a single free block until we +@@ -2967,6 +2990,20 @@ + assert(fl->tail()->next() == NULL, "List invariant."); + } + ++void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList<FreeChunk>* fl) { ++ assert(fl->count() == 0, "Precondition."); ++ assert(word_sz < CompactibleFreeListSpace::IndexSetSize, ++ "Precondition"); ++ ++ if (par_get_chunk_of_blocks_IFL(word_sz, n, fl)) { ++ // Got it ++ return; ++ } ++ ++ // Otherwise, we'll split a block from the dictionary. ++ par_get_chunk_of_blocks_dictionary(word_sz, n, fl); ++} ++ + // Set up the space's par_seq_tasks structure for work claiming + // for parallel rescan. See CMSParRemarkTask where this is currently used. + // XXX Need to suitably abstract and generalize this and the next +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -171,6 +171,20 @@ + // list of size "word_sz", and must now be decremented. + void par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList<FreeChunk>* fl); + ++ // Used by par_get_chunk_of_blocks() for the chunks from the ++ // indexed_free_lists. ++ bool par_get_chunk_of_blocks_IFL(size_t word_sz, size_t n, FreeList<FreeChunk>* fl); ++ ++ // Used by par_get_chunk_of_blocks_dictionary() to get a chunk ++ // evenly splittable into "n" "word_sz" chunks. Returns that ++ // evenly splittable chunk. May split a larger chunk to get the ++ // evenly splittable chunk. ++ FreeChunk* get_n_way_chunk_to_split(size_t word_sz, size_t n); ++ ++ // Used by par_get_chunk_of_blocks() for the chunks from the ++ // dictionary. ++ void par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t n, FreeList<FreeChunk>* fl); ++ + // Allocation helper functions + // Allocate using a strategy that takes from the indexed free lists + // first. This allocation strategy assumes a companion sweeping +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -757,7 +757,7 @@ + // Support for parallelizing survivor space rescan + if ((CMSParallelRemarkEnabled && CMSParallelSurvivorRemarkEnabled) || CMSParallelInitialMarkEnabled) { + const size_t max_plab_samples = +- ((DefNewGeneration*)_young_gen)->max_survivor_size()/MinTLABSize; ++ ((DefNewGeneration*)_young_gen)->max_survivor_size() / plab_sample_minimum_size(); + + _survivor_plab_array = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads, mtGC); + _survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, 2*max_plab_samples, mtGC); +@@ -824,6 +824,12 @@ + _inter_sweep_timer.start(); // start of time + } + ++size_t CMSCollector::plab_sample_minimum_size() { ++ // The default value of MinTLABSize is 2k, but there is ++ // no way to get the default value if the flag has been overridden. ++ return MAX2(ThreadLocalAllocBuffer::min_size() * HeapWordSize, 2 * K); ++} ++ + const char* ConcurrentMarkSweepGeneration::name() const { + return "concurrent mark-sweep generation"; + } +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -766,6 +766,10 @@ + size_t* _cursor; + ChunkArray* _survivor_plab_array; + ++ // A bounded minimum size of PLABs, should not return too small values since ++ // this will affect the size of the data structures used for parallel young gen rescan ++ size_t plab_sample_minimum_size(); ++ + // Support for marking stack overflow handling + bool take_from_overflow_list(size_t num, CMSMarkStack* to_stack); + bool par_take_from_overflow_list(size_t num, +--- ./hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -172,7 +172,7 @@ + + // Should be called when we want to release the active region which + // is returned after it's been retired. +- HeapRegion* release(); ++ virtual HeapRegion* release(); + + #if G1_ALLOC_REGION_TRACING + void trace(const char* str, size_t word_size = 0, HeapWord* result = NULL); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1519,7 +1519,7 @@ + } + + if (G1Log::finer()) { +- g1_policy()->print_detailed_heap_transition(); ++ g1_policy()->print_detailed_heap_transition(true /* full */); + } + + print_heap_after_gc(); +@@ -6628,6 +6628,35 @@ + _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes, + GCAllocForTenured); + } ++ ++HeapRegion* OldGCAllocRegion::release() { ++ HeapRegion* cur = get(); ++ if (cur != NULL) { ++ // Determine how far we are from the next card boundary. If it is smaller than ++ // the minimum object size we can allocate into, expand into the next card. ++ HeapWord* top = cur->top(); ++ HeapWord* aligned_top = (HeapWord*)align_ptr_up(top, G1BlockOffsetSharedArray::N_bytes); ++ ++ size_t to_allocate_words = pointer_delta(aligned_top, top, HeapWordSize); ++ ++ if (to_allocate_words != 0) { ++ // We are not at a card boundary. Fill up, possibly into the next, taking the ++ // end of the region and the minimum object size into account. ++ to_allocate_words = MIN2(pointer_delta(cur->end(), cur->top(), HeapWordSize), ++ MAX2(to_allocate_words, G1CollectedHeap::min_fill_size())); ++ ++ // Skip allocation if there is not enough space to allocate even the smallest ++ // possible object. In this case this region will not be retained, so the ++ // original problem cannot occur. ++ if (to_allocate_words >= G1CollectedHeap::min_fill_size()) { ++ HeapWord* dummy = attempt_allocation(to_allocate_words, true /* bot_updates */); ++ CollectedHeap::fill_with_object(dummy, to_allocate_words); ++ } ++ } ++ } ++ return G1AllocRegion::release(); ++} ++ + // Heap region set verification + + class VerifyRegionListsClosure : public HeapRegionClosure { +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -183,6 +183,13 @@ + public: + OldGCAllocRegion() + : G1AllocRegion("Old GC Alloc Region", true /* bot_updates */) { } ++ ++ // This specialization of release() makes sure that the last card that has been ++ // allocated into has been completely filled by a dummy object. ++ // This avoids races when remembered set scanning wants to update the BOT of the ++ // last card in the retained old gc alloc region, and allocation threads ++ // allocating into that card at the same time. ++ virtual HeapRegion* release(); + }; + + // The G1 STW is alive closure. +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -124,9 +124,12 @@ + _last_young_gc(false), + _last_gc_was_young(false), + +- _eden_bytes_before_gc(0), +- _survivor_bytes_before_gc(0), +- _capacity_before_gc(0), ++ _eden_used_bytes_before_gc(0), ++ _survivor_used_bytes_before_gc(0), ++ _heap_used_bytes_before_gc(0), ++ _permgen_used_bytes_before_gc(0), ++ _eden_capacity_bytes_before_gc(0), ++ _heap_capacity_bytes_before_gc(0), + + _eden_cset_region_length(0), + _survivor_cset_region_length(0), +@@ -747,7 +750,7 @@ + + void G1CollectorPolicy::record_full_collection_start() { + _full_collection_start_sec = os::elapsedTime(); +- record_heap_size_info_at_start(); ++ record_heap_size_info_at_start(true /* full */); + // Release the future to-space so that it is available for compaction into. + _g1->set_full_collection(); + } +@@ -804,7 +807,7 @@ + _trace_gen0_time_data.record_start_collection(s_w_t_ms); + _stop_world_start = 0.0; + +- record_heap_size_info_at_start(); ++ record_heap_size_info_at_start(false /* full */); + + phase_times()->record_cur_collection_start_sec(start_time_sec); + _pending_cards = _g1->pending_card_num(); +@@ -939,14 +942,6 @@ + _mmu_tracker->add_pause(end_time_sec - pause_time_ms/1000.0, + end_time_sec, false); + +- size_t freed_bytes = +- _cur_collection_pause_used_at_start_bytes - cur_used_bytes; +- size_t surviving_bytes = _collection_set_bytes_used_before - freed_bytes; +- +- double survival_fraction = +- (double)surviving_bytes/ +- (double)_collection_set_bytes_used_before; +- + evacuation_info.set_collectionset_used_before(_collection_set_bytes_used_before); + evacuation_info.set_bytes_copied(_bytes_copied_during_gc); + +@@ -1002,6 +997,7 @@ + } + } + } ++ + bool new_in_marking_window = _in_marking_window; + bool new_in_marking_window_im = false; + if (during_initial_mark_pause()) { +@@ -1087,8 +1083,10 @@ + } + _rs_length_diff_seq->add((double) rs_length_diff); + +- size_t copied_bytes = surviving_bytes; ++ size_t freed_bytes = _heap_used_bytes_before_gc - cur_used_bytes; ++ size_t copied_bytes = _collection_set_bytes_used_before - freed_bytes; + double cost_per_byte_ms = 0.0; ++ + if (copied_bytes > 0) { + cost_per_byte_ms = phase_times()->average_last_obj_copy_time() / (double) copied_bytes; + if (_in_marking_window) { +@@ -1152,51 +1150,66 @@ + byte_size_in_proper_unit((double)(bytes)), \ + proper_unit_for_byte_size((bytes)) + +-void G1CollectorPolicy::record_heap_size_info_at_start() { ++void G1CollectorPolicy::record_heap_size_info_at_start(bool full) { + YoungList* young_list = _g1->young_list(); +- _eden_bytes_before_gc = young_list->eden_used_bytes(); +- _survivor_bytes_before_gc = young_list->survivor_used_bytes(); +- _capacity_before_gc = _g1->capacity(); +- +- _cur_collection_pause_used_at_start_bytes = _g1->used(); ++ _eden_used_bytes_before_gc = young_list->eden_used_bytes(); ++ _survivor_used_bytes_before_gc = young_list->survivor_used_bytes(); ++ _heap_capacity_bytes_before_gc = _g1->capacity(); ++ _heap_used_bytes_before_gc = _g1->used(); + _cur_collection_pause_used_regions_at_start = _g1->used_regions(); + +- size_t eden_capacity_before_gc = +- (_young_list_target_length * HeapRegion::GrainBytes) - _survivor_bytes_before_gc; ++ _eden_capacity_bytes_before_gc = ++ (_young_list_target_length * HeapRegion::GrainBytes) - _survivor_used_bytes_before_gc; + +- _prev_eden_capacity = eden_capacity_before_gc; ++ if (full) { ++ _permgen_used_bytes_before_gc = _g1->perm_gen()->used(); ++ } ++} ++void G1CollectorPolicy::print_perm_heap_change(size_t perm_prev_used) const { ++ gclog_or_tty->print(", [%s:", _g1->perm_gen()->short_name()); ++ _g1->perm_gen()->print_heap_change(perm_prev_used); ++ gclog_or_tty->print("]"); + } + + void G1CollectorPolicy::print_heap_transition() { + _g1->print_size_transition(gclog_or_tty, +- _cur_collection_pause_used_at_start_bytes, _g1->used(), _g1->capacity()); ++ _heap_used_bytes_before_gc, ++ _g1->used(), ++ _g1->capacity()); + } + +-void G1CollectorPolicy::print_detailed_heap_transition() { +- YoungList* young_list = _g1->young_list(); +- size_t eden_bytes = young_list->eden_used_bytes(); +- size_t survivor_bytes = young_list->survivor_used_bytes(); +- size_t used_before_gc = _cur_collection_pause_used_at_start_bytes; +- size_t used = _g1->used(); +- size_t capacity = _g1->capacity(); +- size_t eden_capacity = +- (_young_list_target_length * HeapRegion::GrainBytes) - survivor_bytes; ++void G1CollectorPolicy::print_detailed_heap_transition(bool full) { ++ YoungList* young_list = _g1->young_list(); + +- gclog_or_tty->print_cr( +- " [Eden: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT") " +- "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" " +- "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->" +- EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]", +- EXT_SIZE_PARAMS(_eden_bytes_before_gc), +- EXT_SIZE_PARAMS(_prev_eden_capacity), +- EXT_SIZE_PARAMS(eden_bytes), +- EXT_SIZE_PARAMS(eden_capacity), +- EXT_SIZE_PARAMS(_survivor_bytes_before_gc), +- EXT_SIZE_PARAMS(survivor_bytes), +- EXT_SIZE_PARAMS(used_before_gc), +- EXT_SIZE_PARAMS(_capacity_before_gc), +- EXT_SIZE_PARAMS(used), +- EXT_SIZE_PARAMS(capacity)); ++ size_t eden_used_bytes_after_gc = young_list->eden_used_bytes(); ++ size_t survivor_used_bytes_after_gc = young_list->survivor_used_bytes(); ++ size_t heap_used_bytes_after_gc = _g1->used(); ++ ++ size_t heap_capacity_bytes_after_gc = _g1->capacity(); ++ size_t eden_capacity_bytes_after_gc = ++ (_young_list_target_length * HeapRegion::GrainBytes) - survivor_used_bytes_after_gc; ++ ++ gclog_or_tty->print( ++ " [Eden: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT") " ++ "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" " ++ "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->" ++ EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]", ++ EXT_SIZE_PARAMS(_eden_used_bytes_before_gc), ++ EXT_SIZE_PARAMS(_eden_capacity_bytes_before_gc), ++ EXT_SIZE_PARAMS(eden_used_bytes_after_gc), ++ EXT_SIZE_PARAMS(eden_capacity_bytes_after_gc), ++ EXT_SIZE_PARAMS(_survivor_used_bytes_before_gc), ++ EXT_SIZE_PARAMS(survivor_used_bytes_after_gc), ++ EXT_SIZE_PARAMS(_heap_used_bytes_before_gc), ++ EXT_SIZE_PARAMS(_heap_capacity_bytes_before_gc), ++ EXT_SIZE_PARAMS(heap_used_bytes_after_gc), ++ EXT_SIZE_PARAMS(heap_capacity_bytes_after_gc)); ++ ++ if (full) { ++ print_perm_heap_change(_permgen_used_bytes_before_gc); ++ } ++ ++ gclog_or_tty->cr(); + } + + void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time, +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -176,7 +176,6 @@ + CollectionSetChooser* _collectionSetChooser; + + double _full_collection_start_sec; +- size_t _cur_collection_pause_used_at_start_bytes; + uint _cur_collection_pause_used_regions_at_start; + + // These exclude marking times. +@@ -195,7 +194,6 @@ + + uint _young_list_target_length; + uint _young_list_fixed_length; +- size_t _prev_eden_capacity; // used for logging + + // The max number of regions we can extend the eden by while the GC + // locker is active. This should be >= _young_list_target_length; +@@ -694,11 +692,12 @@ + + // Records the information about the heap size for reporting in + // print_detailed_heap_transition +- void record_heap_size_info_at_start(); ++ void record_heap_size_info_at_start(bool full); + + // Print heap sizing transition (with less and more detail). + void print_heap_transition(); +- void print_detailed_heap_transition(); ++ void print_detailed_heap_transition(bool full = false); ++ void print_perm_heap_change(size_t perm_prev_used) const; + + void record_stop_world_start(); + void record_concurrent_pause(); +@@ -862,9 +861,16 @@ + uint _max_survivor_regions; + + // For reporting purposes. +- size_t _eden_bytes_before_gc; +- size_t _survivor_bytes_before_gc; +- size_t _capacity_before_gc; ++ // The value of _heap_bytes_before_gc is also used to calculate ++ // the cost of copying. ++ ++ size_t _eden_used_bytes_before_gc; // Eden occupancy before GC ++ size_t _survivor_used_bytes_before_gc; // Survivor occupancy before GC ++ size_t _heap_used_bytes_before_gc; // Heap occupancy before GC ++ size_t _permgen_used_bytes_before_gc; // PermGen occupancy before GC ++ ++ size_t _eden_capacity_bytes_before_gc; // Eden capacity before GC ++ size_t _heap_capacity_bytes_before_gc; // Heap capacity before GC + + // The amount of survor regions after a collection. + uint _recorded_survivor_regions; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -107,7 +107,15 @@ + jbyte *const first = byte_for(mr.start()); + jbyte *const last = byte_after(mr.last()); + +- memset(first, g1_young_gen, last - first); ++ // Below we may use an explicit loop instead of memset() because on ++ // certain platforms memset() can give concurrent readers phantom zeros. ++ if (UseMemSetInBOT) { ++ memset(first, g1_young_gen, last - first); ++ } else { ++ for (jbyte* i = first; i < last; i++) { ++ *i = g1_young_gen; ++ } ++ } + } + + #ifndef PRODUCT +--- ./hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -62,7 +62,8 @@ + ParGCAllocBuffer(size_t word_sz); + + static const size_t min_size() { +- return ThreadLocalAllocBuffer::min_size(); ++ // Make sure that we return something that is larger than AlignmentReserve ++ return align_object_size(MAX2(MinTLABSize / HeapWordSize, (uintx)oopDesc::header_size())) + AlignmentReserve; + } + + static const size_t max_size() { +--- ./hotspot/src/share/vm/memory/referenceProcessor.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/memory/referenceProcessor.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -119,6 +119,7 @@ + _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; + _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; + _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; ++ _discoveredCleanerRefs = &_discoveredPhantomRefs[_max_num_q]; + + // Initialize all entries to NULL + for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { +@@ -250,6 +251,13 @@ + phantom_count = + process_discovered_reflist(_discoveredPhantomRefs, NULL, false, + is_alive, keep_alive, complete_gc, task_executor); ++ ++ // Process cleaners, but include them in phantom statistics. We expect ++ // Cleaner references to be temporary, and don't want to deal with ++ // possible incompatibilities arising from making it more visible. ++ phantom_count += ++ process_discovered_reflist(_discoveredCleanerRefs, NULL, false, ++ is_alive, keep_alive, complete_gc, task_executor); + } + + // Weak global JNI references. It would make more sense (semantically) to +@@ -899,6 +907,7 @@ + balance_queues(_discoveredWeakRefs); + balance_queues(_discoveredFinalRefs); + balance_queues(_discoveredPhantomRefs); ++ balance_queues(_discoveredCleanerRefs); + } + + size_t +@@ -1058,6 +1067,9 @@ + case REF_PHANTOM: + list = &_discoveredPhantomRefs[id]; + break; ++ case REF_CLEANER: ++ list = &_discoveredCleanerRefs[id]; ++ break; + case REF_NONE: + // we should not reach here if we are an instanceRefKlass + default: +@@ -1353,6 +1365,17 @@ + preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive, + keep_alive, complete_gc, yield); + } ++ ++ // Cleaner references. Included in timing for phantom references. We ++ // expect Cleaner references to be temporary, and don't want to deal with ++ // possible incompatibilities arising from making it more visible. ++ for (uint i = 0; i < _max_num_q; i++) { ++ if (yield->should_return()) { ++ return; ++ } ++ preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive, ++ keep_alive, complete_gc, yield); ++ } + } + } + +@@ -1421,6 +1444,7 @@ + case 1: return "WeakRef"; + case 2: return "FinalRef"; + case 3: return "PhantomRef"; ++ case 4: return "CleanerRef"; + } + ShouldNotReachHere(); + return NULL; +--- ./hotspot/src/share/vm/memory/referenceProcessor.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/memory/referenceProcessor.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -272,9 +272,10 @@ + DiscoveredList* _discoveredWeakRefs; + DiscoveredList* _discoveredFinalRefs; + DiscoveredList* _discoveredPhantomRefs; ++ DiscoveredList* _discoveredCleanerRefs; + + public: +- static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); } ++ static int number_of_subclasses_of_ref() { return (REF_CLEANER - REF_OTHER); } + + uint num_q() { return _num_q; } + uint max_num_q() { return _max_num_q; } +--- ./hotspot/src/share/vm/memory/referenceType.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/memory/referenceType.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -35,7 +35,8 @@ + REF_SOFT, // Subclass of java/lang/ref/SoftReference + REF_WEAK, // Subclass of java/lang/ref/WeakReference + REF_FINAL, // Subclass of java/lang/ref/FinalReference +- REF_PHANTOM // Subclass of java/lang/ref/PhantomReference ++ REF_PHANTOM, // Subclass of java/lang/ref/PhantomReference ++ REF_CLEANER // Subclass of sun/misc/Cleaner + }; + + #endif // SHARE_VM_MEMORY_REFRERENCETYPE_HPP +--- ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -240,22 +240,19 @@ + } + + size_t ThreadLocalAllocBuffer::initial_desired_size() { +- size_t init_sz; ++ size_t init_sz = 0; + + if (TLABSize > 0) { +- init_sz = MIN2(TLABSize / HeapWordSize, max_size()); +- } else if (global_stats() == NULL) { +- // Startup issue - main thread initialized before heap initialized. +- init_sz = min_size(); +- } else { ++ init_sz = TLABSize / HeapWordSize; ++ } else if (global_stats() != NULL) { + // Initial size is a function of the average number of allocating threads. + unsigned nof_threads = global_stats()->allocating_threads_avg(); + + init_sz = (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize) / + (nof_threads * target_refills()); + init_sz = align_object_size(init_sz); +- init_sz = MIN2(MAX2(init_sz, min_size()), max_size()); + } ++ init_sz = MIN2(MAX2(init_sz, min_size()), max_size()); + return init_sz; + } + +--- ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -103,7 +103,7 @@ + // do nothing. tlabs must be inited by initialize() calls + } + +- static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize); } ++ static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize) + alignment_reserve(); } + static const size_t max_size(); + + HeapWord* start() const { return _start; } +--- ./hotspot/src/share/vm/oops/cpCacheOop.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/oops/cpCacheOop.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -140,8 +140,15 @@ + oop_store(&_f1, f1); + } + void release_set_f1(oop f1); +- void set_f2(intx f2) { assert(_f2 == 0 || _f2 == f2, "illegal field change"); _f2 = f2; } +- void set_f2_as_vfinal_method(methodOop f2) { assert(_f2 == 0 || _f2 == (intptr_t) f2, "illegal field change"); assert(is_vfinal(), "flags must be set"); _f2 = (intptr_t) f2; } ++ void set_f2(intx f2) { ++ intx existing_f2 = _f2; // read once ++ assert(existing_f2 == 0 || existing_f2 == f2, "illegal field change"); ++ _f2 = f2; ++ } ++ void set_f2_as_vfinal_method(methodOop f2) { ++ assert(is_vfinal(), "flags must be set"); ++ set_f2((intx)f2); ++ } + int make_flags(TosState state, int option_bits, int field_index_or_method_params); + void set_flags(intx flags) { _flags = flags; } + bool init_flags_atomic(intx flags); +--- ./hotspot/src/share/vm/oops/objArrayOop.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/oops/objArrayOop.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -45,9 +45,10 @@ + private: + // Give size of objArrayOop in HeapWords minus the header + static int array_size(int length) { +- const int OopsPerHeapWord = HeapWordSize/heapOopSize; ++ const uint OopsPerHeapWord = HeapWordSize/heapOopSize; + assert(OopsPerHeapWord >= 1 && (HeapWordSize % heapOopSize == 0), + "Else the following (new) computation would be in error"); ++ uint res = ((uint)length + OopsPerHeapWord - 1)/OopsPerHeapWord; + #ifdef ASSERT + // The old code is left in for sanity-checking; it'll + // go away pretty soon. XXX +@@ -55,16 +56,15 @@ + // oop->length() * HeapWordsPerOop; + // With narrowOops, HeapWordsPerOop is 1/2 or equal 0 as an integer. + // The oop elements are aligned up to wordSize +- const int HeapWordsPerOop = heapOopSize/HeapWordSize; +- int old_res; ++ const uint HeapWordsPerOop = heapOopSize/HeapWordSize; ++ uint old_res; + if (HeapWordsPerOop > 0) { + old_res = length * HeapWordsPerOop; + } else { +- old_res = align_size_up(length, OopsPerHeapWord)/OopsPerHeapWord; ++ old_res = align_size_up((uint)length, OopsPerHeapWord)/OopsPerHeapWord; + } ++ assert(res == old_res, "Inconsistency between old and new."); + #endif // ASSERT +- int res = ((uint)length + OopsPerHeapWord - 1)/OopsPerHeapWord; +- assert(res == old_res, "Inconsistency between old and new."); + return res; + } + +--- ./hotspot/src/share/vm/oops/typeArrayOop.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/oops/typeArrayOop.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -162,7 +162,7 @@ + DEBUG_ONLY(BasicType etype = Klass::layout_helper_element_type(lh)); + assert(length <= arrayOopDesc::max_array_length(etype), "no overflow"); + +- julong size_in_bytes = length; ++ julong size_in_bytes = (juint)length; + size_in_bytes <<= element_shift; + size_in_bytes += instance_header_size; + julong size_in_words = ((size_in_bytes + (HeapWordSize-1)) >> LogHeapWordSize); +--- ./hotspot/src/share/vm/opto/compile.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/compile.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -669,6 +669,7 @@ + #endif + set_print_inlining(PrintInlining || method()->has_option("PrintInlining") NOT_PRODUCT( || PrintOptoInlining)); + set_print_intrinsics(PrintIntrinsics || method()->has_option("PrintIntrinsics")); ++ set_has_irreducible_loop(true); // conservative until build_loop_tree() reset it + + if (ProfileTraps) { + // Make sure the method being compiled gets its own MDO, +@@ -936,6 +937,8 @@ + set_print_assembly(PrintFrameConverterAssembly); + set_parsed_irreducible_loop(false); + #endif ++ set_has_irreducible_loop(false); // no loops ++ + CompileWrapper cw(this); + Init(/*AliasLevel=*/ 0); + init_tf((*generator)()); +@@ -1100,7 +1103,7 @@ + if( start->is_Start() ) + return start->as_Start(); + } +- ShouldNotReachHere(); ++ fatal("Did not find Start node!"); + return NULL; + } + +--- ./hotspot/src/share/vm/opto/compile.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/compile.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -291,6 +291,7 @@ + bool _trace_opto_output; + bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing + #endif ++ bool _has_irreducible_loop; // Found irreducible loops + + // JSR 292 + bool _has_method_handle_invokes; // True if this method has MethodHandle invokes. +@@ -552,6 +553,8 @@ + bool parsed_irreducible_loop() const { return _parsed_irreducible_loop; } + void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; } + #endif ++ bool has_irreducible_loop() const { return _has_irreducible_loop; } ++ void set_has_irreducible_loop(bool z) { _has_irreducible_loop = z; } + + // JSR 292 + bool has_method_handle_invokes() const { return _has_method_handle_invokes; } +--- ./hotspot/src/share/vm/opto/ifnode.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/ifnode.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -503,7 +503,7 @@ + jint off = 0; + if (l->is_top()) { + return 0; +- } else if (l->is_Add()) { ++ } else if (l->Opcode() == Op_AddI) { + if ((off = l->in(1)->find_int_con(0)) != 0) { + ind = l->in(2); + } else if ((off = l->in(2)->find_int_con(0)) != 0) { +--- ./hotspot/src/share/vm/opto/library_call.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/library_call.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -3699,8 +3699,11 @@ + } + + +-//------------------------------inline_native_hashcode-------------------- +-// Build special case code for calls to hashCode on an object. ++/** ++ * Build special case code for calls to hashCode on an object. This call may ++ * be virtual (invokevirtual) or bound (invokespecial). For each case we generate ++ * slightly different code. ++ */ + bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) { + assert(is_static == callee()->is_static(), "correct intrinsic selection"); + assert(!(is_virtual && is_static), "either virtual, special, or static"); +@@ -3708,11 +3711,9 @@ + enum { _slow_path = 1, _fast_path, _null_path, PATH_LIMIT }; + + RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT); +- PhiNode* result_val = new(C) PhiNode(result_reg, +- TypeInt::INT); ++ PhiNode* result_val = new(C) PhiNode(result_reg, TypeInt::INT); + PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO); +- PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, +- TypePtr::BOTTOM); ++ PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM); + Node* obj = NULL; + if (!is_static) { + // Check for hashing null object +@@ -3738,12 +3739,6 @@ + return true; + } + +- // After null check, get the object's klass. +- Node* obj_klass = load_object_klass(obj); +- +- // This call may be virtual (invokevirtual) or bound (invokespecial). +- // For each case we generate slightly different code. +- + // We only go to the fast case code if we pass a number of guards. The + // paths which do not pass are accumulated in the slow_region. + RegionNode* slow_region = new (C) RegionNode(1); +@@ -3756,19 +3751,24 @@ + // guard for non-virtual calls -- the caller is known to be the native + // Object hashCode(). + if (is_virtual) { ++ // After null check, get the object's klass. ++ Node* obj_klass = load_object_klass(obj); + generate_virtual_guard(obj_klass, slow_region); + } + + // Get the header out of the object, use LoadMarkNode when available + Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes()); +- Node* header = make_load(control(), header_addr, TypeX_X, TypeX_X->basic_type()); ++ // The control of the load must be NULL. Otherwise, the load can move before ++ // the null check after castPP removal. ++ Node* no_ctrl = NULL; ++ Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type()); + + // Test the header to see if it is unlocked. +- Node *lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place); +- Node *lmasked_header = _gvn.transform( new (C) AndXNode(header, lock_mask) ); +- Node *unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value); +- Node *chk_unlocked = _gvn.transform( new (C) CmpXNode( lmasked_header, unlocked_val)); +- Node *test_unlocked = _gvn.transform( new (C) BoolNode( chk_unlocked, BoolTest::ne) ); ++ Node* lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place); ++ Node* lmasked_header = _gvn.transform(new (C) AndXNode(header, lock_mask)); ++ Node* unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value); ++ Node* chk_unlocked = _gvn.transform(new (C) CmpXNode( lmasked_header, unlocked_val)); ++ Node* test_unlocked = _gvn.transform(new (C) BoolNode( chk_unlocked, BoolTest::ne)); + + generate_slow_guard(test_unlocked, slow_region); + +@@ -3776,19 +3776,19 @@ + // We depend on hash_mask being at most 32 bits and avoid the use of + // hash_mask_in_place because it could be larger than 32 bits in a 64-bit + // vm: see markOop.hpp. +- Node *hash_mask = _gvn.intcon(markOopDesc::hash_mask); +- Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift); +- Node *hshifted_header= _gvn.transform( new (C) URShiftXNode(header, hash_shift) ); ++ Node* hash_mask = _gvn.intcon(markOopDesc::hash_mask); ++ Node* hash_shift = _gvn.intcon(markOopDesc::hash_shift); ++ Node* hshifted_header= _gvn.transform(new (C) URShiftXNode(header, hash_shift)); + // This hack lets the hash bits live anywhere in the mark object now, as long + // as the shift drops the relevant bits into the low 32 bits. Note that + // Java spec says that HashCode is an int so there's no point in capturing + // an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build). + hshifted_header = ConvX2I(hshifted_header); +- Node *hash_val = _gvn.transform( new (C) AndINode(hshifted_header, hash_mask) ); +- +- Node *no_hash_val = _gvn.intcon(markOopDesc::no_hash); +- Node *chk_assigned = _gvn.transform( new (C) CmpINode( hash_val, no_hash_val)); +- Node *test_assigned = _gvn.transform( new (C) BoolNode( chk_assigned, BoolTest::eq) ); ++ Node* hash_val = _gvn.transform(new (C) AndINode(hshifted_header, hash_mask)); ++ ++ Node* no_hash_val = _gvn.intcon(markOopDesc::no_hash); ++ Node* chk_assigned = _gvn.transform(new (C) CmpINode( hash_val, no_hash_val)); ++ Node* test_assigned = _gvn.transform(new (C) BoolNode( chk_assigned, BoolTest::eq)); + + generate_slow_guard(test_assigned, slow_region); + +--- ./hotspot/src/share/vm/opto/loopTransform.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopTransform.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1127,6 +1127,7 @@ + // Now force out all loop-invariant dominating tests. The optimizer + // finds some, but we _know_ they are all useless. + peeled_dom_test_elim(loop,old_new); ++ loop->record_for_igvn(); + } + + //------------------------------is_invariant----------------------------- +--- ./hotspot/src/share/vm/opto/loopnode.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopnode.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -266,9 +266,9 @@ + + // Counted loop head must be a good RegionNode with only 3 not NULL + // control input edges: Self, Entry, LoopBack. +- if (x->in(LoopNode::Self) == NULL || x->req() != 3) ++ if (x->in(LoopNode::Self) == NULL || x->req() != 3 || loop->_irreducible) { + return false; +- ++ } + Node *init_control = x->in(LoopNode::EntryControl); + Node *back_control = x->in(LoopNode::LoopBackControl); + if (init_control == NULL || back_control == NULL) // Partially dead +@@ -1522,11 +1522,11 @@ + + // If I have one hot backedge, peel off myself loop. + // I better be the outermost loop. +- if( _head->req() > 3 ) { ++ if (_head->req() > 3 && !_irreducible) { + split_outer_loop( phase ); + result = true; + +- } else if( !_head->is_Loop() && !_irreducible ) { ++ } else if (!_head->is_Loop() && !_irreducible) { + // Make a new LoopNode to replace the old loop head + Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) ); + l = igvn.register_new_node_with_optimizer(l, _head); +@@ -2938,6 +2938,7 @@ + return pre_order; + } + } ++ C->set_has_irreducible_loop(_has_irreducible_loops); + } + + // This Node might be a decision point for loops. It is only if +@@ -3171,17 +3172,16 @@ + bool had_error = false; + #ifdef ASSERT + if (early != C->root()) { +- // Make sure that there's a dominance path from use to LCA +- Node* d = use; +- while (d != LCA) { +- d = idom(d); ++ // Make sure that there's a dominance path from LCA to early ++ Node* d = LCA; ++ while (d != early) { + if (d == C->root()) { +- tty->print_cr("*** Use %d isn't dominated by def %s", use->_idx, n->_idx); +- n->dump(); +- use->dump(); ++ dump_bad_graph("Bad graph detected in compute_lca_of_uses", n, early, LCA); ++ tty->print_cr("*** Use %d isn't dominated by def %d ***", use->_idx, n->_idx); + had_error = true; + break; + } ++ d = idom(d); + } + } + #endif +@@ -3434,6 +3434,13 @@ + _igvn._worklist.push(n); // Maybe we'll normalize it, if no more loops. + } + ++#ifdef ASSERT ++ if (_verify_only && !n->is_CFG()) { ++ // Check def-use domination. ++ compute_lca_of_uses(n, get_ctrl(n), true /* verify */); ++ } ++#endif ++ + // CFG and pinned nodes already handled + if( n->in(0) ) { + if( n->in(0)->is_top() ) return; // Dead? +--- ./hotspot/src/share/vm/opto/loopopts.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopopts.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -2684,6 +2684,7 @@ + // Inhibit more partial peeling on this loop + new_head_clone->set_partial_peel_loop(); + C->set_major_progress(); ++ loop->record_for_igvn(); + + #if !defined(PRODUCT) + if (TracePartialPeeling) { +--- ./hotspot/src/share/vm/opto/memnode.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/memnode.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -292,33 +292,16 @@ + int alias_idx = phase->C->get_alias_index(t_adr->is_ptr()); + } + +-#ifdef ASSERT + Node* base = NULL; +- if (address->is_AddP()) ++ if (address->is_AddP()) { + base = address->in(AddPNode::Base); ++ } + if (base != NULL && phase->type(base)->higher_equal(TypePtr::NULL_PTR) && + !t_adr->isa_rawptr()) { + // Note: raw address has TOP base and top->higher_equal(TypePtr::NULL_PTR) is true. +- Compile* C = phase->C; +- tty->cr(); +- tty->print_cr("===== NULL+offs not RAW address ====="); +- if (C->is_dead_node(this->_idx)) tty->print_cr("'this' is dead"); +- if ((ctl != NULL) && C->is_dead_node(ctl->_idx)) tty->print_cr("'ctl' is dead"); +- if (C->is_dead_node(mem->_idx)) tty->print_cr("'mem' is dead"); +- if (C->is_dead_node(address->_idx)) tty->print_cr("'address' is dead"); +- if (C->is_dead_node(base->_idx)) tty->print_cr("'base' is dead"); +- tty->cr(); +- base->dump(1); +- tty->cr(); +- this->dump(2); +- tty->print("this->adr_type(): "); adr_type()->dump(); tty->cr(); +- tty->print("phase->type(address): "); t_adr->dump(); tty->cr(); +- tty->print("phase->type(base): "); phase->type(address)->dump(); tty->cr(); +- tty->cr(); ++ // Skip this node optimization if its address has TOP base. ++ return NodeSentinel; // caller will return NULL + } +- assert(base == NULL || t_adr->isa_rawptr() || +- !phase->type(base)->higher_equal(TypePtr::NULL_PTR), "NULL+offs not RAW address?"); +-#endif + + // Avoid independent memory operations + Node* old_mem = mem; +--- ./hotspot/src/share/vm/opto/node.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/node.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,6 +27,7 @@ + #include "memory/allocation.inline.hpp" + #include "opto/cfgnode.hpp" + #include "opto/connode.hpp" ++#include "opto/loopnode.hpp" + #include "opto/machnode.hpp" + #include "opto/matcher.hpp" + #include "opto/node.hpp" +@@ -1225,6 +1226,7 @@ + + Node *top = igvn->C->top(); + nstack.push(dead); ++ bool has_irreducible_loop = igvn->C->has_irreducible_loop(); + + while (nstack.size() > 0) { + dead = nstack.pop(); +@@ -1239,13 +1241,31 @@ + assert (!use->is_Con(), "Control for Con node should be Root node."); + use->set_req(0, top); // Cut dead edge to prevent processing + nstack.push(use); // the dead node again. ++ } else if (!has_irreducible_loop && // Backedge could be alive in irreducible loop ++ use->is_Loop() && !use->is_Root() && // Don't kill Root (RootNode extends LoopNode) ++ use->in(LoopNode::EntryControl) == dead) { // Dead loop if its entry is dead ++ use->set_req(LoopNode::EntryControl, top); // Cut dead edge to prevent processing ++ use->set_req(0, top); // Cut self edge ++ nstack.push(use); + } else { // Else found a not-dead user ++ // Dead if all inputs are top or null ++ bool dead_use = !use->is_Root(); // Keep empty graph alive + for (uint j = 1; j < use->req(); j++) { +- if (use->in(j) == dead) { // Turn all dead inputs into TOP ++ Node* in = use->in(j); ++ if (in == dead) { // Turn all dead inputs into TOP + use->set_req(j, top); ++ } else if (in != NULL && !in->is_top()) { ++ dead_use = false; + } + } +- igvn->_worklist.push(use); ++ if (dead_use) { ++ if (use->is_Region()) { ++ use->set_req(0, top); // Cut self edge ++ } ++ nstack.push(use); ++ } else { ++ igvn->_worklist.push(use); ++ } + } + // Refresh the iterator, since any number of kills might have happened. + k = dead->last_outs(kmin); +--- ./hotspot/src/share/vm/opto/runtime.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/runtime.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1307,6 +1307,7 @@ + // add counters so this is safe. + NamedCounter* head; + do { ++ c->set_next(NULL); + head = _named_counters; + c->set_next(head); + } while (Atomic::cmpxchg_ptr(c, &_named_counters, head) != head); +--- ./hotspot/src/share/vm/opto/runtime.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/runtime.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -85,7 +85,7 @@ + + NamedCounter* next() const { return _next; } + void set_next(NamedCounter* next) { +- assert(_next == NULL, "already set"); ++ assert(_next == NULL || next == NULL, "already set"); + _next = next; + } + +--- ./hotspot/src/share/vm/opto/superword.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/opto/superword.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1262,8 +1262,9 @@ + memops.clear(); + for (DUIterator i = upper_insert_pt->outs(); upper_insert_pt->has_out(i); i++) { + Node* use = upper_insert_pt->out(i); +- if (!use->is_Store()) ++ if (use->is_Mem() && !use->is_Store()) { + memops.push(use); ++ } + } + + MemNode* lower_insert_pt = last; +--- ./hotspot/src/share/vm/prims/jni.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jni.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * +@@ -5037,6 +5037,7 @@ + #include "gc_implementation/shared/gcTimer.hpp" + #include "gc_interface/collectedHeap.hpp" + #include "utilities/quickSort.hpp" ++#include "utilities/ostream.hpp" + + #define run_unit_test(unit_test_function_call) \ + tty->print_cr("Running test: " #unit_test_function_call); \ +@@ -5058,6 +5059,7 @@ + run_unit_test(QuickSort::test_quick_sort()); + run_unit_test(AltHashing::test_alt_hash()); + run_unit_test(TestOldFreeSpaceCalculation_test()); ++ run_unit_test(test_loggc_filename()); + tty->print_cr("All internal VM tests passed"); + } + } +--- ./hotspot/src/share/vm/prims/jvm.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -388,6 +388,23 @@ + JVM_END + + ++/* ++ * Return the temporary directory that the VM uses for the attach ++ * and perf data files. ++ * ++ * It is important that this directory is well-known and the ++ * same for all VM instances. It cannot be affected by configuration ++ * variables such as java.io.tmpdir. ++ */ ++JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env)) ++ JVMWrapper("JVM_GetTemporaryDirectory"); ++ HandleMark hm(THREAD); ++ const char* temp_dir = os::get_temp_directory(); ++ Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL); ++ return (jstring) JNIHandles::make_local(env, h()); ++JVM_END ++ ++ + // java.lang.Runtime ///////////////////////////////////////////////////////////////////////// + + extern volatile jint vm_created; +@@ -527,6 +544,12 @@ + JavaThreadInObjectWaitState jtiows(thread, ms != 0); + if (JvmtiExport::should_post_monitor_wait()) { + JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms); ++ ++ // The current thread already owns the monitor and it has not yet ++ // been added to the wait queue so the current thread cannot be ++ // made the successor. This means that the JVMTI_EVENT_MONITOR_WAIT ++ // event handler cannot accidentally consume an unpark() meant for ++ // the ParkEvent associated with this ObjectMonitor. + } + ObjectSynchronizer::wait(obj, ms, THREAD); + JVM_END +--- ./hotspot/src/share/vm/prims/jvm.h Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.h Mon Jan 05 11:51:17 2015 -0800 +@@ -1477,6 +1477,9 @@ + JNIEXPORT jobject JNICALL + JVM_InitAgentProperties(JNIEnv *env, jobject agent_props); + ++JNIEXPORT jstring JNICALL ++JVM_GetTemporaryDirectory(JNIEnv *env); ++ + /* Generics reflection support. + * + * Returns information about the given class's EnclosingMethod +--- ./hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -400,7 +400,11 @@ + VMOp_Type type() const { return VMOp_GetCurrentContendedMonitor; } + jvmtiError result() { return _result; } + void doit() { +- _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr); ++ _result = JVMTI_ERROR_THREAD_NOT_ALIVE; ++ if (Threads::includes(_java_thread) && !_java_thread->is_exiting() && ++ _java_thread->threadObj() != NULL) { ++ _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr); ++ } + } + }; + +--- ./hotspot/src/share/vm/runtime/arguments.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/arguments.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -55,7 +55,7 @@ + #endif + + // Note: This is a special bug reporting site for the JVM +-#define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp" ++#define DEFAULT_VENDOR_URL_BUG "http://bugreport.java.com/bugreport/crash.jsp" + #define DEFAULT_JAVA_LAUNCHER "generic" + + char** Arguments::_jvm_flags_array = NULL; +@@ -1758,24 +1758,22 @@ + // check if do gclog rotation + // +UseGCLogFileRotation is a must, + // no gc log rotation when log file not supplied or +-// NumberOfGCLogFiles is 0, or GCLogFileSize is 0 ++// NumberOfGCLogFiles is 0 + void check_gclog_consistency() { + if (UseGCLogFileRotation) { +- if ((Arguments::gc_log_filename() == NULL) || +- (NumberOfGCLogFiles == 0) || +- (GCLogFileSize == 0)) { ++ if ((Arguments::gc_log_filename() == NULL) || (NumberOfGCLogFiles == 0)) { + jio_fprintf(defaultStream::output_stream(), +- "To enable GC log rotation, use -Xloggc:<filename> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<num_of_files> -XX:GCLogFileSize=<num_of_size>\n" +- "where num_of_file > 0 and num_of_size > 0\n" ++ "To enable GC log rotation, use -Xloggc:<filename> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<num_of_files>\n" ++ "where num_of_file > 0\n" + "GC log rotation is turned off\n"); + UseGCLogFileRotation = false; + } + } + +- if (UseGCLogFileRotation && GCLogFileSize < 8*K) { +- FLAG_SET_CMDLINE(uintx, GCLogFileSize, 8*K); +- jio_fprintf(defaultStream::output_stream(), +- "GCLogFileSize changed to minimum 8K\n"); ++ if (UseGCLogFileRotation && (GCLogFileSize != 0) && (GCLogFileSize < 8*K)) { ++ FLAG_SET_CMDLINE(uintx, GCLogFileSize, 8*K); ++ jio_fprintf(defaultStream::output_stream(), ++ "GCLogFileSize changed to minimum 8K\n"); + } + } + +@@ -1807,6 +1805,51 @@ + return true; + } + ++// This function is called for -Xloggc:<filename>, it can be used ++// to check if a given file name(or string) conforms to the following ++// specification: ++// A valid string only contains "[A-Z][a-z][0-9].-_%[p|t]" ++// %p and %t only allowed once. We only limit usage of filename not path ++bool is_filename_valid(const char *file_name) { ++ const char* p = file_name; ++ char file_sep = os::file_separator()[0]; ++ const char* cp; ++ // skip prefix path ++ for (cp = file_name; *cp != '\0'; cp++) { ++ if (*cp == '/' || *cp == file_sep) { ++ p = cp + 1; ++ } ++ } ++ ++ int count_p = 0; ++ int count_t = 0; ++ while (*p != '\0') { ++ if ((*p >= '0' && *p <= '9') || ++ (*p >= 'A' && *p <= 'Z') || ++ (*p >= 'a' && *p <= 'z') || ++ *p == '-' || ++ *p == '_' || ++ *p == '.') { ++ p++; ++ continue; ++ } ++ if (*p == '%') { ++ if(*(p + 1) == 'p') { ++ p += 2; ++ count_p ++; ++ continue; ++ } ++ if (*(p + 1) == 't') { ++ p += 2; ++ count_t ++; ++ continue; ++ } ++ } ++ return false; ++ } ++ return count_p < 2 && count_t < 2; ++} ++ + // Check consistency of GC selection + bool Arguments::check_gc_consistency() { + check_gclog_consistency(); +@@ -2398,7 +2441,7 @@ + (size_t)InitialCodeCacheSize); + if (errcode != arg_in_range) { + jio_fprintf(defaultStream::error_stream(), +- "Invalid maximum code cache size: %s. Should be greater than InitialCodeCacheSize=%dK\n", ++ "Invalid maximum code cache size: %s. Should be greater than or equal to InitialCodeCacheSize=%dK\n", + option->optionString, InitialCodeCacheSize/K); + describe_range_error(errcode); + return JNI_EINVAL; +@@ -2524,6 +2567,13 @@ + // ostream_init_log(), when called will use this filename + // to initialize a fileStream. + _gc_log_filename = strdup(tail); ++ if (!is_filename_valid(_gc_log_filename)) { ++ jio_fprintf(defaultStream::output_stream(), ++ "Invalid file name for use with -Xloggc: Filename can only contain the " ++ "characters [A-Z][a-z][0-9]-_.%%[p|t] but it has been %s\n" ++ "Note %%p or %%t can only be used once\n", _gc_log_filename); ++ return JNI_EINVAL; ++ } + FLAG_SET_CMDLINE(bool, PrintGC, true); + FLAG_SET_CMDLINE(bool, PrintGCTimeStamps, true); + +@@ -3288,9 +3338,6 @@ + #endif // CC_INTERP + + #ifdef COMPILER2 +- if (!UseBiasedLocking || EmitSync != 0) { +- UseOptoBiasInlining = false; +- } + if (!EliminateLocks) { + EliminateNestedLocks = false; + } +@@ -3334,6 +3381,12 @@ + } + } + ++#ifdef COMPILER2 ++ if (!UseBiasedLocking || EmitSync != 0) { ++ UseOptoBiasInlining = false; ++ } ++#endif ++ + // set PauseAtExit if the gamma launcher was used and a debugger is attached + // but only if not already set on the commandline + if (Arguments::created_by_gamma_launcher() && os::is_debugger_attached()) { +--- ./hotspot/src/share/vm/runtime/globals.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/globals.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1204,7 +1204,7 @@ + "Decay time (in milliseconds) to re-enable bulk rebiasing of a " \ + "type after previous bulk rebias") \ + \ +- develop(bool, JavaObjectsInPerm, false, \ ++ diagnostic(bool, JavaObjectsInPerm, false, \ + "controls whether Classes and interned Strings are allocated" \ + "in perm. This purely intended to allow debugging issues" \ + "in production.") \ +@@ -2339,9 +2339,9 @@ + "Number of gclog files in rotation, " \ + "Default: 0, no rotation") \ + \ +- product(uintx, GCLogFileSize, 0, \ +- "GC log file size, Default: 0 bytes, no rotation " \ +- "Only valid with UseGCLogFileRotation") \ ++ product(uintx, GCLogFileSize, 8*K, \ ++ "GC log file size, requires UseGCLogFileRotation. " \ ++ "Set to 0 to only trigger rotation via jcmd") \ + \ + /* JVMTI heap profiling */ \ + \ +--- ./hotspot/src/share/vm/runtime/objectMonitor.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/objectMonitor.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -385,6 +385,12 @@ + DTRACE_MONITOR_PROBE(contended__enter, this, object(), jt); + if (JvmtiExport::should_post_monitor_contended_enter()) { + JvmtiExport::post_monitor_contended_enter(jt, this); ++ ++ // The current thread does not yet own the monitor and does not ++ // yet appear on any queues that would get it made the successor. ++ // This means that the JVMTI_EVENT_MONITOR_CONTENDED_ENTER event ++ // handler cannot accidentally consume an unpark() meant for the ++ // ParkEvent associated with this ObjectMonitor. + } + + OSThreadContendState osts(Self->osthread()); +@@ -442,6 +448,12 @@ + DTRACE_MONITOR_PROBE(contended__entered, this, object(), jt); + if (JvmtiExport::should_post_monitor_contended_entered()) { + JvmtiExport::post_monitor_contended_entered(jt, this); ++ ++ // The current thread already owns the monitor and is not going to ++ // call park() for the remainder of the monitor enter protocol. So ++ // it doesn't matter if the JVMTI_EVENT_MONITOR_CONTENDED_ENTERED ++ // event handler consumed an unpark() issued by the thread that ++ // just exited the monitor. + } + + if (event.should_commit()) { +@@ -1459,6 +1471,14 @@ + // Note: 'false' parameter is passed here because the + // wait was not timed out due to thread interrupt. + JvmtiExport::post_monitor_waited(jt, this, false); ++ ++ // In this short circuit of the monitor wait protocol, the ++ // current thread never drops ownership of the monitor and ++ // never gets added to the wait queue so the current thread ++ // cannot be made the successor. This means that the ++ // JVMTI_EVENT_MONITOR_WAITED event handler cannot accidentally ++ // consume an unpark() meant for the ParkEvent associated with ++ // this ObjectMonitor. + } + if (event.should_commit()) { + post_monitor_wait_event(&event, 0, millis, false); +@@ -1502,21 +1522,6 @@ + exit (true, Self) ; // exit the monitor + guarantee (_owner != Self, "invariant") ; + +- // As soon as the ObjectMonitor's ownership is dropped in the exit() +- // call above, another thread can enter() the ObjectMonitor, do the +- // notify(), and exit() the ObjectMonitor. If the other thread's +- // exit() call chooses this thread as the successor and the unpark() +- // call happens to occur while this thread is posting a +- // MONITOR_CONTENDED_EXIT event, then we run the risk of the event +- // handler using RawMonitors and consuming the unpark(). +- // +- // To avoid the problem, we re-post the event. This does no harm +- // even if the original unpark() was not consumed because we are the +- // chosen successor for this monitor. +- if (node._notified != 0 && _succ == Self) { +- node._event->unpark(); +- } +- + // The thread is on the WaitSet list - now park() it. + // On MP systems it's conceivable that a brief spin before we park + // could be profitable. +@@ -1600,6 +1605,33 @@ + JvmtiExport::post_monitor_waited(jt, this, ret == OS_TIMEOUT); + } + ++ // Without the fix for 8028280, it is possible for the above call: ++ // ++ // Thread::SpinAcquire (&_WaitSetLock, "WaitSet - unlink") ; ++ // ++ // to consume the unpark() that was done when the successor was set. ++ // The solution for this very rare possibility is to redo the unpark() ++ // outside of the JvmtiExport::should_post_monitor_waited() check. ++ // ++ if (node._notified != 0 && _succ == Self) { ++ // In this part of the monitor wait-notify-reenter protocol it ++ // is possible (and normal) for another thread to do a fastpath ++ // monitor enter-exit while this thread is still trying to get ++ // to the reenter portion of the protocol. ++ // ++ // The ObjectMonitor was notified and the current thread is ++ // the successor which also means that an unpark() has already ++ // been done. The JVMTI_EVENT_MONITOR_WAITED event handler can ++ // consume the unpark() that was done when the successor was ++ // set because the same ParkEvent is shared between Java ++ // monitors and JVM/TI RawMonitors (for now). ++ // ++ // We redo the unpark() to ensure forward progress, i.e., we ++ // don't want all pending threads hanging (parked) with none ++ // entering the unlocked monitor. ++ node._event->unpark(); ++ } ++ + if (event.should_commit()) { + post_monitor_wait_event(&event, node._notifier_tid, millis, ret == OS_TIMEOUT); + } +--- ./hotspot/src/share/vm/runtime/safepoint.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/safepoint.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -545,7 +545,7 @@ + + // rotate log files? + if (UseGCLogFileRotation) { +- gclog_or_tty->rotate_log(); ++ gclog_or_tty->rotate_log(false); + } + + if (MemTracker::is_on()) { +--- ./hotspot/src/share/vm/runtime/vmStructs.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vmStructs.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -706,6 +706,7 @@ + static_field(SystemDictionary, WK_KLASS(WeakReference_klass), klassOop) \ + static_field(SystemDictionary, WK_KLASS(FinalReference_klass), klassOop) \ + static_field(SystemDictionary, WK_KLASS(PhantomReference_klass), klassOop) \ ++ static_field(SystemDictionary, WK_KLASS(Cleaner_klass), klassOop) \ + static_field(SystemDictionary, WK_KLASS(Finalizer_klass), klassOop) \ + static_field(SystemDictionary, WK_KLASS(Thread_klass), klassOop) \ + static_field(SystemDictionary, WK_KLASS(ThreadGroup_klass), klassOop) \ +--- ./hotspot/src/share/vm/runtime/vmThread.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vmThread.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -327,6 +327,9 @@ + _terminate_lock->notify(); + } + ++ // Thread destructor usually does this. ++ ThreadLocalStorage::set_thread(NULL); ++ + // Deletion must be done synchronously by the JNI DestroyJavaVM thread + // so that the VMThread deletion completes before the main thread frees + // up the CodeHeap. +--- ./hotspot/src/share/vm/runtime/vm_operations.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vm_operations.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -96,6 +96,7 @@ + template(JFRCheckpoint) \ + template(Exit) \ + template(LinuxDllLoad) \ ++ template(RotateGCLog) \ + + class VM_Operation: public CHeapObj<mtInternal> { + public: +@@ -409,4 +410,15 @@ + void doit(); + }; + ++ ++class VM_RotateGCLog: public VM_Operation { ++ private: ++ outputStream* _out; ++ ++ public: ++ VM_RotateGCLog(outputStream* st) : _out(st) {} ++ VMOp_Type type() const { return VMOp_RotateGCLog; } ++ void doit() { gclog_or_tty->rotate_log(true, _out); } ++}; ++ + #endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP +--- ./hotspot/src/share/vm/services/diagnosticCommand.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/services/diagnosticCommand.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -51,7 +51,7 @@ + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JMXStartRemoteDCmd>(true,false)); + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JMXStartLocalDCmd>(true,false)); + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<JMXStopRemoteDCmd>(true,false)); +- ++ DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<RotateGCLogDCmd>(true, false)); + } + + #ifndef HAVE_EXTRA_DCMD +@@ -565,3 +565,11 @@ + JavaCalls::call_static(&result, ik, vmSymbols::stopRemoteAgent_name(), vmSymbols::void_method_signature(), CHECK); + } + ++void RotateGCLogDCmd::execute(TRAPS) { ++ if (UseGCLogFileRotation) { ++ VM_RotateGCLog rotateop(output()); ++ VMThread::execute(&rotateop); ++ } else { ++ output()->print_cr("Target VM does not support GC log file rotation."); ++ } ++} +--- ./hotspot/src/share/vm/services/diagnosticCommand.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/services/diagnosticCommand.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -302,4 +302,14 @@ + virtual void execute(TRAPS); + }; + ++class RotateGCLogDCmd : public DCmd { ++public: ++ RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} ++ static const char* name() { return "GC.rotate_log"; } ++ static const char* description() { ++ return "Force the GC log file to be rotated."; ++ } ++ virtual void execute(TRAPS); ++}; ++ + #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP +--- ./hotspot/src/share/vm/services/heapDumper.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/services/heapDumper.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -720,7 +720,7 @@ + + // reflection and sun.misc.Unsafe classes may have a reference to a + // klassOop so filter it out. +- if (o != NULL && o->is_klass()) { ++ if (o != NULL && o->is_perm() && o->is_klass()) { + o = NULL; + } + +--- ./hotspot/src/share/vm/utilities/defaultStream.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/defaultStream.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -41,6 +41,8 @@ + + void init(); + void init_log(); ++ fileStream* open_file(const char* log_name); ++ void start_log(); + void finish_log(); + void finish_log_on_error(char *buf, int buflen); + public: +--- ./hotspot/src/share/vm/utilities/ostream.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/ostream.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -341,7 +341,7 @@ + } + + char* stringStream::as_string() { +- char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos+1); ++ char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos + 1); + strncpy(copy, buffer, buffer_pos); + copy[buffer_pos] = 0; // terminating null + return copy; +@@ -354,14 +354,148 @@ + outputStream* gclog_or_tty; + extern Mutex* tty_lock; + ++#define EXTRACHARLEN 32 ++#define CURRENTAPPX ".current" ++#define FILENAMEBUFLEN 1024 ++// convert YYYY-MM-DD HH:MM:SS to YYYY-MM-DD_HH-MM-SS ++char* get_datetime_string(char *buf, size_t len) { ++ os::local_time_string(buf, len); ++ int i = (int)strlen(buf); ++ while (i-- >= 0) { ++ if (buf[i] == ' ') buf[i] = '_'; ++ else if (buf[i] == ':') buf[i] = '-'; ++ } ++ return buf; ++} ++ ++static const char* make_log_name_internal(const char* log_name, const char* force_directory, ++ int pid, const char* tms) { ++ const char* basename = log_name; ++ char file_sep = os::file_separator()[0]; ++ const char* cp; ++ char pid_text[32]; ++ ++ for (cp = log_name; *cp != '\0'; cp++) { ++ if (*cp == '/' || *cp == file_sep) { ++ basename = cp + 1; ++ } ++ } ++ const char* nametail = log_name; ++ // Compute buffer length ++ size_t buffer_length; ++ if (force_directory != NULL) { ++ buffer_length = strlen(force_directory) + strlen(os::file_separator()) + ++ strlen(basename) + 1; ++ } else { ++ buffer_length = strlen(log_name) + 1; ++ } ++ ++ // const char* star = strchr(basename, '*'); ++ const char* pts = strstr(basename, "%p"); ++ int pid_pos = (pts == NULL) ? -1 : (pts - nametail); ++ ++ if (pid_pos >= 0) { ++ jio_snprintf(pid_text, sizeof(pid_text), "pid%u", pid); ++ buffer_length += strlen(pid_text); ++ } ++ ++ pts = strstr(basename, "%t"); ++ int tms_pos = (pts == NULL) ? -1 : (pts - nametail); ++ if (tms_pos >= 0) { ++ buffer_length += strlen(tms); ++ } ++ ++ // File name is too long. ++ if (buffer_length > JVM_MAXPATHLEN) { ++ return NULL; ++ } ++ ++ // Create big enough buffer. ++ char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal); ++ ++ strcpy(buf, ""); ++ if (force_directory != NULL) { ++ strcat(buf, force_directory); ++ strcat(buf, os::file_separator()); ++ nametail = basename; // completely skip directory prefix ++ } ++ ++ // who is first, %p or %t? ++ int first = -1, second = -1; ++ const char *p1st = NULL; ++ const char *p2nd = NULL; ++ ++ if (pid_pos >= 0 && tms_pos >= 0) { ++ // contains both %p and %t ++ if (pid_pos < tms_pos) { ++ // case foo%pbar%tmonkey.log ++ first = pid_pos; ++ p1st = pid_text; ++ second = tms_pos; ++ p2nd = tms; ++ } else { ++ // case foo%tbar%pmonkey.log ++ first = tms_pos; ++ p1st = tms; ++ second = pid_pos; ++ p2nd = pid_text; ++ } ++ } else if (pid_pos >= 0) { ++ // contains %p only ++ first = pid_pos; ++ p1st = pid_text; ++ } else if (tms_pos >= 0) { ++ // contains %t only ++ first = tms_pos; ++ p1st = tms; ++ } ++ ++ int buf_pos = (int)strlen(buf); ++ const char* tail = nametail; ++ ++ if (first >= 0) { ++ tail = nametail + first + 2; ++ strncpy(&buf[buf_pos], nametail, first); ++ strcpy(&buf[buf_pos + first], p1st); ++ buf_pos = (int)strlen(buf); ++ if (second >= 0) { ++ strncpy(&buf[buf_pos], tail, second - first - 2); ++ strcpy(&buf[buf_pos + second - first - 2], p2nd); ++ tail = nametail + second + 2; ++ } ++ } ++ strcat(buf, tail); // append rest of name, or all of name ++ return buf; ++} ++ ++// log_name comes from -XX:LogFile=log_name or -Xloggc:log_name ++// in log_name, %p => pipd1234 and ++// %t => YYYY-MM-DD_HH-MM-SS ++static const char* make_log_name(const char* log_name, const char* force_directory) { ++ char timestr[32]; ++ get_datetime_string(timestr, sizeof(timestr)); ++ return make_log_name_internal(log_name, force_directory, os::current_process_id(), ++ timestr); ++} ++ + fileStream::fileStream(const char* file_name) { + _file = fopen(file_name, "w"); +- _need_close = true; ++ if (_file != NULL) { ++ _need_close = true; ++ } else { ++ warning("Cannot open file %s due to %s\n", file_name, strerror(errno)); ++ _need_close = false; ++ } + } + + fileStream::fileStream(const char* file_name, const char* opentype) { + _file = fopen(file_name, opentype); +- _need_close = true; ++ if (_file != NULL) { ++ _need_close = true; ++ } else { ++ warning("Cannot open file %s due to %s\n", file_name, strerror(errno)); ++ _need_close = false; ++ } + } + + void fileStream::write(const char* s, size_t len) { +@@ -422,34 +556,51 @@ + update_position(s, len); + } + +-rotatingFileStream::~rotatingFileStream() { ++// dump vm version, os version, platform info, build id, ++// memory usage and command line flags into header ++void gcLogFileStream::dump_loggc_header() { ++ if (is_open()) { ++ print_cr(Abstract_VM_Version::internal_vm_info_string()); ++ os::print_memory_info(this); ++ print("CommandLine flags: "); ++ CommandLineFlags::printSetFlags(this); ++ } ++} ++ ++gcLogFileStream::~gcLogFileStream() { + if (_file != NULL) { + if (_need_close) fclose(_file); +- _file = NULL; ++ _file = NULL; ++ } ++ if (_file_name != NULL) { + FREE_C_HEAP_ARRAY(char, _file_name, mtInternal); + _file_name = NULL; + } + } + +-rotatingFileStream::rotatingFileStream(const char* file_name) { ++gcLogFileStream::gcLogFileStream(const char* file_name) { + _cur_file_num = 0; + _bytes_written = 0L; +- _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal); +- jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); +- _file = fopen(_file_name, "w"); +- _need_close = true; ++ _file_name = make_log_name(file_name, NULL); ++ ++ // gc log file rotation ++ if (UseGCLogFileRotation && NumberOfGCLogFiles > 1) { ++ char tempbuf[FILENAMEBUFLEN]; ++ jio_snprintf(tempbuf, sizeof(tempbuf), "%s.%d" CURRENTAPPX, _file_name, _cur_file_num); ++ _file = fopen(tempbuf, "w"); ++ } else { ++ _file = fopen(_file_name, "w"); ++ } ++ if (_file != NULL) { ++ _need_close = true; ++ dump_loggc_header(); ++ } else { ++ warning("Cannot open file %s due to %s\n", _file_name, strerror(errno)); ++ _need_close = false; ++ } + } + +-rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) { +- _cur_file_num = 0; +- _bytes_written = 0L; +- _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal); +- jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); +- _file = fopen(_file_name, opentype); +- _need_close = true; +-} +- +-void rotatingFileStream::write(const char* s, size_t len) { ++void gcLogFileStream::write(const char* s, size_t len) { + if (_file != NULL) { + size_t count = fwrite(s, 1, len, _file); + _bytes_written += count; +@@ -465,8 +616,13 @@ + // write to gc log file at safepoint. If in future, changes made for mutator threads or + // concurrent GC threads to run parallel with VMThread at safepoint, write and rotate_log + // must be synchronized. +-void rotatingFileStream::rotate_log() { +- if (_bytes_written < (jlong)GCLogFileSize) { ++void gcLogFileStream::rotate_log(bool force, outputStream* out) { ++ char time_msg[FILENAMEBUFLEN]; ++ char time_str[EXTRACHARLEN]; ++ char current_file_name[FILENAMEBUFLEN]; ++ char renamed_file_name[FILENAMEBUFLEN]; ++ ++ if (!should_rotate(force)) { + return; + } + +@@ -480,27 +636,105 @@ + // rotate in same file + rewind(); + _bytes_written = 0L; ++ jio_snprintf(time_msg, sizeof(time_msg), "File %s rotated at %s\n", ++ _file_name, os::local_time_string((char *)time_str, sizeof(time_str))); ++ write(time_msg, strlen(time_msg)); ++ ++ if (out != NULL) { ++ out->print(time_msg); ++ } ++ ++ dump_loggc_header(); + return; + } + +- // rotate file in names file.0, file.1, file.2, ..., file.<MaxGCLogFileNumbers-1> +- // close current file, rotate to next file ++#if defined(_WINDOWS) ++#ifndef F_OK ++#define F_OK 0 ++#endif ++#endif // _WINDOWS ++ ++ // rotate file in names extended_filename.0, extended_filename.1, ..., ++ // extended_filename.<NumberOfGCLogFiles - 1>. Current rotation file name will ++ // have a form of extended_filename.<i>.current where i is the current rotation ++ // file number. After it reaches max file size, the file will be saved and renamed ++ // with .current removed from its tail. ++ size_t filename_len = strlen(_file_name); + if (_file != NULL) { +- _cur_file_num ++; +- if (_cur_file_num >= NumberOfGCLogFiles) _cur_file_num = 0; +- jio_snprintf(_file_name, strlen(Arguments::gc_log_filename()) + 10, "%s.%d", +- Arguments::gc_log_filename(), _cur_file_num); ++ jio_snprintf(renamed_file_name, filename_len + EXTRACHARLEN, "%s.%d", ++ _file_name, _cur_file_num); ++ jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX, ++ _file_name, _cur_file_num); ++ ++ const char* msg = force ? "GC log rotation request has been received." ++ : "GC log file has reached the maximum size."; ++ jio_snprintf(time_msg, sizeof(time_msg), "%s %s Saved as %s\n", ++ os::local_time_string((char *)time_str, sizeof(time_str)), ++ msg, renamed_file_name); ++ write(time_msg, strlen(time_msg)); ++ ++ if (out != NULL) { ++ out->print(time_msg); ++ } ++ + fclose(_file); + _file = NULL; ++ ++ bool can_rename = true; ++ if (access(current_file_name, F_OK) != 0) { ++ // current file does not exist? ++ warning("No source file exists, cannot rename\n"); ++ can_rename = false; ++ } ++ if (can_rename) { ++ if (access(renamed_file_name, F_OK) == 0) { ++ if (remove(renamed_file_name) != 0) { ++ warning("Could not delete existing file %s\n", renamed_file_name); ++ can_rename = false; ++ } ++ } else { ++ // file does not exist, ok to rename ++ } ++ } ++ if (can_rename && rename(current_file_name, renamed_file_name) != 0) { ++ warning("Could not rename %s to %s\n", _file_name, renamed_file_name); ++ } + } +- _file = fopen(_file_name, "w"); ++ ++ _cur_file_num++; ++ if (_cur_file_num > NumberOfGCLogFiles - 1) _cur_file_num = 0; ++ jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX, ++ _file_name, _cur_file_num); ++ _file = fopen(current_file_name, "w"); ++ + if (_file != NULL) { + _bytes_written = 0L; + _need_close = true; ++ // reuse current_file_name for time_msg ++ jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, ++ "%s.%d", _file_name, _cur_file_num); ++ jio_snprintf(time_msg, sizeof(time_msg), "%s GC log file created %s\n", ++ os::local_time_string((char *)time_str, sizeof(time_str)), ++ current_file_name); ++ write(time_msg, strlen(time_msg)); ++ ++ if (out != NULL) { ++ out->print(time_msg); ++ } ++ ++ dump_loggc_header(); ++ // remove the existing file ++ if (access(current_file_name, F_OK) == 0) { ++ if (remove(current_file_name) != 0) { ++ warning("Could not delete existing file %s\n", current_file_name); ++ } ++ } + } else { +- tty->print_cr("failed to open rotation log file %s due to %s\n", ++ warning("failed to open rotation log file %s due to %s\n" ++ "Turned off GC log file rotation\n", + _file_name, strerror(errno)); + _need_close = false; ++ FLAG_SET_DEFAULT(UseGCLogFileRotation, false); + } + } + +@@ -529,147 +763,55 @@ + return _log_file != NULL; + } + +-static const char* make_log_name(const char* log_name, const char* force_directory) { +- const char* basename = log_name; +- char file_sep = os::file_separator()[0]; +- const char* cp; +- for (cp = log_name; *cp != '\0'; cp++) { +- if (*cp == '/' || *cp == file_sep) { +- basename = cp+1; +- } +- } +- const char* nametail = log_name; +- +- // Compute buffer length +- size_t buffer_length; +- if (force_directory != NULL) { +- buffer_length = strlen(force_directory) + strlen(os::file_separator()) + +- strlen(basename) + 1; +- } else { +- buffer_length = strlen(log_name) + 1; ++fileStream* defaultStream::open_file(const char* log_name) { ++ const char* try_name = make_log_name(log_name, NULL); ++ if (try_name == NULL) { ++ warning("Cannot open file %s: file name is too long.\n", log_name); ++ return NULL; + } + +- const char* star = strchr(basename, '*'); +- int star_pos = (star == NULL) ? -1 : (star - nametail); +- int skip = 1; +- if (star == NULL) { +- // Try %p +- star = strstr(basename, "%p"); +- if (star != NULL) { +- skip = 2; +- } +- } +- star_pos = (star == NULL) ? -1 : (star - nametail); +- +- char pid[32]; +- if (star_pos >= 0) { +- jio_snprintf(pid, sizeof(pid), "%u", os::current_process_id()); +- buffer_length += strlen(pid); ++ fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); ++ FREE_C_HEAP_ARRAY(char, try_name, mtInternal); ++ if (file->is_open()) { ++ return file; + } + +- // Create big enough buffer. +- char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal); +- +- strcpy(buf, ""); +- if (force_directory != NULL) { +- strcat(buf, force_directory); +- strcat(buf, os::file_separator()); +- nametail = basename; // completely skip directory prefix ++ // Try again to open the file in the temp directory. ++ delete file; ++ char warnbuf[O_BUFLEN*2]; ++ jio_snprintf(warnbuf, sizeof(warnbuf), "Warning: Cannot open log file: %s\n", log_name); ++ // Note: This feature is for maintainer use only. No need for L10N. ++ jio_print(warnbuf); ++ try_name = make_log_name(log_name, os::get_temp_directory()); ++ if (try_name == NULL) { ++ warning("Cannot open file %s: file name is too long for directory %s.\n", log_name, os::get_temp_directory()); ++ return NULL; + } + +- if (star_pos >= 0) { +- // convert foo*bar.log or foo%pbar.log to foo123bar.log +- int buf_pos = (int) strlen(buf); +- strncpy(&buf[buf_pos], nametail, star_pos); +- strcpy(&buf[buf_pos + star_pos], pid); +- nametail += star_pos + skip; // skip prefix and pid format ++ jio_snprintf(warnbuf, sizeof(warnbuf), ++ "Warning: Forcing option -XX:LogFile=%s\n", try_name); ++ jio_print(warnbuf); ++ ++ file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); ++ FREE_C_HEAP_ARRAY(char, try_name, mtInternal); ++ if (file->is_open()) { ++ return file; + } + +- strcat(buf, nametail); // append rest of name, or all of name +- return buf; ++ delete file; ++ return NULL; + } + + void defaultStream::init_log() { + // %%% Need a MutexLocker? + const char* log_name = LogFile != NULL ? LogFile : "hotspot.log"; +- const char* try_name = make_log_name(log_name, NULL); +- fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); +- if (!file->is_open()) { +- // Try again to open the file. +- char warnbuf[O_BUFLEN*2]; +- jio_snprintf(warnbuf, sizeof(warnbuf), +- "Warning: Cannot open log file: %s\n", try_name); +- // Note: This feature is for maintainer use only. No need for L10N. +- jio_print(warnbuf); +- FREE_C_HEAP_ARRAY(char, try_name, mtInternal); +- try_name = make_log_name("hs_pid%p.log", os::get_temp_directory()); +- jio_snprintf(warnbuf, sizeof(warnbuf), +- "Warning: Forcing option -XX:LogFile=%s\n", try_name); +- jio_print(warnbuf); +- delete file; +- file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); +- FREE_C_HEAP_ARRAY(char, try_name, mtInternal); +- } +- if (file->is_open()) { ++ fileStream* file = open_file(log_name); ++ ++ if (file != NULL) { + _log_file = file; +- xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file); +- _outer_xmlStream = xs; +- if (this == tty) xtty = xs; +- // Write XML header. +- xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>"); +- // (For now, don't bother to issue a DTD for this private format.) +- jlong time_ms = os::javaTimeMillis() - tty->time_stamp().milliseconds(); +- // %%% Should be: jlong time_ms = os::start_time_milliseconds(), if +- // we ever get round to introduce that method on the os class +- xs->head("hotspot_log version='%d %d'" +- " process='%d' time_ms='"INT64_FORMAT"'", +- LOG_MAJOR_VERSION, LOG_MINOR_VERSION, +- os::current_process_id(), time_ms); +- // Write VM version header immediately. +- xs->head("vm_version"); +- xs->head("name"); xs->text("%s", VM_Version::vm_name()); xs->cr(); +- xs->tail("name"); +- xs->head("release"); xs->text("%s", VM_Version::vm_release()); xs->cr(); +- xs->tail("release"); +- xs->head("info"); xs->text("%s", VM_Version::internal_vm_info_string()); xs->cr(); +- xs->tail("info"); +- xs->tail("vm_version"); +- // Record information about the command-line invocation. +- xs->head("vm_arguments"); // Cf. Arguments::print_on() +- if (Arguments::num_jvm_flags() > 0) { +- xs->head("flags"); +- Arguments::print_jvm_flags_on(xs->text()); +- xs->tail("flags"); +- } +- if (Arguments::num_jvm_args() > 0) { +- xs->head("args"); +- Arguments::print_jvm_args_on(xs->text()); +- xs->tail("args"); +- } +- if (Arguments::java_command() != NULL) { +- xs->head("command"); xs->text()->print_cr("%s", Arguments::java_command()); +- xs->tail("command"); +- } +- if (Arguments::sun_java_launcher() != NULL) { +- xs->head("launcher"); xs->text()->print_cr("%s", Arguments::sun_java_launcher()); +- xs->tail("launcher"); +- } +- if (Arguments::system_properties() != NULL) { +- xs->head("properties"); +- // Print it as a java-style property list. +- // System properties don't generally contain newlines, so don't bother with unparsing. +- for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) { +- xs->text()->print_cr("%s=%s", p->key(), p->value()); +- } +- xs->tail("properties"); +- } +- xs->tail("vm_arguments"); +- // tty output per se is grouped under the <tty>...</tty> element. +- xs->head("tty"); +- // All further non-markup text gets copied to the tty: +- xs->_text = this; // requires friend declaration! ++ _outer_xmlStream = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file); ++ start_log(); + } else { +- delete(file); + // and leave xtty as NULL + LogVMOutput = false; + DisplayVMOutput = true; +@@ -677,6 +819,64 @@ + } + } + ++void defaultStream::start_log() { ++ xmlStream* xs = _outer_xmlStream; ++ if (this == tty) xtty = xs; ++ // Write XML header. ++ xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>"); ++ // (For now, don't bother to issue a DTD for this private format.) ++ jlong time_ms = os::javaTimeMillis() - tty->time_stamp().milliseconds(); ++ // %%% Should be: jlong time_ms = os::start_time_milliseconds(), if ++ // we ever get round to introduce that method on the os class ++ xs->head("hotspot_log version='%d %d'" ++ " process='%d' time_ms='"INT64_FORMAT"'", ++ LOG_MAJOR_VERSION, LOG_MINOR_VERSION, ++ os::current_process_id(), time_ms); ++ // Write VM version header immediately. ++ xs->head("vm_version"); ++ xs->head("name"); xs->text("%s", VM_Version::vm_name()); xs->cr(); ++ xs->tail("name"); ++ xs->head("release"); xs->text("%s", VM_Version::vm_release()); xs->cr(); ++ xs->tail("release"); ++ xs->head("info"); xs->text("%s", VM_Version::internal_vm_info_string()); xs->cr(); ++ xs->tail("info"); ++ xs->tail("vm_version"); ++ // Record information about the command-line invocation. ++ xs->head("vm_arguments"); // Cf. Arguments::print_on() ++ if (Arguments::num_jvm_flags() > 0) { ++ xs->head("flags"); ++ Arguments::print_jvm_flags_on(xs->text()); ++ xs->tail("flags"); ++ } ++ if (Arguments::num_jvm_args() > 0) { ++ xs->head("args"); ++ Arguments::print_jvm_args_on(xs->text()); ++ xs->tail("args"); ++ } ++ if (Arguments::java_command() != NULL) { ++ xs->head("command"); xs->text()->print_cr("%s", Arguments::java_command()); ++ xs->tail("command"); ++ } ++ if (Arguments::sun_java_launcher() != NULL) { ++ xs->head("launcher"); xs->text()->print_cr("%s", Arguments::sun_java_launcher()); ++ xs->tail("launcher"); ++ } ++ if (Arguments::system_properties() != NULL) { ++ xs->head("properties"); ++ // Print it as a java-style property list. ++ // System properties don't generally contain newlines, so don't bother with unparsing. ++ for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) { ++ xs->text()->print_cr("%s=%s", p->key(), p->value()); ++ } ++ xs->tail("properties"); ++ } ++ xs->tail("vm_arguments"); ++ // tty output per se is grouped under the <tty>...</tty> element. ++ xs->head("tty"); ++ // All further non-markup text gets copied to the tty: ++ xs->_text = this; // requires friend declaration! ++} ++ + // finish_log() is called during normal VM shutdown. finish_log_on_error() is + // called by ostream_abort() after a fatal error. + // +@@ -876,11 +1076,8 @@ + + gclog_or_tty = tty; // default to tty + if (Arguments::gc_log_filename() != NULL) { +- fileStream * gclog = UseGCLogFileRotation ? +- new(ResourceObj::C_HEAP, mtInternal) +- rotatingFileStream(Arguments::gc_log_filename()) : +- new(ResourceObj::C_HEAP, mtInternal) +- fileStream(Arguments::gc_log_filename()); ++ fileStream * gclog = new(ResourceObj::C_HEAP, mtInternal) ++ gcLogFileStream(Arguments::gc_log_filename()); + if (gclog->is_open()) { + // now we update the time stamp of the GC log to be synced up + // with tty. +@@ -1038,6 +1235,50 @@ + } + + #ifndef PRODUCT ++void test_loggc_filename() { ++ const char* o_result; ++ ++ { ++ // longest filename ++ char longest_name[JVM_MAXPATHLEN]; ++ memset(longest_name, 'a', sizeof(longest_name)); ++ longest_name[JVM_MAXPATHLEN - 1] = '\0'; ++ o_result = make_log_name((const char*)&longest_name, NULL); ++ assert(strcmp(longest_name, o_result) == 0, err_msg("longest name does not match. expected '%s' but got '%s'", longest_name, o_result)); ++ FREE_C_HEAP_ARRAY(char, o_result, mtInternal); ++ } ++ ++ { ++ // too long file name ++ char too_long_name[JVM_MAXPATHLEN + 100]; ++ int too_long_length = sizeof(too_long_name); ++ memset(too_long_name, 'a', too_long_length); ++ too_long_name[too_long_length - 1] = '\0'; ++ o_result = make_log_name((const char*)&too_long_name, NULL); ++ assert(o_result == NULL, err_msg("Too long file name should return NULL, but got '%s'", o_result)); ++ } ++ ++ { ++ // too long with pid ++ char longest_name[JVM_MAXPATHLEN]; ++ memset(longest_name, 'a', JVM_MAXPATHLEN); ++ longest_name[JVM_MAXPATHLEN - 3] = '%'; ++ longest_name[JVM_MAXPATHLEN - 2] = 'p'; ++ longest_name[JVM_MAXPATHLEN - 1] = '\0'; ++ o_result = make_log_name((const char*)&longest_name, NULL); ++ assert(o_result == NULL, err_msg("Too long file name after %%p pid expansion should return NULL, but got '%s'", o_result)); ++ } ++ ++ { ++ // too long with pid (star) ++ char longest_name[JVM_MAXPATHLEN]; ++ memset(longest_name, 'a', JVM_MAXPATHLEN); ++ longest_name[JVM_MAXPATHLEN - 2] = '*'; ++ longest_name[JVM_MAXPATHLEN - 1] = '\0'; ++ o_result = make_log_name((const char*)&longest_name, NULL); ++ assert(o_result == NULL, err_msg("Too long file name after star (pid) expansion should return NULL, but got '%s'", o_result)); ++ } ++} + + #if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE) + #include <sys/types.h> +--- ./hotspot/src/share/vm/utilities/ostream.hpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/ostream.hpp Mon Jan 05 11:51:17 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -113,7 +113,7 @@ + // flushing + virtual void flush() {} + virtual void write(const char* str, size_t len) = 0; +- virtual void rotate_log() {} // GC log rotation ++ virtual void rotate_log(bool force, outputStream* out = NULL) {} // GC log rotation + virtual ~outputStream() {} // close properly on deletion + + void dec_cr() { dec(); cr(); } +@@ -228,20 +228,31 @@ + void flush() {}; + }; + +-class rotatingFileStream : public fileStream { ++class gcLogFileStream : public fileStream { + protected: +- char* _file_name; ++ const char* _file_name; + jlong _bytes_written; +- uintx _cur_file_num; // current logfile rotation number, from 0 to MaxGCLogFileNumbers-1 ++ uintx _cur_file_num; // current logfile rotation number, from 0 to NumberOfGCLogFiles-1 + public: +- rotatingFileStream(const char* file_name); +- rotatingFileStream(const char* file_name, const char* opentype); +- rotatingFileStream(FILE* file) : fileStream(file) {} +- ~rotatingFileStream(); ++ gcLogFileStream(const char* file_name); ++ ~gcLogFileStream(); + virtual void write(const char* c, size_t len); +- virtual void rotate_log(); ++ virtual void rotate_log(bool force, outputStream* out = NULL); ++ void dump_loggc_header(); ++ ++ /* If "force" sets true, force log file rotation from outside JVM */ ++ bool should_rotate(bool force) { ++ return force || ++ ((GCLogFileSize != 0) && ((uintx)_bytes_written >= GCLogFileSize)); ++ } ++ + }; + ++#ifndef PRODUCT ++// unit test for checking -Xloggc:<filename> parsing result ++void test_loggc_filename(); ++#endif ++ + void ostream_init(); + void ostream_init_log(); + void ostream_exit(); +--- ./hotspot/src/share/vm/utilities/vmError.cpp Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/vmError.cpp Mon Jan 05 11:51:17 2015 -0800 +@@ -22,6 +22,7 @@ + * + */ + ++#include <fcntl.h> + #include "precompiled.hpp" + #include "compiler/compileBroker.hpp" + #include "gc_interface/collectedHeap.hpp" +@@ -924,7 +925,7 @@ + bool copy_ok = + Arguments::copy_expand_pid(ErrorFile, strlen(ErrorFile), buffer, sizeof(buffer)); + if (copy_ok) { +- fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666); ++ fd = open(buffer, O_RDWR | O_CREAT | O_EXCL, 0666); + } + } + +@@ -935,7 +936,7 @@ + // so use the default name in the current directory + jio_snprintf(&buffer[len], sizeof(buffer)-len, "%shs_err_pid%u.log", + os::file_separator(), os::current_process_id()); +- fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666); ++ fd = open(buffer, O_RDWR | O_CREAT | O_EXCL, 0666); + } + + if (fd == -1) { +@@ -944,7 +945,7 @@ + if (tmpdir != NULL && tmpdir[0] != '\0') { + jio_snprintf(buffer, sizeof(buffer), "%s%shs_err_pid%u.log", + tmpdir, os::file_separator(), os::current_process_id()); +- fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666); ++ fd = open(buffer, O_RDWR | O_CREAT | O_EXCL, 0666); + } + } + +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/EscapeAnalysis/TestAllocatedEscapesPtrComparison.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,107 @@ ++/* ++ * Copyright 2014 Google, Inc. All Rights Reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8043354 ++ * @summary bcEscapeAnalyzer allocated_escapes not conservative enough ++ * @run main/othervm -XX:CompileOnly=.visitAndPop TestAllocatedEscapesPtrComparison ++ * @author Chuck Rasbold rasbold@google.com ++ */ ++ ++/* ++ * Test always passes with -XX:-OptmimizePtrCompare ++ */ ++ ++import java.util.ArrayList; ++import java.util.List; ++ ++public class TestAllocatedEscapesPtrComparison { ++ ++ static TestAllocatedEscapesPtrComparison dummy; ++ ++ class Marker { ++ } ++ ++ List<Marker> markerList = new ArrayList<>(); ++ ++ // Suppress compilation of this method, it must be processed ++ // by the bytecode escape analyzer. ++ ++ // Make a new marker and put it on the List ++ Marker getMarker() { ++ // result escapes through markerList ++ final Marker result = new Marker(); ++ markerList.add(result); ++ return result; ++ } ++ ++ void visit(int depth) { ++ // Make a new marker ++ getMarker(); ++ ++ // Call visitAndPop every once in a while ++ // Cap the depth of our recursive visits ++ if (depth % 10 == 2) { ++ visitAndPop(depth + 1); ++ } else if (depth < 15) { ++ visit(depth + 1); ++ } ++ } ++ ++ void visitAndPop(int depth) { ++ // Random dummy allocation to force EscapeAnalysis to process this method ++ dummy = new TestAllocatedEscapesPtrComparison(); ++ ++ // Make a new marker ++ Marker marker = getMarker(); ++ ++ visit(depth + 1); ++ ++ // Walk and pop the marker list up to the current marker ++ boolean found = false; ++ for (int i = markerList.size() - 1; i >= 0; i--) { ++ Marker removed = markerList.remove(i); ++ ++ // In the failure, EA mistakenly converts this comparison to false ++ if (removed == marker) { ++ found = true; ++ break; ++ } ++ } ++ ++ if (!found) { ++ throw new RuntimeException("test fails"); ++ } ++ } ++ ++ ++ public static void main(String args[]) { ++ TestAllocatedEscapesPtrComparison tc = new TestAllocatedEscapesPtrComparison(); ++ ++ // Warmup and run enough times ++ for (int i = 0; i < 20000; i++) { ++ tc.visit(0); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,73 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8011646 ++ * @summary SEGV in compiled code with loop predication ++ * @run main/othervm -XX:-TieredCompilation -XX:CompileOnly=TestHashCode.m1,Object.hashCode TestHashCode ++ * ++ */ ++ ++public class TestHashCode { ++ static class A { ++ int i; ++ } ++ ++ static class B extends A { ++ } ++ ++ static boolean crash = false; ++ ++ static A m2() { ++ if (crash) { ++ return null; ++ } ++ return new A(); ++ } ++ ++ static int m1(A aa) { ++ int res = 0; ++ for (int i = 0; i < 10; i++) { ++ A a = m2(); ++ int j = a.i; ++ if (aa instanceof B) { ++ } ++ res += a.hashCode(); ++ } ++ return res; ++ } ++ ++ public static void main(String[] args) { ++ A a = new A(); ++ for (int i = 0; i < 20000; i++) { ++ m1(a); ++ } ++ crash = true; ++ try { ++ m1(a); ++ } catch (NullPointerException e) { ++ System.out.println("Test passed"); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestPrintGCDetails.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,57 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestPrintGCDetails ++ * @bug 8010738 ++ * @summary Ensure that the PrintGCDetails for a full GC with G1 includes PermGen size info. ++ * @key gc ++ * @key regression ++ * @library /testlibrary ++ */ ++ ++import com.oracle.java.testlibrary.ProcessTools; ++import com.oracle.java.testlibrary.OutputAnalyzer; ++ ++public class TestPrintGCDetails { ++ public static void main(String[] args) throws Exception { ++ ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-XX:+PrintGCDetails", ++ SystemGCTest.class.getName()); ++ ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ ++ System.out.println("Output:\n" + output.getOutput()); ++ ++ output.shouldContain("Perm"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ static class SystemGCTest { ++ public static void main(String [] args) { ++ System.out.println("Calling System.gc()"); ++ System.gc(); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/heap_inspection/TestG1ConcurrentGCHeapDump.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestG1ConcurrentGCHeapDump ++ * @bug 8038925 ++ * @summary Checks that a heap dump can be made with G1 when no fullgc ++ * has been made ++ * @run main/othervm -Xms512m -Xmx1024m -XX:+ExplicitGCInvokesConcurrent TestG1ConcurrentGCHeapDump ++ */ ++import java.util.List; ++import java.util.ArrayList; ++import java.util.LinkedList; ++ ++import javax.management.MBeanServer; ++import java.lang.management.ManagementFactory; ++import java.lang.management.GarbageCollectorMXBean; ++ ++import sun.management.ManagementFactoryHelper; ++import com.sun.management.HotSpotDiagnosticMXBean; ++import com.sun.management.VMOption; ++ ++import java.io.IOException; ++ ++import java.io.File; ++import java.nio.file.Path; ++import java.nio.file.Paths; ++import java.nio.file.Files; ++ ++public class TestG1ConcurrentGCHeapDump { ++ ++ private static final String HOTSPOT_BEAN_NAME = ++ "com.sun.management:type=HotSpotDiagnostic"; ++ ++ private static final String G1_OLD_BEAN_NAME = ++ "java.lang:type=GarbageCollector,name=G1 Old Generation"; ++ ++ private static MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ++ ++ private static void dumpHeap() throws IOException { ++ HotSpotDiagnosticMXBean hotspot_bean = ++ ManagementFactory.newPlatformMXBeanProxy(server, ++ HOTSPOT_BEAN_NAME, HotSpotDiagnosticMXBean.class); ++ ++ Path dir = Files.createTempDirectory("JDK-8038925_"); ++ String file = dir + File.separator + "heapdump"; ++ hotspot_bean.dumpHeap(file, false); ++ Files.delete(Paths.get(file)); ++ Files.delete(dir); ++ } ++ ++ private static void verifyNoFullGC() throws IOException { ++ GarbageCollectorMXBean g1_old_bean = ++ ManagementFactory.newPlatformMXBeanProxy(server, ++ G1_OLD_BEAN_NAME, GarbageCollectorMXBean.class); ++ ++ if (g1_old_bean.getCollectionCount() != 0) { ++ throw new RuntimeException("A full GC has occured, this test will not work."); ++ } ++ } ++ ++ public static void main(String[] args) throws IOException { ++ HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean(); ++ VMOption option = diagnostic.getVMOption("UseG1GC"); ++ if (option.getValue().equals("false")) { ++ System.out.println("Skipping this test. It is only a G1 test."); ++ return; ++ } ++ ++ // Create some dead objects ++ ArrayList<List<Integer>> arraylist = new ArrayList<List<Integer>>(); ++ for (int i = 0; i < 2; i++) { ++ for (int j = 0; j < 100; j++) { ++ LinkedList<Integer> li = new LinkedList<Integer>(); ++ arraylist.add(li); ++ for (int k = 0; k < 10000; k++) { ++ li.add(k); ++ } ++ } ++ arraylist = new ArrayList<List<Integer>>(); ++ System.gc(); ++ } ++ // Try to dump heap ++ dumpHeap(); ++ // Make sure no full GC has happened, since test won't work if that is the case ++ verifyNoFullGC(); ++ } ++} +--- ./hotspot/test/runtime/7051189/Xchecksig.sh Mon Sep 08 12:15:04 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,126 +0,0 @@ +-# +-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +- +-# @test Xchecksig.sh +-# @bug 7051189 +-# @summary Need to suppress info message if -xcheck:jni used with libjsig.so +-# @run shell Xchecksig.sh +-# +- +-if [ "${TESTSRC}" = "" ] +-then +- TESTSRC=${PWD} +- echo "TESTSRC not set. Using "${TESTSRC}" as default" +-fi +-echo "TESTSRC=${TESTSRC}" +-## Adding common setup Variables for running shell tests. +-. ${TESTSRC}/../../test_env.sh +- +-OS=`uname -s` +-case "$OS" in +- Windows_* | CYGWIN_* ) +- printf "Not testing libjsig.so on Windows. PASSED.\n " +- exit 0 +- ;; +-esac +- +-JAVA=${TESTJAVA}${FS}bin${FS}java +- +-# LD_PRELOAD arch needs to match the binary we run, so run the java +-# 64-bit binary directly if we are testing 64-bit (bin/ARCH/java). +-# Check if TESTVMOPS contains -d64, but cannot use +-# java ${TESTVMOPS} to run "java -d64" with LD_PRELOAD. +- +-if [ ${OS} -eq "SunOS" ] +-then +- printf "SunOS test TESTVMOPTS = ${TESTVMOPTS}" +- printf ${TESTVMOPTS} | grep d64 > /dev/null +- if [ $? -eq 0 ] +- then +- printf "SunOS 64-bit test\n" +- BIT_FLAG=-d64 +- fi +-fi +- +-ARCH=`uname -p` +-case $ARCH in +- i386) +- if [ X${BIT_FLAG} != "X" ] +- then +- ARCH=amd64 +- JAVA=${TESTJAVA}${FS}bin${FS}${ARCH}${FS}java +- fi +- ;; +- sparc) +- if [ X${BIT_FLAG} != "X" ] +- then +- ARCH=sparcv9 +- JAVA=${TESTJAVA}${FS}bin${FS}${ARCH}${FS}java +- fi +- ;; +- * ) +- printf "Not testing architecture $ARCH, skipping test.\n" +- exit 0 +- ;; +-esac +- +-LIBJSIG=${COMPILEJAVA}${FS}jre${FS}lib${FS}${ARCH}${FS}libjsig.so +- +-# If libjsig and binary do not match, skip test. +- +-A=`file ${LIBJSIG} | awk '{ print $3 }'` +-B=`file ${JAVA} | awk '{ print $3 }'` +- +-if [ $A -ne $B ] +-then +- printf "Mismatching binary and library to preload, skipping test.\n" +- exit 0 +-fi +- +-if [ ! -f ${LIBJSIG} ] +-then +- printf "Skipping test: libjsig missing for given architecture: ${LIBJSIG}\n" +- exit 0 +-fi +-# Use java -version to test, java version info appears on stderr, +-# the libjsig message we are removing appears on stdout. +- +-# grep returns zero meaning found, non-zero means not found: +- +-LD_PRELOAD=${LIBJSIG} ${JAVA} ${TESTVMOPTS} -Xcheck:jni -version 2>&1 | grep "libjsig is activated" +-if [ $? -eq 0 ]; then +- printf "Failed: -Xcheck:jni prints message when libjsig.so is loaded.\n" +- exit 1 +-fi +- +- +-LD_PRELOAD=${LIBJSIG} ${JAVA} ${TESTVMOPTS} -Xcheck:jni -verbose:jni -version 2>&1 | grep "libjsig is activated" +-if [ $? != 0 ]; then +- printf "Failed: -Xcheck:jni does not print message when libjsig.so is loaded and -verbose:jni is set.\n" +- exit 1 +-fi +- +-printf "PASSED\n" +-exit 0 +- +--- ./hotspot/test/runtime/7196045/Test7196045.java Mon Sep 08 12:15:04 2014 -0700 ++++ ./hotspot/test/runtime/7196045/Test7196045.java Mon Jan 05 11:51:17 2015 -0800 +@@ -26,7 +26,7 @@ + * @test + * @bug 7196045 + * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API. +- * @run main/othervm Test7196045 ++ * @run main/othervm -XX:+UsePerfData Test7196045 + */ + + import java.lang.management.ManagementFactory; +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/XCheckJniJsig/XCheckJSig.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,82 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 7051189 8023393 ++ * @summary Need to suppress info message if -Xcheck:jni is used with libjsig.so ++ * @library /testlibrary ++ * @run main XCheckJSig ++ */ ++ ++import java.util.*; ++import com.oracle.java.testlibrary.*; ++ ++public class XCheckJSig { ++ public static void main(String args[]) throws Throwable { ++ ++ System.out.println("Regression test for bugs 7051189 and 8023393"); ++ if (!Platform.isSolaris() && !Platform.isLinux() && !Platform.isOSX()) { ++ System.out.println("Test only applicable on Solaris, Linux, and Mac OSX, skipping"); ++ return; ++ } ++ ++ String jdk_path = System.getProperty("test.jdk"); ++ String os_arch = Platform.getOsArch(); ++ String libjsig; ++ String env_var; ++ if (Platform.isOSX()) { ++ libjsig = jdk_path + "/jre/lib/server/libjsig.dylib"; ++ env_var = "DYLD_INSERT_LIBRARIES"; ++ } else { ++ libjsig = jdk_path + "/jre/lib/" + os_arch + "/libjsig.so"; ++ env_var = "LD_PRELOAD"; ++ } ++ String java_program; ++ if (Platform.isSolaris()) { ++ // On Solaris, need to call the 64-bit Java directly in order for ++ // LD_PRELOAD to work because libjsig.so is 64-bit. ++ java_program = jdk_path + "/jre/bin/" + os_arch + "/java"; ++ } else { ++ java_program = JDKToolFinder.getJDKTool("java"); ++ } ++ // If this test fails, these might be useful to know. ++ System.out.println("libjsig: " + libjsig); ++ System.out.println("osArch: " + os_arch); ++ System.out.println("java_program: " + java_program); ++ ++ ProcessBuilder pb = new ProcessBuilder(java_program, "-Xcheck:jni", "-version"); ++ Map<String, String> env = pb.environment(); ++ env.put(env_var, libjsig); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldNotContain("libjsig is activated"); ++ output.shouldHaveExitValue(0); ++ ++ pb = new ProcessBuilder(java_program, "-Xcheck:jni", "-verbose:jni", "-version"); ++ env = pb.environment(); ++ env.put(env_var, libjsig); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("libjsig is activated"); ++ output.shouldHaveExitValue(0); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/classFileParserBug/TestEmptyBootstrapMethodsAttr.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,75 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestEmptyBootstrapMethodsAttr ++ * @bug 8041918 ++ * @library /testlibrary ++ * @summary Test empty bootstrap_methods table within BootstrapMethods attribute ++ * @compile TestEmptyBootstrapMethodsAttr.java ++ * @run main TestEmptyBootstrapMethodsAttr ++ */ ++ ++import java.io.File; ++import com.oracle.java.testlibrary.*; ++ ++public class TestEmptyBootstrapMethodsAttr { ++ ++ public static void main(String args[]) throws Throwable { ++ System.out.println("Regression test for bug 8041918"); ++ String jarFile = System.getProperty("test.src") + File.separator + "emptynumbootstrapmethods.jar"; ++ ++ // ====== extract the test case ++ ProcessBuilder pb = new ProcessBuilder(new String[] { JDKToolFinder.getJDKTool("jar"), "xvf", jarFile } ); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldHaveExitValue(0); ++ ++ // Test case #1: ++ // Try loading class with empty bootstrap_methods table where no ++ // other attributes are following BootstrapMethods in attribute table. ++ String className = "emptynumbootstrapmethods1"; ++ ++ // ======= execute test case #1 ++ // Expect a lack of main method, this implies that the class loaded correctly ++ // with an empty bootstrap_methods and did not generate a ClassFormatError. ++ pb = ProcessTools.createJavaProcessBuilder("-cp", ".", className); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldNotContain("java.lang.ClassFormatError"); ++ output.shouldContain("Main method not found in class " + className); ++ output.shouldHaveExitValue(1); ++ ++ // Test case #2: ++ // Try loading class with empty bootstrap_methods table where an ++ // AnnotationDefault attribute follows the BootstrapMethods in the attribute table. ++ className = "emptynumbootstrapmethods2"; ++ ++ // ======= execute test case #2 ++ // Expect a lack of main method, this implies that the class loaded correctly ++ // with an empty bootstrap_methods and did not generate ClassFormatError. ++ pb = ProcessTools.createJavaProcessBuilder("-cp", ".", className); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldNotContain("java.lang.ClassFormatError"); ++ output.shouldContain("Main method not found in class " + className); ++ output.shouldHaveExitValue(1); ++ } ++} +Binary file test/runtime/classFileParserBug/emptynumbootstrapmethods.jar has changed +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/classFileParserBug/emptynumbootstrapmethods1.jcod Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,68 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * This test contains a BootstrapMethods attribute with an empty ++ * bootstrap_methods table. This yields a BootstrapMethods ++ * attribute length of 2 and should not cause a ++ * java.lang.ClassFormatError to be thrown. ++ */ ++class emptynumbootstrapmethods1 { ++ 0xCAFEBABE; ++ 0; // minor version ++ 51; // version ++ [12] { // Constant Pool ++ ; // first element is empty ++ class #2; // #1 at 0x0A ++ Utf8 "emptynumbootstrapmethods1"; // #2 at 0x0D ++ class #4; // #3 at 0x1F ++ Utf8 "java/lang/Object"; // #4 at 0x22 ++ MethodHandle 5b #9; // #5 at 0x35 ++ NameAndType #7 #8; // #6 at 0x39 ++ Utf8 "equals"; // #7 at 0x3E ++ Utf8 "(Ljava/lang/Object;)Z"; // #8 at 0x47 ++ Method #3 #6; // #9 at 0x5F ++ Utf8 "equalsx"; // #10 at 0x3E ++ Utf8 "BootstrapMethods"; // #11 at 0x69 ++ } // Constant Pool ++ ++ 0x0001; // access ++ #1;// this_cpx ++ #3;// super_cpx ++ ++ [0] { // Interfaces ++ } // Interfaces ++ ++ [0] { // fields ++ } // fields ++ ++ [0] { // methods ++ } // methods ++ ++ [1] { // Attributes ++ Attr(#11, 2) { // BootstrapMethods at 0x8A ++ [0] { // bootstrap_methods ++ } ++ } // end BootstrapMethods ++ } // Attributes ++} // end class atrbsm00101m10p +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/classFileParserBug/emptynumbootstrapmethods2.jcod Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,89 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * This test contains a BootstrapMethods attribute with an empty ++ * bootstrap_methods table. This yields a BootstrapMethods ++ * attribute length of 2 and should not cause a ++ * java.lang.ClassFormatError to be thrown. To ensure that an empty ++ * bootstrap_methods table is parsed correctly, another attribute, ++ * AnnotationDefault, follows the BootstrapMethods attribute in ++ * the attribute table. ++ */ ++ ++class emptynumbootstrapmethods2 { ++ 0xCAFEBABE; ++ 0; // minor version ++ 51; // version ++ [14] { // Constant Pool ++ ; // first element is empty ++ class #2; // #1 at 0x0A ++ Utf8 "emptynumbootstrapmethods2"; // #2 at 0x0D ++ class #4; // #3 at 0x1F ++ Utf8 "java/lang/Object"; // #4 at 0x22 ++ MethodHandle 5b #9; // #5 at 0x35 ++ NameAndType #7 #8; // #6 at 0x39 ++ Utf8 "equals"; // #7 at 0x3E ++ Utf8 "(Ljava/lang/Object;)Z"; // #8 at 0x47 ++ Method #3 #6; // #9 at 0x5F ++ Utf8 "equalsx"; // #10 at 0x3E ++ Utf8 "BootstrapMethods"; // #11 at 0x69 ++ Utf8 "AnnotationDefault"; // #12 ++ Utf8 "LAnnotationDefaultI;"; // #13 ++ } // Constant Pool ++ ++ 0x0001; // access ++ #1;// this_cpx ++ #3;// super_cpx ++ ++ [0] { // Interfaces ++ } // Interfaces ++ ++ [0] { // fields ++ } // fields ++ ++ [0] { // methods ++ } // methods ++ ++ [2] { // Attributes ++ Attr(#11, 2) { // BootstrapMethods at 0x8A ++ [0] { // bootstrap_methods ++ } ++ } // end BootstrapMethods ++ ; ++ Attr(#12) { // AnnotationDefault ++ [] { // type annotations ++ { // type annotation ++ 0x00; // target_type ++ 0x00; // type_parameter_index ++ []b { // type_path ++ } ++ ++ #13; // type_index ++ [] { // element_value_pairs ++ } // element_value_pairs ++ } // type annotation ++ } // type annotations ++ } // end AnnotationDefault ++ } // Attributes ++} // end class atrbsm00101m10p +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8028623 ++ * @summary Test hashing of extended characters in Serviceability Agent. ++ * @library /testlibrary ++ * @compile -encoding utf8 Test8028623.java ++ * @run main Test8028623 ++ */ ++ ++import com.oracle.java.testlibrary.JDKToolLauncher; ++import com.oracle.java.testlibrary.OutputBuffer; ++import com.oracle.java.testlibrary.ProcessTools; ++ ++import java.io.File; ++ ++public class Test8028623 { ++ ++ public static int \u00CB = 1; ++ public static String dumpFile = "heap.out"; ++ ++ public static void main (String[] args) { ++ ++ System.out.println(\u00CB); ++ ++ try { ++ int pid = ProcessTools.getProcessId(); ++ JDKToolLauncher jmap = JDKToolLauncher.create("jmap") ++ .addToolArg("-F") ++ .addToolArg("-dump:live,format=b,file=" + dumpFile) ++ .addToolArg(Integer.toString(pid)); ++ ProcessBuilder pb = new ProcessBuilder(jmap.getCommand()); ++ OutputBuffer output = ProcessTools.getOutput(pb); ++ Process p = pb.start(); ++ int e = p.waitFor(); ++ System.out.println("stdout:"); ++ System.out.println(output.getStdout()); ++ System.out.println("stderr:"); ++ System.out.println(output.getStderr()); ++ ++ if (e != 0) { ++ throw new RuntimeException("jmap returns: " + e); ++ } ++ if (! new File(dumpFile).exists()) { ++ throw new RuntimeException("dump file NOT created: '" + dumpFile + "'"); ++ } ++ } catch (Throwable t) { ++ t.printStackTrace(); ++ throw new RuntimeException("Test failed with: " + t); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary_tests/AssertsTest.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,237 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import static com.oracle.java.testlibrary.Asserts.*; ++ ++/* @test ++ * @summary Tests the different assertions in the Assert class ++ * @library /testlibrary ++ */ ++public class AssertsTest { ++ private static class Foo implements Comparable<Foo> { ++ final int id; ++ public Foo(int id) { ++ this.id = id; ++ } ++ ++ public int compareTo(Foo f) { ++ return new Integer(id).compareTo(new Integer(f.id)); ++ } ++ } ++ ++ public static void main(String[] args) throws Exception { ++ testLessThan(); ++ testLessThanOrEqual(); ++ testEquals(); ++ testGreaterThanOrEqual(); ++ testGreaterThan(); ++ testNotEquals(); ++ testNull(); ++ testNotNull(); ++ testTrue(); ++ testFalse(); ++ } ++ ++ private static void testLessThan() throws Exception { ++ expectPass(Assertion.LT, 1, 2); ++ ++ expectFail(Assertion.LT, 2, 2); ++ expectFail(Assertion.LT, 2, 1); ++ expectFail(Assertion.LT, null, 2); ++ expectFail(Assertion.LT, 2, null); ++ } ++ ++ private static void testLessThanOrEqual() throws Exception { ++ expectPass(Assertion.LTE, 1, 2); ++ expectPass(Assertion.LTE, 2, 2); ++ ++ expectFail(Assertion.LTE, 3, 2); ++ expectFail(Assertion.LTE, null, 2); ++ expectFail(Assertion.LTE, 2, null); ++ } ++ ++ private static void testEquals() throws Exception { ++ expectPass(Assertion.EQ, 1, 1); ++ expectPass(Assertion.EQ, null, null); ++ ++ Foo f1 = new Foo(1); ++ expectPass(Assertion.EQ, f1, f1); ++ ++ Foo f2 = new Foo(1); ++ expectFail(Assertion.EQ, f1, f2); ++ expectFail(Assertion.LTE, null, 2); ++ expectFail(Assertion.LTE, 2, null); ++ } ++ ++ private static void testGreaterThanOrEqual() throws Exception { ++ expectPass(Assertion.GTE, 1, 1); ++ expectPass(Assertion.GTE, 2, 1); ++ ++ expectFail(Assertion.GTE, 1, 2); ++ expectFail(Assertion.GTE, null, 2); ++ expectFail(Assertion.GTE, 2, null); ++ } ++ ++ private static void testGreaterThan() throws Exception { ++ expectPass(Assertion.GT, 2, 1); ++ ++ expectFail(Assertion.GT, 1, 1); ++ expectFail(Assertion.GT, 1, 2); ++ expectFail(Assertion.GT, null, 2); ++ expectFail(Assertion.GT, 2, null); ++ } ++ ++ private static void testNotEquals() throws Exception { ++ expectPass(Assertion.NE, null, 1); ++ expectPass(Assertion.NE, 1, null); ++ ++ Foo f1 = new Foo(1); ++ Foo f2 = new Foo(1); ++ expectPass(Assertion.NE, f1, f2); ++ ++ expectFail(Assertion.NE, null, null); ++ expectFail(Assertion.NE, f1, f1); ++ expectFail(Assertion.NE, 1, 1); ++ } ++ ++ private static void testNull() throws Exception { ++ expectPass(Assertion.NULL, null); ++ ++ expectFail(Assertion.NULL, 1); ++ } ++ ++ private static void testNotNull() throws Exception { ++ expectPass(Assertion.NOTNULL, 1); ++ ++ expectFail(Assertion.NOTNULL, null); ++ } ++ ++ private static void testTrue() throws Exception { ++ expectPass(Assertion.TRUE, true); ++ ++ expectFail(Assertion.TRUE, false); ++ } ++ ++ private static void testFalse() throws Exception { ++ expectPass(Assertion.FALSE, false); ++ ++ expectFail(Assertion.FALSE, true); ++ } ++ ++ private static <T extends Comparable<T>> void expectPass(Assertion assertion, T ... args) ++ throws Exception { ++ Assertion.run(assertion, args); ++ } ++ ++ private static <T extends Comparable<T>> void expectFail(Assertion assertion, T ... args) ++ throws Exception { ++ try { ++ Assertion.run(assertion, args); ++ } catch (RuntimeException e) { ++ return; ++ } ++ throw new Exception("Expected " + Assertion.format(assertion, (Object[]) args) + ++ " to throw a RuntimeException"); ++ } ++ ++} ++ ++enum Assertion { ++ LT, LTE, EQ, GTE, GT, NE, NULL, NOTNULL, FALSE, TRUE; ++ ++ public static <T extends Comparable<T>> void run(Assertion assertion, T ... args) { ++ String msg = "Expected " + format(assertion, args) + " to pass"; ++ switch (assertion) { ++ case LT: ++ assertLessThan(args[0], args[1], msg); ++ break; ++ case LTE: ++ assertLessThanOrEqual(args[0], args[1], msg); ++ break; ++ case EQ: ++ assertEquals(args[0], args[1], msg); ++ break; ++ case GTE: ++ assertGreaterThanOrEqual(args[0], args[1], msg); ++ break; ++ case GT: ++ assertGreaterThan(args[0], args[1], msg); ++ break; ++ case NE: ++ assertNotEquals(args[0], args[1], msg); ++ break; ++ case NULL: ++ assertNull(args == null ? args : args[0], msg); ++ break; ++ case NOTNULL: ++ assertNotNull(args == null ? args : args[0], msg); ++ break; ++ case FALSE: ++ assertFalse((Boolean) args[0], msg); ++ break; ++ case TRUE: ++ assertTrue((Boolean) args[0], msg); ++ break; ++ default: ++ // do nothing ++ } ++ } ++ ++ public static String format(Assertion assertion, Object ... args) { ++ switch (assertion) { ++ case LT: ++ return asString("assertLessThan", args); ++ case LTE: ++ return asString("assertLessThanOrEqual", args); ++ case EQ: ++ return asString("assertEquals", args); ++ case GTE: ++ return asString("assertGreaterThanOrEquals", args); ++ case GT: ++ return asString("assertGreaterThan", args); ++ case NE: ++ return asString("assertNotEquals", args); ++ case NULL: ++ return asString("assertNull", args); ++ case NOTNULL: ++ return asString("assertNotNull", args); ++ case FALSE: ++ return asString("assertFalse", args); ++ case TRUE: ++ return asString("assertTrue", args); ++ default: ++ return ""; ++ } ++ } ++ ++ private static String asString(String assertion, Object ... args) { ++ if (args == null) { ++ return String.format("%s(null)", assertion); ++ } ++ if (args.length == 1) { ++ return String.format("%s(%s)", assertion, args[0]); ++ } else { ++ return String.format("%s(%s, %s)", assertion, args[0], args[1]); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary_tests/OutputAnalyzerReportingTest.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,124 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++/* ++ * @test ++ * @summary Test the OutputAnalyzer reporting functionality, ++ * such as printing additional diagnostic info ++ * (exit code, stdout, stderr, command line, etc.) ++ * @library /testlibrary ++ */ ++ ++import java.io.ByteArrayOutputStream; ++import java.io.PrintStream; ++ ++import com.oracle.java.testlibrary.OutputAnalyzer; ++import com.oracle.java.testlibrary.ProcessTools; ++ ++ ++public class OutputAnalyzerReportingTest { ++ ++ public static void main(String[] args) throws Exception { ++ // Create the output analyzer under test ++ String stdout = "aaaaaa"; ++ String stderr = "bbbbbb"; ++ OutputAnalyzer output = new OutputAnalyzer(stdout, stderr); ++ ++ // Expected summary values should be the same for all cases, ++ // since the outputAnalyzer object is the same ++ String expectedExitValue = "-1"; ++ String expectedSummary = ++ " stdout: [" + stdout + "];\n" + ++ " stderr: [" + stderr + "]\n" + ++ " exitValue = " + expectedExitValue + "\n"; ++ ++ ++ DiagnosticSummaryTestRunner testRunner = ++ new DiagnosticSummaryTestRunner(); ++ ++ // should have exit value ++ testRunner.init(expectedSummary); ++ int unexpectedExitValue = 2; ++ try { ++ output.shouldHaveExitValue(unexpectedExitValue); ++ } catch (RuntimeException e) { } ++ testRunner.closeAndCheckResults(); ++ ++ // should not contain ++ testRunner.init(expectedSummary); ++ try { ++ output.shouldNotContain(stdout); ++ } catch (RuntimeException e) { } ++ testRunner.closeAndCheckResults(); ++ ++ // should contain ++ testRunner.init(expectedSummary); ++ try { ++ output.shouldContain("unexpected-stuff"); ++ } catch (RuntimeException e) { } ++ testRunner.closeAndCheckResults(); ++ ++ // should not match ++ testRunner.init(expectedSummary); ++ try { ++ output.shouldNotMatch("[a]"); ++ } catch (RuntimeException e) { } ++ testRunner.closeAndCheckResults(); ++ ++ // should match ++ testRunner.init(expectedSummary); ++ try { ++ output.shouldMatch("[qwerty]"); ++ } catch (RuntimeException e) { } ++ testRunner.closeAndCheckResults(); ++ ++ } ++ ++ private static class DiagnosticSummaryTestRunner { ++ private ByteArrayOutputStream byteStream = ++ new ByteArrayOutputStream(10000); ++ ++ private String expectedSummary = ""; ++ private PrintStream errStream; ++ ++ ++ public void init(String expectedSummary) { ++ this.expectedSummary = expectedSummary; ++ byteStream.reset(); ++ errStream = new PrintStream(byteStream); ++ System.setErr(errStream); ++ } ++ ++ public void closeAndCheckResults() { ++ // check results ++ errStream.close(); ++ String stdErrStr = byteStream.toString(); ++ if (!stdErrStr.contains(expectedSummary)) { ++ throw new RuntimeException("The output does not contain " ++ + "the diagnostic message, or the message is incorrect"); ++ } ++ } ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary_tests/OutputAnalyzerTest.java Mon Jan 05 11:51:17 2015 -0800 +@@ -0,0 +1,193 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @summary Test the OutputAnalyzer utility class ++ * @library /testlibrary ++ */ ++ ++import com.oracle.java.testlibrary.OutputAnalyzer; ++ ++public class OutputAnalyzerTest { ++ ++ public static void main(String args[]) throws Exception { ++ ++ String stdout = "aaaaaa"; ++ String stderr = "bbbbbb"; ++ ++ // Regexps used for testing pattern matching of the test input ++ String stdoutPattern = "[a]"; ++ String stderrPattern = "[b]"; ++ String nonExistingPattern = "[c]"; ++ ++ OutputAnalyzer output = new OutputAnalyzer(stdout, stderr); ++ ++ if (!stdout.equals(output.getStdout())) { ++ throw new Exception("getStdout() returned '" + output.getStdout() + "', expected '" + stdout + "'"); ++ } ++ ++ if (!stderr.equals(output.getStderr())) { ++ throw new Exception("getStderr() returned '" + output.getStderr() + "', expected '" + stderr + "'"); ++ } ++ ++ try { ++ output.shouldContain(stdout); ++ output.stdoutShouldContain(stdout); ++ output.shouldContain(stderr); ++ output.stderrShouldContain(stderr); ++ } catch (RuntimeException e) { ++ throw new Exception("shouldContain() failed", e); ++ } ++ ++ try { ++ output.shouldContain("cccc"); ++ throw new Exception("shouldContain() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stdoutShouldContain(stderr); ++ throw new Exception("stdoutShouldContain() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stderrShouldContain(stdout); ++ throw new Exception("stdoutShouldContain() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.shouldNotContain("cccc"); ++ output.stdoutShouldNotContain("cccc"); ++ output.stderrShouldNotContain("cccc"); ++ } catch (RuntimeException e) { ++ throw new Exception("shouldNotContain() failed", e); ++ } ++ ++ try { ++ output.shouldNotContain(stdout); ++ throw new Exception("shouldContain() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stdoutShouldNotContain(stdout); ++ throw new Exception("shouldContain() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stderrShouldNotContain(stderr); ++ throw new Exception("shouldContain() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ // Should match ++ try { ++ output.shouldMatch(stdoutPattern); ++ output.stdoutShouldMatch(stdoutPattern); ++ output.shouldMatch(stderrPattern); ++ output.stderrShouldMatch(stderrPattern); ++ } catch (RuntimeException e) { ++ throw new Exception("shouldMatch() failed", e); ++ } ++ ++ try { ++ output.shouldMatch(nonExistingPattern); ++ throw new Exception("shouldMatch() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stdoutShouldMatch(stderrPattern); ++ throw new Exception( ++ "stdoutShouldMatch() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stderrShouldMatch(stdoutPattern); ++ throw new Exception( ++ "stderrShouldMatch() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ // Should not match ++ try { ++ output.shouldNotMatch(nonExistingPattern); ++ output.stdoutShouldNotMatch(nonExistingPattern); ++ output.stderrShouldNotMatch(nonExistingPattern); ++ } catch (RuntimeException e) { ++ throw new Exception("shouldNotMatch() failed", e); ++ } ++ ++ try { ++ output.shouldNotMatch(stdoutPattern); ++ throw new Exception("shouldNotMatch() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stdoutShouldNotMatch(stdoutPattern); ++ throw new Exception("shouldNotMatch() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ try { ++ output.stderrShouldNotMatch(stderrPattern); ++ throw new Exception("shouldNotMatch() failed to throw exception"); ++ } catch (RuntimeException e) { ++ // expected ++ } ++ ++ { ++ String aaaa = "aaaa"; ++ String result = output.firstMatch(aaaa); ++ if (!aaaa.equals(result)) { ++ throw new Exception("firstMatch(String) faild to match. Expected: " + aaaa + " got: " + result); ++ } ++ } ++ ++ { ++ String aa = "aa"; ++ String aa_grouped_aa = aa + "(" + aa + ")"; ++ String result = output.firstMatch(aa_grouped_aa, 1); ++ if (!aa.equals(result)) { ++ throw new Exception("firstMatch(String, int) failed to match. Expected: " + aa + " got: " + result); ++ } ++ } ++ } ++} +--- ./jaxp/.hgtags Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/.hgtags Mon Jan 05 11:56:34 2015 -0800 +@@ -473,11 +473,19 @@ + 45db678253587755df4a00066e42e2fce04bbb71 jdk7u65-b18 + 4e323af07c47061109fb5f585613b0cc4b4208ca jdk7u65-b19 + f3b7bb6f1924ab7f635cdd60db7fbab64576cd6d jdk7u65-b32 ++7215972c2c30d0fa469a459a3e4fcee6bc93991d jdk7u80-b00 ++4c959b6a32057ec18c9c722ada3d0d0c716a51c4 jdk7u80-b01 ++25a1b88d7a473e067471e00a5457236736e9a2e0 jdk7u80-b02 + d41f31b707c87675f3467e980b1ceef2e53b3b5d jdk7u65-b20 + d1f8566d39c56e40516a1afb304ed7c0681355d8 jdk7u67-b01 + 4e323af07c47061109fb5f585613b0cc4b4208ca jdk7u65-b40 + a5f829d7fa05cf769402dfc82c94b737b8d011b0 jdk7u65-b31 + f33ea72260ca7480f4a1405d35a3709895b491a2 jdk7u65-b33 ++d1f8566d39c56e40516a1afb304ed7c0681355d8 jdk7u67-b01 ++a9c1c53386a9b7856802a98a597a8cbf73e28fa0 jdk7u67-b31 ++e7300cd38793c7620f39be5f73b7fcba2f80555b jdk7u67-b32 ++78c4bc9bfa12cc97039fd84c5ec1cbd086a0ba35 jdk7u67-b33 ++39a6fbc6ef75eba7b3c28e8485a0665d904f21eb jdk7u67-b34 + 86e93799766d67102a37559b3831abcc825d7e24 jdk7u66-b00 + d34839cb2f15dee01cdfb1fd93378849de34d662 jdk7u66-b01 + 19e4e978c8212921104ba16d0db6bf18c6f8d0ab jdk7u66-b09 +@@ -503,3 +511,51 @@ + f7542072016b7972b383075f84df29bc05495d2e jdk7u71-b11 + 109dd4c4a07a8adfaf59e11c29e502277b803c44 jdk7u71-b12 + df2c7c9a3609f8f4b30b09c29a9cfddc8b4b90ef jdk7u71-b13 ++018049539cc25653eeba682b3ca5abcd63839d78 jdk7u71-b14 ++0e7c12377e0120b908fc594afc596ce1f5f2b234 jdk7u72-b01 ++bc5b33e920af4b34facfa85a6bf48d5f55b05116 jdk7u72-b02 ++b1f6b12c1fcac4b0ea89bf3f134324aa8968b847 jdk7u72-b03 ++f59d0ae0995d2cdb57ea482a8fa47575e0d8b57f jdk7u72-b04 ++ed071d27bf7320265d8ae527bb622f2e26e1a89c jdk7u72-b05 ++d3c5c35f617e33f673420ff9da8051c742513af3 jdk7u72-b06 ++ef0842fc31d98031ad9bb514b0f8d2db7bcf4162 jdk7u72-b07 ++89117e4403e61b9c033bcab65da30abf2219e385 jdk7u72-b08 ++7637d4b21a9e3237f129f69a0dc7132877f3ab19 jdk7u72-b09 ++a3d6d3327b32cd7fb41a144d48f957170dde3ba8 jdk7u72-b10 ++d3fbd111daa01dc1737afd0a59084e14664d581a jdk7u72-b11 ++fb713c907f33689a418c87bf721dafcdc9616ca8 jdk7u72-b12 ++8f0d267ca63ab2f9d7839604ae88fafbcc0ad2d4 jdk7u72-b13 ++fec38133453a8d70d4c528595ae1cab47909c4bd jdk7u72-b14 ++e8ab19435208726b1334ba8e7928ea154e0959b3 jdk7u72-b30 ++d8246774af472f617033202d2c58c7572da08dcd jdk7u72-b31 ++4173f90038ff1764576d08efa34109a7895f106b jdk7u75-b00 ++b9eaa7d194dd5e23bd2d53be4d57b25fdcb08e31 jdk7u75-b01 ++98eaae4f301779861be3f9a8b0854ec83074615a jdk7u75-b02 ++eb57739c7818a0dbaa39122ad35f5e48584be5df jdk7u75-b03 ++908a056c8d8fa65864cbf5745a050f675be35288 jdk7u75-b04 ++079579b6672777d71624b49b29042cd19cbccef2 jdk7u75-b05 ++967717c26bb17ff3c3aa399072eebed17c599a92 jdk7u75-b06 ++1a9565415e4142f9914b309888056f9b8f27de97 jdk7u75-b07 ++d8419be679448402af177510f1a154ca7935d24f jdk7u75-b08 ++08599c76e606df8d369d1eda03ac876ffbaafb36 jdk7u75-b09 ++d3c566dedbcde177bfa573ae3632ad21c335a03d jdk7u75-b10 ++1d6f8fbbfefc63adde96d70d74dc281616b7ac01 jdk7u75-b11 ++15f65800816f164b5855744b59fbc3d661e0511d jdk7u75-b12 ++d6c90cc2e91d58688884a8e659e79603e37d4cd5 jdk7u75-b13 ++999eb9cbf8404232a03e3a877680ca3541b8f62c jdk7u75-b30 ++4efcb94971a21562649ae01c07880139a35d3403 jdk7u75-b31 ++8405eb3c02e3f81b20faa1adf43d447e2e7b7705 jdk7u76-b00 ++f478245e2c18bd459d085c70cf7aa212b1f30dbf jdk7u76-b01 ++bb77b08b760634a87ee3c1fbb3c7a519d61d4e87 jdk7u76-b02 ++0c337b6088029d8867732a2f1e08dcc7271e6111 jdk7u76-b03 ++0d0d6c0a1ae3cae89f59491c6643fe7f12c497bc jdk7u76-b04 ++5bde0c6472681b8e508c7f54692ad3ca69c6a544 jdk7u76-b05 ++9e39563c9f33ceac879ee214bc27db3e5f1d5004 jdk7u76-b06 ++4e5b7d15fad4fc32c67a45512391c71e7e33460e jdk7u76-b07 ++aefcd8f73cfb456a133ee923859683c68338649f jdk7u76-b08 ++c6675d4d08b8d5e6a2bb9f631d8b5762f0b51cdf jdk7u76-b09 ++62e1b60c3adfd3133e3fe9f8d5194512f503c540 jdk7u76-b10 ++33040bd2deb5371a85fe7d7a9442cdf649919b39 jdk7u76-b11 ++7167fcf821b00424c0464086f4047a7209dc9e59 jdk7u76-b12 ++6262c3d41bb13f58338c4bc7946468ba70825046 jdk7u76-b13 ++d3907dca5ffc798076f44cc63f01f7beb41343a9 jdk7u76-b30 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java Mon Jan 05 11:56:34 2015 -0800 +@@ -147,8 +147,9 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = (char)c; +- load(1, false, true); ++ load(1, false, false); + } + if (c == '\r' && external) { + int cc = fCurrentEntity.ch[fCurrentEntity.position++]; +@@ -306,9 +307,10 @@ + + if (XML11Char.isXML11NameStart(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + fCurrentEntity.columnNumber++; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + return symbol; +@@ -317,9 +319,10 @@ + } + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + --fCurrentEntity.position; + --fCurrentEntity.startPosition; + return null; +@@ -332,10 +335,11 @@ + return null; + } + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(2); + fCurrentEntity.ch[0] = ch; + fCurrentEntity.ch[1] = ch2; + offset = 0; +- if (load(2, false, true)) { ++ if (load(2, false, false)) { + fCurrentEntity.columnNumber += 2; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2); + return symbol; +@@ -464,9 +468,10 @@ + + if (XML11Char.isXML11NCNameStart(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + fCurrentEntity.columnNumber++; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + return symbol; +@@ -475,9 +480,10 @@ + } + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + --fCurrentEntity.position; + --fCurrentEntity.startPosition; + return null; +@@ -490,10 +496,11 @@ + return null; + } + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(2); + fCurrentEntity.ch[0] = ch; + fCurrentEntity.ch[1] = ch2; + offset = 0; +- if (load(2, false, true)) { ++ if (load(2, false, false)) { + fCurrentEntity.columnNumber += 2; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2); + return symbol; +@@ -628,9 +635,10 @@ + + if (XML11Char.isXML11NCNameStart(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + fCurrentEntity.columnNumber++; + String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + qname.setValues(null, name, name, null); +@@ -640,9 +648,10 @@ + } + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + --fCurrentEntity.startPosition; + --fCurrentEntity.position; + return false; +@@ -655,10 +664,11 @@ + return false; + } + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(2); + fCurrentEntity.ch[0] = ch; + fCurrentEntity.ch[1] = ch2; + offset = 0; +- if (load(2, false, true)) { ++ if (load(2, false, false)) { + fCurrentEntity.columnNumber += 2; + String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2); + qname.setValues(null, name, name, null); +@@ -835,8 +845,9 @@ + load(0, true, true); + } + else if (fCurrentEntity.position == fCurrentEntity.count - 1) { ++ invokeListeners(0); + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false, true); ++ load(1, false, false); + fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; + } +@@ -976,8 +987,9 @@ + load(0, true, true); + } + else if (fCurrentEntity.position == fCurrentEntity.count - 1) { ++ invokeListeners(0); + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false, true); ++ load(1, false, false); + fCurrentEntity.startPosition = 0; + fCurrentEntity.position = 0; + } +@@ -1346,8 +1358,9 @@ + else if (c == '\n' && (cc == '\r' ) && fCurrentEntity.isExternal()) { + // handle newlines + if (fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = (char)cc; +- load(1, false, true); ++ load(1, false, false); + } + int ccc = fCurrentEntity.ch[++fCurrentEntity.position]; + if (ccc == '\n' || ccc == 0x85) { +@@ -1408,8 +1421,9 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count - 1) { ++ invokeListeners(0); + fCurrentEntity.ch[0] = (char)c; +- entityChanged = load(1, true, true); ++ entityChanged = load(1, true, false); + if (!entityChanged) { + // the load change the position to be 1, + // need to restore it when entity not changed +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java Mon Jan 05 11:56:34 2015 -0800 +@@ -538,8 +538,9 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = (char)c; +- load(1, false, true); ++ load(1, false, false); + } + if (c == '\r' && isExternal) { + if (fCurrentEntity.ch[fCurrentEntity.position++] != '\n') { +@@ -670,9 +671,10 @@ + int offset = fCurrentEntity.position; + if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = fCurrentEntity.ch[offset]; + offset = 0; +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + fCurrentEntity.columnNumber++; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + +@@ -776,10 +778,11 @@ + + if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) { + if (++fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = fCurrentEntity.ch[offset]; + offset = 0; + +- if (load(1, false, true)) { ++ if (load(1, false, false)) { + fCurrentEntity.columnNumber++; + //adding into symbol table. + //XXX We are trying to add single character in SymbolTable?????? +@@ -906,8 +909,9 @@ + if (fCurrentEntity.position == fCurrentEntity.count) { + load(0, true, true); + } else if (fCurrentEntity.position == fCurrentEntity.count - 1) { ++ invokeListeners(0); + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false, true); ++ load(1, false, false); + fCurrentEntity.position = 0; + } + +@@ -1054,8 +1058,9 @@ + if (fCurrentEntity.position == fCurrentEntity.count) { + load(0, true, true); + } else if (fCurrentEntity.position == fCurrentEntity.count - 1) { ++ invokeListeners(0); + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false, true); ++ load(1, false, false); + fCurrentEntity.position = 0; + } + +@@ -1419,8 +1424,9 @@ + } else if (c == '\n' && cc == '\r' && isExternal) { + // handle newlines + if (fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(1); + fCurrentEntity.ch[0] = (char)cc; +- load(1, false, true); ++ load(1, false, false); + } + fCurrentEntity.position++; + if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') { +@@ -1494,8 +1500,9 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count - 1) { ++ invokeListeners(0); + fCurrentEntity.ch[0] = (char)c; +- entityChanged = load(1, true, true); ++ entityChanged = load(1, true, false); + if (!entityChanged){ + // the load change the position to be 1, + // need to restore it when entity not changed +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java Mon Jan 05 11:56:34 2015 -0800 +@@ -54,6 +54,7 @@ + import com.sun.org.apache.xerces.internal.util.SymbolTable; + import com.sun.org.apache.xerces.internal.util.XMLSymbols; + import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++import com.sun.org.apache.xerces.internal.utils.XMLSecurityManager; + import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager; + import com.sun.org.apache.xerces.internal.xni.XNIException; + import com.sun.org.apache.xerces.internal.xni.grammars.Grammar; +@@ -983,6 +984,18 @@ + */ + public void reset(XMLComponentManager componentManager) throws XMLConfigurationException { + ++ XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager)componentManager.getProperty(XML_SECURITY_PROPERTY_MANAGER); ++ if (spm == null) { ++ spm = new XMLSecurityPropertyManager(); ++ setProperty(XML_SECURITY_PROPERTY_MANAGER, spm); ++ } ++ ++ XMLSecurityManager sm = (XMLSecurityManager)componentManager.getProperty(SECURITY_MANAGER); ++ if (sm == null) ++ setProperty(SECURITY_MANAGER,new XMLSecurityManager(true)); ++ ++ faccessExternalSchema = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_SCHEMA); ++ + fGrammarBucket.reset(); + + fSubGroupHandler.reset(); +@@ -1066,9 +1079,6 @@ + // get generate-synthetic-annotations feature + fSchemaHandler.setGenerateSyntheticAnnotations(componentManager.getFeature(GENERATE_SYNTHETIC_ANNOTATIONS, false)); + fSchemaHandler.reset(componentManager); +- +- XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager)componentManager.getProperty(XML_SECURITY_PROPERTY_MANAGER); +- faccessExternalSchema = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_SCHEMA); + } + + private void initGrammarBucket(){ +--- ./jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java Mon Jan 05 11:56:34 2015 -0800 +@@ -450,7 +450,8 @@ + } + + private void propagateFeatures(AbstractXMLSchema schema) { +- schema.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, fSecurityManager != null); ++ schema.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, ++ (fSecurityManager != null && fSecurityManager.isSecureProcessing())); + schema.setFeature(Constants.ORACLE_FEATURE_SERVICE_MECHANISM, fUseServicesMechanism); + String[] features = fXMLSchemaLoader.getRecognizedFeatures(); + for (int i = 0; i < features.length; ++i) { +--- ./jaxp/src/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java Mon Jan 05 11:56:34 2015 -0800 +@@ -3145,7 +3145,11 @@ + m_data.elementAt(-dataIndex+1)); + } + } +- else if (DTM.ELEMENT_NODE == type || DTM.DOCUMENT_FRAGMENT_NODE == type ++ else if (DTM.ELEMENT_NODE == type) ++ { ++ return getStringValueX(nodeHandle); ++ } ++ else if (DTM.DOCUMENT_FRAGMENT_NODE == type + || DTM.DOCUMENT_NODE == type) + { + return null; +--- ./jaxp/src/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java Mon Sep 08 12:15:56 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java Mon Jan 05 11:56:34 2015 -0800 +@@ -851,7 +851,6 @@ + ser.fDOMErrorHandler.handleError(error); + + } +- e.printStackTrace(); + throw (LSException) DOMUtil.createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace(); + } + return true; +--- ./jaxws/.hgtags Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/.hgtags Mon Jan 05 11:56:55 2015 -0800 +@@ -472,11 +472,19 @@ + dedfc93eeb5f4b28ad1a91902a0676aef0937e42 jdk7u65-b18 + db4cccbfd72fc265b736a273797963754434a7d2 jdk7u65-b19 + 0cd66509e11335fac490076cbdcb2f47c592de86 jdk7u65-b32 ++bef313c7ff7a7a829f8f6a305bf0c3738ad99795 jdk7u80-b00 ++0eb2482c3d0663c39794ec4c268acc41c4cd387b jdk7u80-b01 ++579128925dd9a0e9c529125c9e299dc0518037a5 jdk7u80-b02 + 28d868d40df0d420b87698e1215e5039d24a8ae5 jdk7u65-b20 + 1ef1681e21ca00edbc8727e849fef50637cc52d8 jdk7u67-b01 + db4cccbfd72fc265b736a273797963754434a7d2 jdk7u65-b40 + 190d885fe83b5b1801ee6d7327161254545d55a8 jdk7u65-b31 + 6cf7676aa11c053481c0806afda9fc91c2bfd782 jdk7u65-b33 ++1ef1681e21ca00edbc8727e849fef50637cc52d8 jdk7u67-b01 ++34e3554140b7f9efe2ad20fa04dfd5faf5821248 jdk7u67-b31 ++6090119e680a65addafb82f2b6227315813b7e68 jdk7u67-b32 ++aa1879afbb8dc4dd157eab31c86de2845a3cad6a jdk7u67-b33 ++a3290ceed5750bfc62a5ec5c00ee1aea125e9db3 jdk7u67-b34 + d63ca1c5bdb9fb2e36ec4afda431c0d1dfdfc07c jdk7u66-b00 + 1dce52b208a9528266c26352e03e67ec0ddb4dd7 jdk7u66-b01 + 04481967eff566b8a379a0315d2a3a255928d6ce jdk7u66-b09 +@@ -502,3 +510,51 @@ + b37043cee55ed025b04a3420908897e69c6c687f jdk7u71-b11 + 3a432d7f01ed998ee6ca2ed04e818849a3d1e0c7 jdk7u71-b12 + 9dd0dea849dd2550b58346977d9111717c1f38b2 jdk7u71-b13 ++a580f2c49eacc68a11cf0e724aec4a974fb77745 jdk7u71-b14 ++18676fc7713f5341f298a1ae2aee9e217fcdb5a5 jdk7u72-b01 ++e4bbb79df2b13cea8c24ee2e6346e1aa30645400 jdk7u72-b02 ++646f7c237e9ecde8df0fc6524b3605a89e6dc135 jdk7u72-b03 ++30d42f2fde558b4aeae26cc7bda89b2badf88aab jdk7u72-b04 ++761c40c9076aefac72bbff913e8bc088e565386f jdk7u72-b05 ++a3961ce4d5c1fd1f9cde546e62760a008b5b9d60 jdk7u72-b06 ++1153553de579fbbf8c328ea47f07accf8e2d9ac2 jdk7u72-b07 ++7b00d0359f49c82b38bb2f2faafae53eacc1a995 jdk7u72-b08 ++f16ea19cfd03274e9e1fd5367c3f4c23accf4e75 jdk7u72-b09 ++615c0d49e8927c9b03f5694df4ddb7a5e45eaf6d jdk7u72-b10 ++b34f135642cddf3c15f1fecaad320cb12cbd9472 jdk7u72-b11 ++cfa494e8b9bcd29ba59f1bfa3c365418b4102f71 jdk7u72-b12 ++d4be88d9bfbff3e41bc4121838e90160734d9805 jdk7u72-b13 ++e33bca6f8dab3e82b2dec2c52074f19a88e1267e jdk7u72-b14 ++587c4a3bfb76c03fa589f61e28ed739c537409bc jdk7u72-b30 ++4257d52e30b4054c9ce43cfe830dff2b8f740037 jdk7u72-b31 ++664724762a245f1cd9d89ccd3d3833fcb16bed80 jdk7u75-b00 ++ce5b9e0d988cb52d9e6c36edeafe60bd16280534 jdk7u75-b01 ++1b6ba791cbf7d995a81dfd1478906ebae3769ea2 jdk7u75-b02 ++033349ac9e45fd897571ff4f6e38ed48d46cd539 jdk7u75-b03 ++f1266833b5a07aa84d5da263f4a18503838286f4 jdk7u75-b04 ++bfe594779717071439b94ddc771117eedb442a25 jdk7u75-b05 ++b700cddd5754a82fca4f5465116fbba516a96667 jdk7u75-b06 ++781d7a0230eef7cbef89bb32bc0d722730c198e3 jdk7u75-b07 ++b85627d6afbb758fc244147dfdbbd287ee524eed jdk7u75-b08 ++e7aef72db8cf95b27af7c2508a02bf87b52b325b jdk7u75-b09 ++d7c340b9d530da158dce7da897f66e31e83b1366 jdk7u75-b10 ++4b36c07b29c32064abdfa6df09c381861875ddd4 jdk7u75-b11 ++5458349b0e4860662dc5a4f96363c0e714d09c65 jdk7u75-b12 ++38d474b401c6a69dfc7cea5ba79a894980fa8107 jdk7u75-b13 ++4d068ffb0b544d004792b3047c5aa9ab72b53529 jdk7u75-b30 ++2232599a19acc7c45baa0b3c70f072a47f1cbc22 jdk7u75-b31 ++5d60eecdd6b881856ddfc34e0d34f3072575662a jdk7u76-b00 ++9fed28dcccaafd49f9a4b2aee30b2babc97d4a93 jdk7u76-b01 ++7e479fddbf5d7b7840319a44d9e72562d7cfd83b jdk7u76-b02 ++2dcdee347bf25efe5e5d5242a5608547398bb7c7 jdk7u76-b03 ++42324883f9b32a6eaaf39c8e5d8ba2c65fb1015e jdk7u76-b04 ++129bfaec2a1aca5c3ca3db303dd7e7342c17e350 jdk7u76-b05 ++7c564f2cbb1cc439506a26785d07683f16b9ec40 jdk7u76-b06 ++c99e49a9c2bf9503135ad319bcdb3b3724d1af5c jdk7u76-b07 ++e98a28d564626be745026d697d7bb68a7f053ed7 jdk7u76-b08 ++7de80762ae307e56156279d84c8d1dcf73b26164 jdk7u76-b09 ++c84694b00c547056b8da98ae4c0c7c9feb06863b jdk7u76-b10 ++df2786b1daffc450d7e7e43c9d63aaf72a5cd2f0 jdk7u76-b11 ++dc818936e1050f0058d35a7a27946e4e2bfb27ee jdk7u76-b12 ++a986e4b755f388532378d595831bebece7bf72c4 jdk7u76-b13 ++260565d7fba1a2d176bd43d81b0714bd19cf4459 jdk7u76-b30 +--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/model/Message.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/model/Message.java Mon Jan 05 11:56:55 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,7 +25,6 @@ + + package com.sun.tools.internal.ws.processor.model; + +-import com.sun.tools.internal.ws.wsdl.framework.Entity; + import com.sun.tools.internal.ws.wscompile.ErrorReceiver; + import com.sun.tools.internal.ws.wscompile.AbortException; + import com.sun.tools.internal.ws.resources.ModelMessages; +@@ -177,7 +176,8 @@ + throw new AbortException(); + } + _parameters.add(p); +- _parametersByName.put(p.getName(), p); ++ String name = p.getCustomName() != null ? p.getCustomName() : p.getName(); ++ _parametersByName.put(name, p); + } + + public Parameter getParameterByName(String name) { +--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/modeler/wsdl/WSDLModeler.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/modeler/wsdl/WSDLModeler.java Mon Jan 05 11:56:55 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1757,9 +1757,9 @@ + } + + if (part.isIN()) +- setCustomizedParameterName(info.portTypeOperation, inMsg, part, param, false); ++ setCustomizedParameterName(info.bindingOperation, inMsg, part, param, false); + else if (outMsg != null) +- setCustomizedParameterName(info.portTypeOperation, outMsg, part, param, false); ++ setCustomizedParameterName(info.bindingOperation, outMsg, part, param, false); + + params.add(param); + } +--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/model/nav/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/model/nav/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,21 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { ++ + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +76,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/api/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/api/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,20 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +75,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Mon Jan 05 11:56:55 2015 -0800 +@@ -40,6 +40,8 @@ + import java.net.URI; + import java.net.URISyntaxException; + import java.net.URL; ++import java.security.AccessController; ++import java.security.PrivilegedAction; + import java.util.ArrayList; + import java.util.Calendar; + import java.util.Collections; +@@ -194,8 +196,15 @@ + + static { + +- QName[] qnames = (System.getProperty(MAP_ANYURI_TO_URI) == null) ? new QName[] { +- createXS("string"), ++ String MAP_ANYURI_TO_URI_VALUE = AccessController.doPrivileged( ++ new PrivilegedAction<String>() { ++ @Override ++ public String run() { ++ return System.getProperty(MAP_ANYURI_TO_URI); ++ } ++ } ++ ); ++ QName[] qnames = (MAP_ANYURI_TO_URI_VALUE == null) ? new QName[] { createXS("string"), + createXS("anySimpleType"), + createXS("normalizedString"), + createXS("anyURI"), +@@ -307,7 +316,7 @@ + return v.toExternalForm(); + } + }); +- if (System.getProperty(MAP_ANYURI_TO_URI) == null) { ++ if (MAP_ANYURI_TO_URI_VALUE == null) { + secondaryList.add( + new StringImpl<URI>(URI.class, createXS("string")) { + public URI parse(CharSequence text) throws SAXException { +@@ -771,17 +780,18 @@ + } + }); + primaryList.add( +- new StringImpl<BigDecimal>(BigDecimal.class, +- createXS("decimal") ++ new StringImpl<BigDecimal>(BigDecimal.class, ++ createXS("decimal") + ) { +- public BigDecimal parse(CharSequence text) { +- return DatatypeConverterImpl._parseDecimal(text.toString()); ++ public BigDecimal parse(CharSequence text) { ++ return DatatypeConverterImpl._parseDecimal(text.toString()); ++ } ++ ++ public String print(BigDecimal v) { ++ return DatatypeConverterImpl._printDecimal(v); ++ } + } +- +- public String print(BigDecimal v) { +- return DatatypeConverterImpl._printDecimal(v); +- } +- }); ++ ); + primaryList.add( + new StringImpl<QName>(QName.class, + createXS("QName") +@@ -809,7 +819,7 @@ + w.getNamespaceContext().declareNamespace(v.getNamespaceURI(),v.getPrefix(),false); + } + }); +- if (System.getProperty(MAP_ANYURI_TO_URI) != null) { ++ if (MAP_ANYURI_TO_URI_VALUE != null) { + primaryList.add( + new StringImpl<URI>(URI.class, createXS("anyURI")) { + public URI parse(CharSequence text) throws SAXException { +@@ -827,16 +837,17 @@ + }); + } + primaryList.add( +- new StringImpl<Duration>(Duration.class, createXS("duration")) { +- public String print(Duration duration) { +- return duration.toString(); ++ new StringImpl<Duration>(Duration.class, createXS("duration")) { ++ public String print(Duration duration) { ++ return duration.toString(); ++ } ++ ++ public Duration parse(CharSequence lexical) { ++ TODO.checkSpec("JSR222 Issue #42"); ++ return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString()); ++ } + } +- +- public Duration parse(CharSequence lexical) { +- TODO.checkSpec("JSR222 Issue #42"); +- return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString()); +- } +- }); ++ ); + primaryList.add( + new StringImpl<Void>(Void.class) { + // 'void' binding isn't defined by the spec, but when the JAX-RPC processes user-defined +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,20 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +75,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ArrayBeanInfoImpl.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ArrayBeanInfoImpl.java Mon Jan 05 11:56:55 2015 -0800 +@@ -79,19 +79,19 @@ + + @Override + public void startElement(UnmarshallingContext.State state, TagName ea) { +- state.target = new ArrayList(); ++ state.setTarget(new ArrayList()); + } + + @Override + public void leaveElement(UnmarshallingContext.State state, TagName ea) { +- state.target = toArray((List)state.target); ++ state.setTarget(toArray((List)state.getTarget())); + } + + @Override + public void childElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + if(ea.matches("","item")) { +- state.loader = itemLoader; +- state.receiver = this; ++ state.setLoader(itemLoader); ++ state.setReceiver(this); + } else { + super.childElement(state,ea); + } +@@ -103,9 +103,9 @@ + } + + public void receive(UnmarshallingContext.State state, Object o) { +- ((List)state.target).add(o); ++ ((List)state.getTarget()).add(o); + } +- }; ++ } + + protected Object toArray( List list ) { + int len = list.size(); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ContentHandlerAdaptor.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ContentHandlerAdaptor.java Mon Jan 05 11:56:55 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,10 +25,6 @@ + + package com.sun.xml.internal.bind.v2.runtime; + +-import java.io.IOException; +- +-import javax.xml.stream.XMLStreamException; +- + import com.sun.istack.internal.FinalArrayList; + import com.sun.istack.internal.SAXException2; + +@@ -36,6 +32,9 @@ + import org.xml.sax.SAXException; + import org.xml.sax.helpers.DefaultHandler; + ++import javax.xml.stream.XMLStreamException; ++import java.io.IOException; ++ + /** + * Receives SAX2 events and send the equivalent events to + * {@link XMLSerializer} +@@ -70,14 +69,14 @@ + private boolean containsPrefixMapping(String prefix, String uri) { + for( int i=0; i<prefixMap.size(); i+=2 ) { + if(prefixMap.get(i).equals(prefix) +- && prefixMap.get(i+1).equals(uri)) ++ && prefixMap.get(i+1).equals(uri)) + return true; + } + return false; + } + + public void startElement(String namespaceURI, String localName, String qName, Attributes atts) +- throws SAXException { ++ throws SAXException { + try { + flushText(); + +@@ -92,13 +91,13 @@ + serializer.startElement(namespaceURI,localName, p,null); + + // declare namespace events +- for( int i=0; i<prefixMap.size(); i+=2 ) { ++ for (int i = 0; i < prefixMap.size(); i += 2) { + // forcibly set this binding, instead of using declareNsUri. + // this guarantees that namespaces used in DOM will show up + // as-is in the marshalled output (instead of reassigned to something else, + // which may happen if you'd use declareNsUri.) + serializer.getNamespaceContext().force( +- prefixMap.get(i+1), prefixMap.get(i) ); ++ prefixMap.get(i + 1), prefixMap.get(i)); + } + // make sure namespaces needed by attributes are bound + for( int i=0; i<len; i++ ) { +@@ -108,7 +107,7 @@ + String prefix = getPrefix(qname); + + serializer.getNamespaceContext().declareNamespace( +- atts.getURI(i), prefix, true ); ++ atts.getURI(i), prefix, true ); + } + + serializer.endNamespaceDecls(null); +@@ -128,9 +127,10 @@ + } + } + ++ // make sure namespaces needed by attributes are bound + private String getPrefix(String qname) { + int idx = qname.indexOf(':'); +- String prefix = (idx==-1)?qname:qname.substring(0,idx); ++ String prefix = (idx == -1) ? "" : qname.substring(0, idx); + return prefix; + } + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ElementBeanInfoImpl.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ElementBeanInfoImpl.java Mon Jan 05 11:56:55 2015 -0800 +@@ -208,8 +208,8 @@ + + @Override + public final void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { +- state.loader = core; +- state.intercepter = this; ++ state.setLoader(core); ++ state.setIntercepter(this); + + // TODO: make sure there aren't too many duplicate of this code + // create the object to unmarshal +@@ -231,21 +231,21 @@ + fireBeforeUnmarshal(ElementBeanInfoImpl.this, child, state); + + context.recordOuterPeer(child); +- UnmarshallingContext.State p = state.prev; +- p.backup = p.target; +- p.target = child; ++ UnmarshallingContext.State p = state.getPrev(); ++ p.setBackup(p.getTarget()); ++ p.setTarget(child); + + core.startElement(state,ea); + } + + public Object intercept(UnmarshallingContext.State state, Object o) throws SAXException { +- JAXBElement e = (JAXBElement)state.target; +- state.target = state.backup; +- state.backup = null; ++ JAXBElement e = (JAXBElement)state.getTarget(); ++ state.setTarget(state.getBackup()); ++ state.setBackup(null); + +- if (state.nil) { ++ if (state.isNil()) { + e.setNil(true); +- state.nil = false; ++ state.setNil(false); + } + + if(o!=null) +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,20 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +75,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ValueListBeanInfoImpl.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/ValueListBeanInfoImpl.java Mon Jan 05 11:56:55 2015 -0800 +@@ -90,7 +90,7 @@ + idx = p; + } + +- state.target = toArray(r); ++ state.setTarget(toArray(r)); + } + }; + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/ArrayERProperty.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/ArrayERProperty.java Mon Jan 05 11:56:55 2015 -0800 +@@ -98,7 +98,7 @@ + UnmarshallingContext context = state.getContext(); + context.startScope(1); + // inherit the target so that our children can access its target +- state.target = state.prev.target; ++ state.setTarget(state.getPrev().getTarget()); + + // start it now, so that even if there's no children we can still return empty collection + context.getScope(0).start(acc,lister); +@@ -116,8 +116,8 @@ + super.childElement(state,ea); + return; + } +- state.loader = child.loader; +- state.receiver = child.receiver; ++ state.setLoader(child.loader); ++ state.setReceiver(child.receiver); + } + + @Override +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/SingleMapNodeProperty.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/SingleMapNodeProperty.java Mon Jan 05 11:56:55 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -147,17 +147,17 @@ + public void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + // create or obtain the Map object + try { +- target.set((BeanT)state.prev.target); ++ target.set((BeanT)state.getPrev().getTarget()); + map.set(acc.get(target.get())); + if(map.get() == null) { + map.set(ClassFactory.create(mapImplClass)); + } + map.get().clear(); +- state.target = map.get(); ++ state.setTarget(map.get()); + } catch (AccessorException e) { + // recover from error by setting a dummy Map that receives and discards the values + handleGenericException(e,true); +- state.target = new HashMap(); ++ state.setTarget(new HashMap()); + } + } + +@@ -175,7 +175,7 @@ + @Override + public void childElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + if(ea.matches(entryTag)) { +- state.loader = entryLoader; ++ state.setLoader(entryLoader); + } else { + super.childElement(state,ea); + } +@@ -195,26 +195,26 @@ + private final Loader entryLoader = new Loader(false) { + @Override + public void startElement(UnmarshallingContext.State state, TagName ea) { +- state.target = new Object[2]; // this is inefficient ++ state.setTarget(new Object[2]); // this is inefficient + } + + @Override + public void leaveElement(UnmarshallingContext.State state, TagName ea) { +- Object[] keyValue = (Object[])state.target; +- Map map = (Map) state.prev.target; ++ Object[] keyValue = (Object[])state.getTarget(); ++ Map map = (Map) state.getPrev().getTarget(); + map.put(keyValue[0],keyValue[1]); + } + + @Override + public void childElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + if(ea.matches(keyTag)) { +- state.loader = keyLoader; +- state.receiver = keyReceiver; ++ state.setLoader(keyLoader); ++ state.setReceiver(keyReceiver); + return; + } + if(ea.matches(valueTag)) { +- state.loader = valueLoader; +- state.receiver = valueReceiver; ++ state.setLoader(valueLoader); ++ state.setReceiver(valueReceiver); + return; + } + super.childElement(state,ea); +@@ -232,7 +232,7 @@ + this.index = index; + } + public void receive(UnmarshallingContext.State state, Object o) { +- ((Object[])state.target)[index] = o; ++ ((Object[])state.getTarget())[index] = o; + } + } + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,20 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +75,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Accessor.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Accessor.java Mon Jan 05 11:56:55 2015 -0800 +@@ -152,7 +152,7 @@ + + public void receive(UnmarshallingContext.State state, Object o) throws SAXException { + try { +- set((BeanT) state.target, (ValueT) o); ++ set((BeanT) state.getTarget(), (ValueT) o); + } catch (AccessorException e) { + Loader.handleGenericException(e, true); + } catch (IllegalAccessError iae) { +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,20 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +75,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/DefaultValueLoaderDecorator.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/DefaultValueLoaderDecorator.java Mon Jan 05 11:56:55 2015 -0800 +@@ -44,10 +44,10 @@ + @Override + public void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + // install the default value, but don't override the one given by the parent loader +- if(state.elementDefaultValue==null) +- state.elementDefaultValue = defaultValue; ++ if(state.getElementDefaultValue() == null) ++ state.setElementDefaultValue(defaultValue); + +- state.loader = l; ++ state.setLoader(l); + l.startElement(state,ea); + } + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/Discarder.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/Discarder.java Mon Jan 05 11:56:55 2015 -0800 +@@ -44,8 +44,8 @@ + + @Override + public void childElement(UnmarshallingContext.State state, TagName ea) { +- state.target = null; ++ state.setTarget(null); + // registering this allows the discarder to process the whole subtree. +- state.loader = this; ++ state.setLoader(this); + } + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/DomLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/DomLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -98,10 +98,10 @@ + @Override + public void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + UnmarshallingContext context = state.getContext(); +- if (state.target == null) +- state.target = new State(context); ++ if (state.getTarget() == null) ++ state.setTarget(new State(context)); + +- State s = (State) state.target; ++ State s = (State) state.getTarget(); + try { + s.declarePrefixes(context, context.getNewlyDeclaredPrefixes()); + s.handler.startElement(ea.uri, ea.local, ea.getQname(), ea.atts); +@@ -113,10 +113,10 @@ + + @Override + public void childElement(UnmarshallingContext.State state, TagName ea) throws SAXException { +- state.loader = this; +- State s = (State) state.prev.target; ++ state.setLoader(this); ++ State s = (State) state.getPrev().getTarget(); + s.depth++; +- state.target = s; ++ state.setTarget(s); + } + + @Override +@@ -124,7 +124,7 @@ + if(text.length()==0) + return; // there's no point in creating an empty Text node in DOM. + try { +- State s = (State) state.target; ++ State s = (State) state.getTarget(); + s.handler.characters(text.toString().toCharArray(),0,text.length()); + } catch( SAXException e ) { + state.getContext().handleError(e); +@@ -134,7 +134,7 @@ + + @Override + public void leaveElement(UnmarshallingContext.State state, TagName ea) throws SAXException { +- State s = (State) state.target; ++ State s = (State) state.getTarget(); + UnmarshallingContext context = state.getContext(); + + try { +@@ -156,7 +156,7 @@ + } + + // we are done +- state.target = s.getElement(); ++ state.setTarget(s.getElement()); + } + } + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/LeafPropertyLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/LeafPropertyLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -47,7 +47,7 @@ + + public void text(UnmarshallingContext.State state, CharSequence text) throws SAXException { + try { +- xacc.parse(state.prev.target,text); ++ xacc.parse(state.getPrev().getTarget(), text); + } catch (AccessorException e) { + handleGenericException(e,true); + } catch (RuntimeException e) { +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/LeafPropertyXsiLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/LeafPropertyXsiLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -55,9 +55,9 @@ + + @Override + public void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { +- state.loader = selectLoader(state, ea); +- +- state.loader.startElement(state, ea); ++ final Loader loader = selectLoader(state, ea); ++ state.setLoader(loader); ++ loader.startElement(state, ea); + } + + protected Loader selectLoader(UnmarshallingContext.State state, TagName ea) throws SAXException { +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/Loader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/Loader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -88,8 +88,8 @@ + public void childElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + // notify the error, then recover by ignoring the whole element. + reportUnexpectedChildElement(ea, true); +- state.loader = Discarder.INSTANCE; +- state.receiver = null; ++ state.setLoader(Discarder.INSTANCE); ++ state.setReceiver(null); + } + + @SuppressWarnings({"StringEquality"}) +@@ -191,10 +191,10 @@ + UnmarshallingContext context = state.getContext(); + Unmarshaller.Listener listener = context.parent.getListener(); + if(beanInfo.hasBeforeUnmarshalMethod()) { +- beanInfo.invokeBeforeUnmarshalMethod(context.parent, child, state.prev.target); ++ beanInfo.invokeBeforeUnmarshalMethod(context.parent, child, state.getPrev().getTarget()); + } + if(listener!=null) { +- listener.beforeUnmarshal(child, state.prev.target); ++ listener.beforeUnmarshal(child, state.getPrev().getTarget()); + } + } + } +@@ -211,10 +211,10 @@ + UnmarshallingContext context = state.getContext(); + Unmarshaller.Listener listener = context.parent.getListener(); + if(beanInfo.hasAfterUnmarshalMethod()) { +- beanInfo.invokeAfterUnmarshalMethod(context.parent, child, state.target); ++ beanInfo.invokeAfterUnmarshalMethod(context.parent, child, state.getTarget()); + } + if(listener!=null) +- listener.afterUnmarshal(child, state.target); ++ listener.afterUnmarshal(child, state.getTarget()); + } + } + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/ProxyLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/ProxyLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -41,7 +41,7 @@ + @Override + public final void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + Loader loader = selectLoader(state,ea); +- state.loader = loader; ++ state.setLoader(loader); + loader.startElement(state,ea); + } + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/SAXConnector.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/SAXConnector.java Mon Jan 05 11:56:55 2015 -0800 +@@ -116,17 +116,7 @@ + if( qname==null || qname.length()==0 ) + qname=local; + +- +- boolean ignorable = true; +- StructureLoader sl; +- +- // not null only if element content is processed (StructureLoader is used) +- // ugly +- if((sl = this.context.getStructureLoader()) != null) { +- ignorable = ((ClassBeanInfoImpl)sl.getBeanInfo()).hasElementOnlyContentModel(); +- } +- +- processText(ignorable); ++ processText(!context.getCurrentState().isMixed()); + + tagName.uri = uri; + tagName.local = local; +@@ -162,7 +152,7 @@ + } + + private void processText( boolean ignorable ) throws SAXException { +- if( predictor.expectText() && (!ignorable || !WhiteSpaceProcessor.isWhiteSpace(buffer))) ++ if (predictor.expectText() && (!ignorable || !WhiteSpaceProcessor.isWhiteSpace(buffer))) + next.text(buffer); + buffer.setLength(0); + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/Scope.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/Scope.java Mon Jan 05 11:56:55 2015 -0800 +@@ -97,7 +97,7 @@ + public void add( Accessor<BeanT,PropT> acc, Lister<BeanT,PropT,ItemT,PackT> lister, ItemT value) throws SAXException{ + try { + if(!hasStarted()) { +- this.bean = (BeanT)context.getCurrentState().target; ++ this.bean = (BeanT)context.getCurrentState().getTarget(); + this.acc = acc; + this.lister = lister; + this.pack = lister.startPacking(bean,acc); +@@ -121,7 +121,7 @@ + public void start( Accessor<BeanT,PropT> acc, Lister<BeanT,PropT,ItemT,PackT> lister) throws SAXException{ + try { + if(!hasStarted()) { +- this.bean = (BeanT)context.getCurrentState().target; ++ this.bean = (BeanT)context.getCurrentState().getTarget(); + this.acc = acc; + this.lister = lister; + this.pack = lister.startPacking(bean,acc); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Mon Jan 05 11:56:55 2015 -0800 +@@ -70,7 +70,7 @@ + // Quick hack until SJSXP fixes 6270116 + boolean isZephyr = readerClass.getName().equals("com.sun.xml.internal.stream.XMLReaderImpl"); + if (getBoolProp(reader,"org.codehaus.stax2.internNames") && +- getBoolProp(reader,"org.codehaus.stax2.internNsUris")) ++ getBoolProp(reader,"org.codehaus.stax2.internNsUris")) + ; // no need for interning + else + if (isZephyr) +@@ -219,8 +219,8 @@ + int nsCount = staxStreamReader.getNamespaceCount(); + for (int i = 0; i < nsCount; i++) { + visitor.startPrefixMapping( +- fixNull(staxStreamReader.getNamespacePrefix(i)), +- fixNull(staxStreamReader.getNamespaceURI(i))); ++ fixNull(staxStreamReader.getNamespacePrefix(i)), ++ fixNull(staxStreamReader.getNamespaceURI(i))); + } + + // fire startElement +@@ -310,13 +310,13 @@ + protected void handleCharacters() throws XMLStreamException, SAXException { + if( predictor.expectText() ) + buffer.append( +- staxStreamReader.getTextCharacters(), +- staxStreamReader.getTextStart(), +- staxStreamReader.getTextLength() ); ++ staxStreamReader.getTextCharacters(), ++ staxStreamReader.getTextStart(), ++ staxStreamReader.getTextLength() ); + } + + private void processText( boolean ignorable ) throws SAXException { +- if( predictor.expectText() && (!ignorable || !WhiteSpaceProcessor.isWhiteSpace(buffer))) { ++ if( predictor.expectText() && (!ignorable || !WhiteSpaceProcessor.isWhiteSpace(buffer) || context.getCurrentState().isMixed())) { + if(textReported) { + textReported = false; + } else { +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StructureLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StructureLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -171,7 +171,7 @@ + + context.recordInnerPeer(child); + +- state.target = child; ++ state.setTarget(child); + + fireBeforeUnmarshal(beanInfo, child, state); + +@@ -196,7 +196,7 @@ + String qname = atts.getQName(i); + if(atts.getURI(i).equals(WellKnownNamespace.XML_SCHEMA_INSTANCE)) + continue; // xsi:* attributes are meant to be processed by us, not by user apps. +- Object o = state.target; ++ Object o = state.getTarget(); + Map<QName,String> map = attCatchAll.get(o); + if(map==null) { + // TODO: use ClassFactory.inferImplClass(sig,knownImplClasses) +@@ -238,8 +238,8 @@ + } + } + +- state.loader = child.loader; +- state.receiver = child.receiver; ++ state.setLoader(child.loader); ++ state.setReceiver(child.receiver); + } + + @Override +@@ -261,7 +261,7 @@ + @Override + public void leaveElement(UnmarshallingContext.State state, TagName ea) throws SAXException { + state.getContext().endScope(frameSize); +- fireAfterUnmarshal(beanInfo, state.target, state.prev); ++ fireAfterUnmarshal(beanInfo, state.getTarget(), state.getPrev()); + } + + private static final QNameMap<TransducedAccessor> EMPTY = new QNameMap<TransducedAccessor>(); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/TextLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/TextLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -51,7 +51,7 @@ + + public void text(UnmarshallingContext.State state, CharSequence text) throws SAXException { + try { +- state.target = xducer.parse(text); ++ state.setTarget(xducer.parse(text)); + } catch (AccessorException e) { + handleGenericException(e,true); + } catch (RuntimeException e) { +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/UnmarshallingContext.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/UnmarshallingContext.java Mon Jan 05 11:56:55 2015 -0800 +@@ -183,20 +183,19 @@ + /** + * Loader that owns this element. + */ +- public Loader loader; ++ private Loader loader; + /** + * Once {@link #loader} is completed, this receiver + * receives the result. + */ +- public Receiver receiver; ++ private Receiver receiver; + +- public Intercepter intercepter; +- ++ private Intercepter intercepter; + + /** + * Object being unmarshalled by this {@link #loader}. + */ +- public Object target; ++ private Object target; + + /** + * Hack for making JAXBElement unmarshalling work. +@@ -225,7 +224,7 @@ + * @see ElementBeanInfoImpl.IntercepterLoader#startElement(State, TagName) + * @see ElementBeanInfoImpl.IntercepterLoader#intercept(State, Object) + */ +- public Object backup; ++ private Object backup; + + /** + * Number of {@link UnmarshallingContext#nsBind}s declared thus far. +@@ -241,17 +240,22 @@ + * or by a child {@link Loader} when + * {@link Loader#startElement(State, TagName)} is called. + */ +- public String elementDefaultValue; ++ private String elementDefaultValue; + + /** + * {@link State} for the parent element + * + * {@link State} objects form a doubly linked list. + */ +- public State prev; ++ private State prev; + private State next; + +- public boolean nil = false; ++ private boolean nil = false; ++ ++ /** ++ * specifies that we are working with mixed content ++ */ ++ private boolean mixed = false; + + /** + * Gets the context. +@@ -262,13 +266,17 @@ + + private State(State prev) { + this.prev = prev; +- if(prev!=null) ++ if(prev!=null) { + prev.next = this; ++ if (prev.mixed) // parent is in mixed mode ++ this.mixed = true; ++ } + } + + private void push() { +- if(next==null) +- allocateMoreStates(); ++ if(next==null) { ++ next = new State(this); ++ } + State n = next; + n.numNsDecl = nsLen; + current = n; +@@ -278,11 +286,71 @@ + assert prev!=null; + loader = null; + nil = false; ++ mixed = false; + receiver = null; + intercepter = null; + elementDefaultValue = null; + target = null; + current = prev; ++ next = null; ++ } ++ ++ public boolean isMixed() { ++ return mixed; ++ } ++ ++ public Object getTarget() { ++ return target; ++ } ++ ++ public void setLoader(Loader loader) { ++ if (loader instanceof StructureLoader) // set mixed mode ++ mixed = !((StructureLoader)loader).getBeanInfo().hasElementOnlyContentModel(); ++ this.loader = loader; ++ } ++ ++ public void setReceiver(Receiver receiver) { ++ this.receiver = receiver; ++ } ++ ++ public State getPrev() { ++ return prev; ++ } ++ ++ public void setIntercepter(Intercepter intercepter) { ++ this.intercepter = intercepter; ++ } ++ ++ public void setBackup(Object backup) { ++ this.backup = backup; ++ } ++ ++ public void setTarget(Object target) { ++ this.target = target; ++ } ++ ++ public Object getBackup() { ++ return backup; ++ } ++ ++ public boolean isNil() { ++ return nil; ++ } ++ ++ public void setNil(boolean nil) { ++ this.nil = nil; ++ } ++ ++ public Loader getLoader() { ++ return loader; ++ } ++ ++ public String getElementDefaultValue() { ++ return elementDefaultValue; ++ } ++ ++ public void setElementDefaultValue(String elementDefaultValue) { ++ this.elementDefaultValue = elementDefaultValue; + } + } + +@@ -322,7 +390,6 @@ + this.parent = _parent; + this.assoc = assoc; + this.root = this.current = new State(null); +- allocateMoreStates(); + } + + public void reset(InfosetScanner scanner,boolean isInplaceMode, JaxBeanInfo expectedType, IDResolver idResolver) { +@@ -369,22 +436,6 @@ + return null; + } + +- /** +- * Allocates a few more {@link State}s. +- * +- * Allocating multiple {@link State}s at once allows those objects +- * to be allocated near each other, which reduces the working set +- * of CPU. It improves the chance the relevant data is in the cache. +- */ +- private void allocateMoreStates() { +- // this method should be used only when we run out of a state. +- assert current.next==null; +- +- State s = current; +- for( int i=0; i<8; i++ ) +- s = new State(s); +- } +- + public void clearStates() { + State last = current; + while (last.next != null) last = last.next; +@@ -487,16 +538,15 @@ + } + + public void text(CharSequence pcdata) throws SAXException { +- State cur = current; + pushCoordinator(); + try { +- if(cur.elementDefaultValue!=null) { +- if(pcdata.length()==0) { ++ if (current.elementDefaultValue != null) { ++ if (pcdata.length() == 0) { + // send the default value into the unmarshaller instead +- pcdata = cur.elementDefaultValue; ++ pcdata = current.elementDefaultValue; + } + } +- cur.loader.text(cur,pcdata); ++ current.loader.text(current, pcdata); + } finally { + popCoordinator(); + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/ValuePropertyLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/ValuePropertyLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -49,18 +49,17 @@ + + public void text(UnmarshallingContext.State state, CharSequence text) throws SAXException { + try { +- xacc.parse(state.target,text); ++ xacc.parse(state.getTarget(),text); + } catch (AccessorException e) { + handleGenericException(e,true); + } catch (RuntimeException e) { +- if(state.prev != null) { +- if(state.prev.target instanceof JAXBElement) { +- ; // do nothing - issue 601 - don't report exceptions like +- // NumberFormatException when unmarshalling "nillable" element +- // (I suppose JAXBElement indicates this +- } else { ++ if(state.getPrev() != null) { ++ if (!(state.getPrev().getTarget() instanceof JAXBElement)) + handleParseConversionException(state,e); +- } ++ // else ++ // do nothing - issue 601 - don't report exceptions like ++ // NumberFormatException when unmarshalling "nillable" element ++ // (I suppose JAXBElement indicates this + } else { + handleParseConversionException(state,e); + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/XsiNilLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/XsiNilLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -62,7 +62,7 @@ + onNil(state); + boolean hasOtherAttributes = (ea.atts.getLength() - 1) > 0; + // see issues 6759703 and 565 - need to preserve attributes even if the element is nil; only when the type is stored in JAXBElement +- if (!(hasOtherAttributes && (state.prev.target instanceof JAXBElement))) { ++ if (!(hasOtherAttributes && (state.getPrev().getTarget() instanceof JAXBElement))) { + return Discarder.INSTANCE; + } + } +@@ -96,8 +96,8 @@ + @Override + protected void onNil(UnmarshallingContext.State state) throws SAXException { + try { +- acc.set(state.prev.target,null); +- state.prev.nil = true; ++ acc.set(state.getPrev().getTarget(),null); ++ state.getPrev().setNil(true); + } catch (AccessorException e) { + handleGenericException(e,true); + } +@@ -113,7 +113,7 @@ + @Override + protected void onNil(UnmarshallingContext.State state) { + // let the receiver add this to the lister +- state.target = null; ++ state.setTarget(null); + } + } + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/XsiTypeLoader.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/XsiTypeLoader.java Mon Jan 05 11:56:55 2015 -0800 +@@ -61,7 +61,7 @@ + beanInfo = defaultBeanInfo; + + Loader loader = beanInfo.getLoader(null,false); +- state.loader = loader; ++ state.setLoader(loader); + loader.startElement(state,ea); + } + +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Mon Jan 05 11:56:55 2015 -0800 +@@ -571,7 +571,8 @@ + mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler"); + mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler"); + mailMap.addMailcap("application/fastinfoset;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler"); +- mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler"); ++ // this handler seems to be not used according VCS history ... ++ // mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler"); + mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler"); + mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler"); + } +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/model/Utils.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/model/Utils.java Mon Jan 05 11:56:55 2015 -0800 +@@ -54,17 +54,20 @@ + + static { // we statically initializing REFLECTION_NAVIGATOR property + try { +- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); +- //noinspection unchecked +- final Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator"); + + // requires accessClassInPackage privilege +- AccessController.doPrivileged( +- new PrivilegedAction<Object>() { ++ final Method getInstance = AccessController.doPrivileged( ++ new PrivilegedAction<Method>() { + @Override +- public Object run() { +- getInstance.setAccessible(true); +- return null; ++ public Method run() { ++ try { ++ Method getInstance = refNav.getDeclaredMethod("getInstance"); ++ getInstance.setAccessible(true); ++ return getInstance; ++ } catch (NoSuchMethodException e) { ++ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); ++ } + } + } + ); +@@ -72,16 +75,10 @@ + //noinspection unchecked + REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null); + } catch (ClassNotFoundException e) { +- e.printStackTrace(); + throw new IllegalStateException("Can't find ReflectionNavigator class"); + } catch (InvocationTargetException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception"); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found"); + } catch (IllegalAccessException e) { +- e.printStackTrace(); + throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible"); + } catch (SecurityException e) { + LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Mon Sep 08 12:16:05 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Mon Jan 05 11:56:55 2015 -0800 +@@ -139,19 +139,12 @@ + } + + public EndpointReference readEndpointReference(final Source eprInfoset) { +- // EPR constructors are private, so we need privilege escalation. +- // this unmarshalling can only access instances of a fixed, known set of classes, +- // so doing that shouldn't introduce security vulnerability. +- return AccessController.doPrivileged(new PrivilegedAction<EndpointReference>() { +- public EndpointReference run() { +- try { +- Unmarshaller unmarshaller = eprjc.get().createUnmarshaller(); +- return (EndpointReference) unmarshaller.unmarshal(eprInfoset); +- } catch (JAXBException e) { +- throw new WebServiceException("Error creating Marshaller or marshalling.", e); +- } +- } +- }); ++ try { ++ Unmarshaller unmarshaller = eprjc.get().createUnmarshaller(); ++ return (EndpointReference) unmarshaller.unmarshal(eprInfoset); ++ } catch (JAXBException e) { ++ throw new WebServiceException("Error creating Marshaller or marshalling.", e); ++ } + } + + public <T> T getPort(EndpointReference endpointReference, Class<T> clazz, WebServiceFeature... webServiceFeatures) { +--- ./jdk/.hgtags Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/.hgtags Mon Jan 05 11:57:27 2015 -0800 +@@ -456,11 +456,19 @@ + 7f7430459adfe7b7fb65da8c3fac2ac5e3495ea1 jdk7u65-b18 + ba6cef21c369076be97dd8133fd4a158cd486bd8 jdk7u65-b19 + c3a56021fc22f886106f123d4f25b385ac6b79d7 jdk7u65-b32 ++efc8886310cbccb941f826acfad2ad51a2891be5 jdk7u80-b00 ++bc7f9d966c1df3748ef9c148eab25976cd065963 jdk7u80-b01 ++2590a9c18fdba19086712bb91a28352e9239a2be jdk7u80-b02 + 8b9d926bd35adceb99f244b7b068fedb0f220f03 jdk7u65-b20 + 5cf343beab2ce73d299d4f1a8f3b95892f9fd818 jdk7u67-b01 + ba6cef21c369076be97dd8133fd4a158cd486bd8 jdk7u65-b40 + 7b47a34063e94e1ab5636b11231d33fae92754c9 jdk7u65-b31 + 4cb63f8ca9ee8c60d6f3d0051b69acc8392bd8de jdk7u65-b33 ++5cf343beab2ce73d299d4f1a8f3b95892f9fd818 jdk7u67-b01 ++388d34a2e45c2660e7ede2a9d80949b14b5d8df9 jdk7u67-b31 ++de2b809bb95904bfd5c2ad47cf0f41c97abd5750 jdk7u67-b32 ++193d852a6dce1aaf47f1e6960e1c83936bd0e0a4 jdk7u67-b33 ++d425e2aa1a6bcdf909c9ac7f690f3e87dcf6e3f6 jdk7u67-b34 + 9ccfe70cee626ac7831cfa7b7a7eb7a88fe1cd42 jdk7u66-b00 + fc87b55d62fc1e81aaf61ff21175129b8ccc302e jdk7u66-b01 + c67e394e49429565540f04c5c2a5544f750658bb jdk7u66-b09 +@@ -486,3 +494,55 @@ + 1108ab8e3dce0318529b4bcda46ce895659bb09b jdk7u71-b11 + ae4e88c495851c43862e2fc3d1ff7b64c68f368c jdk7u71-b12 + a6cbc82d62f915cdcd6037c8b40a4590585553c7 jdk7u71-b13 ++78a7e3c7165d4c281d4f90bb2304e95ca2c96969 jdk7u71-b14 ++c76a5b2876b98194ccbeffeab76a0326bf163ba2 jdk7u72-b01 ++b02c1a8b10cd7338eb808ebfaa5a74b4997fdc8f jdk7u72-b02 ++bc98cecdab4cd4a97316a5407c91bdedc92d4bb5 jdk7u72-b03 ++b227c93ab2c91ce4b412d1cfb4f7649bff30677b jdk7u72-b04 ++dd7983c1586dd9e6e6d53bfa05d7e164329979b0 jdk7u72-b05 ++b57a21af9f6d3cd9498099c329063a671b39e3c4 jdk7u72-b06 ++9d53e2319954cc1479e190e26b110168c7073b0a jdk7u72-b07 ++584b227e8efe21dd47a616afdb4f1f2a2fd630cf jdk7u72-b08 ++2ee54b1c7203b9973e0b2ab06cf73e98886ee099 jdk7u72-b09 ++d3257f2beb42163afe64adea65b53a18d039eb0d jdk7u72-b10 ++4946dc66a0c77133a0a6e3198bd9bd1ec5ef0344 jdk7u72-b11 ++e556571078d5c8d24b527ed809d12f37f6e3745b jdk7u72-b12 ++13ed37084621a8af551ec46650c07ea96f1a22ba jdk7u72-b13 ++f4cf053f2ed3df23b756dd182061876ac9774bc5 jdk7u72-b14 ++6ef59d24666e8af5428706fc32295a5d088a48c9 jdk7u72-b30 ++550c9196d41b566e01f2d164a1b5e0aba9871f5e jdk7u72-b31 ++87f9570ca734714f981d4a47477dcc6c80a7d324 jdk7u75-b00 ++0fefa48e670a31015be985ba74e35841d0cc66c1 jdk7u75-b01 ++e885a036cc5dc0f8fa07dc0a5f55647f819f3fc5 jdk7u75-b02 ++4b81833e1c004460c78208c2529775a05f3abf80 jdk7u75-b03 ++1964c973dcc1ddb30115b7c7b6183548b3adcdf5 jdk7u75-b04 ++ec3e1e179298a41bc6b77a170e2da66efb0bae3b jdk7u75-b05 ++e9596c6470c944ff19c5198cfeb7fd979aad9120 jdk7u75-b06 ++e0afb6ec0633d18f360f074c5672fa4c2196ea39 jdk7u75-b07 ++8268d82995af433655d3db9a51b549032c19537d jdk7u75-b08 ++0a1fe04693dd9f65176c35dc0631652086795f01 jdk7u75-b09 ++c43642c55cd483f1d270e9ce55b9721fc32f900c jdk7u75-b10 ++7bac76091c46f667f69aa9e426c29cc8e3a2d861 jdk7u75-b11 ++1a37584734ff241c0c4c4382f7870efedef7e706 jdk7u75-b12 ++16043c4cefc3cc5d859d97434abbdf79a7a58e49 jdk7u75-b13 ++3778e2621fc972f88ac8a247543ad63527e7d9cd jdk7u75-b30 ++cc9469a8208838cc4adec61acf0429c17622e75b jdk7u75-b31 ++0666a58a7e584380c1b1dadb50ec67400110a9ab jdk7u76-b00 ++182b3e8a732d6b0d21bd7d602361e5276f14b886 jdk7u76-b01 ++3c743031578a431ccc1e27691b1958355d02caec jdk7u76-b02 ++5e3a73518863851da31129b815a142ad34a3d376 jdk7u76-b03 ++50322d45a16bd3f50a050f858495a586395e6095 jdk7u76-b04 ++e41867e626749cf34019f9e45493cf049acbcec4 jdk7u76-b05 ++7ca26abf06dd8e11c6d7f6ad724b8d5abc3c709d jdk7u76-b06 ++84163d4b66f0acc5301223cd25b4093780950640 jdk7u76-b07 ++81f8878be887f80e2bcd4c7f43f1da2de8d22273 jdk7u76-b08 ++81f8878be887f80e2bcd4c7f43f1da2de8d22273 jdk7u76-b08 ++0000000000000000000000000000000000000000 jdk7u76-b08 ++0000000000000000000000000000000000000000 jdk7u76-b08 ++9c008aa88919f1ab6d4337b66546f594443680b2 jdk7u76-b08 ++70371a63e6c9ff4a73a2bbb09315c4138cf25792 jdk7u76-b09 ++c67a0b63cc6971ced2e233b63ebbdec063ad81d2 jdk7u76-b10 ++e0e3c03502518c460d51d8c517b081cbd712a9c1 jdk7u76-b11 ++9af83882ca9e628f9e35634b930081271a91d561 jdk7u76-b12 ++1af0023da23e23482947b715fbf3bdfdee0d2813 jdk7u76-b13 ++c5567031a820910ded5f20f2d7fa21c433d744ca jdk7u76-b30 +--- ./jdk/make/bridge/Jabswitch/Makefile Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/bridge/Jabswitch/Makefile Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -44,7 +44,10 @@ + JAB_MANIFEST_INP = $(CLOSED_PLATFORM_SRC)/native/sun/bridge/jabswitch.manifest + JAB_MANIFEST_OUT = $(TEMPDIR)/jabswitch.exe.intermediate.manifest + +-RC_FLAGS += /fo "$(VERSIONRES)" ++RC_FLAGS += /fo "$(VERSIONRES)" \ ++ /D "JDK_FNAME=$(PROGRAM)$(EXE_SUFFIX)" \ ++ /D "JDK_INTERNAL_NAME=$(PROGRAM)" \ ++ /D "JDK_FTYPE=0x1L" + OTHER_CPPFLAGS += /MD /Fo"$(TEMPDIR)/" /Fd"$(TEMPDIR)/" /analyze- /Od /Gd /nologo /Gm /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /RTC1 /W3 /ZI /Zc:wchar_t /EHsc + LDDFLAGS += Advapi32.lib Version.lib User32.lib + +--- ./jdk/make/com/apple/osxui/Makefile Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/com/apple/osxui/Makefile Mon Jan 05 11:57:27 2015 -0800 +@@ -67,6 +67,7 @@ + + RESOURCE_BUNDLES_COMPILED_PROPERTIES += \ + com/apple/laf/resources/aqua.properties ++LOCALE_SET_DEFINITION = jre + + # + # Rules +--- ./jdk/make/com/sun/nio/Makefile Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/com/sun/nio/Makefile Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -29,13 +29,8 @@ + + BUILDDIR = ../../.. + include $(BUILDDIR)/common/Defs.gmk +- +-# MMM: disable for now +-ifneq ($(PLATFORM), macosx) + include $(BUILDDIR)/common/Subdirs.gmk + SUBDIRS = sctp +-endif +- + + all build clean clobber:: + $(SUBDIRS-loop) +--- ./jdk/make/com/sun/nio/sctp/Exportedfiles.gmk Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/com/sun/nio/sctp/Exportedfiles.gmk Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -28,6 +28,7 @@ + # + + ifneq ($(PLATFORM), windows) ++ifneq ($(PLATFORM), macosx) + FILES_export = \ + sun/nio/ch/SctpAssocChange.java \ + sun/nio/ch/SctpChannelImpl.java \ +@@ -37,3 +38,4 @@ + sun/nio/ch/SctpServerChannelImpl.java \ + sun/nio/ch/SctpStdSocketOption.java + endif ++endif +--- ./jdk/make/com/sun/nio/sctp/FILES_c.gmk Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/com/sun/nio/sctp/FILES_c.gmk Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -24,8 +24,10 @@ + # + + ifneq ($(PLATFORM),windows) ++ifneq ($(PLATFORM),macosx) + FILES_c = \ + SctpNet.c \ + SctpChannelImpl.c \ + SctpServerChannelImpl.c + endif ++endif +--- ./jdk/make/com/sun/nio/sctp/FILES_java.gmk Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/com/sun/nio/sctp/FILES_java.gmk Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + # questions. + # + FILES_java = \ +- com/sun/nio/sctp/AbstractNotificationHandler.java \ ++ com/sun/nio/sctp/AbstractNotificationHandler.java \ + com/sun/nio/sctp/Association.java \ + com/sun/nio/sctp/AssociationChangeNotification.java \ + com/sun/nio/sctp/HandlerResult.java \ +@@ -43,9 +43,13 @@ + com/sun/nio/sctp/ShutdownNotification.java \ + \ + sun/nio/ch/SctpMessageInfoImpl.java \ +- sun/nio/ch/SctpStdSocketOption.java ++ sun/nio/ch/SctpStdSocketOption.java \ ++ sun/nio/ch/SctpChannelImpl.java \ ++ sun/nio/ch/SctpMultiChannelImpl.java \ ++ sun/nio/ch/SctpServerChannelImpl.java + + ifneq ($(PLATFORM), windows) ++ifneq ($(PLATFORM), macosx) + FILES_java += \ + sun/nio/ch/SctpAssocChange.java \ + sun/nio/ch/SctpAssociationImpl.java \ +@@ -58,9 +62,5 @@ + sun/nio/ch/SctpSendFailed.java \ + sun/nio/ch/SctpServerChannelImpl.java \ + sun/nio/ch/SctpShutdown.java +-else +-FILES_java += \ +- sun/nio/ch/SctpChannelImpl.java \ +- sun/nio/ch/SctpMultiChannelImpl.java \ +- sun/nio/ch/SctpServerChannelImpl.java + endif ++endif +--- ./jdk/make/com/sun/nio/sctp/Makefile Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/com/sun/nio/sctp/Makefile Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -41,7 +41,15 @@ + include FILES_java.gmk + include Exportedfiles.gmk + ++ifeq ($(PLATFORM), windows) ++include $(BUILDDIR)/common/Classes.gmk ++endif ++ifeq ($(PLATFORM), macosx) ++include $(BUILDDIR)/common/Classes.gmk ++endif ++ + ifneq ($(PLATFORM), windows) ++ifneq ($(PLATFORM), macosx) + include $(BUILDDIR)/common/Mapfile-vers.gmk + include $(BUILDDIR)/common/Library.gmk + +@@ -67,12 +75,9 @@ + ifeq ($(PLATFORM), solaris) + #LIBSCTP = -lsctp + OTHER_LDLIBS += $(LIBSOCKET) -L$(LIBDIR)/$(LIBARCH) -lnet -lnio +-endif # PLATFORM +- +-else # windows +-include $(BUILDDIR)/common/Classes.gmk +-endif # ifneq windows +- ++endif ++endif # macosx ++endif # windows + + clean clobber:: + $(RM) -r $(CLASSDESTDIR)/com/sun/nio/sctp +--- ./jdk/make/common/Defs-linux.gmk Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/common/Defs-linux.gmk Mon Jan 05 11:57:27 2015 -0800 +@@ -191,9 +191,9 @@ + CFLAGS_REQUIRED_amd64 += -fno-omit-frame-pointer -D_LITTLE_ENDIAN + CFLAGS_REQUIRED_i586 += -fno-omit-frame-pointer -D_LITTLE_ENDIAN + CFLAGS_REQUIRED_ia64 += -fno-omit-frame-pointer -D_LITTLE_ENDIAN +-CFLAGS_REQUIRED_sparcv9 += -m64 -mcpu=v9 ++CFLAGS_REQUIRED_sparcv9 += -m64 -mcpu=v9 -D_BIG_ENDIAN + LDFLAGS_COMMON_sparcv9 += -m64 -mcpu=v9 +-CFLAGS_REQUIRED_sparc += -m32 -mcpu=v9 ++CFLAGS_REQUIRED_sparc += -m32 -mcpu=v9 -D_BIG_ENDIAN + LDFLAGS_COMMON_sparc += -m32 -mcpu=v9 + CFLAGS_REQUIRED_arm += -fsigned-char -D_LITTLE_ENDIAN + CFLAGS_REQUIRED_ppc += -fsigned-char -D_BIG_ENDIAN +--- ./jdk/make/common/internal/Resources.gmk Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/common/internal/Resources.gmk Mon Jan 05 11:57:27 2015 -0800 +@@ -225,6 +225,10 @@ + $(add-property-java-file) + $(GENSRCDIR)/%_zh_HK.java: $(SHARE_SRC)/classes/%_zh_TW.properties + $(add-property-java-file) ++ifdef PLATFORM_SRC_MACOS ++$(GENSRCDIR)/%_zh_HK.java: $(PLATFORM_SRC_MACOS)/classes/%_zh_TW.properties ++ $(add-property-java-file) ++endif + + # Simple delivery of zh_HK properties files just copies zh_TW properties files + $(CLASSDESTDIR)/%_zh_HK.properties: \ +--- ./jdk/make/java/java/mapfile-vers Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/java/java/mapfile-vers Mon Jan 05 11:57:27 2015 -0800 +@@ -275,6 +275,7 @@ + Java_sun_misc_VM_latestUserDefinedLoader; + Java_sun_misc_VM_initialize; + Java_sun_misc_VMSupport_initAgentProperties; ++ Java_sun_misc_VMSupport_getVMTemporaryDirectory; + + # ZipFile.c needs this one + throwFileNotFoundException; +--- ./jdk/make/sun/javazic/tzdata/VERSION Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/VERSION Mon Jan 05 11:57:27 2015 -0800 +@@ -1,24 +1,24 @@ + # + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# ++# + # This code is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License version 2 only, as + # published by the Free Software Foundation. Oracle designates this + # particular file as subject to the "Classpath" exception as provided + # by Oracle in the LICENSE file that accompanied this code. +-# ++# + # This code is distributed in the hope that it will be useful, but WITHOUT + # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + # version 2 for more details (a copy is included in the LICENSE file that + # accompanied this code). +-# ++# + # You should have received a copy of the GNU General Public License version + # 2 along with this work; if not, write to the Free Software Foundation, + # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# ++# + # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-tzdata2014c ++tzdata2014j +--- ./jdk/make/sun/javazic/tzdata/africa Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/africa Mon Jan 05 11:57:27 2015 -0800 +@@ -21,36 +21,35 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +-# This data is by no means authoritative; if you think you know better, ++# This file is by no means authoritative; if you think you know better, + # go ahead and edit the file (and please send any changes to +-# tz@iana.org for general use in the future). ++# tz@iana.org for general use in the future). For more, please see ++# the file CONTRIBUTING in the tz distribution. + +-# From Paul Eggert (2013-02-21): ++# From Paul Eggert (2014-10-31): + # +-# A good source for time zone historical data outside the U.S. is ++# Unless otherwise specified, the source for data through 1990 is: + # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), + # San Diego: ACS Publications, Inc. (2003). ++# Unfortunately this book contains many errors and cites no sources. + # + # Gwillim Law writes that a good source + # for recent time zone data is the International Air Transport + # Association's Standard Schedules Information Manual (IATA SSIM), + # published semiannually. Law sent in several helpful summaries +-# of the IATA's data after 1990. +-# +-# Except where otherwise noted, Shanks & Pottenger is the source for +-# entries through 1990, and IATA SSIM is the source for entries afterwards. ++# of the IATA's data after 1990. Except where otherwise noted, ++# IATA SSIM is the source for entries after 1990. + # + # Another source occasionally used is Edward W. Whitman, World Time Differences, + # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which + # I found in the UCLA library. + # + # For data circa 1899, a common source is: +-# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94 +-# <http://www.jstor.org/stable/1774359>. ++# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94. ++# http://www.jstor.org/stable/1774359 + # + # A reliable and entertaining source about time zones is + # Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997). +@@ -58,13 +57,13 @@ + # Previous editions of this database used WAT, CAT, SAT, and EAT + # for +0:00 through +3:00, respectively, + # but Mark R V Murray reports that +-# `SAST' is the official abbreviation for +2:00 in the country of South Africa, +-# `CAT' is commonly used for +2:00 in countries north of South Africa, and +-# `WAT' is probably the best name for +1:00, as the common phrase for +-# the area that includes Nigeria is ``West Africa''. +-# He has heard of ``Western Sahara Time'' for +0:00 but can find no reference. ++# 'SAST' is the official abbreviation for +2:00 in the country of South Africa, ++# 'CAT' is commonly used for +2:00 in countries north of South Africa, and ++# 'WAT' is probably the best name for +1:00, as the common phrase for ++# the area that includes Nigeria is "West Africa". ++# He has heard of "Western Sahara Time" for +0:00 but can find no reference. + # +-# To make things confusing, `WAT' seems to have been used for -1:00 long ago; ++# To make things confusing, 'WAT' seems to have been used for -1:00 long ago; + # I'd guess that this was because people needed _some_ name for -1:00, + # and at the time, far west Africa was the only major land area in -1:00. + # This usage is now obsolete, as the last use of -1:00 on the African +@@ -77,7 +76,7 @@ + # 2:00 SAST South Africa Standard Time + # and Murray suggests the following abbreviation: + # 1:00 WAT West Africa Time +-# I realize that this leads to `WAT' being used for both -1:00 and 1:00 ++# I realize that this leads to 'WAT' being used for both -1:00 and 1:00 + # for times before 1976, but this is the best I can think of + # until we get more information. + # +@@ -88,7 +87,6 @@ + # 3:00 CAST Central Africa Summer Time (no longer used) + # 3:00 SAST South Africa Summer Time (no longer used) + # 3:00 EAT East Africa Time +-# 4:00 EAST East Africa Summer Time (no longer used) + + # Algeria + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -117,9 +115,9 @@ + # Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's + # more precise 0:09:21. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 15 0:01 +- 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time +- 0:00 Algeria WE%sT 1940 Feb 25 2:00 ++Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 15 0:01 ++ 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time ++ 0:00 Algeria WE%sT 1940 Feb 25 2:00 + 1:00 Algeria CE%sT 1946 Oct 7 + 0:00 - WET 1956 Jan 29 + 1:00 - CET 1963 Apr 14 +@@ -129,92 +127,71 @@ + 1:00 - CET + + # Angola +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Luanda 0:52:56 - LMT 1892 +- 0:52:04 - AOT 1911 May 26 # Angola Time +- 1:00 - WAT +- + # Benin +-# Whitman says they switched to 1:00 in 1946, not 1934; +-# go with Shanks & Pottenger. +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Porto-Novo 0:10:28 - LMT 1912 +- 0:00 - GMT 1934 Feb 26 +- 1:00 - WAT ++# See Africa/Lagos. + + # Botswana +-# From Paul Eggert (2013-02-21): +-# Milne says they were regulated by the Cape Town Signal in 1899; +-# assume they switched to 2:00 when Cape Town did. +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Gaborone 1:43:40 - LMT 1885 +- 1:30 - SAST 1903 Mar +- 2:00 - CAT 1943 Sep 19 2:00 +- 2:00 1:00 CAST 1944 Mar 19 2:00 +- 2:00 - CAT ++# See Africa/Maputo. + + # Burkina Faso +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Ouagadougou -0:06:04 - LMT 1912 +- 0:00 - GMT ++# See Africa/Abidjan. + + # Burundi +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Bujumbura 1:57:28 - LMT 1890 +- 2:00 - CAT ++# See Africa/Maputo. + + # Cameroon +-# Whitman says they switched to 1:00 in 1920; go with Shanks & Pottenger. +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Douala 0:38:48 - LMT 1912 +- 1:00 - WAT ++# See Africa/Lagos. + + # Cape Verde ++# ++# Shanks gives 1907 for the transition to CVT. ++# Perhaps the 1911-05-26 Portuguese decree ++# http://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf ++# merely made it official? ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Atlantic/Cape_Verde -1:34:04 - LMT 1907 # Praia ++Zone Atlantic/Cape_Verde -1:34:04 - LMT 1907 # Praia + -2:00 - CVT 1942 Sep + -2:00 1:00 CVST 1945 Oct 15 +- -2:00 - CVT 1975 Nov 25 2:00 ++ -2:00 - CVT 1975 Nov 25 2:00 + -1:00 - CVT + + # Central African Republic +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Bangui 1:14:20 - LMT 1912 +- 1:00 - WAT ++# See Africa/Lagos. + + # Chad + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Ndjamena 1:00:12 - LMT 1912 ++Zone Africa/Ndjamena 1:00:12 - LMT 1912 # N'Djamena + 1:00 - WAT 1979 Oct 14 + 1:00 1:00 WAST 1980 Mar 8 + 1:00 - WAT + + # Comoros +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Comoro 2:53:04 - LMT 1911 Jul # Moroni, Gran Comoro +- 3:00 - EAT ++# See Africa/Nairobi. + +-# Democratic Republic of Congo +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Kinshasa 1:01:12 - LMT 1897 Nov 9 +- 1:00 - WAT +-Zone Africa/Lubumbashi 1:49:52 - LMT 1897 Nov 9 +- 2:00 - CAT ++# Democratic Republic of the Congo ++# See Africa/Lagos for the western part and Africa/Maputo for the eastern. + + # Republic of the Congo +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Brazzaville 1:01:08 - LMT 1912 +- 1:00 - WAT ++# See Africa/Lagos. + +-# Cote D'Ivoire ++# Côte d'Ivoire / Ivory Coast + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Abidjan -0:16:08 - LMT 1912 + 0:00 - GMT ++Link Africa/Abidjan Africa/Bamako # Mali ++Link Africa/Abidjan Africa/Banjul # Gambia ++Link Africa/Abidjan Africa/Conakry # Guinea ++Link Africa/Abidjan Africa/Dakar # Senegal ++Link Africa/Abidjan Africa/Freetown # Sierra Leone ++Link Africa/Abidjan Africa/Lome # Togo ++Link Africa/Abidjan Africa/Nouakchott # Mauritania ++Link Africa/Abidjan Africa/Ouagadougou # Burkina Faso ++Link Africa/Abidjan Africa/Sao_Tome # São Tomé and Príncipe ++Link Africa/Abidjan Atlantic/St_Helena # St Helena + + # Djibouti +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Djibouti 2:52:36 - LMT 1911 Jul +- 3:00 - EAT ++# See Africa/Nairobi. + + ############################################################################### + +@@ -254,30 +231,26 @@ + # Egyptians would approve the cancellation." + # + # Egypt to cancel daylight saving time +-# <a href="http://www.almasryalyoum.com/en/node/407168"> + # http://www.almasryalyoum.com/en/node/407168 +-# </a> + # or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_egypt04.html"> + # http://www.worldtimezone.com/dst_news/dst_news_egypt04.html +-# </a> + Rule Egypt 1995 2010 - Apr lastFri 0:00s 1:00 S +-Rule Egypt 1995 2005 - Sep lastThu 23:00s 0 - ++Rule Egypt 1995 2005 - Sep lastThu 24:00 0 - + # From Steffen Thorsen (2006-09-19): + # The Egyptian Gazette, issue 41,090 (2006-09-18), page 1, reports: + # Egypt will turn back clocks by one hour at the midnight of Thursday + # after observing the daylight saving time since May. + # http://news.gom.com.eg/gazette/pdf/2006/09/18/01.pdf +-Rule Egypt 2006 only - Sep 21 23:00s 0 - ++Rule Egypt 2006 only - Sep 21 24:00 0 - + # From Dirk Losch (2007-08-14): + # I received a mail from an airline which says that the daylight + # saving time in Egypt will end in the night of 2007-09-06 to 2007-09-07. +-# From Jesper Norgaard Welen (2007-08-15): [The following agree:] ++# From Jesper Nørgaard Welen (2007-08-15): [The following agree:] + # http://www.nentjes.info/Bill/bill5.htm + # http://www.timeanddate.com/worldclock/city.html?n=53 + # From Steffen Thorsen (2007-09-04): The official information...: + # http://www.sis.gov.eg/En/EgyptOnline/Miscellaneous/000002/0207000000000000001580.htm +-Rule Egypt 2007 only - Sep Thu>=1 23:00s 0 - ++Rule Egypt 2007 only - Sep Thu>=1 24:00 0 - + # From Abdelrahman Hassan (2007-09-06): + # Due to the Hijri (lunar Islamic calendar) year being 11 days shorter + # than the year of the Gregorian calendar, Ramadan shifts earlier each +@@ -311,15 +284,9 @@ + # + # timeanddate[2] and another site I've found[3] also support that. + # +-# [1] <a href="https://bugzilla.redhat.com/show_bug.cgi?id=492263"> +-# https://bugzilla.redhat.com/show_bug.cgi?id=492263 +-# </a> +-# [2] <a href="http://www.timeanddate.com/worldclock/clockchange.html?n=53"> +-# http://www.timeanddate.com/worldclock/clockchange.html?n=53 +-# </a> +-# [3] <a href="http://wwp.greenwichmeantime.com/time-zone/africa/egypt/"> +-# http://wwp.greenwichmeantime.com/time-zone/africa/egypt/ +-# </a> ++# [1] https://bugzilla.redhat.com/show_bug.cgi?id=492263 ++# [2] http://www.timeanddate.com/worldclock/clockchange.html?n=53 ++# [3] http://wwp.greenwichmeantime.com/time-zone/africa/egypt/ + + # From Arthur David Olson (2009-04-20): + # In 2009 (and for the next several years), Ramadan ends before the fourth +@@ -329,14 +296,10 @@ + # From Steffen Thorsen (2009-08-11): + # We have been able to confirm the August change with the Egyptian Cabinet + # Information and Decision Support Center: +-# <a href="http://www.timeanddate.com/news/time/egypt-dst-ends-2009.html"> + # http://www.timeanddate.com/news/time/egypt-dst-ends-2009.html +-# </a> + # + # The Middle East News Agency +-# <a href="http://www.mena.org.eg/index.aspx"> + # http://www.mena.org.eg/index.aspx +-# </a> + # also reports "Egypt starts winter time on August 21" + # today in article numbered "71, 11/08/2009 12:25 GMT." + # Only the title above is available without a subscription to their service, +@@ -344,67 +307,93 @@ + # (at least today). + + # From Alexander Krivenyshev (2010-07-20): +-# According to News from Egypt - Al-Masry Al-Youm Egypt's cabinet has ++# According to News from Egypt - Al-Masry Al-Youm Egypt's cabinet has + # decided that Daylight Saving Time will not be used in Egypt during + # Ramadan. + # + # Arabic translation: +-# "Clocks to go back during Ramadan--and then forward again" +-# <a href="http://www.almasryalyoum.com/en/news/clocks-go-back-during-ramadan-and-then-forward-again"> ++# "Clocks to go back during Ramadan - and then forward again" + # http://www.almasryalyoum.com/en/news/clocks-go-back-during-ramadan-and-then-forward-again +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_egypt02.html"> + # http://www.worldtimezone.com/dst_news/dst_news_egypt02.html +-# </a> + + # From Ahmad El-Dardiry (2014-05-07): + # Egypt is to change back to Daylight system on May 15 + # http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx + +-# From Gunther Vermier (2015-05-13): ++# From Gunther Vermier (2014-05-13): + # our Egypt office confirms that the change will be at 15 May "midnight" (24:00) + +-# From Paul Eggert (2014-05-13): ++# From Imed Chihi (2014-06-04): ++# We have finally "located" a precise official reference about the DST changes ++# in Egypt. The Ministers Cabinet decision is explained at ++# http://www.cabinet.gov.eg/Media/CabinetMeetingsDetails.aspx?id=347 ... ++# [T]his (Arabic) site is not accessible outside Egypt, but the page ... ++# translates into: "With regard to daylight saving time, it is scheduled to ++# take effect at exactly twelve o'clock this evening, Thursday, 15 MAY 2014, ++# to be suspended by twelve o'clock on the evening of Thursday, 26 JUN 2014, ++# and re-established again at the end of the month of Ramadan, at twelve ++# o'clock on the evening of Thursday, 31 JUL 2014." This statement has been ++# reproduced by other (more accessible) sites[, e.g.,]... ++# http://elgornal.net/news/news.aspx?id=4699258 ++ ++# From Paul Eggert (2014-06-04): + # Sarah El Deeb and Lee Keath of AP report that the Egyptian government says + # the change is because of blackouts in Cairo, even though Ahram Online (cited +-# above) says DST had no affect on electricity consumption. The AP story says +-# DST will not be observed during Ramadan. There is no information about when +-# DST will end. See: ++# above) says DST had no affect on electricity consumption. There is ++# no information about when DST will end this fall. See: + # http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833 + # +-# For now, guess that later transitions will use 2010's rules, and that +-# Egypt will agree with Morocco (see below) about the date Ramadan starts and +-# ends, though (unlike Morocco) it will switch at 00:00 standard time. In +-# Egypt the spring-forward transitions are removed for 2020-2022, when the +-# guessed spring-forward date falls during the estimated Ramadan, and all +-# transitions removed for 2023-2038, where the estimated Ramadan falls entirely +-# outside the guessed daylight-saving time. Ramadan intrudes on the guessed +-# DST starting in 2039, but that's beyond our somewhat-arbitrary cutoff. +- +-Rule Egypt 2008 only - Aug lastThu 23:00s 0 - +-Rule Egypt 2009 only - Aug 20 23:00s 0 - +-Rule Egypt 2010 only - Aug 11 0:00 0 - +-Rule Egypt 2010 only - Sep 10 0:00 1:00 S +-Rule Egypt 2010 only - Sep lastThu 23:00s 0 - ++# For now, guess that later spring and fall transitions will use ++# 2010's rules, and guess that Egypt will switch to standard time at ++# 24:00 the last Thursday before Ramadan, and back to DST at 00:00 the ++# first Friday after Ramadan. To implement this, ++# transition dates for 2015 through 2037 were determined by running ++# the following program under GNU Emacs 24.3, with the results integrated ++# by hand into the table below. Ramadan again intrudes on the guessed ++# DST starting in 2038, but that's beyond our somewhat-arbitrary cutoff. ++# (let ((islamic-year 1436)) ++# (while (< islamic-year 1460) ++# (let ((a (calendar-islamic-to-absolute (list 9 1 islamic-year))) ++# (b (calendar-islamic-to-absolute (list 10 1 islamic-year))) ++# (friday 5)) ++# (while (/= friday (mod a 7)) ++# (setq a (1- a))) ++# (while (/= friday (mod b 7)) ++# (setq b (1+ b))) ++# (setq a (1- a)) ++# (setq b (1- b)) ++# (setq a (calendar-gregorian-from-absolute a)) ++# (setq b (calendar-gregorian-from-absolute b)) ++# (insert ++# (format ++# (concat "Rule\tEgypt\t%d\tonly\t-\t%s\t%2d\t24:00\t0\t-\n" ++# "Rule\tEgypt\t%d\tonly\t-\t%s\t%2d\t24:00\t1:00\tS\n") ++# (car (cdr (cdr a))) (calendar-month-name (car a) t) (car (cdr a)) ++# (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b))))) ++# (setq islamic-year (+ 1 islamic-year)))) ++Rule Egypt 2008 only - Aug lastThu 24:00 0 - ++Rule Egypt 2009 only - Aug 20 24:00 0 - ++Rule Egypt 2010 only - Aug 10 24:00 0 - ++Rule Egypt 2010 only - Sep 9 24:00 1:00 S ++Rule Egypt 2010 only - Sep lastThu 24:00 0 - + Rule Egypt 2014 only - May 15 24:00 1:00 S +-Rule Egypt 2014 only - Jun 29 0:00s 0 - +-Rule Egypt 2014 only - Jul 29 0:00s 1:00 S +-Rule Egypt 2014 max - Sep lastThu 23:00s 0 - ++Rule Egypt 2014 only - Jun 26 24:00 0 - ++Rule Egypt 2014 only - Jul 31 24:00 1:00 S ++Rule Egypt 2014 max - Sep lastThu 24:00 0 - + Rule Egypt 2015 2019 - Apr lastFri 0:00s 1:00 S +-Rule Egypt 2015 only - Jun 18 0:00s 0 - +-Rule Egypt 2015 only - Jul 18 0:00s 1:00 S +-Rule Egypt 2016 only - Jun 7 0:00s 0 - +-Rule Egypt 2016 only - Jul 7 0:00s 1:00 S +-Rule Egypt 2017 only - May 27 0:00s 0 - +-Rule Egypt 2017 only - Jun 26 0:00s 1:00 S +-Rule Egypt 2018 only - May 16 0:00s 0 - +-Rule Egypt 2018 only - Jun 15 0:00s 1:00 S +-Rule Egypt 2019 only - May 6 0:00s 0 - +-Rule Egypt 2019 only - Jun 5 0:00s 1:00 S +-Rule Egypt 2020 only - May 24 0:00s 1:00 S +-Rule Egypt 2021 only - May 13 0:00s 1:00 S +-Rule Egypt 2022 only - May 3 0:00s 1:00 S ++Rule Egypt 2015 only - Jun 11 24:00 0 - ++Rule Egypt 2015 only - Jul 23 24:00 1:00 S ++Rule Egypt 2016 only - Jun 2 24:00 0 - ++Rule Egypt 2016 only - Jul 7 24:00 1:00 S ++Rule Egypt 2017 only - May 25 24:00 0 - ++Rule Egypt 2017 only - Jun 29 24:00 1:00 S ++Rule Egypt 2018 only - May 10 24:00 0 - ++Rule Egypt 2018 only - Jun 14 24:00 1:00 S ++Rule Egypt 2019 only - May 2 24:00 0 - ++Rule Egypt 2019 only - Jun 6 24:00 1:00 S ++Rule Egypt 2020 only - May 28 24:00 1:00 S ++Rule Egypt 2021 only - May 13 24:00 1:00 S ++Rule Egypt 2022 only - May 5 24:00 1:00 S + Rule Egypt 2023 max - Apr lastFri 0:00s 1:00 S + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +@@ -412,60 +401,44 @@ + 2:00 Egypt EE%sT + + # Equatorial Guinea +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Malabo 0:35:08 - LMT 1912 +- 0:00 - GMT 1963 Dec 15 +- 1:00 - WAT ++# See Africa/Lagos. + + # Eritrea +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Asmara 2:35:32 - LMT 1870 +- 2:35:32 - AMT 1890 # Asmara Mean Time +- 2:35:20 - ADMT 1936 May 5 # Adis Dera MT +- 3:00 - EAT +- + # Ethiopia +-# From Paul Eggert (2006-03-22): +-# Shanks & Pottenger write that Ethiopia had six narrowly-spaced time zones +-# between 1870 and 1890, and that they merged to 38E50 (2:35:20) in 1890. +-# We'll guess that 38E50 is for Adis Dera. +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Addis_Ababa 2:34:48 - LMT 1870 +- 2:35:20 - ADMT 1936 May 5 # Adis Dera MT +- 3:00 - EAT ++# See Africa/Nairobi. + + # Gabon +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Libreville 0:37:48 - LMT 1912 +- 1:00 - WAT ++# See Africa/Lagos. + + # Gambia +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Banjul -1:06:36 - LMT 1912 +- -1:06:36 - BMT 1935 # Banjul Mean Time +- -1:00 - WAT 1964 +- 0:00 - GMT ++# See Africa/Abidjan. + + # Ghana + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-# Whitman says DST was observed from 1931 to ``the present''; +-# go with Shanks & Pottenger. +-Rule Ghana 1936 1942 - Sep 1 0:00 0:20 GHST +-Rule Ghana 1936 1942 - Dec 31 0:00 0 GMT ++# Whitman says DST was observed from 1931 to "the present"; ++# Shanks & Pottenger say 1936 to 1942; ++# and September 1 to January 1 is given by: ++# Scott Keltie J, Epstein M (eds), The Statesman's Year-Book, ++# 57th ed. Macmillan, London (1920), OCLC 609408015, pp xxviii. ++# For lack of better info, assume DST was observed from 1920 to 1942. ++Rule Ghana 1920 1942 - Sep 1 0:00 0:20 GHST ++Rule Ghana 1920 1942 - Dec 31 0:00 0 GMT + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Accra -0:00:52 - LMT 1918 + 0:00 Ghana %s + + # Guinea +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Conakry -0:54:52 - LMT 1912 +- 0:00 - GMT 1934 Feb 26 +- -1:00 - WAT 1960 +- 0:00 - GMT ++# See Africa/Abidjan. + + # Guinea-Bissau ++# ++# Shanks gives 1911-05-26 for the transition to WAT, ++# evidently confusing the date of the Portuguese decree ++# http://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf ++# with the date that it took effect, namely 1912-01-01. ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Bissau -1:02:20 - LMT 1911 May 26 ++Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 + -1:00 - WAT 1975 + 0:00 - GMT + +@@ -476,13 +449,18 @@ + 2:30 - BEAT 1940 + 2:45 - BEAUT 1960 + 3:00 - EAT ++Link Africa/Nairobi Africa/Addis_Ababa # Ethiopia ++Link Africa/Nairobi Africa/Asmara # Eritrea ++Link Africa/Nairobi Africa/Dar_es_Salaam # Tanzania ++Link Africa/Nairobi Africa/Djibouti ++Link Africa/Nairobi Africa/Kampala # Uganda ++Link Africa/Nairobi Africa/Mogadishu # Somalia ++Link Africa/Nairobi Indian/Antananarivo # Madagascar ++Link Africa/Nairobi Indian/Comoro ++Link Africa/Nairobi Indian/Mayotte + + # Lesotho +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Maseru 1:50:00 - LMT 1903 Mar +- 2:00 - SAST 1943 Sep 19 2:00 +- 2:00 1:00 SAST 1944 Mar 19 2:00 +- 2:00 - SAST ++# See Africa/Johannesburg. + + # Liberia + # From Paul Eggert (2006-03-22): +@@ -549,38 +527,22 @@ + 2:00 - EET 1982 + 1:00 Libya CE%sT 1990 May 4 + # The 1996 and 1997 entries are from Shanks & Pottenger; +-# the IATA SSIM data contain some obvious errors. ++# the IATA SSIM data entries contain some obvious errors. + 2:00 - EET 1996 Sep 30 + 1:00 Libya CE%sT 1997 Oct 4 +- 2:00 - EET 2012 Nov 10 2:00 +- 1:00 Libya CE%sT 2013 Oct 25 2:00 ++ 2:00 - EET 2012 Nov 10 2:00 ++ 1:00 Libya CE%sT 2013 Oct 25 2:00 + 2:00 - EET + + # Madagascar +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Antananarivo 3:10:04 - LMT 1911 Jul +- 3:00 - EAT 1954 Feb 27 23:00s +- 3:00 1:00 EAST 1954 May 29 23:00s +- 3:00 - EAT ++# See Africa/Nairobi. + + # Malawi +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Blantyre 2:20:00 - LMT 1903 Mar +- 2:00 - CAT ++# See Africa/Maputo. + + # Mali +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Bamako -0:32:00 - LMT 1912 +- 0:00 - GMT 1934 Feb 26 +- -1:00 - WAT 1960 Jun 20 +- 0:00 - GMT +- + # Mauritania +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Nouakchott -1:03:48 - LMT 1912 +- 0:00 - GMT 1934 Feb 26 +- -1:00 - WAT 1960 Nov 28 +- 0:00 - GMT ++# See Africa/Abidjan. + + # Mauritius + +@@ -604,9 +566,7 @@ + + # From Steffen Thorsen (2008-07-10): + # According to +-# <a href="http://www.lexpress.mu/display_article.php?news_id=111216"> + # http://www.lexpress.mu/display_article.php?news_id=111216 +-# </a> + # (in French), Mauritius will start and end their DST a few days earlier + # than previously announced (2008-11-01 to 2009-03-31). The new start + # date is 2008-10-26 at 02:00 and the new end date is 2009-03-27 (no time +@@ -621,22 +581,17 @@ + + # From Alex Krivenyshev (2008-07-11): + # Seems that English language article "The revival of daylight saving +-# time: Energy conservation?"-# No. 16578 (07/11/2008) was originally ++# time: Energy conservation?"-# No. 16578 (07/11/2008) was originally + # published on Monday, June 30, 2008... + # + # I guess that article in French "Le gouvernement avance l'introduction +-# de l'heure d'ete" stating that DST in Mauritius starting on October 26 +-# and ending on March 27, 2009 is the most recent one. +-# ... +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_mauritius02.html"> ++# de l'heure d'été" stating that DST in Mauritius starting on October 26 ++# and ending on March 27, 2009 is the most recent one.... + # http://www.worldtimezone.com/dst_news/dst_news_mauritius02.html +-# </a> + + # From Riad M. Hossen Ally (2008-08-03): + # The Government of Mauritius weblink +-# <a href="http://www.gov.mu/portal/site/pmosite/menuitem.4ca0efdee47462e7440a600248a521ca/?content_id=4728ca68b2a5b110VgnVCM1000000a04a8c0RCRD"> + # http://www.gov.mu/portal/site/pmosite/menuitem.4ca0efdee47462e7440a600248a521ca/?content_id=4728ca68b2a5b110VgnVCM1000000a04a8c0RCRD +-# </a> + # Cabinet Decision of July 18th, 2008 states as follows: + # + # 4. ...Cabinet has agreed to the introduction into the National Assembly +@@ -646,33 +601,25 @@ + # States of America. It will start at two o'clock in the morning on the + # last Sunday of October and will end at two o'clock in the morning on + # the last Sunday of March the following year. The summer time for the +-# year 2008 - 2009 will, therefore, be effective as from 26 October 2008 ++# year 2008-2009 will, therefore, be effective as from 26 October 2008 + # and end on 29 March 2009. + + # From Ed Maste (2008-10-07): + # THE TIME BILL (No. XXVII of 2008) Explanatory Memorandum states the + # beginning / ending of summer time is 2 o'clock standard time in the + # morning of the last Sunday of October / last Sunday of March. +-# <a href="http://www.gov.mu/portal/goc/assemblysite/file/bill2708.pdf"> + # http://www.gov.mu/portal/goc/assemblysite/file/bill2708.pdf +-# </a> + + # From Steffen Thorsen (2009-06-05): + # According to several sources, Mauritius will not continue to observe + # DST the coming summer... + # + # Some sources, in French: +-# <a href="http://www.defimedia.info/news/946/Rashid-Beebeejaun-:-%C2%AB-L%E2%80%99heure-d%E2%80%99%C3%A9t%C3%A9-ne-sera-pas-appliqu%C3%A9e-cette-ann%C3%A9e-%C2%BB"> + # http://www.defimedia.info/news/946/Rashid-Beebeejaun-:-%C2%AB-L%E2%80%99heure-d%E2%80%99%C3%A9t%C3%A9-ne-sera-pas-appliqu%C3%A9e-cette-ann%C3%A9e-%C2%BB +-# </a> +-# <a href="http://lexpress.mu/Story/3398~Beebeejaun---Les-objectifs-d-%C3%A9conomie-d-%C3%A9nergie-de-l-heure-d-%C3%A9t%C3%A9-ont-%C3%A9t%C3%A9-atteints-"> + # http://lexpress.mu/Story/3398~Beebeejaun---Les-objectifs-d-%C3%A9conomie-d-%C3%A9nergie-de-l-heure-d-%C3%A9t%C3%A9-ont-%C3%A9t%C3%A9-atteints- +-# </a> + # + # Our wrap-up: +-# <a href="http://www.timeanddate.com/news/time/mauritius-dst-will-not-repeat.html"> + # http://www.timeanddate.com/news/time/mauritius-dst-will-not-repeat.html +-# </a> + + # From Arthur David Olson (2009-07-11): + # The "mauritius-dst-will-not-repeat" wrapup includes this: +@@ -685,18 +632,16 @@ + Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 S + Rule Mauritius 2009 only - Mar lastSun 2:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis ++Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis + 4:00 Mauritius MU%sT # Mauritius Time + # Agalega Is, Rodriguez + # no information; probably like Indian/Mauritius + + # Mayotte +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou +- 3:00 - EAT ++# See Africa/Nairobi. + + # Morocco +-# See the `europe' file for Spanish Morocco (Africa/Ceuta). ++# See the 'europe' file for Spanish Morocco (Africa/Ceuta). + + # From Alex Krivenyshev (2008-05-09): + # Here is an article that Morocco plan to introduce Daylight Saving Time between +@@ -704,60 +649,44 @@ + # + # "... Morocco is to save energy by adjusting its clock during summer so it will + # be one hour ahead of GMT between 1 June and 27 September, according to +-# Communication Minister and Gov ernment Spokesman, Khalid Naciri...." ++# Communication Minister and Government Spokesman, Khalid Naciri...." + # +-# <a href="http://www.worldtimezone.net/dst_news/dst_news_morocco01.html"> + # http://www.worldtimezone.net/dst_news/dst_news_morocco01.html +-# </a> +-# OR +-# <a href="http://en.afrik.com/news11892.html"> + # http://en.afrik.com/news11892.html +-# </a> + + # From Alex Krivenyshev (2008-05-09): +-# The Morocco time change can be confirmed on Morocco web site Maghreb Arabe Presse: +-# <a href="http://www.map.ma/eng/sections/box3/morocco_shifts_to_da/view"> ++# The Morocco time change can be confirmed on Morocco web site Maghreb Arabe ++# Presse: + # http://www.map.ma/eng/sections/box3/morocco_shifts_to_da/view +-# </a> + # + # Morocco shifts to daylight time on June 1st through September 27, Govt. + # spokesman. + + # From Patrice Scattolin (2008-05-09): + # According to this article: +-# <a href="http://www.avmaroc.com/actualite/heure-dete-comment-a127896.html"> + # http://www.avmaroc.com/actualite/heure-dete-comment-a127896.html +-# </a> +-# (and republished here: +-# <a href="http://www.actu.ma/heure-dete-comment_i127896_0.html"> +-# http://www.actu.ma/heure-dete-comment_i127896_0.html +-# </a> +-# ) +-# the changes occurs at midnight: ++# (and republished here: <http://www.actu.ma/heure-dete-comment_i127896_0.html>) ++# the changes occur at midnight: + # +-# saturday night may 31st at midnight (which in french is to be +-# intrepreted as the night between saturday and sunday) +-# sunday night the 28th at midnight ++# Saturday night May 31st at midnight (which in French is to be ++# interpreted as the night between Saturday and Sunday) ++# Sunday night the 28th at midnight + # +-# Seeing that the 28th is monday, I am guessing that she intends to say +-# the midnight of the 28th which is the midnight between sunday and +-# monday, which jives with other sources that say that it's inclusive +-# june1st to sept 27th. ++# Seeing that the 28th is Monday, I am guessing that she intends to say ++# the midnight of the 28th which is the midnight between Sunday and ++# Monday, which jives with other sources that say that it's inclusive ++# June 1st to Sept 27th. + # + # The decision was taken by decree *2-08-224 *but I can't find the decree + # published on the web. + # + # It's also confirmed here: +-# <a href="http://www.maroc.ma/NR/exeres/FACF141F-D910-44B0-B7FA-6E03733425D1.htm"> + # http://www.maroc.ma/NR/exeres/FACF141F-D910-44B0-B7FA-6E03733425D1.htm +-# </a> +-# on a government portal as being between june 1st and sept 27th (not yet +-# posted in english). ++# on a government portal as being between June 1st and Sept 27th (not yet ++# posted in English). + # +-# The following google query will generate many relevant hits: +-# <a href="http://www.google.com/search?hl=en&q=Conseil+de+gouvernement+maroc+heure+avance&btnG=Search"> ++# The following Google query will generate many relevant hits: + # http://www.google.com/search?hl=en&q=Conseil+de+gouvernement+maroc+heure+avance&btnG=Search +-# </a> + + # From Steffen Thorsen (2008-08-27): + # Morocco will change the clocks back on the midnight between August 31 +@@ -765,47 +694,32 @@ + # of September: + # + # One article about it (in French): +-# <a href="http://www.menara.ma/fr/Actualites/Maroc/Societe/ci.retour_a_l_heure_gmt_a_partir_du_dimanche_31_aout_a_minuit_officiel_.default"> + # http://www.menara.ma/fr/Actualites/Maroc/Societe/ci.retour_a_l_heure_gmt_a_partir_du_dimanche_31_aout_a_minuit_officiel_.default +-# </a> + # + # We have some further details posted here: +-# <a href="http://www.timeanddate.com/news/time/morocco-ends-dst-early-2008.html"> + # http://www.timeanddate.com/news/time/morocco-ends-dst-early-2008.html +-# </a> + + # From Steffen Thorsen (2009-03-17): + # Morocco will observe DST from 2009-06-01 00:00 to 2009-08-21 00:00 according + # to many sources, such as +-# <a href="http://news.marweb.com/morocco/entertainment/morocco-daylight-saving.html"> + # http://news.marweb.com/morocco/entertainment/morocco-daylight-saving.html +-# </a> +-# <a href="http://www.medi1sat.ma/fr/depeche.aspx?idp=2312"> + # http://www.medi1sat.ma/fr/depeche.aspx?idp=2312 +-# </a> + # (French) + # + # Our summary: +-# <a href="http://www.timeanddate.com/news/time/morocco-starts-dst-2009.html"> + # http://www.timeanddate.com/news/time/morocco-starts-dst-2009.html +-# </a> + + # From Alexander Krivenyshev (2009-03-17): + # Here is a link to official document from Royaume du Maroc Premier Ministre, +-# Ministere de la Modernisation des Secteurs Publics ++# Ministère de la Modernisation des Secteurs Publics + # + # Under Article 1 of Royal Decree No. 455-67 of Act 23 safar 1387 (2 june 1967) + # concerning the amendment of the legal time, the Ministry of Modernization of + # Public Sectors announced that the official time in the Kingdom will be + # advanced 60 minutes from Sunday 31 May 2009 at midnight. + # +-# <a href="http://www.mmsp.gov.ma/francais/Actualites_fr/PDF_Actualites_Fr/HeureEte_FR.pdf"> + # http://www.mmsp.gov.ma/francais/Actualites_fr/PDF_Actualites_Fr/HeureEte_FR.pdf +-# </a> +-# +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_morocco03.html"> + # http://www.worldtimezone.com/dst_news/dst_news_morocco03.html +-# </a> + + # From Steffen Thorsen (2010-04-13): + # Several news media in Morocco report that the Ministry of Modernization +@@ -813,51 +727,33 @@ + # 2010-05-02 to 2010-08-08. + # + # Example: +-# <a href="http://www.lavieeco.com/actualites/4099-le-maroc-passera-a-l-heure-d-ete-gmt1-le-2-mai.html"> + # http://www.lavieeco.com/actualites/4099-le-maroc-passera-a-l-heure-d-ete-gmt1-le-2-mai.html +-# </a> + # (French) + # Our page: +-# <a href="http://www.timeanddate.com/news/time/morocco-starts-dst-2010.html"> + # http://www.timeanddate.com/news/time/morocco-starts-dst-2010.html +-# </a> + + # From Dan Abitol (2011-03-30): + # ...Rules for Africa/Casablanca are the following (24h format) +-# The 3rd april 2011 at 00:00:00, [it] will be 3rd april 1:00:00 +-# The 31th july 2011 at 00:59:59, [it] will be 31th July 00:00:00 ++# The 3rd April 2011 at 00:00:00, [it] will be 3rd April 01:00:00 ++# The 31st July 2011 at 00:59:59, [it] will be 31st July 00:00:00 + # ...Official links of change in morocco + # The change was broadcast on the FM Radio + # I ve called ANRT (telecom regulations in Morocco) at + # +212.537.71.84.00 +-# <a href="http://www.anrt.net.ma/fr/"> + # http://www.anrt.net.ma/fr/ +-# </a> + # They said that +-# <a href="http://www.map.ma/fr/sections/accueil/l_heure_legale_au_ma/view"> + # http://www.map.ma/fr/sections/accueil/l_heure_legale_au_ma/view +-# </a> + # is the official publication to look at. + # They said that the decision was already taken. + # + # More articles in the press +-# <a href="http://www.yabiladi.com/articles/details/5058/secret-l-heure-d-ete-maroc-lev"> +-# http://www.yabiladi.com/articles/details/5058/secret-l-heure-d-ete-maroc-lev +-# </a> +-# e.html +-# <a href="http://www.lematin.ma/Actualite/Express/Article.asp?id=148923"> ++# http://www.yabiladi.com/articles/details/5058/secret-l-heure-d-ete-maroc-leve.html + # http://www.lematin.ma/Actualite/Express/Article.asp?id=148923 +-# </a> +-# <a href="http://www.lavieeco.com/actualite/Le-Maroc-passe-sur-GMT%2B1-a-partir-de-dim"> + # http://www.lavieeco.com/actualite/Le-Maroc-passe-sur-GMT%2B1-a-partir-de-dim +-# anche-prochain-5538.html +-# </a> + + # From Petr Machata (2011-03-30): + # They have it written in English here: +-# <a href="http://www.map.ma/eng/sections/home/morocco_to_spring_fo/view"> + # http://www.map.ma/eng/sections/home/morocco_to_spring_fo/view +-# </a> + # + # It says there that "Morocco will resume its standard time on July 31, + # 2011 at midnight." Now they don't say whether they mean midnight of +@@ -865,20 +761,16 @@ + # also been like that in the past. + + # From Alexander Krivenyshev (2012-03-09): +-# According to Infomédiaire web site from Morocco (infomediaire.ma), +-# on March 9, 2012, (in French) Heure légale: +-# Le Maroc adopte officiellement l'heure d'été +-# <a href="http://www.infomediaire.ma/news/maroc/heure-l%C3%A9gale-le-maroc-adopte-officiellement-lheure-d%C3%A9t%C3%A9"> ++# According to Infomédiaire web site from Morocco (infomediaire.ma), ++# on March 9, 2012, (in French) Heure légale: ++# Le Maroc adopte officiellement l'heure d'été + # http://www.infomediaire.ma/news/maroc/heure-l%C3%A9gale-le-maroc-adopte-officiellement-lheure-d%C3%A9t%C3%A9 +-# </a> + # Governing Council adopted draft decree, that Morocco DST starts on + # the last Sunday of March (March 25, 2012) and ends on + # last Sunday of September (September 30, 2012) + # except the month of Ramadan. + # or (brief) +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_morocco06.html"> + # http://www.worldtimezone.com/dst_news/dst_news_morocco06.html +-# </a> + + # From Arthur David Olson (2012-03-10): + # The infomediaire.ma source indicates that the system is to be in +@@ -889,17 +781,13 @@ + + # From Christophe Tropamer (2012-03-16): + # Seen Morocco change again: +-# <a href="http://www.le2uminutes.com/actualite.php"> + # http://www.le2uminutes.com/actualite.php +-# </a> +-# "...à partir du dernier dimance d'avril et non fins mars, +-# comme annoncé précédemment." ++# "...à partir du dernier dimanche d'avril et non fins mars, ++# comme annoncé précédemment." + + # From Milamber Space Network (2012-07-17): + # The official return to GMT is announced by the Moroccan government: +-# <a href="http://www.mmsp.gov.ma/fr/actualites.aspx?id=288"> + # http://www.mmsp.gov.ma/fr/actualites.aspx?id=288 [in French] +-# </a> + # + # Google translation, lightly edited: + # Back to the standard time of the Kingdom (GMT) +@@ -917,7 +805,7 @@ + # announced a bit in advance. On 2012-07-11 the Moroccan government + # announced that year's Ramadan daylight-saving transitions would be + # 2012-07-20 and 2012-08-20; see +-# <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>. ++# http://www.mmsp.gov.ma/fr/actualites.aspx?id=288 + + # From Andrew Paprocki (2013-07-02): + # Morocco announced that the year's Ramadan daylight-savings +@@ -937,39 +825,36 @@ + # From Sebastien Willemijns (2014-03-18): + # http://www.afriquinfos.com/articles/2014/3/18/maroc-heure-dete-avancez-tous-horloges-247891.asp + +-# From Paul Eggert (2014-03-19): +-# To estimate what the Moroccan government will do in future years, +-# transition dates for 2014 through 2038 were determined by running +-# the following program under GNU Emacs 24.3: +-# +-# (let ((islamic-year 1435)) +-# (while (< islamic-year 1461) +-# (let ((a +-# (calendar-gregorian-from-absolute +-# (calendar-islamic-to-absolute (list 9 1 islamic-year)))) +-# (b +-# (calendar-gregorian-from-absolute +-# (calendar-islamic-to-absolute (list 10 1 islamic-year))))) +-# (insert +-# (format +-# (concat "Rule\tMorocco\t%d\tonly\t-\t%s\t %2d\t 3:00\t0\t-\n" +-# "Rule\tMorocco\t%d\tonly\t-\t%s\t %2d\t 2:00\t1:00\tS\n") +-# (car (cdr (cdr a))) (calendar-month-name (car a) t) (car (cdr a)) +-# (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b))))) ++# From Milamber Space Network (2014-06-05): ++# The Moroccan government has recently announced that the country will return ++# to standard time at 03:00 on Saturday, June 28, 2014 local time.... DST ++# will resume again at 02:00 on Saturday, August 2, 2014.... ++# http://www.mmsp.gov.ma/fr/actualites.aspx?id=586 ++ ++# From Paul Eggert (2014-06-05): ++# For now, guess that later spring and fall transitions will use 2014's rules, ++# and guess that Morocco will switch to standard time at 03:00 the last ++# Saturday before Ramadan, and back to DST at 02:00 the first Saturday after ++# Ramadan. To implement this, transition dates for 2015 through 2037 were ++# determined by running the following program under GNU Emacs 24.3, with the ++# results integrated by hand into the table below. ++# (let ((islamic-year 1436)) ++# (while (< islamic-year 1460) ++# (let ((a (calendar-islamic-to-absolute (list 9 1 islamic-year))) ++# (b (calendar-islamic-to-absolute (list 10 1 islamic-year))) ++# (saturday 6)) ++# (while (/= saturday (mod (setq a (1- a)) 7))) ++# (while (/= saturday (mod b 7)) ++# (setq b (1+ b))) ++# (setq a (calendar-gregorian-from-absolute a)) ++# (setq b (calendar-gregorian-from-absolute b)) ++# (insert ++# (format ++# (concat "Rule\tMorocco\t%d\tonly\t-\t%s\t%2d\t 3:00\t0\t-\n" ++# "Rule\tMorocco\t%d\tonly\t-\t%s\t%2d\t 2:00\t1:00\tS\n") ++# (car (cdr (cdr a))) (calendar-month-name (car a) t) (car (cdr a)) ++# (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b))))) + # (setq islamic-year (+ 1 islamic-year)))) +-# +-# with spring-forward transitions removed for 2023-2025, when the +-# normal spring-forward date falls during the estimated Ramadan; with +-# all transitions removed for 2026-2035, where the estimated Ramadan +-# falls entirely outside daylight-saving time; and with fall-back +-# transitions removed for 2036-2037, where the normal fall-back +-# date falls during the estimated Ramadan. Normally, the table would +-# stop after 2037 because 32-bit time_t values roll around early in 2038, +-# but that would imply a prediction of perpetual DST after March 2038 +-# due to the year-2037 glitches. So, this table instead stops after +-# 2038, the first non-glitchy year after the 32-bit rollover. +-# An advantage of stopping after 2038 is that it lets zic guess +-# TZ='WET0WEST,M3.5.0,M10.5.0/3' for time stamps far in the future. + + # RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S + +@@ -991,46 +876,44 @@ + Rule Morocco 2008 only - Jun 1 0:00 1:00 S + Rule Morocco 2008 only - Sep 1 0:00 0 - + Rule Morocco 2009 only - Jun 1 0:00 1:00 S +-Rule Morocco 2009 only - Aug 21 0:00 0 - ++Rule Morocco 2009 only - Aug 21 0:00 0 - + Rule Morocco 2010 only - May 2 0:00 1:00 S + Rule Morocco 2010 only - Aug 8 0:00 0 - + Rule Morocco 2011 only - Apr 3 0:00 1:00 S +-Rule Morocco 2011 only - Jul 31 0 0 - +-Rule Morocco 2012 2013 - Apr lastSun 2:00 1:00 S +-Rule Morocco 2012 only - Sep 30 3:00 0 - +-Rule Morocco 2012 only - Jul 20 3:00 0 - +-Rule Morocco 2012 only - Aug 20 2:00 1:00 S +-Rule Morocco 2013 only - Jul 7 3:00 0 - +-Rule Morocco 2013 only - Aug 10 2:00 1:00 S +-Rule Morocco 2013 2035 - Oct lastSun 3:00 0 - +-Rule Morocco 2014 2022 - Mar lastSun 2:00 1:00 S +-Rule Morocco 2014 only - Jun 29 3:00 0 - +-Rule Morocco 2014 only - Jul 29 2:00 1:00 S +-Rule Morocco 2015 only - Jun 18 3:00 0 - +-Rule Morocco 2015 only - Jul 18 2:00 1:00 S +-Rule Morocco 2016 only - Jun 7 3:00 0 - +-Rule Morocco 2016 only - Jul 7 2:00 1:00 S +-Rule Morocco 2017 only - May 27 3:00 0 - +-Rule Morocco 2017 only - Jun 26 2:00 1:00 S +-Rule Morocco 2018 only - May 16 3:00 0 - +-Rule Morocco 2018 only - Jun 15 2:00 1:00 S +-Rule Morocco 2019 only - May 6 3:00 0 - +-Rule Morocco 2019 only - Jun 5 2:00 1:00 S +-Rule Morocco 2020 only - Apr 24 3:00 0 - +-Rule Morocco 2020 only - May 24 2:00 1:00 S +-Rule Morocco 2021 only - Apr 13 3:00 0 - +-Rule Morocco 2021 only - May 13 2:00 1:00 S +-Rule Morocco 2022 only - Apr 3 3:00 0 - +-Rule Morocco 2022 only - May 3 2:00 1:00 S +-Rule Morocco 2023 only - Apr 22 2:00 1:00 S +-Rule Morocco 2024 only - Apr 10 2:00 1:00 S +-Rule Morocco 2025 only - Mar 31 2:00 1:00 S +-Rule Morocco 2026 max - Mar lastSun 2:00 1:00 S +-Rule Morocco 2036 only - Oct 21 3:00 0 - +-Rule Morocco 2037 only - Oct 11 3:00 0 - +-Rule Morocco 2038 only - Sep 30 3:00 0 - +-Rule Morocco 2038 only - Oct 30 2:00 1:00 S +-Rule Morocco 2038 max - Oct lastSun 3:00 0 - ++Rule Morocco 2011 only - Jul 31 0 0 - ++Rule Morocco 2012 2013 - Apr lastSun 2:00 1:00 S ++Rule Morocco 2012 only - Sep 30 3:00 0 - ++Rule Morocco 2012 only - Jul 20 3:00 0 - ++Rule Morocco 2012 only - Aug 20 2:00 1:00 S ++Rule Morocco 2013 only - Jul 7 3:00 0 - ++Rule Morocco 2013 only - Aug 10 2:00 1:00 S ++Rule Morocco 2013 max - Oct lastSun 3:00 0 - ++Rule Morocco 2014 2022 - Mar lastSun 2:00 1:00 S ++Rule Morocco 2014 only - Jun 28 3:00 0 - ++Rule Morocco 2014 only - Aug 2 2:00 1:00 S ++Rule Morocco 2015 only - Jun 13 3:00 0 - ++Rule Morocco 2015 only - Jul 18 2:00 1:00 S ++Rule Morocco 2016 only - Jun 4 3:00 0 - ++Rule Morocco 2016 only - Jul 9 2:00 1:00 S ++Rule Morocco 2017 only - May 20 3:00 0 - ++Rule Morocco 2017 only - Jul 1 2:00 1:00 S ++Rule Morocco 2018 only - May 12 3:00 0 - ++Rule Morocco 2018 only - Jun 16 2:00 1:00 S ++Rule Morocco 2019 only - May 4 3:00 0 - ++Rule Morocco 2019 only - Jun 8 2:00 1:00 S ++Rule Morocco 2020 only - Apr 18 3:00 0 - ++Rule Morocco 2020 only - May 30 2:00 1:00 S ++Rule Morocco 2021 only - Apr 10 3:00 0 - ++Rule Morocco 2021 only - May 15 2:00 1:00 S ++Rule Morocco 2022 only - Apr 2 3:00 0 - ++Rule Morocco 2022 only - May 7 2:00 1:00 S ++Rule Morocco 2023 only - Apr 22 2:00 1:00 S ++Rule Morocco 2024 only - Apr 13 2:00 1:00 S ++Rule Morocco 2025 only - Apr 5 2:00 1:00 S ++Rule Morocco 2026 max - Mar lastSun 2:00 1:00 S ++Rule Morocco 2035 only - Oct 27 3:00 0 - ++Rule Morocco 2036 only - Oct 18 3:00 0 - ++Rule Morocco 2037 only - Oct 10 3:00 0 - + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26 +@@ -1049,21 +932,34 @@ + # Assume that this has been true since Western Sahara switched to GMT, + # since most of it was then controlled by Morocco. + +-Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan ++Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún + -1:00 - WAT 1976 Apr 14 + 0:00 Morocco WE%sT + + # Mozambique ++# ++# Shanks gives 1903-03-01 for the transition to CAT. ++# Perhaps the 1911-05-26 Portuguese decree ++# http://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf ++# merely made it official? ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Maputo 2:10:20 - LMT 1903 Mar + 2:00 - CAT ++Link Africa/Maputo Africa/Blantyre # Malawi ++Link Africa/Maputo Africa/Bujumbura # Burundi ++Link Africa/Maputo Africa/Gaborone # Botswana ++Link Africa/Maputo Africa/Harare # Zimbabwe ++Link Africa/Maputo Africa/Kigali # Rwanda ++Link Africa/Maputo Africa/Lubumbashi # E Dem. Rep. of Congo ++Link Africa/Maputo Africa/Lusaka # Zambia + + # Namibia + # The 1994-04-03 transition is from Shanks & Pottenger. + # Shanks & Pottenger report no DST after 1998-04; go with IATA. + +-# From Petronella Sibeene (2007-03-30) in +-# <http://allafrica.com/stories/200703300178.html>: ++# From Petronella Sibeene (2007-03-30): ++# http://allafrica.com/stories/200703300178.html + # While the entire country changes its time, Katima Mulilo and other + # settlements in Caprivi unofficially will not because the sun there + # rises and sets earlier compared to other regions. Chief of +@@ -1080,34 +976,41 @@ + Rule Namibia 1995 max - Apr Sun>=1 2:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8 +- 1:30 - SWAT 1903 Mar # SW Africa Time +- 2:00 - SAST 1942 Sep 20 2:00 +- 2:00 1:00 SAST 1943 Mar 21 2:00 ++ 1:30 - SWAT 1903 Mar # SW Africa Time ++ 2:00 - SAST 1942 Sep 20 2:00 ++ 2:00 1:00 SAST 1943 Mar 21 2:00 + 2:00 - SAST 1990 Mar 21 # independence + 2:00 - CAT 1994 Apr 3 + 1:00 Namibia WA%sT + + # Niger +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Niamey 0:08:28 - LMT 1912 +- -1:00 - WAT 1934 Feb 26 +- 0:00 - GMT 1960 +- 1:00 - WAT ++# See Africa/Lagos. + + # Nigeria + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Lagos 0:13:36 - LMT 1919 Sep + 1:00 - WAT ++Link Africa/Lagos Africa/Bangui # Central African Republic ++Link Africa/Lagos Africa/Brazzaville # Rep. of the Congo ++Link Africa/Lagos Africa/Douala # Cameroon ++Link Africa/Lagos Africa/Kinshasa # Dem. Rep. of the Congo (west) ++Link Africa/Lagos Africa/Libreville # Gabon ++Link Africa/Lagos Africa/Luanda # Angola ++Link Africa/Lagos Africa/Malabo # Equatorial Guinea ++Link Africa/Lagos Africa/Niamey # Niger ++Link Africa/Lagos Africa/Porto-Novo # Benin + +-# Reunion ++# Réunion + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Reunion 3:41:52 - LMT 1911 Jun # Saint-Denis +- 4:00 - RET # Reunion Time ++Zone Indian/Reunion 3:41:52 - LMT 1911 Jun # Saint-Denis ++ 4:00 - RET # Réunion Time + # +-# Scattered Islands (Iles Eparses) administered from Reunion are as follows. ++# Crozet Islands also observes Réunion time; see the 'antarctica' file. ++# ++# Scattered Islands (Îles Éparses) administered from Réunion are as follows. + # The following information about them is taken from +-# Iles Eparses (www.outre-mer.gouv.fr/domtom/ile.htm, 1997-07-22, in French; +-# no longer available as of 1999-08-17). ++# Îles Éparses (<http://www.outre-mer.gouv.fr/domtom/ile.htm>, 1997-07-22, ++# in French; no longer available as of 1999-08-17). + # We have no info about their time zone histories. + # + # Bassas da India - uninhabited +@@ -1117,37 +1020,24 @@ + # Tromelin - inhabited until at least 1958 + + # Rwanda +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Kigali 2:00:16 - LMT 1935 Jun +- 2:00 - CAT ++# See Africa/Maputo. + + # St Helena +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Atlantic/St_Helena -0:22:48 - LMT 1890 # Jamestown +- -0:22:48 - JMT 1951 # Jamestown Mean Time +- 0:00 - GMT ++# See Africa/Abidjan. + # The other parts of the St Helena territory are similar: + # Tristan da Cunha: on GMT, say Whitman and the CIA +-# Ascension: on GMT, says usno1995 and the CIA ++# Ascension: on GMT, say the USNO (1995-12-21) and the CIA + # Gough (scientific station since 1955; sealers wintered previously): + # on GMT, says the CIA +-# Inaccessible, Nightingale: no information, but probably GMT ++# Inaccessible, Nightingale: uninhabited + +-# Sao Tome and Principe +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Sao_Tome 0:26:56 - LMT 1884 +- -0:36:32 - LMT 1912 # Lisbon Mean Time +- 0:00 - GMT +- ++# São Tomé and Príncipe + # Senegal +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Dakar -1:09:44 - LMT 1912 +- -1:00 - WAT 1941 Jun +- 0:00 - GMT ++# See Africa/Abidjan. + + # Seychelles + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Mahe 3:41:48 - LMT 1906 Jun # Victoria ++Zone Indian/Mahe 3:41:48 - LMT 1906 Jun # Victoria + 4:00 - SCT # Seychelles Time + # From Paul Eggert (2001-05-30): + # Aldabra, Farquhar, and Desroches, originally dependencies of the +@@ -1157,24 +1047,10 @@ + # Possibly the islands were uninhabited. + + # Sierra Leone +-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-# Whitman gives Mar 31 - Aug 31 for 1931 on; go with Shanks & Pottenger. +-Rule SL 1935 1942 - Jun 1 0:00 0:40 SLST +-Rule SL 1935 1942 - Oct 1 0:00 0 WAT +-Rule SL 1957 1962 - Jun 1 0:00 1:00 SLST +-Rule SL 1957 1962 - Sep 1 0:00 0 GMT +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Freetown -0:53:00 - LMT 1882 +- -0:53:00 - FMT 1913 Jun # Freetown Mean Time +- -1:00 SL %s 1957 +- 0:00 SL %s ++# See Africa/Abidjan. + + # Somalia +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Mogadishu 3:01:28 - LMT 1893 Nov +- 3:00 - EAT 1931 +- 2:30 - BEAT 1957 +- 3:00 - EAT ++# See Africa/Nairobi. + + # South Africa + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -1184,15 +1060,18 @@ + Zone Africa/Johannesburg 1:52:00 - LMT 1892 Feb 8 + 1:30 - SAST 1903 Mar + 2:00 SA SAST ++Link Africa/Johannesburg Africa/Maseru # Lesotho ++Link Africa/Johannesburg Africa/Mbabane # Swaziland ++# + # Marion and Prince Edward Is + # scientific station since 1947 + # no information + + # Sudan + # +-# From <a href="http://www.sunanews.net/sn13jane.html"> +-# Sudan News Agency (2000-01-13) +-# </a>, also reported by Michael De Beukelaer-Dossche via Steffen Thorsen: ++# From <http://www.sunanews.net/sn13jane.html> ++# Sudan News Agency (2000-01-13), ++# also reported by Michaël De Beukelaer-Dossche via Steffen Thorsen: + # Clocks will be moved ahead for 60 minutes all over the Sudan as of noon + # Saturday.... This was announced Thursday by Caretaker State Minister for + # Manpower Abdul-Rahman Nur-Eddin. +@@ -1211,26 +1090,18 @@ + Link Africa/Khartoum Africa/Juba + + # Swaziland +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Mbabane 2:04:24 - LMT 1903 Mar +- 2:00 - SAST ++# See Africa/Johannesburg. + + # Tanzania +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Dar_es_Salaam 2:37:08 - LMT 1931 +- 3:00 - EAT 1948 +- 2:45 - BEAUT 1961 +- 3:00 - EAT ++# See Africa/Nairobi. + + # Togo +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Lome 0:04:52 - LMT 1893 +- 0:00 - GMT ++# See Africa/Abidjan. + + # Tunisia + + # From Gwillim Law (2005-04-30): +-# My correspondent, Risto Nykanen, has alerted me to another adoption of DST, ++# My correspondent, Risto Nykänen, has alerted me to another adoption of DST, + # this time in Tunisia. According to Yahoo France News + # <http://fr.news.yahoo.com/050426/5/4dumk.html>, in a story attributed to AP + # and dated 2005-04-26, "Tunisia has decided to advance its official time by +@@ -1239,8 +1110,8 @@ + # Saturday." (My translation) + # + # From Oscar van Vlijmen (2005-05-02): +-# LaPresse, the first national daily newspaper ... +-# <http://www.lapresse.tn/archives/archives280405/actualites/lheure.html> ++# La Presse, the first national daily newspaper ... ++# http://www.lapresse.tn/archives/archives280405/actualites/lheure.html + # ... DST for 2005: on: Sun May 1 0h standard time, off: Fri Sept. 30, + # 1h standard time. + # +@@ -1253,18 +1124,12 @@ + # From Steffen Thorsen (2009-03-16): + # According to several news sources, Tunisia will not observe DST this year. + # (Arabic) +-# <a href="http://www.elbashayer.com/?page=viewn&nid=42546"> + # http://www.elbashayer.com/?page=viewn&nid=42546 +-# </a> +-# <a href="http://www.babnet.net/kiwidetail-15295.asp"> + # http://www.babnet.net/kiwidetail-15295.asp +-# </a> + # + # We have also confirmed this with the US embassy in Tunisia. + # We have a wrap-up about this on the following page: +-# <a href="http://www.timeanddate.com/news/time/tunisia-cancels-dst-2009.html"> + # http://www.timeanddate.com/news/time/tunisia-cancels-dst-2009.html +-# </a> + + # From Alexander Krivenyshev (2009-03-17): + # Here is a link to Tunis Afrique Presse News Agency +@@ -1272,20 +1137,17 @@ + # Standard time to be kept the whole year long (tap.info.tn): + # + # (in English) +-# <a href="http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=26813&Itemid=157"> + # http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=26813&Itemid=157 +-# </a> + # + # (in Arabic) +-# <a href="http://www.tap.info.tn/ar/index.php?option=com_content&task=view&id=61240&Itemid=1"> + # http://www.tap.info.tn/ar/index.php?option=com_content&task=view&id=61240&Itemid=1 +-# </a> + +-# From Arthur David Olson (2009--3-18): +-# The Tunis Afrique Presse News Agency notice contains this: "This measure is due to the fact +-# that the fasting month of ramadan coincides with the period concerned by summer time. +-# Therefore, the standard time will be kept unchanged the whole year long." +-# So foregoing DST seems to be an exception (albeit one that may be repeated in the future). ++# From Arthur David Olson (2009-03-18): ++# The Tunis Afrique Presse News Agency notice contains this: "This measure is ++# due to the fact that the fasting month of Ramadan coincides with the period ++# concerned by summer time. Therefore, the standard time will be kept ++# unchanged the whole year long." So foregoing DST seems to be an exception ++# (albeit one that may be repeated in the future). + + # From Alexander Krivenyshev (2010-03-27): + # According to some news reports Tunis confirmed not to use DST in 2010 +@@ -1297,12 +1159,8 @@ + # coincided with the month of Ramadan..." + # + # (in Arabic) +-# <a href="http://www.moheet.com/show_news.aspx?nid=358861&pg=1"> + # http://www.moheet.com/show_news.aspx?nid=358861&pg=1 +-# <a href="http://www.almadenahnews.com/newss/news.php?c=118&id=38036"> + # http://www.almadenahnews.com/newss/news.php?c=118&id=38036 +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_tunis02.html"> + # http://www.worldtimezone.com/dst_news/dst_news_tunis02.html + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -1337,23 +1195,12 @@ + # Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Africa/Tunis 0:40:44 - LMT 1881 May 12 +- 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time ++ 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time + 1:00 Tunisia CE%sT + + # Uganda +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Kampala 2:09:40 - LMT 1928 Jul +- 3:00 - EAT 1930 +- 2:30 - BEAT 1948 +- 2:45 - BEAUT 1957 +- 3:00 - EAT ++# See Africa/Nairobi. + + # Zambia +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Lusaka 1:53:08 - LMT 1903 Mar +- 2:00 - CAT +- + # Zimbabwe +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Africa/Harare 2:04:12 - LMT 1903 Mar +- 2:00 - CAT ++# See Africa/Maputo. +--- ./jdk/make/sun/javazic/tzdata/antarctica Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/antarctica Mon Jan 05 11:57:27 2015 -0800 +@@ -21,19 +21,16 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + + # From Paul Eggert (1999-11-15): + # To keep things manageable, we list only locations occupied year-round; see +-# <a href="http://www.comnap.aq/comnap/comnap.nsf/P/Stations/"> + # COMNAP - Stations and Bases +-# </a> ++# http://www.comnap.aq/comnap/comnap.nsf/P/Stations/ + # and +-# <a href="http://www.spri.cam.ac.uk/bob/periant.htm"> + # Summary of the Peri-Antarctic Islands (1998-07-23) +-# </a> ++# http://www.spri.cam.ac.uk/bob/periant.htm + # for information. + # Unless otherwise specified, we have no time zone information. + # +@@ -78,19 +75,19 @@ + + # Argentina - year-round bases + # Belgrano II, Confin Coast, -770227-0343737, since 1972-02-05 +-# Esperanza, San Martin Land, -6323-05659, since 1952-12-17 +-# Jubany, Potter Peninsula, King George Island, -6414-0602320, since 1982-01 +-# Marambio, Seymour I, -6414-05637, since 1969-10-29 ++# Carlini, Potter Cove, King George Island, -6414-0602320, since 1982-01 ++# Esperanza, Hope Bay, -6323-05659, since 1952-12-17 ++# Marambio, -6414-05637, since 1969-10-29 + # Orcadas, Laurie I, -6016-04444, since 1904-02-22 +-# San Martin, Debenham I, -6807-06708, since 1951-03-21 ++# San Martín, Barry I, -6808-06706, since 1951-03-21 + # (except 1960-03 / 1976-03-21) + + # Australia - territories + # Heard Island, McDonald Islands (uninhabited) + # previously sealers and scientific personnel wintered +-# <a href="http://web.archive.org/web/20021204222245/http://www.dstc.qut.edu.au/DST/marg/daylight.html"> + # Margaret Turner reports +-# </a> (1999-09-30) that they're UTC+5, with no DST; ++# http://web.archive.org/web/20021204222245/http://www.dstc.qut.edu.au/DST/marg/daylight.html ++# (1999-09-30) that they're UTC+5, with no DST; + # presumably this is when they have visitors. + # + # year-round bases +@@ -107,14 +104,10 @@ + # The changes occurred on 2009-10-18 at 02:00 (local times). + # + # Government source: (Australian Antarctic Division) +-# <a href="http://www.aad.gov.au/default.asp?casid=37079"> + # http://www.aad.gov.au/default.asp?casid=37079 +-# </a> + # + # We have more background information here: +-# <a href="http://www.timeanddate.com/news/time/antarctica-new-times.html"> + # http://www.timeanddate.com/news/time/antarctica-new-times.html +-# </a> + + # From Steffen Thorsen (2010-03-10): + # We got these changes from the Australian Antarctic Division: ... +@@ -129,50 +122,49 @@ + # - Mawson station stays on UTC+5. + # + # Background: +-# <a href="http://www.timeanddate.com/news/time/antartica-time-changes-2010.html"> + # http://www.timeanddate.com/news/time/antartica-time-changes-2010.html +-# </a> + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Antarctica/Casey 0 - zzz 1969 +- 8:00 - WST 2009 Oct 18 2:00 +- # Western (Aus) Standard Time +- 11:00 - CAST 2010 Mar 5 2:00 +- # Casey Time +- 8:00 - WST 2011 Oct 28 2:00 ++ 8:00 - AWST 2009 Oct 18 2:00 ++ # Australian Western Std Time ++ 11:00 - CAST 2010 Mar 5 2:00 # Casey Time ++ 8:00 - AWST 2011 Oct 28 2:00 + 11:00 - CAST 2012 Feb 21 17:00u +- 8:00 - WST ++ 8:00 - AWST + Zone Antarctica/Davis 0 - zzz 1957 Jan 13 +- 7:00 - DAVT 1964 Nov # Davis Time ++ 7:00 - DAVT 1964 Nov # Davis Time + 0 - zzz 1969 Feb +- 7:00 - DAVT 2009 Oct 18 2:00 ++ 7:00 - DAVT 2009 Oct 18 2:00 + 5:00 - DAVT 2010 Mar 10 20:00u +- 7:00 - DAVT 2011 Oct 28 2:00 ++ 7:00 - DAVT 2011 Oct 28 2:00 + 5:00 - DAVT 2012 Feb 21 20:00u + 7:00 - DAVT + Zone Antarctica/Mawson 0 - zzz 1954 Feb 13 +- 6:00 - MAWT 2009 Oct 18 2:00 +- # Mawson Time ++ 6:00 - MAWT 2009 Oct 18 2:00 # Mawson Time + 5:00 - MAWT + # References: +-# <a href="http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html"> + # Casey Weather (1998-02-26) +-# </a> +-# <a href="http://www.antdiv.gov.au/aad/exop/sfo/davis/video.html"> ++# http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html + # Davis Station, Antarctica (1998-02-26) +-# </a> +-# <a href="http://www.antdiv.gov.au/aad/exop/sfo/mawson/video.html"> ++# http://www.antdiv.gov.au/aad/exop/sfo/davis/video.html + # Mawson Station, Antarctica (1998-02-25) +-# </a> ++# http://www.antdiv.gov.au/aad/exop/sfo/mawson/video.html ++ ++# Belgium - year-round base ++# Princess Elisabeth, Queen Maud Land, -713412+0231200, since 2007 + + # Brazil - year-round base +-# Comandante Ferraz, King George Island, -6205+05824, since 1983/4 ++# Ferraz, King George Island, -6205+05824, since 1983/4 ++ ++# Bulgaria - year-round base ++# St. Kliment Ohridski, Livingston Island, -623829-0602153, since 1988 + + # Chile - year-round bases and towns + # Escudero, South Shetland Is, -621157-0585735, since 1994 +-# Presidente Eduadro Frei, King George Island, -6214-05848, since 1969-03-07 +-# General Bernardo O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02 +-# Capitan Arturo Prat, -6230-05941 ++# Frei Montalva, King George Island, -6214-05848, since 1969-03-07 ++# O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02 ++# Prat, -6230-05941 + # Villa Las Estrellas (a town), around the Frei base, since 1984-04-09 + # These locations have always used Santiago time; use TZ='America/Santiago'. + +@@ -180,31 +172,35 @@ + # Great Wall, King George Island, -6213-05858, since 1985-02-20 + # Zhongshan, Larsemann Hills, Prydz Bay, -6922+07623, since 1989-02-26 + +-# France - year-round bases ++# France - year-round bases (also see "France & Italy") + # + # From Antoine Leca (1997-01-20): +-# Time data are from Nicole Pailleau at the IFRTP ++# Time data entries are from Nicole Pailleau at the IFRTP + # (French Institute for Polar Research and Technology). +-# She confirms that French Southern Territories and Terre Adelie bases +-# don't observe daylight saving time, even if Terre Adelie supplies came ++# She confirms that French Southern Territories and Terre Adélie bases ++# don't observe daylight saving time, even if Terre Adélie supplies came + # from Tasmania. + # + # French Southern Territories with year-round inhabitants + # +-# Martin-de-Vivies Base, Amsterdam Island, -374105+0773155, since 1950 +-# Alfred-Faure Base, Crozet Islands, -462551+0515152, since 1964 +-# Port-aux-Francais, Kerguelen Islands, -492110+0701303, since 1951; ++# Alfred Faure, Possession Island, Crozet Islands, -462551+0515152, since 1964; ++# sealing & whaling stations operated variously 1802/1911+; ++# see Indian/Reunion. ++# ++# Martin-de-Viviès, Amsterdam Island, -374105+0773155, since 1950 ++# Port-aux-Français, Kerguelen Islands, -492110+0701303, since 1951; + # whaling & sealing station operated 1908/1914, 1920/1929, and 1951/1956 + # + # St Paul Island - near Amsterdam, uninhabited + # fishing stations operated variously 1819/1931 + # + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Kerguelen 0 - zzz 1950 # Port-aux-Francais ++Zone Indian/Kerguelen 0 - zzz 1950 # Port-aux-Français + 5:00 - TFT # ISO code TF Time + # + # year-round base in the main continent +-# Dumont-d'Urville, Ile des Petrels, -6640+14001, since 1956-11 ++# Dumont d'Urville, Île des Pétrels, -6640+14001, since 1956-11 ++# <http://en.wikipedia.org/wiki/Dumont_d'Urville_Station> (2005-12-05) + # + # Another base at Port-Martin, 50km east, began operation in 1947. + # It was destroyed by fire on 1952-01-14. +@@ -214,20 +210,22 @@ + 10:00 - PMT 1952 Jan 14 # Port-Martin Time + 0 - zzz 1956 Nov + 10:00 - DDUT # Dumont-d'Urville Time +-# Reference: +-# <a href="http://en.wikipedia.org/wiki/Dumont_d'Urville_Station"> +-# Dumont d'Urville Station (2005-12-05) +-# </a> ++ ++# France & Italy - year-round base ++# Concordia, -750600+1232000, since 2005 + + # Germany - year-round base +-# Georg von Neumayer, -7039-00815 ++# Neumayer III, -704080-0081602, since 2009 + +-# India - year-round base +-# Dakshin Gangotri, -7005+01200 ++# India - year-round bases ++# Bharati, -692428+0761114, since 2012 ++# Maitri, -704558+0114356, since 1989 ++ ++# Italy - year-round base (also see "France & Italy") ++# Zuchelli, Terra Nova Bay, -744140+1640647, since 1986 + + # Japan - year-round bases +-# Dome Fuji, -7719+03942 +-# Syowa, -690022+0393524 ++# Syowa (also known as Showa), -690022+0393524, since 1957 + # + # From Hideyuki Suzuki (1999-02-06): + # In all Japanese stations, +0300 is used as the standard time. +@@ -239,11 +237,11 @@ + Zone Antarctica/Syowa 0 - zzz 1957 Jan 29 + 3:00 - SYOT # Syowa Time + # See: +-# <a href="http://www.nipr.ac.jp/english/ara01.html"> + # NIPR Antarctic Research Activities (1999-08-17) +-# </a> ++# http://www.nipr.ac.jp/english/ara01.html + + # S Korea - year-round base ++# Jang Bogo, Terra Nova Bay, -743700+1641205 since 2014 + # King Sejong, King George Island, -6213-05847, since 1988 + + # New Zealand - claims +@@ -287,11 +285,14 @@ + Rule Troll 2004 max - Oct lastSun 1:00u 0:00 UTC + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Antarctica/Troll 0 - zzz 2005 Feb 12 +- 0:00 Troll %s ++ 0:00 Troll %s + + # Poland - year-round base + # Arctowski, King George Island, -620945-0582745, since 1977 + ++# Romania - year-bound base ++# Law-Racoviță, Larsemann Hills, -692319+0762251, since 1986 ++ + # Russia - year-round bases + # Bellingshausen, King George Island, -621159-0585337, since 1968-02-22 + # Mirny, Davis coast, -6633+09301, since 1956-02 +@@ -301,8 +302,8 @@ + # year-round from 1960/61 to 1992 + + # Vostok, since 1957-12-16, temporarily closed 1994-02/1994-11 +-# <a href="http://quest.arc.nasa.gov/antarctica/QA/computers/Directions,Time,ZIP"> +-# From Craig Mundell (1994-12-15)</a>: ++# From Craig Mundell (1994-12-15): ++# http://quest.arc.nasa.gov/antarctica/QA/computers/Directions,Time,ZIP + # Vostok, which is one of the Russian stations, is set on the same + # time as Moscow, Russia. + # +@@ -317,7 +318,7 @@ + # + # From Paul Eggert (2001-05-04): + # This seems to be hopelessly confusing, so I asked Lee Hotz about it +-# in person. He said that some Antartic locations set their local ++# in person. He said that some Antarctic locations set their local + # time so that noon is the warmest part of the day, and that this + # changes during the year and does not necessarily correspond to mean + # solar noon. So the Vostok time might have been whatever the clocks +@@ -329,9 +330,12 @@ + + # S Africa - year-round bases + # Marion Island, -4653+03752 +-# Sanae, -7141-00250 ++# SANAE IV, Vesleskarvet, Queen Maud Land, -714022-0025026, since 1997 + +-# UK ++# Ukraine - year-round base ++# Vernadsky (formerly Faraday), Galindez Island, -651445-0641526, since 1954 ++ ++# United Kingdom + # + # British Antarctic Territories (BAT) claims + # South Orkney Islands +@@ -387,7 +391,7 @@ + # but that he found it more convenient to keep GMT+12 + # as supplies for the station were coming from McMurdo Sound, + # which was on GMT+12 because New Zealand was on GMT+12 all year +-# at that time (1957). (Source: Siple's book 90 degrees SOUTH.) ++# at that time (1957). (Source: Siple's book 90 Degrees South.) + # + # From Susan Smith + # http://www.cybertours.com/whs/pole10.html +--- ./jdk/make/sun/javazic/tzdata/asia Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/asia Mon Jan 05 11:57:27 2015 -0800 +@@ -21,41 +21,44 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +-# This data is by no means authoritative; if you think you know better, ++# This file is by no means authoritative; if you think you know better, + # go ahead and edit the file (and please send any changes to +-# tz@iana.org for general use in the future). ++# tz@iana.org for general use in the future). For more, please see ++# the file CONTRIBUTING in the tz distribution. + +-# From Paul Eggert (2013-08-11): ++# From Paul Eggert (2014-10-31): + # +-# A good source for time zone historical data outside the U.S. is ++# Unless otherwise specified, the source for data through 1990 is: + # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), + # San Diego: ACS Publications, Inc. (2003). ++# Unfortunately this book contains many errors and cites no sources. + # + # Gwillim Law writes that a good source + # for recent time zone data is the International Air Transport + # Association's Standard Schedules Information Manual (IATA SSIM), + # published semiannually. Law sent in several helpful summaries +-# of the IATA's data after 1990. +-# +-# Except where otherwise noted, Shanks & Pottenger is the source for +-# entries through 1990, and IATA SSIM is the source for entries afterwards. ++# of the IATA's data after 1990. Except where otherwise noted, ++# IATA SSIM is the source for entries after 1990. + # + # Another source occasionally used is Edward W. Whitman, World Time Differences, + # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which + # I found in the UCLA library. + # + # For data circa 1899, a common source is: +-# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94 +-# <http://www.jstor.org/stable/1774359>. ++# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94. ++# http://www.jstor.org/stable/1774359 ++# ++# For Russian data circa 1919, a source is: ++# Byalokoz EL. New Counting of Time in Russia since July 1, 1919. ++# (See the 'europe' file for a fuller citation.) + # + # A reliable and entertaining source about time zones is + # Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997). + # +-# I invented the abbreviations marked `*' in the following table; ++# I invented the abbreviations marked '*' in the following table; + # the rest are from earlier versions of this file, or from other sources. + # Corrections are welcome! + # std dst +@@ -66,17 +69,19 @@ + # 3:30 IRST IRDT Iran + # 4:00 GST Gulf* + # 5:30 IST India +-# 7:00 ICT Indochina* ++# 7:00 ICT Indochina, most times and locations* + # 7:00 WIB west Indonesia (Waktu Indonesia Barat) + # 8:00 WITA central Indonesia (Waktu Indonesia Tengah) + # 8:00 CST China +-# 9:00 CJT Central Japanese Time (1896/1937)* ++# 8:00 IDT Indochina, 1943-45, 1947-55, 1960-75 (some locations)* ++# 8:00 JWST Western Standard Time (Japan, 1896/1937)* ++# 9:00 JCST Central Standard Time (Japan, 1896/1937) + # 9:00 WIT east Indonesia (Waktu Indonesia Timur) + # 9:00 JST JDT Japan + # 9:00 KST KDT Korea +-# 9:30 CST (Australian) Central Standard Time ++# 9:30 ACST Australian Central Standard Time + # +-# See the `europe' file for Russia and Turkey in Asia. ++# See the 'europe' file for Russia and Turkey in Asia. + + # From Guy Harris: + # Incorporates data for Singapore from Robert Elz' asia 1.1, as well as +@@ -86,7 +91,7 @@ + + ############################################################################### + +-# These rules are stolen from the `europe' file. ++# These rules are stolen from the 'europe' file. + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S + Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 - +@@ -138,11 +143,11 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2 + 3:00 - YERT 1957 Mar # Yerevan Time +- 4:00 RussiaAsia YER%sT 1991 Mar 31 2:00s ++ 4:00 RussiaAsia YER%sT 1991 Mar 31 2:00s + 3:00 1:00 YERST 1991 Sep 23 # independence +- 3:00 RussiaAsia AM%sT 1995 Sep 24 2:00s ++ 3:00 RussiaAsia AM%sT 1995 Sep 24 2:00s + 4:00 - AMT 1997 +- 4:00 RussiaAsia AM%sT 2012 Mar 25 2:00s ++ 4:00 RussiaAsia AM%sT 2012 Mar 25 2:00s + 4:00 - AMT + + # Azerbaijan +@@ -155,16 +160,16 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Baku 3:19:24 - LMT 1924 May 2 + 3:00 - BAKT 1957 Mar # Baku Time +- 4:00 RussiaAsia BAK%sT 1991 Mar 31 2:00s ++ 4:00 RussiaAsia BAK%sT 1991 Mar 31 2:00s + 3:00 1:00 BAKST 1991 Aug 30 # independence + 3:00 RussiaAsia AZ%sT 1992 Sep lastSat 23:00 +- 4:00 - AZT 1996 # Azerbaijan time ++ 4:00 - AZT 1996 # Azerbaijan Time + 4:00 EUAsia AZ%sT 1997 + 4:00 Azer AZ%sT + + # Bahrain + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Bahrain 3:22:20 - LMT 1920 # Al Manamah ++Zone Asia/Bahrain 3:22:20 - LMT 1920 # Manamah + 4:00 - GST 1972 Jun + 3:00 - AST + +@@ -174,13 +179,8 @@ + # Daylight Saving Time from June 16 to Sept 30 + # + # Bangladesh to introduce daylight saving time likely from June 16 +-# <a href="http://www.asiantribune.com/?q=node/17288"> + # http://www.asiantribune.com/?q=node/17288 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_bangladesh02.html"> + # http://www.worldtimezone.com/dst_news/dst_news_bangladesh02.html +-# </a> + # + # "... Bangladesh government has decided to switch daylight saving time from + # June +@@ -195,17 +195,11 @@ + # the 19th and 20th, and they have not set the end date yet. + # + # Some sources: +-# <a href="http://in.reuters.com/article/southAsiaNews/idINIndia-40017620090601"> + # http://in.reuters.com/article/southAsiaNews/idINIndia-40017620090601 +-# </a> +-# <a href="http://bdnews24.com/details.php?id=85889&cid=2"> + # http://bdnews24.com/details.php?id=85889&cid=2 +-# </a> + # + # Our wrap-up: +-# <a href="http://www.timeanddate.com/news/time/bangladesh-daylight-saving-2009.html"> + # http://www.timeanddate.com/news/time/bangladesh-daylight-saving-2009.html +-# </a> + + # From A. N. M. Kamrus Saadat (2009-06-15): + # Finally we've got the official mail regarding DST start time where DST start +@@ -220,13 +214,8 @@ + # + # Following report by same newspaper-"The Daily Star Friday": + # "DST change awaits cabinet decision-Clock won't go back by 1-hr from Oct 1" +-# <a href="http://www.thedailystar.net/newDesign/news-details.php?nid=107021"> + # http://www.thedailystar.net/newDesign/news-details.php?nid=107021 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_bangladesh04.html"> + # http://www.worldtimezone.com/dst_news/dst_news_bangladesh04.html +-# </a> + + # From Steffen Thorsen (2009-10-13): + # IANS (Indo-Asian News Service) now reports: +@@ -235,22 +224,15 @@ + # "continue for an indefinite period." + # + # One of many places where it is published: +-# <a href="http://www.thaindian.com/newsportal/business/bangladesh-to-continue-indefinitely-with-advanced-time_100259987.html"> + # http://www.thaindian.com/newsportal/business/bangladesh-to-continue-indefinitely-with-advanced-time_100259987.html +-# </a> + + # From Alexander Krivenyshev (2009-12-24): + # According to Bangladesh newspaper "The Daily Star," + # Bangladesh will change its clock back to Standard Time on Dec 31, 2009. + # + # Clock goes back 1-hr on Dec 31 night. +-# <a href="http://www.thedailystar.net/newDesign/news-details.php?nid=119228"> + # http://www.thedailystar.net/newDesign/news-details.php?nid=119228 +-# </a> +-# and +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_bangladesh05.html"> + # http://www.worldtimezone.com/dst_news/dst_news_bangladesh05.html +-# </a> + # + # "...The government yesterday decided to put the clock back by one hour + # on December 31 midnight and the new time will continue until March 31, +@@ -260,17 +242,12 @@ + # From Alexander Krivenyshev (2010-03-22): + # According to Bangladesh newspaper "The Daily Star," + # Cabinet cancels Daylight Saving Time +-# <a href="http://www.thedailystar.net/newDesign/latest_news.php?nid=22817"> + # http://www.thedailystar.net/newDesign/latest_news.php?nid=22817 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html"> + # http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html +-# </a> + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Dhaka 2009 only - Jun 19 23:00 1:00 S +-Rule Dhaka 2009 only - Dec 31 23:59 0 - ++Rule Dhaka 2009 only - Dec 31 24:00 0 - + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Dhaka 6:01:40 - LMT 1890 +@@ -301,7 +278,7 @@ + + # Brunei + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Brunei 7:39:40 - LMT 1926 Mar # Bandar Seri Begawan ++Zone Asia/Brunei 7:39:40 - LMT 1926 Mar # Bandar Seri Begawan + 7:30 - BNT 1933 + 8:00 - BNT + +@@ -310,19 +287,15 @@ + # Milne says 6:24:40 was the meridian of the time ball observatory at Rangoon. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Rangoon 6:24:40 - LMT 1880 # or Yangon +- 6:24:40 - RMT 1920 # Rangoon Mean Time? +- 6:30 - BURT 1942 May # Burma Time +- 9:00 - JST 1945 May 3 +- 6:30 - MMT # Myanmar Time ++Zone Asia/Rangoon 6:24:40 - LMT 1880 # or Yangon ++ 6:24:40 - RMT 1920 # Rangoon Mean Time? ++ 6:30 - BURT 1942 May # Burma Time ++ 9:00 - JST 1945 May 3 ++ 6:30 - MMT # Myanmar Time + + # Cambodia +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Phnom_Penh 6:59:40 - LMT 1906 Jun 9 +- 7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT? +- 7:00 - ICT 1912 May +- 8:00 - ICT 1931 May +- 7:00 - ICT ++# See Asia/Bangkok. ++ + + # China + +@@ -332,12 +305,12 @@ + # From Bob Devine (1988-01-28): + # No they don't. See TIME mag, 1986-02-17 p.52. Even though + # China is across 4 physical time zones, before Feb 1, 1986 only the +-# Peking (Bejing) time zone was recognized. Since that date, China +-# has two of 'em -- Peking's and Urumqi (named after the capital of ++# Peking (Beijing) time zone was recognized. Since that date, China ++# has two of 'em - Peking's and Ürümqi (named after the capital of + # the Xinjiang Uyghur Autonomous Region). I don't know about DST for it. + # + # . . .I just deleted the DST table and this editor makes it too +-# painful to suck in another copy.. So, here is what I have for ++# painful to suck in another copy. So, here is what I have for + # DST start/end dates for Peking's time zone (info from AP): + # + # 1986 May 4 - Sept 14 +@@ -347,15 +320,16 @@ + # CHINA 8 H AHEAD OF UTC ALL OF CHINA, INCL TAIWAN + # CHINA 9 H AHEAD OF UTC APR 17 - SEP 10 + +-# From Paul Eggert (2006-03-22): +-# Shanks & Pottenger write that China (except for Hong Kong and Macau) +-# has had a single time zone since 1980 May 1, observing summer DST +-# from 1986 through 1991; this contradicts Devine's +-# note about Time magazine, though apparently _something_ happened in 1986. +-# Go with Shanks & Pottenger for now. I made up names for the other +-# pre-1980 time zones. ++# From Paul Eggert (2008-02-11): ++# Jim Mann, "A clumsy embrace for another western custom: China on daylight ++# time - sort of", Los Angeles Times, 1986-05-05 ... [says] that China began ++# observing daylight saving time in 1986. + +-# From Shanks & Pottenger: ++# From Paul Eggert (2014-06-30): ++# Shanks & Pottenger have China switching to a single time zone in 1980, but ++# this doesn't seem to be correct. They also write that China observed summer ++# DST from 1986 through 1991, which seems to match the above commentary, so ++# go with them for DST rules as follows: + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Shang 1940 only - Jun 3 0:00 1:00 D + Rule Shang 1940 1941 - Oct 1 0:00 0 S +@@ -369,7 +343,7 @@ + # historic timezones from some Taiwan websites. And yes, there are official + # Chinese names for these locales (before 1949). + # +-# From Jesper Norgaard Welen (2006-07-14): ++# From Jesper Nørgaard Welen (2006-07-14): + # I have investigated the timezones around 1970 on the + # http://www.astro.com/atlas site [with provinces and county + # boundaries summarized below].... A few other exceptions were two +@@ -380,65 +354,97 @@ + # (could be true), for the moment I am assuming that those two + # counties are mistakes in the astro.com data. + +-# From Paul Eggert (2008-02-11): +-# I just now checked Google News for western news sources that talk +-# about China's single time zone, and couldn't find anything before 1986 +-# talking about China being in one time zone. (That article was: Jim +-# Mann, "A clumsy embrace for another western custom: China on daylight +-# time--sort of", Los Angeles Times, 1986-05-05. By the way, this +-# article confirms the tz database's data claiming that China began +-# observing daylight saving time in 1986. ++# From Paul Eggert (2014-06-30): ++# Alois Treindl kindly sent me translations of the following two sources: + # +-# From Thomas S. Mullaney (2008-02-11): +-# I think you're combining two subjects that need to treated +-# separately: daylight savings (which, you're correct, wasn't +-# implemented until the 1980s) and the unified time zone centered near +-# Beijing (which was implemented in 1949). Briefly, there was also a +-# "Lhasa Time" in Tibet and "Urumqi Time" in Xinjiang. The first was +-# ceased, and the second eventually recognized (again, in the 1980s). ++# (1) ++# Guo Qingsheng (National Time-Service Center, CAS, Xi'an 710600, China) ++# Beijing Time at the Beginning of the PRC ++# China Historical Materials of Science and Technology ++# (Zhongguo ke ji shi liao, 中国科技史料), Vol. 24, No. 1 (2003) ++# It gives evidence that at the beginning of the PRC, Beijing time was ++# officially apparent solar time! However, Guo also says that the ++# evidence is dubious, as the relevant institute of astronomy had not ++# been taken over by the PRC yet. It's plausible that apparent solar ++# time was announced but never implemented, and that people continued ++# to use UT+8. As the Shanghai radio station (and I presume the ++# observatory) was still under control of French missionaries, it ++# could well have ignored any such mandate. + # +-# From Paul Eggert (2008-06-30): +-# There seems to be a good chance China switched to a single time zone in 1949 +-# rather than in 1980 as Shanks & Pottenger have it, but we don't have a +-# reliable documentary source saying so yet, so for now we still go with +-# Shanks & Pottenger. +- +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-# Changbai Time ("Long-white Time", Long-white = Heilongjiang area) ++# (2) ++# Guo Qing-sheng (Shaanxi Astronomical Observatory, CAS, Xi'an 710600, China) ++# A Study on the Standard Time Changes for the Past 100 Years in China ++# [undated and unknown publication location] ++# It says several things: ++# * The Qing dynasty used local apparent solar time throughout China. ++# * The Republic of China instituted Beijing mean solar time effective ++# the official calendar book of 1914. ++# * The French Concession in Shanghai set up signal stations in ++# French docks in the 1890s, controlled by Xujiahui (Zikawei) ++# Observatory and set to local mean time. ++# * "From the end of the 19th century" it changed to UT+8. ++# * Chinese Customs (by then reduced to a tool of foreign powers) ++# eventually standardized on this time for all ports, and it ++# became used by railways as well. ++# * In 1918 the Central Observatory proposed dividing China into ++# five time zones (see below for details). This caught on ++# at first only in coastal areas observing UT+8. ++# * During WWII all of China was in theory was at UT+7. In practice ++# this was ignored in the west, and I presume was ignored in ++# Japanese-occupied territory. ++# * Japanese-occupied Manchuria was at UT+9, i.e., Japan time. ++# * The five-zone plan was resurrected after WWII and officially put into ++# place (with some modifications) in March 1948. It's not clear ++# how well it was observed in areas under Nationalist control. ++# * The People's Liberation Army used UT+8 during the civil war. ++# ++# An AP article "Shanghai Internat'l Area Little Changed" in the ++# Lewiston (ME) Daily Sun (1939-05-29), p 17, said "Even the time is ++# different - the occupied districts going by Tokyo time, an hour ++# ahead of that prevailing in the rest of Shanghai." Guess that the ++# Xujiahui Observatory was under French control and stuck with UT+8. ++# ++# In earlier versions of this file, China had many separate Zone entries, but ++# this was based on what were apparently incorrect data in Shanks & Pottenger. ++# This has now been simplified to the two entries Asia/Shanghai and ++# Asia/Urumqi, with the others being links for backward compatibility. ++# Proposed in 1918 and theoretically in effect until 1949 (although in practice ++# mainly observed in coastal areas), the five zones were: ++# ++# Changbai Time ("Long-white Time", Long-white = Heilongjiang area) UT+8.5 ++# Asia/Harbin (currently a link to Asia/Shanghai) + # Heilongjiang (except Mohe county), Jilin +-Zone Asia/Harbin 8:26:44 - LMT 1928 # or Haerbin +- 8:30 - CHAT 1932 Mar # Changbai Time +- 8:00 - CST 1940 +- 9:00 - CHAT 1966 May +- 8:30 - CHAT 1980 May +- 8:00 PRC C%sT +-# Zhongyuan Time ("Central plain Time") ++# ++# Zhongyuan Time ("Central plain Time") UT+8 ++# Asia/Shanghai + # most of China +-# Milne gives 8:05:56.7; round to nearest. +-Zone Asia/Shanghai 8:05:57 - LMT 1928 +- 8:00 Shang C%sT 1949 +- 8:00 PRC C%sT +-# Long-shu Time (probably due to Long and Shu being two names of that area) ++# This currently represents most other zones as well, ++# as apparently these regions have been the same since 1970. ++# Milne gives 8:05:43.2 for Xujiahui Observatory time; round to nearest. ++# Guo says Shanghai switched to UT+8 "from the end of the 19th century". ++# ++# Long-shu Time (probably due to Long and Shu being two names of that area) UT+7 ++# Asia/Chongqing (currently a link to Asia/Shanghai) + # Guangxi, Guizhou, Hainan, Ningxia, Sichuan, Shaanxi, and Yunnan; + # most of Gansu; west Inner Mongolia; west Qinghai; and the Guangdong + # counties Deqing, Enping, Kaiping, Luoding, Taishan, Xinxing, + # Yangchun, Yangjiang, Yu'nan, and Yunfu. +-Zone Asia/Chongqing 7:06:20 - LMT 1928 # or Chungking +- 7:00 - LONT 1980 May # Long-shu Time +- 8:00 PRC C%sT +-# Xin-zang Time ("Xinjiang-Tibet Time") ++# ++# Xin-zang Time ("Xinjiang-Tibet Time") UT+6 ++# Asia/Urumqi ++# This currently represents Kunlun Time as well, ++# as apparently the two regions have been the same since 1970. + # The Gansu counties Aksay, Anxi, Dunhuang, Subei; west Qinghai; + # the Guangdong counties Xuwen, Haikang, Suixi, Lianjiang, + # Zhanjiang, Wuchuan, Huazhou, Gaozhou, Maoming, Dianbai, and Xinyi; + # east Tibet, including Lhasa, Chamdo, Shigaise, Jimsar, Shawan and Hutubi; +-# east Xinjiang, including Urumqi, Turpan, Karamay, Korla, Minfeng, Jinghe, ++# east Xinjiang, including Ürümqi, Turpan, Karamay, Korla, Minfeng, Jinghe, + # Wusu, Qiemo, Xinyan, Wulanwusu, Jinghe, Yumin, Tacheng, Tuoli, Emin, + # Shihezi, Changji, Yanqi, Heshuo, Tuokexun, Tulufan, Shanshan, Hami, + # Fukang, Kuitun, Kumukuli, Miquan, Qitai, and Turfan. +-Zone Asia/Urumqi 5:50:20 - LMT 1928 # or Urumchi +- 6:00 - URUT 1980 May # Urumqi Time +- 8:00 PRC C%sT +-# Kunlun Time ++# ++# Kunlun Time UT+5.5 ++# Asia/Kashgar (currently a link to Asia/Urumqi) + # West Tibet, including Pulan, Aheqi, Shufu, Shule; + # West Xinjiang, including Aksu, Atushi, Yining, Hetian, Cele, Luopu, Nileke, + # Zhaosu, Tekesi, Gongliu, Chabuchaer, Huocheng, Bole, Pishan, Suiding, +@@ -455,9 +461,9 @@ + # population of Xinjiang, typically use "Xinjiang time" which is two + # hours behind Beijing time, or UTC +0600. The government of the Xinjiang + # Uyghur Autonomous Region, (XAUR, or just Xinjiang for short) as well as +-# local governments such as the Urumqi city government use both times in ++# local governments such as the Ürümqi city government use both times in + # publications, referring to what is popularly called Xinjiang time as +-# "Urumqi time." When Uyghurs make an appointment in the Uyghur language ++# "Ürümqi time." When Uyghurs make an appointment in the Uyghur language + # they almost invariably use Xinjiang time. + # + # (Their ethnic Han compatriots would typically have no clue of its +@@ -469,21 +475,6 @@ + # the province not having dual times but four times in use at the same + # time. Some areas remained on standard Xinjiang time or Beijing time and + # others moving their clocks ahead.) +-# +-# ...an example of an official website using of Urumqi time. +-# +-# The first few lines of the Google translation of +-# <a href="http://www.fjysgl.gov.cn/show.aspx?id=2379&cid=39"> +-# http://www.fjysgl.gov.cn/show.aspx?id=2379&cid=39 +-# </a> +-# (retrieved 2009-10-13) +-# > Urumqi fire seven people are missing the alleged losses of at least +-# > 500 million yuan +-# > +-# > (Reporter Dong Liu) the day before 20:20 or so (Urumqi Time 18:20), +-# > Urumqi City Department of International Plaza Luther Qiantang River +-# > burst fire. As of yesterday, 18:30, Urumqi City Fire officers and men +-# > have worked continuously for 22 hours... + + # From Luther Ma (2009-11-19): + # With the risk of being redundant to previous answers these are the most common +@@ -494,7 +485,7 @@ + # 3. Urumqi... + # 4. Kashgar... + # ... +-# 5. It seems that Uyghurs in Urumqi has been using Xinjiang since at least the ++# 5. It seems that Uyghurs in Ürümqi has been using Xinjiang since at least the + # 1960's. I know of one Han, now over 50, who grew up in the surrounding + # countryside and used Xinjiang time as a child. + # +@@ -506,10 +497,55 @@ + # Autonomous Region under the PRC. (Before that Uyghurs, of course, would also + # not be using Beijing time, but some local time.) + +-Zone Asia/Kashgar 5:03:56 - LMT 1928 # or Kashi or Kaxgar +- 5:30 - KAST 1940 # Kashgar Time +- 5:00 - KAST 1980 May ++# From David Cochrane (2014-03-26): ++# Just a confirmation that Ürümqi time was implemented in Ürümqi on 1 Feb 1986: ++# http://content.time.com/time/magazine/article/0,9171,960684,00.html ++ ++# From Luther Ma (2014-04-22): ++# I have interviewed numerous people of various nationalities and from ++# different localities in Xinjiang and can confirm the information in Guo's ++# report regarding Xinjiang, as well as the Time article reference by David ++# Cochrane. Whether officially recognized or not (and both are officially ++# recognized), two separate times have been in use in Xinjiang since at least ++# the Cultural Revolution: Xinjiang Time (XJT), aka Ürümqi Time or local time; ++# and Beijing Time. There is no confusion in Xinjiang as to which name refers ++# to which time. Both are widely used in the province, although in some ++# population groups might be use one to the exclusion of the other. The only ++# problem is that computers and smart phones list Ürümqi (or Kashgar) as ++# having the same time as Beijing. ++ ++# From Paul Eggert (2014-06-30): ++# In the early days of the PRC, Tibet was given its own time zone (UT+6) but ++# this was withdrawn in 1959 and never reinstated; see Tubten Khétsun, ++# Memories of life in Lhasa under Chinese Rule, Columbia U Press, ISBN ++# 978-0231142861 (2008), translator's introduction by Matthew Akester, p x. ++# As this is before our 1970 cutoff, Tibet doesn't need a separate zone. ++# ++# Xinjiang Time is well-documented as being officially recognized. E.g., see ++# "The Working-Calendar for The Xinjiang Uygur Autonomous Region Government" ++# <http://www.sinkiang.gov.cn/service/ourworking/> (2014-04-22). ++# Unfortunately, we have no good records of time in Xinjiang before 1986. ++# During the 20th century parts of Xinjiang were ruled by the Qing dynasty, ++# the Republic of China, various warlords, the First and Second East Turkestan ++# Republics, the Soviet Union, the Kuomintang, and the People's Republic of ++# China, and tracking down all these organizations' timekeeping rules would be ++# quite a trick. Approximate this lost history by a transition from LMT to ++# XJT at the start of 1928, the year of accession of the warlord Jin Shuren, ++# which happens to be the date given by Shanks & Pottenger (no doubt as a ++# guess) as the transition from LMT. Ignore the usage of UT+8 before ++# 1986-02-01 under the theory that the transition date to UT+8 is unknown and ++# that the sort of users who prefer Asia/Urumqi now typically ignored the ++# UT+8 mandate back then. ++ ++# Zone NAME GMTOFF RULES FORMAT [UNTIL] ++# Beijing time, used throughout China; represented by Shanghai. ++Zone Asia/Shanghai 8:05:43 - LMT 1901 ++ 8:00 Shang C%sT 1949 + 8:00 PRC C%sT ++# Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi ++# / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.) ++Zone Asia/Urumqi 5:50:20 - LMT 1928 ++ 6:00 - XJT + + + # Hong Kong (Xianggang) +@@ -524,15 +560,11 @@ + # and incorrect rules. Although the exact switch over time is missing, I + # think 3:30 is correct. The official DST record for Hong Kong can be + # obtained from +-# <a href="http://www.hko.gov.hk/gts/time/Summertime.htm"> + # http://www.hko.gov.hk/gts/time/Summertime.htm +-# </a>. + + # From Arthur David Olson (2009-10-28): + # Here are the dates given at +-# <a href="http://www.hko.gov.hk/gts/time/Summertime.htm"> + # http://www.hko.gov.hk/gts/time/Summertime.htm +-# </a> + # as of 2009-10-28: + # Year Period + # 1941 1 Apr to 30 Sep +@@ -612,35 +644,113 @@ + + # Taiwan + +-# Shanks & Pottenger write that Taiwan observed DST during 1945, when it +-# was still controlled by Japan. This is hard to believe, but we don't +-# have any other information. +- + # From smallufo (2010-04-03): +-# According to Taiwan's CWB, +-# <a href="http://www.cwb.gov.tw/V6/astronomy/cdata/summert.htm"> ++# According to Taiwan's CWB [Central Weather Bureau], + # http://www.cwb.gov.tw/V6/astronomy/cdata/summert.htm +-# </a> + # Taipei has DST in 1979 between July 1st and Sep 30. + +-# From Arthur David Olson (2010-04-07): +-# Here's Google's translation of the table at the bottom of the "summert.htm" page: +-# Decade Name Start and end date +-# Republic of China 34 years to 40 years (AD 1945-1951 years) Summer Time May 1 to September 30 +-# 41 years of the Republic of China (AD 1952) Daylight Saving Time March 1 to October 31 +-# Republic of China 42 years to 43 years (AD 1953-1954 years) Daylight Saving Time April 1 to October 31 +-# In the 44 years to 45 years (AD 1955-1956 years) Daylight Saving Time April 1 to September 30 +-# Republic of China 46 years to 48 years (AD 1957-1959) Summer Time April 1 to September 30 +-# Republic of China 49 years to 50 years (AD 1960-1961) Summer Time June 1 to September 30 +-# Republic of China 51 years to 62 years (AD 1962-1973 years) Stop Summer Time +-# Republic of China 63 years to 64 years (1974-1975 AD) Daylight Saving Time April 1 to September 30 +-# Republic of China 65 years to 67 years (1976-1978 AD) Stop Daylight Saving Time +-# Republic of China 68 years (AD 1979) Daylight Saving Time July 1 to September 30 +-# Republic of China since 69 years (AD 1980) Stop Daylight Saving Time ++# From Yu-Cheng Chuang (2013-07-12): ++# On Dec 28, 1895, the Meiji Emperor announced Ordinance No. 167 of ++# Meiji Year 28 "The clause about standard time", mentioned that ++# Taiwan and Penghu Islands, as well as Yaeyama and Miyako Islands ++# (both in Okinawa) adopt the Western Standard Time which is based on ++# 120E. The adoption began from Jan 1, 1896. The original text can be ++# found on Wikisource: ++# http://ja.wikisource.org/wiki/標準時ニ關スル件_(公布時) ++# ... This could be the first adoption of time zone in Taiwan, because ++# during the Qing Dynasty, it seems that there was no time zone ++# declared officially. ++# ++# Later, in the beginning of World War II, on Sep 25, 1937, the Showa ++# Emperor announced Ordinance No. 529 of Showa Year 12 "The clause of ++# revision in the ordinance No. 167 of Meiji year 28 about standard ++# time", in which abolished the adoption of Western Standard Time in ++# western islands (listed above), which means the whole Japan ++# territory, including later occupations, adopt Japan Central Time ++# (UTC+9). The adoption began on Oct 1, 1937. The original text can ++# be found on Wikisource: ++# http://ja.wikisource.org/wiki/明治二十八年勅令第百六十七號標準時ニ關スル件中改正ノ件 ++# ++# That is, the time zone of Taipei switched to UTC+9 on Oct 1, 1937. ++ ++# From Yu-Cheng Chuang (2014-07-02): ++# I've found more evidence about when the time zone was switched from UTC+9 ++# back to UTC+8 after WW2. I believe it was on Sep 21, 1945. In a document ++# during Japanese era [1] in which the officer told the staff to change time ++# zone back to Western Standard Time (UTC+8) on Sep 21. And in another ++# history page of National Cheng Kung University [2], on Sep 21 there is a ++# note "from today, switch back to Western Standard Time". From these two ++# materials, I believe that the time zone change happened on Sep 21. And ++# today I have found another monthly journal called "The Astronomical Herald" ++# from The Astronomical Society of Japan [3] in which it mentioned the fact ++# that: ++# ++# 1. Standard Time of the Country (Japan) was adopted on Jan 1, 1888, using ++# the time at 135E (GMT+9) ++# ++# 2. Standard Time of the Country was renamed to Central Standard Time, on Jan ++# 1, 1898, and on the same day, the new territories Taiwan and Penghu islands, ++# as well as Yaeyama and Miyako islands, adopted a new time zone called ++# Western Standard Time, which is in GMT+8. ++# ++# 3. Western Standard Time was deprecated on Sep 30, 1937. From then all the ++# territories of Japan adopted the same time zone, which is Central Standard ++# Time. ++# ++# [1] Academica Historica, Taiwan: ++# http://163.29.208.22:8080/govsaleShowImage/connect_img.php?s=00101738900090036&e=00101738900090037 ++# [2] Nat'l Cheng Kung University 70th Anniversary Special Site: ++# http://www.ncku.edu.tw/~ncku70/menu/001/01_01.htm ++# [3] Yukio Niimi, The Standard Time in Japan (1997), p.475: ++# http://www.asj.or.jp/geppou/archive_open/1997/pdf/19971001c.pdf ++ ++# Yu-Cheng Chuang (2014-07-03): ++# I finally have found the real official gazette about changing back to ++# Western Standard Time on Sep 21 in Taiwan. It's Taiwan Governor-General ++# Bulletin No. 386 in Showa 20 years (1945), published on Sep 19, 1945. [1] ... ++# [It] abolishes Bulletin No. 207 in Showa 12 years (1937), which is a local ++# bulletin in Taiwan for that Ordinance No. 529. It also mentioned that 1am on ++# Sep 21, 1945 will be 12am on Sep 21. I think this bulletin is much more ++# official than the one I mentioned in my first mail, because it's from the ++# top-level government in Taiwan. If you're going to quote any resource, this ++# would be a good one. ++# [1] Taiwan Governor-General Gazette, No. 1018, Sep 19, 1945: ++# http://db2.th.gov.tw/db2/view/viewImg.php?imgcode=0072031018a&num=19&bgn=019&end=019&otherImg=&type=gener ++ ++# From Yu-Cheng Chuang (2014-07-02): ++# In 1946, DST in Taiwan was from May 15 and ended on Sep 30. The info from ++# Central Weather Bureau website was not correct. ++# ++# Original Bulletin: ++# http://subtpg.tpg.gov.tw/og/image2.asp?f=03502F0AKM1AF ++# http://subtpg.tpg.gov.tw/og/image2.asp?f=0350300AKM1B0 (cont.) ++# ++# In 1947, DST in Taiwan was expanded to Oct 31. There is a backup of that ++# telegram announcement from Taiwan Province Government: ++# ++# http://subtpg.tpg.gov.tw/og/image2.asp?f=0360310AKZ431 ++# ++# Here is a brief translation: ++# ++# The Summer Time this year is adopted from midnight Apr 15 until Sep 20 ++# midnight. To save (energy?) consumption, we're expanding Summer Time ++# adoption till Oct 31 midnight. ++# ++# The Central Weather Bureau website didn't mention that, however it can ++# be found from historical government announcement database. ++ ++# From Paul Eggert (2014-07-03): ++# As per Yu-Cheng Chuang, say that Taiwan was at UT+9 from 1937-10-01 ++# until 1945-09-21 at 01:00, overriding Shanks & Pottenger. ++# Likewise, use Yu-Cheng Chuang's data for DST in Taiwan. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Taiwan 1945 1951 - May 1 0:00 1:00 D +-Rule Taiwan 1945 1951 - Oct 1 0:00 0 S ++Rule Taiwan 1946 only - May 15 0:00 1:00 D ++Rule Taiwan 1946 only - Oct 1 0:00 0 S ++Rule Taiwan 1947 only - Apr 15 0:00 1:00 D ++Rule Taiwan 1947 only - Nov 1 0:00 0 S ++Rule Taiwan 1948 1951 - May 1 0:00 1:00 D ++Rule Taiwan 1948 1951 - Oct 1 0:00 0 S + Rule Taiwan 1952 only - Mar 1 0:00 1:00 D + Rule Taiwan 1952 1954 - Nov 1 0:00 0 S + Rule Taiwan 1953 1959 - Apr 1 0:00 1:00 D +@@ -648,11 +758,14 @@ + Rule Taiwan 1960 1961 - Jun 1 0:00 1:00 D + Rule Taiwan 1974 1975 - Apr 1 0:00 1:00 D + Rule Taiwan 1974 1975 - Oct 1 0:00 0 S +-Rule Taiwan 1979 only - Jun 30 0:00 1:00 D +-Rule Taiwan 1979 only - Sep 30 0:00 0 S ++Rule Taiwan 1979 only - Jul 1 0:00 1:00 D ++Rule Taiwan 1979 only - Oct 1 0:00 0 S + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Taipei 8:06:00 - LMT 1896 # or Taibei or T'ai-pei ++# Taipei or Taibei or T'ai-pei ++Zone Asia/Taipei 8:06:00 - LMT 1896 Jan 1 ++ 8:00 - JWST 1937 Oct 1 ++ 9:00 - JST 1945 Sep 21 1:00 + 8:00 Taiwan C%sT + + # Macau (Macao, Aomen) +@@ -672,7 +785,7 @@ + Rule Macau 1978 1980 - Apr Sun>=15 0:00 1:00 S + Rule Macau 1978 1980 - Oct Sun>=15 0:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Macau 7:34:20 - LMT 1912 ++Zone Asia/Macau 7:34:20 - LMT 1912 Jan 1 + 8:00 Macau MO%sT 1999 Dec 20 # return to China + 8:00 PRC C%sT + +@@ -721,7 +834,7 @@ + # republic has changed its time zone back to that of Moscow. As a result it + # is now just four hours ahead of Greenwich Mean Time, rather than five hours + # ahead. The switch was decreed by the pro-Western president of Georgia, +-# Mikhail Saakashvili, who said the change was partly prompted by the process ++# Mikheil Saakashvili, who said the change was partly prompted by the process + # of integration into Europe. + + # From Teimuraz Abashidze (2005-11-07): +@@ -734,29 +847,31 @@ + # I don't know what can be done, especially knowing that some years ago our + # DST rules where changed THREE TIMES during one month. + ++# Milne 1899 says Tbilisi (Tiflis) time was 2:59:05.7. ++# Byalokoz 1919 says Georgia was 2:59:11. ++# Go with Byalokoz. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Tbilisi 2:59:16 - LMT 1880 +- 2:59:16 - TBMT 1924 May 2 # Tbilisi Mean Time ++Zone Asia/Tbilisi 2:59:11 - LMT 1880 ++ 2:59:11 - TBMT 1924 May 2 # Tbilisi Mean Time + 3:00 - TBIT 1957 Mar # Tbilisi Time +- 4:00 RussiaAsia TBI%sT 1991 Mar 31 2:00s ++ 4:00 RussiaAsia TBI%sT 1991 Mar 31 2:00s + 3:00 1:00 TBIST 1991 Apr 9 # independence +- 3:00 RussiaAsia GE%sT 1992 # Georgia Time ++ 3:00 RussiaAsia GE%sT 1992 # Georgia Time + 3:00 E-EurAsia GE%sT 1994 Sep lastSun + 4:00 E-EurAsia GE%sT 1996 Oct lastSun + 4:00 1:00 GEST 1997 Mar lastSun + 4:00 E-EurAsia GE%sT 2004 Jun 27 +- 3:00 RussiaAsia GE%sT 2005 Mar lastSun 2:00 ++ 3:00 RussiaAsia GE%sT 2005 Mar lastSun 2:00 + 4:00 - GET + + # East Timor + + # See Indonesia for the 1945 transition. + +-# From Joao Carrascalao, brother of the former governor of East Timor, in +-# <a href="http://etan.org/et99c/december/26-31/30ETMAY.htm"> ++# From João Carrascalão, brother of the former governor of East Timor, in + # East Timor may be late for its millennium +-# </a> (1999-12-26/31): ++# <http://etan.org/et99c/december/26-31/30ETMAY.htm> (1999-12-26/31): + # Portugal tried to change the time forward in 1974 because the sun + # rises too early but the suggestion raised a lot of problems with the + # Timorese and I still don't think it would work today because it +@@ -766,25 +881,25 @@ + # We don't have any record of the above attempt. + # Most likely our records are incomplete, but we have no better data. + +-# <a href="http://www.hri.org/news/world/undh/last/00-08-16.undh.html"> + # From Manoel de Almeida e Silva, Deputy Spokesman for the UN Secretary-General +-# (2000-08-16)</a>: ++# http://www.hri.org/news/world/undh/2000/00-08-16.undh.html ++# (2000-08-16): + # The Cabinet of the East Timor Transition Administration decided + # today to advance East Timor's time by one hour. The time change, + # which will be permanent, with no seasonal adjustment, will happen at + # midnight on Saturday, September 16. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Dili 8:22:20 - LMT 1912 ++Zone Asia/Dili 8:22:20 - LMT 1912 Jan 1 + 8:00 - TLT 1942 Feb 21 23:00 # E Timor Time + 9:00 - JST 1945 Sep 23 + 9:00 - TLT 1976 May 3 +- 8:00 - WITA 2000 Sep 17 00:00 ++ 8:00 - WITA 2000 Sep 17 0:00 + 9:00 - TLT + + # India + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Kolkata 5:53:28 - LMT 1880 # Kolkata ++Zone Asia/Kolkata 5:53:28 - LMT 1880 # Kolkata + 5:53:20 - HMT 1941 Oct # Howrah Mean Time? + 6:30 - BURT 1942 May 15 # Burma Time + 5:30 - IST 1942 Sep +@@ -797,8 +912,12 @@ + + # Indonesia + # ++# From Paul Eggert (2014-09-06): ++# The 1876 Report of the Secretary of the [US] Navy, p 306 says that Batavia ++# civil time was 7:07:12.5; round to even for Jakarta. ++# + # From Gwillim Law (2001-05-28), overriding Shanks & Pottenger: +-# <http://www.sumatera-inc.com/go_to_invest/about_indonesia.asp#standtime> ++# http://www.sumatera-inc.com/go_to_invest/about_indonesia.asp#standtime + # says that Indonesia's time zones changed on 1988-01-01. Looking at some + # time zone maps, I think that must refer to Western Borneo (Kalimantan Barat + # and Kalimantan Tengah) switching from UTC+8 to UTC+7. +@@ -810,7 +929,7 @@ + # other formal surrender ceremonies were September 9, 11, and 13, plus + # September 12 for the regional surrender to Mountbatten in Singapore. + # These would be the earliest possible times for a change. +-# Regimes horaires pour le monde entier, by Henri Le Corre, (Editions ++# Régimes horaires pour le monde entier, by Henri Le Corre, (Éditions + # Traditionnelles, 1987, Paris) says that Java and Madura switched + # from JST to UTC+07:30 on 1945-09-23, and gives 1944-09-01 for Jayapura + # (Hollandia). For now, assume all Indonesian locations other than Jayapura +@@ -835,7 +954,7 @@ + # Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13, + # but this must be a typo. + 7:07:12 - BMT 1923 Dec 31 23:47:12 # Batavia +- 7:20 - JAVT 1932 Nov # Java Time ++ 7:20 - JAVT 1932 Nov # Java Time + 7:30 - WIB 1942 Mar 23 + 9:00 - JST 1945 Sep 23 + 7:30 - WIB 1948 May +@@ -861,7 +980,7 @@ + # Maluku Islands, West Papua, Papua + Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov + 9:00 - WIT 1944 Sep 1 +- 9:30 - CST 1964 ++ 9:30 - ACST 1964 + 9:00 - WIT + + # Iran +@@ -927,7 +1046,7 @@ + # Several of my users have reported that Iran will not observe DST anymore: + # http://www.irna.ir/en/news/view/line-17/0603193812164948.htm + # +-# From Reuters (2007-09-16), with a heads-up from Jesper Norgaard Welen: ++# From Reuters (2007-09-16), with a heads-up from Jesper Nørgaard Welen: + # ... the Guardian Council ... approved a law on Sunday to re-introduce + # daylight saving time ... + # http://uk.reuters.com/article/oilRpt/idUKBLA65048420070916 +@@ -993,7 +1112,7 @@ + Rule Iran 2036 2037 - Sep 21 0:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Tehran 3:25:44 - LMT 1916 +- 3:25:44 - TMT 1946 # Tehran Mean Time ++ 3:25:44 - TMT 1946 # Tehran Mean Time + 3:30 - IRST 1977 Nov + 4:00 Iran IR%sT 1979 + 3:30 Iran IR%sT +@@ -1018,17 +1137,11 @@ + # From Steffen Thorsen (2008-03-10): + # The cabinet in Iraq abolished DST last week, according to the following + # news sources (in Arabic): +-# <a href="http://www.aljeeran.net/wesima_articles/news-20080305-98602.html"> + # http://www.aljeeran.net/wesima_articles/news-20080305-98602.html +-# </a> +-# <a href="http://www.aswataliraq.info/look/article.tpl?id=2047&IdLanguage=17&IdPublication=4&NrArticle=71743&NrIssue=1&NrSection=10"> + # http://www.aswataliraq.info/look/article.tpl?id=2047&IdLanguage=17&IdPublication=4&NrArticle=71743&NrIssue=1&NrSection=10 +-# </a> + # + # We have published a short article in English about the change: +-# <a href="http://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html"> + # http://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html +-# </a> + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Iraq 1982 only - May 1 0:00 1:00 D +@@ -1037,14 +1150,14 @@ + Rule Iraq 1984 1985 - Apr 1 0:00 1:00 D + Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 S + Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 D +-# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo. ++# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the ':01' is a typo. + # Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this. + # + Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 D + Rule Iraq 1991 2007 - Oct 1 3:00s 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Baghdad 2:57:40 - LMT 1890 +- 2:57:36 - BMT 1918 # Baghdad Mean Time? ++ 2:57:36 - BMT 1918 # Baghdad Mean Time? + 3:00 - AST 1982 May + 3:00 Iraq A%sT + +@@ -1272,7 +1385,7 @@ + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Jerusalem 2:20:54 - LMT 1880 +- 2:20:40 - JMT 1918 # Jerusalem Mean Time? ++ 2:20:40 - JMT 1918 # Jerusalem Mean Time? + 2:00 Zion I%sT + + +@@ -1281,15 +1394,15 @@ + + # Japan + +-# `9:00' and `JST' is from Guy Harris. ++# '9:00' and 'JST' is from Guy Harris. + + # From Paul Eggert (1995-03-06): + # Today's _Asahi Evening News_ (page 4) reports that Japan had +-# daylight saving between 1948 and 1951, but ``the system was discontinued +-# because the public believed it would lead to longer working hours.'' ++# daylight saving between 1948 and 1951, but "the system was discontinued ++# because the public believed it would lead to longer working hours." + +-# From Mayumi Negishi in the 2005-08-10 Japan Times +-# <http://www.japantimes.co.jp/cgi-bin/getarticle.pl5?nn20050810f2.htm>: ++# From Mayumi Negishi in the 2005-08-10 Japan Times: ++# http://www.japantimes.co.jp/cgi-bin/getarticle.pl5?nn20050810f2.htm + # Occupation authorities imposed daylight-saving time on Japan on + # [1948-05-01].... But lack of prior debate and the execution of + # daylight-saving time just three days after the bill was passed generated +@@ -1313,7 +1426,8 @@ + + # From Hideyuki Suzuki (1998-11-09): + # 'Tokyo' usually stands for the former location of Tokyo Astronomical +-# Observatory: E 139 44' 40".90 (9h 18m 58s.727), N 35 39' 16".0. ++# Observatory: 139 degrees 44' 40.90" E (9h 18m 58.727s), ++# 35 degrees 39' 16.0" N. + # This data is from 'Rika Nenpyou (Chronological Scientific Tables) 1996' + # edited by National Astronomical Observatory of Japan.... + # JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST). +@@ -1321,10 +1435,10 @@ + + # From Hideyuki Suzuki (1998-11-16): + # The ordinance No. 51 (1886) established "standard time" in Japan, +-# which stands for the time on E 135 degree. ++# which stands for the time on 135 degrees E. + # In the ordinance No. 167 (1895), "standard time" was renamed to "central + # standard time". And the same ordinance also established "western standard +-# time", which stands for the time on E 120 degree.... But "western standard ++# time", which stands for the time on 120 degrees E.... But "western standard + # time" was abolished in the ordinance No. 529 (1937). In the ordinance No. + # 167, there is no mention regarding for what place western standard time is + # standard.... +@@ -1332,27 +1446,33 @@ + # I wrote "ordinance" above, but I don't know how to translate. + # In Japanese it's "chokurei", which means ordinance from emperor. + +-# Shanks & Pottenger claim JST in use since 1896, and that a few +-# places (e.g. Ishigaki) use +0800; go with Suzuki. Guess that all +-# ordinances took effect on Jan 1. ++# From Yu-Cheng Chuang (2013-07-12): ++# ...the Meiji Emperor announced Ordinance No. 167 of Meiji Year 28 "The clause ++# about standard time" ... The adoption began from Jan 1, 1896. ++# http://ja.wikisource.org/wiki/標準時ニ關スル件_(公布時) ++# ++# ...the Showa Emperor announced Ordinance No. 529 of Showa Year 12 ... which ++# means the whole Japan territory, including later occupations, adopt Japan ++# Central Time (UTC+9). The adoption began on Oct 1, 1937. ++# http://ja.wikisource.org/wiki/明治二十八年勅令第百六十七號標準時ニ關スル件中改正ノ件 + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u +- 9:00 - JST 1896 +- 9:00 - CJT 1938 ++ 9:00 - JST 1896 Jan 1 ++ 9:00 - JCST 1937 Oct 1 + 9:00 Japan J%sT + # Since 1938, all Japanese possessions have been like Asia/Tokyo. + + # Jordan + # +-# From <a href="http://star.arabia.com/990701/JO9.html"> +-# Jordan Week (1999-07-01) </a> via Steffen Thorsen (1999-09-09): ++# From <http://star.arabia.com/990701/JO9.html> ++# Jordan Week (1999-07-01) via Steffen Thorsen (1999-09-09): + # Clocks in Jordan were forwarded one hour on Wednesday at midnight, + # in accordance with the government's decision to implement summer time + # all year round. + # +-# From <a href="http://star.arabia.com/990930/JO9.html"> +-# Jordan Week (1999-09-30) </a> via Steffen Thorsen (1999-11-09): ++# From <http://star.arabia.com/990930/JO9.html> ++# Jordan Week (1999-09-30) via Steffen Thorsen (1999-11-09): + # Winter time starts today Thursday, 30 September. Clocks will be turned back + # by one hour. This is the latest government decision and it's final! + # The decision was taken because of the increase in working hours in +@@ -1372,9 +1492,7 @@ + + # From Steffen Thorsen (2009-04-02): + # This single one might be good enough, (2009-03-24, Arabic): +-# <a href="http://petra.gov.jo/Artical.aspx?Lng=2&Section=8&Artical=95279"> + # http://petra.gov.jo/Artical.aspx?Lng=2&Section=8&Artical=95279 +-# </a> + # + # Google's translation: + # +@@ -1465,9 +1583,8 @@ + # - Qyzylorda switched from +5:00 to +6:00 on 1992-01-19 02:00. + # - Oral switched from +5:00 to +4:00 in spring 1989. + +-# <a href="http://www.kazsociety.org.uk/news/2005/03/30.htm"> +-# From Kazakhstan Embassy's News Bulletin #11 (2005-03-21): +-# </a> ++# From Kazakhstan Embassy's News Bulletin #11 ++# <http://www.kazsociety.org.uk/news/2005/03/30.htm> (2005-03-21): + # The Government of Kazakhstan passed a resolution March 15 abolishing + # daylight saving time citing lack of economic benefits and health + # complications coupled with a decrease in productivity. +@@ -1500,10 +1617,10 @@ + 6:00 - KIZT 1982 Apr 1 + 5:00 RussiaAsia KIZ%sT 1991 + 5:00 - KIZT 1991 Dec 16 # independence +- 5:00 - QYZT 1992 Jan 19 2:00 ++ 5:00 - QYZT 1992 Jan 19 2:00 + 6:00 RussiaAsia QYZ%sT 2005 Mar 15 + 6:00 - QYZT +-# Aqtobe (aka Aktobe, formerly Akt'ubinsk) ++# Aqtobe (aka Aktobe, formerly Aktyubinsk) + Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2 + 4:00 - AKTT 1930 Jun 21 # Aktyubinsk Time + 5:00 - AKTT 1981 Apr 1 +@@ -1523,7 +1640,7 @@ + 6:00 - SHET 1982 Apr 1 + 5:00 RussiaAsia SHE%sT 1991 + 5:00 - SHET 1991 Dec 16 # independence +- 5:00 RussiaAsia AQT%sT 1995 Mar lastSun 2:00 # Aqtau Time ++ 5:00 RussiaAsia AQT%sT 1995 Mar lastSun 2:00 # Aqtau Time + 4:00 RussiaAsia AQT%sT 2005 Mar 15 + 5:00 - AQTT + # West Kazakhstan +@@ -1532,7 +1649,7 @@ + 5:00 - URAT 1981 Apr 1 + 5:00 1:00 URAST 1981 Oct 1 + 6:00 - URAT 1982 Apr 1 +- 5:00 RussiaAsia URA%sT 1989 Mar 26 2:00 ++ 5:00 RussiaAsia URA%sT 1989 Mar 26 2:00 + 4:00 RussiaAsia URA%sT 1991 + 4:00 - URAT 1991 Dec 16 # independence + 4:00 RussiaAsia ORA%sT 2005 Mar 15 # Oral Time +@@ -1543,7 +1660,7 @@ + + # From Paul Eggert (2005-08-15): + # According to an article dated today in the Kyrgyzstan Development Gateway +-# <http://eng.gateway.kg/cgi-bin/page.pl?id=1&story_name=doc9979.shtml> ++# http://eng.gateway.kg/cgi-bin/page.pl?id=1&story_name=doc9979.shtml + # Kyrgyzstan is canceling the daylight saving time system. I take the article + # to mean that they will leave their clocks at 6 hours ahead of UTC. + # From Malik Abdugaliev (2005-09-21): +@@ -1558,68 +1675,92 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2 + 5:00 - FRUT 1930 Jun 21 # Frunze Time +- 6:00 RussiaAsia FRU%sT 1991 Mar 31 2:00s +- 5:00 1:00 FRUST 1991 Aug 31 2:00 # independence +- 5:00 Kyrgyz KG%sT 2005 Aug 12 # Kyrgyzstan Time ++ 6:00 RussiaAsia FRU%sT 1991 Mar 31 2:00s ++ 5:00 1:00 FRUST 1991 Aug 31 2:00 # independence ++ 5:00 Kyrgyz KG%sT 2005 Aug 12 # Kyrgyzstan Time + 6:00 - KGT + + ############################################################################### + + # Korea (North and South) + +-# From Annie I. Bang (2006-07-10) in +-# <http://www.koreaherald.co.kr/SITE/data/html_dir/2006/07/10/200607100012.asp>: +-# The Ministry of Commerce, Industry and Energy has already +-# commissioned a research project [to reintroduce DST] and has said +-# the system may begin as early as 2008.... Korea ran a daylight +-# saving program from 1949-61 but stopped it during the 1950-53 Korean War. ++# From Annie I. Bang (2006-07-10): ++# http://www.koreaherald.com/view.php?ud=200607100012 ++# Korea ran a daylight saving program from 1949-61 but stopped it ++# during the 1950-53 Korean War. The system was temporarily enforced ++# between 1987 and 1988 ... + +-# From Shanks & Pottenger: ++# From Sanghyuk Jung (2014-10-29): ++# http://mm.icann.org/pipermail/tz/2014-October/021830.html ++# According to the Korean Wikipedia ++# http://ko.wikipedia.org/wiki/한국_표준시 ++# [oldid=12896437 2014-09-04 08:03 UTC] ++# DST in Republic of Korea was as follows.... And I checked old ++# newspapers in Korean, all articles correspond with data in Wikipedia. ++# For example, the article in 1948 (Korean Language) proved that DST ++# started at June 1 in that year. For another example, the article in ++# 1988 said that DST started at 2:00 AM in that year. ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule ROK 1960 only - May 15 0:00 1:00 D +-Rule ROK 1960 only - Sep 13 0:00 0 S +-Rule ROK 1987 1988 - May Sun>=8 0:00 1:00 D +-Rule ROK 1987 1988 - Oct Sun>=8 0:00 0 S ++Rule ROK 1948 only - Jun 1 0:00 1:00 D ++Rule ROK 1948 only - Sep 13 0:00 0 S ++Rule ROK 1949 only - Apr 3 0:00 1:00 D ++Rule ROK 1949 1951 - Sep Sun>=8 0:00 0 S ++Rule ROK 1950 only - Apr 1 0:00 1:00 D ++Rule ROK 1951 only - May 6 0:00 1:00 D ++Rule ROK 1955 only - May 5 0:00 1:00 D ++Rule ROK 1955 only - Sep 9 0:00 0 S ++Rule ROK 1956 only - May 20 0:00 1:00 D ++Rule ROK 1956 only - Sep 30 0:00 0 S ++Rule ROK 1957 1960 - May Sun>=1 0:00 1:00 D ++Rule ROK 1957 1960 - Sep Sun>=18 0:00 0 S ++Rule ROK 1987 1988 - May Sun>=8 2:00 1:00 D ++Rule ROK 1987 1988 - Oct Sun>=8 3:00 0 S ++ ++# From Paul Eggert (2014-10-30): ++# The Korean Wikipedia entry gives the following sources for UT offsets: ++# ++# 1908: Official Journal Article No. 3994 (Edict No. 5) ++# 1912: Governor-General of Korea Official Gazette Issue No. 367 ++# (Announcement No. 338) ++# 1954: Presidential Decree No. 876 (1954-03-17) ++# 1961: Law No. 676 (1961-08-07) ++# 1987: Law No. 3919 (1986-12-31) ++# ++# The Wikipedia entry also has confusing information about a change ++# to UT+9 in April 1910, but then what would be the point of the later change ++# to UT+9 on 1912-01-01? Omit the 1910 change for now. ++# ++# I guessed that time zone abbreviations through 1945 followed the same ++# rules as discussed under Taiwan, with nominal switches from JST to KST ++# when the respective cities were taken over by the Allies after WWII. ++# ++# For Pyongyang we have no information; guess no changes since World War II. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Seoul 8:27:52 - LMT 1890 +- 8:30 - KST 1904 Dec +- 9:00 - KST 1928 +- 8:30 - KST 1932 ++Zone Asia/Seoul 8:27:52 - LMT 1908 Apr 1 ++ 8:30 - KST 1912 Jan 1 ++ 9:00 - JCST 1937 Oct 1 ++ 9:00 - JST 1945 Sep 8 + 9:00 - KST 1954 Mar 21 +- 8:00 ROK K%sT 1961 Aug 10 +- 8:30 - KST 1968 Oct ++ 8:30 ROK K%sT 1961 Aug 10 + 9:00 ROK K%sT +-Zone Asia/Pyongyang 8:23:00 - LMT 1890 +- 8:30 - KST 1904 Dec +- 9:00 - KST 1928 +- 8:30 - KST 1932 +- 9:00 - KST 1954 Mar 21 +- 8:00 - KST 1961 Aug 10 ++Zone Asia/Pyongyang 8:23:00 - LMT 1908 Apr 1 ++ 8:30 - KST 1912 Jan 1 ++ 9:00 - JCST 1937 Oct 1 ++ 9:00 - JST 1945 Aug 24 + 9:00 - KST + + ############################################################################### + + # Kuwait + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-# From the Arab Times (2007-03-14): +-# The Civil Service Commission (CSC) has approved a proposal forwarded +-# by MP Ahmad Baqer on implementing the daylight saving time (DST) in +-# Kuwait starting from April until the end of Sept this year, reports Al-Anba. +-# <http://www.arabtimesonline.com/arabtimes/kuwait/Viewdet.asp?ID=9950>. +-# From Paul Eggert (2007-03-29): +-# We don't know the details, or whether the approval means it'll happen, +-# so for now we assume no DST. + Zone Asia/Kuwait 3:11:56 - LMT 1950 + 3:00 - AST + + # Laos +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Vientiane 6:50:24 - LMT 1906 Jun 9 # or Viangchan +- 7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT? +- 7:00 - ICT 1912 May +- 8:00 - ICT 1931 May +- 7:00 - ICT ++# See Asia/Bangkok. ++ + + # Lebanon + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -1657,8 +1798,8 @@ + Rule NBorneo 1935 1941 - Dec 14 0:00 0 - + # + # peninsular Malaysia +-# The data here are taken from Mok Ly Yng (2003-10-30) +-# <http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html>. ++# taken from Mok Ly Yng (2003-10-30) ++# http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Kuala_Lumpur 6:46:46 - LMT 1901 Jan 1 + 6:55:25 - SMT 1905 Jun 1 # Singapore M.T. +@@ -1670,12 +1811,12 @@ + 7:30 - MALT 1982 Jan 1 + 8:00 - MYT # Malaysia Time + # Sabah & Sarawak +-# From Paul Eggert (2006-03-22): +-# The data here are mostly from Shanks & Pottenger, but the 1942, 1945 and 1982 +-# transition dates are from Mok Ly Yng. ++# From Paul Eggert (2014-08-12): ++# The data entries here are mostly from Shanks & Pottenger, but the 1942, 1945 ++# and 1982 transition dates are from Mok Ly Yng. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Kuching 7:21:20 - LMT 1926 Mar +- 7:30 - BORT 1933 # Borneo Time ++ 7:30 - BORT 1933 # Borneo Time + 8:00 NBorneo BOR%sT 1942 Feb 16 + 9:00 - JST 1945 Sep 12 + 8:00 - BORT 1982 Jan 1 +@@ -1683,22 +1824,21 @@ + + # Maldives + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Indian/Maldives 4:54:00 - LMT 1880 # Male +- 4:54:00 - MMT 1960 # Male Mean Time +- 5:00 - MVT # Maldives Time ++Zone Indian/Maldives 4:54:00 - LMT 1880 # Male ++ 4:54:00 - MMT 1960 # Male Mean Time ++ 5:00 - MVT # Maldives Time + + # Mongolia + + # Shanks & Pottenger say that Mongolia has three time zones, but +-# usno1995 and the CIA map Standard Time Zones of the World (2005-03) +-# both say that it has just one. ++# The USNO (1995-12-21) and the CIA map Standard Time Zones of the World ++# (2005-03) both say that it has just one. + + # From Oscar van Vlijmen (1999-12-11): +-# <a href="http://www.mongoliatourism.gov.mn/general.htm"> + # General Information Mongolia +-# </a> (1999-09) ++# <http://www.mongoliatourism.gov.mn/general.htm> (1999-09) + # "Time: Mongolia has two time zones. Three westernmost provinces of +-# Bayan-Ulgii, Uvs, and Hovd are one hour earlier than the capital city, and ++# Bayan-Ölgii, Uvs, and Hovd are one hour earlier than the capital city, and + # the rest of the country follows the Ulaanbaatar time, which is UTC/GMT plus + # eight hours." + +@@ -1709,7 +1849,7 @@ + # of implementation may have been different.... + # Some maps in the past have indicated that there was an additional time + # zone in the eastern part of Mongolia, including the provinces of Dornod, +-# Suhbaatar, and possibly Khentij. ++# Sükhbaatar, and possibly Khentii. + + # From Paul Eggert (1999-12-15): + # Naming and spelling is tricky in Mongolia. +@@ -1723,10 +1863,10 @@ + # (adopted DST on 2001-04-27 02:00 local time, ending 2001-09-28), + # there are three time zones. + # +-# Provinces [at 7:00]: Bayan-ulgii, Uvs, Khovd, Zavkhan, Govi-Altai +-# Provinces [at 8:00]: Khovsgol, Bulgan, Arkhangai, Khentii, Tov, +-# Bayankhongor, Ovorkhangai, Dundgovi, Dornogovi, Omnogovi +-# Provinces [at 9:00]: Dornod, Sukhbaatar ++# Provinces [at 7:00]: Bayan-Ölgii, Uvs, Khovd, Zavkhan, Govi-Altai ++# Provinces [at 8:00]: Khövsgöl, Bulgan, Arkhangai, Khentii, Töv, ++# Bayankhongor, Övörkhangai, Dundgovi, Dornogovi, Ömnögovi ++# Provinces [at 9:00]: Dornod, Sükhbaatar + # + # [The province of Selenge is omitted from the above lists.] + +@@ -1743,16 +1883,16 @@ + # We have wildly conflicting information about Mongolia's time zones. + # Bill Bonnet (2005-05-19) reports that the US Embassy in Ulaanbaatar says + # there is only one time zone and that DST is observed, citing Microsoft +-# Windows XP as the source. Risto Nykanen (2005-05-16) reports that ++# Windows XP as the source. Risto Nykänen (2005-05-16) reports that + # travelmongolia.org says there are two time zones (UTC+7, UTC+8) with no DST. + # Oscar van Vlijmen (2005-05-20) reports that the Mongolian Embassy in + # Washington, DC says there are two time zones, with DST observed. + # He also found +-# <http://ubpost.mongolnews.mn/index.php?subaction=showcomments&id=1111634894&archive=&start_from=&ucat=1&> ++# http://ubpost.mongolnews.mn/index.php?subaction=showcomments&id=1111634894&archive=&start_from=&ucat=1& + # which also says that there is DST, and which has a comment by "Toddius" + # (2005-03-31 06:05 +0700) saying "Mongolia actually has 3.5 time zones. + # The West (OLGII) is +7 GMT, most of the country is ULAT is +8 GMT +-# and some Eastern provinces are +9 GMT but Sukhbaatar Aimag is SUHK +8.5 GMT. ++# and some Eastern provinces are +9 GMT but Sükhbaatar Aimag is SUHK +8.5 GMT. + # The SUKH timezone is new this year, it is one of the few things the + # parliament passed during the tumultuous winter session." + # For now, let's ignore this information, until we have more confirmation. +@@ -1768,29 +1908,23 @@ + # +08:00 instead. Different sources appear to disagree with the tz + # database on this, e.g.: + # +-# <a href="http://www.timeanddate.com/worldclock/city.html?n=1026"> + # http://www.timeanddate.com/worldclock/city.html?n=1026 +-# </a> +-# <a href="http://www.worldtimeserver.com/current_time_in_MN.aspx"> + # http://www.worldtimeserver.com/current_time_in_MN.aspx +-# </a> + # + # both say GMT+08:00. + + # From Steffen Thorsen (2008-03-31): + # eznis airways, which operates several domestic flights, has a flight + # schedule here: +-# <a href="http://www.eznis.com/Container.jsp?id=112"> + # http://www.eznis.com/Container.jsp?id=112 +-# </a> + # (click the English flag for English) + # +-# There it appears that flights between Choibalsan and Ulaanbatar arrive ++# There it appears that flights between Choibalsan and Ulaanbaatar arrive + # about 1:35 - 1:50 hours later in local clock time, no matter the +-# direction, while Ulaanbaatar-Khvod takes 2 hours in the Eastern +-# direction and 3:35 back, which indicates that Ulaanbatar and Khvod are ++# direction, while Ulaanbaatar-Khovd takes 2 hours in the Eastern ++# direction and 3:35 back, which indicates that Ulaanbaatar and Khovd are + # in different time zones (like we know about), while Choibalsan and +-# Ulaanbatar are in the same time zone (correction needed). ++# Ulaanbaatar are in the same time zone (correction needed). + + # From Arthur David Olson (2008-05-19): + # Assume that Choibalsan is indeed offset by 8:00. +@@ -1806,7 +1940,7 @@ + # (1996-09) says 1996-10-25. Go with Shanks & Pottenger through 1998. + # + # Shanks & Pottenger say that the Sept. 1984 through Sept. 1990 switches +-# in Choibalsan (more precisely, in Dornod and Sukhbaatar) took place ++# in Choibalsan (more precisely, in Dornod and Sükhbaatar) took place + # at 02:00 standard time, not at 00:00 local time as in the rest of + # the country. That would be odd, and possibly is a result of their + # correction of 02:00 (in the previous edition) not being done correctly +@@ -1822,13 +1956,13 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + # Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta + Zone Asia/Hovd 6:06:36 - LMT 1905 Aug +- 6:00 - HOVT 1978 # Hovd Time ++ 6:00 - HOVT 1978 # Hovd Time + 7:00 Mongol HOV%sT + # Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga + Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug +- 7:00 - ULAT 1978 # Ulaanbaatar Time ++ 7:00 - ULAT 1978 # Ulaanbaatar Time + 8:00 Mongol ULA%sT +-# Choibalsan, a.k.a. Bajan Tuemen, Bajan Tumen, Chojbalsan, ++# Choibalsan, a.k.a. Bajan Tümen, Bajan Tumen, Chojbalsan, + # Choybalsan, Sanbejse, Tchoibalsan + Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug + 7:00 - ULAT 1978 +@@ -1860,7 +1994,7 @@ + # 00:01 was to make it clear which day it was on. + + # From Paul Eggert (2002-03-15): +-# Jesper Norgaard found this URL: ++# Jesper Nørgaard found this URL: + # http://www.pak.gov.pk/public/news/app/app06_dec.htm + # (dated 2001-12-06) which says that the Cabinet adopted a scheme "to + # advance the clocks by one hour on the night between the first +@@ -1892,43 +2026,30 @@ + # Here is an article that Pakistan plan to introduce Daylight Saving Time + # on June 1, 2008 for 3 months. + # +-# "... The federal cabinet on Wednesday announced a new conservation plan to help +-# reduce load shedding by approving the closure of commercial centres at 9pm and +-# moving clocks forward by one hour for the next three months. +-# ...." ++# "... The federal cabinet on Wednesday announced a new conservation plan to ++# help reduce load shedding by approving the closure of commercial centres at ++# 9pm and moving clocks forward by one hour for the next three months. ...." + # +-# <a href="http://www.worldtimezone.net/dst_news/dst_news_pakistan01.html"> + # http://www.worldtimezone.net/dst_news/dst_news_pakistan01.html +-# </a> +-# OR +-# <a href="http://www.dailytimes.com.pk/default.asp?page=2008%5C05%5C15%5Cstory_15-5-2008_pg1_4"> + # http://www.dailytimes.com.pk/default.asp?page=2008%5C05%5C15%5Cstory_15-5-2008_pg1_4 +-# </a> + + # From Arthur David Olson (2008-05-19): + # XXX--midnight transitions is a guess; 2008 only is a guess. + + # From Alexander Krivenyshev (2008-08-28): + # Pakistan government has decided to keep the watches one-hour advanced +-# for another 2 months--plan to return to Standard Time on October 31 ++# for another 2 months - plan to return to Standard Time on October 31 + # instead of August 31. + # +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_pakistan02.html"> + # http://www.worldtimezone.com/dst_news/dst_news_pakistan02.html +-# </a> +-# OR +-# <a href="http://dailymailnews.com/200808/28/news/dmbrn03.html"> + # http://dailymailnews.com/200808/28/news/dmbrn03.html +-# </a> + + # From Alexander Krivenyshev (2009-04-08): + # Based on previous media reports that "... proposed plan to + # advance clocks by one hour from May 1 will cause disturbance + # to the working schedules rather than bringing discipline in + # official working." +-# <a href="http://www.thenews.com.pk/daily_detail.asp?id=171280"> + # http://www.thenews.com.pk/daily_detail.asp?id=171280 +-# </a> + # + # recent news that instead of May 2009 - Pakistan plan to + # introduce DST from April 15, 2009 +@@ -1936,15 +2057,8 @@ + # FYI: Associated Press Of Pakistan + # April 08, 2009 + # Cabinet okays proposal to advance clocks by one hour from April 15 +-# <a href="http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=73043&Itemid=1"> + # http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=73043&Itemid=1 +-# </a> +-# +-# or +-# +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_pakistan05.html"> + # http://www.worldtimezone.com/dst_news/dst_news_pakistan05.html +-# </a> + # + # .... + # The Federal Cabinet on Wednesday approved the proposal to +@@ -1957,34 +2071,20 @@ + # clocks backward by one hour from October 1. A formal announcement to + # this effect will be made after the Prime Minister grants approval in + # this regard." +-# <a href="http://www.thenews.com.pk/updates.asp?id=87168"> + # http://www.thenews.com.pk/updates.asp?id=87168 +-# </a> + + # From Alexander Krivenyshev (2009-09-28): + # According to Associated Press Of Pakistan, it is confirmed that +-# Pakistan clocks across the country would be turned back by an hour from October +-# 1, 2009. ++# Pakistan clocks across the country would be turned back by an hour from ++# October 1, 2009. + # + # "Clocks to go back one hour from 1 Oct" +-# <a href="http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=86715&Itemid=2"> + # http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=86715&Itemid=2 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_pakistan07.htm"> + # http://www.worldtimezone.com/dst_news/dst_news_pakistan07.htm +-# </a> +- ++# + # From Steffen Thorsen (2009-09-29): +-# Alexander Krivenyshev wrote: +-# > According to Associated Press Of Pakistan, it is confirmed that +-# > Pakistan clocks across the country would be turned back by an hour from October +-# > 1, 2009. +-# + # Now they seem to have changed their mind, November 1 is the new date: +-# <a href="http://www.thenews.com.pk/top_story_detail.asp?Id=24742"> + # http://www.thenews.com.pk/top_story_detail.asp?Id=24742 +-# </a> + # "The country's clocks will be reversed by one hour on November 1. + # Officials of Federal Ministry for Interior told this to Geo News on + # Monday." +@@ -1996,11 +2096,9 @@ + # + # We have confirmed this year's end date with both with the Ministry of + # Water and Power and the Pakistan Electric Power Company: +-# <a href="http://www.timeanddate.com/news/time/pakistan-ends-dst09.html"> + # http://www.timeanddate.com/news/time/pakistan-ends-dst09.html +-# </a> + +-# From Christoph Goehre (2009-10-01): ++# From Christoph Göhre (2009-10-01): + # [T]he German Consulate General in Karachi reported me today that Pakistan + # will go back to standard time on 1st of November. + +@@ -2016,22 +2114,17 @@ + # Now, it seems that the decision to not observe DST in final: + # + # "Govt Withdraws Plan To Advance Clocks" +-# <a href="http://www.apakistannews.com/govt-withdraws-plan-to-advance-clocks-172041"> + # http://www.apakistannews.com/govt-withdraws-plan-to-advance-clocks-172041 +-# </a> + # + # "People laud PM's announcement to end DST" +-# <a href="http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=99374&Itemid=2"> + # http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=99374&Itemid=2 +-# </a> + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S + Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 - + Rule Pakistan 2008 only - Jun 1 0:00 1:00 S +-Rule Pakistan 2008 only - Nov 1 0:00 0 - ++Rule Pakistan 2008 2009 - Nov 1 0:00 0 - + Rule Pakistan 2009 only - Apr 15 0:00 1:00 S +-Rule Pakistan 2009 only - Nov 1 0:00 0 - + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Karachi 4:28:12 - LMT 1907 +@@ -2105,10 +2198,9 @@ + # the PA has decided to implement DST in April. + + # From Paul Eggert (1999-09-20): +-# Daoud Kuttab writes in +-# <a href="http://www.jpost.com/com/Archive/22.Apr.1999/Opinion/Article-2.html"> +-# Holiday havoc +-# </a> (Jerusalem Post, 1999-04-22) that ++# Daoud Kuttab writes in Holiday havoc ++# http://www.jpost.com/com/Archive/22.Apr.1999/Opinion/Article-2.html ++# (Jerusalem Post, 1999-04-22) that + # the Palestinian National Authority changed to DST on 1999-04-15. + # I vaguely recall that they switch back in October (sorry, forgot the source). + # For now, let's assume that the spring switch was at 24:00, +@@ -2121,7 +2213,7 @@ + # A user from Gaza reported that Gaza made the change early because of + # the Ramadan. Next year Ramadan will be even earlier, so I think + # there is a good chance next year's end date will be around two weeks +-# earlier--the same goes for Jordan. ++# earlier - the same goes for Jordan. + + # From Steffen Thorsen (2006-08-17): + # I was informed by a user in Bethlehem that in Bethlehem it started the +@@ -2140,7 +2232,7 @@ + # I guess it is likely that next year's date will be moved as well, + # because of the Ramadan. + +-# From Jesper Norgaard Welen (2007-09-18): ++# From Jesper Nørgaard Welen (2007-09-18): + # According to Steffen Thorsen's web site the Gaza Strip and the rest of the + # Palestinian territories left DST early on 13.th. of September at 2:00. + +@@ -2157,16 +2249,9 @@ + # Gaza Strip (as Egypt) ended DST at midnight Thursday (Aug 28, 2008), while + # the West Bank will end Daylight Saving Time at midnight Sunday (Aug 31, 2008). + # +-# <a href="http://www.guardian.co.uk/world/feedarticle/7759001"> + # http://www.guardian.co.uk/world/feedarticle/7759001 +-# </a> +-# <a href="http://www.abcnews.go.com/International/wireStory?id=5676087"> + # http://www.abcnews.go.com/International/wireStory?id=5676087 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_gazastrip01.html"> + # http://www.worldtimezone.com/dst_news/dst_news_gazastrip01.html +-# </a> + + # From Alexander Krivenyshev (2009-03-26): + # According to the Palestine News Network (arabic.pnn.ps), Palestinian +@@ -2174,24 +2259,17 @@ + # 26 and continue until the night of 27 September 2009. + # + # (in Arabic) +-# <a href="http://arabic.pnn.ps/index.php?option=com_content&task=view&id=50850"> + # http://arabic.pnn.ps/index.php?option=com_content&task=view&id=50850 +-# </a> + # +-# or + # (English translation) +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_westbank01.html"> + # http://www.worldtimezone.com/dst_news/dst_news_westbank01.html +-# </a> + + # From Steffen Thorsen (2009-08-31): + # Palestine's Council of Ministers announced that they will revert back to + # winter time on Friday, 2009-09-04. + # + # One news source: +-# <a href="http://www.safa.ps/ara/?action=showdetail&seid=4158"> + # http://www.safa.ps/ara/?action=showdetail&seid=4158 +-# </a> + # (Palestinian press agency, Arabic), + # Google translate: "Decided that the Palestinian government in Ramallah + # headed by Salam Fayyad, the start of work in time for the winter of +@@ -2200,9 +2278,7 @@ + # + # We are not sure if Gaza will do the same, last year they had a different + # end date, we will keep this page updated: +-# <a href="http://www.timeanddate.com/news/time/westbank-gaza-dst-2009.html"> + # http://www.timeanddate.com/news/time/westbank-gaza-dst-2009.html +-# </a> + + # From Alexander Krivenyshev (2009-09-02): + # Seems that Gaza Strip will go back to Winter Time same date as West Bank. +@@ -2212,51 +2288,35 @@ + # + # "Winter time unite the West Bank and Gaza" + # (from Palestinian National Authority): +-# <a href="http://www.moi.gov.ps/en/?page=633167343250594025&nid=11505 + # http://www.moi.gov.ps/en/?page=633167343250594025&nid=11505 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_gazastrip02.html> + # http://www.worldtimezone.com/dst_news/dst_news_gazastrip02.html +-# </a> + + # From Alexander Krivenyshev (2010-03-19): + # According to Voice of Palestine DST will last for 191 days, from March + # 26, 2010 till "the last Sunday before the tenth day of Tishri + # (October), each year" (October 03, 2010?) + # +-# <a href="http://palvoice.org/forums/showthread.php?t=245697"> + # http://palvoice.org/forums/showthread.php?t=245697 +-# </a> + # (in Arabic) +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_westbank03.html"> + # http://www.worldtimezone.com/dst_news/dst_news_westbank03.html +-# </a> + + # From Steffen Thorsen (2010-03-24): + # ...Ma'an News Agency reports that Hamas cabinet has decided it will + # start one day later, at 12:01am. Not sure if they really mean 12:01am or + # noon though: + # +-# <a href="http://www.maannews.net/eng/ViewDetails.aspx?ID=271178"> + # http://www.maannews.net/eng/ViewDetails.aspx?ID=271178 +-# </a> + # (Ma'an News Agency) + # "At 12:01am Friday, clocks in Israel and the West Bank will change to + # 1:01am, while Gaza clocks will change at 12:01am Saturday morning." + + # From Steffen Thorsen (2010-08-11): + # According to several sources, including +-# <a href="http://www.maannews.net/eng/ViewDetails.aspx?ID=306795"> + # http://www.maannews.net/eng/ViewDetails.aspx?ID=306795 +-# </a> + # the clocks were set back one hour at 2010-08-11 00:00:00 local time in + # Gaza and the West Bank. + # Some more background info: +-# <a href="http://www.timeanddate.com/news/time/westbank-gaza-end-dst-2010.html"> + # http://www.timeanddate.com/news/time/westbank-gaza-end-dst-2010.html +-# </a> + + # From Steffen Thorsen (2011-08-26): + # Gaza and the West Bank did go back to standard time in the beginning of +@@ -2264,13 +2324,9 @@ + # 00:00 (so two periods of DST in 2011). The pause was because of + # Ramadan. + # +-# <a href="http://www.maannews.net/eng/ViewDetails.aspx?ID=416217"> + # http://www.maannews.net/eng/ViewDetails.aspx?ID=416217 +-# </a> + # Additional info: +-# <a href="http://www.timeanddate.com/news/time/palestine-dst-2011.html"> + # http://www.timeanddate.com/news/time/palestine-dst-2011.html +-# </a> + + # From Alexander Krivenyshev (2011-08-27): + # According to the article in The Jerusalem Post: +@@ -2280,14 +2336,9 @@ + # The Hamas government said on Saturday that it won't observe summertime after + # the Muslim feast of Id al-Fitr, which begins on Tuesday..." + # ... +-# <a href="http://www.jpost.com/MiddleEast/Article.aspx?id=235650"> + # http://www.jpost.com/MiddleEast/Article.aspx?id=235650 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_gazastrip05.html"> + # http://www.worldtimezone.com/dst_news/dst_news_gazastrip05.html +-# </a> +-# The rules for Egypt are stolen from the `africa' file. ++# The rules for Egypt are stolen from the 'africa' file. + + # From Steffen Thorsen (2011-09-30): + # West Bank did end Daylight Saving Time this morning/midnight (2011-09-30 +@@ -2295,26 +2346,18 @@ + # So West Bank and Gaza now have the same time again. + # + # Many sources, including: +-# <a href="http://www.maannews.net/eng/ViewDetails.aspx?ID=424808"> + # http://www.maannews.net/eng/ViewDetails.aspx?ID=424808 +-# </a> + + # From Steffen Thorsen (2012-03-26): + # Palestinian news sources tell that both Gaza and West Bank will start DST + # on Friday (Thursday midnight, 2012-03-29 24:00). + # Some of many sources in Arabic: +-# <a href="http://www.samanews.com/index.php?act=Show&id=122638"> + # http://www.samanews.com/index.php?act=Show&id=122638 +-# </a> + # +-# <a href="http://safa.ps/details/news/74352/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%AA%D9%88%D9%82%D9%8A%D8%AA-%D8%A7%D9%84%D8%B5%D9%8A%D9%81%D9%8A-%D8%A8%D8%A7%D9%84%D8%B6%D9%81%D8%A9-%D9%88%D8%BA%D8%B2%D8%A9-%D9%84%D9%8A%D9%84%D8%A9-%D8%A7%D9%84%D8%AC%D9%85%D8%B9%D8%A9.html"> + # http://safa.ps/details/news/74352/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%AA%D9%88%D9%82%D9%8A%D8%AA-%D8%A7%D9%84%D8%B5%D9%8A%D9%81%D9%8A-%D8%A8%D8%A7%D9%84%D8%B6%D9%81%D8%A9-%D9%88%D8%BA%D8%B2%D8%A9-%D9%84%D9%8A%D9%84%D8%A9-%D8%A7%D9%84%D8%AC%D9%85%D8%B9%D8%A9.html +-# </a> + # + # Our brief summary: +-# <a href="http://www.timeanddate.com/news/time/gaza-west-bank-dst-2012.html"> + # http://www.timeanddate.com/news/time/gaza-west-bank-dst-2012.html +-# </a> + + # From Steffen Thorsen (2013-03-26): + # The following news sources tells that Palestine will "start daylight saving +@@ -2374,10 +2417,10 @@ + 2:00 EgyptAsia EE%sT 1967 Jun 5 + 2:00 Zion I%sT 1996 + 2:00 Jordan EE%sT 1999 +- 2:00 Palestine EE%sT 2008 Aug 29 0:00 ++ 2:00 Palestine EE%sT 2008 Aug 29 0:00 + 2:00 - EET 2008 Sep + 2:00 Palestine EE%sT 2010 +- 2:00 - EET 2010 Mar 27 0:01 ++ 2:00 - EET 2010 Mar 27 0:01 + 2:00 Palestine EE%sT 2011 Aug 1 + 2:00 - EET 2012 + 2:00 Palestine EE%sT +@@ -2393,25 +2436,27 @@ + # no information + + # Philippines +-# On 1844-08-16, Narciso Claveria, governor-general of the ++# On 1844-08-16, Narciso Clavería, governor-general of the + # Philippines, issued a proclamation announcing that 1844-12-30 was to +-# be immediately followed by 1845-01-01. Robert H. van Gent has a +-# transcript of the decree in <http://www.phys.uu.nl/~vgent/idl/idl.htm>. +-# The rest of the data are from Shanks & Pottenger. ++# be immediately followed by 1845-01-01; see R.H. van Gent's ++# History of the International Date Line ++# http://www.staff.science.uu.nl/~gent0113/idl/idl_philippines.htm ++# The rest of the data entries are from Shanks & Pottenger. + +-# From Paul Eggert (2006-04-25): +-# Tomorrow's Manila Standard reports that the Philippines Department of +-# Trade and Industry is considering adopting DST this June when the +-# rainy season begins. See +-# <http://www.manilastandardtoday.com/?page=politics02_april26_2006>. +-# For now, we'll ignore this, since it's not definite and we lack details. +-# +-# From Jesper Norgaard Welen (2006-04-26): ++# From Jesper Nørgaard Welen (2006-04-26): + # ... claims that Philippines had DST last time in 1990: + # http://story.philippinetimes.com/p.x/ct/9/id/145be20cc6b121c0/cid/3e5bbccc730d258c/ + # [a story dated 2006-04-25 by Cris Larano of Dow Jones Newswires, + # but no details] + ++# From Paul Eggert (2014-08-14): ++# The following source says DST may be instituted November-January and again ++# March-June, but this is not definite. It also says DST was last proclaimed ++# during the Ramos administration (1992-1998); but again, no details. ++# Carcamo D. PNoy urged to declare use of daylight saving time. ++# Philippine Star 2014-08-05 ++# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Phil 1936 only - Nov 1 0:00 1:00 S + Rule Phil 1937 only - Feb 1 0:00 0 - +@@ -2428,18 +2473,39 @@ + + # Qatar + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha ++Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha + 4:00 - GST 1972 Jun + 3:00 - AST + + # Saudi Arabia ++# ++# From Paul Eggert (2014-07-15): ++# Time in Saudi Arabia and other countries in the Arabian peninsula was not ++# standardized until relatively recently; we don't know when, and possibly it ++# has never been made official. Richard P Hunt, in "Islam city yielding to ++# modern times", New York Times (1961-04-09), p 20, wrote that only airlines ++# observed standard time, and that people in Jeddah mostly observed quasi-solar ++# time, doing so by setting their watches at sunrise to 6 o'clock (or to 12 ++# o'clock for "Arab" time). ++# ++# The TZ database cannot represent quasi-solar time; airline time is the best ++# we can do. The 1946 foreign air news digest of the U.S. Civil Aeronautics ++# Board (OCLC 42299995) reported that the "... Arabian Government, inaugurated ++# a weekly Dhahran-Cairo service, via the Saudi Arabian cities of Riyadh and ++# Jidda, on March 14, 1947". Shanks & Pottenger guessed 1950; go with the ++# earlier date. ++# ++# Shanks & Pottenger also state that until 1968-05-01 Saudi Arabia had two ++# time zones; the other zone, at UTC+4, was in the far eastern part of ++# the country. Ignore this, as it's before our 1970 cutoff. ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Riyadh 3:06:52 - LMT 1950 ++Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14 + 3:00 - AST + + # Singapore +-# The data here are taken from Mok Ly Yng (2003-10-30) +-# <http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html>. ++# taken from Mok Ly Yng (2003-10-30) ++# http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1 + 6:55:25 - SMT 1905 Jun 1 # Singapore M.T. +@@ -2465,26 +2531,24 @@ + + # From Paul Eggert (1996-09-03): + # "Sri Lanka advances clock by an hour to avoid blackout" +-# (www.virtual-pc.com/lankaweb/news/items/240596-2.html, 1996-05-24, ++# (<http://www.virtual-pc.com/lankaweb/news/items/240596-2.html>, 1996-05-24, + # no longer available as of 1999-08-17) +-# reported ``the country's standard time will be put forward by one hour at +-# midnight Friday (1830 GMT) `in the light of the present power crisis'.'' ++# reported "the country's standard time will be put forward by one hour at ++# midnight Friday (1830 GMT) 'in the light of the present power crisis'." + # + # From Dharmasiri Senanayake, Sri Lanka Media Minister (1996-10-24), as quoted +-# by Shamindra in +-# <a href="news:54rka5$m5h@mtinsc01-mgt.ops.worldnet.att.net"> +-# Daily News - Hot News Section (1996-10-26) +-# </a>: ++# by Shamindra in Daily News - Hot News Section ++# <news:54rka5$m5h@mtinsc01-mgt.ops.worldnet.att.net> (1996-10-26): + # With effect from 12.30 a.m. on 26th October 1996 + # Sri Lanka will be six (06) hours ahead of GMT. + +-# From Jesper Norgaard Welen (2006-04-14), quoting Sri Lanka News Online ++# From Jesper Nørgaard Welen (2006-04-14), quoting Sri Lanka News Online + # <http://news.sinhalaya.com/wmview.php?ArtID=11002> (2006-04-13): + # 0030 hrs on April 15, 2006 (midnight of April 14, 2006 +30 minutes) + # at present, become 2400 hours of April 14, 2006 (midnight of April 14, 2006). + + # From Peter Apps and Ranga Sirila of Reuters (2006-04-12) in: +-# <http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML> ++# http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML + # [The Tamil Tigers] never accepted the original 1996 time change and simply + # kept their clocks set five and a half hours ahead of Greenwich Mean + # Time (GMT), in line with neighbor India. +@@ -2498,7 +2562,7 @@ + # twice in 1996 and probably SL Government or its standardization + # agencies never declared an abbreviation as a national standard. + # +-# I recollect before the recent change the government annoucemments ++# I recollect before the recent change the government announcements + # mentioning it as simply changing Sri Lanka Standard Time or Sri Lanka + # Time and no mention was made about the abbreviation. + # +@@ -2508,7 +2572,7 @@ + # item.... + # + # Within Sri Lanka I think LKT is well known among computer users and +-# adminsitrators. In my opinion SLT may not be a good choice because the ++# administrators. In my opinion SLT may not be a good choice because the + # nation's largest telcom / internet operator Sri Lanka Telcom is well + # known by that abbreviation - simply as SLT (there IP domains are + # slt.lk and sltnet.lk). +@@ -2523,13 +2587,13 @@ + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Colombo 5:19:24 - LMT 1880 +- 5:19:32 - MMT 1906 # Moratuwa Mean Time ++ 5:19:32 - MMT 1906 # Moratuwa Mean Time + 5:30 - IST 1942 Jan 5 + 5:30 0:30 IHST 1942 Sep +- 5:30 1:00 IST 1945 Oct 16 2:00 +- 5:30 - IST 1996 May 25 0:00 +- 6:30 - LKT 1996 Oct 26 0:30 +- 6:00 - LKT 2006 Apr 15 0:30 ++ 5:30 1:00 IST 1945 Oct 16 2:00 ++ 5:30 - IST 1996 May 25 0:00 ++ 6:30 - LKT 1996 Oct 26 0:30 ++ 6:00 - LKT 2006 Apr 15 0:30 + 5:30 - IST + + # Syria +@@ -2580,7 +2644,7 @@ + # Today the AP reported "Syria will switch to summertime at midnight Thursday." + # http://www.iht.com/articles/ap/2007/03/29/africa/ME-GEN-Syria-Time-Change.php + Rule Syria 2007 only - Mar lastFri 0:00 1:00 S +-# From Jesper Norgard (2007-10-27): ++# From Jesper Nørgaard (2007-10-27): + # The sister center ICARDA of my work CIMMYT is confirming that Syria DST will + # not take place 1st November at 0:00 o'clock but 1st November at 24:00 or + # rather Midnight between Thursday and Friday. This does make more sense than +@@ -2589,7 +2653,7 @@ + # it is implemented at midnight of the last workday before weekend... + # + # From Steffen Thorsen (2007-10-27): +-# Jesper Norgaard Welen wrote: ++# Jesper Nørgaard Welen wrote: + # + # > "Winter local time in Syria will be observed at midnight of Thursday 1 + # > November 2007, and the clock will be put back 1 hour." +@@ -2605,8 +2669,7 @@ + + # From Stephen Colebourne (2008-03-17): + # For everyone's info, I saw an IATA time zone change for [Syria] for +-# this month (March 2008) in the last day or so...This is the data IATA +-# are now using: ++# this month (March 2008) in the last day or so.... + # Country Time Standard --- DST Start --- --- DST End --- DST + # Name Zone Variation Time Date Time Date + # Variation +@@ -2618,16 +2681,15 @@ + # From Arthur David Olson (2008-03-17): + # Here's a link to English-language coverage by the Syrian Arab News + # Agency (SANA)... +-# <a href="http://www.sana.sy/eng/21/2008/03/11/165173.htm"> + # http://www.sana.sy/eng/21/2008/03/11/165173.htm +-# </a>...which reads (in part) "The Cabinet approved the suggestion of the ++# ...which reads (in part) "The Cabinet approved the suggestion of the + # Ministry of Electricity to begin daylight savings time on Friday April + # 4th, advancing clocks one hour ahead on midnight of Thursday April 3rd." + # Since Syria is two hours east of UTC, the 2200 and 2100 transition times + # shown above match up with midnight in Syria. + + # From Arthur David Olson (2008-03-18): +-# My buest guess at a Syrian rule is "the Friday nearest April 1"; ++# My best guess at a Syrian rule is "the Friday nearest April 1"; + # coding that involves either using a "Mar Fri>=29" construct that old time zone + # compilers can't handle or having multiple Rules (a la Israel). + # For now, use "Apr Fri>=1", and go with IATA on a uniform Sep 30 end. +@@ -2640,37 +2702,27 @@ + # winter time on 2008-11-01 at 00:00 local daylight time (delaying/setting + # clocks back 60 minutes). + # +-# <a href="http://sana.sy/ara/2/2008/10/07/195459.htm"> + # http://sana.sy/ara/2/2008/10/07/195459.htm +-# </a> + + # From Steffen Thorsen (2009-03-19): + # Syria will start DST on 2009-03-27 00:00 this year according to many sources, + # two examples: + # +-# <a href="http://www.sana.sy/eng/21/2009/03/17/217563.htm"> + # http://www.sana.sy/eng/21/2009/03/17/217563.htm +-# </a> + # (English, Syrian Arab News # Agency) +-# <a href="http://thawra.alwehda.gov.sy/_View_news2.asp?FileName=94459258720090318012209"> + # http://thawra.alwehda.gov.sy/_View_news2.asp?FileName=94459258720090318012209 +-# </a> + # (Arabic, gov-site) + # + # We have not found any sources saying anything about when DST ends this year. + # + # Our summary +-# <a href="http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html"> + # http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html +-# </a> + + # From Steffen Thorsen (2009-10-27): + # The Syrian Arab News Network on 2009-09-29 reported that Syria will + # revert back to winter (standard) time on midnight between Thursday + # 2009-10-29 and Friday 2009-10-30: +-# <a href="http://www.sana.sy/ara/2/2009/09/29/247012.htm"> + # http://www.sana.sy/ara/2/2009/09/29/247012.htm (Arabic) +-# </a> + + # From Arthur David Olson (2009-10-28): + # We'll see if future DST switching times turn out to be end of the last +@@ -2681,23 +2733,17 @@ + # The "Syrian News Station" reported on 2010-03-16 that the Council of + # Ministers has decided that Syria will start DST on midnight Thursday + # 2010-04-01: (midnight between Thursday and Friday): +-# <a href="http://sns.sy/sns/?path=news/read/11421"> + # http://sns.sy/sns/?path=news/read/11421 (Arabic) +-# </a> + + # From Steffen Thorsen (2012-03-26): + # Today, Syria's government announced that they will start DST early on Friday + # (00:00). This is a bit earlier than the past two years. + # + # From Syrian Arab News Agency, in Arabic: +-# <a href="http://www.sana.sy/ara/2/2012/03/26/408215.htm"> + # http://www.sana.sy/ara/2/2012/03/26/408215.htm +-# </a> + # + # Our brief summary: +-# <a href="http://www.timeanddate.com/news/time/syria-dst-2012.html"> + # http://www.timeanddate.com/news/time/syria-dst-2012.html +-# </a> + + # From Arthur David Olson (2012-03-27): + # Assume last Friday in March going forward XXX. +@@ -2710,7 +2756,7 @@ + Rule Syria 2009 max - Oct lastFri 0:00 0 - + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq ++Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq + 2:00 Syria EE%sT + + # Tajikistan +@@ -2718,24 +2764,26 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2 + 5:00 - DUST 1930 Jun 21 # Dushanbe Time +- 6:00 RussiaAsia DUS%sT 1991 Mar 31 2:00s +- 5:00 1:00 DUSST 1991 Sep 9 2:00s +- 5:00 - TJT # Tajikistan Time ++ 6:00 RussiaAsia DUS%sT 1991 Mar 31 2:00s ++ 5:00 1:00 DUSST 1991 Sep 9 2:00s ++ 5:00 - TJT # Tajikistan Time + + # Thailand + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Bangkok 6:42:04 - LMT 1880 + 6:42:04 - BMT 1920 Apr # Bangkok Mean Time + 7:00 - ICT ++Link Asia/Bangkok Asia/Phnom_Penh # Cambodia ++Link Asia/Bangkok Asia/Vientiane # Laos + + # Turkmenistan + # From Shanks & Pottenger. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad + 4:00 - ASHT 1930 Jun 21 # Ashkhabad Time +- 5:00 RussiaAsia ASH%sT 1991 Mar 31 2:00 ++ 5:00 RussiaAsia ASH%sT 1991 Mar 31 2:00 + 4:00 RussiaAsia ASH%sT 1991 Oct 27 # independence +- 4:00 RussiaAsia TM%sT 1992 Jan 19 2:00 ++ 4:00 RussiaAsia TM%sT 1992 Jan 19 2:00 + 5:00 - TMT + + # United Arab Emirates +@@ -2744,8 +2792,9 @@ + 4:00 - GST + + # Uzbekistan ++# Byalokoz 1919 says Uzbekistan was 4:27:53. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Samarkand 4:27:12 - LMT 1924 May 2 ++Zone Asia/Samarkand 4:27:53 - LMT 1924 May 2 + 4:00 - SAMT 1930 Jun 21 # Samarkand Time + 5:00 - SAMT 1981 Apr 1 + 5:00 1:00 SAMST 1981 Oct 1 +@@ -2753,31 +2802,75 @@ + 5:00 RussiaAsia SAM%sT 1991 Sep 1 # independence + 5:00 RussiaAsia UZ%sT 1992 + 5:00 - UZT +-Zone Asia/Tashkent 4:37:12 - LMT 1924 May 2 ++# Milne says Tashkent was 4:37:10.8; round to nearest. ++Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2 + 5:00 - TAST 1930 Jun 21 # Tashkent Time +- 6:00 RussiaAsia TAS%sT 1991 Mar 31 2:00 ++ 6:00 RussiaAsia TAS%sT 1991 Mar 31 2:00 + 5:00 RussiaAsia TAS%sT 1991 Sep 1 # independence + 5:00 RussiaAsia UZ%sT 1992 + 5:00 - UZT + + # Vietnam + +-# From Paul Eggert (2013-02-21): ++# From Paul Eggert (2014-10-04): + # Milne gives 7:16:56 for the meridian of Saigon in 1899, as being + # used in Lower Laos, Cambodia, and Annam. But this is quite a ways + # from Saigon's location. For now, ignore this and stick with Shanks +-# and Pottenger. ++# and Pottenger for LMT before 1906. + + # From Arthur David Olson (2008-03-18): +-# The English-language name of Vietnam's most populous city is "Ho Chi Min City"; +-# we use Ho_Chi_Minh below to avoid a name of more than 14 characters. ++# The English-language name of Vietnam's most populous city is "Ho Chi Minh ++# City"; use Ho_Chi_Minh below to avoid a name of more than 14 characters. + +-# From Shanks & Pottenger: ++# From Paul Eggert (2014-10-21) after a heads-up from Trần Ngọc Quân: ++# Trần Tiến Bình's authoritative book "Lịch Việt Nam: thế kỷ XX-XXI (1901-2100)" ++# (Nhà xuất bản Văn Hoá - Thông Tin, Hanoi, 2005), pp 49-50, ++# is quoted verbatim in: ++# http://www.thoigian.com.vn/?mPage=P80D01 ++# is translated by Brian Inglis in: ++# http://mm.icann.org/pipermail/tz/2014-October/021654.html ++# and is the basis for the information below. ++# ++# The 1906 transition was effective July 1 and standardized Indochina to ++# Phù Liễn Observatory, legally 104 deg. 17'17" east of Paris. ++# It's unclear whether this meant legal Paris Mean Time (00:09:21) or ++# the Paris Meridian (2 deg. 20'14.03" E); the former yields 07:06:30.1333... ++# and the latter 07:06:29.333... so either way it rounds to 07:06:30, ++# which is used below even though the modern-day Phù Liễn Observatory ++# is closer to 07:06:31. Abbreviate Phù Liễn Mean Time as PLMT. ++# ++# The following transitions occurred in Indochina in general (before 1954) ++# and in South Vietnam in particular (after 1954): ++# To 07:00 on 1911-05-01. ++# To 08:00 on 1942-12-31 at 23:00. ++# To 09:00 in 1945-03-14 at 23:00. ++# To 07:00 on 1945-09-02 in Vietnam. ++# To 08:00 on 1947-04-01 in French-controlled Indochina. ++# To 07:00 on 1955-07-01 in South Vietnam. ++# To 08:00 on 1959-12-31 at 23:00 in South Vietnam. ++# To 07:00 on 1975-06-13 in South Vietnam. ++# ++# Trần cites the following sources; it's unclear which supplied the info above. ++# ++# Hoàng Xuân Hãn: "Lịch và lịch Việt Nam". Tập san Khoa học Xã hội, ++# No. 9, Paris, February 1982. ++# ++# Lê Thành Lân: "Lịch và niên biểu lịch sử hai mươi thế kỷ (0001-2010)", ++# NXB Thống kê, Hanoi, 2000. ++# ++# Lê Thành Lân: "Lịch hai thế kỷ (1802-2010) và các lịch vĩnh cửu", ++# NXB Thuận Hoá, Huế, 1995. ++ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Asia/Ho_Chi_Minh 7:06:40 - LMT 1906 Jun 9 +- 7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT? +- 7:00 - ICT 1912 May +- 8:00 - ICT 1931 May ++Zone Asia/Ho_Chi_Minh 7:06:40 - LMT 1906 Jul 1 ++ 7:06:30 - PLMT 1911 May 1 ++ 7:00 - ICT 1942 Dec 31 23:00 ++ 8:00 - IDT 1945 Mar 14 23:00 ++ 9:00 - JST 1945 Sep 2 ++ 7:00 - ICT 1947 Apr 1 ++ 8:00 - IDT 1955 Jul 1 ++ 7:00 - ICT 1959 Dec 31 23:00 ++ 8:00 - IDT 1975 Jun 13 + 7:00 - ICT + + # Yemen +--- ./jdk/make/sun/javazic/tzdata/australasia Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/australasia Mon Jan 05 11:57:27 2015 -0800 +@@ -21,7 +21,6 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +@@ -36,13 +35,13 @@ + # Please see the notes below for the controversy about "EST" versus "AEST" etc. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Aus 1917 only - Jan 1 0:01 1:00 - +-Rule Aus 1917 only - Mar 25 2:00 0 - +-Rule Aus 1942 only - Jan 1 2:00 1:00 - +-Rule Aus 1942 only - Mar 29 2:00 0 - +-Rule Aus 1942 only - Sep 27 2:00 1:00 - +-Rule Aus 1943 1944 - Mar lastSun 2:00 0 - +-Rule Aus 1943 only - Oct 3 2:00 1:00 - ++Rule Aus 1917 only - Jan 1 0:01 1:00 D ++Rule Aus 1917 only - Mar 25 2:00 0 S ++Rule Aus 1942 only - Jan 1 2:00 1:00 D ++Rule Aus 1942 only - Mar 29 2:00 0 S ++Rule Aus 1942 only - Sep 27 2:00 1:00 D ++Rule Aus 1943 1944 - Mar lastSun 2:00 0 S ++Rule Aus 1943 only - Oct 3 2:00 1:00 D + # Go with Whitman and the Australian National Standards Commission, which + # says W Australia didn't use DST in 1943/1944. Ignore Whitman's claim that + # 1944/1945 was just like 1943/1944. +@@ -50,26 +49,26 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + # Northern Territory + Zone Australia/Darwin 8:43:20 - LMT 1895 Feb +- 9:00 - CST 1899 May +- 9:30 Aus CST ++ 9:00 - ACST 1899 May ++ 9:30 Aus AC%sT + # Western Australia + # + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule AW 1974 only - Oct lastSun 2:00s 1:00 - +-Rule AW 1975 only - Mar Sun>=1 2:00s 0 - +-Rule AW 1983 only - Oct lastSun 2:00s 1:00 - +-Rule AW 1984 only - Mar Sun>=1 2:00s 0 - +-Rule AW 1991 only - Nov 17 2:00s 1:00 - +-Rule AW 1992 only - Mar Sun>=1 2:00s 0 - +-Rule AW 2006 only - Dec 3 2:00s 1:00 - +-Rule AW 2007 2009 - Mar lastSun 2:00s 0 - +-Rule AW 2007 2008 - Oct lastSun 2:00s 1:00 - ++Rule AW 1974 only - Oct lastSun 2:00s 1:00 D ++Rule AW 1975 only - Mar Sun>=1 2:00s 0 S ++Rule AW 1983 only - Oct lastSun 2:00s 1:00 D ++Rule AW 1984 only - Mar Sun>=1 2:00s 0 S ++Rule AW 1991 only - Nov 17 2:00s 1:00 D ++Rule AW 1992 only - Mar Sun>=1 2:00s 0 S ++Rule AW 2006 only - Dec 3 2:00s 1:00 D ++Rule AW 2007 2009 - Mar lastSun 2:00s 0 S ++Rule AW 2007 2008 - Oct lastSun 2:00s 1:00 D + Zone Australia/Perth 7:43:24 - LMT 1895 Dec +- 8:00 Aus WST 1943 Jul +- 8:00 AW WST ++ 8:00 Aus AW%sT 1943 Jul ++ 8:00 AW AW%sT + Zone Australia/Eucla 8:35:28 - LMT 1895 Dec +- 8:45 Aus CWST 1943 Jul +- 8:45 AW CWST ++ 8:45 Aus ACW%sT 1943 Jul ++ 8:45 AW ACW%sT + + # Queensland + # +@@ -85,150 +84,150 @@ + # so use Lindeman. + # + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule AQ 1971 only - Oct lastSun 2:00s 1:00 - +-Rule AQ 1972 only - Feb lastSun 2:00s 0 - +-Rule AQ 1989 1991 - Oct lastSun 2:00s 1:00 - +-Rule AQ 1990 1992 - Mar Sun>=1 2:00s 0 - +-Rule Holiday 1992 1993 - Oct lastSun 2:00s 1:00 - +-Rule Holiday 1993 1994 - Mar Sun>=1 2:00s 0 - ++Rule AQ 1971 only - Oct lastSun 2:00s 1:00 D ++Rule AQ 1972 only - Feb lastSun 2:00s 0 S ++Rule AQ 1989 1991 - Oct lastSun 2:00s 1:00 D ++Rule AQ 1990 1992 - Mar Sun>=1 2:00s 0 S ++Rule Holiday 1992 1993 - Oct lastSun 2:00s 1:00 D ++Rule Holiday 1993 1994 - Mar Sun>=1 2:00s 0 S + Zone Australia/Brisbane 10:12:08 - LMT 1895 +- 10:00 Aus EST 1971 +- 10:00 AQ EST ++ 10:00 Aus AE%sT 1971 ++ 10:00 AQ AE%sT + Zone Australia/Lindeman 9:55:56 - LMT 1895 +- 10:00 Aus EST 1971 +- 10:00 AQ EST 1992 Jul +- 10:00 Holiday EST ++ 10:00 Aus AE%sT 1971 ++ 10:00 AQ AE%sT 1992 Jul ++ 10:00 Holiday AE%sT + + # South Australia + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule AS 1971 1985 - Oct lastSun 2:00s 1:00 - +-Rule AS 1986 only - Oct 19 2:00s 1:00 - +-Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 - +-Rule AS 1972 only - Feb 27 2:00s 0 - +-Rule AS 1973 1985 - Mar Sun>=1 2:00s 0 - +-Rule AS 1986 1990 - Mar Sun>=15 2:00s 0 - +-Rule AS 1991 only - Mar 3 2:00s 0 - +-Rule AS 1992 only - Mar 22 2:00s 0 - +-Rule AS 1993 only - Mar 7 2:00s 0 - +-Rule AS 1994 only - Mar 20 2:00s 0 - +-Rule AS 1995 2005 - Mar lastSun 2:00s 0 - +-Rule AS 2006 only - Apr 2 2:00s 0 - +-Rule AS 2007 only - Mar lastSun 2:00s 0 - +-Rule AS 2008 max - Apr Sun>=1 2:00s 0 - +-Rule AS 2008 max - Oct Sun>=1 2:00s 1:00 - ++Rule AS 1971 1985 - Oct lastSun 2:00s 1:00 D ++Rule AS 1986 only - Oct 19 2:00s 1:00 D ++Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 D ++Rule AS 1972 only - Feb 27 2:00s 0 S ++Rule AS 1973 1985 - Mar Sun>=1 2:00s 0 S ++Rule AS 1986 1990 - Mar Sun>=15 2:00s 0 S ++Rule AS 1991 only - Mar 3 2:00s 0 S ++Rule AS 1992 only - Mar 22 2:00s 0 S ++Rule AS 1993 only - Mar 7 2:00s 0 S ++Rule AS 1994 only - Mar 20 2:00s 0 S ++Rule AS 1995 2005 - Mar lastSun 2:00s 0 S ++Rule AS 2006 only - Apr 2 2:00s 0 S ++Rule AS 2007 only - Mar lastSun 2:00s 0 S ++Rule AS 2008 max - Apr Sun>=1 2:00s 0 S ++Rule AS 2008 max - Oct Sun>=1 2:00s 1:00 D + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Australia/Adelaide 9:14:20 - LMT 1895 Feb +- 9:00 - CST 1899 May +- 9:30 Aus CST 1971 +- 9:30 AS CST ++ 9:00 - ACST 1899 May ++ 9:30 Aus AC%sT 1971 ++ 9:30 AS AC%sT + + # Tasmania + # + # From Paul Eggert (2005-08-16): +-# <http://www.bom.gov.au/climate/averages/tables/dst_times.shtml> ++# http://www.bom.gov.au/climate/averages/tables/dst_times.shtml + # says King Island didn't observe DST from WWII until late 1971. + # + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule AT 1967 only - Oct Sun>=1 2:00s 1:00 - +-Rule AT 1968 only - Mar lastSun 2:00s 0 - +-Rule AT 1968 1985 - Oct lastSun 2:00s 1:00 - +-Rule AT 1969 1971 - Mar Sun>=8 2:00s 0 - +-Rule AT 1972 only - Feb lastSun 2:00s 0 - +-Rule AT 1973 1981 - Mar Sun>=1 2:00s 0 - +-Rule AT 1982 1983 - Mar lastSun 2:00s 0 - +-Rule AT 1984 1986 - Mar Sun>=1 2:00s 0 - +-Rule AT 1986 only - Oct Sun>=15 2:00s 1:00 - +-Rule AT 1987 1990 - Mar Sun>=15 2:00s 0 - +-Rule AT 1987 only - Oct Sun>=22 2:00s 1:00 - +-Rule AT 1988 1990 - Oct lastSun 2:00s 1:00 - +-Rule AT 1991 1999 - Oct Sun>=1 2:00s 1:00 - +-Rule AT 1991 2005 - Mar lastSun 2:00s 0 - +-Rule AT 2000 only - Aug lastSun 2:00s 1:00 - +-Rule AT 2001 max - Oct Sun>=1 2:00s 1:00 - +-Rule AT 2006 only - Apr Sun>=1 2:00s 0 - +-Rule AT 2007 only - Mar lastSun 2:00s 0 - +-Rule AT 2008 max - Apr Sun>=1 2:00s 0 - ++Rule AT 1967 only - Oct Sun>=1 2:00s 1:00 D ++Rule AT 1968 only - Mar lastSun 2:00s 0 S ++Rule AT 1968 1985 - Oct lastSun 2:00s 1:00 D ++Rule AT 1969 1971 - Mar Sun>=8 2:00s 0 S ++Rule AT 1972 only - Feb lastSun 2:00s 0 S ++Rule AT 1973 1981 - Mar Sun>=1 2:00s 0 S ++Rule AT 1982 1983 - Mar lastSun 2:00s 0 S ++Rule AT 1984 1986 - Mar Sun>=1 2:00s 0 S ++Rule AT 1986 only - Oct Sun>=15 2:00s 1:00 D ++Rule AT 1987 1990 - Mar Sun>=15 2:00s 0 S ++Rule AT 1987 only - Oct Sun>=22 2:00s 1:00 D ++Rule AT 1988 1990 - Oct lastSun 2:00s 1:00 D ++Rule AT 1991 1999 - Oct Sun>=1 2:00s 1:00 D ++Rule AT 1991 2005 - Mar lastSun 2:00s 0 S ++Rule AT 2000 only - Aug lastSun 2:00s 1:00 D ++Rule AT 2001 max - Oct Sun>=1 2:00s 1:00 D ++Rule AT 2006 only - Apr Sun>=1 2:00s 0 S ++Rule AT 2007 only - Mar lastSun 2:00s 0 S ++Rule AT 2008 max - Apr Sun>=1 2:00s 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Australia/Hobart 9:49:16 - LMT 1895 Sep +- 10:00 - EST 1916 Oct 1 2:00 +- 10:00 1:00 EST 1917 Feb +- 10:00 Aus EST 1967 +- 10:00 AT EST ++ 10:00 - AEST 1916 Oct 1 2:00 ++ 10:00 1:00 AEDT 1917 Feb ++ 10:00 Aus AE%sT 1967 ++ 10:00 AT AE%sT + Zone Australia/Currie 9:35:28 - LMT 1895 Sep +- 10:00 - EST 1916 Oct 1 2:00 +- 10:00 1:00 EST 1917 Feb +- 10:00 Aus EST 1971 Jul +- 10:00 AT EST ++ 10:00 - AEST 1916 Oct 1 2:00 ++ 10:00 1:00 AEDT 1917 Feb ++ 10:00 Aus AE%sT 1971 Jul ++ 10:00 AT AE%sT + + # Victoria + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule AV 1971 1985 - Oct lastSun 2:00s 1:00 - +-Rule AV 1972 only - Feb lastSun 2:00s 0 - +-Rule AV 1973 1985 - Mar Sun>=1 2:00s 0 - +-Rule AV 1986 1990 - Mar Sun>=15 2:00s 0 - +-Rule AV 1986 1987 - Oct Sun>=15 2:00s 1:00 - +-Rule AV 1988 1999 - Oct lastSun 2:00s 1:00 - +-Rule AV 1991 1994 - Mar Sun>=1 2:00s 0 - +-Rule AV 1995 2005 - Mar lastSun 2:00s 0 - +-Rule AV 2000 only - Aug lastSun 2:00s 1:00 - +-Rule AV 2001 2007 - Oct lastSun 2:00s 1:00 - +-Rule AV 2006 only - Apr Sun>=1 2:00s 0 - +-Rule AV 2007 only - Mar lastSun 2:00s 0 - +-Rule AV 2008 max - Apr Sun>=1 2:00s 0 - +-Rule AV 2008 max - Oct Sun>=1 2:00s 1:00 - ++Rule AV 1971 1985 - Oct lastSun 2:00s 1:00 D ++Rule AV 1972 only - Feb lastSun 2:00s 0 S ++Rule AV 1973 1985 - Mar Sun>=1 2:00s 0 S ++Rule AV 1986 1990 - Mar Sun>=15 2:00s 0 S ++Rule AV 1986 1987 - Oct Sun>=15 2:00s 1:00 D ++Rule AV 1988 1999 - Oct lastSun 2:00s 1:00 D ++Rule AV 1991 1994 - Mar Sun>=1 2:00s 0 S ++Rule AV 1995 2005 - Mar lastSun 2:00s 0 S ++Rule AV 2000 only - Aug lastSun 2:00s 1:00 D ++Rule AV 2001 2007 - Oct lastSun 2:00s 1:00 D ++Rule AV 2006 only - Apr Sun>=1 2:00s 0 S ++Rule AV 2007 only - Mar lastSun 2:00s 0 S ++Rule AV 2008 max - Apr Sun>=1 2:00s 0 S ++Rule AV 2008 max - Oct Sun>=1 2:00s 1:00 D + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Australia/Melbourne 9:39:52 - LMT 1895 Feb +- 10:00 Aus EST 1971 +- 10:00 AV EST ++ 10:00 Aus AE%sT 1971 ++ 10:00 AV AE%sT + + # New South Wales + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule AN 1971 1985 - Oct lastSun 2:00s 1:00 - +-Rule AN 1972 only - Feb 27 2:00s 0 - +-Rule AN 1973 1981 - Mar Sun>=1 2:00s 0 - +-Rule AN 1982 only - Apr Sun>=1 2:00s 0 - +-Rule AN 1983 1985 - Mar Sun>=1 2:00s 0 - +-Rule AN 1986 1989 - Mar Sun>=15 2:00s 0 - +-Rule AN 1986 only - Oct 19 2:00s 1:00 - +-Rule AN 1987 1999 - Oct lastSun 2:00s 1:00 - +-Rule AN 1990 1995 - Mar Sun>=1 2:00s 0 - +-Rule AN 1996 2005 - Mar lastSun 2:00s 0 - +-Rule AN 2000 only - Aug lastSun 2:00s 1:00 - +-Rule AN 2001 2007 - Oct lastSun 2:00s 1:00 - +-Rule AN 2006 only - Apr Sun>=1 2:00s 0 - +-Rule AN 2007 only - Mar lastSun 2:00s 0 - +-Rule AN 2008 max - Apr Sun>=1 2:00s 0 - +-Rule AN 2008 max - Oct Sun>=1 2:00s 1:00 - ++Rule AN 1971 1985 - Oct lastSun 2:00s 1:00 D ++Rule AN 1972 only - Feb 27 2:00s 0 S ++Rule AN 1973 1981 - Mar Sun>=1 2:00s 0 S ++Rule AN 1982 only - Apr Sun>=1 2:00s 0 S ++Rule AN 1983 1985 - Mar Sun>=1 2:00s 0 S ++Rule AN 1986 1989 - Mar Sun>=15 2:00s 0 S ++Rule AN 1986 only - Oct 19 2:00s 1:00 D ++Rule AN 1987 1999 - Oct lastSun 2:00s 1:00 D ++Rule AN 1990 1995 - Mar Sun>=1 2:00s 0 S ++Rule AN 1996 2005 - Mar lastSun 2:00s 0 S ++Rule AN 2000 only - Aug lastSun 2:00s 1:00 D ++Rule AN 2001 2007 - Oct lastSun 2:00s 1:00 D ++Rule AN 2006 only - Apr Sun>=1 2:00s 0 S ++Rule AN 2007 only - Mar lastSun 2:00s 0 S ++Rule AN 2008 max - Apr Sun>=1 2:00s 0 S ++Rule AN 2008 max - Oct Sun>=1 2:00s 1:00 D + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Australia/Sydney 10:04:52 - LMT 1895 Feb +- 10:00 Aus EST 1971 +- 10:00 AN EST ++ 10:00 Aus AE%sT 1971 ++ 10:00 AN AE%sT + Zone Australia/Broken_Hill 9:25:48 - LMT 1895 Feb +- 10:00 - EST 1896 Aug 23 +- 9:00 - CST 1899 May +- 9:30 Aus CST 1971 +- 9:30 AN CST 2000 +- 9:30 AS CST ++ 10:00 - AEST 1896 Aug 23 ++ 9:00 - ACST 1899 May ++ 9:30 Aus AC%sT 1971 ++ 9:30 AN AC%sT 2000 ++ 9:30 AS AC%sT + + # Lord Howe Island + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule LH 1981 1984 - Oct lastSun 2:00 1:00 - +-Rule LH 1982 1985 - Mar Sun>=1 2:00 0 - +-Rule LH 1985 only - Oct lastSun 2:00 0:30 - +-Rule LH 1986 1989 - Mar Sun>=15 2:00 0 - +-Rule LH 1986 only - Oct 19 2:00 0:30 - +-Rule LH 1987 1999 - Oct lastSun 2:00 0:30 - +-Rule LH 1990 1995 - Mar Sun>=1 2:00 0 - +-Rule LH 1996 2005 - Mar lastSun 2:00 0 - +-Rule LH 2000 only - Aug lastSun 2:00 0:30 - +-Rule LH 2001 2007 - Oct lastSun 2:00 0:30 - +-Rule LH 2006 only - Apr Sun>=1 2:00 0 - +-Rule LH 2007 only - Mar lastSun 2:00 0 - +-Rule LH 2008 max - Apr Sun>=1 2:00 0 - +-Rule LH 2008 max - Oct Sun>=1 2:00 0:30 - ++Rule LH 1981 1984 - Oct lastSun 2:00 1:00 D ++Rule LH 1982 1985 - Mar Sun>=1 2:00 0 S ++Rule LH 1985 only - Oct lastSun 2:00 0:30 D ++Rule LH 1986 1989 - Mar Sun>=15 2:00 0 S ++Rule LH 1986 only - Oct 19 2:00 0:30 D ++Rule LH 1987 1999 - Oct lastSun 2:00 0:30 D ++Rule LH 1990 1995 - Mar Sun>=1 2:00 0 S ++Rule LH 1996 2005 - Mar lastSun 2:00 0 S ++Rule LH 2000 only - Aug lastSun 2:00 0:30 D ++Rule LH 2001 2007 - Oct lastSun 2:00 0:30 D ++Rule LH 2006 only - Apr Sun>=1 2:00 0 S ++Rule LH 2007 only - Mar lastSun 2:00 0 S ++Rule LH 2008 max - Apr Sun>=1 2:00 0 S ++Rule LH 2008 max - Oct Sun>=1 2:00 0:30 D + Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb +- 10:00 - EST 1981 Mar +- 10:30 LH LHST ++ 10:00 - AEST 1981 Mar ++ 10:30 LH LH%sT + + # Australian miscellany + # +@@ -244,8 +243,8 @@ + # Permanent occupation (scientific station) 1911-1915 and since 25 March 1948; + # sealing and penguin oil station operated Nov 1899 to Apr 1919. See the + # Tasmania Parks & Wildlife Service history of sealing at Macquarie Island +-# <http://www.parks.tas.gov.au/index.aspx?base=1828> +-# <http://www.parks.tas.gov.au/index.aspx?base=1831>. ++# http://www.parks.tas.gov.au/index.aspx?base=1828 ++# http://www.parks.tas.gov.au/index.aspx?base=1831 + # Guess that it was like Australia/Hobart while inhabited before 2010. + # + # From Steffen Thorsen (2010-03-10): +@@ -256,16 +255,16 @@ + # + # From Arthur David Olson (2013-05-23): + # The 1919 transition is overspecified below so pre-2013 zics +-# will produce a binary file with an EST-type as the first 32-bit type; ++# will produce a binary file with an [A]EST-type as the first 32-bit type; + # this is required for correct handling of times before 1916 by + # pre-2013 versions of localtime. + Zone Antarctica/Macquarie 0 - zzz 1899 Nov +- 10:00 - EST 1916 Oct 1 2:00 +- 10:00 1:00 EST 1917 Feb +- 10:00 Aus EST 1919 Apr 1 0:00s ++ 10:00 - AEST 1916 Oct 1 2:00 ++ 10:00 1:00 AEDT 1917 Feb ++ 10:00 Aus AE%sT 1919 Apr 1 0:00s + 0 - zzz 1948 Mar 25 +- 10:00 Aus EST 1967 +- 10:00 AT EST 2010 Apr 4 3:00 ++ 10:00 Aus AE%sT 1967 ++ 10:00 AT AE%sT 2010 Apr 4 3:00 + 11:00 - MIST # Macquarie I Standard Time + + # Christmas +@@ -273,24 +272,14 @@ + Zone Indian/Christmas 7:02:52 - LMT 1895 Feb + 7:00 - CXT # Christmas Island Time + +-# Cook Is +-# From Shanks & Pottenger: +-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Cook 1978 only - Nov 12 0:00 0:30 HS +-Rule Cook 1979 1991 - Mar Sun>=1 0:00 0 - +-Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 HS +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Rarotonga -10:39:04 - LMT 1901 # Avarua +- -10:30 - CKT 1978 Nov 12 # Cook Is Time +- -10:00 Cook CK%sT +- +-# Cocos ++# Cocos (Keeling) Is + # These islands were ruled by the Ross family from about 1830 to 1978. + # We don't know when standard time was introduced; for now, we guess 1900. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Indian/Cocos 6:27:40 - LMT 1900 + 6:30 - CCT # Cocos Islands Time + ++ + # Fiji + + # Milne gives 11:55:44 for Suva. +@@ -300,20 +289,13 @@ + # from November 29th 2009 to April 25th 2010. + # + # "Daylight savings to commence this month" +-# <a href="http://www.radiofiji.com.fj/fullstory.php?id=23719"> + # http://www.radiofiji.com.fj/fullstory.php?id=23719 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_fiji01.html"> + # http://www.worldtimezone.com/dst_news/dst_news_fiji01.html +-# </a> + + # From Steffen Thorsen (2009-11-10): + # The Fiji Government has posted some more details about the approved + # amendments: +-# <a href="http://www.fiji.gov.fj/publish/page_16198.shtml"> + # http://www.fiji.gov.fj/publish/page_16198.shtml +-# </a> + + # From Steffen Thorsen (2010-03-03): + # The Cabinet in Fiji has decided to end DST about a month early, on +@@ -322,35 +304,24 @@ + # 2011 (last Sunday a good guess?). + # + # Official source: +-# <a href="http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=1096:3310-cabinet-approves-change-in-daylight-savings-dates&catid=49:cabinet-releases&Itemid=166"> + # http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=1096:3310-cabinet-approves-change-in-daylight-savings-dates&catid=49:cabinet-releases&Itemid=166 +-# </a> + # + # A bit more background info here: +-# <a href="http://www.timeanddate.com/news/time/fiji-dst-ends-march-2010.html"> + # http://www.timeanddate.com/news/time/fiji-dst-ends-march-2010.html +-# </a> + + # From Alexander Krivenyshev (2010-10-24): + # According to Radio Fiji and Fiji Times online, Fiji will end DST 3 + # weeks earlier than expected - on March 6, 2011, not March 27, 2011... + # Here is confirmation from Government of the Republic of the Fiji Islands, + # Ministry of Information (fiji.gov.fj) web site: +-# <a href="http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=2608:daylight-savings&catid=71:press-releases&Itemid=155"> + # http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=2608:daylight-savings&catid=71:press-releases&Itemid=155 +-# </a> +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_fiji04.html"> + # http://www.worldtimezone.com/dst_news/dst_news_fiji04.html +-# </a> + + # From Steffen Thorsen (2011-10-03): + # Now the dates have been confirmed, and at least our start date + # assumption was correct (end date was one week wrong). + # +-# <a href="http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=4966:daylight-saving-starts-in-fiji&catid=71:press-releases&Itemid=155"> +-# www.fiji.gov.fj/index.php?option=com_content&view=article&id=4966:daylight-saving-starts-in-fiji&catid=71:press-releases&Itemid=155 +-# </a> ++# http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=4966:daylight-saving-starts-in-fiji&catid=71:press-releases&Itemid=155 + # which says + # Members of the public are reminded to change their time to one hour in + # advance at 2am to 3am on October 23, 2011 and one hour back at 3am to +@@ -360,9 +331,7 @@ + # Another change to the Fiji DST end date. In the TZ database the end date for + # Fiji DST 2012, is currently Feb 26. This has been changed to Jan 22. + # +-# <a href="http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=5017:amendments-to-daylight-savings&catid=71:press-releases&Itemid=155"> + # http://www.fiji.gov.fj/index.php?option=com_content&view=article&id=5017:amendments-to-daylight-savings&catid=71:press-releases&Itemid=155 +-# </a> + # states: + # + # The end of daylight saving scheduled initially for the 26th of February 2012 +@@ -385,31 +354,38 @@ + # Fiji will end DST on 2014-01-19 02:00: + # http://www.fiji.gov.fj/Media-Center/Press-Releases/DAYLIGHT-SAVINGS-TO-END-THIS-MONTH-%281%29.aspx + +-# From Paul Eggert (2014-01-10): +-# For now, guess that Fiji springs forward the Sunday before the fourth +-# Monday in October, and springs back the penultimate Sunday in January. +-# This is ad hoc, but matches recent practice. ++# From Ken Rylander (2014-10-20): ++# DST will start Nov. 2 this year. ++# http://www.fiji.gov.fj/Media-Center/Press-Releases/DAYLIGHT-SAVING-STARTS-ON-SUNDAY,-NOVEMBER-2ND.aspx ++ ++# From Paul Eggert (2014-10-20): ++# For now, guess DST from 02:00 the first Sunday in November to ++# 03:00 the first Sunday on or after January 18. Although ad hoc, it ++# matches this year's plan and seems more likely to match future ++# practice than guessing no DST. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 S + Rule Fiji 1999 2000 - Feb lastSun 3:00 0 - + Rule Fiji 2009 only - Nov 29 2:00 1:00 S + Rule Fiji 2010 only - Mar lastSun 3:00 0 - +-Rule Fiji 2010 max - Oct Sun>=21 2:00 1:00 S ++Rule Fiji 2010 2013 - Oct Sun>=21 2:00 1:00 S + Rule Fiji 2011 only - Mar Sun>=1 3:00 0 - + Rule Fiji 2012 2013 - Jan Sun>=18 3:00 0 - +-Rule Fiji 2014 max - Jan Sun>=18 2:00 0 - ++Rule Fiji 2014 only - Jan Sun>=18 2:00 0 - ++Rule Fiji 2014 max - Nov Sun>=1 2:00 1:00 S ++Rule Fiji 2015 max - Jan Sun>=18 3:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva ++Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva + 12:00 Fiji FJ%sT # Fiji Time + + # French Polynesia + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct # Rikitea ++Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct # Rikitea + -9:00 - GAMT # Gambier Time + Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct + -9:30 - MART # Marquesas Time +-Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct # Papeete ++Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct # Papeete + -10:00 - TAHT # Tahiti Time + # Clipperton (near North America) is administered from French Polynesia; + # it is uninhabited. +@@ -417,14 +393,14 @@ + # Guam + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31 +- 9:39:00 - LMT 1901 # Agana +- 10:00 - GST 2000 Dec 23 # Guam ++ 9:39:00 - LMT 1901 # Agana ++ 10:00 - GST 2000 Dec 23 # Guam + 10:00 - ChST # Chamorro Standard Time + + # Kiribati + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki +- 12:00 - GILT # Gilbert Is Time ++Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki ++ 12:00 - GILT # Gilbert Is Time + Zone Pacific/Enderbury -11:24:20 - LMT 1901 + -12:00 - PHOT 1979 Oct # Phoenix Is Time + -11:00 - PHOT 1995 +@@ -438,7 +414,7 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Saipan -14:17:00 - LMT 1844 Dec 31 + 9:43:00 - LMT 1901 +- 9:00 - MPT 1969 Oct # N Mariana Is Time ++ 9:00 - MPT 1969 Oct # N Mariana Is Time + 10:00 - MPT 2000 Dec 23 + 10:00 - ChST # Chamorro Standard Time + +@@ -449,24 +425,24 @@ + 12:00 - MHT + Zone Pacific/Kwajalein 11:09:20 - LMT 1901 + 11:00 - MHT 1969 Oct +- -12:00 - KWAT 1993 Aug 20 # Kwajalein Time ++ -12:00 - KWAT 1993 Aug 20 # Kwajalein Time + 12:00 - MHT + + # Micronesia + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Chuuk 10:07:08 - LMT 1901 +- 10:00 - CHUT # Chuuk Time +-Zone Pacific/Pohnpei 10:32:52 - LMT 1901 # Kolonia +- 11:00 - PONT # Pohnpei Time ++ 10:00 - CHUT # Chuuk Time ++Zone Pacific/Pohnpei 10:32:52 - LMT 1901 # Kolonia ++ 11:00 - PONT # Pohnpei Time + Zone Pacific/Kosrae 10:51:56 - LMT 1901 +- 11:00 - KOST 1969 Oct # Kosrae Time ++ 11:00 - KOST 1969 Oct # Kosrae Time + 12:00 - KOST 1999 + 11:00 - KOST + + # Nauru + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe +- 11:30 - NRT 1942 Mar 15 # Nauru Time ++Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe ++ 11:30 - NRT 1942 Mar 15 # Nauru Time + 9:00 - JST 1944 Aug 15 + 11:30 - NRT 1979 May + 12:00 - NRT +@@ -479,7 +455,7 @@ + # Shanks & Pottenger say the following was at 2:00; go with IATA. + Rule NC 1997 only - Mar 2 2:00s 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 ++Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 # Nouméa + 11:00 NC NC%sT + + +@@ -496,7 +472,8 @@ + Rule NZ 1934 1940 - Sep lastSun 2:00 0:30 S + Rule NZ 1946 only - Jan 1 0:00 0 S + # Since 1957 Chatham has been 45 minutes ahead of NZ, but there's no +-# convenient notation for this so we must duplicate the Rule lines. ++# convenient single notation for the date and time of this transition ++# so we must duplicate the Rule lines. + Rule NZ 1974 only - Nov Sun>=1 2:00s 1:00 D + Rule Chatham 1974 only - Nov Sun>=1 2:45s 1:00 D + Rule NZ 1975 only - Feb lastSun 2:00s 0 S +@@ -519,13 +496,14 @@ + Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2 + 11:30 NZ NZ%sT 1946 Jan 1 + 12:00 NZ NZ%sT +-Zone Pacific/Chatham 12:13:48 - LMT 1957 Jan 1 ++Zone Pacific/Chatham 12:13:48 - LMT 1868 Nov 2 ++ 12:15 - CHAST 1946 Jan 1 + 12:45 Chatham CHA%sT + + Link Pacific/Auckland Antarctica/McMurdo + + # Auckland Is +-# uninhabited; Maori and Moriori, colonial settlers, pastoralists, sealers, ++# uninhabited; Māori and Moriori, colonial settlers, pastoralists, sealers, + # and scientific personnel have wintered + + # Campbell I +@@ -534,48 +512,82 @@ + # previously whalers, sealers, pastoralists, and scientific personnel wintered + # was probably like Pacific/Auckland + ++# Cook Is ++# From Shanks & Pottenger: ++# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S ++Rule Cook 1978 only - Nov 12 0:00 0:30 HS ++Rule Cook 1979 1991 - Mar Sun>=1 0:00 0 - ++Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 HS ++# Zone NAME GMTOFF RULES FORMAT [UNTIL] ++Zone Pacific/Rarotonga -10:39:04 - LMT 1901 # Avarua ++ -10:30 - CKT 1978 Nov 12 # Cook Is Time ++ -10:00 Cook CK%sT ++ + ############################################################################### + + + # Niue + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Niue -11:19:40 - LMT 1901 # Alofi +- -11:20 - NUT 1951 # Niue Time +- -11:30 - NUT 1978 Oct 1 ++Zone Pacific/Niue -11:19:40 - LMT 1901 # Alofi ++ -11:20 - NUT 1951 # Niue Time ++ -11:30 - NUT 1978 Oct 1 + -11:00 - NUT + + # Norfolk + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston +- 11:12 - NMT 1951 # Norfolk Mean Time +- 11:30 - NFT # Norfolk Time ++Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston ++ 11:12 - NMT 1951 # Norfolk Mean Time ++ 11:30 - NFT # Norfolk Time + + # Palau (Belau) + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Palau 8:57:56 - LMT 1901 # Koror ++Zone Pacific/Palau 8:57:56 - LMT 1901 # Koror + 9:00 - PWT # Palau Time + + # Papua New Guinea + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Port_Moresby 9:48:40 - LMT 1880 +- 9:48:32 - PMMT 1895 # Port Moresby Mean Time +- 10:00 - PGT # Papua New Guinea Time ++ 9:48:32 - PMMT 1895 # Port Moresby Mean Time ++ 10:00 - PGT # Papua New Guinea Time ++# ++# From Paul Eggert (2014-10-13): ++# Base the Bougainville entry on the Arawa-Kieta region, which appears to have ++# the most people even though it was devastated in the Bougainville Civil War. ++# ++# Although Shanks gives 1942-03-15 / 1943-11-01 for JST, these dates ++# are apparently rough guesswork from the starts of military campaigns. ++# The World War II entries below are instead based on Arawa-Kieta. ++# The Japanese occupied Kieta in July 1942, ++# according to the Pacific War Online Encyclopedia ++# http://pwencycl.kgbudge.com/B/o/Bougainville.htm ++# and seem to have controlled it until their 1945-08-21 surrender. ++# ++# The Autonomous Region of Bougainville plans to switch from UTC+10 to UTC+11 ++# on 2014-12-28 at 02:00. They call UTC+11 "Bougainville Standard Time"; ++# abbreviate this as BST. See: ++# http://www.bougainville24.com/bougainville-issues/bougainville-gets-own-timezone/ ++# ++Zone Pacific/Bougainville 10:22:16 - LMT 1880 ++ 9:48:32 - PMMT 1895 ++ 10:00 - PGT 1942 Jul ++ 9:00 - JST 1945 Aug 21 ++ 10:00 - PGT 2014 Dec 28 2:00 ++ 11:00 - BST + + # Pitcairn + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown +- -8:30 - PNT 1998 Apr 27 00:00 ++Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown ++ -8:30 - PNT 1998 Apr 27 0:00 + -8:00 - PST # Pitcairn Standard Time + + # American Samoa + Zone Pacific/Pago_Pago 12:37:12 - LMT 1879 Jul 5 + -11:22:48 - LMT 1911 +- -11:30 - SAMT 1950 # Samoa Time +- -11:00 - NST 1967 Apr # N=Nome +- -11:00 - BST 1983 Nov 30 # B=Bering +- -11:00 - SST # S=Samoa ++ -11:00 - NST 1967 Apr # N=Nome ++ -11:00 - BST 1983 Nov 30 # B=Bering ++ -11:00 - SST # S=Samoa + +-# Samoa ++# Samoa (formerly and also known as Western Samoa) + + # From Steffen Thorsen (2009-10-16): + # We have been in contact with the government of Samoa again, and received +@@ -586,141 +598,80 @@ + # Sunday of April 2011." + # + # Background info: +-# <a href="http://www.timeanddate.com/news/time/samoa-dst-plan-2009.html"> + # http://www.timeanddate.com/news/time/samoa-dst-plan-2009.html +-# </a> + # + # Samoa's Daylight Saving Time Act 2009 is available here, but does not + # contain any dates: +-# <a href="http://www.parliament.gov.ws/documents/acts/Daylight%20Saving%20Act%20%202009%20%28English%29%20-%20Final%207-7-091.pdf"> + # http://www.parliament.gov.ws/documents/acts/Daylight%20Saving%20Act%20%202009%20%28English%29%20-%20Final%207-7-091.pdf +-# </a> + + # From Laupue Raymond Hughes (2010-10-07): + # Please see +-# <a href="http://www.mcil.gov.ws"> + # http://www.mcil.gov.ws +-# </a>, + # the Ministry of Commerce, Industry and Labour (sideframe) "Last Sunday + # September 2010 (26/09/10) - adjust clocks forward from 12:00 midnight + # to 01:00am and First Sunday April 2011 (03/04/11) - adjust clocks + # backwards from 1:00am to 12:00am" + + # From Laupue Raymond Hughes (2011-03-07): +-# I believe this will be posted shortly on the website +-# <a href="http://www.mcil.gov.ws"> +-# www.mcil.gov.ws +-# </a> ++# [http://www.mcil.gov.ws/ftcd/daylight_saving_2011.pdf] + # +-# PUBLIC NOTICE ON DAYLIGHT SAVING TIME +-# +-# Pursuant to the Daylight Saving Act 2009 and Cabinets decision, +-# businesses and the general public are hereby advised that daylight +-# saving time is on the first Saturday of April 2011 (02/04/11). +-# +-# The public is therefore advised that when the standard time strikes +-# the hour of four oclock (4.00am or 0400 Hours) on the 2nd April 2011, +-# then all instruments used to measure standard time are to be +-# adjusted/changed to three oclock (3:00am or 0300Hrs). +-# +-# Margaret Fruean ACTING CHIEF EXECUTIVE OFFICER MINISTRY OF COMMERCE, +-# INDUSTRY AND LABOUR 28th February 2011 ++# ... when the standard time strikes the hour of four o'clock (4.00am ++# or 0400 Hours) on the 2nd April 2011, then all instruments used to ++# measure standard time are to be adjusted/changed to three o'clock ++# (3:00am or 0300Hrs). + +-# From David Zuelke (2011-05-09): ++# From David Zülke (2011-05-09): + # Subject: Samoa to move timezone from east to west of international date line + # +-# <a href="http://www.morningstar.co.uk/uk/markets/newsfeeditem.aspx?id=138501958347963"> + # http://www.morningstar.co.uk/uk/markets/newsfeeditem.aspx?id=138501958347963 +-# </a> + +-# From Mark Sim-Smith (2011-08-17): +-# I have been in contact with Leilani Tuala Warren from the Samoa Law +-# Reform Commission, and she has sent me a copy of the Bill that she +-# confirmed has been passed...Most of the sections are about maps rather +-# than the time zone change, but I'll paste the relevant bits below. But +-# the essence is that at midnight 29 Dec (UTC-11 I suppose), Samoa +-# changes from UTC-11 to UTC+13: +-# +-# International Date Line Bill 2011 +-# +-# AN ACT to provide for the change to standard time in Samoa and to make +-# consequential amendments to the position of the International Date +-# Line, and for related purposes. +-# +-# BE IT ENACTED by the Legislative Assembly of Samoa in Parliament +-# assembled as follows: +-# +-# 1. Short title and commencement-(1) This Act may be cited as the +-# International Date Line Act 2011. (2) Except for section 5(3) this Act +-# commences at 12 o'clock midnight, on Thursday 29th December 2011. (3) +-# Section 5(3) commences on the date of assent by the Head of State. +-# +-# [snip] +-# +-# 3. Interpretation - [snip] "Samoa standard time" in this Act and any +-# other statute of Samoa which refers to 'Samoa standard time' means the +-# time 13 hours in advance of Co-ordinated Universal Time. +-# +-# 4. Samoa standard time - (1) Upon the commencement of this Act, Samoa +-# standard time shall be set at 13 hours in advance of Co-ordinated +-# Universal Time for the whole of Samoa. (2) All references to Samoa's +-# time zone and to Samoa standard time in Samoa in all legislation and +-# instruments after the commencement of this Act shall be references to +-# Samoa standard time as provided for in this Act. (3) Nothing in this +-# Act affects the provisions of the Daylight Saving Act 2009, except that +-# it defines Samoa standard time.... ++# From Paul Eggert (2014-06-27): ++# The International Date Line Act 2011 ++# http://www.parliament.gov.ws/images/ACTS/International_Date_Line_Act__2011_-_Eng.pdf ++# changed Samoa from UTC-11 to UTC+13, effective "12 o'clock midnight, on ++# Thursday 29th December 2011". The International Date Line was adjusted ++# accordingly. + + # From Laupue Raymond Hughes (2011-09-02): +-# <a href="http://www.mcil.gov.ws/mcil_publications.html"> + # http://www.mcil.gov.ws/mcil_publications.html +-# </a> + # + # here is the official website publication for Samoa DST and dateline change + # + # DST +-# Year End Time Start Time +-# 2011 - - - - - - 24 September 3:00am to 4:00am +-# 2012 01 April 4:00am to 3:00am - - - - - - ++# Year End Time Start Time ++# 2011 - - - - - - 24 September 3:00am to 4:00am ++# 2012 01 April 4:00am to 3:00am - - - - - - + # + # Dateline Change skip Friday 30th Dec 2011 + # Thursday 29th December 2011 23:59:59 Hours + # Saturday 31st December 2011 00:00:00 Hours + # +-# Clarification by Tim Parenti (2012-01-03): +-# Although Samoa has used Daylight Saving Time in the 2010-2011 and 2011-2012 +-# seasons, there is not yet any indication that this trend will continue on +-# a regular basis. For now, we have explicitly listed the transitions below. +-# +-# From Nicky (2012-09-10): ++# From Nicholas Pereira (2012-09-10): + # Daylight Saving Time commences on Sunday 30th September 2012 and +-# ends on Sunday 7th of April 2013. +-# +-# Please find link below for more information. ++# ends on Sunday 7th of April 2013.... + # http://www.mcil.gov.ws/mcil_publications.html + # +-# That publication also includes dates for Summer of 2013/4 as well +-# which give the impression of a pattern in selecting dates for the +-# future, so for now, we will guess this will continue. ++# From Paul Eggert (2014-07-08): ++# That web page currently lists transitions for 2012/3 and 2013/4. ++# Assume the pattern instituted in 2012 will continue indefinitely. + +-# Western Samoa + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S ++Rule WS 2010 only - Sep lastSun 0:00 1 D ++Rule WS 2011 only - Apr Sat>=1 4:00 0 S ++Rule WS 2011 only - Sep lastSat 3:00 1 D ++Rule WS 2012 max - Apr Sun>=1 4:00 0 S + Rule WS 2012 max - Sep lastSun 3:00 1 D +-Rule WS 2012 max - Apr Sun>=1 4:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5 + -11:26:56 - LMT 1911 +- -11:30 - SAMT 1950 # Samoa Time +- -11:00 - WST 2010 Sep 26 +- -11:00 1:00 WSDT 2011 Apr 2 4:00 +- -11:00 - WST 2011 Sep 24 3:00 +- -11:00 1:00 WSDT 2011 Dec 30 +- 13:00 1:00 WSDT 2012 Apr Sun>=1 4:00 ++ -11:30 - WSST 1950 ++ -11:00 WS S%sT 2011 Dec 29 24:00 # S=Samoa + 13:00 WS WS%sT + + # Solomon Is + # excludes Bougainville, for which see Papua New Guinea + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct # Honiara ++Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct # Honiara + 11:00 - SBT # Solomon Is Time + + # Tokelau Is +@@ -744,7 +695,7 @@ + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Fakaofo -11:24:56 - LMT 1901 +- -11:00 - TKT 2011 Dec 30 # Tokelau Time ++ -11:00 - TKT 2011 Dec 30 # Tokelau Time + 13:00 - TKT + + # Tonga +@@ -804,8 +755,8 @@ + # time from Operation Newsreel (Hardtack I/Teak shot, 1958-08-01) to the last + # Operation Fishbowl shot (Tightrope, 1962-11-04).... [See] Herman Hoerlin, + # "The United States High-Altitude Test Experience: A Review Emphasizing the +-# Impact on the Environment", Los Alamos LA-6405, Oct 1976 +-# <http://www.fas.org/sgp/othergov/doe/lanl/docs1/00322994.pdf>. ++# Impact on the Environment", Los Alamos LA-6405, Oct 1976. ++# http://www.fas.org/sgp/othergov/doe/lanl/docs1/00322994.pdf + # See the table on page 4 where he lists GMT and local times for the tests; a + # footnote for the JI tests reads that local time is "JI time = Hawaii Time + # Minus One Hour". +@@ -820,7 +771,7 @@ + # From Mark Brader (2005-01-23): + # [Fallacies and Fantasies of Air Transport History, by R.E.G. Davies, + # published 1994 by Paladwr Press, McLean, VA, USA; ISBN 0-9626483-5-3] +-# reproduced a Pan American Airways timeables from 1936, for their weekly ++# reproduced a Pan American Airways timetable from 1936, for their weekly + # "Orient Express" flights between San Francisco and Manila, and connecting + # flights to Chicago and the US East Coast. As it uses some time zone + # designations that I've never seen before:.... +@@ -830,9 +781,9 @@ + Zone Pacific/Midway -11:49:28 - LMT 1901 + -11:00 - NST 1956 Jun 3 + -11:00 1:00 NDT 1956 Sep 2 +- -11:00 - NST 1967 Apr # N=Nome +- -11:00 - BST 1983 Nov 30 # B=Bering +- -11:00 - SST # S=Samoa ++ -11:00 - NST 1967 Apr # N=Nome ++ -11:00 - BST 1983 Nov 30 # B=Bering ++ -11:00 - SST # S=Samoa + + # Palmyra + # uninhabited since World War II; was probably like Pacific/Kiritimati +@@ -852,7 +803,7 @@ + Rule Vanuatu 1992 1993 - Jan Sun>=23 0:00 0 - + Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila ++Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila + 11:00 Vanuatu VU%sT # Vanuatu Time + + # Wallis and Futuna +@@ -864,188 +815,213 @@ + + # NOTES + +-# This data is by no means authoritative; if you think you know better, ++# This file is by no means authoritative; if you think you know better, + # go ahead and edit the file (and please send any changes to +-# tz@iana.org for general use in the future). ++# tz@iana.org for general use in the future). For more, please see ++# the file CONTRIBUTING in the tz distribution. + +-# From Paul Eggert (2013-02-21): +-# A good source for time zone historical data outside the U.S. is ++# From Paul Eggert (2014-10-31): ++# ++# Unless otherwise specified, the source for data through 1990 is: + # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), + # San Diego: ACS Publications, Inc. (2003). ++# Unfortunately this book contains many errors and cites no sources. + # + # Gwillim Law writes that a good source + # for recent time zone data is the International Air Transport + # Association's Standard Schedules Information Manual (IATA SSIM), + # published semiannually. Law sent in several helpful summaries +-# of the IATA's data after 1990. +-# +-# Except where otherwise noted, Shanks & Pottenger is the source for +-# entries through 1990, and IATA SSIM is the source for entries afterwards. ++# of the IATA's data after 1990. Except where otherwise noted, ++# IATA SSIM is the source for entries after 1990. + # + # Another source occasionally used is Edward W. Whitman, World Time Differences, + # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which + # I found in the UCLA library. + # + # For data circa 1899, a common source is: +-# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94 +-# <http://www.jstor.org/stable/1774359>. ++# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94. ++# http://www.jstor.org/stable/1774359 + # + # A reliable and entertaining source about time zones is + # Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997). + # +-# I invented the abbreviations marked `*' in the following table; ++# I invented the abbreviations marked '*' in the following table; + # the rest are from earlier versions of this file, or from other sources. + # Corrections are welcome! +-# std dst +-# LMT Local Mean Time +-# 8:00 WST WST Western Australia +-# 8:45 CWST CWST Central Western Australia* +-# 9:00 JST Japan +-# 9:30 CST CST Central Australia +-# 10:00 EST EST Eastern Australia +-# 10:00 ChST Chamorro +-# 10:30 LHST LHST Lord Howe* +-# 11:30 NZMT NZST New Zealand through 1945 +-# 12:00 NZST NZDT New Zealand 1946-present +-# 12:45 CHAST CHADT Chatham* +-# -11:00 SST Samoa +-# -10:00 HST Hawaii +-# - 8:00 PST Pitcairn* ++# std dst ++# LMT Local Mean Time ++# 8:00 AWST AWDT Western Australia ++# 8:45 ACWST ACWDT Central Western Australia* ++# 9:00 JST Japan ++# 9:30 ACST ACDT Central Australia ++# 10:00 AEST AEDT Eastern Australia ++# 10:00 ChST Chamorro ++# 10:30 LHST LHDT Lord Howe* ++# 11:00 BST Bougainville* ++# 11:30 NZMT NZST New Zealand through 1945 ++# 12:00 NZST NZDT New Zealand 1946-present ++# 12:15 CHAST Chatham through 1945* ++# 12:45 CHAST CHADT Chatham 1946-present* ++# 13:00 WSST WSDT (western) Samoa 2011-present* ++# -11:30 WSST Western Samoa through 1950* ++# -11:00 SST Samoa ++# -10:00 HST Hawaii ++# - 8:00 PST Pitcairn* + # +-# See the `northamerica' file for Hawaii. +-# See the `southamerica' file for Easter I and the Galapagos Is. ++# See the 'northamerica' file for Hawaii. ++# See the 'southamerica' file for Easter I and the Galápagos Is. + + ############################################################################### + + # Australia + ++# From Paul Eggert (2014-06-30): ++# Daylight saving time has long been controversial in Australia, pitting ++# region against region, rural against urban, and local against global. ++# For example, in her review of Graeme Davison's _The Unforgiving ++# Minute: how Australians learned to tell the time_ (1993), Perth native ++# Phillipa J Martyr wrote, "The section entitled 'Saving Daylight' was ++# very informative, but was (as can, sadly, only be expected from a ++# Melbourne-based study) replete with the usual chuckleheaded ++# Queenslanders and straw-chewing yokels from the West prattling fables ++# about fading curtains and crazed farm animals." ++# Electronic Journal of Australian and New Zealand History (1997-03-03) ++# http://www.jcu.edu.au/aff/history/reviews/davison.htm ++ + # From Paul Eggert (2005-12-08): +-# <a href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml"> + # Implementation Dates of Daylight Saving Time within Australia +-# </a> summarizes daylight saving issues in Australia. ++# http://www.bom.gov.au/climate/averages/tables/dst_times.shtml ++# summarizes daylight saving issues in Australia. + + # From Arthur David Olson (2005-12-12): +-# <a href="http://www.lawlink.nsw.gov.au/lawlink/Corporate/ll_agdinfo.nsf/pages/community_relations_daylight_saving"> + # Lawlink NSW:Daylight Saving in New South Wales +-# </a> covers New South Wales in particular. ++# http://www.lawlink.nsw.gov.au/lawlink/Corporate/ll_agdinfo.nsf/pages/community_relations_daylight_saving ++# covers New South Wales in particular. + + # From John Mackin (1991-03-06): +-# We in Australia have _never_ referred to DST as `daylight' time. +-# It is called `summer' time. Now by a happy coincidence, `summer' +-# and `standard' happen to start with the same letter; hence, the ++# We in Australia have _never_ referred to DST as 'daylight' time. ++# It is called 'summer' time. Now by a happy coincidence, 'summer' ++# and 'standard' happen to start with the same letter; hence, the + # abbreviation does _not_ change... + # The legislation does not actually define abbreviations, at least + # in this State, but the abbreviation is just commonly taken to be the + # initials of the phrase, and the legislation here uniformly uses +-# the phrase `summer time' and does not use the phrase `daylight ++# the phrase 'summer time' and does not use the phrase 'daylight + # time'. + # Announcers on the Commonwealth radio network, the ABC (for Australian +-# Broadcasting Commission), use the phrases `Eastern Standard Time' +-# or `Eastern Summer Time'. (Note, though, that as I say in the ++# Broadcasting Commission), use the phrases 'Eastern Standard Time' ++# or 'Eastern Summer Time'. (Note, though, that as I say in the + # current australasia file, there is really no such thing.) Announcers + # on its overseas service, Radio Australia, use the same phrases +-# prefixed by the word `Australian' when referring to local times; ++# prefixed by the word 'Australian' when referring to local times; + # time announcements on that service, naturally enough, are made in UTC. + +-# From Arthur David Olson (1992-03-08): +-# Given the above, what's chosen for year-round use is: +-# CST for any place operating at a GMTOFF of 9:30 +-# WST for any place operating at a GMTOFF of 8:00 +-# EST for any place operating at a GMTOFF of 10:00 +- +-# From Chuck Soper (2006-06-01): +-# I recently found this Australian government web page on time zones: +-# <http://www.australia.gov.au/about-australia-13time> +-# And this government web page lists time zone names and abbreviations: +-# <http://www.bom.gov.au/climate/averages/tables/daysavtm.shtml> +- +-# From Paul Eggert (2001-04-05), summarizing a long discussion about "EST" +-# versus "AEST" etc.: ++# From Paul Eggert (2014-06-30): + # +-# I see the following points of dispute: ++# Inspired by Mackin's remarks quoted above, earlier versions of this ++# file used "EST" for both Eastern Standard Time and Eastern Summer ++# Time in Australia, and similarly for "CST", "CWST", and "WST". ++# However, these abbreviations were confusing and were not common ++# practice among Australians, and there were justifiable complaints ++# about them, so I attempted to survey current Australian usage. ++# For the tz database, the full English phrase is not that important; ++# what matters is the abbreviation. It's difficult to survey the web ++# directly for abbreviation usage, as there are so many false hits for ++# strings like "EST" and "EDT", so I looked for pages that defined an ++# abbreviation for eastern or central DST in Australia, and got the ++# following numbers of unique hits for the listed Google queries: + # +-# * How important are unique time zone abbreviations? ++# 10 "Eastern Daylight Time AEST" site:au [some are false hits] ++# 10 "Eastern Summer Time AEST" site:au ++# 10 "Summer Time AEDT" site:au ++# 13 "EDST Eastern Daylight Saving Time" site:au ++# 18 "Summer Time ESST" site:au ++# 28 "Eastern Daylight Saving Time EDST" site:au ++# 39 "EDT Eastern Daylight Time" site:au [some are false hits] ++# 53 "Eastern Daylight Time EDT" site:au [some are false hits] ++# 54 "AEDT Australian Eastern Daylight Time" site:au ++# 182 "Eastern Daylight Time AEDT" site:au + # +-# Here I tend to agree with the point (most recently made by Chris +-# Newman) that unique abbreviations should not be essential for proper +-# operation of software. We have other instances of ambiguity +-# (e.g. "IST" denoting both "Israel Standard Time" and "Indian +-# Standard Time"), and they are not likely to go away any time soon. +-# In the old days, some software mistakenly relied on unique +-# abbreviations, but this is becoming less true with time, and I don't +-# think it's that important to cater to such software these days. ++# 17 "Central Daylight Time CDT" site:au [some are false hits] ++# 46 "Central Daylight Time ACDT" site:au + # +-# On the other hand, there is another motivation for unambiguous +-# abbreviations: it cuts down on human confusion. This is +-# particularly true for Australia, where "EST" can mean one thing for +-# time T and a different thing for time T plus 1 second. ++# I tried several other variants (e.g., "Eastern Summer Time EST") but ++# they all returned fewer than 10 unique hits. I also looked for pages ++# mentioning both "western standard time" and an abbreviation, since ++# there is no WST in the US to generate false hits, and found: + # +-# * Does the relevant legislation indicate which abbreviations should be used? ++# 156 "western standard time" AWST site:au ++# 226 "western standard time" WST site:au + # +-# Here I tend to think that things are a mess, just as they are in +-# many other countries. We Americans are currently disagreeing about +-# which abbreviation to use for the newly legislated Chamorro Standard +-# Time, for example. ++# I then surveyed the top ten newspapers in Australia by circulation as ++# listed in Wikipedia, using Google queries like "AEDT site:heraldsun.com.au" ++# and obtaining estimated counts from the initial page of search results. ++# All ten papers greatly preferred "AEDT" to "EDT". The papers ++# surveyed were the Herald Sun, The Daily Telegraph, The Courier-Mail, ++# The Sydney Morning Herald, The West Australian, The Age, The Advertiser, ++# The Australian, The Financial Review, and The Herald (Newcastle). + # +-# Personally, I would prefer to use common practice; I would like to +-# refer to legislation only for examples of common practice, or as a +-# tiebreaker. ++# I also searched for historical usage, to see whether abbreviations ++# like "AEDT" are new. A Trove search <http://trove.nla.gov.au/> ++# found only one newspaper (The Canberra Times) with a house style ++# dating back to the 1970s, I expect because other newspapers weren't ++# fully indexed. The Canberra Times strongly preferred abbreviations ++# like "AEDT". The first occurrence of "AEDT" was a World Weather ++# column (1971-11-17, page 24), and of "ACDT" was a Scoreboard column ++# (1993-01-24, p 16). The style was the typical usage but was not ++# strictly enforced; for example, "Welcome to the twilight zones ..." ++# (1994-10-29, p 1) uses the abbreviations AEST/AEDT, CST/CDT, and ++# WST, and goes on to say, "The confusion and frustration some feel ++# about the lack of uniformity among Australia's six states and two ++# territories has prompted one group to form its very own political ++# party -- the Sydney-based Daylight Saving Extension Party." + # +-# * Do Australians more often use "Eastern Daylight Time" or "Eastern +-# Summer Time"? Do they typically prefix the time zone names with +-# the word "Australian"? ++# I also surveyed federal government sources. They did not agree: + # +-# My own impression is that both "Daylight Time" and "Summer Time" are +-# common and are widely understood, but that "Summer Time" is more +-# popular; and that the leading "A" is also common but is omitted more +-# often than not. I just used AltaVista advanced search and got the +-# following count of page hits: ++# The Australian Government (2014-03-26) ++# http://australia.gov.au/about-australia/our-country/time ++# (This document was produced by the Department of Finance.) ++# AEST ACST AWST AEDT ACDT + # +-# 1,103 "Eastern Summer Time" AND domain:au +-# 971 "Australian Eastern Summer Time" AND domain:au +-# 613 "Eastern Daylight Time" AND domain:au +-# 127 "Australian Eastern Daylight Time" AND domain:au ++# Bureau of Meteorology (2012-11-08) ++# http://www.bom.gov.au/climate/averages/tables/daysavtm.shtml ++# EST CST WST EDT CDT + # +-# Here "Summer" seems quite a bit more popular than "Daylight", +-# particularly when we know the time zone is Australian and not US, +-# say. The "Australian" prefix seems to be popular for Eastern Summer +-# Time, but unpopular for Eastern Daylight Time. ++# Civil Aviation Safety Authority (undated) ++# http://services.casa.gov.au/outnback/inc/pages/episode3/episode-3_time_zones.shtml ++# EST CST WST (no abbreviations given for DST) + # +-# For abbreviations, tools like AltaVista are less useful because of +-# ambiguity. Many hits are not really time zones, unfortunately, and +-# many hits denote US time zones and not Australian ones. But here +-# are the hit counts anyway: ++# Geoscience Australia (2011-11-24) ++# http://www.ga.gov.au/geodesy/astro/sunrise.jsp ++# AEST ACST AWST AEDT ACDT + # +-# 161,304 "EST" and domain:au +-# 25,156 "EDT" and domain:au +-# 18,263 "AEST" and domain:au +-# 10,416 "AEDT" and domain:au ++# Parliamentary Library (2008-11-10) ++# http://www.aph.gov.au/binaries/library/pubs/rp/2008-09/09rp14.pdf ++# EST CST WST preferred for standard time; AEST AEDT ACST ACDT also used + # +-# 14,538 "CST" and domain:au +-# 5,728 "CDT" and domain:au +-# 176 "ACST" and domain:au +-# 29 "ACDT" and domain:au ++# The Transport Safety Bureau has an extensive series of accident reports, ++# and investigators seem to use whatever abbreviation they like. ++# Googling site:atsb.gov.au found the following number of unique hits: ++# 311 "ESuT", 195 "EDT", 26 "AEDT", 83 "CSuT", 46 "CDT". ++# "_SuT" tended to appear in older reports, and "A_DT" tended to ++# appear in reports of events with international implications. + # +-# 7,539 "WST" and domain:au +-# 68 "AWST" and domain:au +-# +-# This data suggest that Australians tend to omit the "A" prefix in +-# practice. The situation for "ST" versus "DT" is less clear, given +-# the ambiguities involved. +-# +-# * How do Australians feel about the abbreviations in the tz database? +-# +-# If you just count Australians on this list, I count 2 in favor and 3 +-# against. One of the "against" votes (David Keegel) counseled delay, +-# saying that both AEST/AEDT and EST/EST are widely used and +-# understood in Australia. ++# From the above it appears that there is a working consensus in ++# Australia to use trailing "DT" for daylight saving time; although ++# some sources use trailing "SST" or "ST" or "SuT" they are by far in ++# the minority. The case for leading "A" is weaker, but since it ++# seems to be preferred in the overall web and is preferred in all ++# the leading newspaper websites and in many government departments, ++# it has a stronger case than omitting the leading "A". The current ++# version of the database therefore uses abbreviations like "AEST" and ++# "AEDT" for Australian time zones. + + # From Paul Eggert (1995-12-19): + # Shanks & Pottenger report 2:00 for all autumn changes in Australia and NZ. + # Mark Prior writes that his newspaper + # reports that NSW's fall 1995 change will occur at 2:00, + # but Robert Elz says it's been 3:00 in Victoria since 1970 +-# and perhaps the newspaper's `2:00' is referring to standard time. ++# and perhaps the newspaper's '2:00' is referring to standard time. + # For now we'll continue to assume 2:00s for changes since 1960. + + # From Eric Ulevik (1998-01-05): +@@ -1055,17 +1031,14 @@ + # relevant entries in this database. + # + # NSW (including LHI and Broken Hill): +-# <a href="http://www.austlii.edu.au/au/legis/nsw/consol_act/sta1987137/index.html"> + # Standard Time Act 1987 (updated 1995-04-04) +-# </a> ++# http://www.austlii.edu.au/au/legis/nsw/consol_act/sta1987137/index.html + # ACT +-# <a href="http://www.austlii.edu.au/au/legis/act/consol_act/stasta1972279/index.html"> + # Standard Time and Summer Time Act 1972 +-# </a> ++# http://www.austlii.edu.au/au/legis/act/consol_act/stasta1972279/index.html + # SA +-# <a href="http://www.austlii.edu.au/au/legis/sa/consol_act/sta1898137/index.html"> + # Standard Time Act, 1898 +-# </a> ++# http://www.austlii.edu.au/au/legis/sa/consol_act/sta1898137/index.html + + # From David Grosz (2005-06-13): + # It was announced last week that Daylight Saving would be extended by +@@ -1083,7 +1056,7 @@ + # Victoria: I wasn't able to find anything separate, but the other articles + # allude to it. + # But not Queensland +-# http://www.news.com.au/story/0,10117,15564030-1248,00.html. ++# http://www.news.com.au/story/0,10117,15564030-1248,00.html + + # Northern Territory + +@@ -1130,9 +1103,9 @@ + # The 1992 ending date used in the rules is a best guess; + # it matches what was used in the past. + +-# <a href="http://www.bom.gov.au/faq/faqgen.htm"> + # The Australian Bureau of Meteorology FAQ +-# </a> (1999-09-27) writes that Giles Meteorological Station uses ++# http://www.bom.gov.au/faq/faqgen.htm ++# (1999-09-27) writes that Giles Meteorological Station uses + # South Australian time even though it's located in Western Australia. + + # Queensland +@@ -1173,9 +1146,9 @@ + # The chosen rules the union of the 1971/1972 change and the 1989-1992 changes. + + # From Christopher Hunt (2006-11-21), after an advance warning +-# from Jesper Norgaard Welen (2006-11-01): ++# from Jesper Nørgaard Welen (2006-11-01): + # WA are trialing DST for three years. +-# <http://www.parliament.wa.gov.au/parliament/bills.nsf/9A1B183144403DA54825721200088DF1/$File/Bill175-1B.pdf> ++# http://www.parliament.wa.gov.au/parliament/bills.nsf/9A1B183144403DA54825721200088DF1/$File/Bill175-1B.pdf + + # From Rives McDow (2002-04-09): + # The most interesting region I have found consists of three towns on the +@@ -1189,7 +1162,7 @@ + # From Paul Eggert (2002-04-09): + # This is confirmed by the section entitled + # "What's the deal with time zones???" in +-# <http://www.earthsci.unimelb.edu.au/~awatkins/null.html>. ++# http://www.earthsci.unimelb.edu.au/~awatkins/null.html + # + # From Alex Livingston (2006-12-07): + # ... it was just on four years ago that I drove along the Eyre Highway, +@@ -1337,7 +1310,7 @@ + # Based on law library research by John Mackin, + # who notes: + # In Australia, time is not legislated federally, but rather by the +-# individual states. Thus, while such terms as ``Eastern Standard Time'' ++# individual states. Thus, while such terms as "Eastern Standard Time" + # [I mean, of course, Australian EST, not any other kind] are in common + # use, _they have NO REAL MEANING_, as they are not defined in the + # legislation. This is very important to understand. +@@ -1345,48 +1318,42 @@ + + # From Eric Ulevik (1999-05-26): + # DST will start in NSW on the last Sunday of August, rather than the usual +-# October in 2000. [See: Matthew Moore, +-# <a href="http://www.smh.com.au/news/9905/26/pageone/pageone4.html"> +-# Two months more daylight saving +-# </a> +-# Sydney Morning Herald (1999-05-26).] ++# October in 2000. See: Matthew Moore, ++# Two months more daylight saving, Sydney Morning Herald (1999-05-26). ++# http://www.smh.com.au/news/9905/26/pageone/pageone4.html + + # From Paul Eggert (1999-09-27): + # See the following official NSW source: +-# <a href="http://dir.gis.nsw.gov.au/cgi-bin/genobject/document/other/daylightsaving/tigGmZ"> + # Daylight Saving in New South Wales. +-# </a> ++# http://dir.gis.nsw.gov.au/cgi-bin/genobject/document/other/daylightsaving/tigGmZ + # + # Narrabri Shire (NSW) council has announced it will ignore the extension of + # daylight saving next year. See: +-# <a href="http://abc.net.au/news/regionals/neweng/monthly/regeng-22jul1999-1.htm"> + # Narrabri Council to ignore daylight saving +-# </a> (1999-07-22). For now, we'll wait to see if this really happens. ++# http://abc.net.au/news/regionals/neweng/monthly/regeng-22jul1999-1.htm ++# (1999-07-22). For now, we'll wait to see if this really happens. + # + # Victoria will following NSW. See: +-# <a href="http://abc.net.au/local/news/olympics/1999/07/item19990728112314_1.htm"> +-# Vic to extend daylight saving +-# </a> (1999-07-28). ++# Vic to extend daylight saving (1999-07-28) ++# http://abc.net.au/local/news/olympics/1999/07/item19990728112314_1.htm + # + # However, South Australia rejected the DST request. See: +-# <a href="http://abc.net.au/news/olympics/1999/07/item19990719151754_1.htm"> +-# South Australia rejects Olympics daylight savings request +-# </a> (1999-07-19). ++# South Australia rejects Olympics daylight savings request (1999-07-19) ++# http://abc.net.au/news/olympics/1999/07/item19990719151754_1.htm + # + # Queensland also will not observe DST for the Olympics. See: +-# <a href="http://abc.net.au/news/olympics/1999/06/item19990601114608_1.htm"> + # Qld says no to daylight savings for Olympics +-# </a> (1999-06-01), which quotes Queensland Premier Peter Beattie as saying +-# ``Look you've got to remember in my family when this came up last time ++# http://abc.net.au/news/olympics/1999/06/item19990601114608_1.htm ++# (1999-06-01), which quotes Queensland Premier Peter Beattie as saying ++# "Look you've got to remember in my family when this came up last time + # I voted for it, my wife voted against it and she said to me it's all very + # well for you, you don't have to worry about getting the children out of + # bed, getting them to school, getting them to sleep at night. +-# I've been through all this argument domestically...my wife rules.'' ++# I've been through all this argument domestically...my wife rules." + # + # Broken Hill will stick with South Australian time in 2000. See: +-# <a href="http://abc.net.au/news/regionals/brokenh/monthly/regbrok-21jul1999-6.htm"> +-# Broken Hill to be behind the times +-# </a> (1999-07-21). ++# Broken Hill to be behind the times (1999-07-21) ++# http://abc.net.au/news/regionals/brokenh/monthly/regbrok-21jul1999-6.htm + + # IATA SSIM (1998-09) says that the spring 2000 change for Australian + # Capital Territory, New South Wales except Lord Howe Island and Broken +@@ -1402,7 +1369,7 @@ + # Yancowinna + + # From John Mackin (1989-01-04): +-# `Broken Hill' means the County of Yancowinna. ++# 'Broken Hill' means the County of Yancowinna. + + # From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06): + # # YANCOWINNA.. [ Confirmation courtesy of Broken Hill Postmaster ] +@@ -1459,9 +1426,7 @@ + # summer (southern hemisphere). + # + # From +-# <a href="http://www.safework.sa.gov.au/uploaded_files/DaylightDatesSet.pdf"> + # http://www.safework.sa.gov.au/uploaded_files/DaylightDatesSet.pdf +-# </a> + # The extended daylight saving period that South Australia has been trialling + # for over the last year is now set to be ongoing. + # Daylight saving will continue to start on the first Sunday in October each +@@ -1471,9 +1436,7 @@ + # the ACT for all 52 weeks of the year... + # + # We have a wrap-up here: +-# <a href="http://www.timeanddate.com/news/time/south-australia-extends-dst.html"> + # http://www.timeanddate.com/news/time/south-australia-extends-dst.html +-# </a> + ############################################################################### + + # New Zealand +@@ -1482,7 +1445,7 @@ + # the 1989/90 year was a trial of an extended "daylight saving" period. + # This trial was deemed successful and the extended period adopted for + # subsequent years (with the addition of a further week at the start). +-# source -- phone call to Ministry of Internal Affairs Head Office. ++# source - phone call to Ministry of Internal Affairs Head Office. + + # From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06): + # # The Country of New Zealand (Australia's east island -) Gee they hate that! +@@ -1524,6 +1487,19 @@ + # that DST will begin on 2007-09-30 2008-04-06. + # http://www.dia.govt.nz/diawebsite.nsf/wpg_URL/Services-Daylight-Saving-Daylight-saving-to-be-extended + ++# From Paul Eggert (2014-07-14): ++# Chatham Island time was formally standardized on 1957-01-01 by ++# New Zealand's Standard Time Amendment Act 1956 (1956-10-26). ++# http://www.austlii.edu.au/nz/legis/hist_act/staa19561956n100244.pdf ++# According to Google Books snippet view, a speaker in the New Zealand ++# parliamentary debates in 1956 said "Clause 78 makes provision for standard ++# time in the Chatham Islands. The time there is 45 minutes in advance of New ++# Zealand time. I understand that is the time they keep locally, anyhow." ++# For now, assume this practice goes back to the introduction of standard time ++# in New Zealand, as this would make Chatham Islands time almost exactly match ++# LMT back when New Zealand was at UTC+11:30; also, assume Chatham Islands did ++# not observe New Zealand's prewar DST. ++ + ############################################################################### + + +@@ -1543,7 +1519,7 @@ + + # From the BBC World Service in + # http://news.bbc.co.uk/2/hi/asia-pacific/205226.stm (1998-10-31 16:03 UTC): +-# The Fijiian government says the main reasons for the time change is to ++# The Fijian government says the main reasons for the time change is to + # improve productivity and reduce road accidents.... [T]he move is also + # intended to boost Fiji's ability to attract tourists to witness the dawning + # of the new millennium. +@@ -1551,16 +1527,12 @@ + # http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13) + # reports that Fiji has discontinued DST. + +-# Johnston +- +-# Johnston data is from usno1995. +- + + # Kiribati + + # From Paul Eggert (1996-01-22): + # Today's _Wall Street Journal_ (page 1) reports that Kiribati +-# ``declared it the same day [throughout] the country as of Jan. 1, 1995'' ++# "declared it the same day [throughout] the country as of Jan. 1, 1995" + # as part of the competition to be first into the 21st century. + + +@@ -1575,8 +1547,8 @@ + + # N Mariana Is, Guam + +-# Howse writes (p 153) ``The Spaniards, on the other hand, reached the +-# Philippines and the Ladrones from America,'' and implies that the Ladrones ++# Howse writes (p 153) "The Spaniards, on the other hand, reached the ++# Philippines and the Ladrones from America," and implies that the Ladrones + # (now called the Marianas) kept American date for quite some time. + # For now, we assume the Ladrones switched at the same time as the Philippines; + # see Asia/Manila. +@@ -1590,17 +1562,16 @@ + # Micronesia + + # Alan Eugene Davis writes (1996-03-16), +-# ``I am certain, having lived there for the past decade, that "Truk" +-# (now properly known as Chuuk) ... is in the time zone GMT+10.'' ++# "I am certain, having lived there for the past decade, that 'Truk' ++# (now properly known as Chuuk) ... is in the time zone GMT+10." + # + # Shanks & Pottenger write that Truk switched from UTC+10 to UTC+11 + # on 1978-10-01; ignore this for now. + + # From Paul Eggert (1999-10-29): + # The Federated States of Micronesia Visitors Board writes in +-# <a href="http://www.fsmgov.org/info/clocks.html"> +-# The Federated States of Micronesia - Visitor Information +-# </a> (1999-01-26) ++# The Federated States of Micronesia - Visitor Information (1999-01-26) ++# http://www.fsmgov.org/info/clocks.html + # that Truk and Yap are UTC+10, and Ponape and Kosrae are UTC+11. + # We don't know when Kosrae switched from UTC+12; assume January 1 for now. + +@@ -1646,27 +1617,34 @@ + # Sacramento but it was changed a couple of years ago. + + +-# Samoa ++# (Western) Samoa and American Samoa + + # Howse writes (p 153, citing p 10 of the 1883-11-18 New York Herald) + # that in 1879 the King of Samoa decided to change +-# ``the date in his kingdom from the Antipodean to the American system, +-# ordaining -- by a masterpiece of diplomatic flattery -- that +-# the Fourth of July should be celebrated twice in that year.'' ++# "the date in his kingdom from the Antipodean to the American system, ++# ordaining - by a masterpiece of diplomatic flattery - that ++# the Fourth of July should be celebrated twice in that year." + ++# Although Shanks & Pottenger says they both switched to UTC-11:30 ++# in 1911, and to UTC-11 in 1950. many earlier sources give UTC-11 ++# for American Samoa, e.g., the US National Bureau of Standards ++# circular "Standard Time Throughout the World", 1932. ++# Assume American Samoa switched to UTC-11 in 1911, not 1950, ++# and that after 1950 they agreed until (western) Samoa skipped a ++# day in 2011. Assume also that the Samoas follow the US and New ++# Zealand's "ST"/"DT" style of daylight-saving abbreviations. + + # Tonga + + # From Paul Eggert (1996-01-22): +-# Today's _Wall Street Journal_ (p 1) reports that ``Tonga has been plotting +-# to sneak ahead of [New Zealanders] by introducing daylight-saving time.'' ++# Today's _Wall Street Journal_ (p 1) reports that "Tonga has been plotting ++# to sneak ahead of [New Zealanders] by introducing daylight-saving time." + # Since Kiribati has moved the Date Line it's not clear what Tonga will do. + + # Don Mundell writes in the 1997-02-20 Tonga Chronicle +-# <a href="http://www.tongatapu.net.to/tonga/homeland/timebegins.htm"> +-# How Tonga became `The Land where Time Begins' +-# </a>: +- ++# How Tonga became 'The Land where Time Begins': ++# http://www.tongatapu.net.to/tonga/homeland/timebegins.htm ++# + # Until 1941 Tonga maintained a standard time 50 minutes ahead of NZST + # 12 hours and 20 minutes ahead of GMT. When New Zealand adjusted its + # standard time in 1940s, Tonga had the choice of subtracting from its +@@ -1674,8 +1652,8 @@ + # advancing its time to maintain the differential of 13 degrees + # (approximately 50 minutes ahead of New Zealand time). + # +-# Because His Majesty King Taufa'ahau Tupou IV, then Crown Prince +-# Tungi, preferred to ensure Tonga's title as the land where time ++# Because His Majesty King Tāufaʻāhau Tupou IV, then Crown Prince ++# Tungī, preferred to ensure Tonga's title as the land where time + # begins, the Legislative Assembly approved the latter change. + # + # But some of the older, more conservative members from the outer +@@ -1701,9 +1679,7 @@ + # * Tonga will introduce DST in November + # + # I was given this link by John Letts: +-# <a href="http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm"> + # http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm +-# </a> + # + # I have not been able to find exact dates for the transition in November + # yet. By reading this article it seems like Fiji will be 14 hours ahead +@@ -1711,9 +1687,7 @@ + # (12 + 1 hour DST). + + # From Arthur David Olson (1999-09-20): +-# According to <a href="http://www.tongaonline.com/news/sept1799.html"> +-# http://www.tongaonline.com/news/sept1799.html +-# </a>: ++# According to <http://www.tongaonline.com/news/sept1799.html>: + # "Daylight Savings Time will take effect on Oct. 2 through April 15, 2000 + # and annually thereafter from the first Saturday in October through the + # third Saturday of April. Under the system approved by Privy Council on +@@ -1731,7 +1705,7 @@ + # instead of the original reported date April 16. Unfortunately, the article + # is no longer available on the site, and I did not make a copy of the + # text, and I have forgotten to report it here. +-# (Original URL was: http://www.tongaonline.com/news/march162000.htm ) ++# (Original URL was <http://www.tongaonline.com/news/march162000.htm>) + + # From Rives McDow (2000-12-01): + # Tonga is observing DST as of 2000-11-04 and will stop on 2001-01-27. +@@ -1751,7 +1725,7 @@ + # From Vernice Anderson, Personal Secretary to Philip Jessup, + # US Ambassador At Large (oral history interview, 1971-02-02): + # +-# Saturday, the 14th [of October, 1950] -- ... The time was all the ++# Saturday, the 14th [of October, 1950] - ... The time was all the + # more confusing at that point, because we had crossed the + # International Date Line, thus getting two Sundays. Furthermore, we + # discovered that Wake Island had two hours of daylight saving time +@@ -1796,7 +1770,7 @@ + # on the high seas. Whenever a ship was within the territorial waters of any + # nation it would use that nation's standard time. The captain was permitted + # to change his ship's clocks at a time of his choice following his ship's +-# entry into another zone time--he often chose midnight. These zones were ++# entry into another zone time - he often chose midnight. These zones were + # adopted by all major fleets between 1920 and 1925 but not by many + # independent merchant ships until World War II. + +@@ -1804,6 +1778,6 @@ + # (2005-03-20): + # + # The American Practical Navigator (2002) +-# <http://pollux.nss.nima.mil/pubs/pubs_j_apn_sections.html?rid=187> ++# http://pollux.nss.nima.mil/pubs/pubs_j_apn_sections.html?rid=187 + # talks only about the 180-degree meridian with respect to ships in + # international waters; it ignores the international date line. +--- ./jdk/make/sun/javazic/tzdata/backward Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/backward Mon Jan 05 11:57:27 2015 -0800 +@@ -21,15 +21,15 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + + # This file provides links between current names for time zones + # and their old names. Many names changed in late 1993. + ++# Link TARGET LINK-NAME + Link Africa/Asmara Africa/Asmera +-Link Africa/Bamako Africa/Timbuktu ++Link Africa/Abidjan Africa/Timbuktu + Link America/Argentina/Catamarca America/Argentina/ComodRivadavia + Link America/Adak America/Atka + Link America/Argentina/Buenos_Aires America/Buenos_Aires +@@ -50,8 +50,11 @@ + Link Pacific/Auckland Antarctica/South_Pole + Link Asia/Ashgabat Asia/Ashkhabad + Link Asia/Kolkata Asia/Calcutta +-Link Asia/Chongqing Asia/Chungking ++Link Asia/Shanghai Asia/Chongqing ++Link Asia/Shanghai Asia/Chungking + Link Asia/Dhaka Asia/Dacca ++Link Asia/Shanghai Asia/Harbin ++Link Asia/Urumqi Asia/Kashgar + Link Asia/Kathmandu Asia/Katmandu + Link Asia/Macau Asia/Macao + Link Asia/Ho_Chi_Minh Asia/Saigon +--- ./jdk/make/sun/javazic/tzdata/etcetera Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/etcetera Mon Jan 05 11:57:27 2015 -0800 +@@ -21,7 +21,6 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +@@ -37,7 +36,7 @@ + Zone Etc/UCT 0 - UCT + + # The following link uses older naming conventions, +-# but it belongs here, not in the file `backward', ++# but it belongs here, not in the file 'backward', + # as functions like gmtime load the "GMT" file to handle leap seconds properly. + # We want this to work even on installations that omit the other older names. + Link Etc/GMT GMT +--- ./jdk/make/sun/javazic/tzdata/europe Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/europe Mon Jan 05 11:57:27 2015 -0800 +@@ -21,24 +21,30 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +-# This data is by no means authoritative; if you think you know better, ++# This file is by no means authoritative; if you think you know better, + # go ahead and edit the file (and please send any changes to +-# tz@iana.org for general use in the future). ++# tz@iana.org for general use in the future). For more, please see ++# the file CONTRIBUTING in the tz distribution. + +-# From Paul Eggert (2006-03-22): +-# A good source for time zone historical data outside the U.S. is ++# From Paul Eggert (2014-10-31): ++# ++# Unless otherwise specified, the source for data through 1990 is: + # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), + # San Diego: ACS Publications, Inc. (2003). ++# Unfortunately this book contains many errors and cites no sources. + # + # Gwillim Law writes that a good source + # for recent time zone data is the International Air Transport + # Association's Standard Schedules Information Manual (IATA SSIM), + # published semiannually. Law sent in several helpful summaries +-# of the IATA's data after 1990. ++# of the IATA's data after 1990. Except where otherwise noted, ++# IATA SSIM is the source for entries after 1990. ++# ++# A reliable and entertaining source about time zones is ++# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997). + # + # Except where otherwise noted, Shanks & Pottenger is the source for + # entries through 1991, and IATA SSIM is the source for entries afterwards. +@@ -49,9 +55,9 @@ + # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), + # which I found in the UCLA library. + # +-# <a href="http://www.pettswoodvillage.co.uk/Daylight_Savings_William_Willett.pdf"> + # William Willett, The Waste of Daylight, 19th edition +-# </a> (1914-03) ++# <http://cs.ucla.edu/~eggert/The-Waste-of-Daylight-19th.pdf> ++# [PDF] (1914-03) + # + # Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94 + # <http://www.jstor.org/stable/1774359>. He writes: +@@ -59,10 +65,20 @@ + # may be sent to Mr. John Milne, Royal Geographical Society, + # Savile Row, London." Nowadays please email them to tz@iana.org. + # +-# Brazil's Departamento Servico da Hora (DSH), +-# <a href="http://pcdsh01.on.br/HISTHV.htm"> ++# Byalokoz EL. New Counting of Time in Russia since July 1, 1919. ++# This Russian-language source was consulted by Vladimir Karpinsky; see ++# http://mm.icann.org/pipermail/tz/2014-August/021320.html ++# The full Russian citation is: ++# Бялокоз, Евгений Людвигович. Новый счет времени в течении суток ++# введенный декретом Совета народных комиссаров для всей России с 1-го ++# июля 1919 г. / Изд. 2-е Междуведомственной комиссии. - Петроград: ++# Десятая гос. тип., 1919. ++# http://resolver.gpntb.ru/purl?docushare/dsweb/Get/Resource-2011/Byalokoz__E.L.__Novyy__schet__vremeni__v__techenie__sutok__izd__2(1).pdf ++# ++# Brazil's Divisão Serviço da Hora (DSHO), + # History of Summer Time +-# </a> (1998-09-21, in Portuguese) ++# <http://pcdsh01.on.br/HISTHV.htm> ++# (1998-09-21, in Portuguese) + + # + # I invented the abbreviations marked '*' in the following table; +@@ -78,13 +94,12 @@ + # 0:00 WET WEST WEMT Western Europe + # 0:19:32.13 AMT NST Amsterdam, Netherlands Summer (1835-1937)* + # 0:20 NET NEST Netherlands (1937-1940)* ++# 1:00 BST British Standard (1968-1971) + # 1:00 CET CEST CEMT Central Europe + # 1:00:14 SET Swedish (1879-1899)* + # 2:00 EET EEST Eastern Europe +-# 3:00 MSK MSD Moscow +-# +-# A reliable and entertaining source about time zones, especially in Britain, +-# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997). ++# 3:00 FET Further-eastern Europe (2011-2014)* ++# 3:00 MSK MSD MSM* Moscow + + # From Peter Ilieve (1994-12-04), + # The original six [EU members]: Belgium, France, (West) Germany, Italy, +@@ -128,7 +143,7 @@ + # along the towpath within a few yards of it.' + # + # I have a one inch to one mile map of London and my estimate of the stone's +-# position is 51 deg. 28' 30" N, 0 deg. 18' 45" W. The longitude should ++# position is 51 degrees 28' 30" N, 0 degrees 18' 45" W. The longitude should + # be within about +-2". The Ordnance Survey grid reference is TQ172761. + # + # [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.] +@@ -160,8 +175,22 @@ + # transition date for London, namely 1847-12-01. We don't know as much + # about Dublin, so we use 1880-08-02, the legal transition time. + +-# From Paul Eggert (2003-09-27): +-# Summer Time was first seriously proposed by William Willett (1857-1915), ++# From Paul Eggert (2014-07-19): ++# The ancients had no need for daylight saving, as they kept time ++# informally or via hours whose length depended on the time of year. ++# Daylight saving time in its modern sense was invented by the ++# New Zealand entomologist George Vernon Hudson (1867-1946), ++# whose day job as a postal clerk led him to value ++# after-hours daylight in which to pursue his research. ++# In 1895 he presented a paper to the Wellington Philosophical Society ++# that proposed a two-hour daylight-saving shift. See: ++# Hudson GV. On seasonal time-adjustment in countries south of lat. 30 deg. ++# Transactions and Proceedings of the New Zealand Institute. 1895;28:734 ++# http://rsnz.natlib.govt.nz/volume/rsnz_28/rsnz_28_00_006110.html ++# Although some interest was expressed in New Zealand, his proposal ++# did not find its way into law and eventually it was almost forgotten. ++# ++# In England, DST was independently reinvented by William Willett (1857-1915), + # a London builder and member of the Royal Astronomical Society + # who circulated a pamphlet "The Waste of Daylight" (1907) + # that proposed advancing clocks 20 minutes on each of four Sundays in April, +@@ -174,7 +203,7 @@ + # A monument to Willett was unveiled on 1927-05-21, in an open space in + # a 45-acre wood near Chislehurst, Kent that was purchased by popular + # subscription and open to the public. On the south face of the monolith, +-# designed by G. W. Miller, is the...William Willett Memorial Sundial, ++# designed by G. W. Miller, is the William Willett Memorial Sundial, + # which is permanently set to Summer Time. + + # From Winston Churchill (1934-04-28): +@@ -183,9 +212,9 @@ + # between 160 and 170 hours more daylight leisure, to a war which + # plunged Europe into darkness for four years, and shook the + # foundations of civilization throughout the world. +-# -- <a href="http://www.winstonchurchill.org/fh114willett.htm"> +-# "A Silent Toast to William Willett", Pictorial Weekly +-# </a> ++# -- "A Silent Toast to William Willett", Pictorial Weekly; ++# republished in Finest Hour (Spring 2002) 1(114):26 ++# http://www.winstonchurchill.org/images/finesthour/Vol.01%20No.114.pdf + + # From Paul Eggert (1996-09-03): + # The OED Supplement says that the English originally said "Daylight Saving" +@@ -194,7 +223,6 @@ + # proponents (who eventually won the argument) are quoted as using "Summer". + + # From Arthur David Olson (1989-01-19): +-# + # A source at the British Information Office in New York avers that it's + # known as "British" Summer Time in all parts of the United Kingdom. + +@@ -221,8 +249,8 @@ + # official designation; the reply of the 21st was that there wasn't + # but he couldn't think of anything better than the "Double British + # Summer Time" that the BBC had been using informally. +-# http://student.cusu.cam.ac.uk/~jsm28/british-time/bbc-19410418.png +-# http://student.cusu.cam.ac.uk/~jsm28/british-time/ho-19410421.png ++# http://www.polyomino.org.uk/british-time/bbc-19410418.png ++# http://www.polyomino.org.uk/british-time/ho-19410421.png + + # From Sir Alexander Maxwell in the above-mentioned letter (1941-04-21): + # [N]o official designation has as far as I know been adopted for the time +@@ -239,23 +267,14 @@ + # the history of summer time legislation in the United Kingdom. + # Since 1998 Joseph S. Myers has been updating + # and extending this list, which can be found in +-# http://student.cusu.cam.ac.uk/~jsm28/british-time/ +-# <a href="http://www.polyomino.org.uk/british-time/"> +-# History of legal time in Britain +-# </a> +-# Rob Crowther (2012-01-04) reports that that URL no longer +-# exists, and the article can now be found at: +-# <a href="http://www.polyomino.org.uk/british-time/"> + # http://www.polyomino.org.uk/british-time/ +-# </a> + + # From Joseph S. Myers (1998-01-06): + # + # The legal time in the UK outside of summer time is definitely GMT, not UTC; + # see Lord Tanlaw's speech +-# <a href="http://www.parliament.the-stationery-office.co.uk/pa/ld199697/ldhansrd/pdvn/lds97/text/70611-20.htm#70611-20_head0"> +-# (Lords Hansard 11 June 1997 columns 964 to 976) +-# </a>. ++# http://www.publications.parliament.uk/pa/ld199798/ldhansrd/vo970611/text/70611-10.htm#70611-10_head0 ++# (Lords Hansard 11 June 1997 columns 964 to 976). + + # From Paul Eggert (2006-03-22): + # +@@ -294,9 +313,17 @@ + # "Timeball on the ballast office is down. Dunsink time." + # -- James Joyce, Ulysses + ++# "Countess Markievicz ... claimed that the [1916] abolition of Dublin Mean Time ++# was among various actions undertaken by the 'English' government that ++# would 'put the whole country into the SF (Sinn Féin) camp'. She claimed ++# Irish 'public feeling (was) outraged by forcing of English time on us'." ++# -- Parsons M. Dublin lost its time zone - and 25 minutes - after 1916 Rising. ++# Irish Times 2014-10-27. ++# http://www.irishtimes.com/news/politics/dublin-lost-its-time-zone-and-25-minutes-after-1916-rising-1.1977411 ++ + # From Joseph S. Myers (2005-01-26): +-# Irish laws are available online at www.irishstatutebook.ie. These include +-# various relating to legal time, for example: ++# Irish laws are available online at <http://www.irishstatutebook.ie>. ++# These include various relating to legal time, for example: + # + # ZZA13Y1923.html ZZA12Y1924.html ZZA8Y1925.html ZZSIV20PG1267.html + # +@@ -458,25 +485,27 @@ + # Use Europe/London for Jersey, Guernsey, and the Isle of Man. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Europe/London -0:01:15 - LMT 1847 Dec 1 0:00s ++Zone Europe/London -0:01:15 - LMT 1847 Dec 1 0:00s + 0:00 GB-Eire %s 1968 Oct 27 +- 1:00 - BST 1971 Oct 31 2:00u ++ 1:00 - BST 1971 Oct 31 2:00u + 0:00 GB-Eire %s 1996 + 0:00 EU GMT/BST + Link Europe/London Europe/Jersey + Link Europe/London Europe/Guernsey + Link Europe/London Europe/Isle_of_Man ++ ++# Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2 +- -0:25:21 - DMT 1916 May 21 2:00 +- -0:25:21 1:00 IST 1916 Oct 1 2:00s ++ -0:25:21 - DMT 1916 May 21 2:00 ++ -0:25:21 1:00 IST 1916 Oct 1 2:00s + 0:00 GB-Eire %s 1921 Dec 6 # independence +- 0:00 GB-Eire GMT/IST 1940 Feb 25 2:00 +- 0:00 1:00 IST 1946 Oct 6 2:00 +- 0:00 - GMT 1947 Mar 16 2:00 +- 0:00 1:00 IST 1947 Nov 2 2:00 +- 0:00 - GMT 1948 Apr 18 2:00 ++ 0:00 GB-Eire GMT/IST 1940 Feb 25 2:00 ++ 0:00 1:00 IST 1946 Oct 6 2:00 ++ 0:00 - GMT 1947 Mar 16 2:00 ++ 0:00 1:00 IST 1947 Nov 2 2:00 ++ 0:00 - GMT 1948 Apr 18 2:00 + 0:00 GB-Eire GMT/IST 1968 Oct 27 +- 1:00 - IST 1971 Oct 31 2:00u ++ 1:00 - IST 1971 Oct 31 2:00u + 0:00 GB-Eire GMT/IST 1996 + 0:00 EU GMT/IST + +@@ -495,10 +524,9 @@ + Rule EU 1981 max - Mar lastSun 1:00u 1:00 S + Rule EU 1996 max - Oct lastSun 1:00u 0 - + # The most recent directive covers the years starting in 2002. See: +-# <a="http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32000L0084:EN:NOT"> + # Directive 2000/84/EC of the European Parliament and of the Council + # of 19 January 2001 on summer-time arrangements. +-# </a> ++# http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32000L0084:EN:NOT + + # W-Eur differs from EU only in that W-Eur uses standard time. + Rule W-Eur 1977 1980 - Apr Sun>=1 1:00s 1:00 S +@@ -521,18 +549,18 @@ + Rule C-Eur 1944 1945 - Apr Mon>=1 2:00s 1:00 S + # Whitman gives 1944 Oct 7; go with Shanks & Pottenger. + Rule C-Eur 1944 only - Oct 2 2:00s 0 - +-# From Jesper Norgaard Welen (2008-07-13): ++# From Jesper Nørgaard Welen (2008-07-13): + # + # I found what is probably a typo of 2:00 which should perhaps be 2:00s + # in the C-Eur rule from tz database version 2008d (this part was +-# corrected in version 2008d). The circumstancial evidence is simply the ++# corrected in version 2008d). The circumstantial evidence is simply the + # tz database itself, as seen below: + # + # Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01 + # 0:00 France WE%sT 1945 Sep 16 3:00 + # + # Zone Europe/Monaco 0:29:32 - LMT 1891 Mar 15 +-# 0:00 France WE%sT 1945 Sep 16 3:00 ++# 0:00 France WE%sT 1945 Sep 16 3:00 + # + # Zone Europe/Belgrade 1:22:00 - LMT 1884 + # 1:00 1:00 CEST 1945 Sep 16 2:00s +@@ -576,16 +604,16 @@ + Rule E-Eur 1996 max - Oct lastSun 0:00 0 - + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Russia 1917 only - Jul 1 23:00 1:00 MST # Moscow Summer Time +-Rule Russia 1917 only - Dec 28 0:00 0 MMT # Moscow Mean Time +-Rule Russia 1918 only - May 31 22:00 2:00 MDST # Moscow Double Summer Time ++Rule Russia 1917 only - Jul 1 23:00 1:00 MST # Moscow Summer Time ++Rule Russia 1917 only - Dec 28 0:00 0 MMT # Moscow Mean Time ++Rule Russia 1918 only - May 31 22:00 2:00 MDST # Moscow Double Summer Time + Rule Russia 1918 only - Sep 16 1:00 1:00 MST + Rule Russia 1919 only - May 31 23:00 2:00 MDST +-Rule Russia 1919 only - Jul 1 2:00 1:00 S +-Rule Russia 1919 only - Aug 16 0:00 0 - +-Rule Russia 1921 only - Feb 14 23:00 1:00 S +-Rule Russia 1921 only - Mar 20 23:00 2:00 M # Midsummer +-Rule Russia 1921 only - Sep 1 0:00 1:00 S ++Rule Russia 1919 only - Jul 1 2:00 1:00 MSD ++Rule Russia 1919 only - Aug 16 0:00 0 MSK ++Rule Russia 1921 only - Feb 14 23:00 1:00 MSD ++Rule Russia 1921 only - Mar 20 23:00 2:00 MSM # Midsummer ++Rule Russia 1921 only - Sep 1 0:00 1:00 MSD + Rule Russia 1921 only - Oct 1 0:00 0 - + # Act No.925 of the Council of Ministers of the USSR (1980-10-24): + Rule Russia 1981 1984 - Apr 1 0:00 1:00 S +@@ -600,6 +628,7 @@ + Rule Russia 1993 2010 - Mar lastSun 2:00s 1:00 S + Rule Russia 1993 1995 - Sep lastSun 2:00s 0 - + Rule Russia 1996 2010 - Oct lastSun 2:00s 0 - ++# As described below, Russia's 2014 change affects Zone data, not Rule data. + + # From Alexander Krivenyshev (2011-06-14): + # According to Kremlin press service, Russian President Dmitry Medvedev +@@ -607,14 +636,10 @@ + # According to the law Russia is abolishing daylight saving time. + # + # Medvedev signed a law "On the Calculation of Time" (in russian): +-# <a href="http://bmockbe.ru/events/?ID=7583"> + # http://bmockbe.ru/events/?ID=7583 +-# </a> + # + # Medvedev signed a law on the calculation of the time (in russian): +-# <a href="http://www.regnum.ru/news/polit/1413906.html"> + # http://www.regnum.ru/news/polit/1413906.html +-# </a> + + # From Arthur David Olson (2011-06-15): + # Take "abolishing daylight saving time" to mean that time is now considered +@@ -634,10 +659,10 @@ + # From Markus Kuhn (1996-07-12): + # The official German names ... are + # +-# Mitteleuropaeische Zeit (MEZ) = UTC+01:00 +-# Mitteleuropaeische Sommerzeit (MESZ) = UTC+02:00 ++# Mitteleuropäische Zeit (MEZ) = UTC+01:00 ++# Mitteleuropäische Sommerzeit (MESZ) = UTC+02:00 + # +-# as defined in the German Time Act (Gesetz ueber die Zeitbestimmung (ZeitG), ++# as defined in the German Time Act (Gesetz über die Zeitbestimmung (ZeitG), + # 1978-07-25, Bundesgesetzblatt, Jahrgang 1978, Teil I, S. 1110-1111).... + # I wrote ... to the German Federal Physical-Technical Institution + # +@@ -692,7 +717,7 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Andorra 0:06:04 - LMT 1901 + 0:00 - WET 1946 Sep 30 +- 1:00 - CET 1985 Mar 31 2:00 ++ 1:00 - CET 1985 Mar 31 2:00 + 1:00 EU CE%sT + + # Austria +@@ -718,9 +743,9 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Vienna 1:05:21 - LMT 1893 Apr + 1:00 C-Eur CE%sT 1920 +- 1:00 Austria CE%sT 1940 Apr 1 2:00s +- 1:00 C-Eur CE%sT 1945 Apr 2 2:00s +- 1:00 1:00 CEST 1945 Apr 12 2:00s ++ 1:00 Austria CE%sT 1940 Apr 1 2:00s ++ 1:00 C-Eur CE%sT 1945 Apr 2 2:00s ++ 1:00 1:00 CEST 1945 Apr 12 2:00s + 1:00 - CET 1946 + 1:00 Austria CE%sT 1981 + 1:00 EU CE%sT +@@ -731,38 +756,37 @@ + # GMT+3 without DST (was GMT+2 with DST). + # + # Sources (Russian language): +-# 1. +-# <a href="http://www.belta.by/ru/all_news/society/V-Belarusi-otmenjaetsja-perexod-na-sezonnoe-vremja_i_572952.html"> + # http://www.belta.by/ru/all_news/society/V-Belarusi-otmenjaetsja-perexod-na-sezonnoe-vremja_i_572952.html +-# </a> +-# 2. +-# <a href="http://naviny.by/rubrics/society/2011/09/16/ic_articles_116_175144/"> + # http://naviny.by/rubrics/society/2011/09/16/ic_articles_116_175144/ +-# </a> +-# 3. +-# <a href="http://news.tut.by/society/250578.html"> + # http://news.tut.by/society/250578.html +-# </a> ++# ++# From Alexander Bokovoy (2014-10-09): ++# Belarussian government decided against changing to winter time.... ++# http://eng.belta.by/all_news/society/Belarus-decides-against-adjusting-time-in-Russias-wake_i_76335.html ++# From Paul Eggert (2014-10-08): ++# Hence Belarus can share time zone abbreviations with Moscow again. ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Minsk 1:50:16 - LMT 1880 +- 1:50 - MMT 1924 May 2 # Minsk Mean Time ++ 1:50 - MMT 1924 May 2 # Minsk Mean Time + 2:00 - EET 1930 Jun 21 + 3:00 - MSK 1941 Jun 28 + 1:00 C-Eur CE%sT 1944 Jul 3 + 3:00 Russia MSK/MSD 1990 +- 3:00 - MSK 1991 Mar 31 2:00s +- 2:00 1:00 EEST 1991 Sep 29 2:00s +- 2:00 - EET 1992 Mar 29 0:00s +- 2:00 1:00 EEST 1992 Sep 27 0:00s +- 2:00 Russia EE%sT 2011 Mar 27 2:00s +- 3:00 - FET # Further-eastern European Time ++ 3:00 - MSK 1991 Mar 31 2:00s ++ 2:00 1:00 EEST 1991 Sep 29 2:00s ++ 2:00 - EET 1992 Mar 29 0:00s ++ 2:00 1:00 EEST 1992 Sep 27 0:00s ++ 2:00 Russia EE%sT 2011 Mar 27 2:00s ++ 3:00 - FET 2014 Oct 26 1:00s ++ 3:00 - MSK + + # Belgium + # + # From Paul Eggert (1997-07-02): + # Entries from 1918 through 1991 are taken from: + # Annuaire de L'Observatoire Royal de Belgique, +-# Avenue Circulaire, 3, B-1180 BRUXELLES, CLVIIe annee, 1991 ++# Avenue Circulaire, 3, B-1180 BRUXELLES, CLVIIe année, 1991 + # (Imprimerie HAYEZ, s.p.r.l., Rue Fin, 4, 1080 BRUXELLES, MCMXC), + # pp 8-9. + # LMT before 1892 was 0:17:30, according to the official journal of Belgium: +@@ -812,7 +836,7 @@ + Rule Belgium 1946 only - Oct 7 2:00s 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Brussels 0:17:30 - LMT 1880 +- 0:17:30 - BMT 1892 May 1 12:00 # Brussels MT ++ 0:17:30 - BMT 1892 May 1 12:00 # Brussels MT + 0:00 - WET 1914 Nov 8 + 1:00 - CET 1916 May 1 0:00 + 1:00 C-Eur CE%sT 1918 Nov 11 11:00u +@@ -828,8 +852,8 @@ + # + # From Plamen Simenov via Steffen Thorsen (1999-09-09): + # A document of Government of Bulgaria (No.94/1997) says: +-# EET --> EETDST is in 03:00 Local time in last Sunday of March ... +-# EETDST --> EET is in 04:00 Local time in last Sunday of October ++# EET -> EETDST is in 03:00 Local time in last Sunday of March ... ++# EETDST -> EET is in 04:00 Local time in last Sunday of October + # + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Bulg 1979 only - Mar 31 23:00 1:00 S +@@ -842,7 +866,7 @@ + 1:56:56 - IMT 1894 Nov 30 # Istanbul MT? + 2:00 - EET 1942 Nov 2 3:00 + 1:00 C-Eur CE%sT 1945 +- 1:00 - CET 1945 Apr 2 3:00 ++ 1:00 - CET 1945 Apr 2 3:00 + 2:00 - EET 1979 Mar 31 23:00 + 2:00 Bulg EE%sT 1982 Sep 26 2:00 + 2:00 C-Eur EE%sT 1991 +@@ -866,15 +890,15 @@ + Rule Czech 1949 only - Apr 9 2:00s 1:00 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Prague 0:57:44 - LMT 1850 +- 0:57:44 - PMT 1891 Oct # Prague Mean Time +- 1:00 C-Eur CE%sT 1944 Sep 17 2:00s ++ 0:57:44 - PMT 1891 Oct # Prague Mean Time ++ 1:00 C-Eur CE%sT 1944 Sep 17 2:00s + 1:00 Czech CE%sT 1979 + 1:00 EU CE%sT + # Use Europe/Prague also for Slovakia. + + # Denmark, Faroe Islands, and Greenland + +-# From Jesper Norgaard Welen (2005-04-26): ++# From Jesper Nørgaard Welen (2005-04-26): + # http://www.hum.aau.dk/~poe/tid/tine/DanskTid.htm says that the law + # [introducing standard time] was in effect from 1894-01-01.... + # The page http://www.retsinfo.dk/_GETDOCI_/ACCN/A18930008330-REGL +@@ -884,7 +908,7 @@ + # http://www.retsinfo.dk/_GETDOCI_/ACCN/A19722110030-REGL + # + # This provoked a new law from 1974 to make possible summer time changes +-# in subsequenet decrees with the law ++# in subsequent decrees with the law + # http://www.retsinfo.dk/_GETDOCI_/ACCN/A19740022330-REGL + # + # It seems however that no decree was set forward until 1980. I have +@@ -899,7 +923,7 @@ + # was suspended on that night): + # http://www.retsinfo.dk/_GETDOCI_/ACCN/C19801120554-REGL + +-# From Jesper Norgaard Welen (2005-06-11): ++# From Jesper Nørgaard Welen (2005-06-11): + # The Herning Folkeblad (1980-09-26) reported that the night between + # Saturday and Sunday the clock is set back from three to two. + +@@ -923,11 +947,11 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Copenhagen 0:50:20 - LMT 1890 + 0:50:20 - CMT 1894 Jan 1 # Copenhagen MT +- 1:00 Denmark CE%sT 1942 Nov 2 2:00s +- 1:00 C-Eur CE%sT 1945 Apr 2 2:00 ++ 1:00 Denmark CE%sT 1942 Nov 2 2:00s ++ 1:00 C-Eur CE%sT 1945 Apr 2 2:00 + 1:00 Denmark CE%sT 1980 + 1:00 EU CE%sT +-Zone Atlantic/Faroe -0:27:04 - LMT 1908 Jan 11 # Torshavn ++Zone Atlantic/Faroe -0:27:04 - LMT 1908 Jan 11 # Tórshavn + 0:00 - WET 1981 + 0:00 EU WE%sT + # +@@ -939,11 +963,11 @@ + # From Paul Eggert (2006-03-22): + # Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01, + # and left the EU on 1985-02-01. It therefore should have been using EU +-# rules at least through 1984. Shanks & Pottenger say Scoresbysund and Godthab ++# rules at least through 1984. Shanks & Pottenger say Scoresbysund and Godthåb + # used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU + # rules since at least 1991. Assume EU rules since 1980. + +-# From Gwillin Law (2001-06-06), citing ++# From Gwillim Law (2001-06-06), citing + # <http://www.statkart.no/efs/efshefter/2001/efs5-2001.pdf> (2001-03-15), + # and with translations corrected by Steffen Thorsen: + # +@@ -978,16 +1002,16 @@ + # DPC research station at Zackenberg. + # + # Scoresbysund and two small villages nearby keep time UTC-1 and use +-# the same daylight savings time period as in West Greenland (Godthab). ++# the same daylight savings time period as in West Greenland (Godthåb). + # +-# The rest of Greenland, including Godthab (this area, although it ++# The rest of Greenland, including Godthåb (this area, although it + # includes central Greenland, is known as west Greenland), keeps time + # UTC-3, with daylight savings methods according to European rules. + # + # It is common procedure to use UTC 0 in the wilderness of East and + # North Greenland, because it is mainly Icelandic aircraft operators + # maintaining traffic in these areas. However, the official status of +-# this area is that it sticks with Godthab time. This area might be ++# this area is that it sticks with Godthåb time. This area might be + # considered a dual time zone in some respects because of this. + + # From Rives McDow (2001-11-19): +@@ -996,8 +1020,8 @@ + + # From Paul Eggert (2006-03-22): + # From 1997 on the CIA map shows Danmarkshavn on GMT; +-# the 1995 map as like Godthab. +-# For lack of better info, assume they were like Godthab before 1996. ++# the 1995 map as like Godthåb. ++# For lack of better info, assume they were like Godthåb before 1996. + # startkart.no says Thule does not observe DST, but this is clearly an error, + # so go with Shanks & Pottenger for Thule transitions until this year. + # For 2007 on assume Thule will stay in sync with US DST rules. +@@ -1012,15 +1036,15 @@ + # + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 +- -3:00 - WGT 1980 Apr 6 2:00 ++ -3:00 - WGT 1980 Apr 6 2:00 + -3:00 EU WG%sT 1996 + 0:00 - GMT + Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit +- -2:00 - CGT 1980 Apr 6 2:00 ++ -2:00 - CGT 1980 Apr 6 2:00 + -2:00 C-Eur CG%sT 1981 Mar 29 + -1:00 EU EG%sT + Zone America/Godthab -3:26:56 - LMT 1916 Jul 28 # Nuuk +- -3:00 - WGT 1980 Apr 6 2:00 ++ -3:00 - WGT 1980 Apr 6 2:00 + -3:00 EU WG%sT + Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik air base + -4:00 Thule A%sT +@@ -1042,17 +1066,16 @@ + # summer time next spring." + + # From Peter Ilieve (1998-11-04), heavily edited: +-# <a href="http://trip.rk.ee/cgi-bin/thw?${BASE}=akt&${OOHTML}=rtd&TA=1998&TO=1&AN=1390"> + # The 1998-09-22 Estonian time law +-# </a> ++# http://trip.rk.ee/cgi-bin/thw?${BASE}=akt&${OOHTML}=rtd&TA=1998&TO=1&AN=1390 + # refers to the Eighth Directive and cites the association agreement between +-# the EU and Estonia, ratified by the Estonian law (RT II 1995, 22--27, 120). ++# the EU and Estonia, ratified by the Estonian law (RT II 1995, 22-27, 120). + # + # I also asked [my relative] whether they use any standard abbreviation + # for their standard and summer times. He says no, they use "suveaeg" + # (summer time) and "talveaeg" (winter time). + +-# From <a href="http://www.baltictimes.com/">The Baltic Times</a> (1999-09-09) ++# From The Baltic Times <http://www.baltictimes.com/> (1999-09-09) + # via Steffen Thorsen: + # This year will mark the last time Estonia shifts to summer time, + # a council of the ruling coalition announced Sept. 6.... +@@ -1070,19 +1093,19 @@ + # The Estonian government has changed once again timezone politics. + # Now we are using again EU rules. + # +-# From Urmet Jaanes (2002-03-28): ++# From Urmet Jänes (2002-03-28): + # The legislative reference is Government decree No. 84 on 2002-02-21. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Tallinn 1:39:00 - LMT 1880 +- 1:39:00 - TMT 1918 Feb # Tallinn Mean Time ++ 1:39:00 - TMT 1918 Feb # Tallinn Mean Time + 1:00 C-Eur CE%sT 1919 Jul + 1:39:00 - TMT 1921 May + 2:00 - EET 1940 Aug 6 + 3:00 - MSK 1941 Sep 15 + 1:00 C-Eur CE%sT 1944 Sep 22 +- 3:00 Russia MSK/MSD 1989 Mar 26 2:00s +- 2:00 1:00 EEST 1989 Sep 24 2:00s ++ 3:00 Russia MSK/MSD 1989 Mar 26 2:00s ++ 2:00 1:00 EEST 1989 Sep 24 2:00s + 2:00 C-Eur EE%sT 1998 Sep 22 + 2:00 EU EE%sT 1999 Nov 1 + 2:00 - EET 2002 Feb 21 +@@ -1104,35 +1127,45 @@ + # This is documented in Heikki Oja: Aikakirja 2007, published by The Almanac + # Office of University of Helsinki, ISBN 952-10-3221-9, available online (in + # Finnish) at +-# +-# <a href="http://almanakka.helsinki.fi/aikakirja/Aikakirja2007kokonaan.pdf"> + # http://almanakka.helsinki.fi/aikakirja/Aikakirja2007kokonaan.pdf +-# </a> + # + # Page 105 (56 in PDF version) has a handy table of all past daylight savings + # transitions. It is easy enough to interpret without Finnish skills. + # + # This is also confirmed by Finnish Broadcasting Company's archive at: +-# +-# <a href="http://www.yle.fi/elavaarkisto/?s=s&g=1&ag=5&t=&a=3401"> + # http://www.yle.fi/elavaarkisto/?s=s&g=1&ag=5&t=&a=3401 +-# </a> + # + # The news clip from 1981 says that "the time between 2 and 3 o'clock does not + # exist tonight." + ++# From Konstantin Hyppönen (2014-06-13): ++# [Heikki Oja's book Aikakirja 2013] ++# http://almanakka.helsinki.fi/images/aikakirja/Aikakirja2013kokonaan.pdf ++# pages 104-105, including a scan from a newspaper published on Apr 2 1942 ++# say that ... [o]n Apr 2 1942, 24 o'clock (which means Apr 3 1942, ++# 00:00), clocks were moved one hour forward. The newspaper ++# mentions "on the night from Thursday to Friday".... ++# On Oct 4 1942, clocks were moved at 1:00 one hour backwards. ++# ++# From Paul Eggert (2014-06-14): ++# Go with Oja over Shanks. ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Finland 1942 only - Apr 3 0:00 1:00 S +-Rule Finland 1942 only - Oct 3 0:00 0 - ++Rule Finland 1942 only - Apr 2 24:00 1:00 S ++Rule Finland 1942 only - Oct 4 1:00 0 - + Rule Finland 1981 1982 - Mar lastSun 2:00 1:00 S + Rule Finland 1981 1982 - Sep lastSun 3:00 0 - ++ ++# Milne says Helsinki (Helsingfors) time was 1:39:49.2 (official document); ++# round to nearest. ++ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Europe/Helsinki 1:39:52 - LMT 1878 May 31 +- 1:39:52 - HMT 1921 May # Helsinki Mean Time ++Zone Europe/Helsinki 1:39:49 - LMT 1878 May 31 ++ 1:39:49 - HMT 1921 May # Helsinki Mean Time + 2:00 Finland EE%sT 1983 + 2:00 EU EE%sT + +-# Aaland Is ++# Åland Is + Link Europe/Helsinki Europe/Mariehamn + + +@@ -1140,14 +1173,14 @@ + + # From Ciro Discepolo (2000-12-20): + # +-# Henri Le Corre, Regimes Horaires pour le monde entier, Editions ++# Henri Le Corre, Régimes horaires pour le monde entier, Éditions + # Traditionnelles - Paris 2 books, 1993 + # +-# Gabriel, Traite de l'heure dans le monde, Guy Tredaniel editeur, ++# Gabriel, Traité de l'heure dans le monde, Guy Trédaniel, + # Paris, 1991 + # +-# Francoise Gauquelin, Problemes de l'heure resolus en astrologie, +-# Guy tredaniel, Paris 1987 ++# Françoise Gauquelin, Problèmes de l'heure résolus en astrologie, ++# Guy Trédaniel, Paris 1987 + + + # +@@ -1188,16 +1221,16 @@ + Rule France 1940 only - Feb 25 2:00 1:00 S + # The French rules for 1941-1944 were not used in Paris, but Shanks & Pottenger + # write that they were used in Monaco and in many French locations. +-# Le Corre writes that the upper limit of the free zone was Arneguy, Orthez, +-# Mont-de-Marsan, Bazas, Langon, Lamotte-Montravel, Marouil, La +-# Rochefoucault, Champagne-Mouton, La Roche-Posay, La Haye-Descartes, ++# Le Corre writes that the upper limit of the free zone was Arnéguy, Orthez, ++# Mont-de-Marsan, Bazas, Langon, Lamothe-Montravel, Marœuil, La ++# Rochefoucauld, Champagne-Mouton, La Roche-Posay, La Haye-Descartes, + # Loches, Montrichard, Vierzon, Bourges, Moulins, Digoin, +-# Paray-le-Monial, Montceau-les-Mines, Chalons-sur-Saone, Arbois, ++# Paray-le-Monial, Montceau-les-Mines, Chalon-sur-Saône, Arbois, + # Dole, Morez, St-Claude, and Collonges (Haute-Savoie). + Rule France 1941 only - May 5 0:00 2:00 M # Midsummer + # Shanks & Pottenger say this transition occurred at Oct 6 1:00, + # but go with Denis Excoffier (1997-12-12), +-# who quotes the Ephemerides Astronomiques for 1998 from Bureau des Longitudes ++# who quotes the Ephémérides astronomiques for 1998 from Bureau des Longitudes + # as saying 5/10/41 22hUT. + Rule France 1941 only - Oct 6 0:00 1:00 S + Rule France 1942 only - Mar 9 0:00 2:00 M +@@ -1218,7 +1251,7 @@ + # on PMT-0:09:21 until 1978-08-09, when the time base finally switched to UTC. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01 +- 0:09:21 - PMT 1911 Mar 11 0:01 # Paris MT ++ 0:09:21 - PMT 1911 Mar 11 0:01 # Paris MT + # Shanks & Pottenger give 1940 Jun 14 0:00; go with Excoffier and Le Corre. + 0:00 France WE%sT 1940 Jun 14 23:00 + # Le Corre says Paris stuck with occupied-France time after the liberation; +@@ -1235,15 +1268,13 @@ + # Bundesanstalt contains DST information back to 1916. + # [See tz-link.htm for the URL.] + +-# From Joerg Schilling (2002-10-23): ++# From Jörg Schilling (2002-10-23): + # In 1945, Berlin was switched to Moscow Summer time (GMT+4) by +-# <a href="http://www.dhm.de/lemo/html/biografien/BersarinNikolai/"> +-# General [Nikolai] Bersarin</a>. ++# http://www.dhm.de/lemo/html/biografien/BersarinNikolai/ ++# General [Nikolai] Bersarin. + + # From Paul Eggert (2003-03-08): +-# <a href="http://www.parlament-berlin.de/pds-fraktion.nsf/727459127c8b66ee8525662300459099/defc77cb784f180ac1256c2b0030274b/$FILE/bersarint.pdf"> + # http://www.parlament-berlin.de/pds-fraktion.nsf/727459127c8b66ee8525662300459099/defc77cb784f180ac1256c2b0030274b/$FILE/bersarint.pdf +-# </a> + # says that Bersarin issued an order to use Moscow time on May 20. + # However, Moscow did not observe daylight saving in 1945, so + # this was equivalent to CEMT (GMT+3), not GMT+4. +@@ -1268,23 +1299,23 @@ + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Berlin 0:53:28 - LMT 1893 Apr +- 1:00 C-Eur CE%sT 1945 May 24 2:00 ++ 1:00 C-Eur CE%sT 1945 May 24 2:00 + 1:00 SovietZone CE%sT 1946 + 1:00 Germany CE%sT 1980 + 1:00 EU CE%sT + + # From Tobias Conradi (2011-09-12): +-# Busingen <http://www.buesingen.de>, surrounded by the Swiss canton ++# Büsingen <http://www.buesingen.de>, surrounded by the Swiss canton + # Schaffhausen, did not start observing DST in 1980 as the rest of DE + # (West Germany at that time) and DD (East Germany at that time) did. + # DD merged into DE, the area is currently covered by code DE in ISO 3166-1, + # which in turn is covered by the zone Europe/Berlin. + # +-# Source for the time in Busingen 1980: ++# Source for the time in Büsingen 1980: + # http://www.srf.ch/player/video?id=c012c029-03b7-4c2b-9164-aa5902cd58d3 + + # From Arthur David Olson (2012-03-03): +-# Busingen and Zurich have shared clocks since 1970. ++# Büsingen and Zurich have shared clocks since 1970. + + Link Europe/Zurich Europe/Busingen + +@@ -1295,8 +1326,8 @@ + + # Gibraltar + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Europe/Gibraltar -0:21:24 - LMT 1880 Aug 2 0:00s +- 0:00 GB-Eire %s 1957 Apr 14 2:00 ++Zone Europe/Gibraltar -0:21:24 - LMT 1880 Aug 2 0:00s ++ 0:00 GB-Eire %s 1957 Apr 14 2:00 + 1:00 - CET 1982 + 1:00 EU CE%sT + +@@ -1327,7 +1358,7 @@ + Rule Greece 1980 only - Sep 28 0:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Athens 1:34:52 - LMT 1895 Sep 14 +- 1:34:52 - AMT 1916 Jul 28 0:01 # Athens MT ++ 1:34:52 - AMT 1916 Jul 28 0:01 # Athens MT + 2:00 Greece EE%sT 1941 Apr 30 + 1:00 Greece CE%sT 1944 Apr 4 + 2:00 Greece EE%sT 1981 +@@ -1336,15 +1367,20 @@ + 2:00 EU EE%sT + + # Hungary ++# From Paul Eggert (2014-07-15): ++# Dates for 1916-1945 are taken from: ++# Oross A. Jelen a múlt jövője: a nyári időszámítás Magyarországon 1916-1945. ++# National Archives of Hungary (2012-10-29). ++# http://mnl.gov.hu/a_het_dokumentuma/a_nyari_idoszamitas_magyarorszagon_19161945.html ++# This source does not always give times, which are taken from Shanks ++# & Pottenger (which disagree about the dates). + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Hungary 1918 only - Apr 1 3:00 1:00 S +-Rule Hungary 1918 only - Sep 29 3:00 0 - ++Rule Hungary 1918 only - Sep 16 3:00 0 - + Rule Hungary 1919 only - Apr 15 3:00 1:00 S +-Rule Hungary 1919 only - Sep 15 3:00 0 - +-Rule Hungary 1920 only - Apr 5 3:00 1:00 S +-Rule Hungary 1920 only - Sep 30 3:00 0 - ++Rule Hungary 1919 only - Nov 24 3:00 0 - + Rule Hungary 1945 only - May 1 23:00 1:00 S +-Rule Hungary 1945 only - Nov 3 0:00 0 - ++Rule Hungary 1945 only - Nov 1 0:00 0 - + Rule Hungary 1946 only - Mar 31 2:00s 1:00 S + Rule Hungary 1946 1949 - Oct Sun>=1 2:00s 0 - + Rule Hungary 1947 1949 - Apr Sun>=4 2:00s 1:00 S +@@ -1360,7 +1396,7 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Budapest 1:16:20 - LMT 1890 Oct + 1:00 C-Eur CE%sT 1918 +- 1:00 Hungary CE%sT 1941 Apr 6 2:00 ++ 1:00 Hungary CE%sT 1941 Apr 8 + 1:00 C-Eur CE%sT 1945 + 1:00 Hungary CE%sT 1980 Sep 28 2:00s + 1:00 EU CE%sT +@@ -1423,7 +1459,7 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Atlantic/Reykjavik -1:27:24 - LMT 1837 + -1:27:48 - RMT 1908 # Reykjavik Mean Time? +- -1:00 Iceland IS%sT 1968 Apr 7 1:00s ++ -1:00 Iceland IS%sT 1968 Apr 7 1:00s + 0:00 - GMT + + # Italy +@@ -1438,9 +1474,8 @@ + # From Paul Eggert (2006-03-22): + # For Italian DST we have three sources: Shanks & Pottenger, Whitman, and + # F. Pollastri +-# <a href="http://toi.iriti.cnr.it/uk/ienitlt.html"> + # Day-light Saving Time in Italy (2006-02-03) +-# </a> ++# http://toi.iriti.cnr.it/uk/ienitlt.html + # ('FP' below), taken from an Italian National Electrotechnical Institute + # publication. When the three sources disagree, guess who's right, as follows: + # +@@ -1500,8 +1535,8 @@ + Rule Italy 1979 only - Sep 30 0:00s 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Rome 0:49:56 - LMT 1866 Sep 22 +- 0:49:56 - RMT 1893 Nov 1 0:00s # Rome Mean +- 1:00 Italy CE%sT 1942 Nov 2 2:00s ++ 0:49:56 - RMT 1893 Nov 1 0:00s # Rome Mean ++ 1:00 Italy CE%sT 1942 Nov 2 2:00s + 1:00 C-Eur CE%sT 1944 Jul + 1:00 Italy CE%sT 1980 + 1:00 EU CE%sT +@@ -1548,18 +1583,18 @@ + + # From Andrei Ivanov (2000-03-06): + # This year Latvia will not switch to Daylight Savings Time (as specified in +-# <a href="http://www.lv-laiks.lv/wwwraksti/2000/071072/vd4.htm"> + # The Regulations of the Cabinet of Ministers of the Rep. of Latvia of +-# 29-Feb-2000 (#79)</a>, in Latvian for subscribers only). ++# 29-Feb-2000 (#79) <http://www.lv-laiks.lv/wwwraksti/2000/071072/vd4.htm>, ++# in Latvian for subscribers only). + +-# <a href="http://www.rferl.org/newsline/2001/01/3-CEE/cee-030101.html"> +-# From RFE/RL Newsline (2001-01-03), noted after a heads-up by Rives McDow: +-# </a> ++# From RFE/RL Newsline ++# http://www.rferl.org/newsline/2001/01/3-CEE/cee-030101.html ++# (2001-01-03), noted after a heads-up by Rives McDow: + # The Latvian government on 2 January decided that the country will + # institute daylight-saving time this spring, LETA reported. + # Last February the three Baltic states decided not to turn back their + # clocks one hour in the spring.... +-# Minister of Economy Aigars Kalvitis noted that Latvia had too few ++# Minister of Economy Aigars Kalvītis noted that Latvia had too few + # daylight hours and thus decided to comply with a draft European + # Commission directive that provides for instituting daylight-saving + # time in EU countries between 2002 and 2006. The Latvian government +@@ -1569,18 +1604,23 @@ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Latvia 1989 1996 - Mar lastSun 2:00s 1:00 S + Rule Latvia 1989 1996 - Sep lastSun 2:00s 0 - ++ ++# Milne 1899 says Riga was 1:36:28 (Polytechnique House time). ++# Byalokoz 1919 says Latvia was 1:36:34. ++# Go with Byalokoz. ++ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Europe/Riga 1:36:24 - LMT 1880 +- 1:36:24 - RMT 1918 Apr 15 2:00 #Riga Mean Time +- 1:36:24 1:00 LST 1918 Sep 16 3:00 #Latvian Summer +- 1:36:24 - RMT 1919 Apr 1 2:00 +- 1:36:24 1:00 LST 1919 May 22 3:00 +- 1:36:24 - RMT 1926 May 11 ++Zone Europe/Riga 1:36:34 - LMT 1880 ++ 1:36:34 - RMT 1918 Apr 15 2:00 # Riga MT ++ 1:36:34 1:00 LST 1918 Sep 16 3:00 # Latvian ST ++ 1:36:34 - RMT 1919 Apr 1 2:00 ++ 1:36:34 1:00 LST 1919 May 22 3:00 ++ 1:36:34 - RMT 1926 May 11 + 2:00 - EET 1940 Aug 5 + 3:00 - MSK 1941 Jul + 1:00 C-Eur CE%sT 1944 Oct 13 +- 3:00 Russia MSK/MSD 1989 Mar lastSun 2:00s +- 2:00 1:00 EEST 1989 Sep lastSun 2:00s ++ 3:00 Russia MSK/MSD 1989 Mar lastSun 2:00s ++ 2:00 1:00 EEST 1989 Sep lastSun 2:00s + 2:00 Latvia EE%sT 1997 Jan 21 + 2:00 EU EE%sT 2000 Feb 29 + 2:00 - EET 2001 Jan 2 +@@ -1614,7 +1654,7 @@ + # I would like to inform that in this year Lithuanian time zone + # (Europe/Vilnius) was changed. + +-# From <a href="http://www.elta.lt/">ELTA</a> No. 972 (2582) (1999-09-29), ++# From ELTA No. 972 (2582) (1999-09-29) <http://www.elta.lt/>, + # via Steffen Thorsen: + # Lithuania has shifted back to the second time zone (GMT plus two hours) + # to be valid here starting from October 31, +@@ -1623,9 +1663,9 @@ + # motion to give up shifting to summer time in spring, as it was + # already done by Estonia. + +-# From the <a href="http://www.tourism.lt/informa/ff.htm"> +-# Fact File, Lithuanian State Department of Tourism +-# </a> (2000-03-27): Local time is GMT+2 hours ..., no daylight saving. ++# From the Fact File, Lithuanian State Department of Tourism ++# <http://www.tourism.lt/informa/ff.htm> (2000-03-27): ++# Local time is GMT+2 hours ..., no daylight saving. + + # From a user via Klaus Marten (2003-02-07): + # As a candidate for membership of the European Union, Lithuania will +@@ -1638,18 +1678,18 @@ + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Vilnius 1:41:16 - LMT 1880 +- 1:24:00 - WMT 1917 # Warsaw Mean Time ++ 1:24:00 - WMT 1917 # Warsaw Mean Time + 1:35:36 - KMT 1919 Oct 10 # Kaunas Mean Time + 1:00 - CET 1920 Jul 12 + 2:00 - EET 1920 Oct 9 + 1:00 - CET 1940 Aug 3 + 3:00 - MSK 1941 Jun 24 + 1:00 C-Eur CE%sT 1944 Aug +- 3:00 Russia MSK/MSD 1991 Mar 31 2:00s +- 2:00 1:00 EEST 1991 Sep 29 2:00s ++ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s ++ 2:00 1:00 EEST 1991 Sep 29 2:00s + 2:00 C-Eur EE%sT 1998 +- 2:00 - EET 1998 Mar 29 1:00u +- 1:00 EU CE%sT 1999 Oct 31 1:00u ++ 2:00 - EET 1998 Mar 29 1:00u ++ 1:00 EU CE%sT 1999 Oct 31 1:00u + 2:00 - EET 2003 Jan 1 + 2:00 EU EE%sT + +@@ -1683,9 +1723,9 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Luxembourg 0:24:36 - LMT 1904 Jun + 1:00 Lux CE%sT 1918 Nov 25 +- 0:00 Lux WE%sT 1929 Oct 6 2:00s +- 0:00 Belgium WE%sT 1940 May 14 3:00 +- 1:00 C-Eur WE%sT 1944 Sep 18 3:00 ++ 0:00 Lux WE%sT 1929 Oct 6 2:00s ++ 0:00 Belgium WE%sT 1940 May 14 3:00 ++ 1:00 C-Eur WE%sT 1944 Sep 18 3:00 + 1:00 Belgium CE%sT 1977 + 1:00 EU CE%sT + +@@ -1702,9 +1742,9 @@ + Rule Malta 1975 1980 - Sep Sun>=15 2:00 0 - + Rule Malta 1980 only - Mar 31 2:00 1:00 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 0:00s # Valletta +- 1:00 Italy CE%sT 1942 Nov 2 2:00s +- 1:00 C-Eur CE%sT 1945 Apr 2 2:00s ++Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 0:00s # Valletta ++ 1:00 Italy CE%sT 1942 Nov 2 2:00s ++ 1:00 C-Eur CE%sT 1945 Apr 2 2:00s + 1:00 Italy CE%sT 1973 Mar 31 + 1:00 Malta CE%sT 1981 + 1:00 EU CE%sT +@@ -1719,7 +1759,7 @@ + # In early 1992 there was large-scale interethnic violence in the area + # and it's possible that some Russophones continued to observe Moscow time. + # But [two people] separately reported via +-# Jesper Norgaard that as of 2001-01-24 Tiraspol was like Chisinau. ++# Jesper Nørgaard that as of 2001-01-24 Tiraspol was like Chisinau. + # The Tiraspol entry has therefore been removed for now. + # + # From Alexander Krivenyshev (2011-10-17): +@@ -1728,13 +1768,8 @@ + # to the Winter Time). + # + # News (in Russian): +-# <a href="http://www.kyivpost.ua/russia/news/pridnestrove-otkazalos-ot-perehoda-na-zimnee-vremya-30954.html"> + # http://www.kyivpost.ua/russia/news/pridnestrove-otkazalos-ot-perehoda-na-zimnee-vremya-30954.html +-# </a> +-# +-# <a href="http://www.allmoldova.com/moldova-news/1249064116.html"> + # http://www.allmoldova.com/moldova-news/1249064116.html +-# </a> + # + # The substance of this change (reinstatement of the Tiraspol entry) + # is from a patch from Petr Machata (2011-10-17) +@@ -1752,9 +1787,7 @@ + # Following Moldova and neighboring Ukraine- Transnistria (Pridnestrovie)- + # Tiraspol will go back to winter time on October 30, 2011. + # News from Moldova (in russian): +-# <a href="http://ru.publika.md/link_317061.html"> + # http://ru.publika.md/link_317061.html +-# </a> + + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +@@ -1777,8 +1810,8 @@ + # more precise 0:09:21. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Monaco 0:29:32 - LMT 1891 Mar 15 +- 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time +- 0:00 France WE%sT 1945 Sep 16 3:00 ++ 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time ++ 0:00 France WE%sT 1945 Sep 16 3:00 + 1:00 France CE%sT 1977 + 1:00 EU CE%sT + +@@ -1822,8 +1855,8 @@ + # was not until 1866 when they were all required by law to observe + # Amsterdam mean time. + +-# The data before 1945 are taken from +-# <http://www.phys.uu.nl/~vgent/wettijd/wettijd.htm>. ++# The data entries before 1945 are taken from ++# http://www.phys.uu.nl/~vgent/wettijd/wettijd.htm + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Neth 1916 only - May 1 0:00 1:00 NST # Netherlands Summer Time +@@ -1854,8 +1887,8 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Amsterdam 0:19:32 - LMT 1835 + 0:19:32 Neth %s 1937 Jul 1 +- 0:20 Neth NE%sT 1940 May 16 0:00 # Dutch Time +- 1:00 C-Eur CE%sT 1945 Apr 2 2:00 ++ 0:20 Neth NE%sT 1940 May 16 0:00 # Dutch Time ++ 1:00 C-Eur CE%sT 1945 Apr 2 2:00 + 1:00 Neth CE%sT 1977 + 1:00 EU CE%sT + +@@ -1885,14 +1918,14 @@ + # time they were declared as parts of Norway. Svalbard was declared + # as a part of Norway by law of 1925-07-17 no 11, section 4 and Jan + # Mayen by law of 1930-02-27 no 2, section 2. (From +-# http://www.lovdata.no/all/nl-19250717-011.html and +-# http://www.lovdata.no/all/nl-19300227-002.html). The law/regulation ++# <http://www.lovdata.no/all/nl-19250717-011.html> and ++# <http://www.lovdata.no/all/nl-19300227-002.html>). The law/regulation + # for normal/standard time in Norway is from 1894-06-29 no 1 (came + # into operation on 1895-01-01) and Svalbard/Jan Mayen seem to be a + # part of this law since 1925/1930. (From +-# http://www.lovdata.no/all/nl-18940629-001.html ) I have not been ++# <http://www.lovdata.no/all/nl-18940629-001.html>) I have not been + # able to find if Jan Mayen used a different time zone (e.g. -0100) +-# before 1930. Jan Mayen has only been "inhabitated" since 1921 by ++# before 1930. Jan Mayen has only been "inhabited" since 1921 by + # Norwegian meteorologists and maybe used the same time as Norway ever + # since 1921. Svalbard (Arctic/Longyearbyen) has been inhabited since + # before 1895, and therefore probably changed the local time somewhere +@@ -1907,7 +1940,7 @@ + # <http://home.no.net/janmayen/history.htm> says that the meteorologists + # burned down their station in 1940 and left the island, but returned in + # 1941 with a small Norwegian garrison and continued operations despite +-# frequent air ttacks from Germans. In 1943 the Americans established a ++# frequent air attacks from Germans. In 1943 the Americans established a + # radiolocating station on the island, called "Atlantic City". Possibly + # the UT offset changed during the war, but I think it unlikely that + # Jan Mayen used German daylight-saving rules. +@@ -1918,7 +1951,7 @@ + # <http://www.svalbard.com/SvalbardFAQ.html> says that the Germans were + # expelled on 1942-05-14. However, small parties of Germans did return, + # and according to Wilhelm Dege's book "War North of 80" (1954) +-# <http://www.ucalgary.ca/UofC/departments/UP/1-55238/1-55238-110-2.html> ++# http://www.ucalgary.ca/UofC/departments/UP/1-55238/1-55238-110-2.html + # the German armed forces at the Svalbard weather station code-named + # Haudegen did not surrender to the Allies until September 1945. + # +@@ -1927,6 +1960,10 @@ + Link Europe/Oslo Arctic/Longyearbyen + + # Poland ++ ++# The 1919 dates and times can be found in Tygodnik Urzędowy nr 1 (1919-03-20), ++# <http://www.wbc.poznan.pl/publication/32156> pp 1-2. ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Poland 1918 1919 - Sep 16 2:00s 0 - + Rule Poland 1919 only - Apr 15 2:00s 1:00 S +@@ -1937,9 +1974,9 @@ + Rule Poland 1945 only - Apr 29 0:00 1:00 S + Rule Poland 1945 only - Nov 1 0:00 0 - + # For 1946 on the source is Kazimierz Borkowski, +-# Torun Center for Astronomy, Dept. of Radio Astronomy, Nicolaus Copernicus U., +-# <http://www.astro.uni.torun.pl/~kb/Artykuly/U-PA/Czas2.htm#tth_tAb1> +-# Thanks to Przemyslaw Augustyniak (2005-05-28) for this reference. ++# Toruń Center for Astronomy, Dept. of Radio Astronomy, Nicolaus Copernicus U., ++# http://www.astro.uni.torun.pl/~kb/Artykuly/U-PA/Czas2.htm#tth_tAb1 ++# Thanks to Przemysław Augustyniak (2005-05-28) for this reference. + # He also gives these further references: + # Mon Pol nr 13, poz 162 (1995) <http://www.abc.com.pl/serwis/mp/1995/0162.htm> + # Druk nr 2180 (2003) <http://www.senat.gov.pl/k5/dok/sejm/053/2180.pdf> +@@ -1959,10 +1996,10 @@ + Rule Poland 1962 1964 - Sep lastSun 1:00s 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Warsaw 1:24:00 - LMT 1880 +- 1:24:00 - WMT 1915 Aug 5 # Warsaw Mean Time +- 1:00 C-Eur CE%sT 1918 Sep 16 3:00 ++ 1:24:00 - WMT 1915 Aug 5 # Warsaw Mean Time ++ 1:00 C-Eur CE%sT 1918 Sep 16 3:00 + 2:00 Poland EE%sT 1922 Jun +- 1:00 Poland CE%sT 1940 Jun 23 2:00 ++ 1:00 Poland CE%sT 1940 Jun 23 2:00 + 1:00 C-Eur CE%sT 1944 Oct + 1:00 Poland CE%sT 1977 + 1:00 W-Eur CE%sT 1988 +@@ -1970,6 +2007,14 @@ + + # Portugal + # ++# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne: ++# According to a Portuguese decree (1911-05-26) ++# http://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf ++# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00. ++# Round the old offset to -0:36:45. This agrees with Willett but disagrees ++# with Shanks, who says the transition occurred on 1911-05-24 at 00:00 for ++# Europe/Lisbon, Atlantic/Azores, and Atlantic/Madeira. ++# + # From Rui Pedro Salgueiro (1992-11-12): + # Portugal has recently (September, 27) changed timezone + # (from WET to MET or CET) to harmonize with EEC. +@@ -2049,35 +2094,34 @@ + Rule Port 1980 only - Mar lastSun 0:00s 1:00 S + Rule Port 1981 1982 - Mar lastSun 1:00s 1:00 S + Rule Port 1983 only - Mar lastSun 2:00s 1:00 S ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-# Shanks & Pottenger say the transition from LMT to WET occurred 1911-05-24; +-# Willett says 1912-01-01. Go with Willett. +-Zone Europe/Lisbon -0:36:32 - LMT 1884 +- -0:36:32 - LMT 1912 Jan 1 # Lisbon Mean Time +- 0:00 Port WE%sT 1966 Apr 3 2:00 +- 1:00 - CET 1976 Sep 26 1:00 +- 0:00 Port WE%sT 1983 Sep 25 1:00s +- 0:00 W-Eur WE%sT 1992 Sep 27 1:00s +- 1:00 EU CE%sT 1996 Mar 31 1:00u ++Zone Europe/Lisbon -0:36:45 - LMT 1884 ++ -0:36:45 - LMT 1912 Jan 1 # Lisbon Mean Time ++ 0:00 Port WE%sT 1966 Apr 3 2:00 ++ 1:00 - CET 1976 Sep 26 1:00 ++ 0:00 Port WE%sT 1983 Sep 25 1:00s ++ 0:00 W-Eur WE%sT 1992 Sep 27 1:00s ++ 1:00 EU CE%sT 1996 Mar 31 1:00u + 0:00 EU WE%sT +-Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada +- -1:54:32 - HMT 1911 May 24 # Horta Mean Time +- -2:00 Port AZO%sT 1966 Apr 3 2:00 # Azores Time +- -1:00 Port AZO%sT 1983 Sep 25 1:00s +- -1:00 W-Eur AZO%sT 1992 Sep 27 1:00s +- 0:00 EU WE%sT 1993 Mar 28 1:00u ++Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada ++ -1:54:32 - HMT 1912 Jan 1 # Horta Mean Time ++ -2:00 Port AZO%sT 1966 Apr 3 2:00 # Azores Time ++ -1:00 Port AZO%sT 1983 Sep 25 1:00s ++ -1:00 W-Eur AZO%sT 1992 Sep 27 1:00s ++ 0:00 EU WE%sT 1993 Mar 28 1:00u + -1:00 EU AZO%sT +-Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal +- -1:07:36 - FMT 1911 May 24 # Funchal Mean Time +- -1:00 Port MAD%sT 1966 Apr 3 2:00 # Madeira Time +- 0:00 Port WE%sT 1983 Sep 25 1:00s ++Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal ++ -1:07:36 - FMT 1912 Jan 1 # Funchal Mean Time ++ -1:00 Port MAD%sT 1966 Apr 3 2:00 # Madeira Time ++ 0:00 Port WE%sT 1983 Sep 25 1:00s + 0:00 EU WE%sT + + # Romania + # + # From Paul Eggert (1999-10-07): +-# <a href="http://www.nineoclock.ro/POL/1778pol.html"> +-# Nine O'clock</a> (1998-10-23) reports that the switch occurred at ++# Nine O'clock <http://www.nineoclock.ro/POL/1778pol.html> ++# (1998-10-23) reports that the switch occurred at + # 04:00 local time in fall 1998. For lack of better info, + # assume that Romania and Moldova switched to EU rules in 1997, + # the same year as Bulgaria. +@@ -2094,32 +2138,28 @@ + Rule Romania 1991 1993 - Sep lastSun 0:00s 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Bucharest 1:44:24 - LMT 1891 Oct +- 1:44:24 - BMT 1931 Jul 24 # Bucharest MT +- 2:00 Romania EE%sT 1981 Mar 29 2:00s ++ 1:44:24 - BMT 1931 Jul 24 # Bucharest MT ++ 2:00 Romania EE%sT 1981 Mar 29 2:00s + 2:00 C-Eur EE%sT 1991 + 2:00 Romania EE%sT 1994 + 2:00 E-Eur EE%sT 1997 + 2:00 EU EE%sT + ++ + # Russia + + # From Alexander Krivenyshev (2011-09-15): + # Based on last Russian Government Decree # 725 on August 31, 2011 + # (Government document +-# <a href="http://www.government.ru/gov/results/16355/print/"> + # http://www.government.ru/gov/results/16355/print/ +-# </a> + # in Russian) + # there are few corrections have to be made for some Russian time zones... + # All updated Russian Time Zones were placed in table and translated to English + # by WorldTimeZone.com at the link below: +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_russia36.htm"> + # http://www.worldtimezone.com/dst_news/dst_news_russia36.htm +-# </a> + + # From Sanjeev Gupta (2011-09-27): + # Scans of [Decree #23 of January 8, 1992] are available at: +-# <a href="http://government.consultant.ru/page.aspx?1223966"> + # http://government.consultant.ru/page.aspx?1223966 + # They are in Cyrillic letters (presumably Russian). + +@@ -2128,16 +2168,12 @@ + # changed in September 2011: + # + # One source is +-# < a href="http://government.ru/gov/results/16355/> + # http://government.ru/gov/results/16355/ +-# </a> + # which, according to translate.google.com, begins "Decree of August 31, + # 2011 No 725" and contains no other dates or "effective date" information. + # + # Another source is +-# <a href="http://www.rg.ru/2011/09/06/chas-zona-dok.html"> + # http://www.rg.ru/2011/09/06/chas-zona-dok.html +-# </a> + # which, according to translate.google.com, begins "Resolution of the + # Government of the Russian Federation on August 31, 2011 N 725" and also + # contains "Date first official publication: September 6, 2011 Posted on: +@@ -2145,28 +2181,45 @@ + # does not contain any "effective date" information. + # + # Another source is +-# <a href="http://en.wikipedia.org/wiki/Oymyakonsky_District#cite_note-RuTime-7"> + # http://en.wikipedia.org/wiki/Oymyakonsky_District#cite_note-RuTime-7 +-# </a> + # which, in note 8, contains "Resolution #725 of August 31, 2011... + # Effective as of after 7 days following the day of the official publication" + # but which does not contain any reference to September 6, 2011. + # + # The Wikipedia article refers to +-# <a href="http://base.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=118896"> + # http://base.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=118896 +-# </a> + # which seems to copy the text of the government.ru page. + # + # Tobias Conradi combines Wikipedia's + # "as of after 7 days following the day of the official publication" +-# with www.rg.ru's "Date of first official publication: September 6, 2011" to get +-# September 13, 2011 as the cutover date (unusually, a Tuesday, as Tobias Conradi notes). ++# with www.rg.ru's "Date of first official publication: September 6, 2011" to ++# get September 13, 2011 as the cutover date (unusually, a Tuesday, as Tobias ++# Conradi notes). + # + # None of the sources indicates a time of day for changing clocks. + # + # Go with 2011-09-13 0:00s. + ++# From Alexander Krivenyshev (2014-07-01): ++# According to the Russian news (ITAR-TASS News Agency) ++# http://en.itar-tass.com/russia/738562 ++# the State Duma has approved ... the draft bill on returning to ++# winter time standard and return Russia 11 time zones. The new ++# regulations will come into effect on October 26, 2014 at 02:00 ... ++# http://asozd2.duma.gov.ru/main.nsf/%28Spravka%29?OpenAgent&RN=431985-6&02 ++# Here is a link where we put together table (based on approved Bill N ++# 431985-6) with proposed 11 Russian time zones and corresponding ++# areas/cities/administrative centers in the Russian Federation (in English): ++# http://www.worldtimezone.com/dst_news/dst_news_russia65.html ++# ++# From Alexander Krivenyshev (2014-07-22): ++# Putin signed the Federal Law 431985-6 ... (in Russian) ++# http://itar-tass.com/obschestvo/1333711 ++# http://www.pravo.gov.ru:8080/page.aspx?111660 ++# http://www.kremlin.ru/acts/46279 ++# From October 26, 2014 the new Russian time zone map will looks like this: ++# http://www.worldtimezone.com/dst_news/dst_news_russia-map-2014-07.html ++ + # From Paul Eggert (2006-03-22): + # Except for Moscow after 1919-07-01, I invented the time zone abbreviations. + # Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991, +@@ -2193,9 +2246,9 @@ + # + # For Grozny, Chechnya, we have the following story from + # John Daniszewski, "Scavengers in the Rubble", Los Angeles Times (2001-02-07): +-# News--often false--is spread by word of mouth. A rumor that it was ++# News - often false - is spread by word of mouth. A rumor that it was + # time to move the clocks back put this whole city out of sync with +-# the rest of Russia for two weeks--even soldiers stationed here began ++# the rest of Russia for two weeks - even soldiers stationed here began + # enforcing curfew at the wrong time. + # + # From Gwillim Law (2001-06-05): +@@ -2206,107 +2259,265 @@ + # since September 1997.... Although the Kuril Islands are + # administratively part of Sakhalin oblast', they appear to have + # remained on UTC+11 along with Magadan. +-# ++ ++# From Tim Parenti (2014-07-06): ++# The comments detailing the coverage of each Russian zone are meant to assist ++# with maintenance only and represent our best guesses as to which regions ++# are covered by each zone. They are not meant to be taken as an authoritative ++# listing. The region codes listed come from ++# http://en.wikipedia.org/w/?title=Federal_subjects_of_Russia&oldid=611810498 ++# and are used for convenience only; no guarantees are made regarding their ++# future stability. ISO 3166-2:RU codes are also listed for first-level ++# divisions where available. ++ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-# +-# Kaliningradskaya oblast'. ++ ++ ++# From Tim Parenti (2014-07-03): ++# Europe/Kaliningrad covers... ++# 39 RU-KGD Kaliningrad Oblast ++ + Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr + 1:00 C-Eur CE%sT 1945 + 2:00 Poland CE%sT 1946 +- 3:00 Russia MSK/MSD 1991 Mar 31 2:00s +- 2:00 Russia EE%sT 2011 Mar 27 2:00s +- 3:00 - FET # Further-eastern European Time ++ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s ++ 2:00 Russia EE%sT 2011 Mar 27 2:00s ++ 3:00 - FET 2014 Oct 26 2:00s ++ 2:00 - EET ++ ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Europe/Moscow covers... ++# 01 RU-AD Adygea, Republic of ++# 05 RU-DA Dagestan, Republic of ++# 06 RU-IN Ingushetia, Republic of ++# 07 RU-KB Kabardino-Balkar Republic ++# 08 RU-KL Kalmykia, Republic of ++# 09 RU-KC Karachay-Cherkess Republic ++# 10 RU-KR Karelia, Republic of ++# 11 RU-KO Komi Republic ++# 12 RU-ME Mari El Republic ++# 13 RU-MO Mordovia, Republic of ++# 15 RU-SE North Ossetia-Alania, Republic of ++# 16 RU-TA Tatarstan, Republic of ++# 20 RU-CE Chechen Republic ++# 21 RU-CU Chuvash Republic ++# 23 RU-KDA Krasnodar Krai ++# 26 RU-STA Stavropol Krai ++# 29 RU-ARK Arkhangelsk Oblast ++# 31 RU-BEL Belgorod Oblast ++# 32 RU-BRY Bryansk Oblast ++# 33 RU-VLA Vladimir Oblast ++# 35 RU-VLG Vologda Oblast ++# 36 RU-VOR Voronezh Oblast ++# 37 RU-IVA Ivanovo Oblast ++# 40 RU-KLU Kaluga Oblast ++# 44 RU-KOS Kostroma Oblast ++# 46 RU-KRS Kursk Oblast ++# 47 RU-LEN Leningrad Oblast ++# 48 RU-LIP Lipetsk Oblast ++# 50 RU-MOS Moscow Oblast ++# 51 RU-MUR Murmansk Oblast ++# 52 RU-NIZ Nizhny Novgorod Oblast ++# 53 RU-NGR Novgorod Oblast ++# 57 RU-ORL Oryol Oblast ++# 58 RU-PNZ Penza Oblast ++# 60 RU-PSK Pskov Oblast ++# 61 RU-ROS Rostov Oblast ++# 62 RU-RYA Ryazan Oblast ++# 67 RU-SMO Smolensk Oblast ++# 68 RU-TAM Tambov Oblast ++# 69 RU-TVE Tver Oblast ++# 71 RU-TUL Tula Oblast ++# 73 RU-ULY Ulyanovsk Oblast ++# 76 RU-YAR Yaroslavl Oblast ++# 77 RU-MOW Moscow ++# 78 RU-SPE Saint Petersburg ++# 83 RU-NEN Nenets Autonomous Okrug ++ ++# From Vladimir Karpinsky (2014-07-08): ++# LMT in Moscow (before Jul 3, 1916) is 2:30:17, that was defined by Moscow ++# Observatory (coordinates: 55 deg. 45'29.70", 37 deg. 34'05.30").... ++# LMT in Moscow since Jul 3, 1916 is 2:31:01 as a result of new standard. ++# (The info is from the book by Byalokoz ... p. 18.) ++# The time in St. Petersburg as capital of Russia was defined by ++# Pulkov observatory, near St. Petersburg. In 1916 LMT Moscow ++# was synchronized with LMT St. Petersburg (+30 minutes), (Pulkov observatory ++# coordinates: 59 deg. 46'18.70", 30 deg. 19'40.70") so 30 deg. 19'40.70" > ++# 2h01m18.7s = 2:01:19. LMT Moscow = LMT St.Petersburg + 30m 2:01:19 + 0:30 = ++# 2:31:19 ... + # +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Respublika Adygeya, Arkhangel'skaya oblast', +-# Belgorodskaya oblast', Bryanskaya oblast', Vladimirskaya oblast', +-# Vologodskaya oblast', Voronezhskaya oblast', +-# Respublika Dagestan, Ivanovskaya oblast', Respublika Ingushetiya, +-# Kabarbino-Balkarskaya Respublika, Respublika Kalmykiya, +-# Kalyzhskaya oblast', Respublika Karachaevo-Cherkessiya, +-# Respublika Kareliya, Respublika Komi, +-# Kostromskaya oblast', Krasnodarskij kraj, Kurskaya oblast', +-# Leningradskaya oblast', Lipetskaya oblast', Respublika Marij El, +-# Respublika Mordoviya, Moskva, Moskovskaya oblast', +-# Murmanskaya oblast', Nenetskij avtonomnyj okrug, +-# Nizhegorodskaya oblast', Novgorodskaya oblast', Orlovskaya oblast', +-# Penzenskaya oblast', Pskovskaya oblast', Rostovskaya oblast', +-# Ryazanskaya oblast', Sankt-Peterburg, +-# Respublika Severnaya Osetiya, Smolenskaya oblast', +-# Stavropol'skij kraj, Tambovskaya oblast', Respublika Tatarstan, +-# Tverskaya oblast', Tyl'skaya oblast', Ul'yanovskaya oblast', +-# Chechenskaya Respublika, Chuvashskaya oblast', +-# Yaroslavskaya oblast' +-Zone Europe/Moscow 2:30:20 - LMT 1880 +- 2:30 - MMT 1916 Jul 3 # Moscow Mean Time +- 2:30:48 Russia %s 1919 Jul 1 2:00 ++# From Paul Eggert (2014-07-08): ++# Milne does not list Moscow, but suggests that its time might be listed in ++# Résumés mensuels et annuels des observations météorologiques (1895). ++# Presumably this is OCLC 85825704, a journal published with parallel text in ++# Russian and French. This source has not been located; go with Karpinsky. ++ ++Zone Europe/Moscow 2:30:17 - LMT 1880 ++ 2:30:17 - MMT 1916 Jul 3 # Moscow Mean Time ++ 2:31:19 Russia %s 1919 Jul 1 2:00 ++ 3:00 Russia %s 1921 Oct + 3:00 Russia MSK/MSD 1922 Oct + 2:00 - EET 1930 Jun 21 +- 3:00 Russia MSK/MSD 1991 Mar 31 2:00s +- 2:00 Russia EE%sT 1992 Jan 19 2:00s +- 3:00 Russia MSK/MSD 2011 Mar 27 2:00s +- 4:00 - MSK ++ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s ++ 2:00 Russia EE%sT 1992 Jan 19 2:00s ++ 3:00 Russia MSK/MSD 2011 Mar 27 2:00s ++ 4:00 - MSK 2014 Oct 26 2:00s ++ 3:00 - MSK ++ ++ ++# From Tim Parenti (2014-07-03): ++# Europe/Simferopol covers... ++# ** **** Crimea, Republic of ++# ** **** Sevastopol ++ ++Zone Europe/Simferopol 2:16:24 - LMT 1880 ++ 2:16 - SMT 1924 May 2 # Simferopol Mean T ++ 2:00 - EET 1930 Jun 21 ++ 3:00 - MSK 1941 Nov ++ 1:00 C-Eur CE%sT 1944 Apr 13 ++ 3:00 Russia MSK/MSD 1990 ++ 3:00 - MSK 1990 Jul 1 2:00 ++ 2:00 - EET 1992 ++# Central Crimea used Moscow time 1994/1997. + # +-# Astrakhanskaya oblast', Kirovskaya oblast', Saratovskaya oblast', +-# Volgogradskaya oblast'. Shanks & Pottenger say Kirov is still at +0400 +-# but Wikipedia (2006-05-09) says +0300. Perhaps it switched after the +-# others? But we have no data. ++# From Paul Eggert (2006-03-22): ++# The _Economist_ (1994-05-28, p 45) reports that central Crimea switched ++# from Kiev to Moscow time sometime after the January 1994 elections. ++# Shanks (1999) says "date of change uncertain", but implies that it happened ++# sometime between the 1994 DST switches. Shanks & Pottenger simply say ++# 1994-09-25 03:00, but that can't be right. For now, guess it ++# changed in May. ++ 2:00 E-Eur EE%sT 1994 May ++# From IATA SSIM (1994/1997), which also says that Kerch is still like Kiev. ++ 3:00 E-Eur MSK/MSD 1996 Mar 31 3:00s ++ 3:00 1:00 MSD 1996 Oct 27 3:00s ++# IATA SSIM (1997-09) says Crimea switched to EET/EEST. ++# Assume it happened in March by not changing the clocks. ++ 3:00 Russia MSK/MSD 1997 ++ 3:00 - MSK 1997 Mar lastSun 1:00u ++# From Alexander Krivenyshev (2014-03-17): ++# time change at 2:00 (2am) on March 30, 2014 ++# http://vz.ru/news/2014/3/17/677464.html ++# From Paul Eggert (2014-03-30): ++# Simferopol and Sevastopol reportedly changed their central town clocks ++# late the previous day, but this appears to have been ceremonial ++# and the discrepancies are small enough to not worry about. ++ 2:00 EU EE%sT 2014 Mar 30 2:00 ++ 4:00 - MSK 2014 Oct 26 2:00s ++ 3:00 - MSK ++ ++ ++# From Tim Parenti (2014-07-03): ++# Europe/Volgograd covers... ++# 30 RU-AST Astrakhan Oblast ++# 34 RU-VGG Volgograd Oblast ++# 43 RU-KIR Kirov Oblast ++# 64 RU-SAR Saratov Oblast ++ ++# From Paul Eggert (2006-05-09): ++# Shanks & Pottenger say Kirov is still at +0400 but Wikipedia says +0300. ++# Perhaps it switched after the others? But we have no data. ++ + Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3 + 3:00 - TSAT 1925 Apr 6 # Tsaritsyn Time + 3:00 - STAT 1930 Jun 21 # Stalingrad Time + 4:00 - STAT 1961 Nov 11 +- 4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T +- 3:00 Russia VOL%sT 1991 Mar 31 2:00s +- 4:00 - VOLT 1992 Mar 29 2:00s +- 3:00 Russia VOL%sT 2011 Mar 27 2:00s +- 4:00 - VOLT +-# +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Samarskaya oblast', Udmyrtskaya respublika +-Zone Europe/Samara 3:20:36 - LMT 1919 Jul 1 2:00 ++ 4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T ++ 3:00 Russia VOL%sT 1991 Mar 31 2:00s ++ 4:00 - VOLT 1992 Mar 29 2:00s ++ 3:00 Russia MSK 2011 Mar 27 2:00s ++ 4:00 - MSK 2014 Oct 26 2:00s ++ 3:00 - MSK ++ ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Europe/Samara covers... ++# 18 RU-UD Udmurt Republic ++# 63 RU-SAM Samara Oblast ++ ++# Byalokoz 1919 says Samara was 3:20:20. ++ ++Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 2:00 + 3:00 - SAMT 1930 Jun 21 + 4:00 - SAMT 1935 Jan 27 +- 4:00 Russia KUY%sT 1989 Mar 26 2:00s # Kuybyshev +- 3:00 Russia KUY%sT 1991 Mar 31 2:00s +- 2:00 Russia KUY%sT 1991 Sep 29 2:00s +- 3:00 - KUYT 1991 Oct 20 3:00 +- 4:00 Russia SAM%sT 2010 Mar 28 2:00s # Samara Time +- 3:00 Russia SAM%sT 2011 Mar 27 2:00s ++ 4:00 Russia KUY%sT 1989 Mar 26 2:00s # Kuybyshev ++ 3:00 Russia MSK/MSD 1991 Mar 31 2:00s ++ 2:00 Russia EE%sT 1991 Sep 29 2:00s ++ 3:00 - KUYT 1991 Oct 20 3:00 ++ 4:00 Russia SAM%sT 2010 Mar 28 2:00s # Samara Time ++ 3:00 Russia SAM%sT 2011 Mar 27 2:00s + 4:00 - SAMT + ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Asia/Yekaterinburg covers... ++# 02 RU-BA Bashkortostan, Republic of ++# 90 RU-PER Perm Krai ++# 45 RU-KGN Kurgan Oblast ++# 56 RU-ORE Orenburg Oblast ++# 66 RU-SVE Sverdlovsk Oblast ++# 72 RU-TYU Tyumen Oblast ++# 74 RU-CHE Chelyabinsk Oblast ++# 86 RU-KHM Khanty-Mansi Autonomous Okrug - Yugra ++# 89 RU-YAN Yamalo-Nenets Autonomous Okrug + # +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Respublika Bashkortostan, Komi-Permyatskij avtonomnyj okrug, +-# Kurganskaya oblast', Orenburgskaya oblast', Permskaya oblast', +-# Sverdlovskaya oblast', Tyumenskaya oblast', +-# Khanty-Manskijskij avtonomnyj okrug, Chelyabinskaya oblast', +-# Yamalo-Nenetskij avtonomnyj okrug. +-Zone Asia/Yekaterinburg 4:02:24 - LMT 1919 Jul 15 4:00 ++# Note: Effective 2005-12-01, (59) Perm Oblast and (81) Komi-Permyak ++# Autonomous Okrug merged to form (90, RU-PER) Perm Krai. ++ ++# Milne says Yekaterinburg was 4:02:32.9; round to nearest. ++# Byalokoz 1919 says its provincial time was based on Perm, at 3:45:05. ++# Assume it switched on 1916-07-03, the time of the new standard. ++# The 1919 and 1930 transitions are from Shanks. ++ ++Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3 ++ 3:45:05 - PMT 1919 Jul 15 4:00 + 4:00 - SVET 1930 Jun 21 # Sverdlovsk Time +- 5:00 Russia SVE%sT 1991 Mar 31 2:00s +- 4:00 Russia SVE%sT 1992 Jan 19 2:00s +- 5:00 Russia YEK%sT 2011 Mar 27 2:00s +- 6:00 - YEKT # Yekaterinburg Time +-# +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Respublika Altaj, Altajskij kraj, Omskaya oblast'. +-Zone Asia/Omsk 4:53:36 - LMT 1919 Nov 14 +- 5:00 - OMST 1930 Jun 21 # Omsk TIme +- 6:00 Russia OMS%sT 1991 Mar 31 2:00s +- 5:00 Russia OMS%sT 1992 Jan 19 2:00s +- 6:00 Russia OMS%sT 2011 Mar 27 2:00s +- 7:00 - OMST +-# ++ 5:00 Russia SVE%sT 1991 Mar 31 2:00s ++ 4:00 Russia SVE%sT 1992 Jan 19 2:00s ++ 5:00 Russia YEK%sT 2011 Mar 27 2:00s ++ 6:00 - YEKT 2014 Oct 26 2:00s ++ 5:00 - YEKT ++ ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Asia/Omsk covers... ++# 04 RU-AL Altai Republic ++# 22 RU-ALT Altai Krai ++# 55 RU-OMS Omsk Oblast ++ ++# Byalokoz 1919 says Omsk was 4:53:30. ++ ++Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14 ++ 5:00 - OMST 1930 Jun 21 # Omsk Time ++ 6:00 Russia OMS%sT 1991 Mar 31 2:00s ++ 5:00 Russia OMS%sT 1992 Jan 19 2:00s ++ 6:00 Russia OMS%sT 2011 Mar 27 2:00s ++ 7:00 - OMST 2014 Oct 26 2:00s ++ 6:00 - OMST ++ ++ ++# From Tim Parenti (2014-07-03): ++# Asia/Novosibirsk covers... ++# 54 RU-NVS Novosibirsk Oblast ++# 70 RU-TOM Tomsk Oblast ++ + # From Paul Eggert (2006-08-19): I'm guessing about Tomsk here; it's + # not clear when it switched from +7 to +6. +-# Novosibirskaya oblast', Tomskaya oblast'. +-Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00 ++ ++Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00 + 6:00 - NOVT 1930 Jun 21 # Novosibirsk Time +- 7:00 Russia NOV%sT 1991 Mar 31 2:00s +- 6:00 Russia NOV%sT 1992 Jan 19 2:00s ++ 7:00 Russia NOV%sT 1991 Mar 31 2:00s ++ 6:00 Russia NOV%sT 1992 Jan 19 2:00s + 7:00 Russia NOV%sT 1993 May 23 # say Shanks & P. +- 6:00 Russia NOV%sT 2011 Mar 27 2:00s +- 7:00 - NOVT ++ 6:00 Russia NOV%sT 2011 Mar 27 2:00s ++ 7:00 - NOVT 2014 Oct 26 2:00s ++ 6:00 - NOVT ++ ++ ++# From Tim Parenti (2014-07-03): ++# Asia/Novokuznetsk covers... ++# 42 RU-KEM Kemerovo Oblast + + # From Alexander Krivenyshev (2009-10-13): + # Kemerovo oblast' (Kemerovo region) in Russia will change current time zone on +@@ -2319,14 +2530,10 @@ + # time zone." ("Russia Zone 5" or old "USSR Zone 5" is GMT +0600) + # + # Russian Government web site (Russian language) +-# <a href="http://www.government.ru/content/governmentactivity/rfgovernmentdecisions/archiv"> + # http://www.government.ru/content/governmentactivity/rfgovernmentdecisions/archive/2009/09/14/991633.htm +-# </a> + # or Russian-English translation by WorldTimeZone.com with reference + # map to local region and new Russia Time Zone map after March 28, 2010 +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_russia03.html"> + # http://www.worldtimezone.com/dst_news/dst_news_russia03.html +-# </a> + # + # Thus, when Russia will switch to DST on the night of March 28, 2010 + # Kemerovo region (Kemerovo oblast') will not change the clock. +@@ -2334,152 +2541,319 @@ + # As a result, Kemerovo oblast' will be in the same time zone as + # Novosibirsk, Omsk, Tomsk, Barnaul and Altai Republic. + +-Zone Asia/Novokuznetsk 5:48:48 - NMT 1920 Jan 6 ++# From Tim Parenti (2014-07-02), per Alexander Krivenyshev (2014-07-02): ++# The Kemerovo region will remain at UTC+7 through the 2014-10-26 change, thus ++# realigning itself with KRAT. ++ ++Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1 + 6:00 - KRAT 1930 Jun 21 # Krasnoyarsk Time +- 7:00 Russia KRA%sT 1991 Mar 31 2:00s +- 6:00 Russia KRA%sT 1992 Jan 19 2:00s +- 7:00 Russia KRA%sT 2010 Mar 28 2:00s +- 6:00 Russia NOV%sT 2011 Mar 27 2:00s +- 7:00 - NOVT # Novosibirsk/Novokuznetsk Time ++ 7:00 Russia KRA%sT 1991 Mar 31 2:00s ++ 6:00 Russia KRA%sT 1992 Jan 19 2:00s ++ 7:00 Russia KRA%sT 2010 Mar 28 2:00s ++ 6:00 Russia NOV%sT 2011 Mar 27 2:00s # Novosibirsk ++ 7:00 - NOVT 2014 Oct 26 2:00s ++ 7:00 - KRAT # Krasnoyarsk Time + ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Asia/Krasnoyarsk covers... ++# 17 RU-TY Tuva Republic ++# 19 RU-KK Khakassia, Republic of ++# 24 RU-KYA Krasnoyarsk Krai + # +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Krasnoyarskij kraj, +-# Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug, +-# Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug. +-Zone Asia/Krasnoyarsk 6:11:20 - LMT 1920 Jan 6 ++# Note: Effective 2007-01-01, (88) Evenk Autonomous Okrug and (84) Taymyr ++# Autonomous Okrug were merged into (24, RU-KYA) Krasnoyarsk Krai. ++ ++# Byalokoz 1919 says Krasnoyarsk was 6:11:26. ++ ++Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6 + 6:00 - KRAT 1930 Jun 21 # Krasnoyarsk Time +- 7:00 Russia KRA%sT 1991 Mar 31 2:00s +- 6:00 Russia KRA%sT 1992 Jan 19 2:00s +- 7:00 Russia KRA%sT 2011 Mar 27 2:00s +- 8:00 - KRAT ++ 7:00 Russia KRA%sT 1991 Mar 31 2:00s ++ 6:00 Russia KRA%sT 1992 Jan 19 2:00s ++ 7:00 Russia KRA%sT 2011 Mar 27 2:00s ++ 8:00 - KRAT 2014 Oct 26 2:00s ++ 7:00 - KRAT ++ ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Asia/Irkutsk covers... ++# 03 RU-BU Buryatia, Republic of ++# 38 RU-IRK Irkutsk Oblast + # +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Respublika Buryatiya, Irkutskaya oblast', +-# Ust'-Ordynskij Buryatskij avtonomnyj okrug. +-Zone Asia/Irkutsk 6:57:20 - LMT 1880 +- 6:57:20 - IMT 1920 Jan 25 # Irkutsk Mean Time ++# Note: Effective 2008-01-01, (85) Ust-Orda Buryat Autonomous Okrug was ++# merged into (38, RU-IRK) Irkutsk Oblast. ++ ++# Milne 1899 says Irkutsk was 6:57:15. ++# Byalokoz 1919 says Irkutsk was 6:57:05. ++# Go with Byalokoz. ++ ++Zone Asia/Irkutsk 6:57:05 - LMT 1880 ++ 6:57:05 - IMT 1920 Jan 25 # Irkutsk Mean Time + 7:00 - IRKT 1930 Jun 21 # Irkutsk Time +- 8:00 Russia IRK%sT 1991 Mar 31 2:00s +- 7:00 Russia IRK%sT 1992 Jan 19 2:00s +- 8:00 Russia IRK%sT 2011 Mar 27 2:00s +- 9:00 - IRKT ++ 8:00 Russia IRK%sT 1991 Mar 31 2:00s ++ 7:00 Russia IRK%sT 1992 Jan 19 2:00s ++ 8:00 Russia IRK%sT 2011 Mar 27 2:00s ++ 9:00 - IRKT 2014 Oct 26 2:00s ++ 8:00 - IRKT ++ ++ ++# From Tim Parenti (2014-07-06): ++# Asia/Chita covers... ++# 92 RU-ZAB Zabaykalsky Krai + # +-# From Oscar van Vlijmen (2003-10-18): [This region consists of] +-# Aginskij Buryatskij avtonomnyj okrug, Amurskaya oblast', +-# [parts of] Respublika Sakha (Yakutiya), Chitinskaya oblast'. ++# Note: Effective 2008-03-01, (75) Chita Oblast and (80) Agin-Buryat ++# Autonomous Okrug merged to form (92, RU-ZAB) Zabaykalsky Krai. + +-# From Oscar van Vlijmen (2009-11-29): +-# ...some regions of [Russia] were merged with others since 2005... +-# Some names were changed, no big deal, except for one instance: a new name. +-# YAK/YAKST: UTC+9 Zabajkal'skij kraj. ++Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15 ++ 8:00 - YAKT 1930 Jun 21 # Yakutsk Time ++ 9:00 Russia YAK%sT 1991 Mar 31 2:00s ++ 8:00 Russia YAK%sT 1992 Jan 19 2:00s ++ 9:00 Russia YAK%sT 2011 Mar 27 2:00s ++ 10:00 - YAKT 2014 Oct 26 2:00s ++ 8:00 - IRKT + +-# From Oscar van Vlijmen (2009-11-29): +-# The Sakha districts are: Aldanskij, Amginskij, Anabarskij, +-# Verkhnevilyujskij, Vilyujskij, Gornyj, +-# Zhiganskij, Kobyajskij, Lenskij, Megino-Kangalasskij, Mirninskij, +-# Namskij, Nyurbinskij, Olenyokskij, Olyokminskij, +-# Suntarskij, Tattinskij, Ust'-Aldanskij, Khangalasskij, +-# Churapchinskij, Eveno-Bytantajskij Natsional'nij. + +-Zone Asia/Yakutsk 8:38:40 - LMT 1919 Dec 15 ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29): ++# Asia/Yakutsk covers... ++# 28 RU-AMU Amur Oblast ++# ++# ...and parts of (14, RU-SA) Sakha (Yakutia) Republic: ++# 14-02 **** Aldansky District ++# 14-04 **** Amginsky District ++# 14-05 **** Anabarsky District ++# 14-06 **** Bulunsky District ++# 14-07 **** Verkhnevilyuysky District ++# 14-10 **** Vilyuysky District ++# 14-11 **** Gorny District ++# 14-12 **** Zhigansky District ++# 14-13 **** Kobyaysky District ++# 14-14 **** Lensky District ++# 14-15 **** Megino-Kangalassky District ++# 14-16 **** Mirninsky District ++# 14-18 **** Namsky District ++# 14-19 **** Neryungrinsky District ++# 14-21 **** Nyurbinsky District ++# 14-23 **** Olenyoksky District ++# 14-24 **** Olyokminsky District ++# 14-26 **** Suntarsky District ++# 14-27 **** Tattinsky District ++# 14-29 **** Ust-Aldansky District ++# 14-32 **** Khangalassky District ++# 14-33 **** Churapchinsky District ++# 14-34 **** Eveno-Bytantaysky National District ++ ++# From Tim Parenti (2014-07-03): ++# Our commentary seems to have lost mention of (14-19) Neryungrinsky District. ++# Since the surrounding districts of Sakha are all YAKT, assume this is, too. ++# Also assume its history has been the same as the rest of Asia/Yakutsk. ++ ++# Byalokoz 1919 says Yakutsk was 8:38:58. ++ ++Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15 + 8:00 - YAKT 1930 Jun 21 # Yakutsk Time +- 9:00 Russia YAK%sT 1991 Mar 31 2:00s +- 8:00 Russia YAK%sT 1992 Jan 19 2:00s +- 9:00 Russia YAK%sT 2011 Mar 27 2:00s +- 10:00 - YAKT ++ 9:00 Russia YAK%sT 1991 Mar 31 2:00s ++ 8:00 Russia YAK%sT 1992 Jan 19 2:00s ++ 9:00 Russia YAK%sT 2011 Mar 27 2:00s ++ 10:00 - YAKT 2014 Oct 26 2:00s ++ 9:00 - YAKT ++ ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29): ++# Asia/Vladivostok covers... ++# 25 RU-PRI Primorsky Krai ++# 27 RU-KHA Khabarovsk Krai ++# 79 RU-YEV Jewish Autonomous Oblast + # +-# From Oscar van Vlijmen (2003-10-18): [This region consists of] +-# Evrejskaya avtonomnaya oblast', Khabarovskij kraj, Primorskij kraj, +-# [parts of] Respublika Sakha (Yakutiya). ++# ...and parts of (14, RU-SA) Sakha (Yakutia) Republic: ++# 14-09 **** Verkhoyansky District ++# 14-31 **** Ust-Yansky District + +-# From Oscar van Vlijmen (2009-11-29): +-# The Sakha districts are: Bulunskij, Verkhoyanskij, ... Ust'-Yanskij. +-Zone Asia/Vladivostok 8:47:44 - LMT 1922 Nov 15 ++# Milne 1899 says Vladivostok was 8:47:33.5. ++# Byalokoz 1919 says Vladivostok was 8:47:31. ++# Go with Byalokoz. ++ ++Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15 + 9:00 - VLAT 1930 Jun 21 # Vladivostok Time +- 10:00 Russia VLA%sT 1991 Mar 31 2:00s +- 9:00 Russia VLA%sST 1992 Jan 19 2:00s +- 10:00 Russia VLA%sT 2011 Mar 27 2:00s +- 11:00 - VLAT ++ 10:00 Russia VLA%sT 1991 Mar 31 2:00s ++ 9:00 Russia VLA%sT 1992 Jan 19 2:00s ++ 10:00 Russia VLA%sT 2011 Mar 27 2:00s ++ 11:00 - VLAT 2014 Oct 26 2:00s ++ 10:00 - VLAT ++ ++ ++# From Tim Parenti (2014-07-03): ++# Asia/Khandyga covers parts of (14, RU-SA) Sakha (Yakutia) Republic: ++# 14-28 **** Tomponsky District ++# 14-30 **** Ust-Maysky District + + # From Arthur David Olson (2012-05-09): + # Tomponskij and Ust'-Majskij switched from Vladivostok time to Yakutsk time + # in 2011. +-# ++ + # From Paul Eggert (2012-11-25): + # Shanks and Pottenger (2003) has Khandyga on Yakutsk time. + # Make a wild guess that it switched to Vladivostok time in 2004. + # This transition is no doubt wrong, but we have no better info. +-# ++ + Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15 + 8:00 - YAKT 1930 Jun 21 # Yakutsk Time +- 9:00 Russia YAK%sT 1991 Mar 31 2:00s +- 8:00 Russia YAK%sT 1992 Jan 19 2:00s ++ 9:00 Russia YAK%sT 1991 Mar 31 2:00s ++ 8:00 Russia YAK%sT 1992 Jan 19 2:00s + 9:00 Russia YAK%sT 2004 +- 10:00 Russia VLA%sT 2011 Mar 27 2:00s +- 11:00 - VLAT 2011 Sep 13 0:00s # Decree 725? +- 10:00 - YAKT ++ 10:00 Russia VLA%sT 2011 Mar 27 2:00s ++ 11:00 - VLAT 2011 Sep 13 0:00s # Decree 725? ++ 10:00 - YAKT 2014 Oct 26 2:00s ++ 9:00 - YAKT + +-# +-# Sakhalinskaya oblast'. +-# The Zone name should be Yuzhno-Sakhalinsk, but that's too long. ++ ++# From Tim Parenti (2014-07-03): ++# Asia/Sakhalin covers... ++# 65 RU-SAK Sakhalin Oblast ++# ...with the exception of: ++# 65-11 **** Severo-Kurilsky District (North Kuril Islands) ++ ++# The Zone name should be Asia/Yuzhno-Sakhalinsk, but that's too long. + Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23 +- 9:00 - CJT 1938 ++ 9:00 - JCST 1937 Oct 1 + 9:00 - JST 1945 Aug 25 +- 11:00 Russia SAK%sT 1991 Mar 31 2:00s # Sakhalin T. +- 10:00 Russia SAK%sT 1992 Jan 19 2:00s +- 11:00 Russia SAK%sT 1997 Mar lastSun 2:00s +- 10:00 Russia SAK%sT 2011 Mar 27 2:00s +- 11:00 - SAKT +-# +-# From Oscar van Vlijmen (2003-10-18): [This region consists of] +-# Magadanskaya oblast', Respublika Sakha (Yakutiya). +-# Probably also: Kuril Islands. ++ 11:00 Russia SAK%sT 1991 Mar 31 2:00s # Sakhalin T ++ 10:00 Russia SAK%sT 1992 Jan 19 2:00s ++ 11:00 Russia SAK%sT 1997 Mar lastSun 2:00s ++ 10:00 Russia SAK%sT 2011 Mar 27 2:00s ++ 11:00 - SAKT 2014 Oct 26 2:00s ++ 10:00 - SAKT + +-# From Oscar van Vlijmen (2009-11-29): +-# The Sakha districts are: Abyjskij, Allaikhovskij, Verkhhhnekolymskij, Momskij, +-# Nizhnekolymskij, ... Srednekolymskij. ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29): ++# Asia/Magadan covers... ++# 49 RU-MAG Magadan Oblast ++ ++# From Tim Parenti (2014-07-06), per Alexander Krivenyshev (2014-07-02): ++# Magadan Oblast is moving from UTC+12 to UTC+10 on 2014-10-26; however, ++# several districts of Sakha Republic as well as Severo-Kurilsky District of ++# the Sakhalin Oblast (also known as the North Kuril Islands), represented ++# until now by Asia/Magadan, will instead move to UTC+11. These regions will ++# need their own zone. ++ + Zone Asia/Magadan 10:03:12 - LMT 1924 May 2 + 10:00 - MAGT 1930 Jun 21 # Magadan Time +- 11:00 Russia MAG%sT 1991 Mar 31 2:00s +- 10:00 Russia MAG%sT 1992 Jan 19 2:00s +- 11:00 Russia MAG%sT 2011 Mar 27 2:00s +- 12:00 - MAGT ++ 11:00 Russia MAG%sT 1991 Mar 31 2:00s ++ 10:00 Russia MAG%sT 1992 Jan 19 2:00s ++ 11:00 Russia MAG%sT 2011 Mar 27 2:00s ++ 12:00 - MAGT 2014 Oct 26 2:00s ++ 10:00 - MAGT ++ ++ ++# From Tim Parenti (2014-07-06): ++# Asia/Srednekolymsk covers parts of (14, RU-SA) Sakha (Yakutia) Republic: ++# 14-01 **** Abyysky District ++# 14-03 **** Allaikhovsky District ++# 14-08 **** Verkhnekolymsky District ++# 14-17 **** Momsky District ++# 14-20 **** Nizhnekolymsky District ++# 14-25 **** Srednekolymsky District ++# ++# ...and parts of (65, RU-SAK) Sakhalin Oblast: ++# 65-11 **** Severo-Kurilsky District (North Kuril Islands) ++ ++# From Tim Parenti (2014-07-02): ++# Oymyakonsky District of Sakha Republic (represented by Ust-Nera), along with ++# most of Sakhalin Oblast (represented by Sakhalin) will be moving to UTC+10 on ++# 2014-10-26 to stay aligned with VLAT/SAKT; however, Severo-Kurilsky District ++# of the Sakhalin Oblast (also known as the North Kuril Islands, represented by ++# Severo-Kurilsk) will remain on UTC+11. ++ ++# From Tim Parenti (2014-07-06): ++# Assume North Kuril Islands have history like Magadan before 2011-03-27. ++# There is a decent chance this is wrong, in which case a new zone ++# Asia/Severo-Kurilsk would become necessary. ++# ++# Srednekolymsk and Zyryanka are the most populous places amongst these ++# districts, but have very similar populations. In fact, Wikipedia currently ++# lists them both as having 3528 people, exactly 1668 males and 1860 females ++# each! (Yikes!) ++# http://en.wikipedia.org/w/?title=Srednekolymsky_District&oldid=603435276 ++# http://en.wikipedia.org/w/?title=Verkhnekolymsky_District&oldid=594378493 ++# Assume this is a mistake, albeit an amusing one. ++# ++# Looking at censuses, the populations of the two municipalities seem to have ++# fluctuated recently. Zyryanka was more populous than Srednekolymsk in the ++# 1989 and 2002 censuses, but Srednekolymsk was more populous in the most ++# recent (2010) census, 3525 to 3170. (See pages 195 and 197 of ++# http://www.gks.ru/free_doc/new_site/perepis2010/croc/Documents/Vol1/pub-01-05.pdf ++# in Russian.) In addition, Srednekolymsk appears to be a much older ++# settlement and the population of Zyryanka seems to be declining. ++# Go with Srednekolymsk. ++# ++# Since Magadan Oblast moves to UTC+10 on 2014-10-26, we cannot keep using MAGT ++# as the abbreviation. Use SRET instead. ++ ++Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 ++ 10:00 - MAGT 1930 Jun 21 # Magadan Time ++ 11:00 Russia MAG%sT 1991 Mar 31 2:00s ++ 10:00 Russia MAG%sT 1992 Jan 19 2:00s ++ 11:00 Russia MAG%sT 2011 Mar 27 2:00s ++ 12:00 - MAGT 2014 Oct 26 2:00s ++ 11:00 - SRET # Srednekolymsk Time ++ ++ ++# From Tim Parenti (2014-07-03): ++# Asia/Ust-Nera covers parts of (14, RU-SA) Sakha (Yakutia) Republic: ++# 14-22 **** Oymyakonsky District + + # From Arthur David Olson (2012-05-09): +-# Ojmyakonskij and the Kuril Islands switched from ++# Ojmyakonskij [and the Kuril Islands] switched from + # Magadan time to Vladivostok time in 2011. ++# ++# From Tim Parenti (2014-07-06), per Alexander Krivenyshev (2014-07-02): ++# It's unlikely that any of the Kuril Islands were involved in such a switch, ++# as the South and Middle Kurils have been on UTC+11 (SAKT) with the rest of ++# Sakhalin Oblast since at least 2011-09, and the North Kurils have been on ++# UTC+12 since at least then, too. ++ + Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15 + 8:00 - YAKT 1930 Jun 21 # Yakutsk Time + 9:00 Russia YAKT 1981 Apr 1 +- 11:00 Russia MAG%sT 1991 Mar 31 2:00s +- 10:00 Russia MAG%sT 1992 Jan 19 2:00s +- 11:00 Russia MAG%sT 2011 Mar 27 2:00s +- 12:00 - MAGT 2011 Sep 13 0:00s # Decree 725? +- 11:00 - VLAT ++ 11:00 Russia MAG%sT 1991 Mar 31 2:00s ++ 10:00 Russia MAG%sT 1992 Jan 19 2:00s ++ 11:00 Russia MAG%sT 2011 Mar 27 2:00s ++ 12:00 - MAGT 2011 Sep 13 0:00s # Decree 725? ++ 11:00 - VLAT 2014 Oct 26 2:00s ++ 10:00 - VLAT + +-# From Oscar van Vlijmen (2001-08-25): [This region consists of] +-# Kamchatskaya oblast', Koryakskij avtonomnyj okrug. ++ ++# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): ++# Asia/Kamchatka covers... ++# 91 RU-KAM Kamchatka Krai + # +-# The Zone name should be Asia/Petropavlovsk-Kamchatski, but that's too long. ++# Note: Effective 2007-07-01, (41) Kamchatka Oblast and (82) Koryak ++# Autonomous Okrug merged to form (91, RU-KAM) Kamchatka Krai. ++ ++# The Zone name should be Asia/Petropavlovsk-Kamchatski or perhaps ++# Asia/Petropavlovsk-Kamchatsky, but these are too long. + Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10 + 11:00 - PETT 1930 Jun 21 # P-K Time +- 12:00 Russia PET%sT 1991 Mar 31 2:00s +- 11:00 Russia PET%sT 1992 Jan 19 2:00s +- 12:00 Russia PET%sT 2010 Mar 28 2:00s +- 11:00 Russia PET%sT 2011 Mar 27 2:00s ++ 12:00 Russia PET%sT 1991 Mar 31 2:00s ++ 11:00 Russia PET%sT 1992 Jan 19 2:00s ++ 12:00 Russia PET%sT 2010 Mar 28 2:00s ++ 11:00 Russia PET%sT 2011 Mar 27 2:00s + 12:00 - PETT +-# +-# Chukotskij avtonomnyj okrug ++ ++ ++# From Tim Parenti (2014-07-03): ++# Asia/Anadyr covers... ++# 87 RU-CHU Chukotka Autonomous Okrug ++ + Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2 + 12:00 - ANAT 1930 Jun 21 # Anadyr Time +- 13:00 Russia ANA%sT 1982 Apr 1 0:00s +- 12:00 Russia ANA%sT 1991 Mar 31 2:00s +- 11:00 Russia ANA%sT 1992 Jan 19 2:00s +- 12:00 Russia ANA%sT 2010 Mar 28 2:00s +- 11:00 Russia ANA%sT 2011 Mar 27 2:00s ++ 13:00 Russia ANA%sT 1982 Apr 1 0:00s ++ 12:00 Russia ANA%sT 1991 Mar 31 2:00s ++ 11:00 Russia ANA%sT 1992 Jan 19 2:00s ++ 12:00 Russia ANA%sT 2010 Mar 28 2:00s ++ 11:00 Russia ANA%sT 2011 Mar 27 2:00s + 12:00 - ANAT + ++ + # San Marino + # See Europe/Rome. + +@@ -2488,11 +2862,11 @@ + Zone Europe/Belgrade 1:22:00 - LMT 1884 + 1:00 - CET 1941 Apr 18 23:00 + 1:00 C-Eur CE%sT 1945 +- 1:00 - CET 1945 May 8 2:00s ++ 1:00 - CET 1945 May 8 2:00s + 1:00 1:00 CEST 1945 Sep 16 2:00s +-# Metod Kozelj reports that the legal date of ++# Metod Koželj reports that the legal date of + # transition to EU rules was 1982-11-27, for all of Yugoslavia at the time. +-# Shanks & Pottenger don't give as much detail, so go with Kozelj. ++# Shanks & Pottenger don't give as much detail, so go with Koželj. + 1:00 - CET 1982 Nov 27 + 1:00 EU CE%sT + Link Europe/Belgrade Europe/Ljubljana # Slovenia +@@ -2568,13 +2942,13 @@ + 0:00 1:00 WEST 1918 Oct 7 23:00 + 0:00 - WET 1924 + 0:00 Spain WE%sT 1929 +- 0:00 SpainAfrica WE%sT 1984 Mar 16 ++ 0:00 SpainAfrica WE%sT 1984 Mar 16 + 1:00 - CET 1986 + 1:00 EU CE%sT + Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C. +- -1:00 - CANT 1946 Sep 30 1:00 # Canaries Time +- 0:00 - WET 1980 Apr 6 0:00s +- 0:00 1:00 WEST 1980 Sep 28 0:00s ++ -1:00 - CANT 1946 Sep 30 1:00 # Canaries T ++ 0:00 - WET 1980 Apr 6 0:00s ++ 0:00 1:00 WEST 1980 Sep 28 0:00s + 0:00 EU WE%sT + # IATA SSIM (1996-09) says the Canaries switch at 2:00u, not 1:00u. + # Ignore this for now, as the Canaries are part of the EU. +@@ -2583,7 +2957,7 @@ + + # From Ivan Nilsson (2001-04-13), superseding Shanks & Pottenger: + # +-# The law "Svensk forfattningssamling 1878, no 14" about standard time in 1879: ++# The law "Svensk författningssamling 1878, no 14" about standard time in 1879: + # From the beginning of 1879 (that is 01-01 00:00) the time for all + # places in the country is "the mean solar time for the meridian at + # three degrees, or twelve minutes of time, to the west of the +@@ -2594,7 +2968,7 @@ + # national standard time as 01:00:14 ahead of GMT.... + # + # About the beginning of CET in Sweden. The lawtext ("Svensk +-# forfattningssamling 1899, no 44") states, that "from the beginning ++# författningssamling 1899, no 44") states, that "from the beginning + # of 1900... ... the same as the mean solar time for the meridian at + # the distance of one hour of time from the meridian of the English + # observatory at Greenwich, or at 12 minutes 14 seconds to the west +@@ -2602,7 +2976,7 @@ + # 1899-06-16. In short: At 1900-01-01 00:00:00 the new standard time + # in Sweden is 01:00:00 ahead of GMT. + # +-# 1916: The lawtext ("Svensk forfattningssamling 1916, no 124") states ++# 1916: The lawtext ("Svensk författningssamling 1916, no 124") states + # that "1916-05-15 is considered to begin one hour earlier". It is + # pretty obvious that at 05-14 23:00 the clocks are set to 05-15 00:00.... + # Further the law says, that "1916-09-30 is considered to end one hour later". +@@ -2612,7 +2986,7 @@ + # not available on the site (to my knowledge they are only available + # in Swedish): <http://www.riksdagen.se/english/work/sfst.asp> (type + # "sommartid" without the quotes in the field "Fritext" and then click +-# the Sok-button). ++# the Sök-button). + # + # (2001-05-13): + # +@@ -2627,9 +3001,9 @@ + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Stockholm 1:12:12 - LMT 1879 Jan 1 +- 1:00:14 - SET 1900 Jan 1 # Swedish Time ++ 1:00:14 - SET 1900 Jan 1 # Swedish Time + 1:00 - CET 1916 May 14 23:00 +- 1:00 1:00 CEST 1916 Oct 1 01:00 ++ 1:00 1:00 CEST 1916 Oct 1 1:00 + 1:00 - CET 1980 + 1:00 EU CE%sT + +@@ -2637,7 +3011,7 @@ + # From Howse: + # By the end of the 18th century clocks and watches became commonplace + # and their performance improved enormously. Communities began to keep +-# mean time in preference to apparent time -- Geneva from 1780 .... ++# mean time in preference to apparent time - Geneva from 1780 .... + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + # From Whitman (who writes "Midnight?"): + # Rule Swiss 1940 only - Nov 2 0:00 1:00 S +@@ -2653,7 +3027,7 @@ + # to be wrong. This is now verified. + # + # I have found copies of the original ruling by the Swiss Federal +-# government, in 'Eidgen[o]ssische Gesetzessammlung 1941 and 1942' (Swiss ++# government, in 'Eidgenössische Gesetzessammlung 1941 and 1942' (Swiss + # federal law collection)... + # + # DST began on Monday 5 May 1941, 1:00 am by shifting the clocks to 2:00 am +@@ -2672,7 +3046,7 @@ + # night as an absolute novelty, because this was the first time that such + # a thing had happened in Switzerland. + # +-# I have also checked 1916, because one book source (Gabriel, Traite de ++# I have also checked 1916, because one book source (Gabriel, Traité de + # l'heure dans le monde) claims that Switzerland had DST in 1916. This is + # false, no official document could be found. Probably Gabriel got misled + # by references to Germany, which introduced DST in 1916 for the first time. +@@ -2686,19 +3060,19 @@ + # One further detail for Switzerland, which is probably out of scope for + # most users of tzdata: The [Europe/Zurich zone] ... + # describes all of Switzerland correctly, with the exception of +-# the Cantone Geneve (Geneva, Genf). Between 1848 and 1894 Geneve did not ++# the Canton de Genève (Geneva, Genf). Between 1848 and 1894 Geneva did not + # follow Bern Mean Time but kept its own local mean time. + # To represent this, an extra zone would be needed. + # + # From Alois Treindl (2013-09-11): + # The Federal regulations say + # http://www.admin.ch/opc/de/classified-compilation/20071096/index.html +-# ... the meridian for Bern mean time ... is 7 degrees 26'22.50". ++# ... the meridian for Bern mean time ... is 7 degrees 26' 22.50". + # Expressed in time, it is 0h29m45.5s. + + # From Pierre-Yves Berger (2013-09-11): +-# the "Circulaire du conseil federal" (December 11 1893) +-# <http://www.amtsdruckschriften.bar.admin.ch/viewOrigDoc.do?id=10071353> ... ++# the "Circulaire du conseil fédéral" (December 11 1893) ++# http://www.amtsdruckschriften.bar.admin.ch/viewOrigDoc.do?id=10071353 + # clearly states that the [1894-06-01] change should be done at midnight + # but if no one is present after 11 at night, could be postponed until one + # hour before the beginning of service. +@@ -2709,14 +3083,14 @@ + # We can find no reliable source for Shanks's assertion that all of Switzerland + # except Geneva switched to Bern Mean Time at 00:00 on 1848-09-12. This book: + # +-# Jakob Messerli. Gleichmassig, punktlich, schnell: Zeiteinteilung und ++# Jakob Messerli. Gleichmässig, pünktlich, schnell. Zeiteinteilung und + # Zeitgebrauch in der Schweiz im 19. Jahrhundert. Chronos, Zurich 1995, + # ISBN 3-905311-68-2, OCLC 717570797. + # + # suggests that the transition was more gradual, and that the Swiss did not + # agree about civil time during the transition. The timekeeping it gives the + # most detail for is postal and telegraph time: here, federal legislation (the +-# "Bundesgesetz uber die Erstellung von elektrischen Telegraphen") passed on ++# "Bundesgesetz über die Erstellung von elektrischen Telegraphen") passed on + # 1851-11-23, and an official implementation notice was published 1853-07-16 + # (Bundesblatt 1853, Bd. II, S. 859). On p 72 Messerli writes that in + # practice since July 1853 Bernese time was used in "all postal and telegraph +@@ -2730,7 +3104,7 @@ + Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment. +- 0:29:46 - BMT 1894 Jun # Bern Mean Time ++ 0:29:46 - BMT 1894 Jun # Bern Mean Time + 1:00 Swiss CE%sT 1981 + 1:00 EU CE%sT + +@@ -2738,7 +3112,7 @@ + + # From Amar Devegowda (2007-01-03): + # The time zone rules for Istanbul, Turkey have not been changed for years now. +-# ... The latest rules are available at - ++# ... The latest rules are available at: + # http://www.timeanddate.com/worldclock/timezone.html?n=107 + # From Steffen Thorsen (2007-01-03): + # I have been able to find press records back to 1996 which all say that +@@ -2763,8 +3137,7 @@ + # (on a non-government server though) describing dates between 2002 and 2006: + # http://www.alomaliye.com/bkk_2002_3769.htm + +-# From Gökdeniz Karadağ (2011-03-10): +-# ++# From Gökdeniz Karadağ (2011-03-10): + # According to the articles linked below, Turkey will change into summer + # time zone (GMT+3) on March 28, 2011 at 3:00 a.m. instead of March 27. + # This change is due to a nationwide exam on 27th. +@@ -2777,9 +3150,16 @@ + # Turkish Local election.... + # http://www.sabah.com.tr/Ekonomi/2014/02/12/yaz-saatinde-onemli-degisiklik + # ... so Turkey will move clocks forward one hour on March 31 at 3:00 a.m. +-# From Paul Eggert (2014-02-17): +-# Here is an English-language source: +-# http://www.worldbulletin.net/turkey/129016/turkey-switches-to-daylight-saving-time-march-31 ++# From Randal L. Schwartz (2014-04-15): ++# Having landed on a flight from the states to Istanbul (via AMS) on March 31, ++# I can tell you that NOBODY (even the airlines) respected this timezone DST ++# change delay. Maybe the word just didn't get out in time. ++# From Paul Eggert (2014-06-15): ++# The press reported massive confusion, as election officials obeyed the rule ++# change but cell phones (and airline baggage systems) did not. See: ++# Kostidis M. Eventful elections in Turkey. Balkan News Agency ++# http://www.balkaneu.com/eventful-elections-turkey/ 2014-03-30. ++# I guess the best we can do is document the official time. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Turkey 1916 only - May 1 0:00 1:00 S +@@ -2846,10 +3226,10 @@ + 2:00 Turkey EE%sT 1978 Oct 15 + 3:00 Turkey TR%sT 1985 Apr 20 # Turkey Time + 2:00 Turkey EE%sT 2007 +- 2:00 EU EE%sT 2011 Mar 27 1:00u +- 2:00 - EET 2011 Mar 28 1:00u +- 2:00 EU EE%sT 2014 Mar 30 1:00u +- 2:00 - EET 2014 Mar 31 1:00u ++ 2:00 EU EE%sT 2011 Mar 27 1:00u ++ 2:00 - EET 2011 Mar 28 1:00u ++ 2:00 EU EE%sT 2014 Mar 30 1:00u ++ 2:00 - EET 2014 Mar 31 1:00u + 2:00 EU EE%sT + Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents. + +@@ -2870,7 +3250,7 @@ + # Bill number 8330 of MP from the Party of Regions Oleg Nadoshi got + # approval from 266 deputies. + # +-# Ukraine abolishes transter back to the winter time (in Russian) ++# Ukraine abolishes transfer back to the winter time (in Russian) + # http://news.mail.ru/politics/6861560/ + # + # The Ukrainians will no longer change the clock (in Russian) +@@ -2931,12 +3311,12 @@ + 2:00 - EET 1930 Jun 21 + 3:00 - MSK 1941 Sep 20 + 1:00 C-Eur CE%sT 1943 Nov 6 +- 3:00 Russia MSK/MSD 1990 Jul 1 2:00 +- 2:00 1:00 EEST 1991 Sep 29 3:00 ++ 3:00 Russia MSK/MSD 1990 Jul 1 2:00 ++ 2:00 1:00 EEST 1991 Sep 29 3:00 + 2:00 E-Eur EE%sT 1995 + 2:00 EU EE%sT + # Ruthenia used CET 1990/1991. +-# "Uzhhorod" is the transliteration of the Ukrainian name, but ++# "Uzhhorod" is the transliteration of the Rusyn/Ukrainian pronunciation, but + # "Uzhgorod" is more common in English. + Zone Europe/Uzhgorod 1:29:12 - LMT 1890 Oct + 1:00 - CET 1940 +@@ -2944,8 +3324,8 @@ + 1:00 1:00 CEST 1944 Oct 26 + 1:00 - CET 1945 Jun 29 + 3:00 Russia MSK/MSD 1990 +- 3:00 - MSK 1990 Jul 1 2:00 +- 1:00 - CET 1991 Mar 31 3:00 ++ 3:00 - MSK 1990 Jul 1 2:00 ++ 1:00 - CET 1991 Mar 31 3:00 + 2:00 - EET 1992 + 2:00 E-Eur EE%sT 1995 + 2:00 EU EE%sT +@@ -2959,42 +3339,9 @@ + 2:00 - EET 1930 Jun 21 + 3:00 - MSK 1941 Aug 25 + 1:00 C-Eur CE%sT 1943 Oct 25 +- 3:00 Russia MSK/MSD 1991 Mar 31 2:00 ++ 3:00 Russia MSK/MSD 1991 Mar 31 2:00 + 2:00 E-Eur EE%sT 1995 + 2:00 EU EE%sT +-# Central Crimea used Moscow time 1994/1997. +-Zone Europe/Simferopol 2:16:24 - LMT 1880 +- 2:16 - SMT 1924 May 2 # Simferopol Mean T +- 2:00 - EET 1930 Jun 21 +- 3:00 - MSK 1941 Nov +- 1:00 C-Eur CE%sT 1944 Apr 13 +- 3:00 Russia MSK/MSD 1990 +- 3:00 - MSK 1990 Jul 1 2:00 +- 2:00 - EET 1992 +-# From Paul Eggert (2006-03-22): +-# The _Economist_ (1994-05-28, p 45) reports that central Crimea switched +-# from Kiev to Moscow time sometime after the January 1994 elections. +-# Shanks (1999) says "date of change uncertain", but implies that it happened +-# sometime between the 1994 DST switches. Shanks & Pottenger simply say +-# 1994-09-25 03:00, but that can't be right. For now, guess it +-# changed in May. +- 2:00 E-Eur EE%sT 1994 May +-# From IATA SSIM (1994/1997), which also says that Kerch is still like Kiev. +- 3:00 E-Eur MSK/MSD 1996 Mar 31 3:00s +- 3:00 1:00 MSD 1996 Oct 27 3:00s +-# IATA SSIM (1997-09) says Crimea switched to EET/EEST. +-# Assume it happened in March by not changing the clocks. +- 3:00 Russia MSK/MSD 1997 +- 3:00 - MSK 1997 Mar lastSun 1:00u +-# From Alexander Krivenyshev (2014-03-17): +-# time change at 2:00 (2am) on March 30, 2014 +-# http://vz.ru/news/2014/3/17/677464.html +-# From Paul Eggert (2014-03-30): +-# Simferopol and Sevastopol reportedly changed their central town clocks +-# late the previous day, but this appears to have been ceremonial +-# and the discrepancies are small enough to not worry about. +- 2:00 EU EE%sT 2014 Mar 30 2:00 +- 4:00 - MSK + + # Vatican City + # See Europe/Rome. +@@ -3018,7 +3365,7 @@ + # ... + # + # ...the European time rules are...standardized since 1981, when +-# most European coun[tr]ies started DST. Before that year, only ++# most European countries started DST. Before that year, only + # a few countries (UK, France, Italy) had DST, each according + # to own national rules. In 1981, however, DST started on + # 'Apr firstSun', and not on 'Mar lastSun' as in the following +@@ -3026,7 +3373,7 @@ + # But also since 1981 there are some more national exceptions + # than listed in 'europe': Switzerland, for example, joined DST + # one year later, Denmark ended DST on 'Oct 1' instead of 'Sep +-# lastSun' in 1981---I don't know how they handle now. ++# lastSun' in 1981 - I don't know how they handle now. + # + # Finally, DST ist always from 'Apr 1' to 'Oct 1' in the + # Soviet Union (as far as I know). +--- ./jdk/make/sun/javazic/tzdata/factory Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/factory Mon Jan 05 11:57:27 2015 -0800 +@@ -21,7 +21,6 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +--- ./jdk/make/sun/javazic/tzdata/iso3166.tab Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/iso3166.tab Mon Jan 05 11:57:27 2015 -0800 +@@ -26,21 +26,21 @@ + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + # +-# From Paul Eggert (2013-05-27): ++# From Paul Eggert (2014-07-18): ++# This file contains a table of two-letter country codes. Columns are ++# separated by a single tab. Lines beginning with '#' are comments. ++# Although all text currently uses ASCII encoding, this is planned to ++# change to UTF-8 soon. The columns of the table are as follows: + # +-# This file contains a table with the following columns: + # 1. ISO 3166-1 alpha-2 country code, current as of +-# ISO 3166-1 Newsletter VI-15 (2013-05-10). See: Updates on ISO 3166 ++# ISO 3166-1 Newsletter VI-16 (2013-07-11). See: Updates on ISO 3166 + # http://www.iso.org/iso/home/standards/country_codes/updates_on_iso_3166.htm + # 2. The usual English name for the coded region, + # chosen so that alphabetic sorting of subsets produces helpful lists. + # This is not the same as the English name in the ISO 3166 tables. + # +-# Columns are separated by a single tab. + # The table is sorted by country code. + # +-# Lines beginning with `#' are comments. +-# + # This table is intended as an aid for users, to help them select time + # zone data appropriate for their practical needs. It is not intended + # to take or endorse any position on legal or territorial claims. +--- ./jdk/make/sun/javazic/tzdata/leapseconds Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/leapseconds Mon Jan 05 11:57:27 2015 -0800 +@@ -21,7 +21,7 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# Allowance for leapseconds added to each timezone file. ++# Allowance for leap seconds added to each time zone file. + + # This file is in the public domain. + +@@ -31,10 +31,10 @@ + # you should be able to pick up leap-seconds.list from a secondary NIST server. + # For more about leap-seconds.list, please see + # The NTP Timescale and Leap Seconds +-# <http://www.eecis.udel.edu/~mills/leap.html>. ++# http://www.eecis.udel.edu/~mills/leap.html + +-# The International Earth Rotation Service periodically uses leap seconds +-# to keep UTC to within 0.9 s of UT1 ++# The International Earth Rotation and Reference Systems Service ++# periodically uses leap seconds to keep UTC to within 0.9 s of UT1 + # (which measures the true angular orientation of the earth in space); see + # Terry J Quinn, The BIPM and the accurate measure of time, + # Proc IEEE 79, 7 (July 1991), 894-905 <http://dx.doi.org/10.1109/5.84965>. +--- ./jdk/make/sun/javazic/tzdata/northamerica Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/northamerica Mon Jan 05 11:57:27 2015 -0800 +@@ -21,15 +21,15 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + + # also includes Central America and the Caribbean + +-# This data is by no means authoritative; if you think you know better, ++# This file is by no means authoritative; if you think you know better, + # go ahead and edit the file (and please send any changes to +-# tz@iana.org for general use in the future). ++# tz@iana.org for general use in the future). For more, please see ++# the file CONTRIBUTING in the tz distribution. + + # From Paul Eggert (1999-03-22): + # A reliable and entertaining source about time zones is +@@ -78,13 +78,13 @@ + # to push people into bed earlier, and get them up earlier, to make + # them healthy, wealthy and wise in spite of themselves. + # +-# -- Robertson Davies, The diary of Samuel Marchbanks, ++# -- Robertson Davies, The diary of Samuel Marchbanks, + # Clarke, Irwin (1947), XIX, Sunday + # + # For more about the first ten years of DST in the United States, see +-# Robert Garland's <a href="http://www.clpgh.org/exhibit/dst.html"> +-# Ten years of daylight saving from the Pittsburgh standpoint +-# (Carnegie Library of Pittsburgh, 1927)</a>. ++# Robert Garland, Ten years of daylight saving from the Pittsburgh standpoint ++# (Carnegie Library of Pittsburgh, 1927). ++# http://www.clpgh.org/exhibit/dst.html + # + # Shanks says that DST was called "War Time" in the US in 1918 and 1919. + # However, DST was imposed by the Standard Time Act of 1918, which +@@ -103,11 +103,11 @@ + # From Arthur David Olson (2000-09-25): + # Last night I heard part of a rebroadcast of a 1945 Arch Oboler radio drama. + # In the introduction, Oboler spoke of "Eastern Peace Time." +-# An AltaVista search turned up +-# <a href="http://rowayton.org/rhs/hstaug45.html">: ++# An AltaVista search turned up: ++# http://rowayton.org/rhs/hstaug45.html + # "When the time is announced over the radio now, it is 'Eastern Peace + # Time' instead of the old familiar 'Eastern War Time.' Peace is wonderful." +-# </a> (August 1945) by way of confirmation. ++# (August 1945) by way of confirmation. + + # From Joseph Gallant citing + # George H. Douglas, _The Early Days of Radio Broadcasting_ (1987): +@@ -205,7 +205,7 @@ + # USA ALASKA STD 9 H BEHIND UTC MOST OF ALASKA (AKST) + # USA ALASKA STD 8 H BEHIND UTC APR 3 - OCT 30 (AKDT) + # USA ALEUTIAN 10 H BEHIND UTC ISLANDS WEST OF 170W +-# USA - " - 9 H BEHIND UTC APR 3 - OCT 30 ++# USA " 9 H BEHIND UTC APR 3 - OCT 30 + # USA HAWAII 10 H BEHIND UTC + # USA BERING 11 H BEHIND UTC SAMOA, MIDWAY + +@@ -258,19 +258,19 @@ + # The following was signed into law on 2005-08-08. + # + # H.R. 6, Energy Policy Act of 2005, SEC. 110. DAYLIGHT SAVINGS. +-# (a) Amendment- Section 3(a) of the Uniform Time Act of 1966 (15 ++# (a) Amendment.--Section 3(a) of the Uniform Time Act of 1966 (15 + # U.S.C. 260a(a)) is amended-- +-# (1) by striking 'first Sunday of April' and inserting 'second +-# Sunday of March'; and +-# (2) by striking 'last Sunday of October' and inserting 'first ++# (1) by striking "first Sunday of April" and inserting "second ++# Sunday of March"; and ++# (2) by striking "last Sunday of October" and inserting "first + # Sunday of November'. +-# (b) Effective Date- Subsection (a) shall take effect 1 year after the ++# (b) Effective Date.--Subsection (a) shall take effect 1 year after the + # date of enactment of this Act or March 1, 2007, whichever is later. +-# (c) Report to Congress- Not later than 9 months after the effective ++# (c) Report to Congress.--Not later than 9 months after the effective + # date stated in subsection (b), the Secretary shall report to Congress + # on the impact of this section on energy consumption in the United + # States. +-# (d) Right to Revert- Congress retains the right to revert the ++# (d) Right to Revert.--Congress retains the right to revert the + # Daylight Saving Time back to the 2005 time schedules once the + # Department study is complete. + +@@ -292,7 +292,7 @@ + + # From Paul Eggert (2005-08-26): + # According to today's Huntsville Times +-# <http://www.al.com/news/huntsvilletimes/index.ssf?/base/news/1125047783228320.xml&coll=1> ++# http://www.al.com/news/huntsvilletimes/index.ssf?/base/news/1125047783228320.xml&coll=1 + # a few towns on Alabama's "eastern border with Georgia, such as Phenix City + # in Russell County, Lanett in Chambers County and some towns in Lee County, + # set their watches and clocks on Eastern time." It quotes H.H. "Bubba" +@@ -300,6 +300,12 @@ + # time zone, but we do go by the Eastern time zone because so many people work + # in Columbus." + ++# From Paul Eggert (2014-09-06): ++# Monthly Notices of the Royal Astronomical Society 44, 4 (1884-02-08), 208 ++# says that New York City Hall time was 3 minutes 58.4 seconds fast of ++# Eastern time (i.e., -4:56:01.6) just before the 1883 switch. Round to the ++# nearest second. ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER + Rule NYC 1920 only - Mar lastSun 2:00 1:00 D + Rule NYC 1920 only - Oct lastSun 2:00 0 S +@@ -347,15 +353,15 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Chicago -5:50:36 - LMT 1883 Nov 18 12:09:24 + -6:00 US C%sT 1920 +- -6:00 Chicago C%sT 1936 Mar 1 2:00 +- -5:00 - EST 1936 Nov 15 2:00 ++ -6:00 Chicago C%sT 1936 Mar 1 2:00 ++ -5:00 - EST 1936 Nov 15 2:00 + -6:00 Chicago C%sT 1942 + -6:00 US C%sT 1946 + -6:00 Chicago C%sT 1967 + -6:00 US C%sT + # Oliver County, ND switched from mountain to central time on 1992-10-25. + Zone America/North_Dakota/Center -6:45:12 - LMT 1883 Nov 18 12:14:48 +- -7:00 US M%sT 1992 Oct 25 02:00 ++ -7:00 US M%sT 1992 Oct 25 2:00 + -6:00 US C%sT + # Morton County, ND, switched from mountain to central time on + # 2003-10-26, except for the area around Mandan which was already central time. +@@ -364,29 +370,26 @@ + # Jones, Mellette, and Todd Counties in South Dakota; + # but in practice these other counties were already observing central time. + # See <http://www.epa.gov/fedrgstr/EPA-IMPACT/2003/October/Day-28/i27056.htm>. +-Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21 +- -7:00 US M%sT 2003 Oct 26 02:00 ++Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21 ++ -7:00 US M%sT 2003 Oct 26 2:00 + -6:00 US C%sT + + # From Josh Findley (2011-01-21): + # ...it appears that Mercer County, North Dakota, changed from the + # mountain time zone to the central time zone at the last transition from + # daylight-saving to standard time (on Nov. 7, 2010): +-# <a href="http://www.gpo.gov/fdsys/pkg/FR-2010-09-29/html/2010-24376.htm"> + # http://www.gpo.gov/fdsys/pkg/FR-2010-09-29/html/2010-24376.htm +-# </a> +-# <a href="http://www.bismarcktribune.com/news/local/article_1eb1b588-c758-11df-b472-001cc4c03286.html"> + # http://www.bismarcktribune.com/news/local/article_1eb1b588-c758-11df-b472-001cc4c03286.html +-# </a> + + # From Andy Lipscomb (2011-01-24): + # ...according to the Census Bureau, the largest city is Beulah (although + # it's commonly referred to as Beulah-Hazen, with Hazen being the next + # largest city in Mercer County). Google Maps places Beulah's city hall +-# at 4715'51" north, 10146'40" west, which yields an offset of 6h47'07". ++# at 47 degrees 15' 51" N, 101 degrees 46' 40" W, which yields an offset ++# of 6h47'07". + +-Zone America/North_Dakota/Beulah -6:47:07 - LMT 1883 Nov 18 12:12:53 +- -7:00 US M%sT 2010 Nov 7 2:00 ++Zone America/North_Dakota/Beulah -6:47:07 - LMT 1883 Nov 18 12:12:53 ++ -7:00 US M%sT 2010 Nov 7 2:00 + -6:00 US C%sT + + # US mountain time, represented by Denver +@@ -448,15 +451,18 @@ + # was destroyed in 1805 by a Yakutat-kon war party.) However, there + # were nearby inhabitants in some cases and for our purposes perhaps + # it's best to simply use the official transition. ++ ++# From Paul Eggert (2014-07-18): ++# One opinion of the early-1980s turmoil in Alaska over time zones and ++# daylight saving time appeared as graffiti on a Juneau airport wall: ++# "Welcome to Juneau. Please turn your watch back to the 19th century." ++# See: Turner W. Alaska's four time zones now two. NY Times 1983-11-01. ++# http://www.nytimes.com/1983/11/01/us/alaska-s-four-time-zones-now-two.html + # +- +-# From Steve Ferguson (2011-01-31): +-# The author lives in Alaska and many of the references listed are only +-# available to Alaskan residents. +-# +-# <a href="http://www.alaskahistoricalsociety.org/index.cfm?section=discover%20alaska&page=Glimpses%20of%20the%20Past&viewpost=2&ContentId=98"> +-# http://www.alaskahistoricalsociety.org/index.cfm?section=discover%20alaska&page=Glimpses%20of%20the%20Past&viewpost=2&ContentId=98 +-# </a> ++# Steve Ferguson (2011-01-31) referred to the following source: ++# Norris F. Keeping time in Alaska: national directives, local response. ++# Alaska History 2001;16(1-2). ++# http://alaskahistoricalsociety.org/discover-alaska/glimpses-of-the-past/keeping-time-in-alaska/ + + # From Arthur David Olson (2011-02-01): + # Here's database-relevant material from the 2001 "Alaska History" article: +@@ -482,12 +488,10 @@ + # From Arthur David Olson (2011-02-09): + # I just spoke by phone with a staff member at the Metlakatla Indian + # Community office (using contact information available at +-# <a href="http://www.commerce.state.ak.us/dca/commdb/CIS.cfm?Comm_Boro_name=Metlakatla"> + # http://www.commerce.state.ak.us/dca/commdb/CIS.cfm?Comm_Boro_name=Metlakatla +-# </a>). + # It's shortly after 1:00 here on the east coast of the United States; + # the staffer said it was shortly after 10:00 there. When I asked whether +-# that meant they were on Pacific time, they said no--they were on their ++# that meant they were on Pacific time, they said no - they were on their + # own time. I asked about daylight saving; they said it wasn't used. I + # did not inquire about practices in the past. + +@@ -501,9 +505,9 @@ + -8:00 - PST 1942 + -8:00 US P%sT 1946 + -8:00 - PST 1969 +- -8:00 US P%sT 1980 Apr 27 2:00 +- -9:00 US Y%sT 1980 Oct 26 2:00 +- -8:00 US P%sT 1983 Oct 30 2:00 ++ -8:00 US P%sT 1980 Apr 27 2:00 ++ -9:00 US Y%sT 1980 Oct 26 2:00 ++ -8:00 US P%sT 1983 Oct 30 2:00 + -9:00 US Y%sT 1983 Nov 30 + -9:00 US AK%sT + Zone America/Sitka 14:58:47 - LMT 1867 Oct 18 +@@ -511,7 +515,7 @@ + -8:00 - PST 1942 + -8:00 US P%sT 1946 + -8:00 - PST 1969 +- -8:00 US P%sT 1983 Oct 30 2:00 ++ -8:00 US P%sT 1983 Oct 30 2:00 + -9:00 US Y%sT 1983 Nov 30 + -9:00 US AK%sT + Zone America/Metlakatla 15:13:42 - LMT 1867 Oct 18 +@@ -519,8 +523,8 @@ + -8:00 - PST 1942 + -8:00 US P%sT 1946 + -8:00 - PST 1969 +- -8:00 US P%sT 1983 Oct 30 2:00 +- -8:00 - MeST ++ -8:00 US P%sT 1983 Oct 30 2:00 ++ -8:00 - PST + Zone America/Yakutat 14:41:05 - LMT 1867 Oct 18 + -9:18:55 - LMT 1900 Aug 20 12:00 + -9:00 - YST 1942 +@@ -535,7 +539,7 @@ + -10:00 US CAT/CAPT 1946 # Peace + -10:00 - CAT 1967 Apr + -10:00 - AHST 1969 +- -10:00 US AH%sT 1983 Oct 30 2:00 ++ -10:00 US AH%sT 1983 Oct 30 2:00 + -9:00 US Y%sT 1983 Nov 30 + -9:00 US AK%sT + Zone America/Nome 12:58:21 - LMT 1867 Oct 18 +@@ -544,7 +548,7 @@ + -11:00 US N%sT 1946 + -11:00 - NST 1967 Apr + -11:00 - BST 1969 +- -11:00 US B%sT 1983 Oct 30 2:00 ++ -11:00 US B%sT 1983 Oct 30 2:00 + -9:00 US Y%sT 1983 Nov 30 + -9:00 US AK%sT + Zone America/Adak 12:13:21 - LMT 1867 Oct 18 +@@ -553,7 +557,7 @@ + -11:00 US N%sT 1946 + -11:00 - NST 1967 Apr + -11:00 - BST 1969 +- -11:00 US B%sT 1983 Oct 30 2:00 ++ -11:00 US B%sT 1983 Oct 30 2:00 + -10:00 US AH%sT 1983 Nov 30 + -10:00 US HA%sT + # The following switches don't quite make our 1970 cutoff. +@@ -571,7 +575,7 @@ + # Minutes of the Unalaska City Council Meeting, January 10, 1967: + # "Except for St. Paul and Akutan, Unalaska is the only important + # location not on Alaska Standard Time. The following resolution was +-# made by William Robinson and seconded by Henry Swanson: Be it ++# made by William Robinson and seconded by Henry Swanson: Be it + # resolved that the City of Unalaska hereby goes to Alaska Standard + # Time as of midnight Friday, January 13, 1967 (1 A.M. Saturday, + # January 14, Alaska Standard Time.) This resolution was passed with +@@ -583,9 +587,7 @@ + # "Hawaiian Time" by Robert C. Schmitt and Doak C. Cox appears on pages 207-225 + # of volume 26 of The Hawaiian Journal of History (1992). As of 2010-12-09, + # the article is available at +-# <a href="http://evols.library.manoa.hawaii.edu/bitstream/10524/239/2/JL26215.pdf"> + # http://evols.library.manoa.hawaii.edu/bitstream/10524/239/2/JL26215.pdf +-# </a> + # and indicates that standard time was adopted effective noon, January + # 13, 1896 (page 218), that in "1933, the Legislature decreed daylight + # saving for the period between the last Sunday of each April and the +@@ -606,7 +608,7 @@ + # year, the standard time of this Territory shall be advanced one + # hour...This Act shall take effect upon its approval. Approved this 26th + # day of April, A. D. 1933. LAWRENCE M JUDD, Governor of the Territory of +-# Hawaii." Page 172: "Act 163...Act 90 of the Session Laws of 1933 is ++# Hawaii." Page 172: "Act 163...Act 90 of the Session Laws of 1933 is + # hereby repealed...This Act shall take effect upon its approval, upon + # which date the standard time of this Territory shall be restored to + # that existing immediately prior to the taking effect of said Act 90. +@@ -616,14 +618,14 @@ + # Note that 1933-05-21 was a Sunday. + # We're left to guess the time of day when Act 163 was approved; guess noon. + +-Zone Pacific/Honolulu -10:31:26 - LMT 1896 Jan 13 12:00 #Schmitt&Cox +- -10:30 - HST 1933 Apr 30 2:00 #Laws 1933 +- -10:30 1:00 HDT 1933 May 21 12:00 #Laws 1933+12 +- -10:30 - HST 1942 Feb 09 2:00 #Schmitt&Cox+2 +- -10:30 1:00 HDT 1945 Sep 30 2:00 #Schmitt&Cox+2 +- -10:30 - HST 1947 Jun 8 2:00 #Schmitt&Cox+2 ++# Zone NAME GMTOFF RULES FORMAT [UNTIL] ++Zone Pacific/Honolulu -10:31:26 - LMT 1896 Jan 13 12:00 ++ -10:30 - HST 1933 Apr 30 2:00 ++ -10:30 1:00 HDT 1933 May 21 12:00 ++ -10:30 - HST 1942 Feb 9 2:00 ++ -10:30 1:00 HDT 1945 Sep 30 2:00 ++ -10:30 - HST 1947 Jun 8 2:00 + -10:00 - HST +- + Link Pacific/Honolulu Pacific/Johnston + + # Now we turn to US areas that have diverged from the consensus since 1970. +@@ -633,9 +635,9 @@ + # From Paul Eggert (2002-10-20): + # + # The information in the rest of this paragraph is derived from the +-# <a href="http://www.dlapr.lib.az.us/links/daylight.htm"> +-# Daylight Saving Time web page (2002-01-23)</a> maintained by the +-# Arizona State Library, Archives and Public Records. ++# Daylight Saving Time web page ++# <http://www.dlapr.lib.az.us/links/daylight.htm> (2002-01-23) ++# maintained by the Arizona State Library, Archives and Public Records. + # Between 1944-01-01 and 1944-04-01 the State of Arizona used standard + # time, but by federal law railroads, airlines, bus lines, military + # personnel, and some engaged in interstate commerce continued to +@@ -649,10 +651,11 @@ + # Shanks says the 1944 experiment came to an end on 1944-03-17. + # Go with the Arizona State Library instead. + ++# Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Phoenix -7:28:18 - LMT 1883 Nov 18 11:31:42 +- -7:00 US M%sT 1944 Jan 1 00:01 +- -7:00 - MST 1944 Apr 1 00:01 +- -7:00 US M%sT 1944 Oct 1 00:01 ++ -7:00 US M%sT 1944 Jan 1 0:01 ++ -7:00 - MST 1944 Apr 1 0:01 ++ -7:00 US M%sT 1944 Oct 1 0:01 + -7:00 - MST 1967 + -7:00 US M%sT 1968 Mar 21 + -7:00 - MST +@@ -676,24 +679,22 @@ + # + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Boise -7:44:49 - LMT 1883 Nov 18 12:15:11 +- -8:00 US P%sT 1923 May 13 2:00 ++ -8:00 US P%sT 1923 May 13 2:00 + -7:00 US M%sT 1974 +- -7:00 - MST 1974 Feb 3 2:00 ++ -7:00 - MST 1974 Feb 3 2:00 + -7:00 US M%sT + + # Indiana + # + # For a map of Indiana's time zone regions, see: +-# <a href="http://www.mccsc.edu/time.html"> +-# What time is it in Indiana? +-# </a> (2006-03-01) ++# http://en.wikipedia.org/wiki/Time_in_Indiana + # + # From Paul Eggert (2007-08-17): + # Since 1970, most of Indiana has been like America/Indiana/Indianapolis, + # with the following exceptions: + # + # - Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer, +-# Vandenburgh, and Warrick counties have been like America/Chicago. ++# Vanderburgh, and Warrick counties have been like America/Chicago. + # + # - Dearborn and Ohio counties have been like America/New_York. + # +@@ -712,22 +713,16 @@ + # that they would be ambiguous if we left them at the 'America' level. + # So we reluctantly put them all in a subdirectory 'America/Indiana'. + +-# From Paul Eggert (2005-08-16): +-# http://www.mccsc.edu/time.html says that Indiana will use DST starting 2006. +- +-# From Nathan Stratton Treadway (2006-03-30): +-# http://www.dot.gov/affairs/dot0406.htm [3705 B] +-# From Deborah Goldsmith (2006-01-18): +-# http://dmses.dot.gov/docimages/pdf95/382329_web.pdf [2.9 MB] +-# From Paul Eggert (2006-01-20): +-# It says "DOT is relocating the time zone boundary in Indiana to move Starke, ++# From Paul Eggert (2014-06-26): ++# https://www.federalregister.gov/articles/2006/01/20/06-563/standard-time-zone-boundary-in-the-state-of-indiana ++# says "DOT is relocating the time zone boundary in Indiana to move Starke, + # Pulaski, Knox, Daviess, Martin, Pike, Dubois, and Perry Counties from the + # Eastern Time Zone to the Central Time Zone.... The effective date of +-# this rule is 2:OO a.m. EST Sunday, April 2, 2006, which is the ++# this rule is 2 a.m. EST Sunday, April 2, 2006, which is the + # changeover date from standard time to Daylight Saving Time." +-# Strictly speaking, this means the affected counties will change their +-# clocks twice that night, but this obviously is in error. The intent +-# is that 01:59:59 EST be followed by 02:00:00 CDT. ++# Strictly speaking, this meant the affected counties changed their ++# clocks twice that night, but this obviously was in error. The intent ++# was that 01:59:59 EST be followed by 02:00:00 CDT. + + # From Gwillim Law (2007-02-10): + # The Associated Press has been reporting that Pulaski County, Indiana is +@@ -739,13 +734,13 @@ + Rule Indianapolis 1941 1954 - Sep lastSun 2:00 0 S + Rule Indianapolis 1946 1954 - Apr lastSun 2:00 1:00 D + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Indiana/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:15:22 ++Zone America/Indiana/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:15:22 + -6:00 US C%sT 1920 + -6:00 Indianapolis C%sT 1942 + -6:00 US C%sT 1946 +- -6:00 Indianapolis C%sT 1955 Apr 24 2:00 +- -5:00 - EST 1957 Sep 29 2:00 +- -6:00 - CST 1958 Apr 27 2:00 ++ -6:00 Indianapolis C%sT 1955 Apr 24 2:00 ++ -5:00 - EST 1957 Sep 29 2:00 ++ -6:00 - CST 1958 Apr 27 2:00 + -5:00 - EST 1969 + -5:00 US E%sT 1971 + -5:00 - EST 2006 +@@ -761,10 +756,10 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Marengo -5:45:23 - LMT 1883 Nov 18 12:14:37 + -6:00 US C%sT 1951 +- -6:00 Marengo C%sT 1961 Apr 30 2:00 ++ -6:00 Marengo C%sT 1961 Apr 30 2:00 + -5:00 - EST 1969 +- -5:00 US E%sT 1974 Jan 6 2:00 +- -6:00 1:00 CDT 1974 Oct 27 2:00 ++ -5:00 US E%sT 1974 Jan 6 2:00 ++ -6:00 1:00 CDT 1974 Oct 27 2:00 + -5:00 US E%sT 1976 + -5:00 - EST 2006 + -5:00 US E%sT +@@ -785,11 +780,11 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Vincennes -5:50:07 - LMT 1883 Nov 18 12:09:53 + -6:00 US C%sT 1946 +- -6:00 Vincennes C%sT 1964 Apr 26 2:00 ++ -6:00 Vincennes C%sT 1964 Apr 26 2:00 + -5:00 - EST 1969 + -5:00 US E%sT 1971 +- -5:00 - EST 2006 Apr 2 2:00 +- -6:00 US C%sT 2007 Nov 4 2:00 ++ -5:00 - EST 2006 Apr 2 2:00 ++ -6:00 US C%sT 2007 Nov 4 2:00 + -5:00 US E%sT + # + # Perry County, Indiana, switched from eastern to central time in April 2006. +@@ -806,10 +801,10 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Tell_City -5:47:03 - LMT 1883 Nov 18 12:12:57 + -6:00 US C%sT 1946 +- -6:00 Perry C%sT 1964 Apr 26 2:00 ++ -6:00 Perry C%sT 1964 Apr 26 2:00 + -5:00 - EST 1969 + -5:00 US E%sT 1971 +- -5:00 - EST 2006 Apr 2 2:00 ++ -5:00 - EST 2006 Apr 2 2:00 + -6:00 US C%sT + # + # Pike County, Indiana moved from central to eastern time in 1977, +@@ -822,11 +817,11 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Petersburg -5:49:07 - LMT 1883 Nov 18 12:10:53 + -6:00 US C%sT 1955 +- -6:00 Pike C%sT 1965 Apr 25 2:00 +- -5:00 - EST 1966 Oct 30 2:00 +- -6:00 US C%sT 1977 Oct 30 2:00 +- -5:00 - EST 2006 Apr 2 2:00 +- -6:00 US C%sT 2007 Nov 4 2:00 ++ -6:00 Pike C%sT 1965 Apr 25 2:00 ++ -5:00 - EST 1966 Oct 30 2:00 ++ -6:00 US C%sT 1977 Oct 30 2:00 ++ -5:00 - EST 2006 Apr 2 2:00 ++ -6:00 US C%sT 2007 Nov 4 2:00 + -5:00 US E%sT + # + # Starke County, Indiana moved from central to eastern time in 1991, +@@ -844,10 +839,10 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Knox -5:46:30 - LMT 1883 Nov 18 12:13:30 + -6:00 US C%sT 1947 +- -6:00 Starke C%sT 1962 Apr 29 2:00 +- -5:00 - EST 1963 Oct 27 2:00 +- -6:00 US C%sT 1991 Oct 27 2:00 +- -5:00 - EST 2006 Apr 2 2:00 ++ -6:00 Starke C%sT 1962 Apr 29 2:00 ++ -5:00 - EST 1963 Oct 27 2:00 ++ -6:00 US C%sT 1991 Oct 27 2:00 ++ -5:00 - EST 2006 Apr 2 2:00 + -6:00 US C%sT + # + # Pulaski County, Indiana, switched from eastern to central time in +@@ -860,17 +855,17 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Winamac -5:46:25 - LMT 1883 Nov 18 12:13:35 + -6:00 US C%sT 1946 +- -6:00 Pulaski C%sT 1961 Apr 30 2:00 ++ -6:00 Pulaski C%sT 1961 Apr 30 2:00 + -5:00 - EST 1969 + -5:00 US E%sT 1971 +- -5:00 - EST 2006 Apr 2 2:00 +- -6:00 US C%sT 2007 Mar 11 2:00 ++ -5:00 - EST 2006 Apr 2 2:00 ++ -6:00 US C%sT 2007 Mar 11 2:00 + -5:00 US E%sT + # + # Switzerland County, Indiana, did not observe DST from 1973 through 2005. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Indiana/Vevay -5:40:16 - LMT 1883 Nov 18 12:19:44 +- -6:00 US C%sT 1954 Apr 25 2:00 ++ -6:00 US C%sT 1954 Apr 25 2:00 + -5:00 - EST 1969 + -5:00 US E%sT 1973 + -5:00 - EST 2006 +@@ -891,18 +886,17 @@ + -6:00 US C%sT 1921 + -6:00 Louisville C%sT 1942 + -6:00 US C%sT 1946 +- -6:00 Louisville C%sT 1961 Jul 23 2:00 ++ -6:00 Louisville C%sT 1961 Jul 23 2:00 + -5:00 - EST 1968 +- -5:00 US E%sT 1974 Jan 6 2:00 +- -6:00 1:00 CDT 1974 Oct 27 2:00 ++ -5:00 US E%sT 1974 Jan 6 2:00 ++ -6:00 1:00 CDT 1974 Oct 27 2:00 + -5:00 US E%sT + # + # Wayne County, Kentucky + # +-# From +-# <a href="http://www.lake-cumberland.com/life/archive/news990129time.shtml"> +-# Lake Cumberland LIFE +-# </a> (1999-01-29) via WKYM-101.7: ++# From Lake Cumberland LIFE ++# http://www.lake-cumberland.com/life/archive/news990129time.shtml ++# (1999-01-29) via WKYM-101.7: + # Clinton County has joined Wayne County in asking the DoT to change from + # the Central to the Eastern time zone.... The Wayne County government made + # the same request in December. And while Russell County officials have not +@@ -919,9 +913,8 @@ + # + # From Paul Eggert (2001-07-16): + # The final rule was published in the +-# <a href="http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=2000_register&docid=fr17au00-22"> +-# Federal Register 65, 160 (2000-08-17), page 50154-50158. +-# </a> ++# Federal Register 65, 160 (2000-08-17), pp 50154-50158. ++# http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=2000_register&docid=fr17au00-22 + # + Zone America/Kentucky/Monticello -5:39:24 - LMT 1883 Nov 18 12:20:36 + -6:00 US C%sT 1946 +@@ -946,9 +939,8 @@ + # See America/North_Dakota/Center for the Oliver County, ND change. + # West Wendover, NV officially switched from Pacific to mountain time on + # 1999-10-31. See the +-# <a href="http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=1999_register&docid=fr21oc99-15"> +-# Federal Register 64, 203 (1999-10-21), page 56705-56707. +-# </a> ++# Federal Register 64, 203 (1999-10-21), pp 56705-56707. ++# http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=1999_register&docid=fr21oc99-15 + # However, the Federal Register says that West Wendover already operated + # on mountain time, and the rule merely made this official; + # hence a separate tz entry is not needed. +@@ -986,12 +978,12 @@ + Rule Detroit 1967 only - Oct lastSun 2:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Detroit -5:32:11 - LMT 1905 +- -6:00 - CST 1915 May 15 2:00 ++ -6:00 - CST 1915 May 15 2:00 + -5:00 - EST 1942 + -5:00 US E%sT 1946 + -5:00 Detroit E%sT 1973 + -5:00 US E%sT 1975 +- -5:00 - EST 1975 Apr 27 2:00 ++ -5:00 - EST 1975 Apr 27 2:00 + -5:00 US E%sT + # + # Dickinson, Gogebic, Iron, and Menominee Counties, Michigan, +@@ -1004,8 +996,8 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Menominee -5:50:27 - LMT 1885 Sep 18 12:00 + -6:00 US C%sT 1946 +- -6:00 Menominee C%sT 1969 Apr 27 2:00 +- -5:00 - EST 1973 Apr 29 2:00 ++ -6:00 Menominee C%sT 1969 Apr 27 2:00 ++ -5:00 - EST 1973 Apr 29 2:00 + -6:00 US C%sT + + # Navassa +@@ -1022,19 +1014,19 @@ + ################################################################################ + + +-# From Paul Eggert (2006-03-22): +-# A good source for time zone historical data outside the U.S. is ++# From Paul Eggert (2014-10-31): ++# ++# Unless otherwise specified, the source for data through 1990 is: + # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), + # San Diego: ACS Publications, Inc. (2003). ++# Unfortunately this book contains many errors and cites no sources. + # + # Gwillim Law writes that a good source + # for recent time zone data is the International Air Transport + # Association's Standard Schedules Information Manual (IATA SSIM), + # published semiannually. Law sent in several helpful summaries +-# of the IATA's data after 1990. +-# +-# Except where otherwise noted, Shanks & Pottenger is the source for +-# entries through 1990, and IATA SSIM is the source for entries afterwards. ++# of the IATA's data after 1990. Except where otherwise noted, ++# IATA SSIM is the source for entries after 1990. + # + # Other sources occasionally used include: + # +@@ -1042,9 +1034,9 @@ + # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), + # which I found in the UCLA library. + # +-# <a href="http://www.pettswoodvillage.co.uk/Daylight_Savings_William_Willett.pdf"> + # William Willett, The Waste of Daylight, 19th edition +-# </a> (1914-03) ++# <http://cs.ucla.edu/~eggert/The-Waste-of-Daylight-19th.pdf> ++# [PDF] (1914-03) + # + # Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94 + # <http://www.jstor.org/stable/1774359>. +@@ -1053,11 +1045,11 @@ + + # Canada + +-# From Alain LaBont<e'> (1994-11-14): ++# From Alain LaBonté (1994-11-14): + # I post here the time zone abbreviations standardized in Canada + # for both English and French in the CAN/CSA-Z234.4-89 standard.... + # +-# UTC Standard time Daylight savings time ++# UTC Standard time Daylight saving time + # offset French English French English + # -2:30 - - HAT NDT + # -3 - - HAA ADT +@@ -1070,7 +1062,7 @@ + # -9 HNY YST - - + # + # HN: Heure Normale ST: Standard Time +-# HA: Heure Avanc<e'>e DT: Daylight saving Time ++# HA: Heure Avancée DT: Daylight saving Time + # + # A: de l'Atlantique Atlantic + # C: du Centre Central +@@ -1085,7 +1077,7 @@ + # From Paul Eggert (1994-11-22): + # Alas, this sort of thing must be handled by localization software. + +-# Unless otherwise specified, the data for Canada are all from Shanks ++# Unless otherwise specified, the data entries for Canada are all from Shanks + # & Pottenger. + + # From Chris Walton (2006-04-01, 2006-04-25, 2006-06-26, 2007-01-31, +@@ -1132,17 +1124,16 @@ + # An amendment to the Interpretation Act was registered on February 19/2007.... + # http://action.attavik.ca/home/justice-gn/attach/2007/gaz02part2.pdf + +-# From Paul Eggert (2006-04-25): ++# From Paul Eggert (2014-10-18): + # H. David Matthews and Mary Vincent's map +-# <a href="http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp"> + # "It's about TIME", _Canadian Geographic_ (September-October 1998) +-# </a> contains detailed boundaries for regions observing nonstandard ++# http://www.canadiangeographic.ca/Magazine/SO98/alacarte.asp ++# contains detailed boundaries for regions observing nonstandard + # time and daylight saving time arrangements in Canada circa 1998. + # +-# INMS, the Institute for National Measurement Standards in Ottawa, has <a +-# href="http://inms-ienm.nrc-cnrc.gc.ca/en/time_services/daylight_saving_e.php"> +-# information about standard and daylight saving time zones in Canada. +-# </a> (updated periodically). ++# National Research Council Canada maintains info about time zones and DST. ++# http://www.nrc-cnrc.gc.ca/eng/services/time/time_zones.html ++# http://www.nrc-cnrc.gc.ca/eng/services/time/faq/index.html#Q5 + # Its unofficial information is often taken from Matthews and Vincent. + + # From Paul Eggert (2006-06-27): +@@ -1151,9 +1142,7 @@ + + # From Chris Walton (2011-12-01) + # In the first of Tammy Hardwick's articles +-# <a href="http://www.ilovecreston.com/?p=articles&t=spec&ar=260"> + # http://www.ilovecreston.com/?p=articles&t=spec&ar=260 +-# </a> + # she quotes the Friday November 1/1918 edition of the Creston Review. + # The quote includes these two statements: + # 'Sunday the CPR went back to the old system of time...' +@@ -1221,9 +1210,7 @@ + # Time to Standard Time and from Standard Time to Daylight Savings Time + # now occurs at 2:00AM. + # ... +-# <a href="http://www.assembly.nl.ca/legislation/sr/annualstatutes/2011/1106.chp.htm"> + # http://www.assembly.nl.ca/legislation/sr/annualstatutes/2011/1106.chp.htm +-# </a> + # ... + # MICHAEL PELLEY | Manager of Enterprise Architecture - Solution Delivery + # Office of the Chief Information Officer +@@ -1259,7 +1246,7 @@ + -3:30 - NST 1936 + -3:30 StJohns N%sT 1942 May 11 + -3:30 Canada N%sT 1946 +- -3:30 StJohns N%sT 1966 Mar 15 2:00 ++ -3:30 StJohns N%sT 1966 Mar 15 2:00 + -4:00 StJohns A%sT 2011 Nov + -4:00 Canada A%sT + +@@ -1320,7 +1307,7 @@ + Zone America/Halifax -4:14:24 - LMT 1902 Jun 15 + -4:00 Halifax A%sT 1918 + -4:00 Canada A%sT 1919 +- -4:00 Halifax A%sT 1942 Feb 9 2:00s ++ -4:00 Halifax A%sT 1942 Feb 9 2:00s + -4:00 Canada A%sT 1946 + -4:00 Halifax A%sT 1974 + -4:00 Canada A%sT +@@ -1379,7 +1366,7 @@ + # meridian is supposed to observe AST, but residents as far east as + # Natashquan use EST/EDT, and residents east of Natashquan use AST. + # The Quebec department of justice writes in +-# "The situation in Minganie and Basse-Cote-Nord" ++# "The situation in Minganie and Basse-Côte-Nord" + # http://www.justice.gouv.qc.ca/english/publications/generale/temps-minganie-a.htm + # that the coastal strip from just east of Natashquan to Blanc-Sablon + # observes Atlantic standard time all year round. +@@ -1387,7 +1374,6 @@ + # says this common practice was codified into law as of 2007. + # For lack of better info, guess this practice began around 1970, contra to + # Shanks & Pottenger who have this region observing AST/ADT. +-# for post-1970 data America/Puerto_Rico. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Mont 1917 only - Mar 25 2:00 1:00 D +@@ -1401,18 +1387,10 @@ + Rule Mont 1924 only - May 17 2:00 1:00 D + Rule Mont 1924 1926 - Sep lastSun 2:30 0 S + Rule Mont 1925 1926 - May Sun>=1 2:00 1:00 D +-# The 1927-to-1937 rules can be expressed more simply as +-# Rule Mont 1927 1937 - Apr lastSat 24:00 1:00 D +-# Rule Mont 1927 1937 - Sep lastSat 24:00 0 S +-# The rules below avoid use of 24:00 +-# (which pre-1998 versions of zic cannot handle). +-Rule Mont 1927 only - May 1 0:00 1:00 D +-Rule Mont 1927 1932 - Sep lastSun 0:00 0 S +-Rule Mont 1928 1931 - Apr lastSun 0:00 1:00 D +-Rule Mont 1932 only - May 1 0:00 1:00 D +-Rule Mont 1933 1940 - Apr lastSun 0:00 1:00 D +-Rule Mont 1933 only - Oct 1 0:00 0 S +-Rule Mont 1934 1939 - Sep lastSun 0:00 0 S ++Rule Mont 1927 1937 - Apr lastSat 24:00 1:00 D ++Rule Mont 1927 1937 - Sep lastSat 24:00 0 S ++Rule Mont 1938 1940 - Apr lastSun 0:00 1:00 D ++Rule Mont 1938 1939 - Sep lastSun 0:00 0 S + Rule Mont 1946 1973 - Apr lastSun 2:00 1:00 D + Rule Mont 1945 1948 - Sep lastSun 2:00 0 S + Rule Mont 1949 1950 - Oct lastSun 2:00 0 S +@@ -1426,7 +1404,7 @@ + Zone America/Montreal -4:54:16 - LMT 1884 + -5:00 Mont E%sT 1918 + -5:00 Canada E%sT 1919 +- -5:00 Mont E%sT 1942 Feb 9 2:00s ++ -5:00 Mont E%sT 1942 Feb 9 2:00s + -5:00 Canada E%sT 1946 + -5:00 Mont E%sT 1974 + -5:00 Canada E%sT +@@ -1448,7 +1426,7 @@ + # have already done so. In Orillia DST was to run until Saturday, + # 1912-08-31 (no time mentioned), but it was met with considerable + # hostility from certain segments of the public, and was revoked after +-# only two weeks -- I copied it as Saturday, 1912-07-07, 22:00, but ++# only two weeks - I copied it as Saturday, 1912-07-07, 22:00, but + # presumably that should be -07-06. (1912-06-19, -07-12; also letters + # earlier in June). + # +@@ -1458,10 +1436,8 @@ + # Mark Brader writes that an article in the 1997-10-14 Toronto Star + # says that Atikokan, Ontario currently does not observe DST, + # but will vote on 11-10 whether to use EST/EDT. +-# He also writes that the +-# <a href="http://www.gov.on.ca/MBS/english/publications/statregs/conttext.html"> +-# Ontario Time Act (1990, Chapter T.9) +-# </a> ++# He also writes that the Ontario Time Act (1990, Chapter T.9) ++# http://www.gov.on.ca/MBS/english/publications/statregs/conttext.html + # says that Ontario east of 90W uses EST/EDT, and west of 90W uses CST/CDT. + # Officially Atikokan is therefore on CST/CDT, and most likely this report + # concerns a non-official time observed as a matter of local practice. +@@ -1540,9 +1516,7 @@ + # The Journal of The Royal Astronomical Society of Canada, + # volume 26, number 2 (February 1932) and, as of 2010-07-17, + # was available at +-# <a href="http://adsabs.harvard.edu/full/1932JRASC..26...49S"> + # http://adsabs.harvard.edu/full/1932JRASC..26...49S +-# </a> + # + # It includes the text below (starting on page 57): + # +@@ -1553,26 +1527,26 @@ + # ing in 1930. The information for the province of Quebec is definite, + # for the other provinces only approximate: + # +-# Province Daylight saving time used ++# Province Daylight saving time used + # Prince Edward Island Not used. + # Nova Scotia In Halifax only. + # New Brunswick In St. John only. + # Quebec In the following places: +-# Montreal Lachine +-# Quebec Mont-Royal +-# Levis Iberville +-# St. Lambert Cap de la Madeleine +-# Verdun Loretteville +-# Westmount Richmond +-# Outremont St. Jerome +-# Longueuil Greenfield Park +-# Arvida Waterloo +-# Chambly-Canton Beaulieu +-# Melbourne La Tuque +-# St. Theophile Buckingham ++# Montreal Lachine ++# Quebec Mont-Royal ++# Lévis Iberville ++# St. Lambert Cap de la Madelèine ++# Verdun Loretteville ++# Westmount Richmond ++# Outremont St. Jérôme ++# Longueuil Greenfield Park ++# Arvida Waterloo ++# Chambly-Canton Beaulieu ++# Melbourne La Tuque ++# St. Théophile Buckingham + # Ontario Used generally in the cities and towns along +-# the southerly part of the province. Not +-# used in the northwesterlhy part. ++# the southerly part of the province. Not ++# used in the northwesterly part. + # Manitoba Not used. + # Saskatchewan In Regina only. + # Alberta Not used. +@@ -1641,7 +1615,7 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Toronto -5:17:32 - LMT 1895 + -5:00 Canada E%sT 1919 +- -5:00 Toronto E%sT 1942 Feb 9 2:00s ++ -5:00 Toronto E%sT 1942 Feb 9 2:00s + -5:00 Canada E%sT 1946 + -5:00 Toronto E%sT 1974 + -5:00 Canada E%sT +@@ -1654,16 +1628,16 @@ + -5:00 Canada E%sT + Zone America/Nipigon -5:53:04 - LMT 1895 + -5:00 Canada E%sT 1940 Sep 29 +- -5:00 1:00 EDT 1942 Feb 9 2:00s ++ -5:00 1:00 EDT 1942 Feb 9 2:00s + -5:00 Canada E%sT + Zone America/Rainy_River -6:18:16 - LMT 1895 + -6:00 Canada C%sT 1940 Sep 29 +- -6:00 1:00 CDT 1942 Feb 9 2:00s ++ -6:00 1:00 CDT 1942 Feb 9 2:00s + -6:00 Canada C%sT + Zone America/Atikokan -6:06:28 - LMT 1895 + -6:00 Canada C%sT 1940 Sep 29 +- -6:00 1:00 CDT 1942 Feb 9 2:00s +- -6:00 Canada C%sT 1945 Sep 30 2:00 ++ -6:00 1:00 CDT 1942 Feb 9 2:00s ++ -6:00 Canada C%sT 1945 Sep 30 2:00 + -5:00 - EST + + +@@ -1676,7 +1650,7 @@ + # the first Sunday of April of each year and two o'clock Central + # Standard Time in the morning of the last Sunday of October next + # following, one hour in advance of Central Standard Time."... +-# I believe that the English legislation [of the old time act] had = ++# I believe that the English legislation [of the old time act] had + # been assented to (March 22, 1967).... + # Also, as far as I can tell, there was no order-in-council varying + # the time of Daylight Saving Time for 2005 and so the provisions of +@@ -1799,12 +1773,12 @@ + Rule Swift 1960 1961 - Sep lastSun 2:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Regina -6:58:36 - LMT 1905 Sep +- -7:00 Regina M%sT 1960 Apr lastSun 2:00 ++ -7:00 Regina M%sT 1960 Apr lastSun 2:00 + -6:00 - CST + Zone America/Swift_Current -7:11:20 - LMT 1905 Sep +- -7:00 Canada M%sT 1946 Apr lastSun 2:00 ++ -7:00 Canada M%sT 1946 Apr lastSun 2:00 + -7:00 Regina M%sT 1950 +- -7:00 Swift M%sT 1972 Apr lastSun 2:00 ++ -7:00 Swift M%sT 1972 Apr lastSun 2:00 + -6:00 - CST + + +@@ -1854,9 +1828,7 @@ + # Earlier this year I stumbled across a detailed article about the time + # keeping history of Creston; it was written by Tammy Hardwick who is the + # manager of the Creston & District Museum. The article was written in May 2009. +-# <a href="http://www.ilovecreston.com/?p=articles&t=spec&ar=260"> + # http://www.ilovecreston.com/?p=articles&t=spec&ar=260 +-# </a> + # According to the article, Creston has not changed its clocks since June 1918. + # i.e. Creston has been stuck on UTC-7 for 93 years. + # Dawson Creek, on the other hand, changed its clocks as recently as April 1972. +@@ -1864,18 +1836,16 @@ + # Unfortunately the exact date for the time change in June 1918 remains + # unknown and will be difficult to ascertain. I e-mailed Tammy a few months + # ago to ask if Sunday June 2 was a reasonable guess. She said it was just +-# as plausible as any other date (in June). She also said that after writing the +-# article she had discovered another time change in 1916; this is the subject +-# of another article which she wrote in October 2010. +-# <a href="http://www.creston.museum.bc.ca/index.php?module=comments&uop=view_comment&cm+id=56"> ++# as plausible as any other date (in June). She also said that after writing ++# the article she had discovered another time change in 1916; this is the ++# subject of another article which she wrote in October 2010. + # http://www.creston.museum.bc.ca/index.php?module=comments&uop=view_comment&cm+id=56 +-# </a> + + # Here is a summary of the three clock change events in Creston's history: + # 1. 1884 or 1885: adoption of Mountain Standard Time (GMT-7) + # Exact date unknown + # 2. Oct 1916: switch to Pacific Standard Time (GMT-8) +-# Exact date in October unknown; Sunday October 1 is a reasonable guess. ++# Exact date in October unknown; Sunday October 1 is a reasonable guess. + # 3. June 1918: switch to Pacific Daylight Time (GMT-7) + # Exact date in June unknown; Sunday June 2 is a reasonable guess. + # note#1: +@@ -1888,9 +1858,7 @@ + # There is no guarantee that Creston will remain on Mountain Standard Time + # (UTC-7) forever. + # The subject was debated at least once this year by the town Council. +-# <a href="http://www.bclocalnews.com/kootenay_rockies/crestonvalleyadvance/news/116760809.html"> + # http://www.bclocalnews.com/kootenay_rockies/crestonvalleyadvance/news/116760809.html +-# </a> + + # During a period WWII, summer time (Daylight saying) was mandatory in Canada. + # In Creston, that was handled by shifting the area to PST (-8:00) then applying +@@ -1917,7 +1885,7 @@ + -8:00 Canada P%sT + Zone America/Dawson_Creek -8:00:56 - LMT 1884 + -8:00 Canada P%sT 1947 +- -8:00 Vanc P%sT 1972 Aug 30 2:00 ++ -8:00 Vanc P%sT 1972 Aug 30 2:00 + -7:00 - MST + Zone America/Creston -7:46:04 - LMT 1884 + -7:00 - MST 1916 Oct 1 +@@ -1944,18 +1912,17 @@ + + # From Rives McDow (1999-09-04): + # Nunavut ... moved ... to incorporate the whole territory into one time zone. +-# <a href="http://www.nunatsiaq.com/nunavut/nvt90903_13.html"> + # Nunavut moves to single time zone Oct. 31 +-# </a> ++# http://www.nunatsiaq.com/nunavut/nvt90903_13.html + # + # From Antoine Leca (1999-09-06): + # We then need to create a new timezone for the Kitikmeot region of Nunavut + # to differentiate it from the Yellowknife region. + + # From Paul Eggert (1999-09-20): +-# <a href="http://www.nunavut.com/basicfacts/english/basicfacts_1territory.html"> + # Basic Facts: The New Territory +-# </a> (1999) reports that Pangnirtung operates on eastern time, ++# http://www.nunavut.com/basicfacts/english/basicfacts_1territory.html ++# (1999) reports that Pangnirtung operates on eastern time, + # and that Coral Harbour does not observe DST. We don't know when + # Pangnirtung switched to eastern time; we'll guess 1995. + +@@ -1983,8 +1950,8 @@ + # the current state of affairs. + + # From Michaela Rodrigue, writing in the +-# <a href="http://www.nunatsiaq.com/archives/nunavut991130/nvt91119_17.html"> +-# Nunatsiaq News (1999-11-19)</a>: ++# Nunatsiaq News (1999-11-19): ++# http://www.nunatsiaq.com/archives/nunavut991130/nvt91119_17.html + # Clyde River, Pangnirtung and Sanikiluaq now operate with two time zones, + # central - or Nunavut time - for government offices, and eastern time + # for municipal offices and schools.... Igloolik [was similar but then] +@@ -2002,10 +1969,8 @@ + # Central Time and Southampton Island [in the Central zone] is not + # required to use daylight savings. + +-# From +-# <a href="http://www.nunatsiaq.com/archives/nunavut001130/nvt21110_02.html"> +-# Nunavut now has two time zones +-# </a> (2000-11-10): ++# From <http://www.nunatsiaq.com/archives/nunavut001130/nvt21110_02.html> ++# Nunavut now has two time zones (2000-11-10): + # The Nunavut government would allow its employees in Kugluktuk and + # Cambridge Bay to operate on central time year-round, putting them + # one hour behind the rest of Nunavut for six months during the winter. +@@ -2033,10 +1998,7 @@ + # [Also see <http://www.nunatsiaq.com/nunavut/nvt10309_06.html> (2001-03-09).] + + # From Gwillim Law (2005-05-21): +-# According to maps at +-# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SWE.jpg +-# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SSE.jpg +-# (both dated 2003), and ++# According to ... + # http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp + # (from a 1998 Canadian Geographic article), the de facto and de jure time + # for Southampton Island (at the north end of Hudson Bay) is UTC-5 all year +@@ -2045,9 +2007,11 @@ + # predates the creation of Nunavut, it probably goes back many years.... + # The Inuktitut name of Coral Harbour is Sallit, but it's rarely used. + # +-# From Paul Eggert (2005-07-26): ++# From Paul Eggert (2014-10-17): + # For lack of better information, assume that Southampton Island observed +-# daylight saving only during wartime. ++# daylight saving only during wartime. Gwillim Law's email also ++# mentioned maps now maintained by National Research Council Canada; ++# see above for an up-to-date link. + + # From Chris Walton (2007-03-01): + # ... the community of Resolute (located on Cornwallis Island in +@@ -2096,9 +2060,7 @@ + # used to be the mayor of Resolute Bay and he apparently owns half the + # businesses including "South Camp Inn." This website has some info on + # Aziz: +-# <a href="http://www.uphere.ca/node/493"> + # http://www.uphere.ca/node/493 +-# </a> + # + # I sent Aziz an e-mail asking when Resolute Bay had stopped using + # Eastern Standard Time. +@@ -2136,47 +2098,47 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + # aka Panniqtuuq + Zone America/Pangnirtung 0 - zzz 1921 # trading post est. +- -4:00 NT_YK A%sT 1995 Apr Sun>=1 2:00 +- -5:00 Canada E%sT 1999 Oct 31 2:00 +- -6:00 Canada C%sT 2000 Oct 29 2:00 ++ -4:00 NT_YK A%sT 1995 Apr Sun>=1 2:00 ++ -5:00 Canada E%sT 1999 Oct 31 2:00 ++ -6:00 Canada C%sT 2000 Oct 29 2:00 + -5:00 Canada E%sT + # formerly Frobisher Bay + Zone America/Iqaluit 0 - zzz 1942 Aug # Frobisher Bay est. +- -5:00 NT_YK E%sT 1999 Oct 31 2:00 +- -6:00 Canada C%sT 2000 Oct 29 2:00 ++ -5:00 NT_YK E%sT 1999 Oct 31 2:00 ++ -6:00 Canada C%sT 2000 Oct 29 2:00 + -5:00 Canada E%sT + # aka Qausuittuq + Zone America/Resolute 0 - zzz 1947 Aug 31 # Resolute founded +- -6:00 NT_YK C%sT 2000 Oct 29 2:00 +- -5:00 - EST 2001 Apr 1 3:00 +- -6:00 Canada C%sT 2006 Oct 29 2:00 +- -5:00 - EST 2007 Mar 11 3:00 ++ -6:00 NT_YK C%sT 2000 Oct 29 2:00 ++ -5:00 - EST 2001 Apr 1 3:00 ++ -6:00 Canada C%sT 2006 Oct 29 2:00 ++ -5:00 - EST 2007 Mar 11 3:00 + -6:00 Canada C%sT + # aka Kangiqiniq + Zone America/Rankin_Inlet 0 - zzz 1957 # Rankin Inlet founded +- -6:00 NT_YK C%sT 2000 Oct 29 2:00 +- -5:00 - EST 2001 Apr 1 3:00 ++ -6:00 NT_YK C%sT 2000 Oct 29 2:00 ++ -5:00 - EST 2001 Apr 1 3:00 + -6:00 Canada C%sT + # aka Iqaluktuuttiaq + Zone America/Cambridge_Bay 0 - zzz 1920 # trading post est.? +- -7:00 NT_YK M%sT 1999 Oct 31 2:00 +- -6:00 Canada C%sT 2000 Oct 29 2:00 +- -5:00 - EST 2000 Nov 5 0:00 +- -6:00 - CST 2001 Apr 1 3:00 ++ -7:00 NT_YK M%sT 1999 Oct 31 2:00 ++ -6:00 Canada C%sT 2000 Oct 29 2:00 ++ -5:00 - EST 2000 Nov 5 0:00 ++ -6:00 - CST 2001 Apr 1 3:00 + -7:00 Canada M%sT + Zone America/Yellowknife 0 - zzz 1935 # Yellowknife founded? + -7:00 NT_YK M%sT 1980 + -7:00 Canada M%sT + Zone America/Inuvik 0 - zzz 1953 # Inuvik founded +- -8:00 NT_YK P%sT 1979 Apr lastSun 2:00 ++ -8:00 NT_YK P%sT 1979 Apr lastSun 2:00 + -7:00 NT_YK M%sT 1980 + -7:00 Canada M%sT + Zone America/Whitehorse -9:00:12 - LMT 1900 Aug 20 +- -9:00 NT_YK Y%sT 1966 Jul 1 2:00 ++ -9:00 NT_YK Y%sT 1966 Jul 1 2:00 + -8:00 NT_YK P%sT 1980 + -8:00 Canada P%sT + Zone America/Dawson -9:17:40 - LMT 1900 Aug 20 +- -9:00 NT_YK Y%sT 1973 Oct 28 0:00 ++ -9:00 NT_YK Y%sT 1973 Oct 28 0:00 + -8:00 NT_YK P%sT 1980 + -8:00 Canada P%sT + +@@ -2188,9 +2150,8 @@ + # From Paul Eggert (2001-03-05): + # The Investigation and Analysis Service of the + # Mexican Library of Congress (MLoC) has published a +-# <a href="http://www.cddhcu.gob.mx/bibliot/publica/inveyana/polisoc/horver/"> + # history of Mexican local time (in Spanish) +-# </a>. ++# http://www.cddhcu.gob.mx/bibliot/publica/inveyana/polisoc/horver/ + # + # Here are the discrepancies between Shanks & Pottenger (S&P) and the MLoC. + # (In all cases we go with the MLoC.) +@@ -2235,9 +2196,8 @@ + # -------------- End Forwarded Message -------------- + # From Paul Eggert (1996-06-12): + # For an English translation of the decree, see +-# <a href="http://mexico-travel.com/extra/timezone_eng.html"> + # "Diario Oficial: Time Zone Changeover" (1996-01-04). +-# </a> ++# http://mexico-travel.com/extra/timezone_eng.html + + # From Rives McDow (1998-10-08): + # The State of Quintana Roo has reverted back to central STD and DST times +@@ -2249,7 +2209,7 @@ + # savings time so as to stay on the same time zone as the southern part of + # Arizona year round. + +-# From Jesper Norgaard, translating ++# From Jesper Nørgaard, translating + # <http://www.reforma.com/nacional/articulo/064327/> (2001-01-17): + # In Oaxaca, the 55.000 teachers from the Section 22 of the National + # Syndicate of Education Workers, refuse to apply daylight saving each +@@ -2262,7 +2222,7 @@ + # January 17, 2000 - The Energy Secretary, Ernesto Martens, announced + # that Summer Time will be reduced from seven to five months, starting + # this year.... +-# <http://www.publico.com.mx/scripts/texto3.asp?action=pagina&pag=21&pos=p&secc=naci&date=01/17/2001> ++# http://www.publico.com.mx/scripts/texto3.asp?action=pagina&pag=21&pos=p&secc=naci&date=01/17/2001 + # [translated], says "summer time will ... take effect on the first Sunday + # in May, and end on the last Sunday of September. + +@@ -2270,23 +2230,22 @@ + # The 2001-01-24 traditional Washington Post contained the page one + # story "Timely Issue Divides Mexicans."... + # http://www.washingtonpost.com/wp-dyn/articles/A37383-2001Jan23.html +-# ... Mexico City Mayor Lopez Obrador "...is threatening to keep ++# ... Mexico City Mayor López Obrador "...is threatening to keep + # Mexico City and its 20 million residents on a different time than +-# the rest of the country..." In particular, Lopez Obrador would abolish ++# the rest of the country..." In particular, López Obrador would abolish + # observation of Daylight Saving Time. + +-# <a href="http://www.conae.gob.mx/ahorro/decretohorver2001.html#decre"> + # Official statute published by the Energy Department +-# </a> (2001-02-01) shows Baja and Chihauhua as still using US DST rules, +-# and Sonora with no DST. This was reported by Jesper Norgaard (2001-02-03). ++# http://www.conae.gob.mx/ahorro/decretohorver2001.html#decre ++# (2001-02-01) shows Baja and Chihauhua as still using US DST rules, ++# and Sonora with no DST. This was reported by Jesper Nørgaard (2001-02-03). + + # From Paul Eggert (2001-03-03): + # +-# <a href="http://www.latimes.com/news/nation/20010303/t000018766.html"> ++# http://www.latimes.com/news/nation/20010303/t000018766.html + # James F. Smith writes in today's LA Times +-# </a> + # * Sonora will continue to observe standard time. +-# * Last week Mexico City's mayor Andres Manuel Lopez Obrador decreed that ++# * Last week Mexico City's mayor Andrés Manuel López Obrador decreed that + # the Federal District will not adopt DST. + # * 4 of 16 district leaders announced they'll ignore the decree. + # * The decree does not affect federal-controlled facilities including +@@ -2294,7 +2253,7 @@ + # + # For now we'll assume that the Federal District will bow to federal rules. + +-# From Jesper Norgaard (2001-04-01): ++# From Jesper Nørgaard (2001-04-01): + # I found some references to the Mexican application of daylight + # saving, which modifies what I had already sent you, stating earlier + # that a number of northern Mexican states would go on daylight +@@ -2303,7 +2262,7 @@ + # saving all year) will follow the original decree of president + # Vicente Fox, starting daylight saving May 6, 2001 and ending + # September 30, 2001. +-# References: "Diario de Monterrey" <www.diariodemonterrey.com/index.asp> ++# References: "Diario de Monterrey" <http://www.diariodemonterrey.com/index.asp> + # Palabra <http://palabra.infosel.com/010331/primera/ppri3101.pdf> (2001-03-31) + + # From Reuters (2001-09-04): +@@ -2315,7 +2274,7 @@ + # standard time. "This is so residents of the Federal District are not + # subject to unexpected time changes," a statement from the court said. + +-# From Jesper Norgaard Welen (2002-03-12): ++# From Jesper Nørgaard Welen (2002-03-12): + # ... consulting my local grocery store(!) and my coworkers, they all insisted + # that a new decision had been made to reinstate US style DST in Mexico.... + # http://www.conae.gob.mx/ahorro/horaver2001_m1_2002.html (2002-02-20) +@@ -2329,48 +2288,36 @@ + # > the United States. + # Now this has passed both the Congress and the Senate, so starting from + # 2010, some border regions will be the same: +-# <a href="http://www.signonsandiego.com/news/2009/dec/28/clocks-will-match-both-sides-border/"> + # http://www.signonsandiego.com/news/2009/dec/28/clocks-will-match-both-sides-border/ +-# </a> +-# <a href="http://www.elmananarey.com/diario/noticia/nacional/noticias/empatan_horario_de_frontera_con_eu/621939"> + # http://www.elmananarey.com/diario/noticia/nacional/noticias/empatan_horario_de_frontera_con_eu/621939 +-# </a> + # (Spanish) + # + # Could not find the new law text, but the proposed law text changes are here: +-# <a href="http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/20091210-V.pdf"> + # http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/20091210-V.pdf +-# </a> + # (Gaceta Parlamentaria) + # + # There is also a list of the votes here: +-# <a href="http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/V2-101209.html"> + # http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/V2-101209.html +-# </a> + # + # Our page: +-# <a href="http://www.timeanddate.com/news/time/north-mexico-dst-change.html"> + # http://www.timeanddate.com/news/time/north-mexico-dst-change.html +-# </a> + + # From Arthur David Olson (2010-01-20): + # The page +-# <a href="http://dof.gob.mx/nota_detalle.php?codigo=5127480&fecha=06/01/2010"> + # http://dof.gob.mx/nota_detalle.php?codigo=5127480&fecha=06/01/2010 +-# </a> + # includes this text: + # En los municipios fronterizos de Tijuana y Mexicali en Baja California; +-# Juárez y Ojinaga en Chihuahua; Acuña y Piedras Negras en Coahuila; +-# Anáhuac en Nuevo León; y Nuevo Laredo, Reynosa y Matamoros en +-# Tamaulipas, la aplicación de este horario estacional surtirá efecto +-# desde las dos horas del segundo domingo de marzo y concluirá a las dos ++# Juárez y Ojinaga en Chihuahua; Acuña y Piedras Negras en Coahuila; ++# Anáhuac en Nuevo León; y Nuevo Laredo, Reynosa y Matamoros en ++# Tamaulipas, la aplicación de este horario estacional surtirá efecto ++# desde las dos horas del segundo domingo de marzo y concluirá a las dos + # horas del primer domingo de noviembre. + # En los municipios fronterizos que se encuentren ubicados en la franja +-# fronteriza norte en el territorio comprendido entre la línea +-# internacional y la línea paralela ubicada a una distancia de veinte +-# kilómetros, así como la Ciudad de Ensenada, Baja California, hacia el +-# interior del país, la aplicación de este horario estacional surtirá +-# efecto desde las dos horas del segundo domingo de marzo y concluirá a ++# fronteriza norte en el territorio comprendido entre la línea ++# internacional y la línea paralela ubicada a una distancia de veinte ++# kilómetros, así como la Ciudad de Ensenada, Baja California, hacia el ++# interior del país, la aplicación de este horario estacional surtirá ++# efecto desde las dos horas del segundo domingo de marzo y concluirá a + # las dos horas del primer domingo de noviembre. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -2389,39 +2336,39 @@ + Rule Mexico 2002 max - Apr Sun>=1 2:00 1:00 D + Rule Mexico 2002 max - Oct lastSun 2:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-# Quintana Roo ++# Quintana Roo; represented by Cancún + Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 0:12:56 + -6:00 - CST 1981 Dec 23 + -5:00 Mexico E%sT 1998 Aug 2 2:00 + -6:00 Mexico C%sT +-# Campeche, Yucatan ++# Campeche, Yucatán; represented by Mérida + Zone America/Merida -5:58:28 - LMT 1922 Jan 1 0:01:32 + -6:00 - CST 1981 Dec 23 + -5:00 - EST 1982 Dec 2 + -6:00 Mexico C%sT +-# Coahuila, Durango, Nuevo Leon, Tamaulipas (near US border) ++# Coahuila, Durango, Nuevo León, Tamaulipas (near US border) + Zone America/Matamoros -6:40:00 - LMT 1921 Dec 31 23:20:00 + -6:00 - CST 1988 + -6:00 US C%sT 1989 + -6:00 Mexico C%sT 2010 + -6:00 US C%sT +-# Coahuila, Durango, Nuevo Leon, Tamaulipas (away from US border) ++# Coahuila, Durango, Nuevo León, Tamaulipas (away from US border) + Zone America/Monterrey -6:41:16 - LMT 1921 Dec 31 23:18:44 + -6:00 - CST 1988 + -6:00 US C%sT 1989 + -6:00 Mexico C%sT + # Central Mexico +-Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 0:23:24 ++Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 0:23:24 + -7:00 - MST 1927 Jun 10 23:00 + -6:00 - CST 1930 Nov 15 + -7:00 - MST 1931 May 1 23:00 + -6:00 - CST 1931 Oct + -7:00 - MST 1932 Apr 1 +- -6:00 Mexico C%sT 2001 Sep 30 02:00 ++ -6:00 Mexico C%sT 2001 Sep 30 2:00 + -6:00 - CST 2002 Feb 20 + -6:00 Mexico C%sT + # Chihuahua (near US border) +-Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 0:02:20 ++Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 0:02:20 + -7:00 - MST 1927 Jun 10 23:00 + -6:00 - CST 1930 Nov 15 + -7:00 - MST 1931 May 1 23:00 +@@ -2429,7 +2376,7 @@ + -7:00 - MST 1932 Apr 1 + -6:00 - CST 1996 + -6:00 Mexico C%sT 1998 +- -6:00 - CST 1998 Apr Sun>=1 3:00 ++ -6:00 - CST 1998 Apr Sun>=1 3:00 + -7:00 Mexico M%sT 2010 + -7:00 US M%sT + # Chihuahua (away from US border) +@@ -2441,7 +2388,7 @@ + -7:00 - MST 1932 Apr 1 + -6:00 - CST 1996 + -6:00 Mexico C%sT 1998 +- -6:00 - CST 1998 Apr Sun>=1 3:00 ++ -6:00 - CST 1998 Apr Sun>=1 3:00 + -7:00 Mexico M%sT + # Sonora + Zone America/Hermosillo -7:23:52 - LMT 1921 Dec 31 23:36:08 +@@ -2457,42 +2404,33 @@ + -7:00 - MST + + # From Alexander Krivenyshev (2010-04-21): +-# According to news, Bahía de Banderas (Mexican state of Nayarit) ++# According to news, Bahía de Banderas (Mexican state of Nayarit) + # changed time zone UTC-7 to new time zone UTC-6 on April 4, 2010 (to + # share the same time zone as nearby city Puerto Vallarta, Jalisco). + # + # (Spanish) +-# Bahía de Banderas homologa su horario al del centro del +-# país, a partir de este domingo +-# <a href="http://www.nayarit.gob.mx/notes.asp?id=20748"> ++# Bahía de Banderas homologa su horario al del centro del ++# país, a partir de este domingo + # http://www.nayarit.gob.mx/notes.asp?id=20748 +-# </a> + # +-# Bahía de Banderas homologa su horario con el del Centro del +-# País +-# <a href="http://www.bahiadebanderas.gob.mx/principal/index.php?option=com_content&view=article&id=261:bahia-de-banderas-homologa-su-horario-con-el-del-centro-del-pais&catid=42:comunicacion-social&Itemid=50"> +-# http://www.bahiadebanderas.gob.mx/principal/index.php?option=com_content&view=article&id=261:bahia-de-banderas-homologa-su-horario-con-el-del-centro-del-pais&catid=42:comunicacion-social&Itemid=50" +-# </a> ++# Bahía de Banderas homologa su horario con el del Centro del ++# País ++# http://www.bahiadebanderas.gob.mx/principal/index.php?option=com_content&view=article&id=261:bahia-de-banderas-homologa-su-horario-con-el-del-centro-del-pais&catid=42:comunicacion-social&Itemid=50 + # + # (English) +-# Puerto Vallarta and Bahía de Banderas: One Time Zone +-# <a href="http://virtualvallarta.com/puertovallarta/puertovallarta/localnews/2009-12-03-Puerto-Vallarta-and-Bahia-de-Banderas-One-Time-Zone.shtml"> ++# Puerto Vallarta and Bahía de Banderas: One Time Zone + # http://virtualvallarta.com/puertovallarta/puertovallarta/localnews/2009-12-03-Puerto-Vallarta-and-Bahia-de-Banderas-One-Time-Zone.shtml +-# </a> +-# +-# or +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_mexico08.html"> + # http://www.worldtimezone.com/dst_news/dst_news_mexico08.html +-# </a> + # + # "Mexico's Senate approved the amendments to the Mexican Schedule System that +-# will allow Bahía de Banderas and Puerto Vallarta to share the same time ++# will allow Bahía de Banderas and Puerto Vallarta to share the same time + # zone ..." + # Baja California Sur, Nayarit, Sinaloa + + # From Arthur David Olson (2010-05-01): + # Use "Bahia_Banderas" to keep the name to fourteen characters. + ++# Mazatlán + Zone America/Mazatlan -7:05:40 - LMT 1921 Dec 31 23:54:20 + -7:00 - MST 1927 Jun 10 23:00 + -6:00 - CST 1930 Nov 15 +@@ -2504,6 +2442,7 @@ + -8:00 - PST 1970 + -7:00 Mexico M%sT + ++# Bahía de Banderas + Zone America/Bahia_Banderas -7:01:00 - LMT 1921 Dec 31 23:59:00 + -7:00 - MST 1927 Jun 10 23:00 + -6:00 - CST 1930 Nov 15 +@@ -2513,7 +2452,7 @@ + -6:00 - CST 1942 Apr 24 + -7:00 - MST 1949 Jan 14 + -8:00 - PST 1970 +- -7:00 Mexico M%sT 2010 Apr 4 2:00 ++ -7:00 Mexico M%sT 2010 Apr 4 2:00 + -6:00 Mexico C%sT + + # Baja California (near US border) +@@ -2560,7 +2499,7 @@ + # America/Tijuana only in that it did not observe DST from 1976 + # through 1995. This was as per Shanks (1999). But Shanks & Pottenger say + # Ensenada did not observe DST from 1948 through 1975. Guy Harris reports +-# that the 1987 OAG says "Only Ensenada, Mexicale, San Felipe and ++# that the 1987 OAG says "Only Ensenada, Mexicali, San Felipe and + # Tijuana observe DST," which agrees with Shanks & Pottenger but implies that + # DST-observance was a town-by-town matter back then. This concerns + # data after 1970 so most likely there should be at least one Zone +@@ -2573,7 +2512,7 @@ + ############################################################################### + + # Anguilla +-# See 'southamerica'. ++# See America/Port_of_Spain. + + # Antigua and Barbuda + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +@@ -2609,8 +2548,8 @@ + Rule Barb 1979 only - Sep 30 2:00 0 S + Rule Barb 1980 only - Sep 25 2:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Barbados -3:58:29 - LMT 1924 # Bridgetown +- -3:58:29 - BMT 1932 # Bridgetown Mean Time ++Zone America/Barbados -3:58:29 - LMT 1924 # Bridgetown ++ -3:58:29 - BMT 1932 # Bridgetown Mean Time + -4:00 Barb A%sT + + # Belize +@@ -2640,20 +2579,20 @@ + # http://www.theroyalgazette.com/apps/pbcs.dll/article?AID=/20060529/NEWS/105290135 + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Atlantic/Bermuda -4:19:18 - LMT 1930 Jan 1 2:00 # Hamilton +- -4:00 - AST 1974 Apr 28 2:00 ++Zone Atlantic/Bermuda -4:19:18 - LMT 1930 Jan 1 2:00 # Hamilton ++ -4:00 - AST 1974 Apr 28 2:00 + -4:00 Canada A%sT 1976 + -4:00 US A%sT + + # Cayman Is + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Cayman -5:25:32 - LMT 1890 # Georgetown +- -5:07:11 - KMT 1912 Feb # Kingston Mean Time ++Zone America/Cayman -5:25:32 - LMT 1890 # Georgetown ++ -5:07:11 - KMT 1912 Feb # Kingston Mean Time + -5:00 - EST + + # Costa Rica + +-# Milne gives -5:36:13.3 as San Jose mean time; round to nearest. ++# Milne gives -5:36:13.3 as San José mean time; round to nearest. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule CR 1979 1980 - Feb lastSun 0:00 1:00 D +@@ -2663,10 +2602,10 @@ + # go with Shanks & Pottenger. + Rule CR 1991 only - Jul 1 0:00 0 S + Rule CR 1992 only - Mar 15 0:00 0 S +-# There are too many San Joses elsewhere, so we'll use 'Costa Rica'. ++# There are too many San Josés elsewhere, so we'll use 'Costa Rica'. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Costa_Rica -5:36:13 - LMT 1890 # San Jose +- -5:36:13 - SJMT 1921 Jan 15 # San Jose Mean Time ++Zone America/Costa_Rica -5:36:13 - LMT 1890 # San José ++ -5:36:13 - SJMT 1921 Jan 15 # San José Mean Time + -6:00 CR C%sT + # Coco + # no information; probably like America/Costa_Rica +@@ -2685,8 +2624,8 @@ + # During the game, play-by-play announcer Jim Hunter noted that + # "We'll be losing two hours of sleep...Cuba switched to Daylight Saving + # Time today." (The "two hour" remark referred to losing one hour of +-# sleep on 1999-03-28--when the announcers were in Cuba as it switched +-# to DST--and one more hour on 1999-04-04--when the announcers will have ++# sleep on 1999-03-28 - when the announcers were in Cuba as it switched ++# to DST - and one more hour on 1999-04-04 - when the announcers will have + # returned to Baltimore, which switches on that date.) + + # From Steffen Thorsen (2013-11-11): +@@ -2708,16 +2647,16 @@ + # adjustment in Cuba. We will stay in daylight saving time: + # http://www.granma.cu/espanol/2005/noviembre/mier9/horario.html + +-# From Jesper Norgaard Welen (2006-10-21): ++# From Jesper Nørgaard Welen (2006-10-21): + # An article in GRANMA INTERNACIONAL claims that Cuba will end + # the 3 years of permanent DST next weekend, see + # http://www.granma.cu/ingles/2006/octubre/lun16/43horario.html + # "On Saturday night, October 28 going into Sunday, October 29, at 01:00, +-# watches should be set back one hour -- going back to 00:00 hours -- returning ++# watches should be set back one hour - going back to 00:00 hours - returning + # to the normal schedule.... + + # From Paul Eggert (2007-03-02): +-# http://www.granma.cubaweb.cu/english/news/art89.html, dated yesterday, ++# <http://www.granma.cubaweb.cu/english/news/art89.html>, dated yesterday, + # says Cuban clocks will advance at midnight on March 10. + # For lack of better information, assume Cuba will use US rules, + # except that it switches at midnight standard time as usual. +@@ -2731,10 +2670,10 @@ + # http://www.prensalatina.com.mx/article.asp?ID=%7B4CC32C1B-A9F7-42FB-8A07-8631AFC923AF%7D&language=ES + # http://actualidad.terra.es/sociedad/articulo/cuba_llama_ahorrar_energia_cambio_1957044.htm + # +-# From Alex Kryvenishev (2007-10-25): ++# From Alex Krivenyshev (2007-10-25): + # Here is also article from Granma (Cuba): + # +-# [Regira] el Horario Normal desde el [proximo] domingo 28 de octubre ++# Regirá el Horario Normal desde el próximo domingo 28 de octubre + # http://www.granma.cubaweb.cu/2007/10/24/nacional/artic07.html + # + # http://www.worldtimezone.com/dst_news/dst_news_cuba03.html +@@ -2742,23 +2681,18 @@ + # From Arthur David Olson (2008-03-09): + # I'm in Maryland which is now observing United States Eastern Daylight + # Time. At 9:44 local time I used RealPlayer to listen to +-# <a href="http://media.enet.cu/radioreloj"> + # http://media.enet.cu/radioreloj +-# </a>, a Cuban information station, and heard ++# a Cuban information station, and heard + # the time announced as "ocho cuarenta y cuatro" ("eight forty-four"), + # indicating that Cuba is still on standard time. + + # From Steffen Thorsen (2008-03-12): + # It seems that Cuba will start DST on Sunday, 2007-03-16... + # It was announced yesterday, according to this source (in Spanish): +-# <a href="http://www.nnc.cubaweb.cu/marzo-2008/cien-1-11-3-08.htm"> + # http://www.nnc.cubaweb.cu/marzo-2008/cien-1-11-3-08.htm +-# </a> + # + # Some more background information is posted here: +-# <a href="http://www.timeanddate.com/news/time/cuba-starts-dst-march-16.html"> + # http://www.timeanddate.com/news/time/cuba-starts-dst-march-16.html +-# </a> + # + # The article also says that Cuba has been observing DST since 1963, + # while Shanks (and tzdata) has 1965 as the first date (except in the +@@ -2768,18 +2702,14 @@ + # change some historic records as well. + # + # One example: +-# <a href="http://www.radiohc.cu/espanol/noticias/mar07/11mar/hor.htm"> + # http://www.radiohc.cu/espanol/noticias/mar07/11mar/hor.htm +-# </a> + +-# From Jesper Norgaard Welen (2008-03-13): ++# From Jesper Nørgaard Welen (2008-03-13): + # The Cuban time change has just been confirmed on the most authoritative + # web site, the Granma. Please check out +-# <a href="http://www.granma.cubaweb.cu/2008/03/13/nacional/artic10.html"> + # http://www.granma.cubaweb.cu/2008/03/13/nacional/artic10.html +-# </a> + # +-# Basically as expected after Steffen Thorsens information, the change ++# Basically as expected after Steffen Thorsen's information, the change + # will take place midnight between Saturday and Sunday. + + # From Arthur David Olson (2008-03-12): +@@ -2790,18 +2720,14 @@ + # midnight between Saturday, March 07, 2009 and Sunday, March 08, 2009- + # not on midnight March 14 / March 15 as previously thought. + # +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_cuba05.html"> + # http://www.worldtimezone.com/dst_news/dst_news_cuba05.html + # (in Spanish) +-# </a> + + # From Arthur David Olson (2009-03-09) + # I listened over the Internet to +-# <a href="http://media.enet.cu/readioreloj"> + # http://media.enet.cu/readioreloj +-# </a> + # this morning; when it was 10:05 a. m. here in Bethesda, Maryland the +-# the time was announced as "diez cinco"--the same time as here, indicating ++# the time was announced as "diez cinco" - the same time as here, indicating + # that has indeed switched to DST. Assume second Sunday from 2009 forward. + + # From Steffen Thorsen (2011-03-08): +@@ -2810,42 +2736,30 @@ + # changed at all). + # + # Source: +-# <a href="http://granma.co.cu/2011/03/08/nacional/artic01.html"> + # http://granma.co.cu/2011/03/08/nacional/artic01.html +-# </a> + # + # Our info: +-# <a href="http://www.timeanddate.com/news/time/cuba-starts-dst-2011.html"> + # http://www.timeanddate.com/news/time/cuba-starts-dst-2011.html +-# </a> + # + # From Steffen Thorsen (2011-10-30) + # Cuba will end DST two weeks later this year. Instead of going back + # tonight, it has been delayed to 2011-11-13 at 01:00. + # + # One source (Spanish) +-# <a href="http://www.radioangulo.cu/noticias/cuba/17105-cuba-restablecera-el-horario-del-meridiano-de-greenwich.html"> + # http://www.radioangulo.cu/noticias/cuba/17105-cuba-restablecera-el-horario-del-meridiano-de-greenwich.html +-# </a> + # + # Our page: +-# <a href="http://www.timeanddate.com/news/time/cuba-time-changes-2011.html"> + # http://www.timeanddate.com/news/time/cuba-time-changes-2011.html +-# </a> + # + # From Steffen Thorsen (2012-03-01) + # According to Radio Reloj, Cuba will start DST on Midnight between March + # 31 and April 1. + # + # Radio Reloj has the following info (Spanish): +-# <a href="http://www.radioreloj.cu/index.php/noticias-radio-reloj/71-miscelaneas/7529-cuba-aplicara-el-horario-de-verano-desde-el-1-de-abril"> + # http://www.radioreloj.cu/index.php/noticias-radio-reloj/71-miscelaneas/7529-cuba-aplicara-el-horario-de-verano-desde-el-1-de-abril +-# </a> + # + # Our info on it: +-# <a href="http://www.timeanddate.com/news/time/cuba-starts-dst-2012.html"> + # http://www.timeanddate.com/news/time/cuba-starts-dst-2012.html +-# </a> + + # From Steffen Thorsen (2012-11-03): + # Radio Reloj and many other sources report that Cuba is changing back +@@ -2901,7 +2815,7 @@ + -5:00 Cuba C%sT + + # Dominica +-# See 'southamerica'. ++# See America/Port_of_Spain. + + # Dominican Republic + +@@ -2934,8 +2848,8 @@ + Zone America/Santo_Domingo -4:39:36 - LMT 1890 + -4:40 - SDMT 1933 Apr 1 12:00 # S. Dom. MT + -5:00 DR E%sT 1974 Oct 27 +- -4:00 - AST 2000 Oct 29 02:00 +- -5:00 US E%sT 2000 Dec 3 01:00 ++ -4:00 - AST 2000 Oct 29 2:00 ++ -5:00 US E%sT 2000 Dec 3 1:00 + -4:00 - AST + + # El Salvador +@@ -2946,20 +2860,20 @@ + # There are too many San Salvadors elsewhere, so use America/El_Salvador + # instead of America/San_Salvador. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/El_Salvador -5:56:48 - LMT 1921 # San Salvador ++Zone America/El_Salvador -5:56:48 - LMT 1921 # San Salvador + -6:00 Salv C%sT + + # Grenada + # Guadeloupe +-# St Barthelemy ++# St Barthélemy + # St Martin (French part) +-# See 'southamerica'. ++# See America/Port_of_Spain. + + # Guatemala + # + # From Gwillim Law (2006-04-22), after a heads-up from Oscar van Vlijmen: + # Diario Co Latino, at +-# http://www.diariocolatino.com/internacionales/detalles.asp?NewsID=8079, ++# <http://www.diariocolatino.com/internacionales/detalles.asp?NewsID=8079>, + # says in an article dated 2006-04-19 that the Guatemalan government had + # decided on that date to advance official time by 60 minutes, to lessen the + # impact of the elevated cost of oil.... Daylight saving time will last from +@@ -2967,7 +2881,7 @@ + # From Paul Eggert (2006-06-22): + # The Ministry of Energy and Mines, press release CP-15/2006 + # (2006-04-19), says DST ends at 24:00. See +-# <http://www.sieca.org.gt/Sitio_publico/Energeticos/Doc/Medidas/Cambio_Horario_Nac_190406.pdf>. ++# http://www.sieca.org.gt/Sitio_publico/Energeticos/Doc/Medidas/Cambio_Horario_Nac_190406.pdf + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Guat 1973 only - Nov 25 0:00 1:00 D +@@ -2984,11 +2898,10 @@ + + # Haiti + # From Gwillim Law (2005-04-15): +-# Risto O. Nykanen wrote me that Haiti is now on DST. +-# I searched for confirmation, and I found a +-# <a href="http://www.haitianconsulate.org/time.doc"> press release ++# Risto O. Nykänen wrote me that Haiti is now on DST. ++# I searched for confirmation, and I found a press release + # on the Web page of the Haitian Consulate in Chicago (2005-03-31), +-# </a>. Translated from French, it says: ++# <http://www.haitianconsulate.org/time.doc>. Translated from French, it says: + # + # "The Prime Minister's Communication Office notifies the public in general + # and the press in particular that, following a decision of the Interior +@@ -3065,14 +2978,14 @@ + # <http://www.latribuna.hn/99299.html> that Manuel Zelaya, the president + # of Honduras, refused to back down on this. + +-# From Jesper Norgaard Welen (2006-08-08): ++# From Jesper Nørgaard Welen (2006-08-08): + # It seems that Honduras has returned from DST to standard time this Monday at + # 00:00 hours (prolonging Sunday to 25 hours duration). + # http://www.worldtimezone.com/dst_news/dst_news_honduras04.html + + # From Paul Eggert (2006-08-08): +-# Also see Diario El Heraldo, The country returns to standard time (2006-08-08) +-# <http://www.elheraldo.hn/nota.php?nid=54941&sec=12>. ++# Also see Diario El Heraldo, The country returns to standard time (2006-08-08). ++# http://www.elheraldo.hn/nota.php?nid=54941&sec=12 + # It mentions executive decree 18-2006. + + # From Steffen Thorsen (2006-08-17): +@@ -3099,23 +3012,34 @@ + # Shanks & Pottenger give -5:07:12, but Milne records -5:07:10.41 from an + # unspecified official document, and says "This time is used throughout the + # island". Go with Milne. Round to the nearest second as required by zic. ++# ++# Shanks & Pottenger give April 28 for the 1974 spring-forward transition, but ++# Lance Neita writes that Prime Minister Michael Manley decreed it January 5. ++# Assume Neita meant Jan 6 02:00, the same as the US. Neita also writes that ++# Manley's supporters associated this act with Manley's nickname "Joshua" ++# (recall that in the Bible the sun stood still at Joshua's request), ++# and with the Rod of Correction which Manley said he had received from ++# Haile Selassie, Emperor of Ethiopia. See: ++# Neita L. The politician in all of us. Jamaica Observer 2014-09-20 ++# http://www.jamaicaobserver.com/columns/The-politician-in-all-of-us_17573647 ++# + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Jamaica -5:07:11 - LMT 1890 # Kingston ++Zone America/Jamaica -5:07:11 - LMT 1890 # Kingston + -5:07:11 - KMT 1912 Feb # Kingston Mean Time +- -5:00 - EST 1974 Apr 28 2:00 ++ -5:00 - EST 1974 + -5:00 US E%sT 1984 + -5:00 - EST + + # Martinique + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Martinique -4:04:20 - LMT 1890 # Fort-de-France +- -4:04:20 - FFMT 1911 May # Fort-de-France MT ++Zone America/Martinique -4:04:20 - LMT 1890 # Fort-de-France ++ -4:04:20 - FFMT 1911 May # Fort-de-France MT + -4:00 - AST 1980 Apr 6 + -4:00 1:00 ADT 1980 Sep 28 + -4:00 - AST + + # Montserrat +-# See 'southamerica'. ++# See America/Port_of_Spain. + + # Nicaragua + # +@@ -3138,27 +3062,27 @@ + # From Gwillim Law (2005-04-21): + # The Associated Press story on the time change, which can be found at + # http://www.lapalmainteractivo.com/guias/content/gen/ap/America_Latina/AMC_GEN_NICARAGUA_HORA.html +-# and elsewhere, says (fifth paragraph, translated from Spanish): "The last ++# and elsewhere, says (fifth paragraph, translated from Spanish): "The last + # time that a change of clocks was applied to save energy was in the year 2000 +-# during the Arnoldo Aleman administration."... ++# during the Arnoldo Alemán administration."... + # The northamerica file says that Nicaragua has been on UTC-6 continuously + # since December 1998. I wasn't able to find any details of Nicaraguan time + # changes in 2000. Perhaps a note could be added to the northamerica file, to + # the effect that we have indirect evidence that DST was observed in 2000. + # +-# From Jesper Norgaard Welen (2005-11-02): ++# From Jesper Nørgaard Welen (2005-11-02): + # Nicaragua left DST the 2005-10-02 at 00:00 (local time). + # http://www.presidencia.gob.ni/presidencia/files_index/secretaria/comunicados/2005/septiembre/26septiembre-cambio-hora.htm + # (2005-09-26) + # +-# From Jesper Norgaard Welen (2006-05-05): ++# From Jesper Nørgaard Welen (2006-05-05): + # http://www.elnuevodiario.com.ni/2006/05/01/nacionales/18410 + # (my informal translation) +-# By order of the president of the republic, Enrique Bolanos, Nicaragua ++# By order of the president of the republic, Enrique Bolaños, Nicaragua + # advanced by sixty minutes their official time, yesterday at 2 in the +-# morning, and will stay that way until 30.th. of september. ++# morning, and will stay that way until 30th of September. + # +-# From Jesper Norgaard Welen (2006-09-30): ++# From Jesper Nørgaard Welen (2006-09-30): + # http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2006/D-063-2006P-PRN-Cambio-Hora.pdf + # My informal translation runs: + # The natural sun time is restored in all the national territory, in that the +@@ -3176,7 +3100,7 @@ + -5:45:12 - MMT 1934 Jun 23 # Managua Mean Time? + -6:00 - CST 1973 May + -5:00 - EST 1975 Feb 16 +- -6:00 Nic C%sT 1992 Jan 1 4:00 ++ -6:00 Nic C%sT 1992 Jan 1 4:00 + -5:00 - EST 1992 Sep 24 + -6:00 - CST 1993 + -5:00 - EST 1997 +@@ -3185,36 +3109,36 @@ + # Panama + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Panama -5:18:08 - LMT 1890 +- -5:19:36 - CMT 1908 Apr 22 # Colon Mean Time ++ -5:19:36 - CMT 1908 Apr 22 # Colón Mean Time + -5:00 - EST + + # Puerto Rico + # There are too many San Juans elsewhere, so we'll use 'Puerto_Rico'. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12:00 # San Juan ++Zone America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12:00 # San Juan + -4:00 - AST 1942 May 3 + -4:00 US A%sT 1946 + -4:00 - AST + + # St Kitts-Nevis + # St Lucia +-# See 'southamerica'. ++# See America/Port_of_Spain. + + # St Pierre and Miquelon + # There are too many St Pierres elsewhere, so we'll use 'Miquelon'. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Miquelon -3:44:40 - LMT 1911 May 15 # St Pierre ++Zone America/Miquelon -3:44:40 - LMT 1911 May 15 # St Pierre + -4:00 - AST 1980 May + -3:00 - PMST 1987 # Pierre & Miquelon Time + -3:00 Canada PM%sT + + # St Vincent and the Grenadines +-# See 'southamerica'. ++# See America/Port_of_Spain. + + # Turks and Caicos + # + # From Chris Dunn in +-# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=415007> ++# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=415007 + # (2007-03-15): In the Turks & Caicos Islands (America/Grand_Turk) the + # daylight saving dates for time changes have been adjusted to match + # the recent U.S. change of dates. +@@ -3227,21 +3151,27 @@ + # Clocks are set back one hour at 2:00 a.m. local Daylight Saving Time" + # indicating that the normal ET rules are followed. + # +-# From Paul Eggert (2006-05-01): +-# Shanks & Pottenger say they use US DST rules, but IATA SSIM (1991/1998) +-# says they switch at midnight. Go with Shanks & Pottenger. ++# From Paul Eggert (2014-08-19): ++# The 2014-08-13 Cabinet meeting decided to stay on UTC-4 year-round. See: ++# http://tcweeklynews.com/daylight-savings-time-to-be-maintained-p5353-127.htm ++# Model this as a switch from EST/EDT to AST ... ++# From Chris Walton (2014-11-04): ++# ... the TCI government appears to have delayed the switch to ++# "permanent daylight saving time" by one year.... ++# http://tcweeklynews.com/time-change-to-go-ahead-this-november-p5437-127.htm + # +-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule TC 1979 1986 - Apr lastSun 2:00 1:00 D +-Rule TC 1979 2006 - Oct lastSun 2:00 0 S +-Rule TC 1987 2006 - Apr Sun>=1 2:00 1:00 D +-Rule TC 2007 max - Mar Sun>=8 2:00 1:00 D +-Rule TC 2007 max - Nov Sun>=1 2:00 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Grand_Turk -4:44:32 - LMT 1890 +- -5:07:11 - KMT 1912 Feb # Kingston Mean Time +- -5:00 TC E%sT ++ -5:07:11 - KMT 1912 Feb # Kingston Mean Time ++ -5:00 - EST 1979 ++ -5:00 US E%sT 2015 Nov Sun>=1 2:00 ++ -4:00 - AST + + # British Virgin Is + # Virgin Is +-# See 'southamerica'. ++# See America/Port_of_Spain. ++ ++ ++# Local Variables: ++# coding: utf-8 ++# End: +--- ./jdk/make/sun/javazic/tzdata/pacificnew Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/pacificnew Mon Jan 05 11:57:27 2015 -0800 +@@ -21,7 +21,6 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +--- ./jdk/make/sun/javazic/tzdata/southamerica Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/southamerica Mon Jan 05 11:57:27 2015 -0800 +@@ -21,31 +21,31 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +-# This data is by no means authoritative; if you think you know better, ++# This file is by no means authoritative; if you think you know better, + # go ahead and edit the file (and please send any changes to +-# tz@iana.org for general use in the future). ++# tz@iana.org for general use in the future). For more, please see ++# the file CONTRIBUTING in the tz distribution. + +-# From Paul Eggert (2006-03-22): +-# A good source for time zone historical data outside the U.S. is ++# From Paul Eggert (2014-10-31): ++# ++# Unless otherwise specified, the source for data through 1990 is: + # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), + # San Diego: ACS Publications, Inc. (2003). +-# +-# For data circa 1899, a common source is: +-# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94 +-# <http://www.jstor.org/stable/1774359>. ++# Unfortunately this book contains many errors and cites no sources. + # + # Gwillim Law writes that a good source + # for recent time zone data is the International Air Transport + # Association's Standard Schedules Information Manual (IATA SSIM), + # published semiannually. Law sent in several helpful summaries +-# of the IATA's data after 1990. ++# of the IATA's data after 1990. Except where otherwise noted, ++# IATA SSIM is the source for entries after 1990. + # +-# Except where otherwise noted, Shanks & Pottenger is the source for +-# entries through 1990, and IATA SSIM is the source for entries afterwards. ++# For data circa 1899, a common source is: ++# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94. ++# http://www.jstor.org/stable/1774359 + # + # Earlier editions of these tables used the North American style (e.g. ARST and + # ARDT for Argentine Standard and Daylight Time), but the following quote +@@ -53,24 +53,24 @@ + # I suggest the use of _Summer time_ instead of the more cumbersome + # _daylight-saving time_. _Summer time_ seems to be in general use + # in Europe and South America. +-# -- E O Cutler, _New York Times_ (1937-02-14), quoted in ++# -- E O Cutler, _New York Times_ (1937-02-14), quoted in + # H L Mencken, _The American Language: Supplement I_ (1960), p 466 + # + # Earlier editions of these tables also used the North American style + # for time zones in Brazil, but this was incorrect, as Brazilians say +-# "summer time". Reinaldo Goulart, a Sao Paulo businessman active in ++# "summer time". Reinaldo Goulart, a São Paulo businessman active in + # the railroad sector, writes (1999-07-06): + # The subject of time zones is currently a matter of discussion/debate in +-# Brazil. Let's say that "the Brasilia time" is considered the +-# "official time" because Brasilia is the capital city. +-# The other three time zones are called "Brasilia time "minus one" or ++# Brazil. Let's say that "the Brasília time" is considered the ++# "official time" because Brasília is the capital city. ++# The other three time zones are called "Brasília time "minus one" or + # "plus one" or "plus two". As far as I know there is no such + # name/designation as "Eastern Time" or "Central Time". + # So I invented the following (English-language) abbreviations for now. + # Corrections are welcome! + # std dst + # -2:00 FNT FNST Fernando de Noronha +-# -3:00 BRT BRST Brasilia ++# -3:00 BRT BRST Brasília + # -4:00 AMT AMST Amazon + # -5:00 ACT ACST Acre + +@@ -84,7 +84,7 @@ + # Argentina: first Sunday in October to first Sunday in April since 1976. + # Double Summer time from 1969 to 1974. Switches at midnight. + +-# From U. S. Naval Observatory (1988-01-199): ++# From U. S. Naval Observatory (1988-01-19): + # ARGENTINA 3 H BEHIND UTC + + # From Hernan G. Otero (1995-06-26): +@@ -118,7 +118,7 @@ + # From Hernan G. Otero (1995-06-26): + # These corrections were contributed by InterSoft Argentina S.A., + # obtaining the data from the: +-# Talleres de Hidrografia Naval Argentina ++# Talleres de Hidrografía Naval Argentina + # (Argentine Naval Hydrography Institute) + Rule Arg 1989 1993 - Mar Sun>=1 0:00 0 - + Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 S +@@ -140,13 +140,13 @@ + Rule Arg 2000 only - Mar 3 0:00 0 - + # + # From Peter Gradelski via Steffen Thorsen (2000-03-01): +-# We just checked with our Sao Paulo office and they say the government of ++# We just checked with our São Paulo office and they say the government of + # Argentina decided not to become one of the countries that go on or off DST. + # So Buenos Aires should be -3 hours from GMT at all times. + # +-# From Fabian L. Arce Jofre (2000-04-04): ++# From Fabián L. Arce Jofré (2000-04-04): + # The law that claimed DST for Argentina was derogated by President Fernando +-# de la Rua on March 2, 2000, because it would make people spend more energy ++# de la Rúa on March 2, 2000, because it would make people spend more energy + # in the winter time, rather than less. The change took effect on March 3. + # + # From Mariano Absatz (2001-06-06): +@@ -179,15 +179,13 @@ + # that Argentina will use DST next year as well, from October to + # March, although exact rules are not given. + # +-# From Jesper Norgaard Welen (2007-12-26) ++# From Jesper Nørgaard Welen (2007-12-26) + # The last hurdle of Argentina DST is over, the proposal was approved in +-# the lower chamber too (Deputados) with a vote 192 for and 2 against. ++# the lower chamber too (Diputados) with a vote 192 for and 2 against. + # By the way thanks to Mariano Absatz and Daniel Mario Vega for the link to + # the original scanned proposal, where the dates and the zero hours are + # clear and unambiguous...This is the article about final approval: +-# <a href="http://www.lanacion.com.ar/politica/nota.asp?nota_id=973996"> + # http://www.lanacion.com.ar/politica/nota.asp?nota_id=973996 +-# </a> + # + # From Paul Eggert (2007-12-22): + # For dates after mid-2008, the following rules are my guesses and +@@ -197,13 +195,8 @@ + # As per message from Carlos Alberto Fonseca Arauz (Nicaragua), + # Argentina will start DST on Sunday October 19, 2008. + # +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_argentina03.html"> + # http://www.worldtimezone.com/dst_news/dst_news_argentina03.html +-# </a> +-# OR +-# <a href="http://www.impulsobaires.com.ar/nota.php?id=57832 (in spanish)"> + # http://www.impulsobaires.com.ar/nota.php?id=57832 (in spanish) +-# </a> + + # From Rodrigo Severo (2008-10-06): + # Here is some info available at a Gentoo bug related to TZ on Argentina's DST: +@@ -212,48 +205,39 @@ + # Hi, there is a problem with timezone-data-2008e and maybe with + # timezone-data-2008f + # Argentinian law [Number] 25.155 is no longer valid. +-# <a href="http://www.infoleg.gov.ar/infolegInternet/anexos/60000-64999/60036/norma.htm"> + # http://www.infoleg.gov.ar/infolegInternet/anexos/60000-64999/60036/norma.htm +-# </a> + # The new one is law [Number] 26.350 +-# <a href="http://www.infoleg.gov.ar/infolegInternet/anexos/135000-139999/136191/norma.htm"> + # http://www.infoleg.gov.ar/infolegInternet/anexos/135000-139999/136191/norma.htm +-# </a> + # So there is no summer time in Argentina for now. + + # From Mariano Absatz (2008-10-20): +-# Decree 1693/2008 applies Law 26.350 for the summer 2008/2009 establishing DST in Argentina +-# From 2008-10-19 until 2009-03-15 +-# <a href="http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=16102008&pi=3&pf=4&s=0&sec=01"> ++# Decree 1693/2008 applies Law 26.350 for the summer 2008/2009 establishing DST ++# in Argentina from 2008-10-19 until 2009-03-15. + # http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=16102008&pi=3&pf=4&s=0&sec=01 +-# </a> + # +-# Decree 1705/2008 excepting 12 Provinces from applying DST in the summer 2008/2009: +-# Catamarca, La Rioja, Mendoza, Salta, San Juan, San Luis, La Pampa, Neuquen, Rio Negro, Chubut, Santa Cruz +-# and Tierra del Fuego +-# <a href="http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=17102008&pi=1&pf=1&s=0&sec=01"> ++ ++# Decree 1705/2008 excepting 12 Provinces from applying DST in the summer ++# 2008/2009: Catamarca, La Rioja, Mendoza, Salta, San Juan, San Luis, La ++# Pampa, Neuquén, Rio Negro, Chubut, Santa Cruz and Tierra del Fuego + # http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=17102008&pi=1&pf=1&s=0&sec=01 +-# </a> + # +-# Press release 235 dated Saturday October 18th, from the Government of the Province of Jujuy saying +-# it will not apply DST either (even when it was not included in Decree 1705/2008) +-# <a href="http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc"> ++# Press release 235 dated Saturday October 18th, from the Government of the ++# Province of Jujuy saying it will not apply DST either (even when it was not ++# included in Decree 1705/2008). + # http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc +-# </a> + + # From fullinet (2009-10-18): + # As announced in +-# <a hef="http://www.argentina.gob.ar/argentina/portal/paginas.dhtml?pagina=356"> + # http://www.argentina.gob.ar/argentina/portal/paginas.dhtml?pagina=356 +-# </a> +-# (an official .gob.ar) under title: "Sin Cambio de Hora" (english: "No hour change") ++# (an official .gob.ar) under title: "Sin Cambio de Hora" ++# (English: "No hour change"). + # +-# "Por el momento, el Gobierno Nacional resolvio no modificar la hora +-# oficial, decision que estaba en estudio para su implementacion el +-# domingo 18 de octubre. Desde el Ministerio de Planificacion se anuncio +-# que la Argentina hoy, en estas condiciones meteorologicas, no necesita +-# la modificacion del huso horario, ya que 2009 nos encuentra con +-# crecimiento en la produccion y distribucion energetica." ++# "Por el momento, el Gobierno Nacional resolvió no modificar la hora ++# oficial, decisión que estaba en estudio para su implementación el ++# domingo 18 de octubre. Desde el Ministerio de Planificación se anunció ++# que la Argentina hoy, en estas condiciones meteorológicas, no necesita ++# la modificación del huso horario, ya que 2009 nos encuentra con ++# crecimiento en la producción y distribución energética." + + Rule Arg 2007 only - Dec 30 0:00 1:00 S + Rule Arg 2008 2009 - Mar Sun>=15 0:00 0 - +@@ -267,10 +251,10 @@ + # It's Law No. 7,210. This change is due to a public power emergency, so for + # now we'll assume it's for this year only. + # +-# From Paul Eggert (2006-03-22): +-# <a href="http://www.spicasc.net/horvera.html"> +-# Hora de verano para la Republica Argentina (2003-06-08) +-# </a> says that standard time in Argentina from 1894-10-31 ++# From Paul Eggert (2014-08-09): ++# Hora de verano para la República Argentina ++# http://buenasiembra.com.ar/esoterismo/astrologia/hora-de-verano-de-la-republica-argentina-27.html ++# says that standard time in Argentina from 1894-10-31 + # to 1920-05-01 was -4:16:48.25. Go with this more-precise value + # over Shanks & Pottenger. + # +@@ -285,10 +269,10 @@ + # time in October 17th. + # + # Catamarca, Chubut, La Rioja, San Juan, San Luis, Santa Cruz, +-# Tierra del Fuego, Tucuman. ++# Tierra del Fuego, Tucumán. + # + # From Mariano Absatz (2004-06-14): +-# ... this weekend, the Province of Tucuman decided it'd go back to UTC-03:00 ++# ... this weekend, the Province of Tucumán decided it'd go back to UTC-03:00 + # yesterday midnight (that is, at 24:00 Saturday 12th), since the people's + # annoyance with the change is much higher than the power savings obtained.... + # +@@ -323,49 +307,38 @@ + # Here are articles that Argentina Province San Luis is planning to end DST + # as earlier as upcoming Monday January 21, 2008 or February 2008: + # +-# Provincia argentina retrasa reloj y marca diferencia con resto del pais ++# Provincia argentina retrasa reloj y marca diferencia con resto del país + # (Argentine Province delayed clock and mark difference with the rest of the + # country) +-# <a href="http://cl.invertia.com/noticias/noticia.aspx?idNoticia=200801171849_EFE_ET4373&idtel"> + # http://cl.invertia.com/noticias/noticia.aspx?idNoticia=200801171849_EFE_ET4373&idtel +-# </a> + # + # Es inminente que en San Luis atrasen una hora los relojes + # (It is imminent in San Luis clocks one hour delay) +-# <a href="http://www.lagaceta.com.ar/vernotae.asp?id_nota=253414"> +-# http://www.lagaceta.com.ar/vernotae.asp?id_nota=253414 +-# </a> +-# +-# <a href="http://www.worldtimezone.net/dst_news/dst_news_argentina02.html"> ++# http://www.lagaceta.com.ar/nota/253414/Economia/Es-inminente-que-en-San-Luis-atrasen-una-hora-los-relojes.html + # http://www.worldtimezone.net/dst_news/dst_news_argentina02.html +-# </a> + +-# From Jesper Norgaard Welen (2008-01-18): ++# From Jesper Nørgaard Welen (2008-01-18): + # The page of the San Luis provincial government +-# <a href="http://www.sanluis.gov.ar/notas.asp?idCanal=0&id=22812"> + # http://www.sanluis.gov.ar/notas.asp?idCanal=0&id=22812 +-# </a> + # confirms what Alex Krivenyshev has earlier sent to the tz + # emailing list about that San Luis plans to return to standard + # time much earlier than the rest of the country. It also + # confirms that upon request the provinces San Juan and Mendoza + # refused to follow San Luis in this change. + # +-# The change is supposed to take place Monday the 21.st at 0:00 ++# The change is supposed to take place Monday the 21st at 0:00 + # hours. As far as I understand it if this goes ahead, we need + # a new timezone for San Luis (although there are also documented + # independent changes in the southamerica file of San Luis in + # 1990 and 1991 which has not been confirmed). + +-# From Jesper Norgaard Welen (2008-01-25): ++# From Jesper Nørgaard Welen (2008-01-25): + # Unfortunately the below page has become defunct, about the San Luis + # time change. Perhaps because it now is part of a group of pages "Most + # important pages of 2008." + # + # You can use +-# <a href="http://www.sanluis.gov.ar/notas.asp?idCanal=8141&id=22834"> + # http://www.sanluis.gov.ar/notas.asp?idCanal=8141&id=22834 +-# </a> + # instead it seems. Or use "Buscador" from the main page of the San Luis + # government, and fill in "huso" and click OK, and you will get 3 pages + # from which the first one is identical to the above. +@@ -385,9 +358,9 @@ + # back in 2004, when these provinces changed to UTC-4 for a few days, I + # mailed them personally and never got an answer). + +-# From Paul Eggert (2008-06-30): +-# Unless otherwise specified, data are from Shanks & Pottenger through 1992, +-# from the IATA otherwise. As noted below, Shanks & Pottenger say that ++# From Paul Eggert (2014-08-12): ++# Unless otherwise specified, data entries are from Shanks & Pottenger through ++# 1992, from the IATA otherwise. As noted below, Shanks & Pottenger say that + # America/Cordoba split into 6 subregions during 1991/1992, one of which + # was America/San_Luis, but we haven't verified this yet so for now we'll + # keep America/Cordoba a single region rather than splitting it into the +@@ -399,14 +372,9 @@ + # to utc-04:00 until the second Saturday in October... + # + # The press release is at +-# <a href="http://www.sanluis.gov.ar/SL/Paginas/NoticiaDetalle.asp?TemaId=1&InfoPrensaId=3102"> + # http://www.sanluis.gov.ar/SL/Paginas/NoticiaDetalle.asp?TemaId=1&InfoPrensaId=3102 +-# </a> +-# (I couldn't find the decree, but +-# <a href="http://www.sanluis.gov.ar"> +-# www.sanluis.gov.ar +-# <a/> +-# is the official page for the Province Government). ++# (I couldn't find the decree, but www.sanluis.gov.ar ++# is the official page for the Province Government.) + # + # There's also a note in only one of the major national papers ... + # http://www.lanacion.com.ar/nota.asp?nota_id=1107912 +@@ -423,9 +391,7 @@ + # ...the Province of San Luis is a case in itself. + # + # The Law at +-# <a href="http://www.diputadossanluis.gov.ar/diputadosasp/paginas/verNorma.asp?NormaID=276>" + # http://www.diputadossanluis.gov.ar/diputadosasp/paginas/verNorma.asp?NormaID=276 +-# </a> + # is ambiguous because establishes a calendar from the 2nd Sunday in + # October at 0:00 thru the 2nd Saturday in March at 24:00 and the + # complement of that starting on the 2nd Sunday of March at 0:00 and +@@ -454,19 +420,15 @@ + # ... + + # From Alexander Krivenyshev (2010-04-09): +-# According to news reports from El Diario de la Republica Province San ++# According to news reports from El Diario de la República Province San + # Luis, Argentina (standard time UTC-04) will keep Daylight Saving Time +-# after April 11, 2010--will continue to have same time as rest of ++# after April 11, 2010 - will continue to have same time as rest of + # Argentina (UTC-3) (no DST). + # +-# Confirmaron la prórroga del huso horario de verano (Spanish) +-# <a href="http://www.eldiariodelarepublica.com/index.php?option=com_content&task=view&id=29383&Itemid=9"> ++# Confirmaron la prórroga del huso horario de verano (Spanish) + # http://www.eldiariodelarepublica.com/index.php?option=com_content&task=view&id=29383&Itemid=9 +-# </a> + # or (some English translation): +-# <a href="http://www.worldtimezone.com/dst_news/dst_news_argentina08.html"> + # http://www.worldtimezone.com/dst_news/dst_news_argentina08.html +-# </a> + + # From Mariano Absatz (2010-04-12): + # yes...I can confirm this...and given that San Luis keeps calling +@@ -478,7 +440,7 @@ + # Perhaps San Luis operates on the legal fiction that it is at UTC-4 + # with perpetual summer time, but ordinary usage typically seems to + # just say it's at UTC-3; see, for example, +-# <http://es.wikipedia.org/wiki/Hora_oficial_argentina>. ++# http://es.wikipedia.org/wiki/Hora_oficial_argentina + # We've documented similar situations as being plain changes to + # standard time, so let's do that here too. This does not change UTC + # offsets, only tm_isdst and the time zone abbreviations. One minor +@@ -486,20 +448,20 @@ + # setting for time stamps past 2038. + + # From Paul Eggert (2013-02-21): +-# Milne says Cordoba time was -4:16:48.2. Round to the nearest second. ++# Milne says Córdoba time was -4:16:48.2. Round to the nearest second. + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + # + # Buenos Aires (BA), Capital Federal (CF), +-Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31 +- -4:16:48 - CMT 1920 May # Cordoba Mean Time ++Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31 ++ -4:16:48 - CMT 1920 May # Córdoba Mean Time + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1999 Oct 3 + -4:00 Arg AR%sT 2000 Mar 3 + -3:00 Arg AR%sT + # +-# Cordoba (CB), Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), ++# Córdoba (CB), Santa Fe (SF), Entre Ríos (ER), Corrientes (CN), Misiones (MN), + # Chaco (CC), Formosa (FM), Santiago del Estero (SE) + # + # Shanks & Pottenger also make the following claims, which we haven't verified: +@@ -519,7 +481,7 @@ + -4:00 Arg AR%sT 2000 Mar 3 + -3:00 Arg AR%sT + # +-# Salta (SA), La Pampa (LP), Neuquen (NQ), Rio Negro (RN) ++# Salta (SA), La Pampa (LP), Neuquén (NQ), Rio Negro (RN) + Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31 + -4:16:48 - CMT 1920 May + -4:00 - ART 1930 Dec +@@ -531,7 +493,7 @@ + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART + # +-# Tucuman (TM) ++# Tucumán (TM) + Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31 + -4:16:48 - CMT 1920 May + -4:00 - ART 1930 Dec +@@ -642,8 +604,8 @@ + -3:00 - ART + # + # Santa Cruz (SC) +-Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31 +- -4:16:48 - CMT 1920 May # Cordoba Mean Time ++Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31 ++ -4:16:48 - CMT 1920 May # Córdoba Mean Time + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1999 Oct 3 +@@ -653,9 +615,9 @@ + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART + # +-# Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF) +-Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31 +- -4:16:48 - CMT 1920 May # Cordoba Mean Time ++# Tierra del Fuego, Antártida e Islas del Atlántico Sur (TF) ++Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31 ++ -4:16:48 - CMT 1920 May # Córdoba Mean Time + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1999 Oct 3 +@@ -686,13 +648,13 @@ + + # From IATA SSIM (1996-02): + # _Only_ the following states in BR1 observe DST: Rio Grande do Sul (RS), +-# Santa Catarina (SC), Parana (PR), Sao Paulo (SP), Rio de Janeiro (RJ), +-# Espirito Santo (ES), Minas Gerais (MG), Bahia (BA), Goias (GO), ++# Santa Catarina (SC), Paraná (PR), São Paulo (SP), Rio de Janeiro (RJ), ++# Espírito Santo (ES), Minas Gerais (MG), Bahia (BA), Goiás (GO), + # Distrito Federal (DF), Tocantins (TO), Sergipe [SE] and Alagoas [AL]. + # [The last three states are new to this issue of the IATA SSIM.] + + # From Gwillim Law (1996-10-07): +-# Geography, history (Tocantins was part of Goias until 1989), and other ++# Geography, history (Tocantins was part of Goiás until 1989), and other + # sources of time zone information lead me to believe that AL, SE, and TO were + # always in BR1, and so the only change was whether or not they observed DST.... + # The earliest issue of the SSIM I have is 2/91. Each issue from then until +@@ -706,16 +668,14 @@ + # However, some conclusions can be drawn from another IATA manual: the Airline + # Coding Directory, which lists close to 400 airports in Brazil. For each + # airport it gives a time zone which is coded to the SSIM. From that +-# information, I'm led to conclude that the states of Amapa (AP), Ceara (CE), +-# Maranhao (MA), Paraiba (PR), Pernambuco (PE), Piaui (PI), and Rio Grande do +-# Norte (RN), and the eastern part of Para (PA) are all in BR1 without DST. ++# information, I'm led to conclude that the states of Amapá (AP), Ceará (CE), ++# Maranhão (MA), Paraíba (PR), Pernambuco (PE), Piauí (PI), and Rio Grande do ++# Norte (RN), and the eastern part of Pará (PA) are all in BR1 without DST. + + # From Marcos Tadeu (1998-09-27): +-# <a href="http://pcdsh01.on.br/verao1.html"> +-# Brazilian official page +-# </a> ++# Brazilian official page <http://pcdsh01.on.br/verao1.html> + +-# From Jesper Norgaard (2000-11-03): ++# From Jesper Nørgaard (2000-11-03): + # [For an official list of which regions in Brazil use which time zones, see:] + # http://pcdsh01.on.br/Fusbr.htm + # http://pcdsh01.on.br/Fusbrhv.htm +@@ -748,13 +708,13 @@ + + # From Paul Schulze (2008-06-24): + # ...by law number 11.662 of April 24, 2008 (published in the "Diario +-# Oficial da Uniao"...) in Brazil there are changes in the timezones, ++# Oficial da União"...) in Brazil there are changes in the timezones, + # effective today (00:00am at June 24, 2008) as follows: + # +-# a) The timezone UTC+5 is e[x]tinguished, with all the Acre state and the ++# a) The timezone UTC+5 is extinguished, with all the Acre state and the + # part of the Amazonas state that had this timezone now being put to the + # timezone UTC+4 +-# b) The whole Para state now is put at timezone UTC+3, instead of just ++# b) The whole Pará state now is put at timezone UTC+3, instead of just + # part of it, as was before. + # + # This change follows a proposal of senator Tiao Viana of Acre state, that +@@ -767,13 +727,11 @@ + + # From Rodrigo Severo (2008-06-24): + # Just correcting the URL: +-# <a href="https://www.in.gov.br/imprensa/visualiza/index.jsp?jornal=do&secao=1&pagina=1&data=25/04/2008"> + # https://www.in.gov.br/imprensa/visualiza/index.jsp?jornal=do&secao=1&pagina=1&data=25/04/2008 +-# </a> + # + # As a result of the above Decree I believe the America/Rio_Branco + # timezone shall be modified from UTC-5 to UTC-4 and a new timezone shall +-# be created to represent the...west side of the Para State. I ++# be created to represent the...west side of the Pará State. I + # suggest this new timezone be called Santarem as the most + # important/populated city in the affected area. + # +@@ -782,19 +740,16 @@ + + # From Alex Krivenyshev (2008-06-24): + # This is a quick reference page for New and Old Brazil Time Zones map. +-# <a href="http://www.worldtimezone.com/brazil-time-new-old.php"> + # http://www.worldtimezone.com/brazil-time-new-old.php +-# </a> + # +-# - 4 time zones replaced by 3 time zones-eliminating time zone UTC- 05 +-# (state Acre and the part of the Amazonas will be UTC/GMT- 04) - western +-# part of Par state is moving to one timezone UTC- 03 (from UTC -04). ++# - 4 time zones replaced by 3 time zones - eliminating time zone UTC-05 ++# (state Acre and the part of the Amazonas will be UTC/GMT-04) - western ++# part of Par state is moving to one timezone UTC-03 (from UTC-04). + + # From Paul Eggert (2002-10-10): + # The official decrees referenced below are mostly taken from +-# <a href="http://pcdsh01.on.br/DecHV.html"> +-# Decretos sobre o Horario de Verao no Brasil +-# </a>. ++# Decretos sobre o Horário de Verão no Brasil. ++# http://pcdsh01.on.br/DecHV.html + + # From Steffen Thorsen (2008-08-29): + # As announced by the government and many newspapers in Brazil late +@@ -806,25 +761,17 @@ + # It has not yet been posted to http://pcdsh01.on.br/DecHV.html + # + # An official page about it: +-# <a href="http://www.mme.gov.br/site/news/detail.do?newsId=16722"> + # http://www.mme.gov.br/site/news/detail.do?newsId=16722 +-# </a> + # Note that this link does not always work directly, but must be accessed + # by going to +-# <a href="http://www.mme.gov.br/first"> + # http://www.mme.gov.br/first +-# </a> + # + # One example link that works directly: +-# <a href="http://jornale.com.br/index.php?option=com_content&task=view&id=13530&Itemid=54"> + # http://jornale.com.br/index.php?option=com_content&task=view&id=13530&Itemid=54 + # (Portuguese) +-# </a> + # + # We have a written a short article about it as well: +-# <a href="http://www.timeanddate.com/news/time/brazil-dst-2008-2009.html"> + # http://www.timeanddate.com/news/time/brazil-dst-2008-2009.html +-# </a> + # + # From Alexander Krivenyshev (2011-10-04): + # State Bahia will return to Daylight savings time this year after 8 years off. +@@ -832,17 +779,12 @@ + # television station in Salvador. + + # In Portuguese: +-# <a href="http://g1.globo.com/bahia/noticia/2011/10/governador-jaques-wagner-confirma-horario-de-verao-na-bahia.html"> + # http://g1.globo.com/bahia/noticia/2011/10/governador-jaques-wagner-confirma-horario-de-verao-na-bahia.html +-# </a> and +-# <a href="http://noticias.terra.com.br/brasil/noticias/0,,OI5390887-EI8139,00-Bahia+volta+a+ter+horario+de+verao+apos+oito+anos.html"> + # http://noticias.terra.com.br/brasil/noticias/0,,OI5390887-EI8139,00-Bahia+volta+a+ter+horario+de+verao+apos+oito+anos.html +-# </a> + + # From Guilherme Bernardes Rodrigues (2011-10-07): + # There is news in the media, however there is still no decree about it. +-# I just send a e-mail to Zulmira Brandao at +-# <a href="http://pcdsh01.on.br/">http://pcdsh01.on.br/</a> the ++# I just send a e-mail to Zulmira Brandao at http://pcdsh01.on.br/ the + # official agency about time in Brazil, and she confirmed that the old rule is + # still in force. + +@@ -854,9 +796,7 @@ + # + # DECRETO No- 7.584, DE 13 DE OUTUBRO DE 2011 + # Link : +-# <a href="http://www.in.gov.br/visualiza/index.jsp?data=13/10/2011&jornal=1000&pagina=6&totalArquivos=6"> + # http://www.in.gov.br/visualiza/index.jsp?data=13/10/2011&jornal=1000&pagina=6&totalArquivos=6 +-# </a> + + # From Kelley Cook (2012-10-16): + # The governor of state of Bahia in Brazil announced on Thursday that +@@ -884,42 +824,42 @@ + # For now, assume western Amazonas will change as well. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-# Decree <a href="http://pcdsh01.on.br/HV20466.htm">20,466</a> (1931-10-01) +-# Decree <a href="http://pcdsh01.on.br/HV21896.htm">21,896</a> (1932-01-10) ++# Decree 20,466 <http://pcdsh01.on.br/HV20466.htm> (1931-10-01) ++# Decree 21,896 <http://pcdsh01.on.br/HV21896.htm> (1932-01-10) + Rule Brazil 1931 only - Oct 3 11:00 1:00 S + Rule Brazil 1932 1933 - Apr 1 0:00 0 - + Rule Brazil 1932 only - Oct 3 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/HV23195.htm">23,195</a> (1933-10-10) ++# Decree 23,195 <http://pcdsh01.on.br/HV23195.htm> (1933-10-10) + # revoked DST. +-# Decree <a href="http://pcdsh01.on.br/HV27496.htm">27,496</a> (1949-11-24) +-# Decree <a href="http://pcdsh01.on.br/HV27998.htm">27,998</a> (1950-04-13) ++# Decree 27,496 <http://pcdsh01.on.br/HV27496.htm> (1949-11-24) ++# Decree 27,998 <http://pcdsh01.on.br/HV27998.htm> (1950-04-13) + Rule Brazil 1949 1952 - Dec 1 0:00 1:00 S + Rule Brazil 1950 only - Apr 16 1:00 0 - + Rule Brazil 1951 1952 - Apr 1 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV32308.htm">32,308</a> (1953-02-24) ++# Decree 32,308 <http://pcdsh01.on.br/HV32308.htm> (1953-02-24) + Rule Brazil 1953 only - Mar 1 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV34724.htm">34,724</a> (1953-11-30) ++# Decree 34,724 <http://pcdsh01.on.br/HV34724.htm> (1953-11-30) + # revoked DST. +-# Decree <a href="http://pcdsh01.on.br/HV52700.htm">52,700</a> (1963-10-18) ++# Decree 52,700 <http://pcdsh01.on.br/HV52700.htm> (1963-10-18) + # established DST from 1963-10-23 00:00 to 1964-02-29 00:00 + # in SP, RJ, GB, MG, ES, due to the prolongation of the drought. +-# Decree <a href="http://pcdsh01.on.br/HV53071.htm">53,071</a> (1963-12-03) ++# Decree 53,071 <http://pcdsh01.on.br/HV53071.htm> (1963-12-03) + # extended the above decree to all of the national territory on 12-09. + Rule Brazil 1963 only - Dec 9 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/HV53604.htm">53,604</a> (1964-02-25) ++# Decree 53,604 <http://pcdsh01.on.br/HV53604.htm> (1964-02-25) + # extended summer time by one day to 1964-03-01 00:00 (start of school). + Rule Brazil 1964 only - Mar 1 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV55639.htm">55,639</a> (1965-01-27) ++# Decree 55,639 <http://pcdsh01.on.br/HV55639.htm> (1965-01-27) + Rule Brazil 1965 only - Jan 31 0:00 1:00 S + Rule Brazil 1965 only - Mar 31 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV57303.htm">57,303</a> (1965-11-22) ++# Decree 57,303 <http://pcdsh01.on.br/HV57303.htm> (1965-11-22) + Rule Brazil 1965 only - Dec 1 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/HV57843.htm">57,843</a> (1966-02-18) ++# Decree 57,843 <http://pcdsh01.on.br/HV57843.htm> (1966-02-18) + Rule Brazil 1966 1968 - Mar 1 0:00 0 - + Rule Brazil 1966 1967 - Nov 1 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/HV63429.htm">63,429</a> (1968-10-15) ++# Decree 63,429 <http://pcdsh01.on.br/HV63429.htm> (1968-10-15) + # revoked DST. +-# Decree <a href="http://pcdsh01.on.br/HV91698.htm">91,698</a> (1985-09-27) ++# Decree 91,698 <http://pcdsh01.on.br/HV91698.htm> (1985-09-27) + Rule Brazil 1985 only - Nov 2 0:00 1:00 S + # Decree 92,310 (1986-01-21) + # Decree 92,463 (1986-03-13) +@@ -927,42 +867,42 @@ + # Decree 93,316 (1986-10-01) + Rule Brazil 1986 only - Oct 25 0:00 1:00 S + Rule Brazil 1987 only - Feb 14 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV94922.htm">94,922</a> (1987-09-22) ++# Decree 94,922 <http://pcdsh01.on.br/HV94922.htm> (1987-09-22) + Rule Brazil 1987 only - Oct 25 0:00 1:00 S + Rule Brazil 1988 only - Feb 7 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV96676.htm">96,676</a> (1988-09-12) ++# Decree 96,676 <http://pcdsh01.on.br/HV96676.htm> (1988-09-12) + # except for the states of AC, AM, PA, RR, RO, and AP (then a territory) + Rule Brazil 1988 only - Oct 16 0:00 1:00 S + Rule Brazil 1989 only - Jan 29 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV98077.htm">98,077</a> (1989-08-21) ++# Decree 98,077 <http://pcdsh01.on.br/HV98077.htm> (1989-08-21) + # with the same exceptions + Rule Brazil 1989 only - Oct 15 0:00 1:00 S + Rule Brazil 1990 only - Feb 11 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV99530.htm">99,530</a> (1990-09-17) ++# Decree 99,530 <http://pcdsh01.on.br/HV99530.htm> (1990-09-17) + # adopted by RS, SC, PR, SP, RJ, ES, MG, GO, MS, DF. + # Decree 99,629 (1990-10-19) adds BA, MT. + Rule Brazil 1990 only - Oct 21 0:00 1:00 S + Rule Brazil 1991 only - Feb 17 0:00 0 - +-# <a href="http://pcdsh01.on.br/HV1991.htm">Unnumbered decree</a> (1991-09-25) ++# Unnumbered decree <http://pcdsh01.on.br/HV1991.htm> (1991-09-25) + # adopted by RS, SC, PR, SP, RJ, ES, MG, BA, GO, MT, MS, DF. + Rule Brazil 1991 only - Oct 20 0:00 1:00 S + Rule Brazil 1992 only - Feb 9 0:00 0 - +-# <a href="http://pcdsh01.on.br/HV1992.htm">Unnumbered decree</a> (1992-10-16) ++# Unnumbered decree <http://pcdsh01.on.br/HV1992.htm> (1992-10-16) + # adopted by same states. + Rule Brazil 1992 only - Oct 25 0:00 1:00 S + Rule Brazil 1993 only - Jan 31 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV942.htm">942</a> (1993-09-28) ++# Decree 942 <http://pcdsh01.on.br/HV942.htm> (1993-09-28) + # adopted by same states, plus AM. +-# Decree <a href="http://pcdsh01.on.br/HV1252.htm">1,252</a> (1994-09-22; ++# Decree 1,252 <http://pcdsh01.on.br/HV1252.htm> (1994-09-22; + # web page corrected 2004-01-07) adopted by same states, minus AM. +-# Decree <a href="http://pcdsh01.on.br/HV1636.htm">1,636</a> (1995-09-14) ++# Decree 1,636 <http://pcdsh01.on.br/HV1636.htm> (1995-09-14) + # adopted by same states, plus MT and TO. +-# Decree <a href="http://pcdsh01.on.br/HV1674.htm">1,674</a> (1995-10-13) ++# Decree 1,674 <http://pcdsh01.on.br/HV1674.htm> (1995-10-13) + # adds AL, SE. + Rule Brazil 1993 1995 - Oct Sun>=11 0:00 1:00 S + Rule Brazil 1994 1995 - Feb Sun>=15 0:00 0 - + Rule Brazil 1996 only - Feb 11 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/HV2000.htm">2,000</a> (1996-09-04) ++# Decree 2,000 <http://pcdsh01.on.br/HV2000.htm> (1996-09-04) + # adopted by same states, minus AL, SE. + Rule Brazil 1996 only - Oct 6 0:00 1:00 S + Rule Brazil 1997 only - Feb 16 0:00 0 - +@@ -975,53 +915,51 @@ + # + # Decree 2,317 (1997-09-04), adopted by same states. + Rule Brazil 1997 only - Oct 6 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/figuras/HV2495.JPG">2,495</a> ++# Decree 2,495 <http://pcdsh01.on.br/figuras/HV2495.JPG> + # (1998-02-10) + Rule Brazil 1998 only - Mar 1 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/figuras/Hv98.jpg">2,780</a> (1998-09-11) ++# Decree 2,780 <http://pcdsh01.on.br/figuras/Hv98.jpg> (1998-09-11) + # adopted by the same states as before. + Rule Brazil 1998 only - Oct 11 0:00 1:00 S + Rule Brazil 1999 only - Feb 21 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/figuras/HV3150.gif">3,150</a> ++# Decree 3,150 <http://pcdsh01.on.br/figuras/HV3150.gif> + # (1999-08-23) adopted by same states. +-# Decree <a href="http://pcdsh01.on.br/DecHV99.gif">3,188</a> (1999-09-30) ++# Decree 3,188 <http://pcdsh01.on.br/DecHV99.gif> (1999-09-30) + # adds SE, AL, PB, PE, RN, CE, PI, MA and RR. + Rule Brazil 1999 only - Oct 3 0:00 1:00 S + Rule Brazil 2000 only - Feb 27 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/DEC3592.htm">3,592</a> (2000-09-06) ++# Decree 3,592 <http://pcdsh01.on.br/DEC3592.htm> (2000-09-06) + # adopted by the same states as before. +-# Decree <a href="http://pcdsh01.on.br/Dec3630.jpg">3,630</a> (2000-10-13) ++# Decree 3,630 <http://pcdsh01.on.br/Dec3630.jpg> (2000-10-13) + # repeals DST in PE and RR, effective 2000-10-15 00:00. +-# Decree <a href="http://pcdsh01.on.br/Dec3632.jpg">3,632</a> (2000-10-17) ++# Decree 3,632 <http://pcdsh01.on.br/Dec3632.jpg> (2000-10-17) + # repeals DST in SE, AL, PB, RN, CE, PI and MA, effective 2000-10-22 00:00. +-# Decree <a href="http://pcdsh01.on.br/figuras/HV3916.gif">3,916</a> ++# Decree 3,916 <http://pcdsh01.on.br/figuras/HV3916.gif> + # (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE. + Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 S + Rule Brazil 2001 2006 - Feb Sun>=15 0:00 0 - + # Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE. +-# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm">4,399</a> ++# 4,399 <http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm> + Rule Brazil 2002 only - Nov 3 0:00 1:00 S + # Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO. +-# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm">4,844</a> ++# 4,844 <http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm> + Rule Brazil 2003 only - Oct 19 0:00 1:00 S + # Decree 5,223 (2004-10-01) reestablishes DST in MT. +-# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm">5,223</a> ++# 5,223 <http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm> + Rule Brazil 2004 only - Nov 2 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/DecHV5539.gif">5,539</a> (2005-09-19), ++# Decree 5,539 <http://pcdsh01.on.br/DecHV5539.gif> (2005-09-19), + # adopted by the same states as before. + Rule Brazil 2005 only - Oct 16 0:00 1:00 S +-# Decree <a href="http://pcdsh01.on.br/DecHV5920.gif">5,920</a> (2006-10-03), ++# Decree 5,920 <http://pcdsh01.on.br/DecHV5920.gif> (2006-10-03), + # adopted by the same states as before. + Rule Brazil 2006 only - Nov 5 0:00 1:00 S + Rule Brazil 2007 only - Feb 25 0:00 0 - +-# Decree <a href="http://pcdsh01.on.br/DecHV6212.gif">6,212</a> (2007-09-26), ++# Decree 6,212 <http://pcdsh01.on.br/DecHV6212.gif> (2007-09-26), + # adopted by the same states as before. + Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S + # From Frederico A. C. Neves (2008-09-10): + # According to this decree +-# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm"> + # http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm +-# </a> + # [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the + # 3rd Feb Sunday. There is an exception on the return date when this is + # the Carnival Sunday then the return date will be the next Sunday... +@@ -1056,29 +994,29 @@ + -2:00 Brazil FN%sT 2002 Oct 1 + -2:00 - FNT + # Other Atlantic islands have no permanent settlement. +-# These include Trindade and Martin Vaz (administratively part of ES), +-# Atol das Rocas (RN), and Penedos de Sao Pedro e Sao Paulo (PE). ++# These include Trindade and Martim Vaz (administratively part of ES), ++# Rocas Atoll (RN), and the St Peter and St Paul Archipelago (PE). + # Fernando de Noronha was a separate territory from 1942-09-02 to 1989-01-01; + # it also included the Penedos. + # +-# Amapa (AP), east Para (PA) +-# East Para includes Belem, Maraba, Serra Norte, and Sao Felix do Xingu. +-# The division between east and west Para is the river Xingu. ++# Amapá (AP), east Pará (PA) ++# East Pará includes Belém, Marabá, Serra Norte, and São Félix do Xingu. ++# The division between east and west Pará is the river Xingu. + # In the north a very small part from the river Javary (now Jari I guess, +-# the border with Amapa) to the Amazon, then to the Xingu. ++# the border with Amapá) to the Amazon, then to the Xingu. + Zone America/Belem -3:13:56 - LMT 1914 + -3:00 Brazil BR%sT 1988 Sep 12 + -3:00 - BRT + # +-# west Para (PA) +-# West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem. ++# west Pará (PA) ++# West Pará includes Altamira, Óbidos, Prainha, Oriximiná, and Santarém. + Zone America/Santarem -3:38:48 - LMT 1914 + -4:00 Brazil AM%sT 1988 Sep 12 +- -4:00 - AMT 2008 Jun 24 00:00 ++ -4:00 - AMT 2008 Jun 24 0:00 + -3:00 - BRT + # +-# Maranhao (MA), Piaui (PI), Ceara (CE), Rio Grande do Norte (RN), +-# Paraiba (PB) ++# Maranhão (MA), Piauí (PI), Ceará (CE), Rio Grande do Norte (RN), ++# Paraíba (PB) + Zone America/Fortaleza -2:34:00 - LMT 1914 + -3:00 Brazil BR%sT 1990 Sep 17 + -3:00 - BRT 1999 Sep 30 +@@ -1125,11 +1063,11 @@ + -3:00 Brazil BR%sT 2012 Oct 21 + -3:00 - BRT + # +-# Goias (GO), Distrito Federal (DF), Minas Gerais (MG), +-# Espirito Santo (ES), Rio de Janeiro (RJ), Sao Paulo (SP), Parana (PR), ++# Goiás (GO), Distrito Federal (DF), Minas Gerais (MG), ++# Espírito Santo (ES), Rio de Janeiro (RJ), São Paulo (SP), Paraná (PR), + # Santa Catarina (SC), Rio Grande do Sul (RS) + Zone America/Sao_Paulo -3:06:28 - LMT 1914 +- -3:00 Brazil BR%sT 1963 Oct 23 00:00 ++ -3:00 Brazil BR%sT 1963 Oct 23 0:00 + -3:00 1:00 BRST 1964 + -3:00 Brazil BR%sT + # +@@ -1143,7 +1081,7 @@ + -4:00 - AMT 2004 Oct 1 + -4:00 Brazil AM%sT + # +-# Rondonia (RO) ++# Rondônia (RO) + Zone America/Porto_Velho -4:15:36 - LMT 1914 + -4:00 Brazil AM%sT 1988 Sep 12 + -4:00 - AMT +@@ -1155,7 +1093,7 @@ + -4:00 Brazil AM%sT 2000 Oct 15 + -4:00 - AMT + # +-# east Amazonas (AM): Boca do Acre, Jutai, Manaus, Floriano Peixoto ++# east Amazonas (AM): Boca do Acre, Jutaí, Manaus, Floriano Peixoto + # The great circle line from Tabatinga to Porto Acre divides + # east from west Amazonas. + Zone America/Manaus -4:00:04 - LMT 1914 +@@ -1165,19 +1103,19 @@ + -4:00 - AMT + # + # west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant, +-# Eirunepe, Envira, Ipixuna ++# Eirunepé, Envira, Ipixuna + Zone America/Eirunepe -4:39:28 - LMT 1914 + -5:00 Brazil AC%sT 1988 Sep 12 + -5:00 - ACT 1993 Sep 28 + -5:00 Brazil AC%sT 1994 Sep 22 +- -5:00 - ACT 2008 Jun 24 00:00 ++ -5:00 - ACT 2008 Jun 24 0:00 + -4:00 - AMT 2013 Nov 10 + -5:00 - ACT + # + # Acre (AC) + Zone America/Rio_Branco -4:31:12 - LMT 1914 + -5:00 Brazil AC%sT 1988 Sep 12 +- -5:00 - ACT 2008 Jun 24 00:00 ++ -5:00 - ACT 2008 Jun 24 0:00 + -4:00 - AMT 2013 Nov 10 + -5:00 - ACT + +@@ -1198,66 +1136,54 @@ + # From Oscar van Vlijmen (2006-10-08): + # http://www.horaoficial.cl/cambio.htm + +-# From Jesper Norgaard Welen (2006-10-08): ++# From Jesper Nørgaard Welen (2006-10-08): + # I think that there are some obvious mistakes in the suggested link + # from Oscar van Vlijmen,... for instance entry 66 says that GMT-4 + # ended 1990-09-12 while entry 67 only begins GMT-3 at 1990-09-15 + # (they should have been 1990-09-15 and 1990-09-16 respectively), but + # anyhow it clears up some doubts too. + +-# From Paul Eggert (2006-12-27): +-# The following data for Chile and America/Santiago are from ++# From Paul Eggert (2014-08-12): ++# The following data entries for Chile and America/Santiago are from + # <http://www.horaoficial.cl/horaof.htm> (2006-09-20), transcribed by +-# Jesper Norgaard Welen. The data for Pacific/Easter are from Shanks ++# Jesper Nørgaard Welen. The data entries for Pacific/Easter are from Shanks + # & Pottenger, except with DST transitions after 1932 cloned from +-# America/Santiago. The pre-1980 Pacific/Easter data are dubious, ++# America/Santiago. The pre-1980 Pacific/Easter data entries are dubious, + # but we have no other source. + +-# From German Poo-Caaman~o (2008-03-03): ++# From Germán Poo-Caamaño (2008-03-03): + # Due to drought, Chile extends Daylight Time in three weeks. This + # is one-time change (Saturday 3/29 at 24:00 for America/Santiago + # and Saturday 3/29 at 22:00 for Pacific/Easter) + # The Supreme Decree is located at +-# <a href="http://www.shoa.cl/servicios/supremo316.pdf"> + # http://www.shoa.cl/servicios/supremo316.pdf +-# </a> + # and the instructions for 2008 are located in: +-# <a href="http://www.horaoficial.cl/cambio.htm"> + # http://www.horaoficial.cl/cambio.htm +-# </a>. + +-# From Jose Miguel Garrido (2008-03-05): ++# From José Miguel Garrido (2008-03-05): + # ... + # You could see the announces of the change on +-# <a href="http://www.shoa.cl/noticias/2008/04hora/hora.htm"> + # http://www.shoa.cl/noticias/2008/04hora/hora.htm +-# </a>. + + # From Angel Chiang (2010-03-04): + # Subject: DST in Chile exceptionally extended to 3 April due to earthquake +-# <a href="http://www.gobiernodechile.cl/viewNoticia.aspx?idArticulo=30098"> + # http://www.gobiernodechile.cl/viewNoticia.aspx?idArticulo=30098 +-# </a> + # (in Spanish, last paragraph). + # + # This is breaking news. There should be more information available later. + +-# From Arthur Daivd Olson (2010-03-06): ++# From Arthur David Olson (2010-03-06): + # Angel Chiang's message confirmed by Julio Pacheco; Julio provided a patch. + +-# From Glenn Eychaner (2011-03-02): [geychaner@mac.com] ++# From Glenn Eychaner (2011-03-02): + # It appears that the Chilean government has decided to postpone the + # change from summer time to winter time again, by three weeks to April + # 2nd: +-# <a href="http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651"> + # http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651 +-# </a> + # + # This is not yet reflected in the official "cambio de hora" site, but + # probably will be soon: +-# <a href="http://www.horaoficial.cl/cambio.htm"> + # http://www.horaoficial.cl/cambio.htm +-# </a> + + # From Arthur David Olson (2011-03-02): + # The emol.com article mentions a water shortage as the cause of the +@@ -1265,9 +1191,7 @@ + + # From Glenn Eychaner (2011-03-28): + # The article: +-# <a href="http://diario.elmercurio.com/2011/03/28/_portada/_portada/noticias/7565897A-CA86-49E6-9E03-660B21A4883E.htm?id=3D{7565897A-CA86-49E6-9E03-660B21A4883E}"> + # http://diario.elmercurio.com/2011/03/28/_portada/_portada/noticias/7565897A-CA86-49E6-9E03-660B21A4883E.htm?id=3D{7565897A-CA86-49E6-9E03-660B21A4883E} +-# </a> + # + # In English: + # Chile's clocks will go back an hour this year on the 7th of May instead +@@ -1298,7 +1222,7 @@ + # start date is 2013-09-08 00:00.... + # http://www.gob.cl/informa/2013/02/15/gobierno-anuncia-fechas-de-cambio-de-hora-para-el-ano-2013.htm + +-# From Jose Miguel Garrido (2014-02-19): ++# From José Miguel Garrido (2014-02-19): + # Today appeared in the Diario Oficial a decree amending the time change + # dates to 2014. + # DST End: last Saturday of April 2014 (Sun 27 Apr 2014 03:00 UTC) +@@ -1352,7 +1276,7 @@ + # (1996-09) says 1998-03-08. Ignore these. + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Santiago -4:42:46 - LMT 1890 +- -4:42:46 - SMT 1910 # Santiago Mean Time ++ -4:42:46 - SMT 1910 # Santiago Mean Time + -5:00 - CLT 1916 Jul 1 # Chile Time + -4:42:46 - SMT 1918 Sep 1 # Santiago Mean Time + -4:00 - CLT 1919 Jul 1 # Chile Time +@@ -1361,16 +1285,16 @@ + -4:00 Chile CL%sT + Zone Pacific/Easter -7:17:44 - LMT 1890 + -7:17:28 - EMT 1932 Sep # Easter Mean Time +- -7:00 Chile EAS%sT 1982 Mar 13 21:00 # Easter I Time ++ -7:00 Chile EAS%sT 1982 Mar 13 21:00 # Easter Time + -6:00 Chile EAS%sT + # +-# Sala y Gomez Island is like Pacific/Easter. +-# Other Chilean locations, including Juan Fernandez Is, San Ambrosio, +-# San Felix, and Antarctic bases, are like America/Santiago. ++# Salas y Gómez Island is uninhabited. ++# Other Chilean locations, including Juan Fernández Is, Desventuradas Is, ++# and Antarctic bases, are like America/Santiago. + + # Colombia + +-# Milne gives 4:56:16.4 for Bogota time in 1899; round to nearest. He writes, ++# Milne gives 4:56:16.4 for Bogotá time in 1899; round to nearest. He writes, + # "A variation of fifteen minutes in the public clocks of Bogota is not rare." + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -1378,37 +1302,37 @@ + Rule CO 1993 only - Apr 4 0:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Bogota -4:56:16 - LMT 1884 Mar 13 +- -4:56:16 - BMT 1914 Nov 23 # Bogota Mean Time ++ -4:56:16 - BMT 1914 Nov 23 # Bogotá Mean Time + -5:00 CO CO%sT # Colombia Time + # Malpelo, Providencia, San Andres + # no information; probably like America/Bogota + +-# Curacao ++# Curaçao + +-# Milne gives 4:35:46.9 for Curacao mean time; round to nearest. ++# Milne gives 4:35:46.9 for Curaçao mean time; round to nearest. + # + # From Paul Eggert (2006-03-22): + # Shanks & Pottenger say that The Bottom and Philipsburg have been at + # -4:00 since standard time was introduced on 1912-03-02; and that + # Kralendijk and Rincon used Kralendijk Mean Time (-4:33:08) from + # 1912-02-02 to 1965-01-01. The former is dubious, since S&P also say +-# Saba Island has been like Curacao. ++# Saba Island has been like Curaçao. + # This all predates our 1970 cutoff, though. + # +-# By July 2007 Curacao and St Maarten are planned to become ++# By July 2007 Curaçao and St Maarten are planned to become + # associated states within the Netherlands, much like Aruba; + # Bonaire, Saba and St Eustatius would become directly part of the + # Netherlands as Kingdom Islands. This won't affect their time zones + # though, as far as we know. + # + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Curacao -4:35:47 - LMT 1912 Feb 12 # Willemstad ++Zone America/Curacao -4:35:47 - LMT 1912 Feb 12 # Willemstad + -4:30 - ANT 1965 # Netherlands Antilles Time + -4:00 - AST + + # From Arthur David Olson (2011-06-15): + # use links for places with new iso3166 codes. +-# The name "Lower Prince's Quarter" is both longer than fourteen charaters ++# The name "Lower Prince's Quarter" is both longer than fourteen characters + # and contains an apostrophe; use "Lower_Princes" below. + + Link America/Curacao America/Lower_Princes # Sint Maarten +@@ -1416,7 +1340,7 @@ + + # Ecuador + # +-# Milne says the Sentral and South American Telegraph Company used -5:24:15. ++# Milne says the Central and South American Telegraph Company used -5:24:15. + # + # From Paul Eggert (2007-03-04): + # Apparently Ecuador had a failed experiment with DST in 1992. +@@ -1427,10 +1351,10 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Guayaquil -5:19:20 - LMT 1890 + -5:14:00 - QMT 1931 # Quito Mean Time +- -5:00 - ECT # Ecuador Time ++ -5:00 - ECT # Ecuador Time + Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno + -5:00 - ECT 1986 +- -6:00 - GALT # Galapagos Time ++ -6:00 - GALT # Galápagos Time + + # Falklands + +@@ -1439,7 +1363,7 @@ + # the IATA gives 1996-09-08. Go with Shanks & Pottenger. + + # From Falkland Islands Government Office, London (2001-01-22) +-# via Jesper Norgaard: ++# via Jesper Nørgaard: + # ... the clocks revert back to Local Mean Time at 2 am on Sunday 15 + # April 2001 and advance one hour to summer time at 2 am on Sunday 2 + # September. It is anticipated that the clocks will revert back at 2 +@@ -1488,9 +1412,7 @@ + # daylight saving time. + # + # One source: +-# <a href="http://www.falklandnews.com/public/story.cfm?get=5914&source=3"> + # http://www.falklandnews.com/public/story.cfm?get=5914&source=3 +-# </a> + # + # We have gotten this confirmed by a clerk of the legislative assembly: + # Normally the clocks revert to Local Mean Time (UTC/GMT -4 hours) on the +@@ -1531,10 +1453,10 @@ + Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Atlantic/Stanley -3:51:24 - LMT 1890 +- -3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time +- -4:00 Falk FK%sT 1983 May # Falkland Is Time ++ -3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time ++ -4:00 Falk FK%sT 1983 May # Falkland Is Time + -3:00 Falk FK%sT 1985 Sep 15 +- -4:00 Falk FK%sT 2010 Sep 5 02:00 ++ -4:00 Falk FK%sT 2010 Sep 5 2:00 + -3:00 - FKST + + # French Guiana +@@ -1545,7 +1467,7 @@ + + # Guyana + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone America/Guyana -3:52:40 - LMT 1915 Mar # Georgetown ++Zone America/Guyana -3:52:40 - LMT 1915 Mar # Georgetown + -3:45 - GBGT 1966 May 26 # Br Guiana Time + -3:45 - GYT 1975 Jul 31 # Guyana Time + -3:00 - GYT 1991 +@@ -1555,8 +1477,8 @@ + # Paraguay + # + # From Paul Eggert (2006-03-22): +-# Shanks & Pottenger say that spring transitions are from 01:00 -> 02:00, +-# and autumn transitions are from 00:00 -> 23:00. Go with pre-1999 ++# Shanks & Pottenger say that spring transitions are 01:00 -> 02:00, ++# and autumn transitions are 00:00 -> 23:00. Go with pre-1999 + # editions of Shanks, and with the IATA, who say transitions occur at 00:00. + # + # From Waldemar Villamayor-Venialbo (2013-09-20): +@@ -1582,9 +1504,8 @@ + # (10-01). + # + # Translated by Gwillim Law (2001-02-27) from +-# <a href="http://www.diarionoticias.com.py/011000/nacional/naciona1.htm"> +-# Noticias, a daily paper in Asuncion, Paraguay (2000-10-01) +-# </a>: ++# Noticias, a daily paper in Asunción, Paraguay (2000-10-01): ++# http://www.diarionoticias.com.py/011000/nacional/naciona1.htm + # Starting at 0:00 today, the clock will be set forward 60 minutes, in + # fulfillment of Decree No. 7,273 of the Executive Power.... The time change + # system has been operating for several years. Formerly there was a separate +@@ -1605,21 +1526,18 @@ + Rule Para 2002 2004 - Apr Sun>=1 0:00 0 - + Rule Para 2002 2003 - Sep Sun>=1 0:00 1:00 S + # +-# From Jesper Norgaard Welen (2005-01-02): ++# From Jesper Nørgaard Welen (2005-01-02): + # There are several sources that claim that Paraguay made + # a timezone rule change in autumn 2004. + # From Steffen Thorsen (2005-01-05): + # Decree 1,867 (2004-03-05) +-# From Carlos Raul Perasso via Jesper Norgaard Welen (2006-10-13) +-# <http://www.presidencia.gov.py/decretos/D1867.pdf> ++# From Carlos Raúl Perasso via Jesper Nørgaard Welen (2006-10-13) ++# http://www.presidencia.gov.py/decretos/D1867.pdf + Rule Para 2004 2009 - Oct Sun>=15 0:00 1:00 S + Rule Para 2005 2009 - Mar Sun>=8 0:00 0 - +-# From Carlos Raul Perasso (2010-02-18): +-# By decree number 3958 issued yesterday ( +-# <a href="http://www.presidencia.gov.py/v1/wp-content/uploads/2010/02/decreto3958.pdf"> ++# From Carlos Raúl Perasso (2010-02-18): ++# By decree number 3958 issued yesterday + # http://www.presidencia.gov.py/v1/wp-content/uploads/2010/02/decreto3958.pdf +-# </a> +-# ) + # Paraguay changes its DST schedule, postponing the March rule to April and + # modifying the October date. The decree reads: + # ... +@@ -1635,25 +1553,25 @@ + # Paraguay will end DST on 2013-03-24 00:00.... + # http://www.ande.gov.py/interna.php?id=1075 + # +-# From Carlos Raul Perasso (2013-03-15): ++# From Carlos Raúl Perasso (2013-03-15): + # The change in Paraguay is now final. Decree number 10780 + # http://www.presidencia.gov.py/uploads/pdf/presidencia-3b86ff4b691c79d4f5927ca964922ec74772ce857c02ca054a52a37b49afc7fb.pdf +-# From Carlos Raul Perasso (2014-02-28): ++# From Carlos Raúl Perasso (2014-02-28): + # Decree 1264 can be found at: + # http://www.presidencia.gov.py/archivos/documentos/DECRETO1264_ey9r8zai.pdf + Rule Para 2013 max - Mar Sun>=22 0:00 0 - + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Asuncion -3:50:40 - LMT 1890 +- -3:50:40 - AMT 1931 Oct 10 # Asuncion Mean Time +- -4:00 - PYT 1972 Oct # Paraguay Time ++ -3:50:40 - AMT 1931 Oct 10 # Asunción Mean Time ++ -4:00 - PYT 1972 Oct # Paraguay Time + -3:00 - PYT 1974 Apr + -4:00 Para PY%sT + + # Peru + # +-# <a href="news:xrGmb.39935$gA1.13896113@news4.srv.hcvlny.cv.net"> +-# From Evelyn C. Leeper via Mark Brader (2003-10-26):</a> ++# From Evelyn C. Leeper via Mark Brader (2003-10-26) ++# <news:xrGmb.39935$gA1.13896113@news4.srv.hcvlny.cv.net>: + # When we were in Peru in 1985-1986, they apparently switched over + # sometime between December 29 and January 3 while we were on the Amazon. + # +@@ -1679,7 +1597,7 @@ + + # South Georgia + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken ++Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken + -2:00 - GST # South Georgia Time + + # South Sandwich Is +@@ -1689,9 +1607,9 @@ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Paramaribo -3:40:40 - LMT 1911 + -3:40:52 - PMT 1935 # Paramaribo Mean Time +- -3:40:36 - PMT 1945 Oct # The capital moved? ++ -3:40:36 - PMT 1945 Oct # The capital moved? + -3:30 - NEGT 1975 Nov 20 # Dutch Guiana Time +- -3:30 - SRT 1984 Oct # Suriname Time ++ -3:30 - SRT 1984 Oct # Suriname Time + -3:00 - SRT + + # Trinidad and Tobago +@@ -1706,7 +1624,7 @@ + Link America/Port_of_Spain America/Guadeloupe + Link America/Port_of_Spain America/Marigot # St Martin (French part) + Link America/Port_of_Spain America/Montserrat +-Link America/Port_of_Spain America/St_Barthelemy ++Link America/Port_of_Spain America/St_Barthelemy # St Barthélemy + Link America/Port_of_Spain America/St_Kitts # St Kitts & Nevis + Link America/Port_of_Spain America/St_Lucia + Link America/Port_of_Spain America/St_Thomas # Virgin Islands (US) +@@ -1765,7 +1683,7 @@ + Rule Uruguay 1992 only - Oct 18 0:00 1:00 S + Rule Uruguay 1993 only - Feb 28 0:00 0 - + # From Eduardo Cota (2004-09-20): +-# The uruguayan government has decreed a change in the local time.... ++# The Uruguayan government has decreed a change in the local time.... + # http://www.presidencia.gub.uy/decretos/2004091502.htm + Rule Uruguay 2004 only - Sep 19 0:00 1:00 S + # From Steffen Thorsen (2005-03-11): +@@ -1779,14 +1697,14 @@ + # 02:00 local time, official time in Uruguay will be at GMT -2. + Rule Uruguay 2005 only - Oct 9 2:00 1:00 S + Rule Uruguay 2006 only - Mar 12 2:00 0 - +-# From Jesper Norgaard Welen (2006-09-06): ++# From Jesper Nørgaard Welen (2006-09-06): + # http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF + Rule Uruguay 2006 max - Oct Sun>=1 2:00 1:00 S + Rule Uruguay 2007 max - Mar Sun>=8 2:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28 +- -3:44:44 - MMT 1920 May 1 # Montevideo MT +- -3:30 Uruguay UY%sT 1942 Dec 14 # Uruguay Time ++ -3:44:44 - MMT 1920 May 1 # Montevideo MT ++ -3:30 Uruguay UY%sT 1942 Dec 14 # Uruguay Time + -3:00 Uruguay UY%sT + + # Venezuela +@@ -1794,14 +1712,14 @@ + # From John Stainforth (2007-11-28): + # ... the change for Venezuela originally expected for 2007-12-31 has + # been brought forward to 2007-12-09. The official announcement was +-# published today in the "Gaceta Oficial de la Republica Bolivariana +-# de Venezuela, numero 38.819" (official document for all laws or ++# published today in the "Gaceta Oficial de la República Bolivariana ++# de Venezuela, número 38.819" (official document for all laws or + # resolution publication) + # http://www.globovision.com/news.php?nid=72208 + + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone America/Caracas -4:27:44 - LMT 1890 + -4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time? +- -4:30 - VET 1965 # Venezuela Time +- -4:00 - VET 2007 Dec 9 03:00 ++ -4:30 - VET 1965 # Venezuela Time ++ -4:00 - VET 2007 Dec 9 3:00 + -4:30 - VET +--- ./jdk/make/sun/javazic/tzdata/systemv Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/systemv Mon Jan 05 11:57:27 2015 -0800 +@@ -21,7 +21,6 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# <pre> + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + +--- ./jdk/make/sun/javazic/tzdata/zone.tab Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/javazic/tzdata/zone.tab Mon Jan 05 11:57:27 2015 -0800 +@@ -21,39 +21,27 @@ + # or visit www.oracle.com if you need additional information or have any + # questions. + # +-# TZ zone descriptions ++# tz zone descriptions (deprecated version) + # + # This file is in the public domain, so clarified as of + # 2009-05-17 by Arthur David Olson. + # +-# From Paul Eggert (2013-08-14): ++# From Paul Eggert (2014-07-31): ++# This file is intended as a backward-compatibility aid for older programs. ++# New programs should use zone1970.tab. This file is like zone1970.tab (see ++# zone1970.tab's comments), but with the following additional restrictions: + # +-# This file contains a table where each row stands for an area that is +-# the intersection of a region identified by a country code and of a +-# zone where civil clocks have agreed since 1970. The columns of the +-# table are as follows: ++# 1. This file contains only ASCII characters. ++# 2. The first data column contains exactly one country code. + # +-# 1. ISO 3166 2-character country code. See the file 'iso3166.tab'. +-# 2. Latitude and longitude of the area's principal location +-# in ISO 6709 sign-degrees-minutes-seconds format, +-# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, +-# first latitude (+ is north), then longitude (+ is east). +-# 3. Zone name used in value of TZ environment variable. +-# Please see the 'Theory' file for how zone names are chosen. +-# If multiple zones overlap a country, each has a row in the +-# table, with column 1 being duplicated. +-# 4. Comments; present if and only if the country has multiple rows. +-# +-# Columns are separated by a single tab. +-# The table is sorted first by country, then an order within the country that +-# (1) makes some geographical sense, and +-# (2) puts the most populous areas first, where that does not contradict (1). +-# +-# Lines beginning with '#' are comments. ++# Because of (2), each row stands for an area that is the intersection ++# of a region identified by a country code and of a zone where civil ++# clocks have agreed since 1970; this is a narrower definition than ++# that of zone1970.tab. + # + # This table is intended as an aid for users, to help them select time +-# zone data appropriate for their practical needs. It is not intended +-# to take or endorse any position on legal or territorial claims. ++# zone data entries appropriate for their practical needs. It is not ++# intended to take or endorse any position on legal or territorial claims. + # + #country- + #code coordinates TZ comments +@@ -72,7 +60,7 @@ + AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills + AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula + AQ -7824+10654 Antarctica/Vostok Vostok Station, Lake Vostok +-AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie ++AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Adelie Land + AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I + AQ -720041+0023206 Antarctica/Troll Troll Station, Queen Maud Land + AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +@@ -151,7 +139,7 @@ + CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario + CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations + CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut +-CA +744144-0944945 America/Resolute Central Standard Time - Resolute, Nunavut ++CA +744144-0944945 America/Resolute Central Time - Resolute, Nunavut + CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut + CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut + CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario +@@ -176,13 +164,10 @@ + CI +0519-00402 Africa/Abidjan + CK -2114-15946 Pacific/Rarotonga + CL -3327-07040 America/Santiago most locations +-CL -2709-10926 Pacific/Easter Easter Island & Sala y Gomez ++CL -2709-10926 Pacific/Easter Easter Island + CM +0403+00942 Africa/Douala +-CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc. +-CN +4545+12641 Asia/Harbin Heilongjiang (except Mohe), Jilin +-CN +2934+10635 Asia/Chongqing central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc. +-CN +4348+08735 Asia/Urumqi most of Tibet & Xinjiang +-CN +3929+07559 Asia/Kashgar west Tibet & Xinjiang ++CN +3114+12128 Asia/Shanghai Beijing Time ++CN +4348+08735 Asia/Urumqi Xinjiang Time + CO +0436-07405 America/Bogota + CR +0956-08405 America/Costa_Rica + CU +2308-08222 America/Havana +@@ -345,7 +330,8 @@ + PF -1732-14934 Pacific/Tahiti Society Islands + PF -0900-13930 Pacific/Marquesas Marquesas Islands + PF -2308-13457 Pacific/Gambier Gambier Islands +-PG -0930+14710 Pacific/Port_Moresby ++PG -0930+14710 Pacific/Port_Moresby most locations ++PG -0613+15534 Pacific/Bougainville Bougainville + PH +1435+12100 Asia/Manila + PK +2452+06703 Asia/Karachi + PL +5215+02100 Europe/Warsaw +@@ -364,24 +350,26 @@ + RO +4426+02606 Europe/Bucharest + RS +4450+02030 Europe/Belgrade + RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad +-RU +5545+03735 Europe/Moscow Moscow+00 - west Russia ++RU +554521+0373704 Europe/Moscow Moscow+00 - west Russia ++RU +4457+03406 Europe/Simferopol Moscow+00 - Crimea + RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea +-RU +5312+05009 Europe/Samara Moscow+00 - Samara, Udmurtia +-RU +4457+03406 Europe/Simferopol Moscow+00 - Crimea ++RU +5312+05009 Europe/Samara Moscow+00 (Moscow+01 after 2014-10-26) - Samara, Udmurtia + RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals + RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia + RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk +-RU +5345+08707 Asia/Novokuznetsk Moscow+03 - Novokuznetsk ++RU +5345+08707 Asia/Novokuznetsk Moscow+03 (Moscow+04 after 2014-10-26) - Kemerovo + RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River + RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal ++RU +5203+11328 Asia/Chita Moscow+06 (Moscow+05 after 2014-10-26) - Zabaykalsky + RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River + RU +623923+1353314 Asia/Khandyga Moscow+06 - Tomponsky, Ust-Maysky + RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River + RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island + RU +643337+1431336 Asia/Ust-Nera Moscow+07 - Oymyakonsky +-RU +5934+15048 Asia/Magadan Moscow+08 - Magadan +-RU +5301+15839 Asia/Kamchatka Moscow+08 - Kamchatka +-RU +6445+17729 Asia/Anadyr Moscow+08 - Bering Sea ++RU +5934+15048 Asia/Magadan Moscow+08 (Moscow+07 after 2014-10-26) - Magadan ++RU +6728+15343 Asia/Srednekolymsk Moscow+08 - E Sakha, N Kuril Is ++RU +5301+15839 Asia/Kamchatka Moscow+08 (Moscow+09 after 2014-10-26) - Kamchatka ++RU +6445+17729 Asia/Anadyr Moscow+08 (Moscow+09 after 2014-10-26) - Bering Sea + RW -0157+03004 Africa/Kigali + SA +2438+04643 Asia/Riyadh + SB -0932+16012 Pacific/Guadalcanal +@@ -448,13 +436,13 @@ + US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon + US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona (except Navajo) + US +340308-1181434 America/Los_Angeles Pacific Time ++US +550737-1313435 America/Metlakatla Pacific Standard Time - Annette Island, Alaska + US +611305-1495401 America/Anchorage Alaska Time + US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle + US +571035-1351807 America/Sitka Alaska Time - southeast Alaska panhandle + US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck + US +643004-1652423 America/Nome Alaska Time - west Alaska + US +515248-1763929 America/Adak Aleutian Islands +-US +550737-1313435 America/Metlakatla Metlakatla Time - Annette Island + US +211825-1575130 Pacific/Honolulu Hawaii + UY -3453-05611 America/Montevideo + UZ +3940+06648 Asia/Samarkand west Uzbekistan +--- ./jdk/make/sun/security/krb5/Makefile Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/sun/security/krb5/Makefile Mon Jan 05 11:57:27 2015 -0800 +@@ -92,7 +92,7 @@ + OTHER_LDLIBS = $(LIBDL) $(JVMLIB) + endif + +-build: ++all: + ifeq ($(PLATFORM),windows) + $(call make-launcher, kinit, sun.security.krb5.internal.tools.Kinit, , ) + $(call make-launcher, klist, sun.security.krb5.internal.tools.Klist, , ) +--- ./jdk/make/tools/src/build/tools/generatecurrencydata/GenerateCurrencyData.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/make/tools/src/build/tools/generatecurrencydata/GenerateCurrencyData.java Mon Jan 05 11:57:27 2015 -0800 +@@ -281,8 +281,8 @@ + checkCurrencyCode(newCurrency); + String timeString = currencyInfo.substring(4, length - 4); + long time = format.parse(timeString).getTime(); +- if (Math.abs(time - System.currentTimeMillis()) > ((long) 10) * 365 * 24 * 60 * 60 * 1000) { +- throw new RuntimeException("time is more than 10 years from present: " + time); ++ if (Math.abs(time - System.currentTimeMillis()) > ((long) 20) * 365 * 24 * 60 * 60 * 1000) { ++ throw new RuntimeException("time is more than 10 years from present: " + time + " " + timeString + " " + currencyInfo); + } + specialCaseCutOverTimes[specialCaseCount] = time; + specialCaseOldCurrencies[specialCaseCount] = oldCurrency; +--- ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Mon Jan 05 11:57:27 2015 -0800 +@@ -755,7 +755,7 @@ + public void notifyNCMouseDown() { + // Ungrab except for a click on a Dialog with the grabbing owner + if (grabbingWindow != null && +- grabbingWindow != getOwnerFrameDialog(this)) ++ !grabbingWindow.isOneOfOwnersOf(this)) + { + grabbingWindow.ungrab(); + } +@@ -851,7 +851,7 @@ + + // Ungrab only if this window is not an owned window of the grabbing one. + if (!isGrabbing() && grabbingWindow != null && +- grabbingWindow != getOwnerFrameDialog(this)) ++ !grabbingWindow.isOneOfOwnersOf(this)) + { + grabbingWindow.ungrab(); + } +@@ -1321,6 +1321,17 @@ + return !(window instanceof Dialog || window instanceof Frame); + } + ++ private boolean isOneOfOwnersOf(LWWindowPeer peer) { ++ Window owner = (peer != null ? peer.getTarget().getOwner() : null); ++ while (owner != null) { ++ if ((LWWindowPeer)owner.getPeer() == this) { ++ return true; ++ } ++ owner = owner.getOwner(); ++ } ++ return false; ++ } ++ + /* + * Changes focused window on java level. + */ +@@ -1352,7 +1363,7 @@ + // - when the opposite (gaining focus) window is an owned/owner window. + // - for a simple window in any case. + if (!becomesFocused && +- (isGrabbing() || getOwnerFrameDialog(grabbingWindow) == this)) ++ (isGrabbing() || this.isOneOfOwnersOf(grabbingWindow))) + { + focusLog.fine("ungrabbing on " + grabbingWindow); + // ungrab a simple window if its owner looses activation. +@@ -1369,6 +1380,11 @@ + postEvent(windowEvent); + } + ++ /* ++ * Retrieves the owner of the peer. ++ * Note: this method returns the owner which can be activated, (i.e. the instance ++ * of Frame or Dialog may be returned). ++ */ + static LWWindowPeer getOwnerFrameDialog(LWWindowPeer peer) { + Window owner = (peer != null ? peer.getTarget().getOwner() : null); + while (owner != null && !(owner instanceof Frame || owner instanceof Dialog)) { +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java Mon Jan 05 11:57:27 2015 -0800 +@@ -39,7 +39,8 @@ + + private CPlatformResponder responder; + private static final Object classLock = new Object(); +- private static volatile CEmbeddedFrame focusedWindow; ++ private static volatile CEmbeddedFrame globalFocusedWindow; ++ private CEmbeddedFrame browserWindowFocusedApplet; + private boolean parentWindowActive = true; + + public CEmbeddedFrame() { +@@ -98,7 +99,8 @@ + public void handleKeyEvent(int eventType, int modifierFlags, String characters, + String charsIgnoringMods, boolean isRepeat, short keyCode, + boolean needsKeyTyped) { +- responder.handleKeyEvent(eventType, modifierFlags, charsIgnoringMods, keyCode, needsKeyTyped, isRepeat); ++ responder.handleKeyEvent(eventType, modifierFlags, characters, charsIgnoringMods, ++ keyCode, needsKeyTyped, isRepeat); + } + + // REMIND: delete this method once 'deploy' changes for 7156194 is pushed +@@ -117,10 +119,10 @@ + synchronized (classLock) { + // In some cases an applet may not receive the focus lost event + // from the parent window (see 8012330) +- focusedWindow = (focused) ? this +- : ((focusedWindow == this) ? null : focusedWindow); ++ globalFocusedWindow = (focused) ? this ++ : ((globalFocusedWindow == this) ? null : globalFocusedWindow); + } +- if (focusedWindow == this) { ++ if (globalFocusedWindow == this) { + // see bug 8010925 + // we can't put this to handleWindowFocusEvent because + // it won't be invoced if focuse is moved to a html element +@@ -150,9 +152,23 @@ + */ + public void handleWindowFocusEvent(boolean parentWindowActive) { + this.parentWindowActive = parentWindowActive; ++ // If several applets are running in different browser's windows, it is necessary to ++ // detect the switching between the parent windows and update globalFocusedWindow accordingly. ++ synchronized (classLock) { ++ if (!parentWindowActive) { ++ this.browserWindowFocusedApplet = globalFocusedWindow; ++ } ++ if (parentWindowActive && globalFocusedWindow != this && isParentWindowChanged()) { ++ // It looks like we have switched to another browser window, let's restore focus to ++ // the previously focused applet in this window. If no applets were focused in the ++ // window, we will set focus to the first applet in the window. ++ globalFocusedWindow = (this.browserWindowFocusedApplet != null) ? this.browserWindowFocusedApplet ++ : this; ++ } ++ } + // ignore focus "lost" native request as it may mistakenly + // deactivate active window (see 8001161) +- if (focusedWindow == this && parentWindowActive) { ++ if (globalFocusedWindow == this && parentWindowActive) { + responder.handleWindowFocusEvent(parentWindowActive, null); + } + } +@@ -160,4 +176,10 @@ + public boolean isParentWindowActive() { + return parentWindowActive; + } ++ ++ private boolean isParentWindowChanged() { ++ // If globalFocusedWindow is located at inactive parent window or null, we have swithed to ++ // another window. ++ return globalFocusedWindow != null ? !globalFocusedWindow.isParentWindowActive() : true; ++ } + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java Mon Jan 05 11:57:27 2015 -0800 +@@ -126,7 +126,7 @@ + /** + * Handles key events. + */ +- void handleKeyEvent(int eventType, int modifierFlags, String chars, ++ void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers, + short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) { + boolean isFlagsChangedEvent = + isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) : +@@ -154,7 +154,10 @@ + testChar = chars.charAt(0); + } + +- int[] in = new int[] {testChar, isDeadChar ? 1 : 0, modifierFlags, keyCode}; ++ char testCharIgnoringModifiers = charsIgnoringModifiers != null && charsIgnoringModifiers.length() > 0 ? ++ charsIgnoringModifiers.charAt(0) : KeyEvent.CHAR_UNDEFINED; ++ ++ int[] in = new int[] {testCharIgnoringModifiers, isDeadChar ? 1 : 0, modifierFlags, keyCode}; + int[] out = new int[3]; // [jkeyCode, jkeyLocation, deadChar] + + postsTyped = NSEvent.nsToJavaKeyInfo(in, out); +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Mon Jan 05 11:57:27 2015 -0800 +@@ -227,7 +227,7 @@ + } + + private void deliverKeyEvent(NSEvent event) { +- responder.handleKeyEvent(event.getType(), event.getModifierFlags(), ++ responder.handleKeyEvent(event.getType(), event.getModifierFlags(), event.getCharacters(), + event.getCharactersIgnoringModifiers(), event.getKeyCode(), true, false); + } + +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Jan 05 11:57:27 2015 -0800 +@@ -118,6 +118,7 @@ + static final int NONACTIVATING = 1 << 24; + static final int IS_DIALOG = 1 << 25; + static final int IS_MODAL = 1 << 26; ++ static final int IS_POPUP = 1 << 27; + + static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE; + +@@ -308,6 +309,7 @@ + styleBits = SET(styleBits, TEXTURED, false); + // Popups in applets don't activate applet's process + styleBits = SET(styleBits, NONACTIVATING, true); ++ styleBits = SET(styleBits, IS_POPUP, true); + } + + if (Window.Type.UTILITY.equals(target.getType())) { +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/event/NSEvent.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/event/NSEvent.java Mon Jan 05 11:57:27 2015 -0800 +@@ -48,12 +48,14 @@ + + // Key event information + private short keyCode; ++ private String characters; + private String charactersIgnoringModifiers; + +- public NSEvent(int type, int modifierFlags, short keyCode, String charactersIgnoringModifiers) { ++ public NSEvent(int type, int modifierFlags, short keyCode, String characters, String charactersIgnoringModifiers) { + this.type = type; + this.modifierFlags = modifierFlags; + this.keyCode = keyCode; ++ this.characters = characters; + this.charactersIgnoringModifiers = charactersIgnoringModifiers; + } + +@@ -120,12 +122,16 @@ + return charactersIgnoringModifiers; + } + ++ public String getCharacters() { ++ return characters; ++ } ++ + @Override + public String toString() { + return "NSEvent[" + getType() + " ," + getModifierFlags() + " ," + + getClickCount() + " ," + getButtonNumber() + " ," + getX() + " ," + + getY() + " ," + getAbsX() + " ," + getAbsY()+ " ," + getKeyCode() + " ," +- + getCharactersIgnoringModifiers() + "]"; ++ + getCharacters() + " ," + getCharactersIgnoringModifiers() + "]"; + } + + /* +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/macosx/classes/sun/nio/ch/SctpChannelImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,150 @@ ++/* ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package sun.nio.ch; ++ ++import java.net.SocketAddress; ++import java.net.InetAddress; ++import java.io.IOException; ++import java.util.Set; ++import java.nio.ByteBuffer; ++import java.nio.channels.spi.SelectorProvider; ++import com.sun.nio.sctp.Association; ++import com.sun.nio.sctp.MessageInfo; ++import com.sun.nio.sctp.NotificationHandler; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.SctpSocketOption; ++ ++/** ++ * Unimplemented. ++ */ ++public class SctpChannelImpl extends SctpChannel ++{ ++ private static final String message = "SCTP not supported on this platform"; ++ ++ public SctpChannelImpl(SelectorProvider provider) { ++ super(provider); ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Association association() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel bind(SocketAddress local) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel bindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel unbindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean connect(SocketAddress remote) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean connect(SocketAddress remote, int maxOutStreams, ++ int maxInStreams) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean isConnectionPending() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean finishConnect() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SocketAddress> getAllLocalAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SocketAddress> getRemoteAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel shutdown() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> T getOption(SctpSocketOption<T> name) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> SctpChannel setOption(SctpSocketOption<T> name, T value) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SctpSocketOption<?>> supportedOptions() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> MessageInfo receive(ByteBuffer dst, T attachment, ++ NotificationHandler<T> handler) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public int send(ByteBuffer src, MessageInfo messageInfo) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ protected void implConfigureBlocking(boolean block) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public void implCloseSelectableChannel() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/macosx/classes/sun/nio/ch/SctpMultiChannelImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,137 @@ ++/* ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package sun.nio.ch; ++ ++import java.net.SocketAddress; ++import java.net.InetAddress; ++import java.io.IOException; ++import java.util.Set; ++import java.nio.ByteBuffer; ++import java.nio.channels.spi.SelectorProvider; ++import com.sun.nio.sctp.Association; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.MessageInfo; ++import com.sun.nio.sctp.NotificationHandler; ++import com.sun.nio.sctp.SctpMultiChannel; ++import com.sun.nio.sctp.SctpSocketOption; ++ ++/** ++ * Unimplemented. ++ */ ++public class SctpMultiChannelImpl extends SctpMultiChannel ++{ ++ private static final String message = "SCTP not supported on this platform"; ++ ++ public SctpMultiChannelImpl(SelectorProvider provider) { ++ super(provider); ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<Association> associations() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel bind(SocketAddress local, ++ int backlog) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel bindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel unbindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SocketAddress> getAllLocalAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SocketAddress> getRemoteAddresses ++ (Association association) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel shutdown(Association association) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> T getOption(SctpSocketOption<T> name, ++ Association association) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> SctpMultiChannel setOption(SctpSocketOption<T> name, ++ T value, Association association) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SctpSocketOption<?>> supportedOptions() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> MessageInfo receive(ByteBuffer buffer, T attachment, ++ NotificationHandler<T> handler) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public int send(ByteBuffer buffer, MessageInfo messageInfo) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel branch(Association association) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ protected void implConfigureBlocking(boolean block) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public void implCloseSelectableChannel() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/macosx/classes/sun/nio/ch/SctpServerChannelImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,102 @@ ++/* ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package sun.nio.ch; ++ ++import java.net.SocketAddress; ++import java.net.InetAddress; ++import java.io.IOException; ++import java.util.Set; ++import java.nio.channels.spi.SelectorProvider; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.SctpServerChannel; ++import com.sun.nio.sctp.SctpSocketOption; ++ ++/** ++ * Unimplemented. ++ */ ++public class SctpServerChannelImpl extends SctpServerChannel ++{ ++ private static final String message = "SCTP not supported on this platform"; ++ ++ public SctpServerChannelImpl(SelectorProvider provider) { ++ super(provider); ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel accept() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel bind(SocketAddress local, ++ int backlog) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel bindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel unbindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SocketAddress> getAllLocalAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> T getOption(SctpSocketOption<T> name) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public <T> SctpServerChannel setOption(SctpSocketOption<T> name, ++ T value) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set<SctpSocketOption<?>> supportedOptions() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ protected void implConfigureBlocking(boolean block) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public void implCloseSelectableChannel() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++} +--- ./jdk/src/macosx/native/sun/awt/AWTView.m Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/AWTView.m Mon Jan 05 11:57:27 2015 -0800 +@@ -421,17 +421,20 @@ + JNIEnv *env = [ThreadUtilities getJNIEnv]; + + jstring characters = NULL; ++ jstring charactersIgnoringModifiers = NULL; + if ([event type] != NSFlagsChanged) { + characters = JNFNSToJavaString(env, [event characters]); ++ charactersIgnoringModifiers = JNFNSToJavaString(env, [event charactersIgnoringModifiers]); + } + + static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/event/NSEvent"); +- static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;)V"); ++ static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;Ljava/lang/String;)V"); + jobject jevent = JNFNewObject(env, jctor_NSEvent, + [event type], + [event modifierFlags], + [event keyCode], +- characters); ++ characters, ++ charactersIgnoringModifiers); + + static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); + static JNF_MEMBER_CACHE(jm_deliverKeyEvent, jc_PlatformView, +--- ./jdk/src/macosx/native/sun/awt/AWTWindow.m Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/AWTWindow.m Mon Jan 05 11:57:27 2015 -0800 +@@ -307,6 +307,10 @@ + [self adjustGrowBoxWindow]; + } else growBoxWindow = nil; + ++ if (IS(self.styleBits, IS_POPUP)) { ++ [self.nsWindow setCollectionBehavior:(1 << 8) /*NSWindowCollectionBehaviorFullScreenAuxiliary*/]; ++ } ++ + return self; + } + +@@ -316,7 +320,8 @@ + + // return id for the topmost window under mouse + + (NSInteger) getTopmostWindowUnderMouseID { +- ++ NSInteger result = -1; ++ + NSRect screenRect = [[NSScreen mainScreen] frame]; + NSPoint nsMouseLocation = [NSEvent mouseLocation]; + CGPoint cgMouseLocation = CGPointMake(nsMouseLocation.x, screenRect.size.height - nsMouseLocation.y); +@@ -330,11 +335,13 @@ + CGRect rect; + CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[window objectForKey:(id)kCGWindowBounds], &rect); + if (CGRectContainsPoint(rect, cgMouseLocation)) { +- return [[window objectForKey:(id)kCGWindowNumber] integerValue]; ++ result = [[window objectForKey:(id)kCGWindowNumber] integerValue]; ++ break; + } + } + } +- return -1; ++ [windows release]; ++ return result; + } + + // checks that this window is under the mouse cursor and this point is not overlapped by other windows +--- ./jdk/src/macosx/native/sun/awt/JavaComponentAccessibility.m Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/JavaComponentAccessibility.m Mon Jan 05 11:57:27 2015 -0800 +@@ -256,11 +256,15 @@ + jsize count = [ignoredKeys count]; + + JNIEnv *env = [ThreadUtilities getJNIEnv]; +- jclass clazz = (*env)->FindClass(env, "java/lang/String"); +- result = (*env)->NewObjectArray(env, count, clazz, NULL); // AWT_THREADING Safe (known object) +- (*env)->DeleteLocalRef(env, clazz); + +- NSUInteger i; ++ static JNF_CLASS_CACHE(jc_String, "java/lang/String"); ++ result = JNFNewObjectArray(env, &jc_String, count); ++ if (!result) { ++ NSLog(@"In %s, can't create Java array of String objects", __FUNCTION__); ++ return; ++ } ++ ++ NSInteger i; + for (i = 0; i < count; i++) { + jstring jString = JNFNSToJavaString(env, [ignoredKeys objectAtIndex:i]); + (*env)->SetObjectArrayElement(env, result, i, jString); +@@ -295,7 +299,7 @@ + jsize arrayLen = (*env)->GetArrayLength(env, jchildrenAndRoles); + NSMutableArray *children = [NSMutableArray arrayWithCapacity:arrayLen/2]; //childrenAndRoles array contains two elements (child, role) for each child + +- NSUInteger i; ++ NSInteger i; + NSUInteger childIndex = (whichChildren >= 0) ? whichChildren : 0; // if we're getting one particular child, make sure to set its index correctly + for(i = 0; i < arrayLen; i+=2) + { +@@ -391,8 +395,13 @@ + // Get all the other accessibility attributes states we need in one swell foop. + // javaRole isn't pulled in because we need protected access to AccessibleRole.key + jbooleanArray attributeStates = JNFCallStaticObjectMethod(env, jm_getInitialAttributeStates, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) +- if (attributeStates == NULL) return NULL; ++ if (attributeStates == NULL) return nil; + jboolean *attributeStatesArray = (*env)->GetBooleanArrayElements(env, attributeStates, 0); ++ if (attributeStatesArray == NULL) { ++ // Note: Java will not be on the stack here so a java exception can't happen and no need to call ExceptionCheck. ++ NSLog(@"%s failed calling GetBooleanArrayElements", __FUNCTION__); ++ return nil; ++ } + + // if there's a component, it can be enabled and it has a size/position + if (attributeStatesArray[0]) { +@@ -1113,7 +1122,9 @@ + JNIEnv *env = [ThreadUtilities getJNIEnv]; + id value = nil; + ++ NSWindow* hostWindow = [[self->fView window] retain]; + jobject focused = JNFCallStaticObjectMethod(env, jm_getFocusOwner, fComponent); // AWT_THREADING Safe (AWTRunLoop) ++ [hostWindow release]; + if (focused != NULL) { + if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) { + value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView]; +@@ -1220,7 +1231,7 @@ + // Go through the tabs and find selAccessible + _numTabs = [tabs count]; + JavaComponentAccessibility *aTab; +- NSUInteger i; ++ NSInteger i; + for (i = 0; i < _numTabs; i++) { + aTab = (JavaComponentAccessibility *)[tabs objectAtIndex:i]; + if ([aTab isAccessibleWithEnv:env forAccessible:selAccessible]) { +@@ -1247,7 +1258,7 @@ + + NSString *tabJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jtabJavaRole, sjf_key)); + +- NSUInteger i; ++ NSInteger i; + NSUInteger tabIndex = (whichTabs >= 0) ? whichTabs : 0; // if we're getting one particular child, make sure to set its index correctly + for(i = 0; i < arrayLen; i+=2) { + jobject jtab = (*env)->GetObjectArrayElement(env, jtabsAndRoles, i); +--- ./jdk/src/macosx/native/sun/awt/JavaTextAccessibility.m Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/JavaTextAccessibility.m Mon Jan 05 11:57:27 2015 -0800 +@@ -40,6 +40,11 @@ + */ + NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { + jint *values = (*env)->GetIntArrayElements(env, array, 0); ++ if (values == NULL) { ++ // Note: Java will not be on the stack here so a java exception can't happen and no need to call ExceptionCheck. ++ NSLog(@"%s failed calling GetIntArrayElements", __FUNCTION__); ++ return nil; ++ }; + NSValue *value = [NSValue valueWithRange:NSMakeRange(values[0], values[1] - values[0])]; + (*env)->ReleaseIntArrayElements(env, array, values, 0); + return value; +@@ -285,6 +290,11 @@ + + // We cheat because we know that the array is 4 elements long (x, y, width, height) + jdouble *values = (*env)->GetDoubleArrayElements(env, axBounds, 0); ++ if (values == NULL) { ++ // Note: Java will not be on the stack here so a java exception can't happen and no need to call ExceptionCheck. ++ NSLog(@"%s failed calling GetDoubleArrayElements", __FUNCTION__); ++ return nil; ++ }; + NSRect bounds; + bounds.origin.x = values[0]; + bounds.origin.y = [[[[self view] window] screen] frame].size.height - values[1] - values[3]; //values[1] is y-coord from top-left of screen. Flip. Account for the height (values[3]) when flipping +--- ./jdk/src/share/classes/com/sun/crypto/provider/OAEPParameters.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/crypto/provider/OAEPParameters.java Mon Jan 05 11:57:27 2015 -0800 +@@ -106,20 +106,6 @@ + } + } + +- private static String convertToStandardName(String internalName) { +- if (internalName.equals("SHA")) { +- return "SHA-1"; +- } else if (internalName.equals("SHA256")) { +- return "SHA-256"; +- } else if (internalName.equals("SHA384")) { +- return "SHA-384"; +- } else if (internalName.equals("SHA512")) { +- return "SHA-512"; +- } else { +- return internalName; +- } +- } +- + protected void engineInit(byte[] encoded) + throws IOException { + DerInputStream der = new DerInputStream(encoded); +@@ -131,7 +117,7 @@ + DerValue data = datum[i]; + if (data.isContextSpecific((byte) 0x00)) { + // hash algid +- mdName = convertToStandardName(AlgorithmId.parse ++ mdName = AlgorithmId.getStandardDigestName(AlgorithmId.parse + (data.data.getDerValue()).getName()); + } else if (data.isContextSpecific((byte) 0x01)) { + // mgf algid +@@ -141,7 +127,8 @@ + } + AlgorithmId params = AlgorithmId.parse( + new DerValue(val.getEncodedParams())); +- String mgfDigestName = convertToStandardName(params.getName()); ++ String mgfDigestName = AlgorithmId.getStandardDigestName( ++ params.getName()); + if (mgfDigestName.equals("SHA-1")) { + mgfSpec = MGF1ParameterSpec.SHA1; + } else if (mgfDigestName.equals("SHA-256")) { +--- ./jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1256,8 +1256,11 @@ + if (name.equals("IHDR")) { + IHDR_width = getIntAttribute(node, "width"); + IHDR_height = getIntAttribute(node, "height"); +- IHDR_bitDepth = getEnumeratedAttribute(node, "bitDepth", +- IHDR_bitDepths); ++ IHDR_bitDepth = ++ Integer.valueOf(IHDR_bitDepths[ ++ getEnumeratedAttribute(node, ++ "bitDepth", ++ IHDR_bitDepths)]); + IHDR_colorType = getEnumeratedAttribute(node, "colorType", + IHDR_colorTypeNames); + IHDR_compressionMethod = +--- ./jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java Mon Jan 05 11:57:27 2015 -0800 +@@ -27,6 +27,8 @@ + + import sun.awt.EventQueueDelegate; + import sun.awt.AppContext; ++import sun.awt.SunToolkit; ++ + import java.util.Collections; + import java.util.Map; + import java.util.WeakHashMap; +@@ -117,8 +119,8 @@ + public static RepaintManager getDelegateRepaintManager(Component + component) { + RepaintManager delegate = null; +- if (Boolean.TRUE == AppContext.getAppContext().get( +- DELEGATE_REPAINT_MANAGER_KEY)) { ++ if (Boolean.TRUE == SunToolkit.targetToAppContext(component) ++ .get(DELEGATE_REPAINT_MANAGER_KEY)) { + while (delegate == null && component != null) { + while (component != null + && ! (component instanceof JComponent)) { +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/AnimationController.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/AnimationController.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -130,11 +130,14 @@ + //one second seems plausible value + duration = 1000; + } else { +- duration = XPStyle.getXP().getThemeTransitionDuration( +- c, part, +- normalizeState(oldState), +- normalizeState(newState), +- Prop.TRANSITIONDURATIONS); ++ XPStyle xp = XPStyle.getXP(); ++ duration = (xp != null) ++ ? xp.getThemeTransitionDuration( ++ c, part, ++ normalizeState(oldState), ++ normalizeState(newState), ++ Prop.TRANSITIONDURATIONS) ++ : 1000; + } + controller.startAnimation(c, part, oldState, newState, duration); + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -37,6 +37,7 @@ + import static com.sun.java.swing.plaf.windows.TMSchema.Part; + import static com.sun.java.swing.plaf.windows.TMSchema.State; + import static com.sun.java.swing.plaf.windows.XPStyle.Skin; ++ + import sun.swing.DefaultLookup; + import sun.swing.StringUIClientPropertyKey; + +@@ -231,6 +232,9 @@ + + private void paintXPComboBoxBackground(Graphics g, JComponent c) { + XPStyle xp = XPStyle.getXP(); ++ if (xp == null) { ++ return; ++ } + State state = getXPComboBoxState(c); + Skin skin = null; + if (! comboBox.isEditable() +@@ -400,17 +404,18 @@ + * @return a button which represents the popup control + */ + protected JButton createArrowButton() { +- if (XPStyle.getXP() != null) { +- return new XPComboBoxButton(); ++ XPStyle xp = XPStyle.getXP(); ++ if (xp != null) { ++ return new XPComboBoxButton(xp); + } else { + return super.createArrowButton(); + } + } + + private class XPComboBoxButton extends XPStyle.GlyphButton { +- public XPComboBoxButton() { ++ public XPComboBoxButton(XPStyle xp) { + super(null, +- (! XPStyle.getXP().isSkinDefined(comboBox, Part.CP_DROPDOWNBUTTONRIGHT)) ++ (! xp.isSkinDefined(comboBox, Part.CP_DROPDOWNBUTTONRIGHT)) + ? Part.CP_DROPDOWNBUTTON + : (comboBox.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT) + ? Part.CP_DROPDOWNBUTTONLEFT +@@ -423,10 +428,11 @@ + protected State getState() { + State rv; + rv = super.getState(); ++ XPStyle xp = XPStyle.getXP(); + if (rv != State.DISABLED + && comboBox != null && ! comboBox.isEditable() +- && XPStyle.getXP().isSkinDefined(comboBox, +- Part.CP_DROPDOWNBUTTONRIGHT)) { ++ && xp != null && xp.isSkinDefined(comboBox, ++ Part.CP_DROPDOWNBUTTONRIGHT)) { + /* + * for non editable ComboBoxes Vista seems to have the + * same glyph for all non DISABLED states +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1067,16 +1067,9 @@ + + directories.clear(); + +- File[] baseFolders; +- if (useShellFolder) { +- baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { +- public File[] run() { +- return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); +- } +- }); +- } else { +- baseFolders = fsv.getRoots(); +- } ++ File[] baseFolders = (useShellFolder) ++ ? (File[]) ShellFolder.get("fileChooserComboBoxFolders") ++ : fsv.getRoots(); + directories.addAll(Arrays.asList(baseFolders)); + + // Get the canonical (full) path. This has the side +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -125,6 +125,9 @@ + static void paintXPText(AbstractButton b, Part part, State state, + Graphics g, int x, int y, String text, int mnemIndex) { + XPStyle xp = XPStyle.getXP(); ++ if (xp == null) { ++ return; ++ } + Color textColor = b.getForeground(); + + if (textColor instanceof UIResource) { +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -613,8 +613,8 @@ + + private static class MenuArrowIcon implements Icon, UIResource, Serializable { + public void paintIcon(Component c, Graphics g, int x, int y) { +- if (WindowsMenuItemUI.isVistaPainting()) { +- XPStyle xp = XPStyle.getXP(); ++ XPStyle xp = XPStyle.getXP(); ++ if (WindowsMenuItemUI.isVistaPainting(xp)) { + State state = State.NORMAL; + if (c instanceof JMenuItem) { + state = ((JMenuItem) c).getModel().isEnabled() +@@ -647,16 +647,18 @@ + } + } + public int getIconWidth() { +- if (WindowsMenuItemUI.isVistaPainting()) { +- Skin skin = XPStyle.getXP().getSkin(null, Part.MP_POPUPSUBMENU); ++ XPStyle xp = XPStyle.getXP(); ++ if (WindowsMenuItemUI.isVistaPainting(xp)) { ++ Skin skin = xp.getSkin(null, Part.MP_POPUPSUBMENU); + return skin.getWidth(); + } else { + return 4; + } + } + public int getIconHeight() { +- if (WindowsMenuItemUI.isVistaPainting()) { +- Skin skin = XPStyle.getXP().getSkin(null, Part.MP_POPUPSUBMENU); ++ XPStyle xp = XPStyle.getXP(); ++ if (WindowsMenuItemUI.isVistaPainting(xp)) { ++ Skin skin = xp.getSkin(null, Part.MP_POPUPSUBMENU); + return skin.getHeight(); + } else { + return 8; +@@ -682,7 +684,8 @@ + } + + static int getIconWidth() { +- return XPStyle.getXP().getSkin(null, Part.MP_POPUPCHECK).getWidth() ++ XPStyle xp = XPStyle.getXP(); ++ return ((xp != null) ? xp.getSkin(null, Part.MP_POPUPCHECK).getWidth() : 16) + + 2 * OFFSET; + } + +@@ -745,12 +748,17 @@ + Icon icon = getIcon(); + int height = 0; + if (icon != null) { +- height = icon.getIconHeight() + 2 * OFFSET; ++ height = icon.getIconHeight(); + } else { +- Skin skin = +- XPStyle.getXP().getSkin(null, Part.MP_POPUPCHECK); +- height = skin.getHeight() + 2 * OFFSET; ++ XPStyle xp = XPStyle.getXP(); ++ if (xp != null) { ++ Skin skin = xp.getSkin(null, Part.MP_POPUPCHECK); ++ height = skin.getHeight(); ++ } else { ++ height = 16; ++ } + } ++ height += 2 * OFFSET; + return height; + } + +@@ -798,14 +806,16 @@ + ? State.BULLETDISABLED + : State.CHECKMARKDISABLED; + } +- Skin skin; + XPStyle xp = XPStyle.getXP(); +- skin = xp.getSkin(c, backgroundPart); +- skin.paintSkin(g, x, y, +- getIconWidth(), getIconHeight(), backgroundState); +- if (icon == null) { +- skin = xp.getSkin(c, part); +- skin.paintSkin(g, x + OFFSET, y + OFFSET, state); ++ if (xp != null) { ++ Skin skin; ++ skin = xp.getSkin(c, backgroundPart); ++ skin.paintSkin(g, x, y, ++ getIconWidth(), getIconHeight(), backgroundState); ++ if (icon == null) { ++ skin = xp.getSkin(c, part); ++ skin.paintSkin(g, x + OFFSET, y + OFFSET, state); ++ } + } + } + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -85,14 +85,15 @@ + } + } else { + buttonWidth += 2; +- selectedTitleGradientColor = +- UIManager.getColor("InternalFrame.activeTitleGradient"); +- notSelectedTitleGradientColor = +- UIManager.getColor("InternalFrame.inactiveTitleGradient"); + Color activeBorderColor = + UIManager.getColor("InternalFrame.activeBorderColor"); + setBorder(BorderFactory.createLineBorder(activeBorderColor, 1)); + } ++ // JDK-8039383: initialize these colors because getXP() may return null when theme is changed ++ selectedTitleGradientColor = ++ UIManager.getColor("InternalFrame.activeTitleGradient"); ++ notSelectedTitleGradientColor = ++ UIManager.getColor("InternalFrame.inactiveTitleGradient"); + } + + protected void uninstallListeners() { +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -2400,8 +2400,9 @@ + } + + public Object getXPValue(UIDefaults table) { +- Border xpBorder = XPStyle.getXP().getBorder(null, (Part)xpValue); +- if (extraMargin != null) { ++ XPStyle xp = XPStyle.getXP(); ++ Border xpBorder = xp != null ? xp.getBorder(null, (Part)xpValue) : null; ++ if (xpBorder != null && extraMargin != null) { + return new BorderUIResource. + CompoundBorderUIResource(xpBorder, extraMargin); + } else { +@@ -2417,7 +2418,8 @@ + + public Object getXPValue(UIDefaults table) { + XPColorValueKey key = (XPColorValueKey)xpValue; +- return XPStyle.getXP().getColor(key.skin, key.prop, null); ++ XPStyle xp = XPStyle.getXP(); ++ return xp != null ? xp.getColor(key.skin, key.prop, null) : null; + } + + private static class XPColorValueKey { +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -155,8 +155,8 @@ + + @Override + public void paint(Graphics g, JComponent c) { +- if (WindowsMenuItemUI.isVistaPainting()) { +- XPStyle xp = XPStyle.getXP(); ++ XPStyle xp = XPStyle.getXP(); ++ if (WindowsMenuItemUI.isVistaPainting(xp)) { + Skin skin; + skin = xp.getSkin(c, Part.MP_BARBACKGROUND); + int width = c.getWidth(); +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -108,8 +108,9 @@ + + static void paintBackground(WindowsMenuItemUIAccessor menuItemUI, + Graphics g, JMenuItem menuItem, Color bgColor) { +- assert isVistaPainting(); +- if (isVistaPainting()) { ++ XPStyle xp = XPStyle.getXP(); ++ assert isVistaPainting(xp); ++ if (isVistaPainting(xp)) { + int menuWidth = menuItem.getWidth(); + int menuHeight = menuItem.getHeight(); + if (menuItem.isOpaque()) { +@@ -118,7 +119,6 @@ + g.fillRect(0,0, menuWidth, menuHeight); + g.setColor(oldColor); + } +- XPStyle xp = XPStyle.getXP(); + Part part = menuItemUI.getPart(menuItem); + Skin skin = xp.getSkin(menuItem, part); + skin.paintSkin(g, 0 , 0, +@@ -170,8 +170,11 @@ + * is it possible that in some theme some Vista parts are not defined while + * others are? + */ +- static boolean isVistaPainting() { +- XPStyle xp = XPStyle.getXP(); ++ static boolean isVistaPainting(final XPStyle xp) { + return xp != null && xp.isSkinDefined(null, Part.MP_POPUPITEM); + } ++ ++ static boolean isVistaPainting() { ++ return isVistaPainting(XPStyle.getXP()); ++ } + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -50,7 +50,8 @@ + + public void paint(Graphics g, JComponent c) { + Dimension s = c.getSize(); +- if (WindowsMenuItemUI.isVistaPainting()) { ++ XPStyle xp = XPStyle.getXP(); ++ if (WindowsMenuItemUI.isVistaPainting(xp)) { + int x = 1; + Component parent = c.getParent(); + if (parent instanceof JComponent) { +@@ -67,7 +68,7 @@ + x += WindowsPopupMenuUI.getGutterWidth(); + } + } +- Skin skin = XPStyle.getXP().getSkin(c, Part.MP_POPUPSEPARATOR); ++ Skin skin = xp.getSkin(c, Part.MP_POPUPSEPARATOR); + int skinHeight = skin.getHeight(); + int y = (s.height - skinHeight) / 2; + skin.paintSkin(g, x, y, s.width - x - 1, skinHeight, State.NORMAL); +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -194,8 +194,8 @@ + + @Override + public void paint(Graphics g, JComponent c) { +- if (WindowsMenuItemUI.isVistaPainting()) { +- XPStyle xp = XPStyle.getXP(); ++ XPStyle xp = XPStyle.getXP(); ++ if (WindowsMenuItemUI.isVistaPainting(xp)) { + Skin skin = xp.getSkin(c, Part.MP_POPUPBACKGROUND); + skin.paintSkin(g, 0, 0, c.getWidth(),c.getHeight(), State.NORMAL); + int textOffset = getTextOffset(c); +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsProgressBarUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -317,8 +317,9 @@ + private Rectangle getFullChunkBounds(Rectangle box) { + boolean vertical = (progressBar.getOrientation() == JProgressBar.VERTICAL); + XPStyle xp = XPStyle.getXP(); +- int gap = xp.getInt(progressBar, Part.PP_PROGRESS, null, +- Prop.PROGRESSSPACESIZE, 0); ++ int gap = (xp != null) ? xp.getInt(progressBar, Part.PP_PROGRESS, ++ null, Prop.PROGRESSSPACESIZE, 0) ++ : 0; + + if (!vertical) { + int chunksize = box.width+gap; +@@ -333,6 +334,9 @@ + boolean vertical, + int bgwidth, int bgheight) { + XPStyle xp = XPStyle.getXP(); ++ if (xp == null) { ++ return; ++ } + + // create a new graphics to keep drawing surface state + Graphics2D gfx = (Graphics2D)g.create(); +@@ -391,6 +395,9 @@ + private void paintXPBackground(Graphics g, boolean vertical, + int barRectWidth, int barRectHeight) { + XPStyle xp = XPStyle.getXP(); ++ if (xp == null) { ++ return; ++ } + Part part = vertical ? Part.PP_BARVERT : Part.PP_BAR; + Skin skin = xp.getSkin(progressBar, part); + +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSliderUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSliderUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -215,7 +215,6 @@ + } + + private Part getXPThumbPart() { +- XPStyle xp = XPStyle.getXP(); + Part part; + boolean vertical = (slider.getOrientation() == JSlider.VERTICAL); + boolean leftToRight = slider.getComponentOrientation().isLeftToRight(); +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSpinnerUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsSpinnerUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -63,6 +63,9 @@ + + private void paintXPBackground(Graphics g, JComponent c) { + XPStyle xp = XPStyle.getXP(); ++ if (xp == null) { ++ return; ++ } + Skin skin = xp.getSkin(c, Part.EP_EDIT); + State state = getXPState(c); + skin.paintSkin(g, 0, 0, c.getWidth(), c.getHeight(), state); +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -90,9 +90,10 @@ + this.column = column; + this.hasRollover = (column == getRolloverColumn()); + if (skin == null) { +- skin = XPStyle.getXP().getSkin(header, Part.HP_HEADERITEM); ++ XPStyle xp = XPStyle.getXP(); ++ skin = (xp != null) ? xp.getSkin(header, Part.HP_HEADERITEM) : null; + } +- Insets margins = skin.getContentMargin(); ++ Insets margins = (skin != null) ? skin.getContentMargin() : null; + Border border = null; + int contentTop = 0; + int contentLeft = 0; +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -115,7 +115,7 @@ + } + } + } +- return xp; ++ return ThemeReader.isXPStyleEnabled() ? xp : null; + } + + static boolean isVista() { +@@ -180,9 +180,10 @@ + * should probably be cached there instead of here. + */ + Dimension getDimension(Component c, Part part, State state, Prop prop) { +- return ThemeReader.getPosition(part.getControlName(c), part.getValue(), +- State.getValue(part, state), +- prop.getValue()); ++ Dimension d = ThemeReader.getPosition(part.getControlName(c), part.getValue(), ++ State.getValue(part, state), ++ prop.getValue()); ++ return (d != null) ? d : new Dimension(); + } + + /** Get a named <code>Point</code> (e.g. a location or an offset) value +@@ -199,11 +200,7 @@ + Dimension d = ThemeReader.getPosition(part.getControlName(c), part.getValue(), + State.getValue(part, state), + prop.getValue()); +- if (d != null) { +- return new Point(d.width, d.height); +- } else { +- return null; +- } ++ return (d != null) ? new Point(d.width, d.height) : new Point(); + } + + /** Get a named <code>Insets</code> value from the current style +@@ -217,9 +214,10 @@ + * The return value is already cached in those places. + */ + Insets getMargin(Component c, Part part, State state, Prop prop) { +- return ThemeReader.getThemeMargins(part.getControlName(c), part.getValue(), +- State.getValue(part, state), +- prop.getValue()); ++ Insets insets = ThemeReader.getThemeMargins(part.getControlName(c), part.getValue(), ++ State.getValue(part, state), ++ prop.getValue()); ++ return (insets != null) ? insets : new Insets(0, 0, 0, 0); + } + + +@@ -505,16 +503,17 @@ + int boundingWidth = 100; + int boundingHeight = 100; + +- return ThemeReader.getThemeBackgroundContentMargins( ++ Insets insets = ThemeReader.getThemeBackgroundContentMargins( + part.getControlName(null), part.getValue(), + 0, boundingWidth, boundingHeight); ++ return (insets != null) ? insets : new Insets(0, 0, 0, 0); + } + + private int getWidth(State state) { + if (size == null) { + size = getPartSize(part, state); + } +- return size.width; ++ return (size != null) ? size.width : 0; + } + + int getWidth() { +@@ -525,7 +524,7 @@ + if (size == null) { + size = getPartSize(part, state); + } +- return size.height; ++ return (size != null) ? size.height : 0; + } + + int getHeight() { +@@ -582,6 +581,9 @@ + * @param state which state to paint + */ + void paintSkin(Graphics g, int dx, int dy, int dw, int dh, State state) { ++ if (XPStyle.getXP() == null) { ++ return; ++ } + if (ThemeReader.isGetThemeTransitionDurationDefined() + && component instanceof JComponent + && SwingUtilities.getAncestorOfClass(CellRendererPane.class, +@@ -607,6 +609,9 @@ + * @param state which state to paint + */ + void paintSkinRaw(Graphics g, int dx, int dy, int dw, int dh, State state) { ++ if (XPStyle.getXP() == null) { ++ return; ++ } + skinPainter.paint(null, g, dx, dy, dw, dh, this, state); + } + +@@ -625,6 +630,9 @@ + */ + void paintSkin(Graphics g, int dx, int dy, int dw, int dh, State state, + boolean borderFill) { ++ if (XPStyle.getXP() == null) { ++ return; ++ } + if(borderFill && "borderfill".equals(getTypeEnumName(component, part, + state, Prop.BGTYPE))) { + return; +@@ -679,7 +687,7 @@ + + public GlyphButton(Component parent, Part part) { + XPStyle xp = getXP(); +- skin = xp.getSkin(parent, part); ++ skin = xp != null ? xp.getSkin(parent, part) : null; + setBorder(null); + setContentAreaFilled(false); + setMinimumSize(new Dimension(5, 5)); +@@ -704,13 +712,16 @@ + } + + public void paintComponent(Graphics g) { ++ if (XPStyle.getXP() == null || skin == null) { ++ return; ++ } + Dimension d = getSize(); + skin.paintSkin(g, 0, 0, d.width, d.height, getState()); + } + + public void setPart(Component parent, Part part) { + XPStyle xp = getXP(); +- skin = xp.getSkin(parent, part); ++ skin = xp != null ? xp.getSkin(parent, part) : null; + revalidate(); + repaint(); + } +--- ./jdk/src/share/classes/com/sun/jndi/ldap/BerDecoder.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/jndi/ldap/BerDecoder.java Mon Jan 05 11:57:27 2015 -0800 +@@ -95,6 +95,9 @@ + for( int i = 0; i < lengthbyte; i++) { + retval = (retval << 8) + (buf[offset++] & 0xff); + } ++ if (retval < 0) { ++ throw new DecodeException("Invalid length bytes"); ++ } + return retval; + } else { + return lengthbyte; +--- ./jdk/src/share/classes/com/sun/jndi/ldap/Connection.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/jndi/ldap/Connection.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -464,10 +464,10 @@ + // will be woken up before readTimeout only if reply is + // available + ldr.wait(readTimeout); +- waited = true; + } else { + ldr.wait(15 * 1000); // 15 second timeout + } ++ waited = true; + } else { + break; + } +@@ -479,7 +479,7 @@ + } + + if ((rber == null) && waited) { +- removeRequest(ldr); ++ abandonRequest(ldr, null); + throw new NamingException("LDAP response read timed out, timeout used:" + + readTimeout + "ms." ); + +--- ./jdk/src/share/classes/java/awt/Component.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/Component.java Mon Jan 05 11:57:27 2015 -0800 +@@ -3394,7 +3394,7 @@ + (width > 0) && (height > 0)) { + PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE, + new Rectangle(x, y, width, height)); +- Toolkit.getEventQueue().postEvent(e); ++ SunToolkit.postEvent(SunToolkit.targetToAppContext(this), e); + } + } + } +--- ./jdk/src/share/classes/java/awt/EventQueue.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/EventQueue.java Mon Jan 05 11:57:27 2015 -0800 +@@ -209,6 +209,11 @@ + { + EventQueue.invokeAndWait(source, r); + } ++ ++ @Override ++ public long getMostRecentEventTime(EventQueue eventQueue) { ++ return eventQueue.getMostRecentEventTimeImpl(); ++ } + }); + } + +--- ./jdk/src/share/classes/java/awt/event/InputMethodEvent.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/event/InputMethodEvent.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,6 +25,10 @@ + + package java.awt.event; + ++import sun.awt.AWTAccessor; ++import sun.awt.AppContext; ++import sun.awt.SunToolkit; ++ + import java.awt.AWTEvent; + import java.awt.Component; + import java.awt.EventQueue; +@@ -217,8 +221,10 @@ + public InputMethodEvent(Component source, int id, + AttributedCharacterIterator text, int committedCharacterCount, + TextHitInfo caret, TextHitInfo visiblePosition) { +- this(source, id, EventQueue.getMostRecentEventTime(), text, +- committedCharacterCount, caret, visiblePosition); ++ this(source, id, ++ getMostRecentEventTimeForSource(source), ++ text, committedCharacterCount, ++ caret, visiblePosition); + } + + /** +@@ -258,8 +264,9 @@ + */ + public InputMethodEvent(Component source, int id, TextHitInfo caret, + TextHitInfo visiblePosition) { +- this(source, id, EventQueue.getMostRecentEventTime(), null, +- 0, caret, visiblePosition); ++ this(source, id, ++ getMostRecentEventTimeForSource(source), ++ null, 0, caret, visiblePosition); + } + + /** +@@ -410,7 +417,26 @@ + private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException { + s.defaultReadObject(); + if (when == 0) { ++ // Can't use getMostRecentEventTimeForSource because source is always null during deserialization + when = EventQueue.getMostRecentEventTime(); + } + } ++ ++ /** ++ * Get the most recent event time in the {@code EventQueue} which the {@code source} ++ * belongs to. ++ * ++ * @param source the source of the event ++ * @exception IllegalArgumentException if source is null. ++ * @return most recent event time in the {@code EventQueue} ++ */ ++ private static long getMostRecentEventTimeForSource(Object source) { ++ if (source == null) { ++ // throw the IllegalArgumentException to conform to EventObject spec ++ throw new IllegalArgumentException("null source"); ++ } ++ AppContext appContext = SunToolkit.targetToAppContext(source); ++ EventQueue eventQueue = SunToolkit.getSystemEventQueueImplPP(appContext); ++ return AWTAccessor.getEventQueueAccessor().getMostRecentEventTime(eventQueue); ++ } + } +--- ./jdk/src/share/classes/java/awt/event/MouseEvent.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/event/MouseEvent.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -758,7 +758,6 @@ + + if (getModifiersEx() != 0) { //There is at least one more button in a pressed state. + if (id == MouseEvent.MOUSE_RELEASED || id == MouseEvent.MOUSE_CLICKED){ +- System.out.println("MEvent. CASE!"); + shouldExcludeButtonFromExtModifiers = true; + } + } +--- ./jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -41,8 +41,8 @@ + public class IndexedPropertyDescriptor extends PropertyDescriptor { + + private Reference<Class> indexedPropertyTypeRef; +- private Reference<Method> indexedReadMethodRef; +- private Reference<Method> indexedWriteMethodRef; ++ private final MethodRef indexedReadMethodRef = new MethodRef(); ++ private final MethodRef indexedWriteMethodRef = new MethodRef(); + + private String indexedReadMethodName; + private String indexedWriteMethodName; +@@ -173,11 +173,11 @@ + * May return null if the property isn't indexed or is write-only. + */ + public synchronized Method getIndexedReadMethod() { +- Method indexedReadMethod = getIndexedReadMethod0(); ++ Method indexedReadMethod = this.indexedReadMethodRef.get(); + if (indexedReadMethod == null) { + Class cls = getClass0(); + if (cls == null || +- (indexedReadMethodName == null && indexedReadMethodRef == null)) { ++ (indexedReadMethodName == null && !this.indexedReadMethodRef.isSet())) { + // the Indexed readMethod was explicitly set to null. + return null; + } +@@ -213,20 +213,19 @@ + + // the indexed property type is set by the reader. + setIndexedPropertyType(findIndexedPropertyType(readMethod, +- getIndexedWriteMethod0())); ++ this.indexedWriteMethodRef.get())); + setIndexedReadMethod0(readMethod); + } + + private void setIndexedReadMethod0(Method readMethod) { ++ this.indexedReadMethodRef.set(readMethod); + if (readMethod == null) { + indexedReadMethodName = null; +- indexedReadMethodRef = null; + return; + } + setClass0(readMethod.getDeclaringClass()); + + indexedReadMethodName = readMethod.getName(); +- this.indexedReadMethodRef = getSoftReference(readMethod); + setTransient(readMethod.getAnnotation(Transient.class)); + } + +@@ -239,11 +238,11 @@ + * May return null if the property isn't indexed or is read-only. + */ + public synchronized Method getIndexedWriteMethod() { +- Method indexedWriteMethod = getIndexedWriteMethod0(); ++ Method indexedWriteMethod = this.indexedWriteMethodRef.get(); + if (indexedWriteMethod == null) { + Class cls = getClass0(); + if (cls == null || +- (indexedWriteMethodName == null && indexedWriteMethodRef == null)) { ++ (indexedWriteMethodName == null && !this.indexedWriteMethodRef.isSet())) { + // the Indexed writeMethod was explicitly set to null. + return null; + } +@@ -297,15 +296,14 @@ + } + + private void setIndexedWriteMethod0(Method writeMethod) { ++ this.indexedWriteMethodRef.set(writeMethod); + if (writeMethod == null) { + indexedWriteMethodName = null; +- indexedWriteMethodRef = null; + return; + } + setClass0(writeMethod.getDeclaringClass()); + + indexedWriteMethodName = writeMethod.getName(); +- this.indexedWriteMethodRef = getSoftReference(writeMethod); + setTransient(writeMethod.getAnnotation(Transient.class)); + } + +@@ -345,18 +343,6 @@ + : null; + } + +- private Method getIndexedReadMethod0() { +- return (this.indexedReadMethodRef != null) +- ? this.indexedReadMethodRef.get() +- : null; +- } +- +- private Method getIndexedWriteMethod0() { +- return (this.indexedWriteMethodRef != null) +- ? this.indexedWriteMethodRef.get() +- : null; +- } +- + private Class findIndexedPropertyType(Method indexedReadMethod, + Method indexedWriteMethod) + throws IntrospectionException { +@@ -488,8 +474,8 @@ + */ + IndexedPropertyDescriptor(IndexedPropertyDescriptor old) { + super(old); +- indexedReadMethodRef = old.indexedReadMethodRef; +- indexedWriteMethodRef = old.indexedWriteMethodRef; ++ this.indexedReadMethodRef.set(old.indexedReadMethodRef.get()); ++ this.indexedWriteMethodRef.set(old.indexedWriteMethodRef.get()); + indexedPropertyTypeRef = old.indexedPropertyTypeRef; + indexedWriteMethodName = old.indexedWriteMethodName; + indexedReadMethodName = old.indexedReadMethodName; +@@ -498,7 +484,7 @@ + void updateGenericsFor(Class<?> type) { + super.updateGenericsFor(type); + try { +- setIndexedPropertyType(findIndexedPropertyType(getIndexedReadMethod0(), getIndexedWriteMethod0())); ++ setIndexedPropertyType(findIndexedPropertyType(this.indexedReadMethodRef.get(), this.indexedWriteMethodRef.get())); + } + catch (IntrospectionException exception) { + setIndexedPropertyType(null); +@@ -528,7 +514,7 @@ + void appendTo(StringBuilder sb) { + super.appendTo(sb); + appendTo(sb, "indexedPropertyType", this.indexedPropertyTypeRef); +- appendTo(sb, "indexedReadMethod", this.indexedReadMethodRef); +- appendTo(sb, "indexedWriteMethod", this.indexedWriteMethodRef); ++ appendTo(sb, "indexedReadMethod", this.indexedReadMethodRef.get()); ++ appendTo(sb, "indexedWriteMethod", this.indexedWriteMethodRef.get()); + } + } +--- ./jdk/src/share/classes/java/beans/MethodDescriptor.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/beans/MethodDescriptor.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -38,7 +38,7 @@ + + public class MethodDescriptor extends FeatureDescriptor { + +- private Reference<Method> methodRef; ++ private final MethodRef methodRef = new MethodRef(); + + private String[] paramNames; + +@@ -79,7 +79,7 @@ + * @return The low-level description of the method + */ + public synchronized Method getMethod() { +- Method method = getMethod0(); ++ Method method = this.methodRef.get(); + if (method == null) { + Class cls = getClass0(); + String name = getName(); +@@ -112,13 +112,7 @@ + setClass0(method.getDeclaringClass()); + } + setParams(getParameterTypes(getClass0(), method)); +- this.methodRef = getSoftReference(method); +- } +- +- private Method getMethod0() { +- return (this.methodRef != null) +- ? this.methodRef.get() +- : null; ++ this.methodRef.set(method); + } + + private synchronized void setParams(Class[] param) { +@@ -173,12 +167,10 @@ + */ + + MethodDescriptor(MethodDescriptor x, MethodDescriptor y) { +- super(x,y); ++ super(x, y); + +- methodRef = x.methodRef; +- if (y.methodRef != null) { +- methodRef = y.methodRef; +- } ++ Method method = y.methodRef.get(); ++ this.methodRef.set(null != method ? method : x.methodRef.get()); + params = x.params; + if (y.params != null) { + params = y.params; +@@ -201,7 +193,7 @@ + MethodDescriptor(MethodDescriptor old) { + super(old); + +- methodRef = old.methodRef; ++ this.methodRef.set(old.getMethod()); + params = old.params; + paramNames = old.paramNames; + +@@ -215,7 +207,7 @@ + } + + void appendTo(StringBuilder sb) { +- appendTo(sb, "method", this.methodRef); ++ appendTo(sb, "method", this.methodRef.get()); + if (this.parameterDescriptors != null) { + sb.append("; parameterDescriptors={"); + for (ParameterDescriptor pd : this.parameterDescriptors) { +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/java/beans/MethodRef.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,87 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.beans; ++ ++import java.lang.ref.SoftReference; ++import java.lang.ref.WeakReference; ++import java.lang.reflect.Method; ++ ++import static sun.reflect.misc.ReflectUtil.isPackageAccessible; ++ ++final class MethodRef { ++ private String signature; ++ private SoftReference<Method> methodRef; ++ private WeakReference<Class<?>> typeRef; ++ ++ void set(Method method) { ++ if (method == null) { ++ this.signature = null; ++ this.methodRef = null; ++ this.typeRef = null; ++ } ++ else { ++ this.signature = method.toGenericString(); ++ this.methodRef = new SoftReference<>(method); ++ this.typeRef = new WeakReference<Class<?>>(method.getDeclaringClass()); ++ } ++ } ++ ++ boolean isSet() { ++ return this.methodRef != null; ++ } ++ ++ Method get() { ++ if (this.methodRef == null) { ++ return null; ++ } ++ Method method = this.methodRef.get(); ++ if (method == null) { ++ method = find(this.typeRef.get(), this.signature); ++ if (method == null) { ++ this.signature = null; ++ this.methodRef = null; ++ this.typeRef = null; ++ } ++ else { ++ this.methodRef = new SoftReference<>(method); ++ } ++ } ++ return isPackageAccessible(method.getDeclaringClass()) ? method : null; ++ } ++ ++ private static Method find(Class<?> type, String signature) { ++ if (type != null) { ++ for (Method method : type.getMethods()) { ++ if (type.equals(method.getDeclaringClass())) { ++ if (method.toGenericString().equals(signature)) { ++ return method; ++ } ++ } ++ } ++ } ++ return null; ++ } ++} +--- ./jdk/src/share/classes/java/beans/PropertyDescriptor.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/beans/PropertyDescriptor.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -36,8 +36,8 @@ + public class PropertyDescriptor extends FeatureDescriptor { + + private Reference<Class> propertyTypeRef; +- private Reference<Method> readMethodRef; +- private Reference<Method> writeMethodRef; ++ private final MethodRef readMethodRef = new MethodRef(); ++ private final MethodRef writeMethodRef = new MethodRef(); + private Reference<Class> propertyEditorClassRef; + + private boolean bound; +@@ -68,8 +68,8 @@ + public PropertyDescriptor(String propertyName, Class<?> beanClass) + throws IntrospectionException { + this(propertyName, beanClass, +- Introspector.IS_PREFIX + NameGenerator.capitalize(propertyName), +- Introspector.SET_PREFIX + NameGenerator.capitalize(propertyName)); ++ Introspector.IS_PREFIX + NameGenerator.capitalize(propertyName), ++ Introspector.SET_PREFIX + NameGenerator.capitalize(propertyName)); + } + + /** +@@ -203,10 +203,10 @@ + * May return null if the property can't be read. + */ + public synchronized Method getReadMethod() { +- Method readMethod = getReadMethod0(); ++ Method readMethod = this.readMethodRef.get(); + if (readMethod == null) { + Class cls = getClass0(); +- if (cls == null || (readMethodName == null && readMethodRef == null)) { ++ if (cls == null || (readMethodName == null && !this.readMethodRef.isSet())) { + // The read method was explicitly set to null. + return null; + } +@@ -246,17 +246,16 @@ + */ + public synchronized void setReadMethod(Method readMethod) + throws IntrospectionException { ++ this.readMethodRef.set(readMethod); + if (readMethod == null) { + readMethodName = null; +- readMethodRef = null; + return; + } + // The property type is determined by the read method. +- setPropertyType(findPropertyType(readMethod, getWriteMethod0())); ++ setPropertyType(findPropertyType(readMethod, this.writeMethodRef.get())); + setClass0(readMethod.getDeclaringClass()); + + readMethodName = readMethod.getName(); +- this.readMethodRef = getSoftReference(readMethod); + setTransient(readMethod.getAnnotation(Transient.class)); + } + +@@ -267,10 +266,10 @@ + * May return null if the property can't be written. + */ + public synchronized Method getWriteMethod() { +- Method writeMethod = getWriteMethod0(); ++ Method writeMethod = this.writeMethodRef.get(); + if (writeMethod == null) { + Class cls = getClass0(); +- if (cls == null || (writeMethodName == null && writeMethodRef == null)) { ++ if (cls == null || (writeMethodName == null && !this.writeMethodRef.isSet())) { + // The write method was explicitly set to null. + return null; + } +@@ -316,9 +315,9 @@ + */ + public synchronized void setWriteMethod(Method writeMethod) + throws IntrospectionException { ++ this.writeMethodRef.set(writeMethod); + if (writeMethod == null) { + writeMethodName = null; +- writeMethodRef = null; + return; + } + // Set the property type - which validates the method +@@ -326,22 +325,9 @@ + setClass0(writeMethod.getDeclaringClass()); + + writeMethodName = writeMethod.getName(); +- this.writeMethodRef = getSoftReference(writeMethod); + setTransient(writeMethod.getAnnotation(Transient.class)); + } + +- private Method getReadMethod0() { +- return (this.readMethodRef != null) +- ? this.readMethodRef.get() +- : null; +- } +- +- private Method getWriteMethod0() { +- return (this.writeMethodRef != null) +- ? this.writeMethodRef.get() +- : null; +- } +- + /** + * Overridden to ensure that a super class doesn't take precedent + */ +@@ -618,8 +604,8 @@ + PropertyDescriptor(PropertyDescriptor old) { + super(old); + propertyTypeRef = old.propertyTypeRef; +- readMethodRef = old.readMethodRef; +- writeMethodRef = old.writeMethodRef; ++ this.readMethodRef.set(old.readMethodRef.get()); ++ this.writeMethodRef.set(old.writeMethodRef.get()); + propertyEditorClassRef = old.propertyEditorClassRef; + + writeMethodName = old.writeMethodName; +@@ -633,7 +619,7 @@ + void updateGenericsFor(Class<?> type) { + setClass0(type); + try { +- setPropertyType(findPropertyType(getReadMethod0(), getWriteMethod0())); ++ setPropertyType(findPropertyType(this.readMethodRef.get(), this.writeMethodRef.get())); + } + catch (IntrospectionException exception) { + setPropertyType(null); +@@ -724,8 +710,8 @@ + appendTo(sb, "constrained", this.constrained); + appendTo(sb, "propertyEditorClass", this.propertyEditorClassRef); + appendTo(sb, "propertyType", this.propertyTypeRef); +- appendTo(sb, "readMethod", this.readMethodRef); +- appendTo(sb, "writeMethod", this.writeMethodRef); ++ appendTo(sb, "readMethod", this.readMethodRef.get()); ++ appendTo(sb, "writeMethod", this.writeMethodRef.get()); + } + + private boolean isAssignable(Method m1, Method m2) { +--- ./jdk/src/share/classes/java/beans/XMLEncoder.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/beans/XMLEncoder.java Mon Jan 05 11:57:27 2015 -0800 +@@ -377,7 +377,7 @@ + Object arg = args[i]; + mark(arg, true); + } +- mark(stm.getTarget(), false); ++ mark(stm.getTarget(), stm instanceof Expression); + } + + +--- ./jdk/src/share/classes/java/io/ByteArrayOutputStream.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/io/ByteArrayOutputStream.java Mon Jan 05 11:57:27 2015 -0800 +@@ -94,6 +94,14 @@ + } + + /** ++ * The maximum size of array to allocate. ++ * Some VMs reserve some header words in an array. ++ * Attempts to allocate larger arrays may result in ++ * OutOfMemoryError: Requested array size exceeds VM limit ++ */ ++ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; ++ ++ /** + * Increases the capacity to ensure that it can hold at least the + * number of elements specified by the minimum capacity argument. + * +@@ -105,14 +113,19 @@ + int newCapacity = oldCapacity << 1; + if (newCapacity - minCapacity < 0) + newCapacity = minCapacity; +- if (newCapacity < 0) { +- if (minCapacity < 0) // overflow +- throw new OutOfMemoryError(); +- newCapacity = Integer.MAX_VALUE; +- } ++ if (newCapacity - MAX_ARRAY_SIZE > 0) ++ newCapacity = hugeCapacity(minCapacity); + buf = Arrays.copyOf(buf, newCapacity); + } + ++ private static int hugeCapacity(int minCapacity) { ++ if (minCapacity < 0) // overflow ++ throw new OutOfMemoryError(); ++ return (minCapacity > MAX_ARRAY_SIZE) ? ++ Integer.MAX_VALUE : ++ MAX_ARRAY_SIZE; ++ } ++ + /** + * Writes the specified byte to this byte array output stream. + * +--- ./jdk/src/share/classes/java/io/File.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/io/File.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1891,7 +1891,7 @@ + + String name = prefix + Long.toString(n) + suffix; + File f = new File(dir, name); +- if (!name.equals(f.getName())) { ++ if (!name.equals(f.getName()) || f.isInvalid()) { + if (System.getSecurityManager() != null) + throw new IOException("Unable to create temporary file"); + else +@@ -1981,19 +1981,26 @@ + + File tmpdir = (directory != null) ? directory + : TempDirectory.location(); ++ SecurityManager sm = System.getSecurityManager(); + File f; +- try { +- do { +- f = TempDirectory.generateFile(prefix, suffix, tmpdir); +- } while (f.exists()); +- if (!f.createNewFile()) +- throw new IOException("Unable to create temporary file"); +- } catch (SecurityException se) { +- // don't reveal temporary directory location +- if (directory == null) +- throw new SecurityException("Unable to create temporary file"); +- throw se; +- } ++ do { ++ f = TempDirectory.generateFile(prefix, suffix, tmpdir); ++ ++ if (sm != null) { ++ try { ++ sm.checkWrite(f.getPath()); ++ } catch (SecurityException se) { ++ // don't reveal temporary directory location ++ if (directory == null) ++ throw new SecurityException("Unable to create temporary file"); ++ throw se; ++ } ++ } ++ } while ((fs.getBooleanAttributes(f) & FileSystem.BA_EXISTS) != 0); ++ ++ if (!fs.createFileExclusively(f.getPath())) ++ throw new IOException("Unable to create temporary file"); ++ + return f; + } + +--- ./jdk/src/share/classes/java/lang/ClassValue.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/ClassValue.java Mon Jan 05 11:57:27 2015 -0800 +@@ -489,9 +489,18 @@ + /** Remove an entry. */ + synchronized + void removeEntry(ClassValue<?> classValue) { +- // make all cache elements for this guy go stale: +- if (remove(classValue.identity) != null) { ++ Entry<?> e = remove(classValue.identity); ++ if (e == null) { ++ // Uninitialized, and no pending calls to computeValue. No change. ++ } else if (e.isPromise()) { ++ // State is uninitialized, with a pending call to finishEntry. ++ // Since remove is a no-op in such a state, keep the promise ++ // by putting it back into the map. ++ put(classValue.identity, e); ++ } else { ++ // In an initialized state. Bump forward, and de-initialize. + classValue.bumpVersion(); ++ // Make all cache elements for this guy go stale. + removeStaleEntries(classValue); + } + } +--- ./jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Mon Jan 05 11:57:27 2015 -0800 +@@ -62,6 +62,7 @@ + //# Conditional mappings + //# ================================================================================ + new Entry(0x03A3, new char[]{0x03C2}, new char[]{0x03A3}, null, FINAL_CASED), // # GREEK CAPITAL LETTER SIGMA ++ new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, null, 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + + //# ================================================================================ + //# Locale-sensitive mappings +@@ -77,8 +78,8 @@ + + //# ================================================================================ + //# Turkish and Azeri +-// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE +-// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE ++ new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE ++ new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + new Entry(0x0307, new char[]{}, new char[]{0x0307}, "tr", AFTER_I), // # COMBINING DOT ABOVE + new Entry(0x0307, new char[]{}, new char[]{0x0307}, "az", AFTER_I), // # COMBINING DOT ABOVE + new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I +@@ -148,21 +149,25 @@ + + private static char[] lookUpTable(String src, int index, Locale locale, boolean bLowerCasing) { + HashSet set = (HashSet)entryTable.get(new Integer(src.codePointAt(index))); ++ char[] ret = null; + + if (set != null) { + Iterator iter = set.iterator(); + String currentLang = locale.getLanguage(); + while (iter.hasNext()) { + Entry entry = (Entry)iter.next(); +- String conditionLang= entry.getLanguage(); ++ String conditionLang = entry.getLanguage(); + if (((conditionLang == null) || (conditionLang.equals(currentLang))) && + isConditionMet(src, index, locale, entry.getCondition())) { +- return (bLowerCasing ? entry.getLowerCase() : entry.getUpperCase()); ++ ret = bLowerCasing ? entry.getLowerCase() : entry.getUpperCase(); ++ if (conditionLang != null) { ++ break; ++ } + } + } + } + +- return null; ++ return ret; + } + + private static boolean isConditionMet(String src, int index, Locale locale, int condition) { +--- ./jdk/src/share/classes/java/lang/String.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/String.java Mon Jan 05 11:57:27 2015 -0800 +@@ -2459,7 +2459,9 @@ + } else { + srcCount = 1; + } +- if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA ++ if (localeDependent || ++ srcChar == '\u03A3' || // GREEK CAPITAL LETTER SIGMA ++ srcChar == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE + lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale); + } else { + lowerChar = Character.toLowerCase(srcChar); +--- ./jdk/src/share/classes/java/net/InetAddress.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/net/InetAddress.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1128,7 +1128,7 @@ + // see if it is IPv4 address + addr = IPAddressUtil.textToNumericFormatV4(host); + if (addr == null) { +- // see if it is IPv6 address ++ // This is supposed to be an IPv6 literal + // Check if a numeric or string zone id is present + int pos; + if ((pos=host.indexOf ("%")) != -1) { +@@ -1137,7 +1137,9 @@ + ifname = host.substring (pos+1); + } + } +- addr = IPAddressUtil.textToNumericFormatV6(host); ++ if ((addr = IPAddressUtil.textToNumericFormatV6(host)) == null && host.contains(":")) { ++ throw new UnknownHostException(host + ": invalid IPv6 address"); ++ } + } else if (ipv6Expected) { + // Means an IPv4 litteral between brackets! + throw new UnknownHostException("["+host+"]"); +@@ -1155,10 +1157,10 @@ + } + return ret; + } +- } else if (ipv6Expected) { +- // We were expecting an IPv6 Litteral, but got something else +- throw new UnknownHostException("["+host+"]"); +- } ++ } else if (ipv6Expected) { ++ // We were expecting an IPv6 Litteral, but got something else ++ throw new UnknownHostException("["+host+"]"); ++ } + return getAllByName0(host, reqAddr, true); + } + +--- ./jdk/src/share/classes/java/net/MulticastSocket.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/net/MulticastSocket.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -565,7 +565,7 @@ + public NetworkInterface getNetworkInterface() throws SocketException { + NetworkInterface ni + = (NetworkInterface)getImpl().getOption(SocketOptions.IP_MULTICAST_IF2); +- if (ni.getIndex() == 0) { ++ if ((ni.getIndex() == 0) || (ni.getIndex() == -1)) { + InetAddress[] addrs = new InetAddress[1]; + addrs[0] = InetAddress.anyLocalAddress(); + return new NetworkInterface(addrs[0].getHostName(), 0, addrs); +--- ./jdk/src/share/classes/java/util/CurrencyData.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/util/CurrencyData.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -26,10 +26,9 @@ + formatVersion=1 + + # Version of the currency code information in this class. +-# It is a serial number that accompanies with each amendment, such as +-# 'MAxxx.doc' ++# It is a serial number that accompanies with each amendment. + +-dataVersion=151 ++dataVersion=159 + + # List of all valid ISO 4217 currency codes. + # To ensure compatibility, do not remove codes. +@@ -49,11 +48,12 @@ + NIO558-NLG528-NOK578-NPR524-NZD554-OMR512-PAB590-PEN604-PGK598-PHP608-\ + PKR586-PLN985-PTE620-PYG600-QAR634-ROL946-RON946-RSD941-RUB643-RUR810-RWF646-SAR682-\ + SBD090-SCR690-SDD736-SDG938-SEK752-SGD702-SHP654-SIT705-SKK703-SLL694-SOS706-\ +- SRD968-SRG740-STD678-SVC222-SYP760-SZL748-THB764-TJS972-TMM795-TMT934-TND788-TOP776-\ ++ SRD968-SRG740-SSP728-STD678-SVC222-SYP760-SZL748-THB764-TJS972-TMM795-TMT934-TND788-TOP776-\ + TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-\ + UYU858-UZS860-VEB862-VEF937-VND704-VUV548-WST882-XAF950-XAG961-XAU959-XBA955-\ + XBB956-XBC957-XBD958-XCD951-XDR960-XFO000-XFU000-XOF952-XPD964-XPF953-\ +- XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZWD716-ZWL932-ZWN942-ZWR935 ++ XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZMW967-ZWD716-ZWL932-\ ++ ZWN942-ZWR935 + + + # Mappings from ISO 3166 country codes to ISO 4217 currency codes. +@@ -71,7 +71,7 @@ + # + # The table is based on the following web sites: + # http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/db_en.html +-# http://www.bsi-global.com/iso4217currency ++# http://www.currency-iso.org/iso_index/iso_tables.htm + # http://www.cia.gov/cia/publications/factbook/indexgeo.html + + # AFGHANISTAN +@@ -105,7 +105,7 @@ + # AUSTRIA + AT=EUR + # AZERBAIJAN +-AZ=AZM;2005-12-31-20-00-00;AZN ++AZ=AZN + # BAHAMAS + BS=BSD + # BAHRAIN +@@ -320,7 +320,7 @@ + # LAO PEOPLE'S DEMOCRATIC REPUBLIC + LA=LAK + # LATVIA +-LV=LVL ++LV=LVL;2013-12-31-22-00-00;EUR + # LEBANON + LB=LBP + # LESOTHO +@@ -332,7 +332,7 @@ + # LIECHTENSTEIN + LI=CHF + # LITHUANIA +-LT=LTL ++LT=LTL;2014-12-31-22-00-00;EUR + # LUXEMBOURG + LU=EUR + # MACAU +@@ -378,7 +378,7 @@ + # MOROCCO + MA=MAD + # MOZAMBIQUE +-MZ=MZM;2006-06-30-22-00-00;MZN ++MZ=MZN + # MYANMAR + MM=MMK + # NAMIBIA +@@ -440,7 +440,7 @@ + # REUNION + RE=EUR + # ROMANIA +-RO=ROL;2005-06-30-21-00-00;RON ++RO=RON + # RUSSIAN FEDERATION + RU=RUB + # RWANDA +@@ -463,6 +463,8 @@ + WS=WST + # SAN MARINO + SM=EUR ++# SOUTH SUDAN ++SS=SSP + # SAO TOME AND PRINCIPE + ST=STD + # SAUDI ARABIA +@@ -532,7 +534,7 @@ + # TUNISIA + TN=TND + # TURKEY +-TR=TRL;2004-12-31-22-00-00;TRY ++TR=TRY + # TURKMENISTAN + TM=TMT + # TURKS AND CAICOS ISLANDS +@@ -558,7 +560,7 @@ + # VANUATU + VU=VUV + # VENEZUELA +-VE=VEB;2008-01-01-04-00-00;VEF ++VE=VEF + # VIET NAM + VN=VND + # VIRGIN ISLANDS, BRITISH +@@ -572,7 +574,7 @@ + # YEMEN + YE=YER + # ZAMBIA +-ZM=ZMK ++ZM=ZMW + # ZIMBABWE + ZW=ZWL + +@@ -583,7 +585,7 @@ + minor0=\ + ADP-BEF-BIF-BYB-BYR-CLF-CLP-DJF-ESP-GNF-\ + GRD-ISK-ITL-JPY-KMF-KRW-LUF-MGF-PYG-PTE-RWF-\ +- TPE-TRL-VUV-XAF-XOF-XPF ++ TPE-TRL-UGX-VND-VUV-XAF-XOF-XPF + minor1= + minor3=\ + BHD-IQD-JOD-KWD-LYD-OMR-TND +--- ./jdk/src/share/classes/java/util/LocaleISOData.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/java/util/LocaleISOData.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -433,6 +433,7 @@ + + "SN" + "SEN" // Senegal, Republic of + + "SO" + "SOM" // Somalia, Somali Republic + + "SR" + "SUR" // Suriname, Republic of ++ + "SS" + "SSD" // South Sudan + + "ST" + "STP" // Sao Tome and Principe, Democratic Republic of + + "SV" + "SLV" // El Salvador, Republic of + + "SX" + "SXM" // Sint Maarten (Dutch part) +--- ./jdk/src/share/classes/javax/accessibility/AccessibleContext.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/accessibility/AccessibleContext.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,6 +25,9 @@ + + package javax.accessibility; + ++import sun.awt.AWTAccessor; ++import sun.awt.AppContext; ++ + import java.util.Locale; + import java.beans.PropertyChangeListener; + import java.beans.PropertyChangeSupport; +@@ -79,6 +82,26 @@ + */ + public abstract class AccessibleContext { + ++ /** ++ * The AppContext that should be used to dispatch events for this ++ * AccessibleContext ++ */ ++ private volatile AppContext targetAppContext; ++ ++ static { ++ AWTAccessor.setAccessibleContextAccessor(new AWTAccessor.AccessibleContextAccessor() { ++ @Override ++ public void setAppContext(AccessibleContext accessibleContext, AppContext appContext) { ++ accessibleContext.targetAppContext = appContext; ++ } ++ ++ @Override ++ public AppContext getAppContext(AccessibleContext accessibleContext) { ++ return accessibleContext.targetAppContext; ++ } ++ }); ++ } ++ + /** + * Constant used to determine when the accessibleName property has + * changed. The old value in the PropertyChangeEvent will be the old +--- ./jdk/src/share/classes/javax/swing/JComboBox.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JComboBox.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1418,6 +1418,28 @@ + } + + /** ++ * {@inheritDoc} ++ */ ++ @Override ++ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { ++ if (super.processKeyBinding(ks, e, condition, pressed)) { ++ return true; ++ } ++ ++ if (!isEditable() || condition != WHEN_FOCUSED || getEditor() == null ++ || !Boolean.TRUE.equals(getClientProperty("JComboBox.isTableCellEditor"))) { ++ return false; ++ } ++ ++ Component editorComponent = getEditor().getEditorComponent(); ++ if (editorComponent instanceof JComponent) { ++ JComponent component = (JComponent) editorComponent; ++ return component.processKeyBinding(ks, e, WHEN_FOCUSED, pressed); ++ } ++ return false; ++ } ++ ++ /** + * Sets the object that translates a keyboard character into a list + * selection. Typically, the first selection with a matching first + * character becomes the selected item. +--- ./jdk/src/share/classes/javax/swing/JComponent.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JComponent.java Mon Jan 05 11:57:27 2015 -0800 +@@ -63,6 +63,7 @@ + import static javax.swing.ClientPropertyKey.*; + import javax.accessibility.*; + ++import sun.awt.SunToolkit; + import sun.swing.SwingUtilities2; + import sun.swing.UIClientPropertyKey; + +@@ -3989,6 +3990,17 @@ + * @since 1.4 + */ + public AccessibleKeyBinding getAccessibleKeyBinding() { ++ // Try to get the linked label's mnemonic if it exists ++ Object o = getClientProperty(JLabel.LABELED_BY_PROPERTY); ++ if (o instanceof Accessible){ ++ AccessibleContext ac = ((Accessible) o).getAccessibleContext(); ++ if (ac != null){ ++ AccessibleComponent comp = ac.getAccessibleComponent(); ++ if (! (comp instanceof AccessibleExtendedComponent)) ++ return null; ++ return ((AccessibleExtendedComponent)comp).getAccessibleKeyBinding(); ++ } ++ } + return null; + } + } // inner class AccessibleJComponent +@@ -4790,7 +4802,8 @@ + * @see RepaintManager#addDirtyRegion + */ + public void repaint(long tm, int x, int y, int width, int height) { +- RepaintManager.currentManager(this).addDirtyRegion(this, x, y, width, height); ++ RepaintManager.currentManager(SunToolkit.targetToAppContext(this)) ++ .addDirtyRegion(this, x, y, width, height); + } + + +@@ -4845,7 +4858,7 @@ + // which was causing some people grief. + return; + } +- if (SwingUtilities.isEventDispatchThread()) { ++ if (SunToolkit.isDispatchThreadForAppContext(this)) { + invalidate(); + RepaintManager.currentManager(this).addInvalidComponent(this); + } +@@ -4867,7 +4880,7 @@ + revalidate(); + } + }; +- SwingUtilities.invokeLater(callRevalidate); ++ SunToolkit.executeOnEventHandlerThread(this, callRevalidate); + } + } + +--- ./jdk/src/share/classes/javax/swing/JPopupMenu.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JPopupMenu.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -735,7 +735,7 @@ + + if (pref == null || pref.width != getWidth() || + pref.height != getHeight()) { +- popup = getPopup(); ++ showPopup(); + } else { + validate(); + } +@@ -786,7 +786,7 @@ + + if(b) { + firePopupMenuWillBecomeVisible(); +- popup = getPopup(); ++ showPopup(); + firePropertyChange("visible", Boolean.FALSE, Boolean.TRUE); + + +@@ -804,7 +804,7 @@ + } + + /** +- * Returns a <code>Popup</code> instance from the ++ * Retrieves <code>Popup</code> instance from the + * <code>PopupMenuUI</code> that has had <code>show</code> invoked on + * it. If the current <code>popup</code> is non-null, + * this will invoke <code>dispose</code> of it, and then +@@ -813,7 +813,7 @@ + * This does NOT fire any events, it is up the caller to dispatch + * the necessary events. + */ +- private Popup getPopup() { ++ private void showPopup() { + Popup oldPopup = popup; + + if (oldPopup != null) { +@@ -837,8 +837,8 @@ + desiredLocationY); + + popupFactory.setPopupType(PopupFactory.LIGHT_WEIGHT_POPUP); ++ popup = newPopup; + newPopup.show(); +- return newPopup; + } + + /** +@@ -867,7 +867,7 @@ + desiredLocationX = x; + desiredLocationY = y; + if(popup != null && (x != oldX || y != oldY)) { +- popup = getPopup(); ++ showPopup(); + } + } + +@@ -1024,7 +1024,7 @@ + Dimension newSize = getPreferredSize(); + + if (!oldSize.equals(newSize)) { +- popup = getPopup(); ++ showPopup(); + } + } + } +--- ./jdk/src/share/classes/javax/swing/JTable.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JTable.java Mon Jan 05 11:57:27 2015 -0800 +@@ -4041,7 +4041,7 @@ + } + // Restore the lead + int viewLeadIndex = modelSelection.getLeadSelectionIndex(); +- if (viewLeadIndex != -1) { ++ if (viewLeadIndex != -1 && !modelSelection.isSelectionEmpty()) { + viewLeadIndex = convertRowIndexToView(viewLeadIndex); + } + SwingUtilities2.setLeadAnchorWithoutSelection( +@@ -6587,8 +6587,8 @@ + TableColumnModelListener, CellEditorListener, PropertyChangeListener, + AccessibleExtendedTable { + +- int lastSelectedRow; +- int lastSelectedCol; ++ int previousFocusedRow; ++ int previousFocusedCol; + + /** + * AccessibleJTable constructor +@@ -6603,8 +6603,10 @@ + tcm.addColumnModelListener(this); + tcm.getSelectionModel().addListSelectionListener(this); + JTable.this.getModel().addTableModelListener(this); +- lastSelectedRow = JTable.this.getSelectedRow(); +- lastSelectedCol = JTable.this.getSelectedColumn(); ++ previousFocusedRow = JTable.this.getSelectionModel(). ++ getLeadSelectionIndex(); ++ previousFocusedCol = JTable.this.getColumnModel(). ++ getSelectionModel().getLeadSelectionIndex(); + } + + // Listeners to track model, etc. changes to as to re-place the other +@@ -6932,18 +6934,21 @@ + firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY, + Boolean.valueOf(false), Boolean.valueOf(true)); + +- int selectedRow = JTable.this.getSelectedRow(); +- int selectedCol = JTable.this.getSelectedColumn(); +- if (selectedRow != lastSelectedRow || +- selectedCol != lastSelectedCol) { +- Accessible oldA = getAccessibleAt(lastSelectedRow, +- lastSelectedCol); +- Accessible newA = getAccessibleAt(selectedRow, selectedCol); ++ // Using lead selection index to cover both cases: node selected and node ++ // is focused but not selected (Ctrl+up/down) ++ int focusedRow = JTable.this.getSelectionModel().getLeadSelectionIndex(); ++ int focusedCol = JTable.this.getColumnModel().getSelectionModel(). ++ getLeadSelectionIndex(); ++ ++ if (focusedRow != previousFocusedRow || ++ focusedCol != previousFocusedCol){ ++ Accessible oldA = getAccessibleAt(previousFocusedRow, previousFocusedCol); ++ Accessible newA = getAccessibleAt(focusedRow, focusedCol); + firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, +- oldA, newA); +- lastSelectedRow = selectedRow; +- lastSelectedCol = selectedCol; +- } ++ oldA, newA); ++ previousFocusedRow = focusedRow; ++ previousFocusedCol = focusedCol; ++ } + } + + +--- ./jdk/src/share/classes/javax/swing/JTree.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JTree.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1662,6 +1662,11 @@ + + leadPath = newPath; + firePropertyChange(LEAD_SELECTION_PATH_PROPERTY, oldValue, newPath); ++ ++ if (accessibleContext != null){ ++ ((AccessibleJTree)accessibleContext). ++ fireActiveDescendantPropertyChange(oldValue, newPath); ++ } + } + + /** +@@ -4123,23 +4128,6 @@ + * + */ + public void valueChanged(TreeSelectionEvent e) { +- // Fixes 4546503 - JTree is sending incorrect active +- // descendant events +- TreePath oldLeadSelectionPath = e.getOldLeadSelectionPath(); +- leadSelectionPath = e.getNewLeadSelectionPath(); +- +- if (oldLeadSelectionPath != leadSelectionPath) { +- // Set parent to null so AccessibleJTreeNode computes +- // its parent. +- Accessible oldLSA = leadSelectionAccessible; +- leadSelectionAccessible = (leadSelectionPath != null) +- ? new AccessibleJTreeNode(JTree.this, +- leadSelectionPath, +- null) // parent +- : null; +- firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, +- oldLSA, leadSelectionAccessible); +- } + firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY, + Boolean.valueOf(false), Boolean.valueOf(true)); + } +@@ -4243,6 +4231,35 @@ + } + } + ++ /** ++ * Fire an active descendant property change notification. ++ * The active descendant is used for objects such as list, ++ * tree, and table, which may have transient children. ++ * It notifies screen readers the active child of the component ++ * has been changed so user can be notified from there. ++ * ++ * @param oldPath - lead path of previous active child ++ * @param newPath - lead path of current active child ++ * ++ */ ++ void fireActiveDescendantPropertyChange(TreePath oldPath, TreePath newPath){ ++ if(oldPath != newPath){ ++ Accessible oldLSA = (oldPath != null) ++ ? new AccessibleJTreeNode(JTree.this, ++ oldPath, ++ null) ++ : null; ++ ++ Accessible newLSA = (newPath != null) ++ ? new AccessibleJTreeNode(JTree.this, ++ newPath, ++ null) ++ : null; ++ firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, ++ oldLSA, newLSA); ++ } ++ } ++ + + private AccessibleContext getCurrentAccessibleContext() { + Component c = getCurrentComponent(); +--- ./jdk/src/share/classes/javax/swing/MenuSelectionManager.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/MenuSelectionManager.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,6 +30,7 @@ + import javax.swing.event.*; + + import sun.awt.AppContext; ++import sun.swing.SwingUtilities2; + + /** + * A MenuSelectionManager owns the selection in menu hierarchy. +@@ -60,6 +61,12 @@ + if (msm == null) { + msm = new MenuSelectionManager(); + context.put(MENU_SELECTION_MANAGER_KEY, msm); ++ ++ // installing additional listener if found in the AppContext ++ Object o = context.get(SwingUtilities2.MENU_SELECTION_MANAGER_LISTENER_KEY); ++ if (o != null && o instanceof ChangeListener) { ++ msm.addChangeListener((ChangeListener) o); ++ } + } + + return msm; +--- ./jdk/src/share/classes/javax/swing/PopupFactory.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/PopupFactory.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,10 +25,14 @@ + + package javax.swing; + ++import sun.awt.EmbeddedFrame; ++import sun.awt.OSInfo; ++ + import java.applet.Applet; + import java.awt.*; + import java.awt.event.WindowAdapter; + import java.awt.event.WindowEvent; ++import java.security.AccessController; + import java.util.ArrayList; + import java.util.HashMap; + import java.util.List; +@@ -226,7 +230,13 @@ + case MEDIUM_WEIGHT_POPUP: + return getMediumWeightPopup(owner, contents, ownerX, ownerY); + case HEAVY_WEIGHT_POPUP: +- return getHeavyWeightPopup(owner, contents, ownerX, ownerY); ++ Popup popup = getHeavyWeightPopup(owner, contents, ownerX, ownerY); ++ if ((AccessController.doPrivileged(OSInfo.getOSTypeAction()) == ++ OSInfo.OSType.MACOSX) && (owner != null) && ++ (EmbeddedFrame.getAppletIfAncestorOf(owner) != null)) { ++ ((HeavyWeightPopup)popup).setCacheEnabled(false); ++ } ++ return popup; + } + return null; + } +@@ -294,6 +304,8 @@ + private static final Object heavyWeightPopupCacheKey = + new StringBuffer("PopupFactory.heavyWeightPopupCache"); + ++ private volatile boolean isCacheEnabled = true; ++ + /** + * Returns either a new or recycled <code>Popup</code> containing + * the specified children. +@@ -448,12 +460,23 @@ + } + } + ++ /** ++ * Enables or disables cache for current object. ++ */ ++ void setCacheEnabled(boolean enable) { ++ isCacheEnabled = enable; ++ } ++ + // + // Popup methods + // + public void hide() { + super.hide(); +- recycleHeavyWeightPopup(this); ++ if (isCacheEnabled) { ++ recycleHeavyWeightPopup(this); ++ } else { ++ this._dispose(); ++ } + } + + /** +--- ./jdk/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/SortingFocusTraversalPolicy.java Mon Jan 05 11:57:27 2015 -0800 +@@ -30,6 +30,11 @@ + import java.util.*; + import java.awt.FocusTraversalPolicy; + import sun.util.logging.PlatformLogger; ++import java.lang.reflect.InvocationTargetException; ++import java.lang.reflect.Method; ++import sun.security.action.GetPropertyAction; ++import java.security.AccessController; ++import java.security.PrivilegedAction; + + /** + * A FocusTraversalPolicy that determines traversal order by sorting the +@@ -89,6 +94,34 @@ + final private int FORWARD_TRAVERSAL = 0; + final private int BACKWARD_TRAVERSAL = 1; + ++ /* ++ * When true (by default), the legacy merge-sort algo is used to sort an FTP cycle. ++ * When false, the default (tim-sort) algo is used, which may lead to an exception. ++ * See: JDK-8048887 ++ */ ++ private static final boolean legacySortingFTPEnabled; ++ private static final Method legacyMergeSortMethod; ++ ++ static { ++ legacySortingFTPEnabled = "true".equals(AccessController.doPrivileged( ++ new GetPropertyAction("swing.legacySortingFTPEnabled", "true"))); ++ legacyMergeSortMethod = legacySortingFTPEnabled ? ++ AccessController.doPrivileged(new PrivilegedAction<Method>() { ++ public Method run() { ++ try { ++ Class c = Class.forName("java.util.Arrays"); ++ Method m = c.getDeclaredMethod("legacyMergeSort", new Class[]{Object[].class, Comparator.class}); ++ m.setAccessible(true); ++ return m; ++ } catch (ClassNotFoundException | NoSuchMethodException e) { ++ // using default sorting algo ++ return null; ++ } ++ } ++ }) : ++ null; ++ } ++ + /** + * Constructs a SortingFocusTraversalPolicy without a Comparator. + * Subclasses must set the Comparator using <code>setComparator</code> +@@ -133,10 +166,32 @@ + private void enumerateAndSortCycle(Container focusCycleRoot, List<Component> cycle) { + if (focusCycleRoot.isShowing()) { + enumerateCycle(focusCycleRoot, cycle); +- Collections.sort(cycle, comparator); ++ if (!legacySortingFTPEnabled || ++ !legacySort(cycle, comparator)) ++ { ++ Collections.sort(cycle, comparator); ++ } + } + } + ++ private boolean legacySort(List<Component> l, Comparator<? super Component> c) { ++ if (legacyMergeSortMethod == null) ++ return false; ++ ++ Object[] a = l.toArray(); ++ try { ++ legacyMergeSortMethod.invoke(null, a, c); ++ } catch (IllegalAccessException | InvocationTargetException e) { ++ return false; ++ } ++ ListIterator<Component> i = l.listIterator(); ++ for (Object e : a) { ++ i.next(); ++ i.set((Component)e); ++ } ++ return true; ++ } ++ + private void enumerateCycle(Container container, List<Component> cycle) { + if (!(container.isVisible() && container.isDisplayable())) { + return; +--- ./jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Mon Jan 05 11:57:27 2015 -0800 +@@ -941,16 +941,9 @@ + + directories.clear(); + +- File[] baseFolders; +- if (useShellFolder) { +- baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { +- public File[] run() { +- return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); +- } +- }); +- } else { +- baseFolders = fsv.getRoots(); +- } ++ File[] baseFolders = (useShellFolder) ++ ? (File[]) ShellFolder.get("fileChooserComboBoxFolders") ++ : fsv.getRoots(); + directories.addAll(Arrays.asList(baseFolders)); + + // Get the canonical (full) path. This has the side +--- ./jdk/src/share/classes/javax/swing/plaf/nimbus/skin.laf Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/nimbus/skin.laf Mon Jan 05 11:57:27 2015 -0800 +@@ -1,7 +1,7 @@ + <?xml version="1.0" encoding="UTF-8"?> + + <!-- +- Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. ++ Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + + This code is free software; you can redistribute it and/or modify it +@@ -13424,10 +13424,10 @@ + <state stateKeys="Selected"> + <style> + <textForeground> +- <matte red="255" green="255" blue="255" alpha="255" uiDefaultParentName="nimbusLightBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="255" green="255" blue="255" alpha="255" uiDefaultParentName="nimbusLightBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textForeground> + <textBackground> +- <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textBackground> + <background/> + <inherit-textForeground>false</inherit-textForeground> +@@ -13453,7 +13453,7 @@ + <style> + <textForeground/> + <textBackground> +- <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textBackground> + <background/> + <inherit-textBackground>false</inherit-textBackground> +@@ -13477,7 +13477,7 @@ + <state stateKeys="Disabled"> + <style> + <textForeground> +- <matte red="142" green="143" blue="145" alpha="255" uiDefaultParentName="nimbusDisabledText" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="142" green="143" blue="145" alpha="255" uiDefaultParentName="nimbusDisabledText" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textForeground> + <textBackground/> + <background/> +@@ -13520,7 +13520,7 @@ + </textForeground> + <textBackground/> + <background> +- <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </background> + <inherit-textForeground>false</inherit-textForeground> + <inherit-background>false</inherit-background> +--- ./jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -2081,6 +2081,13 @@ + // null end tag. + endTag(false); + continue; ++ } else if (textpos == 0) { ++ if (!legalElementContext(dtd.pcdata)) { ++ error("unexpected.pcdata"); ++ } ++ if (last.breaksFlow()) { ++ space = false; ++ } + } + break; + +--- ./jdk/src/share/classes/sun/awt/AWTAccessor.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/AWTAccessor.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,6 +25,7 @@ + + package sun.awt; + ++import javax.accessibility.AccessibleContext; + import java.awt.*; + import java.awt.KeyboardFocusManager; + import java.awt.DefaultKeyboardFocusManager; +@@ -491,6 +492,11 @@ + */ + void invokeAndWait(Object source, Runnable r) + throws InterruptedException, InvocationTargetException; ++ ++ /** ++ * Gets most recent event time in the EventQueue ++ */ ++ long getMostRecentEventTime(EventQueue eventQueue); + } + + /* +@@ -723,6 +729,14 @@ + + + /* ++ * An accessor object for the AccessibleContext class ++ */ ++ public interface AccessibleContextAccessor { ++ void setAppContext(AccessibleContext accessibleContext, AppContext appContext); ++ AppContext getAppContext(AccessibleContext accessibleContext); ++ } ++ ++ /* + * Accessor instances are initialized in the static initializers of + * corresponding AWT classes by using setters defined below. + */ +@@ -751,6 +765,7 @@ + private static SequencedEventAccessor sequencedEventAccessor; + private static InvocationEventAccessor invocationEventAccessor; + private static ToolkitAccessor toolkitAccessor; ++ private static AccessibleContextAccessor accessibleContextAccessor; + + /* + * Set an accessor object for the java.awt.Component class. +@@ -1177,4 +1192,22 @@ + public static InvocationEventAccessor getInvocationEventAccessor() { + return invocationEventAccessor; + } ++ ++ ++ /* ++ * Get the accessor object for the javax.accessibility.AccessibleContext class. ++ */ ++ public static AccessibleContextAccessor getAccessibleContextAccessor() { ++ if (accessibleContextAccessor == null) { ++ unsafe.ensureClassInitialized(AccessibleContext.class); ++ } ++ return accessibleContextAccessor; ++ } ++ ++ /* ++ * Set the accessor object for the javax.accessibility.AccessibleContext class. ++ */ ++ public static void setAccessibleContextAccessor(AccessibleContextAccessor accessor) { ++ AWTAccessor.accessibleContextAccessor = accessor; ++ } + } +--- ./jdk/src/share/classes/sun/awt/AppContext.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/AppContext.java Mon Jan 05 11:57:27 2015 -0800 +@@ -167,6 +167,9 @@ + */ + private static volatile AppContext mainAppContext = null; + ++ private static class GetAppContextLock {}; ++ private final static Object getAppContextLock = new GetAppContextLock(); ++ + /* + * The hash map associated with this AppContext. A private delegate + * is used instead of subclassing HashMap so as to avoid all of +@@ -308,14 +311,16 @@ + // if no contexts have been created yet. This covers standalone apps + // and excludes applets because by the time applet starts + // a number of contexts have already been created by the plugin. +- if (numAppContexts.get() == 0) { +- if (System.getProperty("javaplugin.version") == null && +- System.getProperty("javawebstart.version") == null) { +- initMainAppContext(); +- } else if (System.getProperty("javafx.version") != null && +- threadGroup.getParent() != null) { +- // Swing inside JavaFX case +- SunToolkit.createNewAppContext(); ++ synchronized (getAppContextLock) { ++ if (numAppContexts.get() == 0) { ++ if (System.getProperty("javaplugin.version") == null && ++ System.getProperty("javawebstart.version") == null) { ++ initMainAppContext(); ++ } else if (System.getProperty("javafx.version") != null && ++ threadGroup.getParent() != null) { ++ // Swing inside JavaFX case ++ SunToolkit.createNewAppContext(); ++ } + } + } + +--- ./jdk/src/share/classes/sun/awt/SunToolkit.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Mon Jan 05 11:57:27 2015 -0800 +@@ -378,7 +378,7 @@ + * null or the target can't be found, a null with be returned. + */ + public static AppContext targetToAppContext(Object target) { +- if (target == null || GraphicsEnvironment.isHeadless()) { ++ if (target == null) { + return null; + } + AppContext context = getAppContext(target); +@@ -452,12 +452,10 @@ + * via targetToAppContext() above. + */ + public static void insertTargetMapping(Object target, AppContext appContext) { +- if (!GraphicsEnvironment.isHeadless()) { +- if (!setAppContext(target, appContext)) { +- // Target is not a Component/MenuComponent, use the private Map +- // instead. +- appContextMap.put(target, appContext); +- } ++ if (!setAppContext(target, appContext)) { ++ // Target is not a Component/MenuComponent, use the private Map ++ // instead. ++ appContextMap.put(target, appContext); + } + } + +--- ./jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -239,6 +239,13 @@ + + if (localTransferable != null) { + return localTransferable.getTransferData(df); ++ } else if (df.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType)) { ++ // Workaround to JDK-8024061: Exception thrown when drag and drop ++ // between two components is executed quickly. ++ // It is expected localTransferable is not null if javaJVMLocalObjectMimeType ++ // is used. Executing further results in ClassCastException, so null is ++ // returned here as no transfer data is available in this case. ++ return null; + } + + if (dropStatus != STATUS_ACCEPT || dropComplete) { +--- ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1408,10 +1408,10 @@ + } + } + +- long lastbit = (long) dataBitOffset +- + (long) (height - 1) * (long) scanlineStride * 8 +- + (long) (width - 1) * (long) pixelBitStride +- + (long) pixelBitStride - 1; ++ int lastbit = (dataBitOffset ++ + (height-1) * scanlineStride * 8 ++ + (width-1) * pixelBitStride ++ + pixelBitStride - 1); + if (lastbit < 0 || lastbit / 8 >= data.length) { + throw new RasterFormatException("raster dimensions overflow " + + "array bounds"); +--- ./jdk/src/share/classes/sun/java2d/SunGraphics2D.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/java2d/SunGraphics2D.java Mon Jan 05 11:57:27 2015 -0800 +@@ -2388,6 +2388,8 @@ + surfaceData = NullSurfaceData.theInstance; + } + ++ invalidatePipe(); ++ + // this will recalculate the composite clip + setDevClip(surfaceData.getBounds()); + +--- ./jdk/src/share/classes/sun/java2d/opengl/OGLSurfaceDataProxy.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/java2d/opengl/OGLSurfaceDataProxy.java Mon Jan 05 11:57:27 2015 -0800 +@@ -65,7 +65,11 @@ + int w, int h) + { + if (cachedData == null) { +- cachedData = oglgc.createManagedSurface(w, h, transparency); ++ try { ++ cachedData = oglgc.createManagedSurface(w, h, transparency); ++ } catch (OutOfMemoryError er) { ++ return null; ++ } + } + return cachedData; + } +--- ./jdk/src/share/classes/sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java Mon Jan 05 11:57:27 2015 -0800 +@@ -233,8 +233,6 @@ + * does not conform to the expected pattern + */ + public static int getLocalVmId(File file) { +- int lvmid = 0; +- + try { + // try 1.4.2 and later format first + return Integer.parseInt(file.getName()); +@@ -287,31 +285,13 @@ + return tmpDirName + dirNamePrefix + user + File.separator; + } + +- /* +- * this static initializer would not be necessary if the +- * Solaris java.io.tmpdir property were set to /tmp by default +- */ + static { + /* +- * Why is java.io.tmpdir on Solaris set to "/var/tmp/" when the +- * HotSpot JVM os:get_temp_path() method returns "/tmp/" +- * +- * Why do Solaris and Windows return a string with a trailing +- * file separator character where as Linix does not? (this change +- * seems to have occurred sometime during hopper beta) ++ * For this to work, the target VM and this code need to use ++ * the same directory. Instead of guessing which directory the ++ * VM is using, we will ask. + */ +- String tmpdir = System.getProperty("java.io.tmpdir"); +- +- if (tmpdir.compareTo("/var/tmp/") == 0) { +- /* +- * shared memory files are created in /tmp. Interestingly, +- * java.io.tmpdir is set to "/var/tmp/" on Solaris and Linux, +- * but os::get_temp_directory() is set to "/tmp/" on these +- * platforms. the java.io.logging packages also makes reference +- * to java.io.tmpdir. +- */ +- tmpdir = "/tmp/"; +- } ++ String tmpdir = sun.misc.VMSupport.getVMTemporaryDirectory(); + + /* + * Assure that the string returned has a trailing File.separator +--- ./jdk/src/share/classes/sun/launcher/resources/launcher_de.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/launcher/resources/launcher_de.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -34,7 +34,7 @@ + java.launcher.ergo.message2 =\ weil die Ausf\u00FChrung auf einem Server-Class-Rechner erfolgt.\n + + # Translators please note do not translate the options themselves +-java.launcher.opt.footer =\ -cp <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch {0} getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven zur Suche nach Klassendateien.\n -D<name>=<value>\n Legt eine Systemeigenschaft fest\n -verbose:[class|gc|jni]\n Aktiviert die Verbose-Ausgabe\n -version Druckt Produktversion und beendet das Programm\n -version:<value>\n Erfordert die angegebene Version zur Ausf\u00FChrung\n -showversion Druckt Produktversion und f\u00E4hrt fort\n -jre-restrict-search | -no-jre-restrict-search\n Bezieht private JREs des Benutzers in Versionssuche ein bzw. schlie\u00DFt sie aus\n -? -help Druckt diese Hilfemeldung\n -X Druckt Hilfe zu Nicht-Standardoptionen\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertionen mit angegebener Granularit\u00E4t\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertionen mit angegebener Granularit\u00E4t\n -esa | -enablesystemassertions\n Aktiviert Systemassertionen\n -dsa | -disablesystemassertions\n Deaktiviert Systemassertionen\n -agentlib:<libname>[=<options>]\n L\u00E4dt native Agent Library <libname>, z.B. -agentlib:hprof\n siehe auch -agentlib:jdwp=help und -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n L\u00E4dt native Agent Library nach vollem Pfadnamen\n -javaagent:<jarpath>[=<options>]\n L\u00E4dt Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt Startbildschirm mit angegebenem Bild\nWeitere Einzelheiten finden Sie unter http://www.oracle.com/technetwork/java/javase/documentation/index.html ++java.launcher.opt.footer =\ -cp <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch {0} getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven zur Suche nach Klassendateien.\n -D<name>=<value>\n Legt eine Systemeigenschaft fest\n -verbose:[class|gc|jni]\n Aktiviert die Verbose-Ausgabe\n -version Druckt Produktversion und beendet das Programm\n -version:<value>\n Erfordert die angegebene Version zur Ausf\u00FChrung\n -showversion Druckt Produktversion und f\u00E4hrt fort\n -jre-restrict-search | -no-jre-restrict-search\n Bezieht private JREs des Benutzers in Versionssuche ein bzw. schlie\u00DFt sie aus\n -? -help Druckt diese Hilfemeldung\n -X Druckt Hilfe zu Nicht-Standardoptionen\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertions mit angegebener Granularit\u00E4t\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertions mit angegebener Granularit\u00E4t\n -esa | -enablesystemassertions\n Aktiviert Systemassertionen\n -dsa | -disablesystemassertions\n Deaktiviert Systemassertionen\n -agentlib:<libname>[=<options>]\n L\u00E4dt native Agent Library <libname>, z.B. -agentlib:hprof\n siehe auch -agentlib:jdwp=help und -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n L\u00E4dt native Agent Library nach vollem Pfadnamen\n -javaagent:<jarpath>[=<options>]\n L\u00E4dt Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt Startbildschirm mit angegebenem Bild\nWeitere Einzelheiten finden Sie unter http://www.oracle.com/technetwork/java/javase/documentation/index.html + + # Translators please note do not translate the options themselves + java.launcher.X.usage=\ -Xmixed Ausf\u00FChrung im gemischten Modus (Standard)\n -Xint Nur Ausf\u00FChrung im interpretierten Modus\n -Xbootclasspath:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Legt Suchpfad f\u00FCr Bootstrap-Klassen und Ressourcen fest\n -Xbootclasspath/a:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n H\u00E4ngt an das Ende des Bootstrap Classpath an\n -Xbootclasspath/p:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Stellt Bootstrap Classpath voran\n -Xdiag Zeigt zus\u00E4tzliche Diagnosemeldungen an\n -Xnoclassgc Deaktiviert Klassen-Garbage Collection\n -Xincgc Aktiviert inkrementelle Garbage Collection\n -Xloggc:<file> Loggt GC-Status in einer Datei mit Zeitstempeln\n -Xbatch Deaktiviert Hintergrundkompilierung\n -Xms<size> Legt anf\u00E4ngliche Java Heap-Gr\u00F6\u00DFe fest\n -Xmx<size> Legt maximale Java Heap-Gr\u00F6\u00DFe fest\n -Xss<size> Legt Java-Threadstackgr\u00F6\u00DFe fest\n -Xprof Gibt CPU-Profiling-Daten aus\n -Xfuture Aktiviert strengste Pr\u00FCfungen, antizipiert zuk\u00FCnftigen Standardwert\n -Xrs Reduziert Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n -Xcheck:jni F\u00FChrt zus\u00E4tzliche Pr\u00FCfungen f\u00FCr JNI-Funktionen durch\n -Xshare:off Kein Versuch, gemeinsame Klassendaten zu verwenden\n -Xshare:auto Verwendet gemeinsame Klassendaten, wenn m\u00F6glich (Standard)\n -Xshare:on Erfordert die Verwendung gemeinsamer Klassendaten, sonst verl\u00E4uft der Vorgang nicht erfolgreich.\n -XshowSettings Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:all\n Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:vm Zeigt alle VM-bezogenen Einstellungen und f\u00E4hrt fort\n -XshowSettings:properties\n Zeigt alle Eigenschaftseinstellungen und f\u00E4hrt fort\n -XshowSettings:locale\n Zeigt alle gebietsschemabezogenen Einstellungen und f\u00E4hrt fort\n\nDie -X-Optionen sind keine Standardoptionen und k\u00F6nnen ohne Vorank\u00FCndigung ge\u00E4ndert werden.\n +--- ./jdk/src/share/classes/sun/misc/VMSupport.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/misc/VMSupport.java Mon Jan 05 11:57:27 2015 -0800 +@@ -97,4 +97,14 @@ + throw new RuntimeException(ioe.getMessage()); + } + } ++ ++ /* ++ * Return the temporary directory that the VM uses for the attach ++ * and perf data files. ++ * ++ * It is important that this directory is well-known and the ++ * same for all VM instances. It cannot be affected by configuration ++ * variables such as java.io.tmpdir. ++ */ ++ public static native String getVMTemporaryDirectory(); + } +--- ./jdk/src/share/classes/sun/net/www/http/HttpClient.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/http/HttpClient.java Mon Jan 05 11:57:27 2015 -0800 +@@ -651,7 +651,9 @@ + // try once more + openServer(); + if (needsTunneling()) { ++ MessageHeader origRequests = requests; + httpuc.doTunneling(); ++ requests = origRequests; + } + afterConnect(); + writeRequests(requests, poster); +@@ -762,7 +764,9 @@ + cachedHttpClient = false; + openServer(); + if (needsTunneling()) { ++ MessageHeader origRequests = requests; + httpuc.doTunneling(); ++ requests = origRequests; + } + afterConnect(); + writeRequests(requests, poster); +--- ./jdk/src/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Mon Jan 05 11:57:27 2015 -0800 +@@ -301,7 +301,7 @@ + throw new IOException(fe); + } + try { +- ftp.login(user, password.toCharArray()); ++ ftp.login(user, password == null ? null : password.toCharArray()); + } catch (sun.net.ftp.FtpProtocolException e) { + ftp.close(); + // Backward compatibility +--- ./jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Mon Jan 05 11:57:27 2015 -0800 +@@ -315,6 +315,7 @@ + /* try auth without calling Authenticator. Used for transparent NTLM authentication */ + private boolean tryTransparentNTLMServer = true; + private boolean tryTransparentNTLMProxy = true; ++ private boolean useProxyResponseCode = false; + + /* Used by Windows specific code */ + private Object authObj; +@@ -2032,6 +2033,14 @@ + if (tryTransparentNTLMProxy) { + tryTransparentNTLMProxy = + NTLMAuthenticationProxy.proxy.supportsTransparentAuth; ++ /* If the platform supports transparent authentication ++ * then normally it's ok to do transparent auth to a proxy ++ * because we generally trust proxies (chosen by the user) ++ * But not in the case of 305 response where the server ++ * chose it. */ ++ if (tryTransparentNTLMProxy && useProxyResponseCode) { ++ tryTransparentNTLMProxy = false; ++ } + } + a = null; + if (tryTransparentNTLMProxy) { +@@ -2364,6 +2373,10 @@ + requests.set(0, method + " " + getRequestURI()+" " + + httpVersion, null); + connected = true; ++ // need to remember this in case NTLM proxy authentication gets ++ // used. We can't use transparent authentication when user ++ // doesn't know about proxy. ++ useProxyResponseCode = true; + } else { + // maintain previous headers, just change the name + // of the file we're getting +--- ./jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -32,6 +32,7 @@ + import sun.net.www.HeaderParser; + import sun.misc.BASE64Decoder; + import sun.misc.BASE64Encoder; ++import sun.util.logging.PlatformLogger; + import static sun.net.www.protocol.http.AuthScheme.NEGOTIATE; + import static sun.net.www.protocol.http.AuthScheme.KERBEROS; + +@@ -45,6 +46,7 @@ + class NegotiateAuthentication extends AuthenticationInfo { + + private static final long serialVersionUID = 100L; ++ private static final PlatformLogger logger = HttpURLConnection.getHttpLogger(); + + final private HttpCallerInfo hci; + +@@ -80,6 +82,31 @@ + } + + /** ++ * Find out if the HttpCallerInfo supports Negotiate protocol. ++ * @return true if supported ++ */ ++ public static boolean isSupported(HttpCallerInfo hci) { ++ ClassLoader loader = null; ++ try { ++ loader = Thread.currentThread().getContextClassLoader(); ++ } catch (SecurityException se) { ++ if (logger.isLoggable(PlatformLogger.Level.FINER)) { ++ logger.finer("NegotiateAuthentication: " + ++ "Attempt to get the context class loader failed - " + se); ++ } ++ } ++ ++ if (loader != null) { ++ // Lock on the class loader instance to avoid the deadlock engaging ++ // the lock in "ClassLoader.loadClass(String, boolean)" method. ++ synchronized (loader) { ++ return isSupportedImpl(hci); ++ } ++ } ++ return isSupportedImpl(hci); ++ } ++ ++ /** + * Find out if the HttpCallerInfo supports Negotiate protocol. In order to + * find out yes or no, an initialization of a Negotiator object against it + * is tried. The generated object will be cached under the name of ths +@@ -90,7 +117,7 @@ + * + * @return true if supported + */ +- synchronized public static boolean isSupported(HttpCallerInfo hci) { ++ private static synchronized boolean isSupportedImpl(HttpCallerInfo hci) { + if (supported == null) { + supported = new HashMap <String, Boolean>(); + cache = new HashMap <String, Negotiator>(); +--- ./jdk/src/share/classes/sun/rmi/transport/Transport.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/rmi/transport/Transport.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -37,6 +37,10 @@ + import java.rmi.server.RemoteServer; + import java.rmi.server.ServerNotActiveException; + import java.security.AccessControlContext; ++import java.security.AccessController; ++import java.security.Permissions; ++import java.security.PrivilegedAction; ++import java.security.ProtectionDomain; + import sun.rmi.runtime.Log; + import sun.rmi.server.Dispatcher; + import sun.rmi.server.UnicastServerRef; +@@ -67,6 +71,15 @@ + /** ObjID for DGCImpl */ + private static final ObjID dgcID = new ObjID(ObjID.DGC_ID); + ++ /** AccessControlContext for setting context ClassLoader */ ++ private static final AccessControlContext SETCCL_ACC; ++ static { ++ Permissions perms = new Permissions(); ++ perms.add(new RuntimePermission("setContextClassLoader")); ++ ProtectionDomain[] pd = { new ProtectionDomain(null, perms) }; ++ SETCCL_ACC = new AccessControlContext(pd); ++ } ++ + /** + * Returns a <I>Channel</I> that generates connections to the + * endpoint <I>ep</I>. A Channel is an object that creates and +@@ -116,6 +129,19 @@ + protected abstract void checkAcceptPermission(AccessControlContext acc); + + /** ++ * Sets the context class loader for the current thread. ++ */ ++ private static void setContextClassLoader(final ClassLoader ccl) { ++ AccessController.doPrivileged(new PrivilegedAction<Void> () { ++ @Override ++ public Void run() { ++ Thread.currentThread().setContextClassLoader(ccl); ++ return null; ++ } ++ }, SETCCL_ACC); ++ } ++ ++ /** + * Service an incoming remote call. When a message arrives on the + * connection indicating the beginning of a remote call, the + * threads are required to call the <I>serviceCall</I> method of +@@ -163,11 +189,10 @@ + target.getAccessControlContext(); + ClassLoader ccl = target.getContextClassLoader(); + +- Thread t = Thread.currentThread(); +- ClassLoader savedCcl = t.getContextClassLoader(); ++ ClassLoader savedCcl = Thread.currentThread().getContextClassLoader(); + + try { +- t.setContextClassLoader(ccl); ++ setContextClassLoader(ccl); + currentTransport.set(this); + try { + java.security.AccessController.doPrivileged( +@@ -182,7 +207,7 @@ + throw (IOException) pae.getException(); + } + } finally { +- t.setContextClassLoader(savedCcl); ++ setContextClassLoader(savedCcl); + currentTransport.set(null); + } + +--- ./jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -49,6 +49,9 @@ + import java.rmi.server.UID; + import java.security.AccessControlContext; + import java.security.AccessController; ++import java.security.Permissions; ++import java.security.PrivilegedAction; ++import java.security.ProtectionDomain; + import java.util.ArrayList; + import java.util.LinkedList; + import java.util.List; +@@ -122,6 +125,14 @@ + private static final ThreadLocal<ConnectionHandler> + threadConnectionHandler = new ThreadLocal<>(); + ++ /** an AccessControlContext with no permissions */ ++ private static final AccessControlContext NOPERMS_ACC; ++ static { ++ Permissions perms = new Permissions(); ++ ProtectionDomain[] pd = { new ProtectionDomain(null, perms) }; ++ NOPERMS_ACC = new AccessControlContext(pd); ++ } ++ + /** endpoints for this transport */ + private final LinkedList<TCPEndpoint> epList; + /** number of objects exported on this transport */ +@@ -667,7 +678,13 @@ + t.setName("RMI TCP Connection(" + + connectionCount.incrementAndGet() + + ")-" + remoteHost); +- run0(); ++ AccessController.doPrivileged(new PrivilegedAction<Void>() { ++ @Override ++ public Void run() { ++ run0(); ++ return null; ++ } ++ }, NOPERMS_ACC); + } finally { + t.setName(name); + } +--- ./jdk/src/share/classes/sun/security/jgss/GSSHeader.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/jgss/GSSHeader.java Mon Jan 05 11:57:27 2015 -0800 +@@ -270,6 +270,9 @@ + value <<= 8; + value += 0x0ff & in.read(); + } ++ if (value < 0) { ++ throw new IOException("Invalid length bytes"); ++ } + } + return value; + } +--- ./jdk/src/share/classes/sun/security/jgss/GSSNameImpl.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/jgss/GSSNameImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -257,6 +257,10 @@ + ((0xFF & bytes[pos++]) << 16) | + ((0xFF & bytes[pos++]) << 8) | + (0xFF & bytes[pos++])); ++ if (mechPortionLen < 0 || pos > bytes.length - mechPortionLen) { ++ throw new GSSExceptionImpl(GSSException.BAD_NAME, ++ "Exported name mech name is corrupted!"); ++ } + byte[] mechPortion = new byte[mechPortionLen]; + System.arraycopy(bytes, pos, mechPortion, 0, mechPortionLen); + +--- ./jdk/src/share/classes/sun/security/jgss/wrapper/GSSNameElement.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/jgss/wrapper/GSSNameElement.java Mon Jan 05 11:57:27 2015 -0800 +@@ -233,6 +233,9 @@ + ((0xFF & nameVal[pos++]) << 16) | + ((0xFF & nameVal[pos++]) << 8) | + (0xFF & nameVal[pos++])); ++ if (mechPortionLen < 0) { ++ throw new GSSException(GSSException.BAD_NAME); ++ } + byte[] mechPortion = new byte[mechPortionLen]; + System.arraycopy(nameVal, pos, mechPortion, 0, mechPortionLen); + return mechPortion; +--- ./jdk/src/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java Mon Jan 05 11:57:27 2015 -0800 +@@ -123,7 +123,7 @@ + } else { + type = read(4); + } +- length = read(4); ++ length = readLength4(); + String[] result = new String[length + 1]; + /* + * DCE includes the principal's realm in the count; the new format +@@ -132,7 +132,7 @@ + if (version == KRB5_FCC_FVNO_1) + length--; + for (int i = 0; i <= length; i++) { +- namelength = read(4); ++ namelength = readLength4(); + if (namelength > MAXNAMELENGTH) { + throw new IOException("Invalid name length in principal name."); + } +@@ -182,7 +182,7 @@ + keyType = read(2); + if (version == KRB5_FCC_FVNO_3) + read(2); /* keytype recorded twice in fvno 3 */ +- keyLen = read(4); ++ keyLen = readLength4(); + byte[] bytes = new byte[keyLen]; + for (int i = 0; i < keyLen; i++) { + bytes[i] = (byte)read(); +@@ -208,12 +208,12 @@ + + HostAddress[] readAddr() throws IOException, KrbApErrException { + int numAddrs, addrType, addrLength; +- numAddrs = read(4); ++ numAddrs = readLength4(); + if (numAddrs > 0) { + HostAddress[] addrs = new HostAddress[numAddrs]; + for (int i = 0; i < numAddrs; i++) { + addrType = read(2); +- addrLength = read(4); ++ addrLength = readLength4(); + if (!(addrLength == 4 || addrLength == 16)) { + if (DEBUG) { + System.out.println("Incorrect address format."); +@@ -232,13 +232,13 @@ + + AuthorizationDataEntry[] readAuth() throws IOException { + int num, adtype, adlength; +- num = read(4); ++ num = readLength4(); + if (num > 0) { + AuthorizationDataEntry[] auData = new AuthorizationDataEntry[num]; + byte[] data = null; + for (int i = 0; i < num; i++) { + adtype = read(2); +- adlength = read(4); ++ adlength = readLength4(); + data = new byte[adlength]; + for (int j = 0; j < adlength; j++) { + data[j] = (byte)read(); +@@ -252,7 +252,7 @@ + + byte[] readData() throws IOException { + int length; +- length = read(4); ++ length = readLength4(); + if (length == 0) { + return null; + } else { +--- ./jdk/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java Mon Jan 05 11:57:27 2015 -0800 +@@ -154,44 +154,44 @@ + throws IOException, KrbException { + primaryPrincipal = principal; + primaryRealm = principal.getRealm(); +- CCacheOutputStream cos = +- new CCacheOutputStream(new FileOutputStream(name)); +- version = KRB5_FCC_FVNO_3; +- cos.writeHeader(primaryPrincipal, version); +- cos.close(); ++ try (FileOutputStream fos = new FileOutputStream(name); ++ CCacheOutputStream cos = new CCacheOutputStream(fos)) { ++ version = KRB5_FCC_FVNO_3; ++ cos.writeHeader(primaryPrincipal, version); ++ } + load(name); + } + + synchronized void load(String name) throws IOException, KrbException { + PrincipalName p; +- CCacheInputStream cis = +- new CCacheInputStream(new FileInputStream(name)); +- version = cis.readVersion(); +- if (version == KRB5_FCC_FVNO_4) { +- tag = cis.readTag(); +- } else { +- tag = null; +- if (version == KRB5_FCC_FVNO_1 || version == KRB5_FCC_FVNO_2) { +- cis.setNativeByteOrder(); ++ try (FileInputStream fis = new FileInputStream(name); ++ CCacheInputStream cis = new CCacheInputStream(fis)) { ++ version = cis.readVersion(); ++ if (version == KRB5_FCC_FVNO_4) { ++ tag = cis.readTag(); ++ } else { ++ tag = null; ++ if (version == KRB5_FCC_FVNO_1 || version == KRB5_FCC_FVNO_2) { ++ cis.setNativeByteOrder(); ++ } ++ } ++ p = cis.readPrincipal(version); ++ ++ if (primaryPrincipal != null) { ++ if (!(primaryPrincipal.match(p))) { ++ throw new IOException("Primary principals don't match."); ++ } ++ } else ++ primaryPrincipal = p; ++ primaryRealm = primaryPrincipal.getRealm(); ++ credentialsList = new Vector<Credentials>(); ++ while (cis.available() > 0) { ++ Credentials cred = cis.readCred(version); ++ if (cred != null) { ++ credentialsList.addElement(cred); ++ } + } + } +- p = cis.readPrincipal(version); +- +- if (primaryPrincipal != null) { +- if (!(primaryPrincipal.match(p))) { +- throw new IOException("Primary principals don't match."); +- } +- } else +- primaryPrincipal = p; +- primaryRealm = primaryPrincipal.getRealm(); +- credentialsList = new Vector<Credentials> (); +- while (cis.available() > 0) { +- Credentials cred = cis.readCred(version); +- if (cred != null) { +- credentialsList.addElement(cred); +- } +- } +- cis.close(); + } + + +@@ -250,16 +250,16 @@ + * Saves the credentials cache file to the disk. + */ + public synchronized void save() throws IOException, Asn1Exception { +- CCacheOutputStream cos +- = new CCacheOutputStream(new FileOutputStream(cacheName)); +- cos.writeHeader(primaryPrincipal, version); +- Credentials[] tmp = null; +- if ((tmp = getCredsList()) != null) { +- for (int i = 0; i < tmp.length; i++) { +- cos.addCreds(tmp[i]); ++ try (FileOutputStream fos = new FileOutputStream(cacheName); ++ CCacheOutputStream cos = new CCacheOutputStream(fos)) { ++ cos.writeHeader(primaryPrincipal, version); ++ Credentials[] tmp = null; ++ if ((tmp = getCredsList()) != null) { ++ for (int i = 0; i < tmp.length; i++) { ++ cos.addCreds(tmp[i]); ++ } + } + } +- cos.close(); + } + + boolean match(String[] s1, String[] s2) { +--- ./jdk/src/share/classes/sun/security/krb5/internal/util/KrbDataInputStream.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/krb5/internal/util/KrbDataInputStream.java Mon Jan 05 11:57:27 2015 -0800 +@@ -56,15 +56,33 @@ + public KrbDataInputStream(InputStream is){ + super(is); + } ++ ++ /** ++ * Reads a length value which is represented in 4 bytes from ++ * this input stream. The value must be positive. ++ * @return the length value represented by this byte array. ++ * @throws IOException if there are not enough bytes or it represents ++ * a negative value ++ */ ++ final public int readLength4() throws IOException { ++ int len = read(4); ++ if (len < 0) { ++ throw new IOException("Invalid encoding"); ++ } ++ return len; ++ } ++ + /** + * Reads up to the specific number of bytes from this input stream. + * @param num the number of bytes to be read. + * @return the int value of this byte array. +- * @exception IOException. ++ * @throws IOException if there are not enough bytes + */ +- public int read(int num) throws IOException{ ++ public int read(int num) throws IOException { + byte[] bytes = new byte[num]; +- read(bytes, 0, num); ++ if (read(bytes, 0, num) != num) { ++ throw new IOException("Premature end of stream reached"); ++ } + int result = 0; + for (int i = 0; i < num; i++) { + if (bigEndian) { +--- ./jdk/src/share/classes/sun/security/pkcs/SignerInfo.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/pkcs/SignerInfo.java Mon Jan 05 11:57:27 2015 -0800 +@@ -273,24 +273,6 @@ + return certList; + } + +- // Copied from com.sun.crypto.provider.OAEPParameters. +- private static String convertToStandardName(String internalName) { +- if (internalName.equals("SHA")) { +- return "SHA-1"; +- } else if (internalName.equals("SHA224")) { +- return "SHA-224"; +- } else if (internalName.equals("SHA256")) { +- return "SHA-256"; +- } else if (internalName.equals("SHA384")) { +- return "SHA-384"; +- } else if (internalName.equals("SHA512")) { +- return "SHA-512"; +- } else { +- return internalName; +- } +- } +- +- + /* Returns null if verify fails, this signerInfo if + verify succeeds. */ + SignerInfo verify(PKCS7 block, byte[] data) +@@ -330,7 +312,7 @@ + return null; + + MessageDigest md = MessageDigest.getInstance( +- convertToStandardName(digestAlgname)); ++ AlgorithmId.getStandardDigestName(digestAlgname)); + byte[] computedMessageDigest = md.digest(data); + + if (messageDigest.length != computedMessageDigest.length) +--- ./jdk/src/share/classes/sun/security/provider/SecureRandom.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/SecureRandom.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,6 +29,7 @@ + import java.security.MessageDigest; + import java.security.SecureRandomSpi; + import java.security.NoSuchAlgorithmException; ++import java.security.NoSuchProviderException; + + /** + * <p>This class provides a crytpographically strong pseudo-random number +@@ -94,9 +95,19 @@ + */ + private void init(byte[] seed) { + try { +- digest = MessageDigest.getInstance ("SHA"); +- } catch (NoSuchAlgorithmException e) { +- throw new InternalError("internal error: SHA-1 not available."); ++ /* ++ * Use the local SUN implementation to avoid native ++ * performance overhead. ++ */ ++ digest = MessageDigest.getInstance("SHA", "SUN"); ++ } catch (NoSuchProviderException | NoSuchAlgorithmException e) { ++ // Fallback to any available. ++ try { ++ digest = MessageDigest.getInstance("SHA"); ++ } catch (NoSuchAlgorithmException exc) { ++ throw new InternalError( ++ "internal error: SHA-1 not available."); ++ } + } + + if (seed != null) { +@@ -258,9 +269,19 @@ + s.defaultReadObject (); + + try { +- digest = MessageDigest.getInstance ("SHA"); +- } catch (NoSuchAlgorithmException e) { +- throw new InternalError("internal error: SHA-1 not available."); ++ /* ++ * Use the local SUN implementation to avoid native ++ * performance overhead. ++ */ ++ digest = MessageDigest.getInstance("SHA", "SUN"); ++ } catch (NoSuchProviderException | NoSuchAlgorithmException e) { ++ // Fallback to any available. ++ try { ++ digest = MessageDigest.getInstance("SHA"); ++ } catch (NoSuchAlgorithmException exc) { ++ throw new InternalError( ++ "internal error: SHA-1 not available."); ++ } + } + } + } +--- ./jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Mon Jan 05 11:57:27 2015 -0800 +@@ -375,20 +375,22 @@ + boolean add = false; + for (AccessDescription ad : adList) { + CertStore cs = URICertStore.getInstance(ad); +- try { +- if (certs.addAll((Collection<X509Certificate>) +- cs.getCertificates(caSelector))) { +- add = true; +- if (!searchAllCertStores) { +- return true; ++ if (cs != null) { ++ try { ++ if (certs.addAll((Collection<X509Certificate>) ++ cs.getCertificates(caSelector))) { ++ add = true; ++ if (!searchAllCertStores) { ++ return true; ++ } + } ++ } catch (CertStoreException cse) { ++ if (debug != null) { ++ debug.println("exception getting certs from CertStore:"); ++ cse.printStackTrace(); ++ } ++ continue; + } +- } catch (CertStoreException cse) { +- if (debug != null) { +- debug.println("exception getting certs from CertStore:"); +- cse.printStackTrace(); +- } +- continue; + } + } + return add; +--- ./jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Mon Jan 05 11:57:27 2015 -0800 +@@ -234,10 +234,6 @@ + // check trusted certificate's subject + issuerSelector.setSubject(firstCert.getIssuerX500Principal()); + +- // check the validity period +- issuerSelector.setValidityPeriod(firstCert.getNotBefore(), +- firstCert.getNotAfter()); +- + /* + * Facilitate certification path construction with authority + * key identifier and subject key identifier. +--- ./jdk/src/share/classes/sun/security/smartcardio/CardImpl.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/smartcardio/CardImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -26,9 +26,9 @@ + package sun.security.smartcardio; + + import java.nio.ByteBuffer; +- ++import java.security.AccessController; ++import java.security.PrivilegedAction; + import javax.smartcardio.*; +- + import static sun.security.smartcardio.PCSC.*; + + /** +@@ -62,6 +62,19 @@ + // thread holding exclusive access to the card, or null + private volatile Thread exclusiveThread; + ++ // used for platform specific logic ++ private static final boolean isWindows; ++ ++ static { ++ final String osName = AccessController.doPrivileged( ++ new PrivilegedAction<String>() { ++ @Override public String run() { ++ return System.getProperty("os.name"); ++ } ++ }); ++ isWindows = osName.startsWith("Windows"); ++ } ++ + CardImpl(TerminalImpl terminal, String protocol) throws PCSCException { + this.terminal = terminal; + int sharingMode = SCARD_SHARE_SHARED; +@@ -74,7 +87,12 @@ + connectProtocol = SCARD_PROTOCOL_T1; + } else if (protocol.equalsIgnoreCase("direct")) { + // testing +- connectProtocol = 0; ++ ++ // MSDN states that the preferred protocol can be zero, but doesn't ++ // specify whether other values are allowed. ++ // pcsc-lite implementation expects the preferred protocol to be non zero. ++ connectProtocol = isWindows ? 0 : SCARD_PROTOCOL_RAW; ++ + sharingMode = SCARD_SHARE_DIRECT; + } else { + throw new IllegalArgumentException("Unsupported protocol " + protocol); +@@ -237,6 +255,12 @@ + } + } + ++ private static final boolean invertReset = ++ Boolean.parseBoolean( ++ java.security.AccessController.doPrivileged( ++ new sun.security.action.GetPropertyAction( ++ "sun.security.smartcardio.invertCardReset", "true"))); ++ + public void disconnect(boolean reset) throws CardException { + if (reset) { + checkSecurity("reset"); +@@ -245,8 +269,12 @@ + return; + } + checkExclusive(); ++ // to preserve old behaviour, don't change flag until here ++ if (invertReset) { ++ reset = !reset; ++ } + try { +- SCardDisconnect(cardId, (reset ? SCARD_LEAVE_CARD : SCARD_RESET_CARD)); ++ SCardDisconnect(cardId, (reset ? SCARD_RESET_CARD : SCARD_LEAVE_CARD)); + } catch (PCSCException e) { + throw new CardException("disconnect() failed", e); + } finally { +--- ./jdk/src/share/classes/sun/security/ssl/CipherSuite.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/CipherSuite.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -82,6 +82,10 @@ + private final static boolean ALLOW_ECC = Debug.getBooleanProperty + ("com.sun.net.ssl.enableECC", true); + ++ // preserve the old order of RC4 preference ++ private final static boolean PRESERVE_RC4 = Debug.getBooleanProperty ++ ("jdk.tls.preserveRC4CipherSuites", false); ++ + // Map Integer(id) -> CipherSuite + // contains all known CipherSuites + private final static Map<Integer,CipherSuite> idMap; +@@ -963,16 +967,18 @@ + add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA", + 0x0032, --p, K_DHE_DSS, B_AES_128, T); + +- add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", +- 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); +- add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", +- 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); +- add("SSL_RSA_WITH_RC4_128_SHA", +- 0x0005, --p, K_RSA, B_RC4_128, N); +- add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", +- 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); +- add("TLS_ECDH_RSA_WITH_RC4_128_SHA", +- 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); ++ if (PRESERVE_RC4) { ++ add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); ++ add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); ++ add("SSL_RSA_WITH_RC4_128_SHA", ++ 0x0005, --p, K_RSA, B_RC4_128, N); ++ add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); ++ add("TLS_ECDH_RSA_WITH_RC4_128_SHA", ++ 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); ++ } + + add("TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", + 0xC008, --p, K_ECDHE_ECDSA, B_3DES, T); +@@ -989,6 +995,18 @@ + add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", + 0x0013, --p, K_DHE_DSS, B_3DES, N); + ++ if (!PRESERVE_RC4) { ++ add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); ++ add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); ++ add("SSL_RSA_WITH_RC4_128_SHA", ++ 0x0005, --p, K_RSA, B_RC4_128, N); ++ add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); ++ add("TLS_ECDH_RSA_WITH_RC4_128_SHA", ++ 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); ++ } + add("SSL_RSA_WITH_RC4_128_MD5", + 0x0004, --p, K_RSA, B_RC4_128, N); + +@@ -1008,7 +1026,7 @@ + * 2. If a cipher suite has been obsoleted, we put it at the end of + * the list. + * 3. Prefer the stronger bulk cipher, in the order of AES_256, +- * AES_128, RC-4, 3DES-EDE, DES, RC4_40, DES40, NULL. ++ * AES_128, 3DES-EDE, RC-4, DES, DES40, RC4_40, NULL. + * 4. Prefer the stronger MAC algorithm, in the order of SHA384, + * SHA256, SHA, MD5. + * 5. Prefer the better performance of key exchange and digital +@@ -1031,15 +1049,51 @@ + add("TLS_DH_anon_WITH_AES_128_CBC_SHA", + 0x0034, --p, K_DH_ANON, B_AES_128, N); + ++ if (!PRESERVE_RC4) { ++ add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0xC017, --p, K_ECDH_ANON, B_3DES, T); ++ add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0x001b, --p, K_DH_ANON, B_3DES, N); ++ } ++ + add("TLS_ECDH_anon_WITH_RC4_128_SHA", + 0xC016, --p, K_ECDH_ANON, B_RC4_128, N); + add("SSL_DH_anon_WITH_RC4_128_MD5", + 0x0018, --p, K_DH_ANON, B_RC4_128, N); + +- add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", +- 0xC017, --p, K_ECDH_ANON, B_3DES, T); +- add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", +- 0x001b, --p, K_DH_ANON, B_3DES, N); ++ if (!PRESERVE_RC4) { ++ // weak cipher suites obsoleted in TLS 1.2 ++ add("SSL_RSA_WITH_DES_CBC_SHA", ++ 0x0009, --p, K_RSA, B_DES, N, tls12); ++ add("SSL_DHE_RSA_WITH_DES_CBC_SHA", ++ 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); ++ add("SSL_DHE_DSS_WITH_DES_CBC_SHA", ++ 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); ++ add("SSL_DH_anon_WITH_DES_CBC_SHA", ++ 0x001a, --p, K_DH_ANON, B_DES, N, tls12); ++ ++ // weak cipher suites obsoleted in TLS 1.1 ++ add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", ++ 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); ++ ++ add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); ++ add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); ++ add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); ++ } ++ ++ if (PRESERVE_RC4) { ++ add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0xC017, --p, K_ECDH_ANON, B_3DES, T); ++ add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0x001b, --p, K_DH_ANON, B_3DES, N); ++ } + + add("TLS_RSA_WITH_NULL_SHA256", + 0x003b, --p, K_RSA, B_NULL, N, max, tls12, P_SHA256); +@@ -1058,52 +1112,70 @@ + add("SSL_RSA_WITH_NULL_MD5", + 0x0001, --p, K_RSA, B_NULL, N); + +- // weak cipher suites obsoleted in TLS 1.2 +- add("SSL_RSA_WITH_DES_CBC_SHA", +- 0x0009, --p, K_RSA, B_DES, N, tls12); +- add("SSL_DHE_RSA_WITH_DES_CBC_SHA", +- 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); +- add("SSL_DHE_DSS_WITH_DES_CBC_SHA", +- 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); +- add("SSL_DH_anon_WITH_DES_CBC_SHA", +- 0x001a, --p, K_DH_ANON, B_DES, N, tls12); ++ if (PRESERVE_RC4) { ++ // weak cipher suites obsoleted in TLS 1.2 ++ add("SSL_RSA_WITH_DES_CBC_SHA", ++ 0x0009, --p, K_RSA, B_DES, N, tls12); ++ add("SSL_DHE_RSA_WITH_DES_CBC_SHA", ++ 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); ++ add("SSL_DHE_DSS_WITH_DES_CBC_SHA", ++ 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); ++ add("SSL_DH_anon_WITH_DES_CBC_SHA", ++ 0x001a, --p, K_DH_ANON, B_DES, N, tls12); + +- // weak cipher suites obsoleted in TLS 1.1 +- add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", +- 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); +- add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", +- 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); ++ // weak cipher suites obsoleted in TLS 1.1 ++ add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", ++ 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); + +- add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", +- 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); +- add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", +- 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); +- add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", +- 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); +- add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", +- 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); ++ add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); ++ add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); ++ add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); ++ } + + // Supported Kerberos ciphersuites from RFC2712 ++ if (!PRESERVE_RC4) { ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ 0x001f, --p, K_KRB5, B_3DES, N); ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", ++ 0x0023, --p, K_KRB5, B_3DES, N); ++ } + add("TLS_KRB5_WITH_RC4_128_SHA", + 0x0020, --p, K_KRB5, B_RC4_128, N); + add("TLS_KRB5_WITH_RC4_128_MD5", + 0x0024, --p, K_KRB5, B_RC4_128, N); +- add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", +- 0x001f, --p, K_KRB5, B_3DES, N); +- add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", +- 0x0023, --p, K_KRB5, B_3DES, N); ++ if (PRESERVE_RC4) { ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ 0x001f, --p, K_KRB5, B_3DES, N); ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", ++ 0x0023, --p, K_KRB5, B_3DES, N); ++ } + add("TLS_KRB5_WITH_DES_CBC_SHA", + 0x001e, --p, K_KRB5, B_DES, N, tls12); + add("TLS_KRB5_WITH_DES_CBC_MD5", + 0x0022, --p, K_KRB5, B_DES, N, tls12); ++ if (!PRESERVE_RC4) { ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", ++ 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ } + add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA", + 0x0028, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5", + 0x002b, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); +- add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", +- 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); +- add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", +- 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ if (PRESERVE_RC4) { ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", ++ 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ } + + /* + * Other values from the TLS Cipher Suite Registry, as of August 2010. +--- ./jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java Mon Jan 05 11:57:27 2015 -0800 +@@ -342,6 +342,13 @@ + break; + + case HandshakeMessage.ht_finished: ++ // A ChangeCipherSpec record must have been received prior to ++ // reception of the Finished message (RFC 5246, 7.4.9). ++ if (!receivedChangeCipherSpec()) { ++ fatalSE(Alerts.alert_handshake_failure, ++ "Received Finished message before ChangeCipherSpec"); ++ } ++ + this.serverFinished( + new Finished(protocolVersion, input, cipherSuite)); + break; +--- ./jdk/src/share/classes/sun/security/ssl/DHCrypt.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/DHCrypt.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -188,7 +188,7 @@ + * the same size as the Diffie-Hellman modulus. + */ + SecretKey getAgreedSecret(BigInteger peerPublicValue, +- boolean keyIsValidated) throws IOException { ++ boolean keyIsValidated) throws SSLHandshakeException { + try { + KeyFactory kf = JsseJce.getKeyFactory("DiffieHellman"); + DHPublicKeySpec spec = +@@ -211,7 +211,8 @@ + ka.doPhase(publicKey, true); + return ka.generateSecret("TlsPremasterSecret"); + } catch (GeneralSecurityException e) { +- throw new RuntimeException("Could not generate secret", e); ++ throw (SSLHandshakeException) new SSLHandshakeException( ++ "Could not generate secret").initCause(e); + } + } + +--- ./jdk/src/share/classes/sun/security/ssl/ECDHCrypt.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/ECDHCrypt.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -32,6 +32,7 @@ + import javax.crypto.SecretKey; + import javax.crypto.KeyAgreement; + import javax.crypto.spec.*; ++import javax.net.ssl.SSLHandshakeException; + + /** + * Helper class for the ECDH key exchange. It generates the appropriate +@@ -89,19 +90,20 @@ + } + + // called by ClientHandshaker with either the server's static or ephemeral public key +- SecretKey getAgreedSecret(PublicKey peerPublicKey) { ++ SecretKey getAgreedSecret(PublicKey peerPublicKey) throws SSLHandshakeException { + try { + KeyAgreement ka = JsseJce.getKeyAgreement("ECDH"); + ka.init(privateKey); + ka.doPhase(peerPublicKey, true); + return ka.generateSecret("TlsPremasterSecret"); + } catch (GeneralSecurityException e) { +- throw new RuntimeException("Could not generate secret", e); ++ throw (SSLHandshakeException) new SSLHandshakeException( ++ "Could not generate secret").initCause(e); + } + } + + // called by ServerHandshaker +- SecretKey getAgreedSecret(byte[] encodedPoint) { ++ SecretKey getAgreedSecret(byte[] encodedPoint) throws SSLHandshakeException { + try { + ECParameterSpec params = publicKey.getParams(); + ECPoint point = JsseJce.decodePoint(encodedPoint, params.getCurve()); +@@ -109,10 +111,9 @@ + ECPublicKeySpec spec = new ECPublicKeySpec(point, params); + PublicKey peerPublicKey = kf.generatePublic(spec); + return getAgreedSecret(peerPublicKey); +- } catch (GeneralSecurityException e) { +- throw new RuntimeException("Could not generate secret", e); +- } catch (java.io.IOException e) { +- throw new RuntimeException("Could not generate secret", e); ++ } catch (GeneralSecurityException | java.io.IOException e) { ++ throw (SSLHandshakeException) new SSLHandshakeException( ++ "Could not generate secret").initCause(e); + } + } + +--- ./jdk/src/share/classes/sun/security/ssl/Handshaker.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/Handshaker.java Mon Jan 05 11:57:27 2015 -0800 +@@ -65,27 +65,27 @@ + ProtocolVersion protocolVersion; + + // the currently active protocol version during a renegotiation +- ProtocolVersion activeProtocolVersion; ++ ProtocolVersion activeProtocolVersion; + + // security parameters for secure renegotiation. +- boolean secureRenegotiation; +- byte[] clientVerifyData; +- byte[] serverVerifyData; ++ boolean secureRenegotiation; ++ byte[] clientVerifyData; ++ byte[] serverVerifyData; + + // Is it an initial negotiation or a renegotiation? +- boolean isInitialHandshake; ++ boolean isInitialHandshake; + + // List of enabled protocols +- private ProtocolList enabledProtocols; ++ private ProtocolList enabledProtocols; + + // List of enabled CipherSuites +- private CipherSuiteList enabledCipherSuites; ++ private CipherSuiteList enabledCipherSuites; + + // The endpoint identification protocol +- String identificationProtocol; ++ String identificationProtocol; + + // The cryptographic algorithm constraints +- private AlgorithmConstraints algorithmConstraints = null; ++ private AlgorithmConstraints algorithmConstraints = null; + + // Local supported signature and algorithms + Collection<SignatureAndHashAlgorithm> localSupportedSignAlgs; +@@ -94,15 +94,13 @@ + Collection<SignatureAndHashAlgorithm> peerSupportedSignAlgs; + + /* +- +- /* + * List of active protocols + * + * Active protocols is a subset of enabled protocols, and will + * contain only those protocols that have vaild cipher suites + * enabled. + */ +- private ProtocolList activeProtocols; ++ private ProtocolList activeProtocols; + + /* + * List of active cipher suites +@@ -110,33 +108,37 @@ + * Active cipher suites is a subset of enabled cipher suites, and will + * contain only those cipher suites available for the active protocols. + */ +- private CipherSuiteList activeCipherSuites; ++ private CipherSuiteList activeCipherSuites; + +- private boolean isClient; +- private boolean needCertVerify; ++ private boolean isClient; ++ private boolean needCertVerify; + +- SSLSocketImpl conn = null; +- SSLEngineImpl engine = null; ++ SSLSocketImpl conn = null; ++ SSLEngineImpl engine = null; + +- HandshakeHash handshakeHash; +- HandshakeInStream input; +- HandshakeOutStream output; +- int state; +- SSLContextImpl sslContext; +- RandomCookie clnt_random, svr_random; +- SSLSessionImpl session; ++ HandshakeHash handshakeHash; ++ HandshakeInStream input; ++ HandshakeOutStream output; ++ int state; ++ SSLContextImpl sslContext; ++ RandomCookie clnt_random, svr_random; ++ SSLSessionImpl session; + + // current CipherSuite. Never null, initially SSL_NULL_WITH_NULL_NULL +- CipherSuite cipherSuite; ++ CipherSuite cipherSuite; + + // current key exchange. Never null, initially K_NULL +- KeyExchange keyExchange; ++ KeyExchange keyExchange; + +- /* True if this session is being resumed (fast handshake) */ +- boolean resumingSession; ++ // True if this session is being resumed (fast handshake) ++ boolean resumingSession; + +- /* True if it's OK to start a new SSL session */ +- boolean enableNewSession; ++ // True if it's OK to start a new SSL session ++ boolean enableNewSession; ++ ++ // True if session keys have been calculated and the caller may receive ++ // and process a ChangeCipherSpec message ++ private boolean sessKeysCalculated; + + // Temporary storage for the individual keys. Set by + // calculateConnectionKeys() and cleared once the ciphers are +@@ -161,7 +163,7 @@ + // here instead of using this lock. Consider changing. + private Object thrownLock = new Object(); + +- /* Class and subclass dynamic debugging support */ ++ // Class and subclass dynamic debugging support + static final Debug debug = Debug.getInstance("ssl"); + + // By default, disable the unsafe legacy session renegotiation +@@ -228,6 +230,7 @@ + this.serverVerifyData = serverVerifyData; + enableNewSession = true; + invalidated = false; ++ sessKeysCalculated = false; + + setCipherSuite(CipherSuite.C_NULL); + setEnabledProtocols(enabledProtocols); +@@ -348,6 +351,14 @@ + } + } + ++ final boolean receivedChangeCipherSpec() { ++ if (conn != null) { ++ return conn.receivedChangeCipherSpec(); ++ } else { ++ return engine.receivedChangeCipherSpec(); ++ } ++ } ++ + String getEndpointIdentificationAlgorithmSE() { + SSLParameters paras; + if (conn != null) { +@@ -456,7 +467,9 @@ + + if (activeProtocols.collection().isEmpty() || + activeProtocols.max.v == ProtocolVersion.NONE.v) { +- throw new SSLHandshakeException("No appropriate protocol"); ++ throw new SSLHandshakeException( ++ "No appropriate protocol (protocol is disabled or " + ++ "cipher suites are inappropriate)"); + } + + if (activeCipherSuites == null) { +@@ -625,14 +638,24 @@ + ProtocolList getActiveProtocols() { + if (activeProtocols == null) { + ArrayList<ProtocolVersion> protocols = new ArrayList<>(4); ++ EnumSet<CryptoPrimitive> cryptoPrimitives = ++ EnumSet.<CryptoPrimitive>of(CryptoPrimitive.KEY_AGREEMENT); + for (ProtocolVersion protocol : enabledProtocols.collection()) { ++ if (!algorithmConstraints.permits( ++ cryptoPrimitives, protocol.name, null)) { ++ if (debug != null && Debug.isOn("verbose")) { ++ System.out.println( ++ "Ignoring disabled protocol: " + protocol); ++ } ++ ++ continue; ++ } + boolean found = false; + for (CipherSuite suite : enabledCipherSuites.collection()) { + if (suite.isAvailable() && suite.obsoleted > protocol.v && + suite.supported <= protocol.v) { + if (algorithmConstraints.permits( +- EnumSet.of(CryptoPrimitive.KEY_AGREEMENT), +- suite.name, null)) { ++ cryptoPrimitives, suite.name, null)) { + protocols.add(protocol); + found = true; + break; +@@ -1140,6 +1163,10 @@ + throw new ProviderException(e); + } + ++ // Mark a flag that allows outside entities (like SSLSocket/SSLEngine) ++ // determine if a ChangeCipherSpec message could be processed. ++ sessKeysCalculated = true; ++ + // + // Dump the connection keys as they're generated. + // +@@ -1190,6 +1217,15 @@ + } + } + ++ /** ++ * Return whether or not the Handshaker has derived session keys for ++ * this handshake. This is used for determining readiness to process ++ * an incoming ChangeCipherSpec message. ++ */ ++ boolean sessionKeysCalculated() { ++ return sessKeysCalculated; ++ } ++ + private static void printHex(HexDumpEncoder dump, byte[] bytes) { + if (bytes == null) { + System.out.println("(key bytes not available)"); +--- ./jdk/src/share/classes/sun/security/ssl/ProtocolVersion.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/ProtocolVersion.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,6 +25,9 @@ + + package sun.security.ssl; + ++import java.util.*; ++import java.security.CryptoPrimitive; ++ + /** + * Type safe enum for an SSL/TLS protocol version. Instances are obtained + * using the static factory methods or by referencing the static members +@@ -86,6 +89,11 @@ + // Default version for hello messages (SSLv2Hello) + final static ProtocolVersion DEFAULT_HELLO = FIPS ? TLS10 : SSL30; + ++ // Available protocols ++ // ++ // Including all supported protocols except the disabled ones. ++ final static Set<ProtocolVersion> availableProtocols; ++ + // version in 16 bit MSB format as it appears in records and + // messages, i.e. 0x0301 for TLS 1.0 + public final int v; +@@ -96,6 +104,25 @@ + // name used in JSSE (e.g. TLSv1 for TLS 1.0) + final String name; + ++ // Initialize the available protocols. ++ static { ++ Set<ProtocolVersion> protocols = new HashSet<>(5); ++ ++ ProtocolVersion[] pvs = new ProtocolVersion[] { ++ SSL20Hello, SSL30, TLS10, TLS11, TLS12}; ++ EnumSet<CryptoPrimitive> cryptoPrimitives = ++ EnumSet.<CryptoPrimitive>of(CryptoPrimitive.KEY_AGREEMENT); ++ for (ProtocolVersion p : pvs) { ++ if (SSLAlgorithmConstraints.DEFAULT_SSL_ONLY.permits( ++ cryptoPrimitives, p.name, null)) { ++ protocols.add(p); ++ } ++ } ++ ++ availableProtocols = ++ Collections.<ProtocolVersion>unmodifiableSet(protocols); ++ } ++ + // private + private ProtocolVersion(int v, String name) { + this.v = v; +--- ./jdk/src/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java Mon Jan 05 11:57:27 2015 -0800 +@@ -55,6 +55,14 @@ + + private boolean enabledX509DisabledAlgConstraints = true; + ++ // the default algorithm constraints ++ final static AlgorithmConstraints DEFAULT = ++ new SSLAlgorithmConstraints(null); ++ ++ // the default SSL only algorithm constraints ++ final static AlgorithmConstraints DEFAULT_SSL_ONLY = ++ new SSLAlgorithmConstraints((SSLSocket)null, false); ++ + SSLAlgorithmConstraints(AlgorithmConstraints algorithmConstraints) { + userAlgConstraints = algorithmConstraints; + } +--- ./jdk/src/share/classes/sun/security/ssl/SSLContextImpl.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/SSLContextImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -51,10 +51,6 @@ + private X509TrustManager trustManager; + private SecureRandom secureRandom; + +- // The default algrithm constraints +- private AlgorithmConstraints defaultAlgorithmConstraints = +- new SSLAlgorithmConstraints(null); +- + // supported and default protocols + private ProtocolList defaultServerProtocolList; + private ProtocolList defaultClientProtocolList; +@@ -342,7 +338,7 @@ + if (suite.isAvailable() && + suite.obsoleted > protocols.min.v && + suite.supported <= protocols.max.v) { +- if (defaultAlgorithmConstraints.permits( ++ if (SSLAlgorithmConstraints.DEFAULT.permits( + EnumSet.of(CryptoPrimitive.KEY_AGREEMENT), + suite.name, null)) { + suites.add(suite); +@@ -384,6 +380,22 @@ + } + } + ++ static String[] getAvailableProtocols( ++ ProtocolVersion[] protocolCandidates) { ++ ++ List<String> availableProtocols = Collections.<String>emptyList(); ++ if (protocolCandidates != null && protocolCandidates.length != 0) { ++ availableProtocols = new ArrayList<>(protocolCandidates.length); ++ for (ProtocolVersion p : protocolCandidates) { ++ if (ProtocolVersion.availableProtocols.contains(p)) { ++ availableProtocols.add(p.name); ++ } ++ } ++ } ++ ++ return availableProtocols.toArray(new String[0]); ++ } ++ + /* + * The SSLContext implementation for TLS/SSL algorithm + * +@@ -423,28 +435,35 @@ + */ + private static class ConservativeSSLContext extends SSLContextImpl { + // parameters +- private static SSLParameters defaultServerSSLParams; +- private static SSLParameters defaultClientSSLParams; +- private static SSLParameters supportedSSLParams; ++ private static final SSLParameters defaultServerSSLParams; ++ private static final SSLParameters defaultClientSSLParams; ++ private static final SSLParameters supportedSSLParams; + + static { ++ // supported SSL parameters ++ supportedSSLParams = new SSLParameters(); ++ ++ // candidates for available protocols ++ ProtocolVersion[] serverCandidates; ++ ProtocolVersion[] clientCandidates; ++ + if (SunJSSE.isFIPS()) { +- supportedSSLParams = new SSLParameters(); + supportedSSLParams.setProtocols(new String[] { + ProtocolVersion.TLS10.name, + ProtocolVersion.TLS11.name, + ProtocolVersion.TLS12.name + }); + +- defaultServerSSLParams = supportedSSLParams; ++ serverCandidates = new ProtocolVersion[] { ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + +- defaultClientSSLParams = new SSLParameters(); +- defaultClientSSLParams.setProtocols(new String[] { +- ProtocolVersion.TLS10.name +- }); +- ++ clientCandidates = new ProtocolVersion[] { ++ ProtocolVersion.TLS10 ++ }; + } else { +- supportedSSLParams = new SSLParameters(); + supportedSSLParams.setProtocols(new String[] { + ProtocolVersion.SSL20Hello.name, + ProtocolVersion.SSL30.name, +@@ -453,14 +472,27 @@ + ProtocolVersion.TLS12.name + }); + +- defaultServerSSLParams = supportedSSLParams; ++ serverCandidates = new ProtocolVersion[] { ++ ProtocolVersion.SSL20Hello, ++ ProtocolVersion.SSL30, ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + +- defaultClientSSLParams = new SSLParameters(); +- defaultClientSSLParams.setProtocols(new String[] { +- ProtocolVersion.SSL30.name, +- ProtocolVersion.TLS10.name +- }); ++ clientCandidates = new ProtocolVersion[] { ++ ProtocolVersion.SSL30, ++ ProtocolVersion.TLS10 ++ }; + } ++ ++ defaultClientSSLParams = new SSLParameters(); ++ defaultClientSSLParams.setProtocols( ++ getAvailableProtocols(clientCandidates)); ++ ++ defaultServerSSLParams = new SSLParameters(); ++ defaultServerSSLParams.setProtocols( ++ getAvailableProtocols(serverCandidates)); + } + + SSLParameters getDefaultServerSSLParams() { +@@ -651,29 +683,36 @@ + */ + public static final class TLS11Context extends SSLContextImpl { + // parameters +- private static SSLParameters defaultServerSSLParams; +- private static SSLParameters defaultClientSSLParams; +- private static SSLParameters supportedSSLParams; ++ private static final SSLParameters defaultServerSSLParams; ++ private static final SSLParameters defaultClientSSLParams; ++ private static final SSLParameters supportedSSLParams; + + static { ++ // supported SSL parameters ++ supportedSSLParams = new SSLParameters(); ++ ++ // candidates for available protocols ++ ProtocolVersion[] serverCandidates; ++ ProtocolVersion[] clientCandidates; ++ + if (SunJSSE.isFIPS()) { +- supportedSSLParams = new SSLParameters(); + supportedSSLParams.setProtocols(new String[] { + ProtocolVersion.TLS10.name, + ProtocolVersion.TLS11.name, + ProtocolVersion.TLS12.name + }); + +- defaultServerSSLParams = supportedSSLParams; ++ serverCandidates = new ProtocolVersion[] { ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + +- defaultClientSSLParams = new SSLParameters(); +- defaultClientSSLParams.setProtocols(new String[] { +- ProtocolVersion.TLS10.name, +- ProtocolVersion.TLS11.name +- }); +- ++ clientCandidates = new ProtocolVersion[] { ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11 ++ }; + } else { +- supportedSSLParams = new SSLParameters(); + supportedSSLParams.setProtocols(new String[] { + ProtocolVersion.SSL20Hello.name, + ProtocolVersion.SSL30.name, +@@ -682,15 +721,28 @@ + ProtocolVersion.TLS12.name + }); + +- defaultServerSSLParams = supportedSSLParams; ++ serverCandidates = new ProtocolVersion[] { ++ ProtocolVersion.SSL20Hello, ++ ProtocolVersion.SSL30, ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + +- defaultClientSSLParams = new SSLParameters(); +- defaultClientSSLParams.setProtocols(new String[] { +- ProtocolVersion.SSL30.name, +- ProtocolVersion.TLS10.name, +- ProtocolVersion.TLS11.name +- }); ++ clientCandidates = new ProtocolVersion[] { ++ ProtocolVersion.SSL30, ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11 ++ }; + } ++ ++ defaultClientSSLParams = new SSLParameters(); ++ defaultClientSSLParams.setProtocols( ++ getAvailableProtocols(clientCandidates)); ++ ++ defaultServerSSLParams = new SSLParameters(); ++ defaultServerSSLParams.setProtocols( ++ getAvailableProtocols(serverCandidates)); + } + + SSLParameters getDefaultServerSSLParams() { +@@ -713,30 +765,37 @@ + */ + public static final class TLS12Context extends SSLContextImpl { + // parameters +- private static SSLParameters defaultServerSSLParams; +- private static SSLParameters defaultClientSSLParams; +- private static SSLParameters supportedSSLParams; ++ private static final SSLParameters defaultServerSSLParams; ++ private static final SSLParameters defaultClientSSLParams; ++ private static final SSLParameters supportedSSLParams; + + static { ++ // supported SSL parameters ++ supportedSSLParams = new SSLParameters(); ++ ++ // candidates for available protocols ++ ProtocolVersion[] serverCandidates; ++ ProtocolVersion[] clientCandidates; ++ + if (SunJSSE.isFIPS()) { +- supportedSSLParams = new SSLParameters(); + supportedSSLParams.setProtocols(new String[] { + ProtocolVersion.TLS10.name, + ProtocolVersion.TLS11.name, + ProtocolVersion.TLS12.name + }); + +- defaultServerSSLParams = supportedSSLParams; ++ serverCandidates = new ProtocolVersion[] { ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + +- defaultClientSSLParams = new SSLParameters(); +- defaultClientSSLParams.setProtocols(new String[] { +- ProtocolVersion.TLS10.name, +- ProtocolVersion.TLS11.name, +- ProtocolVersion.TLS12.name +- }); +- ++ clientCandidates = new ProtocolVersion[] { ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + } else { +- supportedSSLParams = new SSLParameters(); + supportedSSLParams.setProtocols(new String[] { + ProtocolVersion.SSL20Hello.name, + ProtocolVersion.SSL30.name, +@@ -745,16 +804,29 @@ + ProtocolVersion.TLS12.name + }); + +- defaultServerSSLParams = supportedSSLParams; ++ serverCandidates = new ProtocolVersion[] { ++ ProtocolVersion.SSL20Hello, ++ ProtocolVersion.SSL30, ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + +- defaultClientSSLParams = new SSLParameters(); +- defaultClientSSLParams.setProtocols(new String[] { +- ProtocolVersion.SSL30.name, +- ProtocolVersion.TLS10.name, +- ProtocolVersion.TLS11.name, +- ProtocolVersion.TLS12.name +- }); ++ clientCandidates = new ProtocolVersion[] { ++ ProtocolVersion.SSL30, ++ ProtocolVersion.TLS10, ++ ProtocolVersion.TLS11, ++ ProtocolVersion.TLS12 ++ }; + } ++ ++ defaultClientSSLParams = new SSLParameters(); ++ defaultClientSSLParams.setProtocols( ++ getAvailableProtocols(clientCandidates)); ++ ++ defaultServerSSLParams = new SSLParameters(); ++ defaultServerSSLParams.setProtocols( ++ getAvailableProtocols(serverCandidates)); + } + + SSLParameters getDefaultServerSSLParams() { +--- ./jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -215,6 +215,11 @@ + static final byte clauth_required = 2; + + /* ++ * Flag indicating that the engine has received a ChangeCipherSpec message. ++ */ ++ private boolean receivedCCS; ++ ++ /* + * Flag indicating if the next record we receive MUST be a Finished + * message. Temporarily set during the handshake to ensure that + * a change cipher spec message is followed by a finished message. +@@ -363,6 +368,7 @@ + */ + roleIsServer = true; + connectionState = cs_START; ++ receivedCCS = false; + + /* + * default read and write side cipher and MAC support +@@ -1006,6 +1012,7 @@ + + if (handshaker.invalidated) { + handshaker = null; ++ receivedCCS = false; + // if state is cs_RENEGOTIATE, revert it to cs_DATA + if (connectionState == cs_RENEGOTIATE) { + connectionState = cs_DATA; +@@ -1024,6 +1031,7 @@ + } + handshaker = null; + connectionState = cs_DATA; ++ receivedCCS = false; + + // No handshakeListeners here. That's a + // SSLSocket thing. +@@ -1063,13 +1071,25 @@ + case Record.ct_change_cipher_spec: + if ((connectionState != cs_HANDSHAKE + && connectionState != cs_RENEGOTIATE) +- || inputRecord.available() != 1 ++ || !handshaker.sessionKeysCalculated() ++ || receivedCCS) { ++ // For the CCS message arriving in the wrong state ++ fatal(Alerts.alert_unexpected_message, ++ "illegal change cipher spec msg, conn state = " ++ + connectionState + ", handshake state = " ++ + handshaker.state); ++ } else if (inputRecord.available() != 1 + || inputRecord.read() != 1) { ++ // For structural/content issues with the CCS + fatal(Alerts.alert_unexpected_message, +- "illegal change cipher spec msg, state = " +- + connectionState); ++ "Malformed change cipher spec msg"); + } + ++ // Once we've received CCS, update the flag. ++ // If the remote endpoint sends it again in this handshake ++ // we won't process it. ++ receivedCCS = true; ++ + // + // The first message after a change_cipher_spec + // record MUST be a "Finished" handshake record, +@@ -2065,6 +2085,14 @@ + return Thread.currentThread().getName(); + } + ++ /* ++ * Returns a boolean indicating whether the ChangeCipherSpec message ++ * has been received for this handshake. ++ */ ++ boolean receivedChangeCipherSpec() { ++ return receivedCCS; ++ } ++ + /** + * Returns a printable representation of this end of the connection. + */ +--- ./jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -175,6 +175,12 @@ + private volatile int connectionState; + + /* ++ * Flag indicating that the engine's handshaker has done the necessary ++ * steps so the engine may process a ChangeCipherSpec message. ++ */ ++ private boolean receivedCCS; ++ ++ /* + * Flag indicating if the next record we receive MUST be a Finished + * message. Temporarily set during the handshake to ensure that + * a change cipher spec message is followed by a finished message. +@@ -557,6 +563,7 @@ + */ + roleIsServer = isServer; + connectionState = cs_START; ++ receivedCCS = false; + + /* + * default read and write side cipher and MAC support +@@ -1018,6 +1025,7 @@ + + if (handshaker.invalidated) { + handshaker = null; ++ receivedCCS = false; + // if state is cs_RENEGOTIATE, revert it to cs_DATA + if (connectionState == cs_RENEGOTIATE) { + connectionState = cs_DATA; +@@ -1033,6 +1041,7 @@ + handshakeSession = null; + handshaker = null; + connectionState = cs_DATA; ++ receivedCCS = false; + + // + // Tell folk about handshake completion, but do +@@ -1080,13 +1089,24 @@ + case Record.ct_change_cipher_spec: + if ((connectionState != cs_HANDSHAKE + && connectionState != cs_RENEGOTIATE) +- || r.available() != 1 +- || r.read() != 1) { ++ || !handshaker.sessionKeysCalculated() ++ || receivedCCS) { ++ // For the CCS message arriving in the wrong state + fatal(Alerts.alert_unexpected_message, +- "illegal change cipher spec msg, state = " +- + connectionState); ++ "illegal change cipher spec msg, conn state = " ++ + connectionState + ", handshake state = " ++ + handshaker.state); ++ } else if (r.available() != 1 || r.read() != 1) { ++ // For structural/content issues with the CCS ++ fatal(Alerts.alert_unexpected_message, ++ "Malformed change cipher spec msg"); + } + ++ // Once we've received CCS, update the flag. ++ // If the remote endpoint sends it again in this handshake ++ // we won't process it. ++ receivedCCS = true; ++ + // + // The first message after a change_cipher_spec + // record MUST be a "Finished" handshake record, +@@ -2478,6 +2498,14 @@ + } + } + ++ /* ++ * Returns a boolean indicating whether the ChangeCipherSpec message ++ * has been received for this handshake. ++ */ ++ boolean receivedChangeCipherSpec() { ++ return receivedCCS; ++ } ++ + // + // We allocate a separate thread to deliver handshake completion + // events. This ensures that the notifications don't block the +--- ./jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java Mon Jan 05 11:57:27 2015 -0800 +@@ -240,6 +240,13 @@ + break; + + case HandshakeMessage.ht_finished: ++ // A ChangeCipherSpec record must have been received prior to ++ // reception of the Finished message (RFC 5246, 7.4.9). ++ if (!receivedChangeCipherSpec()) { ++ fatalSE(Alerts.alert_handshake_failure, ++ "Received Finished message before ChangeCipherSpec"); ++ } ++ + this.clientFinished( + new Finished(protocolVersion, input, cipherSuite)); + break; +--- ./jdk/src/share/classes/sun/security/tools/JarSigner.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/JarSigner.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1547,8 +1547,7 @@ + first = false; + } + try { +- CertPath cp = certificateFactory.generateCertPath(certs); +- validator.validate(cp, pkixParameters); ++ validateCertChain(certs); + } catch (Exception e) { + if (debug) { + e.printStackTrace(); +@@ -1859,8 +1858,7 @@ + printCert("", certChain[0], true, null, true); + + try { +- CertPath cp = certificateFactory.generateCertPath(Arrays.asList(certChain)); +- validator.validate(cp, pkixParameters); ++ validateCertChain(Arrays.asList(certChain)); + } catch (Exception e) { + if (debug) { + e.printStackTrace(); +@@ -1925,6 +1923,22 @@ + System.exit(1); + } + ++ void validateCertChain(List<? extends Certificate> certs) throws Exception { ++ int cpLen = 0; ++ out: for (; cpLen<certs.size(); cpLen++) { ++ for (TrustAnchor ta: pkixParameters.getTrustAnchors()) { ++ if (ta.getTrustedCert().equals(certs.get(cpLen))) { ++ break out; ++ } ++ } ++ } ++ if (cpLen > 0) { ++ CertPath cp = certificateFactory.generateCertPath( ++ (cpLen == certs.size())? certs: certs.subList(0, cpLen)); ++ validator.validate(cp, pkixParameters); ++ } ++ } ++ + char[] getPass(String prompt) + { + System.err.print(prompt); +--- ./jdk/src/share/classes/sun/security/util/DerIndefLenConverter.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/util/DerIndefLenConverter.java Mon Jan 05 11:57:27 2015 -0800 +@@ -156,12 +156,18 @@ + } + if (isLongForm(lenByte)) { + lenByte &= LEN_MASK; +- if (lenByte > 4) ++ if (lenByte > 4) { + throw new IOException("Too much data"); +- if ((dataSize - dataPos) < (lenByte + 1)) ++ } ++ if ((dataSize - dataPos) < (lenByte + 1)) { + throw new IOException("Too little data"); +- for (int i = 0; i < lenByte; i++) ++ } ++ for (int i = 0; i < lenByte; i++) { + curLen = (curLen << 8) + (data[dataPos++] & 0xff); ++ } ++ if (curLen < 0) { ++ throw new IOException("Invalid length bytes"); ++ } + } else { + curLen = (lenByte & LEN_MASK); + } +@@ -188,10 +194,15 @@ + } + if (isLongForm(lenByte)) { + lenByte &= LEN_MASK; +- for (int i = 0; i < lenByte; i++) ++ for (int i = 0; i < lenByte; i++) { + curLen = (curLen << 8) + (data[dataPos++] & 0xff); +- } else ++ } ++ if (curLen < 0) { ++ throw new IOException("Invalid length bytes"); ++ } ++ } else { + curLen = (lenByte & LEN_MASK); ++ } + writeLength(curLen); + writeValue(curLen); + } +--- ./jdk/src/share/classes/sun/security/util/DerInputStream.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/util/DerInputStream.java Mon Jan 05 11:57:27 2015 -0800 +@@ -566,6 +566,10 @@ + value <<= 8; + value += 0x0ff & in.read(); + } ++ if (value < 0) { ++ throw new IOException("DerInputStream.getLength(): " ++ + "Invalid length bytes"); ++ } + } + return value; + } +--- ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Mon Jan 05 11:57:27 2015 -0800 +@@ -39,6 +39,7 @@ + import sun.misc.BASE64Decoder; + + import sun.security.jca.Providers; ++import sun.security.x509.AlgorithmId; + + public class SignatureFileVerifier { + +@@ -613,7 +614,8 @@ + throws NoSuchAlgorithmException, SignatureException { + + MessageDigest md = +- MessageDigest.getInstance(token.getHashAlgorithm().getName()); ++ MessageDigest.getInstance(AlgorithmId.getStandardDigestName( ++ token.getHashAlgorithm().getName())); + + if (!Arrays.equals(token.getHashedMessage(), md.digest(signature))) { + throw new SignatureException("Signature timestamp (#" + +--- ./jdk/src/share/classes/sun/security/x509/AlgorithmId.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/x509/AlgorithmId.java Mon Jan 05 11:57:27 2015 -0800 +@@ -940,4 +940,21 @@ + } + return null; + } ++ ++ // Copied from com.sun.crypto.provider.OAEPParameters.convertToStandardName() ++ public static String getStandardDigestName(String internalName) { ++ if (internalName.equals("SHA")) { ++ return "SHA-1"; ++ } else if (internalName.equals("SHA224")) { ++ return "SHA-224"; ++ } else if (internalName.equals("SHA256")) { ++ return "SHA-256"; ++ } else if (internalName.equals("SHA384")) { ++ return "SHA-384"; ++ } else if (internalName.equals("SHA512")) { ++ return "SHA-512"; ++ } else { ++ return internalName; ++ } ++ } + } +--- ./jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -156,9 +156,11 @@ + + // publicKey's format must be X.509 otherwise + // the whole CertGen part of this class is broken. +- if (!"X.509".equalsIgnoreCase(publicKey.getFormat())) { +- throw new IllegalArgumentException("publicKey's is not X.509, but " +- + publicKey.getFormat()); ++ // Allow "X509" in 7u for backwards compatibility. ++ if (!"X.509".equalsIgnoreCase(publicKey.getFormat()) && ++ !"X509".equalsIgnoreCase(publicKey.getFormat())) { ++ throw new IllegalArgumentException("Public key format is " + ++ publicKey.getFormat() + ", must be X.509"); + } + } + +--- ./jdk/src/share/classes/sun/swing/FilePane.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/FilePane.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1979,6 +1979,7 @@ + return false; + } + ++ try { + if (f instanceof ShellFolder) { + return ((ShellFolder) f).isFileSystem(); + } else { +@@ -1994,6 +1995,9 @@ + return true; + } + } ++ } catch (SecurityException e) { ++ return false; ++ } + } + + /** +--- ./jdk/src/share/classes/sun/swing/SwingUtilities2.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/SwingUtilities2.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -80,6 +80,9 @@ + public static final Object LAF_STATE_KEY = + new StringBuffer("LookAndFeel State"); + ++ public static final Object MENU_SELECTION_MANAGER_LISTENER_KEY = ++ new StringBuffer("MenuSelectionManager listener key"); ++ + // Maintain a cache of CACHE_SIZE fonts and the left side bearing + // of the characters falling into the range MIN_CHAR_INDEX to + // MAX_CHAR_INDEX. The values in fontCache are created as needed. +--- ./jdk/src/share/classes/sun/swing/WindowsPlacesBar.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/WindowsPlacesBar.java Mon Jan 05 11:57:27 2015 -0800 +@@ -81,11 +81,7 @@ + setBackground(bgColor); + FileSystemView fsv = fc.getFileSystemView(); + +- files = AccessController.doPrivileged(new PrivilegedAction<File[]>() { +- public File[] run() { +- return (File[]) ShellFolder.get("fileChooserShortcutPanelFolders"); +- } +- }); ++ files = (File[]) ShellFolder.get("fileChooserShortcutPanelFolders"); + + buttons = new JToggleButton[files.length]; + buttonGroup = new ButtonGroup(); +--- ./jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -771,16 +771,9 @@ + fireIntervalRemoved(this, 0, oldSize); + } + +- File[] baseFolders; +- if (useShellFolder) { +- baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { +- public File[] run() { +- return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); +- } +- }); +- } else { +- baseFolders = fsv.getRoots(); +- } ++ File[] baseFolders = (useShellFolder) ++ ? (File[]) ShellFolder.get("fileChooserComboBoxFolders") ++ : fsv.getRoots(); + directories.addAll(Arrays.asList(baseFolders)); + + // Get the canonical (full) path. This has the side +--- ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -103,7 +103,7 @@ + HELP_ABOUT_DIALOG_JAVA_VERSION=Java VM\u30D0\u30FC\u30B8\u30E7\u30F3:<br>{0} + HELP_ABOUT_DIALOG_MASTHEAD_ACCESSIBLE_NAME=\u30DE\u30B9\u30C8\u30D8\u30C3\u30C9\u56F3\u5F62 + HELP_ABOUT_DIALOG_MASTHEAD_TITLE=JConsole\u306B\u3064\u3044\u3066 +-HELP_ABOUT_DIALOG_TITLE=JConsole: \u8A73\u7D30 ++HELP_ABOUT_DIALOG_TITLE=JConsole: \u60C5\u5831 + HELP_ABOUT_DIALOG_USER_GUIDE_LINK=JConsole\u30E6\u30FC\u30B6\u30FC\u30FB\u30AC\u30A4\u30C9(&U):<br>{0} + HELP_ABOUT_DIALOG_USER_GUIDE_LINK_URL=http://docs.oracle.com/javase/{0}/docs/technotes/guides/management/jconsole.html + HELP_MENU_ABOUT_TITLE=JConsole\u306B\u3064\u3044\u3066(&A) +--- ./jdk/src/share/classes/sun/util/resources/CurrencyNames.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/CurrencyNames.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -26,7 +26,7 @@ + # + # COPYRIGHT AND PERMISSION NOTICE + # +-# Copyright (C) 1991-2011 Unicode, Inc. All rights reserved. ++# Copyright (C) 1991-2012 Unicode, Inc. All rights reserved. + # Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + # + # Permission is hereby granted, free of charge, to any person obtaining +@@ -226,6 +226,7 @@ + SOS=SOS + SRD=SRD + SRG=SRG ++SSP=SSP + STD=STD + SVC=SVC + SYP=SYP +@@ -277,6 +278,7 @@ + YUM=YUM + ZAR=ZAR + ZMK=ZMK ++ZMW=ZMW + ZWD=ZWD + ZWL=ZWL + ZWN=ZWN +@@ -443,6 +445,7 @@ + sos=Somali Shilling + srd=Surinamese Dollar + srg=Surinamese Guilder ++ssp=South Sudanese Pound + std=S\u00e3o Tom\u00e9 and Pr\u00edncipe Dobra + svc=Salvadoran Col\u00f3n + syp=Syrian Pound +@@ -486,7 +489,9 @@ + xpd=Palladium + xpf=CFP Franc + xpt=Platinum ++xsu=Sucre + xts=Testing Currency Code ++xua=ADB Unit of Account + xxx=Unknown Currency + yer=Yemeni Rial + yum=Yugoslavian New Dinar (1994-2002) +--- ./jdk/src/share/classes/sun/util/resources/CurrencyNames_es_PE.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/CurrencyNames_es_PE.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -35,4 +35,4 @@ + # This notice and attribution to Taligent may not be removed. + # Taligent is a registered trademark of Taligent, Inc. + +-PEN=S/ ++PEN=S/. +--- ./jdk/src/share/classes/sun/util/resources/CurrencyNames_lt_LT.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/CurrencyNames_lt_LT.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -35,4 +35,5 @@ + # This notice and attribution to Taligent may not be removed. + # Taligent is a registered trademark of Taligent, Inc. + ++EUR=\u20AC + LTL=Lt +--- ./jdk/src/share/classes/sun/util/resources/CurrencyNames_lv_LV.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/CurrencyNames_lv_LV.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -35,4 +35,5 @@ + # This notice and attribution to Taligent may not be removed. + # Taligent is a registered trademark of Taligent, Inc. + ++EUR=\u20AC + LVL=Ls +--- ./jdk/src/share/classes/sun/util/resources/LocaleNames.properties Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/LocaleNames.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -1077,6 +1077,7 @@ + SN=Senegal + SO=Somalia + SR=Suriname ++SS=South Sudan + ST=Sao Tome And Principe + SV=El Salvador + SX=Sint Maarten (Dutch part) +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Acre Time", "ACT", + "Acre Summer Time", "ACST"}; +- String ADELAIDE[] = new String[] {"Central Standard Time (South Australia)", "CST", +- "Central Summer Time (South Australia)", "CST"}; ++ String ADELAIDE[] = new String[] {"Australian Central Standard Time (South Australia)", "ACST", ++ "Australian Central Daylight Time (South Australia)", "ACDT"}; + String AGT[] = new String[] {"Argentine Time", "ART", + "Argentine Summer Time", "ARST"}; + String AKST[] = new String[] {"Alaska Standard Time", "AKST", +@@ -61,10 +61,10 @@ + "Atlantic Daylight Time", "ADT"}; + String BDT[] = new String[] {"Bangladesh Time", "BDT", + "Bangladesh Summer Time", "BDST"}; +- String BRISBANE[] = new String[] {"Eastern Standard Time (Queensland)", "EST", +- "Eastern Summer Time (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Central Standard Time (South Australia/New South Wales)", "CST", +- "Central Summer Time (South Australia/New South Wales)", "CST"}; ++ String BRISBANE[] = new String[] {"Australian Eastern Standard Time (Queensland)", "AEST", ++ "Australian Eastern Daylight Time (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Australian Central Standard Time (South Australia/New South Wales)", "ACST", ++ "Australian Central Daylight Time (South Australia/New South Wales)", "ACDT"}; + String BRT[] = new String[] {"Brasilia Time", "BRT", + "Brasilia Summer Time", "BRST"}; + String BTT[] = new String[] {"Bhutan Time", "BTT", +@@ -89,8 +89,8 @@ + "China Daylight Time", "CDT"}; + String CUBA[] = new String[] {"Cuba Standard Time", "CST", + "Cuba Daylight Time", "CDT"}; +- String DARWIN[] = new String[] {"Central Standard Time (Northern Territory)", "CST", +- "Central Summer Time (Northern Territory)", "CST"}; ++ String DARWIN[] = new String[] {"Australian Central Standard Time (Northern Territory)", "ACST", ++ "Australian Central Daylight Time (Northern Territory)", "ACDT"}; + String DUBLIN[] = new String[] {"Greenwich Mean Time", "GMT", + "Irish Summer Time", "IST"}; + String EAT[] = new String[] {"Eastern African Time", "EAT", +@@ -103,8 +103,8 @@ + "Eastern Greenland Summer Time", "EGST"}; + String EST[] = new String[] {"Eastern Standard Time", "EST", + "Eastern Daylight Time", "EDT"}; +- String EST_NSW[] = new String[] {"Eastern Standard Time (New South Wales)", "EST", +- "Eastern Summer Time (New South Wales)", "EST"}; ++ String EST_NSW[] = new String[] {"Australian Eastern Standard Time (New South Wales)", "AEST", ++ "Australian Eastern Daylight Time (New South Wales)", "AEDT"}; + String FET[] = new String[] {"Further-eastern European Time", "FET", + "Further-eastern European Summer Time", "FEST"}; + String GHMT[] = new String[] {"Ghana Mean Time", "GMT", +@@ -133,10 +133,12 @@ + "India Daylight Time", "IDT"}; + String JST[] = new String[] {"Japan Standard Time", "JST", + "Japan Daylight Time", "JDT"}; ++ String KRAT[] = new String[] {"Krasnoyarsk Time", "KRAT", ++ "Krasnoyarsk Summer Time", "KRAST"}; + String KST[] = new String[] {"Korea Standard Time", "KST", + "Korea Daylight Time", "KDT"}; + String LORD_HOWE[] = new String[] {"Lord Howe Standard Time", "LHST", +- "Lord Howe Summer Time", "LHST"}; ++ "Lord Howe Daylight Time", "LHDT"}; + String MHT[] = new String[] {"Marshall Islands Time", "MHT", + "Marshall Islands Summer Time", "MHST"}; + String MSK[] = new String[] {"Moscow Standard Time", "MSK", +@@ -167,14 +169,14 @@ + "Samoa Daylight Time", "SDT"}; + String SAST[] = new String[] {"South Africa Standard Time", "SAST", + "South Africa Summer Time", "SAST"}; ++ String IRKT[] = new String[] {"Irkutsk Time", "IRKT", ++ "Irkutsk Summer Time", "IRKST"}; + String SBT[] = new String[] {"Solomon Is. Time", "SBT", + "Solomon Is. Summer Time", "SBST"}; + String SGT[] = new String[] {"Singapore Time", "SGT", + "Singapore Summer Time", "SGST"}; +- String SLST[] = new String[] {"Greenwich Mean Time", "GMT", +- "Sierra Leone Summer Time", "SLST"}; +- String TASMANIA[] = new String[] {"Eastern Standard Time (Tasmania)", "EST", +- "Eastern Summer Time (Tasmania)", "EST"}; ++ String TASMANIA[] = new String[] {"Australian Eastern Standard Time (Tasmania)", "AEST", ++ "Australian Eastern Daylight Time (Tasmania)", "AEDT"}; + String TMT[] = new String[] {"Turkmenistan Time", "TMT", + "Turkmenistan Summer Time", "TMST"}; + String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT", +@@ -183,22 +185,22 @@ + "Coordinated Universal Time", "UTC"}; + String UZT[] = new String[] {"Uzbekistan Time", "UZT", + "Uzbekistan Summer Time", "UZST"}; +- String VICTORIA[] = new String[] {"Eastern Standard Time (Victoria)", "EST", +- "Eastern Summer Time (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"Australian Eastern Standard Time (Victoria)", "AEST", ++ "Australian Eastern Daylight Time (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Vladivostok Time", "VLAT", + "Vladivostok Summer Time", "VLAST"}; +- String WART[] = new String[] {"Western Argentine Time", "WART", +- "Western Argentine Summer Time", "WARST"}; + String WAT[] = new String[] {"Western African Time", "WAT", + "Western African Summer Time", "WAST"}; + String WET[] = new String[] {"Western European Time", "WET", + "Western European Summer Time", "WEST"}; + String WIT[] = new String[] {"West Indonesia Time", "WIB", + "West Indonesia Summer Time", "WIST"}; +- String WST_AUS[] = new String[] {"Western Standard Time (Australia)", "WST", +- "Western Summer Time (Australia)", "WST"}; +- String WST_SAMOA[] = new String[] {"West Samoa Time", "WST", ++ String WST_AUS[] = new String[] {"Australian Western Standard Time", "AWST", ++ "Australian Western Daylight Time", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"West Samoa Standard Time", "WSST", + "West Samoa Daylight Time", "WSDT"}; ++ String XJT[] = new String[] {"Xinjiang Standard Time", "XJT", ++ "Xinjiang Daylight Time", "XJDT"}; + String YAKT[] = new String[] {"Yakutsk Time", "YAKT", + "Yakutsk Summer Time", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"Western Greenland Time", "WGT", + "Western Greenland Summer Time", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Metlakatla Standard Time", "MeST", +- "Metlakatla Daylight Time", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Pierre & Miquelon Standard Time", "PMST", + "Pierre & Miquelon Daylight Time", "PMDT"}}, +@@ -466,8 +467,8 @@ + "Davis Summer Time", "DAVST"}}, + {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT", + "Dumont-d'Urville Summer Time", "DDUST"}}, +- {"Antarctica/Macquarie", new String[] {"Macquarie Island Time", "MIST", +- "Macquarie Island Summer Time", "MIST"}}, ++ {"Antarctica/Macquarie", new String[] {"Macquarie Island Standard Time", "MIST", ++ "Macquarie Island Daylight Time", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Mawson Time", "MAWT", + "Mawson Summer Time", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"Brunei Time", "BNT", + "Brunei Summer Time", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Choibalsan Time", "CHOT", + "Choibalsan Summer Time", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Hovd Time", "HOVT", + "Hovd Summer Time", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Irkutsk Time", "IRKT", +- "Irkutsk Summer Time", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"East Indonesia Time", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamchatski Time", "PETT", + "Petropavlovsk-Kamchatski Summer Time", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Khandyga Time", "YAKT", + "Khandyga Summer Time", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT", +- "Krasnoyarsk Summer Time", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Philippines Summer Time", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Oral Time", "ORAT", + "Oral Summer Time", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Ust-Nera Time", "VLAT", + "Ust-Nera Summer Time", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST", +- "Central Western Summer Time (Australia)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Australian Central Western Standard Time", "ACWST", ++ "Australian Central Western Daylight Time", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Volgograd Time", "VOLT", +- "Volgograd Summer Time", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Acre Normalzeit", "ACT", + "Acre Sommerzeit", "ACST"}; +- String ADELAIDE[] = new String[] {"Zentrale Normalzeit (S\u00FCdaustralien)", "CST", +- "Zentrale Sommerzeit (S\u00FCdaustralien)", "CST"}; ++ String ADELAIDE[] = new String[] {"Zentrale Normalzeit (S\u00FCdaustralien)", "ACST", ++ "Zentrale Sommerzeit (S\u00FCdaustralien)", "ACDT"}; + String AGT[] = new String[] {"Argentinische Zeit", "ART", + "Argentinische Sommerzeit", "ARST"}; + String AKST[] = new String[] {"Alaska Normalzeit", "AKST", +@@ -61,10 +61,10 @@ + "Atlantik Sommerzeit", "ADT"}; + String BDT[] = new String[] {"Bangladesch Zeit", "BDT", + "Bangladesch Sommerzeit", "BDST"}; +- String BRISBANE[] = new String[] {"\u00D6stliche Normalzeit (Queensland)", "EST", +- "\u00D6stliche Sommerzeit (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Zentrale Normalzeit (S\u00FCdaustralien/New South Wales)", "CST", +- "Zentrale Sommerzeit (S\u00FCdaustralien/New South Wales)", "CST"}; ++ String BRISBANE[] = new String[] {"\u00D6stliche Normalzeit (Queensland)", "AEST", ++ "\u00D6stliche Sommerzeit (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Zentrale Normalzeit (S\u00FCdaustralien/New South Wales)", "ACST", ++ "Zentrale Sommerzeit (S\u00FCdaustralien/New South Wales)", "ACDT"}; + String BRT[] = new String[] {"Brasilianische Zeit", "BRT", + "Brasilianische Sommerzeit", "BRST"}; + String BTT[] = new String[] {"Bhutanische Zeit", "BTT", +@@ -89,8 +89,8 @@ + "Chinesische Sommerzeit", "CDT"}; + String CUBA[] = new String[] {"Kubanische Normalzeit", "CST", + "Kubanische Sommerzeit", "CDT"}; +- String DARWIN[] = new String[] {"Central Normalzeit (Northern Territory)", "CST", +- "Zentrale Sommerzeit (Northern Territory)", "CST"}; ++ String DARWIN[] = new String[] {"Zentrale Normalzeit (Northern Territory)", "ACST", ++ "Zentrale Sommerzeit (Northern Territory)", "ACDT"}; + String DUBLIN[] = new String[] {"Greenwich Zeit", "GMT", + "Irische Sommerzeit", "IST"}; + String EAT[] = new String[] {"Ostafrikanische Zeit", "EAT", +@@ -103,8 +103,8 @@ + "Ostgr\u00f6nl\u00e4ndische Sommerzeit", "EGST"}; + String EST[] = new String[] {"\u00d6stliche Normalzeit", "EST", + "\u00d6stliche Sommerzeit", "EDT"}; +- String EST_NSW[] = new String[] {"Eastern Normalzeit (Neus\u00FCdwales)", "EST", +- "\u00D6stliche Sommerzeit (New South Wales)", "EST"}; ++ String EST_NSW[] = new String[] {"\u00D6stliche Normalzeit (New South Wales)", "AEST", ++ "\u00D6stliche Sommerzeit (New South Wales)", "AEDT"}; + String FET[] = new String[] {"Kaliningrader Zeit", "FET", + "Kaliningrader Sommerzeit", "FEST"}; + String GHMT[] = new String[] {"Ghanaische Normalzeit", "GMT", +@@ -133,10 +133,12 @@ + "Indische Sommerzeit", "IDT"}; + String JST[] = new String[] {"Japanische Normalzeit", "JST", + "Japanische Sommerzeit", "JDT"}; ++ String KRAT[] = new String[] {"Krasnojarsker Zeit", "KRAT", ++ "Krasnojarsker Sommerzeit", "KRAST"}; + String KST[] = new String[] {"Koreanische Normalzeit", "KST", + "Koreanische Sommerzeit", "KDT"}; + String LORD_HOWE[] = new String[] {"Lord Howe Normalzeit", "LHST", +- "Lord Howe Sommerzeit", "LHST"}; ++ "Lord Howe Sommerzeit", "LHDT"}; + String MHT[] = new String[] {"Marshallinseln Zeit", "MHT", + "Marshallinseln Sommerzeit", "MHST"}; + String MSK[] = new String[] {"Moskauer Normalzeit", "MSK", +@@ -165,16 +167,16 @@ + "Pazifische Sommerzeit", "PDT"}; + String SAMOA[] = new String[] {"Samoa Normalzeit", "SST", + "Samoa Sommerzeit", "SDT"}; ++ String IRKT[] = new String[] {"Irkutsk Zeit", "IRKT", ++ "Irkutsk Sommerzeit", "IRKST"}; + String SAST[] = new String[] {"S\u00fcdafrikanische Normalzeit", "SAST", + "S\u00fcdafrikanische Sommerzeit", "SAST"}; + String SBT[] = new String[] {"Salomoninseln Zeit", "SBT", + "Salomoninseln Sommerzeit", "SBST"}; + String SGT[] = new String[] {"Singapur Zeit", "SGT", + "Singapur Sommerzeit", "SGST"}; +- String SLST[] = new String[] {"Greenwich Normalzeit", "GMT", +- "Sierra Leone Sommerzeit", "SLST"}; +- String TASMANIA[] = new String[] {"\u00D6stliche Normalzeit (Tasmanien)", "EST", +- "\u00D6stliche Sommerzeit (Tasmanien)", "EST"}; ++ String TASMANIA[] = new String[] {"\u00D6stliche Normalzeit (Tasmanien)", "AEST", ++ "\u00D6stliche Sommerzeit (Tasmanien)", "AEDT"}; + String TMT[] = new String[] {"Turkmenische Zeit", "TMT", + "Turkmenische Sommerzeit", "TMST"}; + String ULAT[]= new String[] {"Ulaanbaatar Zeit", "ULAT", +@@ -183,22 +185,22 @@ + "Koordinierte Universalzeit", "UTC"}; + String UZT[] = new String[] {"Usbekistan Zeit", "UZT", + "Usbekistan Sommerzeit", "UZST"}; +- String VICTORIA[] = new String[] {"\u00D6stliche Normalzeit (Victoria)", "EST", +- "\u00D6stliche Sommerzeit (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"\u00D6stliche Normalzeit (Victoria)", "AEST", ++ "\u00D6stliche Sommerzeit (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Wladiwostok Zeit", "VLAT", + "Wladiwostok Sommerzeit", "VLAST"}; +- String WART[] = new String[] {"Westargentinische Zeit", "WART", +- "Westargentinische Sommerzeit", "WARST"}; + String WAT[] = new String[] {"Westafrikanische Zeit", "WAT", + "Westafrikanische Sommerzeit", "WAST"}; + String WET[] = new String[] {"Westeurop\u00e4ische Zeit", "WEZ", + "Westeurop\u00e4ische Sommerzeit", "WESZ"}; + String WIT[] = new String[] {"Westindonesische Zeit", "WIB", + "Westindonesische Sommerzeit", "WIST"}; +- String WST_AUS[] = new String[] {"Westliche Normalzeit (Australien)", "WST", +- "Westliche Sommerzeit (Australien)", "WST"}; +- String WST_SAMOA[] = new String[] {"West Samoa Zeit", "WST", ++ String WST_AUS[] = new String[] {"Westliche Normalzeit (Australien)", "AWST", ++ "Westliche Sommerzeit (Australien)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"West Samoa Zeit", "WSST", + "West Samoa Sommerzeit", "WSDT"}; ++ String XJT[] = new String[] {"Chinesische Normalzeit", "XJT", ++ "Chinesische Sommerzeit", "XJDT"}; + String YAKT[] = new String[] {"Jakutsk Zeit", "YAKT", + "Jakutsk Sommerzeit", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"Westgr\u00f6nl\u00e4ndische Zeit", "WGT", + "Westgr\u00f6nl\u00e4ndische Sommerzeit", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Metlakatla Normalzeit", "MeST", +- "Metlakatla Sommerzeit", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Pierre & Miquelon Normalzeit", "PMST", + "Pierre & Miquelon Sommerzeit", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Zeit", "DDUT", + "Dumont-d'Urville Sommerzeit", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"Macquarieinsel Zeit", "MIST", +- "Macquarieinsel Sommerzeit", "MIST"}}, ++ "Macquarieinsel Sommerzeit", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Mawson Zeit", "MAWT", + "Mawson Sommerzeit", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"Brunei Zeit", "BNT", + "Brunei Sommerzeit", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Choibalsan Zeit", "CHOT", + "Choibalsan Sommerzeit", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Hovd Zeit", "HOVT", + "Hovd Sommerzeit", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Irkutsk Zeit", "IRKT", +- "Irkutsk Sommerzeit", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"Ostindonesische Zeit", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Petropawlowsk-Kamtschatkische Zeit", "PETT", + "Petropawlowsk-Kamtschatkische Sommerzeit", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Chandyga Zeit", "YAKT", + "Chandyga Sommerzeit", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Krasnojarsker Zeit", "KRAT", +- "Krasnojarsker Sommerzeit", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Philippinische Sommerzeit", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Oral Zeit", "ORAT", + "Oral Sommerzeit", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Ust-Nera Zeit", "VLAT", + "Ust-Nera Sommerzeit", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Zentral-Westliche Normalzeit (Australien)", "CWST", +- "Zentral-Westliche Sommerzeit (Australien)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Zentral-Westliche Normalzeit (Australien)", "ACWST", ++ "Zentral-Westliche Sommerzeit (Australien)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Wolgograder Zeit", "VOLT", +- "Wolgograder Sommerzeit", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Hora de Acre", "ACT", + "Hora de verano de Acre", "ACST"}; +- String ADELAIDE[] = new String[] {"Hora est\u00E1ndar Central (Sur de Australia)", "CST", +- "Hora de verano Central (Sur de Australia)", "CST"}; ++ String ADELAIDE[] = new String[] {"Hora est\u00E1ndar Central (Sur de Australia)", "ACST", ++ "Hora de verano Central (Sur de Australia)", "ACDT"}; + String AGT[] = new String[] {"Hora de Argentina", "ART", + "Hora de verano de Argentina", "ARST"}; + String AKST[] = new String[] {"Hora est\u00e1ndar de Alaska", "AKST", +@@ -61,10 +61,10 @@ + "Hora de verano Atl\u00e1ntico", "ADT"}; + String BDT[] = new String[] {"Hora de Bangladesh", "BDT", + "Hora de verano de Bangladesh", "BDST"}; +- String BRISBANE[] = new String[] {"Hora est\u00E1ndar del Este (Queensland)", "EST", +- "Hora est\u00E1ndar de verano del Este (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Hora est\u00E1ndar Central (Sur de Australia/Nueva Gales del Sur)", "CST", +- "Hora de verano Central (Sur de Australia/Nueva Gales del Sur)", "CST"}; ++ String BRISBANE[] = new String[] {"Hora est\u00E1ndar del Este (Queensland)", "AEST", ++ "Hora est\u00E1ndar de verano del Este (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Hora est\u00E1ndar Central (Sur de Australia/Nueva Gales del Sur)", "ACST", ++ "Hora de verano Central (Sur de Australia/Nueva Gales del Sur)", "ACDT"}; + String BRT[] = new String[] {"Hora de Brasil", "BRT", + "Hora de verano de Brasil", "BRST"}; + String BTT[] = new String[] {"Hora de But\u00e1n", "BTT", +@@ -77,8 +77,8 @@ + "Hora de verano de Chatham", "CHADT"}; + String ChST[] = new String[] {"Hora est\u00e1ndar de Chamorro", "ChST", + "Hora de verano de Chamorro", "ChDT"}; +- String CHUT[] = new String[] {"Chuuk Time", "CHUT", +- "Chuuk Summer Time", "CHUST"}; ++ String CHUT[] = new String[] {"Hora de Chuuk", "CHUT", ++ "Hora de verano de Chuuk", "CHUST"}; + String CIT[] = new String[] {"Hora de Indonesia Central", "WITA", + "Hora de verano de Indonesia Central", "CIST"}; + String CLT[] = new String[] {"Hora de Chile", "CLT", +@@ -89,8 +89,8 @@ + "Hora de verano de China", "CDT"}; + String CUBA[] = new String[] {"Hora est\u00e1ndar de Cuba", "CST", + "Hora de verano de Cuba", "CDT"}; +- String DARWIN[] = new String[] {"Hora est\u00E1ndar Central (territorio del Norte)", "CST", +- "Hora de verano Central (territorio del Norte)", "CST"}; ++ String DARWIN[] = new String[] {"Hora est\u00E1ndar Central (territorio del Norte)", "ACST", ++ "Hora de verano Central (territorio del Norte)", "ACDT"}; + String DUBLIN[] = new String[] {"Hora del Meridiano de Greenwich", "GMT", + "Hora de verano de Irlanda", "IST"}; + String EAT[] = new String[] {"Hora de \u00c1frica Oriental", "EAT", +@@ -103,8 +103,8 @@ + "Hora de verano de Groenlandia Oriental", "EGST"}; + String EST[] = new String[] {"Hora est\u00e1ndar Oriental", "EST", + "Hora de verano Oriental", "EDT"}; +- String EST_NSW[] = new String[] {"Hora est\u00E1ndar Oriental (Nueva Gales del Sur)", "EST", +- "Hora de verano Oriental (Nueva Gales del Sur)", "EST"}; ++ String EST_NSW[] = new String[] {"Hora est\u00E1ndar Oriental (Nueva Gales del Sur)", "AEST", ++ "Hora de verano Oriental (Nueva Gales del Sur)", "AEDT"}; + String FET[] = new String[] {"Hora de Europa m\u00E1s Oriental", "FET", + "Hora de verano de Europa m\u00E1s Oriental", "FEST"}; + String GHMT[] = new String[] {"Hora central de Ghana", "GMT", +@@ -133,10 +133,12 @@ + "Hora de verano de India", "IDT"}; + String JST[] = new String[] {"Hora est\u00e1ndar de Jap\u00f3n", "JST", + "Hora de verano de Jap\u00f3n", "JDT"}; ++ String KRAT[] = new String[] {"Hora de Krasnoyarsk", "KRAT", ++ "Hora de verano de Krasnoyarsk", "KRAST"}; + String KST[] = new String[] {"Hora est\u00e1ndar de Corea", "KST", + "Hora de verano de Corea", "KDT"}; + String LORD_HOWE[] = new String[] {"Hora est\u00e1ndar de Lord Howe", "LHST", +- "Hora de verano de Lord Howe", "LHST"}; ++ "Hora de verano de Lord Howe", "LHDT"}; + String MHT[] = new String[] {"Hora de las Islas Marshall", "MHT", + "Hora de verano de las Islas Marshall", "MHST"}; + String MSK[] = new String[] {"Hora est\u00e1ndar de Mosc\u00fa", "MSK", +@@ -159,22 +161,22 @@ + "Hora de verano de Pitcairn", "PDT"}; + String PKT[] = new String[] {"Hora de Pakist\u00e1n", "PKT", + "Hora de verano de Pakist\u00e1n", "PKST"}; +- String PONT[] = new String[] {"Pohnpei Time", "PONT", +- "Pohnpei Summer Time", "PONST"}; ++ String PONT[] = new String[] {"Hora de Pohnpei", "PONT", ++ "Hora de verano de Pohnpei", "PONST"}; + String PST[] = new String[] {"Hora est\u00e1ndar del Pac\u00edfico", "PST", + "Hora de verano del Pac\u00edfico", "PDT"}; + String SAMOA[] = new String[] {"Hora est\u00e1ndar de Samoa", "SST", + "Hora de verano de Samoa", "SDT"}; ++ String IRKT[] = new String[] {"Hora de Irkutsk", "IRKT", ++ "Hora de verano de Irkutsk", "IRKST"}; + String SAST[] = new String[] {"Hora est\u00e1ndar de Sud\u00e1frica", "SAST", + "Hora de verano de Sud\u00e1frica", "SAST"}; + String SBT[] = new String[] {"Hora de las Islas Solomon", "SBT", + "Hora de verano de las Islas Solomon", "SBST"}; + String SGT[] = new String[] {"Hora de Singapur", "SGT", + "Hora de verano de Singapur", "SGST"}; +- String SLST[] = new String[] {"Hora del Meridiano de Greenwich", "GMT", +- "Hora de verano de Sierra Leona", "SLST"}; +- String TASMANIA[] = new String[] {"Hora est\u00E1ndar del Este (Tasmania)", "EST", +- "Hora de verano del Este (Tasmania)", "EST"}; ++ String TASMANIA[] = new String[] {"Hora est\u00E1ndar del Este (Tasmania)", "AEST", ++ "Hora de verano del Este (Tasmania)", "AEDT"}; + String TMT[] = new String[] {"Hora de Turkmenist\u00e1n", "TMT", + "Hora de verano de Turkmenist\u00e1n", "TMST"}; + String ULAT[]= new String[] {"Hora de Ulan Bator", "ULAT", +@@ -183,22 +185,22 @@ + "Hora Universal Coordinada", "UTC"}; + String UZT[] = new String[] {"Hora de Uzbekist\u00e1n", "UZT", + "Hora de verano de Uzbekist\u00e1n", "UZST"}; +- String VICTORIA[] = new String[] {"Hora est\u00E1ndar del Este (Victoria)", "EST", +- "Hora de verano del Este (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"Hora est\u00E1ndar del Este (Victoria)", "AEST", ++ "Hora de verano del Este (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Hora de Vladivostok", "VLAT", + "Hora de verano de Vladivostok", "VLAST"}; +- String WART[] = new String[] {"Hora de Argentina Occidental", "WART", +- "Hora de verano de Argentina Occidental", "WARST"}; + String WAT[] = new String[] {"Hora de \u00c1frica Occidental", "WAT", + "Hora de verano de \u00c1frica Occidental", "WAST"}; + String WET[] = new String[] {"Hora de Europa Occidental", "WET", + "Hora de verano de Europa Occidental", "WEST"}; + String WIT[] = new String[] {"Hora de Indonesia Occidental", "WIB", + "Indonesia Hora de verano de Indonesia Occidental", "WIST"}; +- String WST_AUS[] = new String[] {"Hora est\u00E1ndar Occidental (Australia)", "WST", +- "Hora de verano Occidental (Australia)", "WST"}; +- String WST_SAMOA[] = new String[] {"Hora de Samoa Occidental", "WST", ++ String WST_AUS[] = new String[] {"Hora est\u00E1ndar Occidental (Australia)", "AWST", ++ "Hora de verano Occidental (Australia)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"Hora de Samoa Occidental", "WSST", + "Hora de verano de Samoa Occidental", "WSDT"}; ++ String XJT[] = new String[] {"Hora est\u00e1ndar de China", "XJT", ++ "Hora de verano de China", "XJDT"}; + String YAKT[] = new String[] {"Hora de Yakutsk", "YAKT", + "Hora de verano de Yakutsk", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"Hora de Groenlandia Occidental", "WGT", + "Hora de verano de Groenlandia Occidental", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Metlakatla Standard Time", "MeST", +- "Metlakatla Daylight Time", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Hora est\u00e1ndar de Pierre & Miquelon", "PMST", + "Hora de verano de Pierre & Miquelon", "PMDT"}}, +@@ -466,8 +467,8 @@ + "Hora de verano de Davis", "DAVST"}}, + {"Antarctica/DumontDUrville", new String[] {"Hora de Dumont-d'Urville", "DDUT", + "Hora de verano de Dumont-d'Urville", "DDUST"}}, +- {"Antarctica/Macquarie", new String[] {"Macquarie Island Time", "MIST", +- "Macquarie Island Summer Time", "MIST"}}, ++ {"Antarctica/Macquarie", new String[] {"Hora de Isla Macquarie", "MIST", ++ "Hora de verano de Isla Macquarie", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Hora de Mawson", "MAWT", + "Hora de verano de Mawson", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"Hora de Brunei", "BNT", + "Hora de verano de Brunei", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Hora de Choibalsan", "CHOT", + "Hora de verano de Choibalsan", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Hora de Hovd", "HOVT", + "Hora de verano de Hovd", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Hora de Irkutsk", "IRKT", +- "Hora de verano de Irkutsk", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"Hora de Indonesia Oriental", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Hora de Petropavlovsk-Kamchatski", "PETT", + "Hora de verano de Petropavlovsk-Kamchatski", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Hora de Khandyga", "YAKT", + "Hora de verano de Khandyga", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Hora de Krasnoyarsk", "KRAT", +- "Hora de verano de Krasnoyarsk", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Hora de verano de Filipinas", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Hora de Uralsk", "ORAT", + "Hora de verano de Uralsk", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Hora de Ust-Nera", "VLAT", + "Hora de verano de Ust-Nera", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Hora est\u00E1ndar de Australia Central y Occidental", "CWST", +- "Hora est\u00E1ndar de verano de Australia Central y Occidental", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Hora est\u00E1ndar de Australia Central y Occidental", "ACWST", ++ "Hora est\u00E1ndar de verano de Australia Central y Occidental", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Hora de Volgogrado", "VOLT", +- "Hora de verano de Volgogrado", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Heure de l'Acre", "ACT", + "Heure d'\u00e9t\u00e9 de l'Acre", "ACST"}; +- String ADELAIDE[] = new String[] {"Heure standard d'Australie centrale (Australie du sud)", "CST", +- "Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud)", "CST"}; ++ String ADELAIDE[] = new String[] {"Heure standard d'Australie centrale (Australie du sud)", "ACST", ++ "Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud)", "ACDT"}; + String AGT[] = new String[] {"Heure D'Argentine", "ART", + "Heure d'\u00e9t\u00e9 D'Argentine", "ARST"}; + String AKST[] = new String[] {"Heure normale d'Alaska", "AKST", +@@ -61,10 +61,10 @@ + "Heure avanc\u00e9e de l'Atlantique", "ADT"}; + String BDT[] = new String[] {"Heure du Bangladesh", "BDT", + "Heure d'\u00e9t\u00e9 du Bangladesh", "BDST"}; +- String BRISBANE[] = new String[] {"Heure standard d'Australie orientale (Queensland)", "EST", +- "Heure d'\u00E9t\u00E9 d'Australie orientale (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Heure standard d'Australie centrale (Australie du sud/Nouvelle-Galles du sud)", "CST", +- "Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud/Nouvelle-Galles du sud)", "CST"}; ++ String BRISBANE[] = new String[] {"Heure standard d'Australie orientale (Queensland)", "AEST", ++ "Heure d'\u00E9t\u00E9 d'Australie orientale (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Heure standard d'Australie centrale (Australie du sud/Nouvelle-Galles du sud)", "ACST", ++ "Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud/Nouvelle-Galles du sud)", "ACDT"}; + String BRT[] = new String[] {"Heure du Br\u00e9sil", "BRT", + "Heure d'\u00e9t\u00e9 du Br\u00e9sil", "BRST"}; + String BTT[] = new String[] {"Heure du Bhoutan", "BTT", +@@ -89,8 +89,8 @@ + "Heure avanc\u00e9e de Chine", "CDT"}; + String CUBA[] = new String[] {"Heure standard de Cuba", "CST", + "Heure d'\u00e9t\u00e9 de Cuba", "CDT"}; +- String DARWIN[] = new String[] {"Heure standard d'Australie centrale (Territoire du Nord)", "CST", +- "Heure d'\u00E9t\u00E9 d'Australie centrale (Territoire du Nord)", "CST"}; ++ String DARWIN[] = new String[] {"Heure standard d'Australie centrale (Territoire du Nord)", "ACST", ++ "Heure d'\u00E9t\u00E9 d'Australie centrale (Territoire du Nord)", "ACDT"}; + String DUBLIN[] = new String[] {"Heure du m\u00e9ridien de Greenwich", "GMT", + "Heure d'\u00e9t\u00e9 irlandaise", "IST"}; + String EAT[] = new String[] {"Heure d'Afrique de l'Est", "EAT", +@@ -103,8 +103,8 @@ + "Heure d'\u00e9t\u00e9 du Groenland de l'Est", "EGST"}; + String EST[] = new String[] {"Heure normale de l'Est", "EST", + "Heure avanc\u00e9e de l'Est", "EDT"}; +- String EST_NSW[] = new String[] {"Heure normale de l'Est (Nouvelle-Galles du Sud)", "EST", +- "Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud)", "EST"}; ++ String EST_NSW[] = new String[] {"Heure normale de l'Est (Nouvelle-Galles du Sud)", "AEST", ++ "Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud)", "AEDT"}; + String FET[] = new String[] {"Heure d'Europe de l'Est UTC+3", "FET", + "Heure d'\u00E9t\u00E9 d'Europe de l'Est UTC+3", "FEST"}; + String GHMT[] = new String[] {"Heure du Ghana", "GMT", +@@ -133,10 +133,12 @@ + "Heure avanc\u00e9e d'Inde", "IDT"}; + String JST[] = new String[] {"Heure normale du Japon", "JST", + "Heure avanc\u00e9e du Japon", "JDT"}; ++ String KRAT[] = new String[] {"Heure de Krasno\u00efarsk", "KRAT", ++ "Heure d'\u00e9t\u00e9 de Krasno\u00efarsk", "KRAST"}; + String KST[] = new String[] {"Heure normale de Cor\u00e9e", "KST", + "Heure avanc\u00e9e de Cor\u00e9e", "KDT"}; + String LORD_HOWE[] = new String[] {"Heure standard de Lord Howe", "LHST", +- "Heure d'\u00e9t\u00e9 de Lord Howe", "LHST"}; ++ "Heure d'\u00e9t\u00e9 de Lord Howe", "LHDT"}; + String MHT[] = new String[] {"Heure des Iles Marshall", "MHT", + "Heure d'\u00e9t\u00e9 des Iles Marshall", "MHST"}; + String MSK[] = new String[] {"Heure standard de Moscou", "MSK", +@@ -165,16 +167,16 @@ + "Heure avanc\u00e9e du Pacifique", "PDT"}; + String SAMOA[] = new String[] {"Heure standard de Samoa", "SST", + "Heure avanc\u00e9e de Samoa", "SDT"}; ++ String IRKT[] = new String[] {"Heure d'Irkutsk", "IRKT", ++ "Heure d'\u00e9t\u00e9 d'Irkutsk", "IRKST"}; + String SAST[] = new String[] {"Heure normale d'Afrique du Sud", "SAST", + "Heure d'\u00e9t\u00e9 d'Afrique du Sud", "SAST"}; + String SBT[] = new String[] {"Heure des \u00celes Salomon", "SBT", + "Heure d'\u00e9t\u00e9 des \u00celes Salomon", "SBST"}; + String SGT[] = new String[] {"Heure de Singapour", "SGT", + "Heure d'\u00e9t\u00e9 de Singapour", "SGST"}; +- String SLST[] = new String[] {"Heure du m\u00e9ridien de Greenwich", "GMT", +- "Heure d'\u00e9t\u00e9 de Sierra Leone", "SLST"}; +- String TASMANIA[] = new String[] {"Heure standard d'Australie orientale (Tasmanie)", "EST", +- "Heure d'\u00E9t\u00E9 d'Australie orientale (Tasmanie)", "EST"}; ++ String TASMANIA[] = new String[] {"Heure standard d'Australie orientale (Tasmanie)", "AEST", ++ "Heure d'\u00E9t\u00E9 d'Australie orientale (Tasmanie)", "AEDT"}; + String TMT[] = new String[] {"Heure du Turkm\u00e9nistan", "TMT", + "Heure d'\u00e9t\u00e9 du Turkm\u00e9nistan", "TMST"}; + String ULAT[]= new String[] {"Heure de l'Ulaanbaatar", "ULAT", +@@ -183,22 +185,22 @@ + "Temps universel coordonn\u00e9", "UTC"}; + String UZT[] = new String[] {"Heure de l'Ouzb\u00e9kistan", "UZT", + "Heure d'\u00e9t\u00e9 de l'Ouzb\u00e9kistan", "UZST"}; +- String VICTORIA[] = new String[] {"Heure standard d'Australie orientale (Victoria)", "EST", +- "Heure d'\u00E9t\u00E9 d'Australie orientale (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"Heure standard d'Australie orientale (Victoria)", "AEST", ++ "Heure d'\u00E9t\u00E9 d'Australie orientale (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Heure de Vladivostok", "VLAT", + "Heure d'\u00e9t\u00e9 de Vladivostok", "VLAST"}; +- String WART[] = new String[] {"Heure D'Argentine de l'Ouest", "WART", +- "Heure d'\u00e9t\u00e9 D'Argentine de l'Ouest", "WARST"}; + String WAT[] = new String[] {"Heure d'Afrique de l'Ouest", "WAT", + "Heure d'\u00e9t\u00e9 d'Afrique de l'Ouest", "WAST"}; + String WET[] = new String[] {"Heure d'Europe de l'Ouest", "WET", + "Heure d'\u00e9t\u00e9 d'Europe de l'Ouest", "WEST"}; + String WIT[] = new String[] {"Heure de l'Indon\u00e9sie occidentale", "WIB", + "Heure d'\u00e9t\u00e9 de l'Indon\u00e9sie occidentale", "WIST"}; +- String WST_AUS[] = new String[] {"Heure normale de l'Ouest (Australie)", "WST", +- "Heure d'\u00E9t\u00E9 de l'Ouest (Australie)", "WST"}; +- String WST_SAMOA[] = new String[] {"Heure des Samoas occidentales", "WST", ++ String WST_AUS[] = new String[] {"Heure normale de l'Ouest (Australie)", "AWST", ++ "Heure d'\u00E9t\u00E9 de l'Ouest (Australie)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"Heure des Samoas occidentales", "WSST", + "Heure d'\u00e9t\u00e9 des Samoas occidentales", "WSDT"}; ++ String XJT[] = new String[] {"Heure normale de Chine", "XJT", ++ "Heure avanc\u00e9e de Chine", "XJDT"}; + String YAKT[] = new String[] {"Heure du Iakoutsk", "YAKT", + "Heure d'\u00e9t\u00e9 du Iakoutsk", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"Heure du Groenland de l'Ouest", "WGT", + "Heure d'\u00e9t\u00e9 du Groenland de l'Ouest", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Heure normale de Metlakatla", "MeST", +- "Heure avanc\u00E9e de Metlakatla", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Heure normale de Saint-Pierre et Miquelon", "PMST", + "Heure avanc\u00e9e de Saint-Pierre et Miquelon", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Heure de Dumont-d'Urville", "DDUT", + "Heure d'\u00e9t\u00e9 de Dumont-d'Urville", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"Heure de l'Ile Macquarie", "MIST", +- "Heure d'\u00E9t\u00E9 de l'Ile Macquarie", "MIST"}}, ++ "Heure d'\u00E9t\u00E9 de l'Ile Macquarie", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Heure de Mawson", "MAWT", + "Heure d'\u00e9t\u00e9 de Mawson", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"Heure du Brunei", "BNT", + "Heure d'\u00e9t\u00e9 du Brunei", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Heure de Choibalsan", "CHOT", + "Heure d'\u00e9t\u00e9 de Choibalsan", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Heure de Hovd", "HOVT", + "Heure d'\u00e9t\u00e9 de Hovd", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Heure d'Irkutsk", "IRKT", +- "Heure d'\u00e9t\u00e9 d'Irkutsk", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"Heure d'Indon\u00e9sie orientale", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Heure de Petropavlovsk-Kamchatski", "PETT", + "Heure d'\u00e9t\u00e9 de Petropavlovsk-Kamchatski", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Heure de Khandyga", "YAKT", + "Heure d'\u00E9t\u00E9 de Khandyga", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Heure de Krasno\u00efarsk", "KRAT", +- "Heure d'\u00e9t\u00e9 de Krasno\u00efarsk", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Heure d'\u00e9t\u00e9 des Philippines", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Heure d'Oral", "ORAT", + "Heure d'\u00e9t\u00e9 d'Oral", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Heure d'Ust-Nera", "VLAT", + "Heure d'\u00E9t\u00E9 d'Ust-Nera", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Heure standard de l'Australie occidentale (centre)", "CWST", +- "Heure d'\u00E9t\u00E9 de l'Australie occidentale (centre)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Heure standard de l'Australie occidentale (centre)", "ACWST", ++ "Heure d'\u00E9t\u00E9 de l'Australie occidentale (centre)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Heure de Volgograd", "VOLT", +- "Heure d'\u00e9t\u00e9 de Volgograd", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Ora di Acre", "ACT", + "Ora estiva di Acre", "ACST"}; +- String ADELAIDE[] = new String[] {"Ora standard centrale (Australia del Sud)", "CST", +- "Ora estiva centrale (Australia del Sud)", "CST"}; ++ String ADELAIDE[] = new String[] {"Ora standard centrale (Australia del Sud)", "ACST", ++ "Ora estiva centrale (Australia del Sud)", "ACDT"}; + String AGT[] = new String[] {"Ora dell'Argentina", "ART", + "Ora estiva dell'Argentina", "ARST"}; + String AKST[] = new String[] {"Ora solare dell'Alaska", "AKST", +@@ -61,10 +61,10 @@ + "Ora legale dell'Atlantico occidentale", "ADT"}; + String BDT[] = new String[] {"Ora del Bangladesh", "BDT", + "Ora estiva del Bangladesh", "BDST"}; +- String BRISBANE[] = new String[] {"Ora standard orientale (Queensland)", "EST", +- "Ora estiva orientale (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Ora standard centrale (Australia del Sud/Nuovo Galles del Sud)", "CST", +- "Ora estiva centrale (Australia del Sud/Nuovo Galles del Sud)", "CST"}; ++ String BRISBANE[] = new String[] {"Ora standard orientale (Queensland)", "AEST", ++ "Ora estiva orientale (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Ora standard centrale (Australia del Sud/Nuovo Galles del Sud)", "ACST", ++ "Ora estiva centrale (Australia del Sud/Nuovo Galles del Sud)", "ACDT"}; + String BRT[] = new String[] {"Ora del Brasile", "BRT", + "Ora estiva del Brasile", "BRST"}; + String BTT[] = new String[] {"Ora del Bhutan", "BTT", +@@ -89,8 +89,8 @@ + "Ora legale della Cina", "CDT"}; + String CUBA[] = new String[] {"Ora solare Cuba", "CST", + "Ora legale Cuba", "CDT"}; +- String DARWIN[] = new String[] {"Ora standard centrale (Territori del Nord)", "CST", +- "Ora estiva centrale (Territori del Nord)", "CST"}; ++ String DARWIN[] = new String[] {"Ora standard centrale (Territori del Nord)", "ACST", ++ "Ora estiva centrale (Territori del Nord)", "ACDT"}; + String DUBLIN[] = new String[] {"Ora media di Greenwich", "GMT", + "Ora estiva irlandese", "IST"}; + String EAT[] = new String[] {"Ora dell'Africa orientale", "EAT", +@@ -103,8 +103,8 @@ + "Ora estiva della Groenlandia orientale", "EGST"}; + String EST[] = new String[] {"Ora solare USA orientale", "EST", + "Ora legale USA orientale", "EDT"}; +- String EST_NSW[] = new String[] {"Ora standard dell'Australia orientale (Nuovo Galles del Sud)", "EST", +- "Ora estiva dell'Australia orientale (Nuovo Galles del Sud)", "EST"}; ++ String EST_NSW[] = new String[] {"Ora standard dell'Australia orientale (Nuovo Galles del Sud)", "AEST", ++ "Ora estiva dell'Australia orientale (Nuovo Galles del Sud)", "AEDT"}; + String FET[] = new String[] {"Ora dei paesi europei pi\u00F9 orientali", "FET", + "Ora estiva dei paesi europei pi\u00F9 orientali", "FEST"}; + String GHMT[] = new String[] {"Ora media del Ghana", "GMT", +@@ -133,10 +133,12 @@ + "Ora legale dell'India", "IDT"}; + String JST[] = new String[] {"Ora solare del Giappone", "JST", + "Ora legale del Giappone", "JDT"}; ++ String KRAT[] = new String[] {"Ora di Krasnojarsk", "KRAT", ++ "Ora estiva di Krasnojarsk", "KRAST"}; + String KST[] = new String[] {"Ora solare della Corea", "KST", + "Ora legale della Corea", "KDT"}; + String LORD_HOWE[] = new String[] {"Ora standard di Lord Howe", "LHST", +- "Ora estiva di Lord Howe", "LHST"}; ++ "Ora estiva di Lord Howe", "LHDT"}; + String MHT[] = new String[] {"Ora delle Isole Marshall", "MHT", + "Ora estiva delle Isole Marshall", "MHST"}; + String MSK[] = new String[] {"Ora standard di Mosca", "MSK", +@@ -165,16 +167,16 @@ + "Ora legale della costa occidentale USA", "PDT"}; + String SAMOA[] = new String[] {"Ora standard di Samoa", "SST", + "Ora legale di Samoa", "SDT"}; ++ String IRKT[] = new String[] {"Ora di Irkutsk", "IRKT", ++ "Ora estiva di Irkutsk", "IRKST"}; + String SAST[] = new String[] {"Ora solare del Sudafrica", "SAST", + "Ora estiva del Sudafrica", "SAST"}; + String SBT[] = new String[] {"Ora delle Isole Salomone", "SBT", + "Ora estiva delle Isole Salomone", "SBST"}; + String SGT[] = new String[] {"Ora di Singapore", "SGT", + "Ora estiva di Singapore", "SGST"}; +- String SLST[] = new String[] {"Ora media di Greenwich", "GMT", +- "Ora legale della Sierra Leone", "SLST"}; +- String TASMANIA[] = new String[] {"Ora standard orientale (Tasmania)", "EST", +- "Ora estiva orientale (Tasmania)", "EST"}; ++ String TASMANIA[] = new String[] {"Ora standard orientale (Tasmania)", "AEST", ++ "Ora estiva orientale (Tasmania)", "AEDT"}; + String TMT[] = new String[] {"Ora del Turkmenistan", "TMT", + "Ora estiva del Turkmenistan", "TMST"}; + String ULAT[]= new String[] {"Ora di Ulaanbaatar", "ULAT", +@@ -183,22 +185,22 @@ + "Tempo universale coordinato", "UTC"}; + String UZT[] = new String[] {"Ora dell'Uzbekistan", "UZT", + "Ora estiva dell'Uzbekistan", "UZST"}; +- String VICTORIA[] = new String[] {"Ora standard orientale (Victoria)", "EST", +- "Ora estiva orientale (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"Ora standard orientale (Victoria)", "AEST", ++ "Ora estiva orientale (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Ora di Vladivostok", "VLAT", + "Ora estiva di Vladivostok", "VLAST"}; +- String WART[] = new String[] {"Ora dell'Argentina occidentale", "WART", +- "Ora estiva dell'Argentina occidentale", "WARST"}; + String WAT[] = new String[] {"Ora dell'Africa occidentale", "WAT", + "Ora estiva dell'Africa occidentale", "WAST"}; + String WET[] = new String[] {"Ora dell'Europa occidentale", "WET", + "Ora estiva dell'Europa occidentale", "WEST"}; + String WIT[] = new String[] {"Ora dell'Indonesia occidentale", "WIB", + "Ora estiva dell'Indonesia occidentale", "WIST"}; +- String WST_AUS[] = new String[] {"Ora standard dell'Australia occidentale", "WST", +- "Ora estiva dell'Australia occidentale", "WST"}; +- String WST_SAMOA[] = new String[] {"Ora di Samoa", "WST", ++ String WST_AUS[] = new String[] {"Ora standard dell'Australia occidentale", "AWST", ++ "Ora estiva dell'Australia occidentale", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"Ora di Samoa", "WSST", + "Ora estiva di Samoa", "WSDT"}; ++ String XJT[] = new String[] {"Ora solare della Cina", "XJT", ++ "Ora legale della Cina", "XJDT"}; + String YAKT[] = new String[] {"Ora di Jakutsk", "YAKT", + "Ora estiva di Jakutsk", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"Ora della Groenlandia occidentale", "WGT", + "Ora estiva della Groenlandia occidentale", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Ora standard di Metlakatla", "MeST", +- "Ora legale di Metlakatla", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Ora solare di Saint-Pierre e Miquelon", "PMST", + "Ora legale di Saint-Pierre e Miquelon", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Ora di Dumont-d'Urville", "DDUT", + "Ora estiva di Dumont-d'Urville", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"Ora dell'Isola Macquarie", "MIST", +- "Ora estiva dell'Isola Macquarie", "MIST"}}, ++ "Ora estiva dell'Isola Macquarie", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Ora di Mawson", "MAWT", + "Ora estiva di Mawson", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"Ora del Brunei", "BNT", + "Ora estiva del Brunei", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Ora di Choibalsan", "CHOT", + "Ora estiva di Choibalsan", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Ora di Hovd", "HOVT", + "Ora estiva di Hovd", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Ora di Irkutsk", "IRKT", +- "Ora estiva di Irkutsk", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"Ora dell'Indonesia orientale", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Ora di Petropavlovsk-Kamchatski", "PETT", + "Ora estiva di Petropavlovsk-Kamchatski", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Ora di Khandyga", "YAKT", + "Ora estiva di Khandyga", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Ora di Krasnojarsk", "KRAT", +- "Ora estiva di Krasnojarsk", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Ora estiva delle Filippine", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Ora di Oral", "ORAT", + "Ora estiva di Oral", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Ora di Ust-Nera", "VLAT", + "Ora estiva di Ust-Nera", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Ora standard Australia centro-occidentale", "CWST", +- "Ora estiva Australia centro-occidentale", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Ora standard Australia centro-occidentale", "ACWST", ++ "Ora estiva Australia centro-occidentale", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Ora di Volgograd", "VOLT", +- "Ora estiva di Volgograd", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"\u30a2\u30af\u30ec\u6642\u9593", "ACT", + "\u30a2\u30af\u30ec\u590f\u6642\u9593", "ACST"}; +- String ADELAIDE[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "CST", +- "\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "CST"}; ++ String ADELAIDE[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "ACST", ++ "\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "ACDT"}; + String AGT[] = new String[] {"\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "ART", + "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u590f\u6642\u9593", "ARST"}; + String AKST[] = new String[] {"\u30a2\u30e9\u30b9\u30ab\u6a19\u6e96\u6642", "AKST", +@@ -61,10 +61,10 @@ + "\u5927\u897f\u6d0b\u590f\u6642\u9593", "ADT"}; + String BDT[] = new String[] {"\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5\u6642\u9593", "BDT", + "\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5\u590f\u6642\u9593", "BDST"}; +- String BRISBANE[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9)", "EST", +- "\u6771\u90E8\u590F\u6642\u9593(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9)", "EST"}; +- String BROKEN_HILL[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "CST", +- "\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "CST"}; ++ String BRISBANE[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9)", "AEST", ++ "\u6771\u90E8\u590F\u6642\u9593(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "ACST", ++ "\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "ACDT"}; + String BRT[] = new String[] {"\u30d6\u30e9\u30b8\u30eb\u6642\u9593", "BRT", + "\u30d6\u30e9\u30b8\u30eb\u590f\u6642\u9593", "BRST"}; + String BTT[] = new String[] {"\u30d6\u30fc\u30bf\u30f3\u6642\u9593", "BTT", +@@ -89,8 +89,8 @@ + "\u4e2d\u56fd\u590f\u6642\u9593", "CDT"}; + String CUBA[] = new String[] {"\u30ad\u30e5\u30fc\u30d0\u6a19\u6e96\u6642", "CST", + "\u30ad\u30e5\u30fc\u30d0\u590f\u6642\u9593", "CDT"}; +- String DARWIN[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC)", "CST", +- "\u4E2D\u90E8\u590F\u6642\u9593(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC)", "CST"}; ++ String DARWIN[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC)", "ACST", ++ "\u4E2D\u90E8\u590F\u6642\u9593(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC)", "ACDT"}; + String DUBLIN[] = new String[] {"\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642", "GMT", + "\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u590f\u6642\u9593", "IST"}; + String EAT[] = new String[] {"\u6771\u30a2\u30d5\u30ea\u30ab\u6642\u9593", "EAT", +@@ -103,8 +103,8 @@ + "\u6771\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9\u590f\u6642\u9593", "EGST"}; + String EST[] = new String[] {"\u6771\u90e8\u6a19\u6e96\u6642", "EST", + "\u6771\u90e8\u590f\u6642\u9593", "EDT"}; +- String EST_NSW[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "EST", +- "\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "EST"}; ++ String EST_NSW[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "AEST", ++ "\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA)", "AEDT"}; + String FET[] = new String[] {"\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593", "FET", + "\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u590F\u6642\u9593", "FEST"}; + String GHMT[] = new String[] {"\u30ac\u30fc\u30ca\u6a19\u6e96\u6642", "GMT", +@@ -133,10 +133,12 @@ + "\u30a4\u30f3\u30c9\u590f\u6642\u9593", "IDT"}; + String JST[] = new String[] {"\u65e5\u672c\u6a19\u6e96\u6642", "JST", + "\u65e5\u672c\u590f\u6642\u9593", "JDT"}; ++ String KRAT[] = new String[] {"\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u6642\u9593", "KRAT", ++ "\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u590f\u6642\u9593", "KRAST"}; + String KST[] = new String[] {"\u97d3\u56fd\u6a19\u6e96\u6642", "KST", + "\u97d3\u56fd\u590f\u6642\u9593", "KDT"}; + String LORD_HOWE[] = new String[] {"\u30ed\u30fc\u30c9\u30cf\u30a6\u5cf6\u6a19\u6e96\u6642", "LHST", +- "\u30ed\u30fc\u30c9\u30cf\u30a6\u5cf6\u590f\u6642\u9593", "LHST"}; ++ "\u30ed\u30fc\u30c9\u30cf\u30a6\u5cf6\u590f\u6642\u9593", "LHDT"}; + String MHT[] = new String[] {"\u30de\u30fc\u30b7\u30e3\u30eb\u5cf6\u6642\u9593", "MHT", + "\u30de\u30fc\u30b7\u30e3\u30eb\u5cf6\u590f\u6642\u9593", "MHST"}; + String MSK[] = new String[] {"\u30e2\u30b9\u30af\u30ef\u6a19\u6e96\u6642", "MSK", +@@ -165,16 +167,16 @@ + "\u592a\u5e73\u6d0b\u590f\u6642\u9593", "PDT"}; + String SAMOA[] = new String[] {"\u30b5\u30e2\u30a2\u6a19\u6e96\u6642", "SST", + "\u30b5\u30e2\u30a2\u590f\u6642\u9593", "SDT"}; ++ String IRKT[] = new String[] {"\u30a4\u30eb\u30af\u30fc\u30c4\u30af\u6642\u9593", "IRKT", ++ "\u30a4\u30eb\u30af\u30fc\u30c4\u30af\u590f\u6642\u9593", "IRKST"}; + String SAST[] = new String[] {"\u5357\u30a2\u30d5\u30ea\u30ab\u6a19\u6e96\u6642", "SAST", + "\u5357\u30a2\u30d5\u30ea\u30ab\u590f\u6642\u9593", "SAST"}; + String SBT[] = new String[] {"\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6\u6642\u9593", "SBT", + "\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6\u590f\u6642\u9593", "SBST"}; + String SGT[] = new String[] {"\u30b7\u30f3\u30ac\u30dd\u30fc\u30eb\u6642\u9593", "SGT", + "\u30b7\u30f3\u30ac\u30dd\u30fc\u30eb\u590f\u6642\u9593", "SGST"}; +- String SLST[] = new String[] {"\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642", "GMT", +- "\u30b7\u30a8\u30e9\u30ec\u30aa\u30cd\u590f\u6642\u9593", "SLST"}; +- String TASMANIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30BF\u30B9\u30DE\u30CB\u30A2)", "EST", +- "\u6771\u90E8\u590F\u6642\u9593(\u30BF\u30B9\u30DE\u30CB\u30A2)", "EST"}; ++ String TASMANIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30BF\u30B9\u30DE\u30CB\u30A2)", "AEST", ++ "\u6771\u90E8\u590F\u6642\u9593(\u30BF\u30B9\u30DE\u30CB\u30A2)", "AEDT"}; + String TMT[] = new String[] {"\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3\u6642\u9593", "TMT", + "\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3\u590f\u6642\u9593", "TMST"}; + String ULAT[]= new String[] {"\u30a6\u30e9\u30fc\u30f3\u30d0\u30fc\u30c8\u30eb\u6642\u9593", "ULAT", +@@ -183,22 +185,22 @@ + "\u5354\u5b9a\u4e16\u754c\u6642", "UTC"}; + String UZT[] = new String[] {"\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3\u6642\u9593", "UZT", + "\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3\u590f\u6642\u9593", "UZST"}; +- String VICTORIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30D3\u30AF\u30C8\u30EA\u30A2)", "EST", +- "\u6771\u90E8\u590F\u6642\u9593(\u30D3\u30AF\u30C8\u30EA\u30A2)", "EST"}; ++ String VICTORIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642(\u30D3\u30AF\u30C8\u30EA\u30A2)", "AEST", ++ "\u6771\u90E8\u590F\u6642\u9593(\u30D3\u30AF\u30C8\u30EA\u30A2)", "AEDT"}; + String VLAT[] = new String[] {"\u30a6\u30e9\u30b8\u30aa\u30b9\u30c8\u30af\u6642\u9593", "VLAT", + "\u30a6\u30e9\u30b8\u30aa\u30b9\u30c8\u30af\u590f\u6642\u9593", "VLAST"}; +- String WART[] = new String[] {"\u897f\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593", "WART", +- "\u897f\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u590f\u6642\u9593", "WARST"}; + String WAT[] = new String[] {"\u897f\u30a2\u30d5\u30ea\u30ab\u6642\u9593", "WAT", + "\u897f\u30a2\u30d5\u30ea\u30ab\u590f\u6642\u9593", "WAST"}; + String WET[] = new String[] {"\u897f\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593", "WET", + "\u897f\u30e8\u30fc\u30ed\u30c3\u30d1\u590f\u6642\u9593", "WEST"}; + String WIT[] = new String[] {"\u897f\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u6642\u9593", "WIB", + "\u897f\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u590f\u6642\u9593", "WIST"}; +- String WST_AUS[] = new String[] {"\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "WST", +- "\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "WST"}; +- String WST_SAMOA[] = new String[] {"\u897f\u30b5\u30e2\u30a2\u6642\u9593", "WST", ++ String WST_AUS[] = new String[] {"\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "AWST", ++ "\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"\u897f\u30b5\u30e2\u30a2\u6642\u9593", "WSST", + "\u897f\u30b5\u30e2\u30a2\u590f\u6642\u9593", "WSDT"}; ++ String XJT[] = new String[] {"\u4e2d\u56fd\u6a19\u6e96\u6642", "XJT", ++ "\u4e2d\u56fd\u590f\u6642\u9593", "XJDT"}; + String YAKT[] = new String[] {"\u30e4\u30af\u30fc\u30c4\u30af\u6642\u9593", "YAKT", + "\u30e4\u30af\u30fc\u30c4\u30af\u590f\u6642\u9593", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"\u897f\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9\u6642\u9593", "WGT", + "\u897f\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9\u590f\u6642\u9593", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"\u30E1\u30C8\u30E9\u30AB\u30C8\u30E9\u6A19\u6E96\u6642\u9593", "MeST", +- "\u30E1\u30C8\u30E9\u30AB\u30C8\u30E9\u590F\u6642\u9593", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"\u30b5\u30f3\u30d4\u30a8\u30fc\u30eb\u30fb\u30df\u30af\u30ed\u30f3\u8af8\u5cf6\u6a19\u6e96\u6642", "PMST", + "\u30b5\u30f3\u30d4\u30a8\u30fc\u30eb\u30fb\u30df\u30af\u30ed\u30f3\u8af8\u5cf6\u590f\u6642\u9593", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"\u30c7\u30e5\u30e2\u30f3\u30c7\u30e5\u30eb\u30f4\u30a3\u30eb\u6642\u9593", "DDUT", + "\u30c7\u30e5\u30e2\u30f3\u30c7\u30e5\u30eb\u30f4\u30a3\u30eb\u590f\u6642\u9593", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"\u30DE\u30C3\u30B3\u30FC\u30EA\u30FC\u5CF6\u6642\u9593", "MIST", +- "\u30DE\u30C3\u30B3\u30FC\u30EA\u30FC\u5CF6\u590F\u6642\u9593", "MIST"}}, ++ "\u30DE\u30C3\u30B3\u30FC\u30EA\u30FC\u5CF6\u590F\u6642\u9593", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"\u30e2\u30fc\u30bd\u30f3\u6642\u9593", "MAWT", + "\u30e2\u30fc\u30bd\u30f3\u590f\u6642\u9593", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"\u30d6\u30eb\u30cd\u30a4\u6642\u9593", "BNT", + "\u30d6\u30eb\u30cd\u30a4\u590f\u6642\u9593", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"\u30c1\u30e7\u30a4\u30d0\u30eb\u30b5\u30f3\u6642\u9593", "CHOT", + "\u30c1\u30e7\u30a4\u30d0\u30eb\u30b5\u30f3\u590f\u6642\u9593", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"\u30db\u30d6\u30c9\u6642\u9593", "HOVT", + "\u30db\u30d6\u30c9\u590f\u6642\u9593", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"\u30a4\u30eb\u30af\u30fc\u30c4\u30af\u6642\u9593", "IRKT", +- "\u30a4\u30eb\u30af\u30fc\u30c4\u30af\u590f\u6642\u9593", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"\u6771\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u6642\u9593", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"\u30da\u30c8\u30ed\u30d1\u30d6\u30ed\u30d5\u30b9\u30af\u30ab\u30e0\u30c1\u30e3\u30c4\u30ad\u30fc\u6642\u9593", "PETT", + "\u30da\u30c8\u30ed\u30d1\u30d6\u30ed\u30d5\u30b9\u30af\u30ab\u30e0\u30c1\u30e3\u30c4\u30ad\u30fc\u590f\u6642\u9593", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"\u30CF\u30F3\u30C9\u30A5\u30A4\u30AC\u6642\u9593", "YAKT", + "\u30CF\u30F3\u30C9\u30A5\u30A4\u30AC\u590F\u6642\u9593", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u6642\u9593", "KRAT", +- "\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u590f\u6642\u9593", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "\u30d5\u30a3\u30ea\u30d4\u30f3\u590f\u6642\u9593", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"\u30aa\u30e9\u30eb\u6642\u9593", "ORAT", + "\u30aa\u30e9\u30eb\u590f\u6642\u9593", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"\u30A6\u30B9\u30C1\u30CD\u30E9\u6642\u9593", "VLAT", + "\u30A6\u30B9\u30C1\u30CD\u30E9\u590F\u6642\u9593", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"\u4E2D\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "CWST", +- "\u4E2D\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"\u4E2D\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "ACWST", ++ "\u4E2D\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"\u30dc\u30eb\u30b4\u30b0\u30e9\u30fc\u30c9\u6642\u9593", "VOLT", +- "\u30dc\u30eb\u30b4\u30b0\u30e9\u30fc\u30c9\u590f\u6642\u9593", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"\uc5d0\uc774\ucee4 \uc2dc\uac04", "ACT", + "\uc5d0\uc774\ucee4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ACST"}; +- String ADELAIDE[] = new String[] {"\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "CST", +- "\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "CST"}; ++ String ADELAIDE[] = new String[] {"\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "ACST", ++ "\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "ACDT"}; + String AGT[] = new String[] {"\uc544\ub974\ud5e8\ud2f0\ub098 \uc2dc\uac04", "ART", + "\uc544\ub974\ud5e8\ud2f0\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ARST"}; + String AKST[] = new String[] {"\uc54c\ub798\uc2a4\uce74 \ud45c\uc900\uc2dc", "AKST", +@@ -61,10 +61,10 @@ + "\ub300\uc11c\uc591 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ADT"}; + String BDT[] = new String[] {"\ubc29\uae00\ub77c\ub370\uc2dc \uc2dc\uac04", "BDT", + "\ubc29\uae00\ub77c\ub370\uc2dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "BDST"}; +- String BRISBANE[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC)", "EST", +- "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD038\uC990\uB79C\uB4DC)", "EST"}; +- String BROKEN_HILL[] = new String[] {"\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "CST", +- "\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "CST"}; ++ String BRISBANE[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC)", "AEST", ++ "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD038\uC990\uB79C\uB4DC)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "ACST", ++ "\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "ACDT"}; + String BRT[] = new String[] {"\ube0c\ub77c\uc9c8\ub9ac\uc544 \uc2dc\uac04", "BRT", + "\ube0c\ub77c\uc9c8\ub9ac\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "BRST"}; + String BTT[] = new String[] {"\ubd80\ud0c4 \uc2dc\uac04", "BTT", +@@ -89,8 +89,8 @@ + "\uc911\uad6d \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"}; + String CUBA[] = new String[] {"\ucfe0\ubc14 \ud45c\uc900\uc2dc", "CST", + "\ucfe0\ubc14 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"}; +- String DARWIN[] = new String[] {"\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED)", "CST", +- "\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBD81\uBD80 \uC9C0\uC5ED)", "CST"}; ++ String DARWIN[] = new String[] {"\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED)", "ACST", ++ "\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBD81\uBD80 \uC9C0\uC5ED)", "ACDT"}; + String DUBLIN[] = new String[] {"\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc", "GMT", + "\uc544\uc77c\ub79c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "IST"}; + String EAT[] = new String[] {"\ub3d9\ubd80 \uc544\ud504\ub9ac\uce74 \uc2dc\uac04", "EAT", +@@ -103,8 +103,8 @@ + "\ub3d9\ubd80 \uadf8\ub9b0\ub79c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "EGST"}; + String EST[] = new String[] {"\ub3d9\ubd80 \ud45c\uc900\uc2dc", "EST", + "\ub3d9\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "EDT"}; +- String EST_NSW[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "EST", +- "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "EST"}; ++ String EST_NSW[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "AEST", ++ "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988)", "AEDT"}; + String FET[] = new String[] {"\uADF9\uB3D9 \uC720\uB7FD \uD45C\uC900\uC2DC", "FET", + "\uADF9\uB3D9 \uC720\uB7FD \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04", "FEST"}; + String GHMT[] = new String[] {"\uac00\ub098 \ud45c\uc900\uc2dc", "GMT", +@@ -133,10 +133,12 @@ + "\uc778\ub3c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "IDT"}; + String JST[] = new String[] {"\uc77c\ubcf8 \ud45c\uc900\uc2dc", "JST", + "\uc77c\ubcf8 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "JDT"}; ++ String KRAT[] = new String[] {"\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc2dc\uac04", "KRAT", ++ "\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "KRAST"}; + String KST[] = new String[] {"\ud55c\uad6d \ud45c\uc900\uc2dc", "KST", + "\ud55c\uad6d \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "KDT"}; + String LORD_HOWE[] = new String[] {"\ub85c\ub4dc \ud558\uc6b0 \ud45c\uc900\uc2dc", "LHST", +- "\ub85c\ub4dc \ud558\uc6b0 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "LHST"}; ++ "\ub85c\ub4dc \ud558\uc6b0 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "LHDT"}; + String MHT[] = new String[] {"\ub9c8\uc15c\uc81c\ub3c4 \uc2dc\uac04", "MHT", + "\ub9c8\uc15c\uc81c\ub3c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MHST"}; + String MSK[] = new String[] {"\ubaa8\uc2a4\ud06c\ubc14 \ud45c\uc900\uc2dc", "MSK", +@@ -165,16 +167,16 @@ + "\ud0dc\ud3c9\uc591 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PDT"}; + String SAMOA[] = new String[] {"\uc0ac\ubaa8\uc544 \ud45c\uc900\uc2dc", "SST", + "\uc0ac\ubaa8\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SDT"}; ++ String IRKT[] = new String[] {"\uc774\ub974\ucfe0\uce20\ud06c \uc2dc\uac04", "IRKT", ++ "\uc774\ub974\ucfe0\uce20\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "IRKST"}; + String SAST[] = new String[] {"\ub0a8\uc544\ud504\ub9ac\uce74 \ud45c\uc900\uc2dc", "SAST", + "\ub0a8\uc544\ud504\ub9ac\uce74 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SAST"}; + String SBT[] = new String[] {"\uc194\ub85c\ubaac \uad70\ub3c4 \uc2dc\uac04", "SBT", + "\uc194\ub85c\ubaac \uad70\ub3c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SBST"}; + String SGT[] = new String[] {"\uc2f1\uac00\ud3ec\ub974 \uc2dc\uac04", "SGT", + "\uc2f1\uac00\ud3ec\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SGST"}; +- String SLST[] = new String[] {"\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc", "GMT", +- "\uc2dc\uc5d0\ub77c\ub9ac\uc628 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SLST"}; +- String TASMANIA[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544)", "EST", +- "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544)", "EST"}; ++ String TASMANIA[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544)", "AEST", ++ "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544)", "AEDT"}; + String TMT[] = new String[] {"\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4 \uc2dc\uac04", "TMT", + "\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "TMST"}; + String ULAT[]= new String[] {"\uc6b8\ub780\ubc14\ud0c0\ub974 \uc2dc\uac04", "ULAT", +@@ -183,22 +185,22 @@ + "\uc138\uacc4 \ud45c\uc900\uc2dc", "UTC"}; + String UZT[] = new String[] {"\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4 \uc2dc\uac04", "UZT", + "\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "UZST"}; +- String VICTORIA[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uBE45\uD1A0\uB9AC\uC544)", "EST", +- "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBE45\uD1A0\uB9AC\uC544)", "EST"}; ++ String VICTORIA[] = new String[] {"\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uBE45\uD1A0\uB9AC\uC544)", "AEST", ++ "\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBE45\uD1A0\uB9AC\uC544)", "AEDT"}; + String VLAT[] = new String[] {"\ube14\ub77c\ub514\ubcf4\uc2a4\ud1a1 \uc2dc\uac04", "VLAT", + "\ube14\ub77c\ub514\ubcf4\uc2a4\ud1a1 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "VLAST"}; +- String WART[] = new String[] {"\uc11c\ubd80 \uc544\ub974\ud5e8\ud2f0\ub098 \uc2dc\uac04", "WART", +- "\uc11c\ubd80 \uc544\ub974\ud5e8\ud2f0\ub098 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WARST"}; + String WAT[] = new String[] {"\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc2dc\uac04", "WAT", + "\uc11c\ubd80 \uc544\ud504\ub9ac\uce74 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WAST"}; + String WET[] = new String[] {"\uc11c\uc720\ub7fd \uc2dc\uac04", "WET", + "\uc11c\uc720\ub7fd \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WEST"}; + String WIT[] = new String[] {"\uc11c\uc778\ub3c4\ub124\uc2dc\uc544 \uc2dc\uac04", "WIB", + "\uc11c\uc778\ub3c4\ub124\uc2dc\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WIST"}; +- String WST_AUS[] = new String[] {"\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "WST", +- "\uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "WST"}; +- String WST_SAMOA[] = new String[] {"\uc11c\uc0ac\ubaa8\uc544 \uc2dc\uac04", "WST", ++ String WST_AUS[] = new String[] {"\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "AWST", ++ "\uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"\uc11c\uc0ac\ubaa8\uc544 \uc2dc\uac04", "WSST", + "\uc11c\uc0ac\ubaa8\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WSDT"}; ++ String XJT[] = new String[] {"\uc911\uad6d \ud45c\uc900\uc2dc", "XJT", ++ "\uc911\uad6d \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "XJDT"}; + String YAKT[] = new String[] {"\uc57c\uce20\ud06c \uc2dc\uac04", "YAKT", + "\uc57c\uce20\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"\uc11c\ubd80 \uadf8\ub9b0\ub79c\ub4dc \uc2dc\uac04", "WGT", + "\uc11c\ubd80 \uadf8\ub9b0\ub79c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"\uBA54\uD2B8\uB77C\uCE74\uD2B8\uB77C \uD45C\uC900\uC2DC", "MeST", +- "\uBA54\uD2B8\uB77C\uCE74\uD2B8\uB77C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"\ud53c\uc5d0\ub974 \ubbf8\ud06c\ub860 \ud45c\uc900\uc2dc", "PMST", + "\ud53c\uc5d0\ub974 \ubbf8\ud06c\ub860 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"\ub4a4\ubabd \ub4a4\ub974\ube4c \uc2dc\uac04", "DDUT", + "\ub4a4\ubabd \ub4a4\ub974\ube4c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"\uB9E4\uCF70\uB9AC \uC12C \uD45C\uC900\uC2DC", "MIST", +- "\uB9E4\uCF70\uB9AC \uC12C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04", "MIST"}}, ++ "\uB9E4\uCF70\uB9AC \uC12C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"\ubaa8\uc2a8 \uc2dc\uac04", "MAWT", + "\ubaa8\uc2a8 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"\ube0c\ub8e8\ub098\uc774 \uc2dc\uac04", "BNT", + "\ube0c\ub8e8\ub098\uc774 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Choibalsan \uc2dc\uac04", "CHOT", + "Choibalsan \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Hovd \uc2dc\uac04", "HOVT", + "Hovd \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"\uc774\ub974\ucfe0\uce20\ud06c \uc2dc\uac04", "IRKT", +- "\uc774\ub974\ucfe0\uce20\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"\ub3d9\ubd80 \uc778\ub3c4\ub124\uc2dc\uc544 \uc2dc\uac04", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"\ud398\ud2b8\ub85c\ud30c\ube14\ub85c\ud504\uc2a4\ud06c-\uce84\ucc28\uce20\ud0a4 \uc2dc\uac04", "PETT", + "\ud398\ud2b8\ub85c\ud30c\ube14\ub85c\ud504\uc2a4\ud06c-\uce84\ucc28\uce20\ud0a4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"\uD55C\uB514\uAC00 \uD45C\uC900\uC2DC", "YAKT", + "\uD55C\uB514\uAC00 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc2dc\uac04", "KRAT", +- "\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "\ud544\ub9ac\ud540 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Oral \ud45c\uc900\uc2dc", "ORAT", + "Oral \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"\uC6B0\uC2A4\uD2F0\uB124\uB77C \uD45C\uC900\uC2DC", "VLAT", + "\uC6B0\uC2A4\uD2F0\uB124\uB77C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"\uC911\uC559 \uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "CWST", +- "\uC911\uC559 \uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"\uC911\uC559 \uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "ACWST", ++ "\uC911\uC559 \uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"\ubcfc\uace0\uadf8\ub77c\ub4dc \uc2dc\uac04", "VOLT", +- "\ubcfc\uace0\uadf8\ub77c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Fuso hor\u00e1rio do Acre", "ACT", + "Fuso hor\u00e1rio de ver\u00e3o do Acre", "ACST"}; +- String ADELAIDE[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul)", "CST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul)", "CST"}; ++ String ADELAIDE[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul)", "ACST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul)", "ACDT"}; + String AGT[] = new String[] {"Fuso hor\u00e1rio da Argentina", "ART", + "Fuso hor\u00e1rio de ver\u00e3o da Argentina", "ARST"}; + String AKST[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o do Alaska", "AKST", +@@ -61,10 +61,10 @@ + "Hor\u00e1rio de luz natural do Atl\u00e2ntico", "ADT"}; + String BDT[] = new String[] {"Fuso hor\u00e1rio de Bangladesh", "BDT", + "Fuso hor\u00e1rio de ver\u00e3o de Bangladesh", "BDST"}; +- String BRISBANE[] = new String[] {"Hor\u00E1rio-Padr\u00E3o do Leste (Queensland)", "EST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul)", "CST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul)", "CST"}; ++ String BRISBANE[] = new String[] {"Hor\u00E1rio-Padr\u00E3o do Leste (Queensland)", "AEST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul)", "ACST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul)", "ACDT"}; + String BRT[] = new String[] {"Fuso hor\u00e1rio de Bras\u00edlia", "BRT", + "Fuso hor\u00e1rio de ver\u00e3o de Bras\u00edlia", "BRST"}; + String BTT[] = new String[] {"Fuso hor\u00e1rio de But\u00e3o", "BTT", +@@ -87,8 +87,8 @@ + "Hor\u00e1rio de luz natural da China", "CDT"}; + String CUBA[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o de Cuba", "CST", + "Hor\u00e1rio de luz natural de Cuba", "CDT"}; +- String DARWIN[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Central (Territ\u00F3rio do Norte)", "CST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Central (Territ\u00F3rio do Norte)", "CST"}; ++ String DARWIN[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Central (Territ\u00F3rio do Norte)", "ACST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Central (Territ\u00F3rio do Norte)", "ACDT"}; + String DUBLIN[] = new String[] {"Fuso hor\u00e1rio do meridiano de Greenwich", "GMT", + "Fuso hor\u00e1rio de ver\u00e3o da Irlanda", "IST"}; + String EAT[] = new String[] {"Fuso hor\u00e1rio da \u00c1frica Oriental", "EAT", +@@ -101,8 +101,8 @@ + "Fuso hor\u00e1rio de ver\u00e3o da Groenl\u00e2ndia Oriental", "EGST"}; + String EST[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o oriental", "EST", + "Hor\u00e1rio de luz natural oriental", "EDT"}; +- String EST_NSW[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul)", "EST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul)", "EST"}; ++ String EST_NSW[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul)", "AEST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul)", "AEDT"}; + String FET[] = new String[] {"Hor\u00E1rio do Extremo Leste Europeu (FET)", "FET", + "Fuso Hor\u00E1rio de Ver\u00E3o do Extremo Leste Europeu", "FEST"}; + String GHMT[] = new String[] {"Fuso hor\u00e1rio do meridiano de Gana", "GMT", +@@ -131,10 +131,12 @@ + "Hor\u00e1rio de luz natural da \u00cdndia", "IDT"}; + String JST[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o do Jap\u00e3o", "JST", + "Hor\u00e1rio de luz natural do Jap\u00e3o", "JDT"}; ++ String KRAT[] = new String[] {"Fuso hor\u00e1rio de Krasnoyarsk", "KRAT", ++ "Fuso hor\u00e1rio de ver\u00e3o de Krasnoyarsk", "KRAST"}; + String KST[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o da Coreia", "KST", + "Hor\u00e1rio de luz natural da Coreia", "KDT"}; + String LORD_HOWE[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o de Lord Howe", "LHST", +- "Fuso hor\u00e1rio de ver\u00e3o de Lord Howe", "LHST"}; ++ "Fuso hor\u00e1rio de ver\u00e3o de Lord Howe", "LHDT"}; + String MHT[] = new String[] {"Fuso hor\u00e1rio das Ilhas Marshall", "MHT", + "Fuso hor\u00e1rio de ver\u00e3o das Ilhas Marshall", "MHST"}; + String MSK[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o de Moscou", "MSK", +@@ -163,16 +165,16 @@ + "Hor\u00e1rio de luz natural do Pac\u00edfico", "PDT"}; + String SAMOA[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o de Samoa", "SST", + "Hor\u00e1rio de luz natural de Samoa", "SDT"}; ++ String IRKT[] = new String[] {"Fuso hor\u00e1rio de Irkutsk", "IRKT", ++ "Fuso hor\u00e1rio de ver\u00e3o de Irkutsk", "IRKST"}; + String SAST[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o da \u00c1frica do Sul", "SAST", + "Fuso hor\u00e1rio de ver\u00e3o da \u00c1frica do Sul", "SAST"}; + String SBT[] = new String[] {"Fuso hor\u00e1rio das Ilhas Salom\u00e3o", "SBT", + "Fuso hor\u00e1rio de ver\u00e3o das Ilhas Salom\u00e3o", "SBST"}; + String SGT[] = new String[] {"Fuso hor\u00e1rio de Cingapura", "SGT", + "Fuso hor\u00e1rio de ver\u00e1 de Cingapura", "SGST"}; +- String SLST[] = new String[] {"Fuso hor\u00e1rio do meridiano de Greenwich", "GMT", +- "Fuso hor\u00e1rio de ver\u00e3o de Serra Leoa", "SLST"}; +- String TASMANIA[] = new String[] {"Hor\u00E1rio-Padr\u00E3o do Leste (Tasm\u00E2nia)", "EST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Tasm\u00E2nia)", "EST"}; ++ String TASMANIA[] = new String[] {"Hor\u00E1rio-Padr\u00E3o do Leste (Tasm\u00E2nia)", "AEST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Tasm\u00E2nia)", "AEDT"}; + String TMT[] = new String[] {"Fuso hor\u00e1rio do Turcomenist\u00e3o", "TMT", + "Fuso hor\u00e1rio de ver\u00e3o do Turcomenist\u00e3o", "TMST"}; + String TRUT[] = new String[] {"Fuso Hor\u00E1rio de Chuuk", "CHUT", +@@ -183,22 +185,22 @@ + "Tempo universal coordenado", "UTC"}; + String UZT[] = new String[] {"Fuso hor\u00e1rio do Uzbequist\u00e3o", "UZT", + "Fuso hor\u00e1rio de ver\u00e3o do Uzbequist\u00e3o", "UZST"}; +- String VICTORIA[] = new String[] {"Hor\u00E1rio-Padr\u00E3o do Leste (Victoria)", "EST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"Hor\u00E1rio-Padr\u00E3o do Leste (Victoria)", "AEST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Fuso hor\u00e1rio de Vladivostok", "VLAT", + "Fuso hor\u00e1rio de ver\u00e3o de Vladivostok", "VLAST"}; +- String WART[] = new String[] {"Fuso hor\u00e1rio da Argentina Ocidental", "WART", +- "Fuso hor\u00e1rio de ver\u00e3o da Argentina Ocidental", "WARST"}; + String WAT[] = new String[] {"Fuso hor\u00e1rio da \u00c1frica Ocidental", "WAT", + "Fuso hor\u00e1rio de ver\u00e3o da \u00c1frica Ocidental", "WAST"}; + String WET[] = new String[] {"Fuso hor\u00e1rio da Europa Ocidental", "WET", + "Fuso hor\u00e1rio de ver\u00e3o da Europa Ocidental", "WEST"}; + String WIT[] = new String[] {"Fuso hor\u00e1rio da Indon\u00e9sia Ocidental", "WIB", + "Fuso hor\u00e1rio de ver\u00e3o da Indon\u00e9sia Ocidental", "WIST"}; +- String WST_AUS[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Ocidental (Austr\u00E1lia)", "WST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Ocidental (Austr\u00E1lia)", "WST"}; +- String WST_SAMOA[] = new String[] {"Fuso hor\u00e1rio de Samoa Ocidental", "WST", ++ String WST_AUS[] = new String[] {"Hor\u00E1rio-Padr\u00E3o Ocidental (Austr\u00E1lia)", "AWST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Ocidental (Austr\u00E1lia)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"Fuso hor\u00e1rio de Samoa Ocidental", "WSST", + "Fuso hor\u00e1rio de ver\u00e3o de Samoa Ocidental", "WSDT"}; ++ String XJT[] = new String[] {"Fuso hor\u00e1rio padr\u00e3o da China", "XJT", ++ "Hor\u00e1rio de luz natural da China", "XJDT"}; + String YAKT[] = new String[] {"Fuso hor\u00e1rio de Yakutsk", "YAKT", + "Fuso hor\u00e1rio de ver\u00e3o de Yakutsk", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"Fuso hor\u00e1rio da Groenl\u00e2ndia Ocidental", "WGT", + "Fuso hor\u00e1rio de ver\u00e3o da Groenl\u00e2ndia Ocidental", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Hor\u00E1rio Padr\u00E3o de Metlakatla", "MeST", +- "Hor\u00E1rio de Luz Natural de Metlakatla", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Fuso hor\u00e1rio padr\u00e3o de S\u00e3o Pedro e Miquelon", "PMST", + "Hor\u00e1rio de luz natural de S\u00e3o Pedro e Miquelon", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Fuso hor\u00e1rio de Dumont-d'Urville", "DDUT", + "Fuso hor\u00e1rio de ver\u00e3o de Dumont-d'Urville", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"Fuso Hor\u00E1rio da Ilha de Macquarie", "MIST", +- "Fuso Hor\u00E1rio de Ver\u00E3o da Ilha de Macquarie", "MIST"}}, ++ "Fuso Hor\u00E1rio de Ver\u00E3o da Ilha de Macquarie", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Fuso hor\u00e1rio de Mawson", "MAWT", + "Fuso hor\u00e1rio de ver\u00e3o de Mawson", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"Fuso hor\u00e1rio de Brunei", "BNT", + "Fuso hor\u00e1rio de ver\u00e3o de Brunei", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Fuso hor\u00e1rio de Choibalsan", "CHOT", + "Fuso hor\u00e1rio de ver\u00e3o de Choibalsan", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Fuso hor\u00e1rio de Hovd", "HOVT", + "Fuso hor\u00e1rio de ver\u00e3o de Hovd", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Fuso hor\u00e1rio de Irkutsk", "IRKT", +- "Fuso hor\u00e1rio de ver\u00e3o de Irkutsk", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"Fuso hor\u00e1rio da Indon\u00e9sia Oriental", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Fuso hor\u00e1rio de Petropavlovsk-Kamchatski", "PETT", + "Fuso hor\u00e1rio de ver\u00e3o de Petropavlovsk-Kamchatski", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Hor\u00E1rio de Khandyga", "YAKT", + "Hor\u00E1rio de Ver\u00E3o de Khandyga", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Fuso hor\u00e1rio de Krasnoyarsk", "KRAT", +- "Fuso hor\u00e1rio de ver\u00e3o de Krasnoyarsk", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Fuso hor\u00e1rio de ver\u00e3o das Filipinas", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Fuso hor\u00e1rio de Uralsk", "ORAT", + "Fuso hor\u00e1rio de ver\u00e3o de Uralsk", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Hor\u00E1rio de Ust-Nera", "VLAT", + "Hor\u00E1rio de Ver\u00E3o de Ust-Nera", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Fuso Hor\u00E1rio Ocidental Central (Austr\u00E1lia)", "CWST", +- "Fuso Hor\u00E1rio de Ver\u00E3o Ocidental Central (Austr\u00E1lia)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Fuso Hor\u00E1rio Ocidental Central (Austr\u00E1lia)", "ACWST", ++ "Fuso Hor\u00E1rio de Ver\u00E3o Ocidental Central (Austr\u00E1lia)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Fuso hor\u00e1rio de Volgogrado", "VOLT", +- "Fuso hor\u00e1rio de ver\u00e3o de Volgogrado", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", TRUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Acre, normaltid", "ACT", + "Acre, sommartid", "ACST"}; +- String ADELAIDE[] = new String[] {"Central standardtid (Sydaustralien)", "CST", +- "Central sommartid (South Australia)", "CST"}; ++ String ADELAIDE[] = new String[] {"Central standardtid (Sydaustralien)", "ACST", ++ "Central sommartid (South Australia)", "ACDT"}; + String AGT[] = new String[] {"Argentina, normaltid", "ART", + "Argentina, sommartid", "ARST"}; + String AKST[] = new String[] {"Alaska, normaltid", "AKST", +@@ -61,10 +61,10 @@ + "Atlantisk sommartid", "ADT"}; + String BDT[] = new String[] {"Bangladesh, normaltid", "BDT", + "Bangladesh, sommartid", "BDST"}; +- String BRISBANE[] = new String[] {"\u00D6stlig standardtid (Queensland)", "EST", +- "\u00D6stlig sommartid (Queensland)", "EST"}; +- String BROKEN_HILL[] = new String[] {"Central standardtid (Sydaustralien)/New South Wales)", "CST", +- "Central sommartid (South Australia/New South Wales)", "CST"}; ++ String BRISBANE[] = new String[] {"\u00D6stlig standardtid (Queensland)", "AEST", ++ "\u00D6stlig sommartid (Queensland)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"Central standardtid (Sydaustralien/New South Wales)", "ACST", ++ "Central sommartid (South Australia/New South Wales)", "ACDT"}; + String BRT[] = new String[] {"Brasilien, normaltid", "BRT", + "Brasilien, sommartid", "BRST"}; + String BTT[] = new String[] {"Bhutan, normaltid", "BTT", +@@ -89,8 +89,8 @@ + "Kina, sommartid", "CDT"}; + String CUBA[] = new String[] {"Kuba, normaltid", "CST", + "Kuba, sommartid", "CDT"}; +- String DARWIN[] = new String[] {"Central standardtid (Nordterritoriet)", "CST", +- "Central sommartid (Nordterritoriet)", "CST"}; ++ String DARWIN[] = new String[] {"Central standardtid (Nordterritoriet)", "ACST", ++ "Central sommartid (Nordterritoriet)", "ACDT"}; + String DUBLIN[] = new String[] {"Greenwichtid", "GMT", + "Irland, sommartid", "IST"}; + String EAT[] = new String[] {"\u00d6stafrikansk tid", "EAT", +@@ -103,8 +103,8 @@ + "\u00d6stgr\u00f6nl\u00e4ndsk sommartid", "EGST"}; + String EST[] = new String[] {"Eastern, normaltid", "EST", + "Eastern, sommartid", "EDT"}; +- String EST_NSW[] = new String[] {"\u00D6stlig standardtid (New South Wales)", "EST", +- "\u00D6stlig sommartid (New South Wales)", "EST"}; ++ String EST_NSW[] = new String[] {"\u00D6stlig standardtid (New South Wales)", "AEST", ++ "\u00D6stlig sommartid (New South Wales)", "AEDT"}; + String FET[] = new String[] {"Kaliningradtid", "FET", + "\u00D6steuropeisk sommartid", "FEST"}; + String GHMT[] = new String[] {"Ghana, normaltid", "GMT", +@@ -133,10 +133,12 @@ + "Indien, sommartid", "IDT"}; + String JST[] = new String[] {"Japan, normaltid", "JST", + "Japan, sommartid", "JDT"}; ++ String KRAT[] = new String[] {"Krasnojarsk, normaltid", "KRAT", ++ "Krasnojarsk, sommartid", "KRAST"}; + String KST[] = new String[] {"Korea, normaltid", "KST", + "Korea, sommartid", "KDT"}; + String LORD_HOWE[] = new String[] {"Lord Howe, normaltid", "LHST", +- "Lord Howe, sommartid", "LHST"}; ++ "Lord Howe, sommartid", "LHDT"}; + String MHT[] = new String[] {"Marshall\u00f6arna, normaltid", "MHT", + "Marshall\u00f6arna, sommartid", "MHST"}; + String MSK[] = new String[] {"Moskva, normaltid", "MSK", +@@ -165,16 +167,16 @@ + "Stilla havet, sommartid", "PDT"}; + String SAMOA[] = new String[] {"Samoa, normaltid", "SST", + "Samoa, sommartid", "SDT"}; ++ String IRKT[] = new String[] {"Irkutsk, normaltid", "IRKT", ++ "Irkutsk, sommartid", "IRKST"}; + String SAST[] = new String[] {"Sydafrika, normaltid", "SAST", + "Sydafrika, sommartid", "SAST"}; + String SBT[] = new String[] {"Salomon\u00f6arna, normaltid", "SBT", + "Salomon\u00f6arna, sommartid", "SBST"}; + String SGT[] = new String[] {"Singapore, normaltid", "SGT", + "Singapore, sommartid", "SGST"}; +- String SLST[] = new String[] {"Greenwichtid", "GMT", +- "Sierra Leone, sommartid", "SLST"}; +- String TASMANIA[] = new String[] {"\u00D6stlig standardtid (Tasmania)", "EST", +- "\u00D6stlig sommartid (Tasmanien)", "EST"}; ++ String TASMANIA[] = new String[] {"\u00D6stlig standardtid (Tasmania)", "AEST", ++ "\u00D6stlig sommartid (Tasmanien)", "AEDT"}; + String TMT[] = new String[] {"Turkmenistan, normaltid", "TMT", + "Turkmenistan, sommartid", "TMST"}; + String ULAT[]= new String[] {"Ulaanbaatar, normaltid", "ULAT", +@@ -183,22 +185,22 @@ + "Koordinerad universell tid", "UTC"}; + String UZT[] = new String[] {"Uzbekistan, normaltid", "UZT", + "Uzbekistan, sommartid", "UZST"}; +- String VICTORIA[] = new String[] {"\u00D6stlig standardtid (Victoria)", "EST", +- "\u00D6stlig sommartid (Victoria)", "EST"}; ++ String VICTORIA[] = new String[] {"\u00D6stlig standardtid (Victoria)", "AEST", ++ "\u00D6stlig sommartid (Victoria)", "AEDT"}; + String VLAT[] = new String[] {"Vladivostok, normaltid", "VLAT", + "Vladivostok, sommartid", "VLAST"}; +- String WART[] = new String[] {"V\u00e4stargentina, normaltid", "WART", +- "V\u00e4stargentina, sommartid", "WARST"}; + String WAT[] = new String[] {"V\u00e4stafrikansk tid", "WAT", + "V\u00e4stafrikansk sommartid", "WAST"}; + String WET[] = new String[] {"V\u00e4steuropeisk tid", "WET", + "V\u00e4steuropeisk sommartid", "WEST"}; + String WIT[] = new String[] {"V\u00e4stindonesisk tid", "WIB", + "V\u00e4stindonesisk sommartid", "WIST"}; +- String WST_AUS[] = new String[] {"Western Standard Time (Australien)", "WST", +- "V\u00E4stlig sommartid (Australien)", "WST"}; +- String WST_SAMOA[] = new String[] {"V\u00e4stsamoansk tid", "WST", ++ String WST_AUS[] = new String[] {"Western Standard Time (Australien)", "AWST", ++ "V\u00E4stlig sommartid (Australien)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"V\u00e4stsamoansk tid", "WSST", + "V\u00e4stsamoansk sommartid", "WSDT"}; ++ String XJT[] = new String[] {"Kina, normaltid", "XJT", ++ "Kina, sommartid", "XJDT"}; + String YAKT[] = new String[] {"Jakutsk, normaltid", "YAKT", + "Jakutsk, sommartid", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"V\u00e4stra Gr\u00f6nland, normaltid", "WGT", + "V\u00e4stra Gr\u00f6nland, sommartid", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"Metlakatla, normaltid", "MeST", +- "Metlakatla, sommartid", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"Saint-Pierre-et-Miquelon, normaltid", "PMST", + "Saint-Pierre-et-Miquelon, sommartid", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville, normaltid", "DDUT", + "Dumont-d'Urville, sommartid", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"Macquarie\u00F6n, normaltid", "MIST", +- "Macquarie\u00F6n, sommartid", "MIST"}}, ++ "Macquarie\u00F6n, sommartid", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"Mawson, normaltid", "MAWT", + "Mawson, sommartid", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -509,6 +510,7 @@ + "Choibalsan, sommartid", "CHOST"}}, + {"Asia/Chongqing", CTT}, + {"Asia/Chungking", CTT}, ++ {"Asia/Chita", IRKT}, + {"Asia/Colombo", IST}, + {"Asia/Dacca", BDT}, + {"Asia/Dhaka", BDT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"Hovd, normaltid", "HOVT", + "Hovd, sommartid", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Irkutsk, normaltid", "IRKT", +- "Irkutsk, sommartid", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"\u00d6stindonesisk tid", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamtjatka, normaltid", "PETT", + "Petropavlovsk-Kamtjatka, sommartid", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"Khandyga, normaltid", "YAKT", + "Khandyga, sommartid", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"Krasnojarsk, normaltid", "KRAT", +- "Krasnojarsk, sommartid", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "Filippinerna, sommartid", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Oral, normaltid", "ORAT", + "Oral, sommartid", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"Ust-Nera, normaltid", "VLAT", + "Ust-Nera, sommartid", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"Central v\u00E4stlig normaltid (Australien)", "CWST", +- "Central v\u00E4stlig sommartid (Australien)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"Central v\u00E4stlig normaltid (Australien)", "ACWST", ++ "Central v\u00E4stlig sommartid (Australien)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"Volgograd-tid", "VOLT", +- "Volgograd, sommartid", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Acre \u65f6\u95f4", "ACT", + "Acre \u590f\u4ee4\u65f6", "ACST"}; +- String ADELAIDE[] = new String[] {"\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A)", "CST", +- "\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A)", "CST"}; ++ String ADELAIDE[] = new String[] {"\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A)", "ACST", ++ "\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A)", "ACDT"}; + String AGT[] = new String[] {"\u963f\u6839\u5ef7\u65f6\u95f4", "ART", + "\u963f\u6839\u5ef7\u590f\u4ee4\u65f6", "ARST"}; + String AKST[] = new String[] {"\u963f\u62c9\u65af\u52a0\u6807\u51c6\u65f6\u95f4", "AKST", +@@ -61,10 +61,10 @@ + "\u5927\u897f\u6d0b\u590f\u4ee4\u65f6", "ADT"}; + String BDT[] = new String[] {"\u5b5f\u52a0\u62c9\u65f6\u95f4", "BDT", + "\u5b5f\u52a0\u62c9\u590f\u4ee4\u65f6", "BDST"}; +- String BRISBANE[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u6606\u58EB\u5170)", "EST", +- "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u6606\u58EB\u5170)", "EST"}; +- String BROKEN_HILL[] = new String[] {"\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF)", "CST", +- "\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF)", "CST"}; ++ String BRISBANE[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u6606\u58EB\u5170)", "AEST", ++ "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u6606\u58EB\u5170)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF)", "ACST", ++ "\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF)", "ACDT"}; + String BRT[] = new String[] {"\u5df4\u897f\u5229\u4e9a\u65f6\u95f4", "BRT", + "\u5df4\u897f\u5229\u4e9a\u590f\u4ee4\u65f6", "BRST"}; + String BTT[] = new String[] {"\u4e0d\u4e39\u65f6\u95f4", "BTT", +@@ -89,8 +89,8 @@ + "\u4e2d\u56fd\u590f\u4ee4\u65f6", "CDT"}; + String CUBA[] = new String[] {"\u53e4\u5df4\u6807\u51c6\u65f6\u95f4", "CST", + "\u53e4\u5df4\u590f\u4ee4\u65f6", "CDT"}; +- String DARWIN[] = new String[] {"\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5317\u9886\u5730)", "CST", +- "\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5317\u9886\u5730)", "CST"}; ++ String DARWIN[] = new String[] {"\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5317\u9886\u5730)", "ACST", ++ "\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5317\u9886\u5730)", "ACDT"}; + String DUBLIN[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u65f6\u95f4", "GMT", + "\u7231\u5c14\u5170\u590f\u4ee4\u65f6", "IST"}; + String EAT[] = new String[] {"\u4e1c\u975e\u65f6\u95f4", "EAT", +@@ -103,8 +103,8 @@ + "\u4e1c\u683c\u6797\u5c9b\u590f\u4ee4\u65f6", "EGST"}; + String EST[] = new String[] {"\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "EST", + "\u4e1c\u90e8\u590f\u4ee4\u65f6", "EDT"}; +- String EST_NSW[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF)", "EST", +- "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF)", "EST"}; ++ String EST_NSW[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF)", "AEST", ++ "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF)", "AEDT"}; + String FET[] = new String[] {"\u8FDC\u4E1C\u6B27\u65F6\u95F4", "FET", + "\u8FDC\u4E1C\u6B27\u590F\u4EE4\u65F6", "FEST"}; + String GHMT[] = new String[] {"\u52a0\u7eb3\u65f6\u95f4", "GMT", +@@ -133,10 +133,12 @@ + "\u5370\u5ea6\u590f\u4ee4\u65f6", "IDT"}; + String JST[] = new String[] {"\u65e5\u672c\u6807\u51c6\u65f6\u95f4", "JST", + "\u65e5\u672c\u590f\u4ee4\u65f6", "JDT"}; ++ String KRAT[] = new String[] {"\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u65f6\u95f4", "KRAT", ++ "\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u590f\u4ee4\u65f6", "KRAST"}; + String KST[] = new String[] {"\u97e9\u56fd\u6807\u51c6\u65f6\u95f4", "KST", + "\u97e9\u56fd\u590f\u4ee4\u65f6", "KDT"}; + String LORD_HOWE[] = new String[] {"\u8c6a\u516c\u6807\u51c6\u65f6\u95f4", "LHST", +- "\u8c6a\u516c\u590f\u4ee4\u65f6", "LHST"}; ++ "\u8c6a\u516c\u590f\u4ee4\u65f6", "LHDT"}; + String MHT[] = new String[] {"\u9a6c\u7ecd\u5c14\u7fa4\u5c9b\u65f6\u95f4", "MHT", + "\u9a6c\u7ecd\u5c14\u7fa4\u5c9b\u590f\u4ee4\u65f6", "MHST"}; + String MSK[] = new String[] {"\u83ab\u65af\u79d1\u6807\u51c6\u65f6\u95f4", "MSK", +@@ -165,16 +167,16 @@ + "\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6", "PDT"}; + String SAMOA[] = new String[] {"\u8428\u6469\u4e9a\u7fa4\u5c9b\u6807\u51c6\u65f6\u95f4", "SST", + "\u8428\u6469\u4e9a\u7fa4\u5c9b\u590f\u4ee4\u65f6", "SDT"}; ++ String IRKT[] = new String[] {"\u4f0a\u5c14\u5e93\u6b21\u514b\u65f6\u95f4", "IRKT", ++ "\u4f0a\u5c14\u5e93\u6b21\u514b\u590f\u4ee4\u65f6", "IRKST"}; + String SAST[] = new String[] {"\u5357\u975e\u6807\u51c6\u65f6\u95f4", "SAST", + "\u5357\u975e\u590f\u4ee4\u65f6", "SAST"}; + String SBT[] = new String[] {"\u6240\u7f57\u95e8\u7fa4\u5c9b\u65f6\u95f4", "SBT", + "\u6240\u7f57\u95e8\u7fa4\u5c9b\u590f\u4ee4\u65f6", "SBST"}; + String SGT[] = new String[] {"\u65b0\u52a0\u5761\u65f6\u95f4", "SGT", + "\u65b0\u52a0\u5761\u590f\u4ee4\u65f6", "SGST"}; +- String SLST[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u65f6\u95f4", "GMT", +- "\u585e\u62c9\u5229\u6602\u590f\u4ee4\u65f6", "SLST"}; +- String TASMANIA[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u5854\u65AF\u9A6C\u5C3C\u4E9A)", "EST", +- "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u5854\u65AF\u9A6C\u5C3C\u4E9A)", "EST"}; ++ String TASMANIA[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u5854\u65AF\u9A6C\u5C3C\u4E9A)", "AEST", ++ "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u5854\u65AF\u9A6C\u5C3C\u4E9A)", "AEDT"}; + String TMT[] = new String[] {"\u571f\u5e93\u66fc\u65f6\u95f4", "TMT", + "\u571f\u5e93\u66fc\u590f\u4ee4\u65f6", "TMST"}; + String ULAT[]= new String[] {"\u5e93\u4f26\u65f6\u95f4", "ULAT", +@@ -183,22 +185,22 @@ + "\u534f\u8c03\u4e16\u754c\u65f6\u95f4", "UTC"}; + String UZT[] = new String[] {"\u4e4c\u5179\u522b\u514b\u65af\u5766\u65f6\u95f4", "UZT", + "\u4e4c\u5179\u522b\u514b\u65af\u5766\u590f\u4ee4\u65f6", "UZST"}; +- String VICTORIA[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u7EF4\u591A\u5229\u4E9A)", "EST", +- "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u7EF4\u591A\u5229\u4E9A)", "EST"}; ++ String VICTORIA[] = new String[] {"\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u7EF4\u591A\u5229\u4E9A)", "AEST", ++ "\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u7EF4\u591A\u5229\u4E9A)", "AEDT"}; + String VLAT[] = new String[] {"\u6d77\u53c2\u5d34\u65f6\u95f4", "VLAT", + "\u6d77\u53c2\u5d34\u590f\u4ee4\u65f6", "VLAST"}; +- String WART[] = new String[] {"\u897f\u963f\u6839\u5ef7\u65f6\u95f4", "WART", +- "\u897f\u963f\u6839\u5ef7\u590f\u4ee4\u65f6", "WARST"}; + String WAT[] = new String[] {"\u897f\u975e\u65f6\u95f4", "WAT", + "\u897f\u975e\u590f\u4ee4\u65f6", "WAST"}; + String WET[] = new String[] {"\u897f\u6b27\u65f6\u95f4", "WET", + "\u897f\u6b27\u590f\u4ee4\u65f6", "WEST"}; + String WIT[] = new String[] {"\u897f\u5370\u5ea6\u5c3c\u897f\u4e9a\u65f6\u95f4", "WIB", + "\u897f\u5370\u5ea6\u5c3c\u897f\u4e9a\u590f\u4ee4\u65f6", "WIST"}; +- String WST_AUS[] = new String[] {"\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A)", "WST", +- "\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A)", "WST"}; +- String WST_SAMOA[] = new String[] {"\u897f\u8428\u6469\u4e9a\u65f6\u95f4", "WST", ++ String WST_AUS[] = new String[] {"\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A)", "AWST", ++ "\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"\u897f\u8428\u6469\u4e9a\u65f6\u95f4", "WSST", + "\u897f\u8428\u6469\u4e9a\u590f\u4ee4\u65f6", "WSDT"}; ++ String XJT[] = new String[] {"\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4", "XJT", ++ "\u4e2d\u56fd\u590f\u4ee4\u65f6", "XJDT"}; + String YAKT[] = new String[] {"\u4e9a\u5e93\u6b21\u514b\u65f6\u95f4", "YAKT", + "\u4e9a\u5e93\u6b21\u514b\u590f\u4ee4\u65f6", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"\u897f\u683c\u6797\u5170\u5c9b\u65f6\u95f4", "WGT", + "\u897f\u683c\u6797\u5170\u5c9b\u590f\u4ee4\u65f6", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"\u6885\u7279\u62C9\u5361\u7279\u62C9\u6807\u51C6\u65F6\u95F4", "MeST", +- "\u6885\u7279\u62C9\u5361\u7279\u62C9\u590F\u4EE4\u65F6", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"\u76ae\u57c3\u5c14\u5c9b\u53ca\u5bc6\u514b\u9686\u5c9b\u6807\u51c6\u65f6\u95f4", "PMST", + "\u76ae\u57c3\u5c14\u5c9b\u53ca\u5bc6\u514b\u9686\u5c9b\u590f\u4ee4\u65f6", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville \u65f6\u95f4", "DDUT", + "Dumont-d'Urville \u590f\u4ee4\u65f6", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"\u9EA6\u5938\u91CC\u5C9B\u65F6\u95F4", "MIST", +- "\u9EA6\u5938\u91CC\u5C9B\u590F\u4EE4\u65F6", "MIST"}}, ++ "\u9EA6\u5938\u91CC\u5C9B\u590F\u4EE4\u65F6", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"\u83ab\u68ee\u65f6\u95f4", "MAWT", + "\u83ab\u68ee\u590f\u4ee4\u65f6", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"\u6587\u83b1\u65f6\u95f4", "BNT", + "\u6587\u83b1\u590f\u4ee4\u65f6", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"Choibalsan \u65f6\u95f4", "CHOT", + "Choibalsan \u590f\u4ee4\u65f6", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"\u79d1\u5e03\u591a\u65f6\u95f4", "HOVT", + "\u79d1\u5e03\u591a\u590f\u4ee4\u65f6", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"\u4f0a\u5c14\u5e93\u6b21\u514b\u65f6\u95f4", "IRKT", +- "\u4f0a\u5c14\u5e93\u6b21\u514b\u590f\u4ee4\u65f6", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"\u4e1c\u5370\u5ea6\u5c3c\u897f\u4e9a\u65f6\u95f4", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"\u5f7c\u5f97\u7f57\u5df4\u752b\u6d1b\u592b\u65af\u514b\u65f6\u95f4", "PETT", + "\u5f7c\u5f97\u7f57\u5df4\u752b\u6d1b\u592b\u65af\u514b\u590f\u4ee4\u65f6", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"\u6C49\u5FB7\u52A0\u65F6\u95F4", "YAKT", + "\u6C49\u5FB7\u52A0\u590F\u4EE4\u65F6", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u65f6\u95f4", "KRAT", +- "\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u590f\u4ee4\u65f6", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "\u83f2\u5f8b\u5bbe\u590f\u4ee4\u65f6", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"Oral \u65f6\u95f4", "ORAT", + "Oral \u590f\u4ee4\u65f6", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", CTT}, + {"Asia/Tel_Aviv", ISRAEL}, + {"Asia/Tashkent", UZT}, +@@ -588,7 +590,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"\u4E4C\u65AF\u5B63\u6D85\u62C9\u65F6\u95F4", "VLAT", + "\u4E4C\u65AF\u5B63\u6D85\u62C9\u590F\u4EE4\u65F6", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -620,8 +622,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"\u4E2D\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A)", "CWST", +- "\u4E2D\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"\u4E2D\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A)", "ACWST", ++ "\u4E2D\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -687,7 +689,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -696,7 +698,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -721,8 +723,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"\u4f0f\u5c14\u52a0\u683c\u52d2\u65f6\u95f4", "VOLT", +- "\u4f0f\u5c14\u52a0\u683c\u52d2\u590f\u4ee4\u65f6", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -775,6 +776,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Mon Jan 05 11:57:27 2015 -0800 +@@ -45,8 +45,8 @@ + protected final Object[][] getContents() { + String ACT[] = new String[] {"Acre \u6642\u9593", "ACT", + "Acre \u590f\u4ee4\u6642\u9593", "ACST"}; +- String ADELAIDE[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8)", "CST", +- "\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340)", "CST"}; ++ String ADELAIDE[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8)", "ACST", ++ "\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340)", "ACDT"}; + String AGT[] = new String[] {"\u963f\u6839\u5ef7\u6642\u9593", "ART", + "\u963f\u6839\u5ef7\u590f\u4ee4\u6642\u9593", "ARST"}; + String AKST[] = new String[] {"\u963f\u62c9\u65af\u52a0\u6a19\u6e96\u6642\u9593", "AKST", +@@ -61,10 +61,10 @@ + "\u5927\u897f\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "ADT"}; + String BDT[] = new String[] {"\u5b5f\u52a0\u62c9\u6642\u9593", "BDT", + "\u5b5f\u52a0\u62c9\u590f\u4ee4\u6642\u9593", "BDST"}; +- String BRISBANE[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u6606\u58EB\u862D)", "EST", +- "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u6606\u58EB\u862D)", "EST"}; +- String BROKEN_HILL[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF)", "CST", +- "\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF)", "CST"}; ++ String BRISBANE[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u6606\u58EB\u862D)", "AEST", ++ "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u6606\u58EB\u862D)", "AEDT"}; ++ String BROKEN_HILL[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF)", "ACST", ++ "\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF)", "ACDT"}; + String BRT[] = new String[] {"\u5df4\u897f\u5229\u4e9e\u6642\u9593", "BRT", + "\u5df4\u897f\u5229\u4e9e\u590f\u4ee4\u6642\u9593", "BRST"}; + String BTT[] = new String[] {"\u4e0d\u4e39\u6642\u9593", "BTT", +@@ -89,8 +89,8 @@ + "\u4e2d\u570b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"}; + String CUBA[] = new String[] {"\u53e4\u5df4\u6a19\u6e96\u6642\u9593", "CST", + "\u53e4\u5df4\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"}; +- String DARWIN[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340)", "CST", +- "\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340)", "CST"}; ++ String DARWIN[] = new String[] {"\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340)", "ACST", ++ "\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340)", "ACDT"}; + String DUBLIN[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u5e73\u5747\u6642\u9593", "GMT", + "\u611b\u723e\u862d\u590f\u4ee4\u6642\u9593", "IST"}; + String EAT[] = new String[] {"\u6771\u975e\u6642\u9593", "EAT", +@@ -103,8 +103,8 @@ + "\u6771\u683c\u6797\u5cf6\u590f\u4ee4\u6642\u9593", "EGST"}; + String EST[] = new String[] {"\u6771\u65b9\u6a19\u6e96\u6642\u9593", "EST", + "\u6771\u65b9\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "EDT"}; +- String EST_NSW[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF)", "EST", +- "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF)", "EST"}; ++ String EST_NSW[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF)", "AEST", ++ "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF)", "AEDT"}; + String FET[] = new String[] {"\u6771\u6B50\u5167\u9678\u6642\u9593", "FET", + "\u6771\u6B50\u5167\u9678\u590F\u4EE4\u6642\u9593", "FEST"}; + String GHMT[] = new String[] {"\u8fe6\u7d0d\u5e73\u5747\u6642\u9593", "GMT", +@@ -133,10 +133,12 @@ + "\u5370\u5ea6\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "IDT"}; + String JST[] = new String[] {"\u65e5\u672c\u6a19\u6e96\u6642\u9593", "JST", + "\u65e5\u672c\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "JDT"}; ++ String KRAT[] = new String[] {"\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u6642\u9593", "KRAT", ++ "\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u590f\u4ee4\u6642\u9593", "KRAST"}; + String KST[] = new String[] {"\u97d3\u570b\u6a19\u6e96\u6642\u9593", "KST", + "\u97d3\u570b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "KDT"}; + String LORD_HOWE[] = new String[] {"\u8c6a\u52f3\u7235\u5cf6\u6a19\u6e96\u6642\u9593", "LHST", +- "\u8c6a\u52f3\u7235\u5cf6\u590f\u4ee4\u6642\u9593", "LHST"}; ++ "\u8c6a\u52f3\u7235\u5cf6\u590f\u4ee4\u6642\u9593", "LHDT"}; + String MHT[] = new String[] {"\u99ac\u7d39\u723e\u7fa4\u5cf6\u6642\u9593", "MHT", + "\u99ac\u7d39\u723e\u7fa4\u5cf6\u590f\u4ee4\u6642\u9593", "MHST"}; + String MSK[] = new String[] {"\u83ab\u65af\u79d1\u6a19\u6e96\u6642\u9593", "MSK", +@@ -165,16 +167,16 @@ + "\u592a\u5e73\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "PDT"}; + String SAMOA[] = new String[] {"\u85a9\u6469\u4e9e\u6a19\u6e96\u6642\u9593", "SST", + "\u85a9\u6469\u4e9e\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "SDT"}; ++ String IRKT[] = new String[] {"Irkutsk \u6642\u9593", "IRKT", ++ "Irkutsk \u590f\u4ee4\u6642\u9593", "IRKST"}; + String SAST[] = new String[] {"\u5357\u975e\u6a19\u6e96\u6642\u9593", "SAST", + "\u5357\u975e\u590f\u4ee4\u6642\u9593", "SAST"}; + String SBT[] = new String[] {"\u6240\u7f85\u9580\u7fa4\u5cf6\u6642\u9593", "SBT", + "\u6240\u7f85\u9580\u7fa4\u5cf6\u590f\u4ee4\u6642\u9593", "SBST"}; + String SGT[] = new String[] {"\u65b0\u52a0\u5761\u6642\u9593", "SGT", + "\u65b0\u52a0\u5761\u590f\u4ee4\u6642\u9593", "SGST"}; +- String SLST[] = new String[] {"\u683c\u6797\u5a01\u6cbb\u5e73\u5747\u6642\u9593", "GMT", +- "\u7345\u5b50\u5c71\u590f\u4ee4\u6642\u9593", "SLST"}; +- String TASMANIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6)", "EST", +- "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6)", "EST"}; ++ String TASMANIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6)", "AEST", ++ "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6)", "AEDT"}; + String TMT[] = new String[] {"\u571f\u5eab\u66fc\u6642\u9593", "TMT", + "\u571f\u5eab\u66fc\u590f\u4ee4\u6642\u9593", "TMST"}; + String ULAT[]= new String[] {"\u5eab\u502b\u6642\u9593", "ULAT", +@@ -183,22 +185,22 @@ + "\u5354\u8abf\u4e16\u754c\u6642\u9593", "UTC"}; + String UZT[] = new String[] {"\u70cf\u8332\u5225\u514b\u65af\u5766\u6642\u9593", "UZT", + "\u70cf\u8332\u5225\u514b\u65af\u5766\u590f\u4ee4\u6642\u9593", "UZST"}; +- String VICTORIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6)", "EST", +- "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6)", "EST"}; ++ String VICTORIA[] = new String[] {"\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6)", "AEST", ++ "\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6)", "AEDT"}; + String VLAT[] = new String[] {"\u6d77\u53c3\u5d34\u6642\u9593", "VLAT", + "\u6d77\u53c3\u5d34\u590f\u4ee4\u6642\u9593", "VLAST"}; +- String WART[] = new String[] {"\u897f\u963f\u6839\u5ef7\u6642\u9593", "WART", +- "\u897f\u963f\u6839\u5ef7\u590f\u4ee4\u6642\u9593", "WARST"}; + String WAT[] = new String[] {"\u897f\u975e\u6642\u9593", "WAT", + "\u897f\u975e\u590f\u4ee4\u6642\u9593", "WAST"}; + String WET[] = new String[] {"\u897f\u6b50\u6642\u9593", "WET", + "\u897f\u6b50\u590f\u4ee4\u6642\u9593", "WEST"}; + String WIT[] = new String[] {"\u897f\u5370\u5c3c\u6642\u9593", "WIB", + "\u897f\u5370\u5c3c\u590f\u4ee4\u6642\u9593", "WIST"}; +- String WST_AUS[] = new String[] {"\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "WST", +- "\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "WST"}; +- String WST_SAMOA[] = new String[] {"\u897f\u85a9\u6469\u4e9e\u6642\u9593", "WST", ++ String WST_AUS[] = new String[] {"\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "AWST", ++ "\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "AWDT"}; ++ String WST_SAMOA[] = new String[] {"\u897f\u85a9\u6469\u4e9e\u6642\u9593", "WSST", + "\u897f\u85a9\u6469\u4e9e\u590f\u4ee4\u6642\u9593", "WSDT"}; ++ String XJT[] = new String[] {"\u4e2d\u570b\u6a19\u6e96\u6642\u9593", "XJT", ++ "\u4e2d\u570b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "XJDT"}; + String YAKT[] = new String[] {"\u4e9e\u5eab\u6b21\u514b\u6642\u9593", "YAKT", + "\u4e9e\u5eab\u6b21\u514b\u590f\u4ee4\u6642\u9593", "YAKST"}; + +@@ -262,7 +264,7 @@ + {"Africa/Djibouti", EAT}, + {"Africa/Douala", WAT}, + {"Africa/El_Aaiun", WET}, +- {"Africa/Freetown", SLST}, ++ {"Africa/Freetown", GMT}, + {"Africa/Gaborone", CAT}, + {"Africa/Harare", CAT}, + {"Africa/Johannesburg", SAST}, +@@ -358,7 +360,7 @@ + {"America/Godthab", new String[] {"\u897f\u683c\u6797\u862d\u5cf6\u6642\u9593", "WGT", + "\u897f\u683c\u6797\u862d\u5cf6\u590f\u4ee4\u6642\u9593", "WGST"}}, + {"America/Goose_Bay", AST}, +- {"America/Grand_Turk", EST}, ++ {"America/Grand_Turk", AST}, + {"America/Grenada", AST}, + {"America/Guadeloupe", AST}, + {"America/Guatemala", CST}, +@@ -401,8 +403,7 @@ + {"America/Mendoza", AGT}, + {"America/Menominee", CST}, + {"America/Merida", CST}, +- {"America/Metlakatla", new String[] {"\u6885\u7279\u62C9\u5361\u7279\u62C9\u6A19\u6E96\u6642\u9593", "MeST", +- "\u6885\u7279\u62C9\u5361\u7279\u62C9\u65E5\u5149\u7BC0\u7D04\u6642\u9593", "MeDT"}}, ++ {"America/Metlakatla", PST}, + {"America/Mexico_City", CST}, + {"America/Miquelon", new String[] {"\u76ae\u57c3\u723e\u5cf6\u53ca\u5bc6\u514b\u9686\u5cf6\u6a19\u6e96\u6642\u9593", "PMST", + "\u76ae\u57c3\u723e\u5cf6\u53ca\u5bc6\u514b\u9686\u5cf6\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "PMDT"}}, +@@ -467,7 +468,7 @@ + {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville \u6642\u9593", "DDUT", + "Dumont-d'Urville \u590f\u4ee4\u6642\u9593", "DDUST"}}, + {"Antarctica/Macquarie", new String[] {"\u9EA5\u5938\u5229\u5CF6\u6642\u9593", "MIST", +- "\u9EA5\u5938\u5229\u5CF6\u590F\u4EE4\u6642\u9593", "MIST"}}, ++ "\u9EA5\u5938\u5229\u5CF6\u590F\u4EE4\u6642\u9593", "MIDT"}}, + {"Antarctica/Mawson", new String[] {"\u83ab\u68ee\u6642\u9593", "MAWT", + "\u83ab\u68ee\u590f\u4ee4\u6642\u9593", "MAWST"}}, + {"Antarctica/McMurdo", NZST}, +@@ -505,6 +506,7 @@ + {"Asia/Brunei", new String[] {"\u6c76\u840a\u6642\u9593", "BNT", + "\u6c76\u840a\u590f\u4ee4\u6642\u9593", "BNST"}}, + {"Asia/Calcutta", IST}, ++ {"Asia/Chita", IRKT}, + {"Asia/Choibalsan", new String[] {"\u5de7\u5df4\u5c71 (Choibalsan) \u6642\u9593", "CHOT", + "\u5de7\u5df4\u5c71 (Choibalsan) \u590f\u4ee4\u6642\u9593", "CHOST"}}, + {"Asia/Chongqing", CTT}, +@@ -525,8 +527,7 @@ + {"Asia/Hong_Kong", HKT}, + {"Asia/Hovd", new String[] {"\u4faf\u5fb7 (Hovd) \u6642\u9593", "HOVT", + "\u4faf\u5fb7 (Hovd) \u590f\u4ee4\u6642\u9593", "HOVST"}}, +- {"Asia/Irkutsk", new String[] {"Irkutsk \u6642\u9593", "IRKT", +- "Irkutsk \u590f\u4ee4\u6642\u9593", "IRKST"}}, ++ {"Asia/Irkutsk", IRKT}, + {"Asia/Istanbul", EET}, + {"Asia/Jakarta", WIT}, + {"Asia/Jayapura", new String[] {"\u6771\u5370\u5ea6\u5c3c\u897f\u4e9e\u6642\u9593", "WIT", +@@ -536,14 +537,13 @@ + {"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamchatski \u6642\u9593", "PETT", + "Petropavlovsk-Kamchatski \u590f\u4ee4\u6642\u9593", "PETST"}}, + {"Asia/Karachi", PKT}, +- {"Asia/Kashgar", CTT}, ++ {"Asia/Kashgar", XJT}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, + {"Asia/Khandyga", new String[] {"\u6F22\u5730\u52A0 (Khandyga) \u6642\u9593", "YAKT", + "\u6F22\u5730\u52A0 (Khandyga) \u590F\u4EE4\u6642\u9593", "YAKST"}}, + {"Asia/Kolkata", IST}, +- {"Asia/Krasnoyarsk", new String[] {"\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u6642\u9593", "KRAT", +- "\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u590f\u4ee4\u6642\u9593", "KRAST"}}, ++ {"Asia/Krasnoyarsk", KRAT}, + {"Asia/Kuala_Lumpur", MYT}, + {"Asia/Kuching", MYT}, + {"Asia/Kuwait", ARAST}, +@@ -556,7 +556,7 @@ + "\u83f2\u5f8b\u8cd3\u590f\u4ee4\u6642\u9593", "PHST"}}, + {"Asia/Muscat", GST}, + {"Asia/Nicosia", EET}, +- {"Asia/Novokuznetsk", NOVT}, ++ {"Asia/Novokuznetsk", KRAT}, + {"Asia/Novosibirsk", NOVT}, + {"Asia/Oral", new String[] {"\u6b50\u4f5b\u6642\u9593", "ORAT", + "\u6b50\u4f5b\u590f\u4ee4\u6642\u9593", "ORAST"}}, +@@ -577,6 +577,8 @@ + {"Asia/Samarkand", UZT}, + {"Asia/Seoul", KST}, + {"Asia/Singapore", SGT}, ++ {"Asia/Srednekolymsk", new String[] {"Srednekolymsk Time", "SRET", ++ "Srednekolymsk Daylight Time", "SREDT"}}, + {"Asia/Taipei", new String[] {"\u53f0\u7063\u6a19\u6e96\u6642\u9593", "TST", + "\u53f0\u7063\u590f\u4ee4\u6642\u9593", "TDT"}}, + {"Asia/Tel_Aviv", ISRAEL}, +@@ -589,7 +591,7 @@ + {"Asia/Ujung_Pandang", CIT}, + {"Asia/Ulaanbaatar", ULAT}, + {"Asia/Ulan_Bator", ULAT}, +- {"Asia/Urumqi", CTT}, ++ {"Asia/Urumqi", XJT}, + {"Asia/Ust-Nera", new String[] {"\u70CF\u65AF\u5167\u62C9 (Ust-Nera) \u6642\u9593", "VLAT", + "\u70CF\u65AF\u5167\u62C9 (Ust-Nera) \u590F\u4EE4\u6642\u9593", "VLAST"}}, + {"Asia/Vientiane", ICT}, +@@ -621,8 +623,8 @@ + {"Australia/Canberra", EST_NSW}, + {"Australia/Currie", EST_NSW}, + {"Australia/Darwin", DARWIN}, +- {"Australia/Eucla", new String[] {"\u4E2D\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "CWST", +- "\u4E2D\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "CWST"}}, ++ {"Australia/Eucla", new String[] {"\u4E2D\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "ACWST", ++ "\u4E2D\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E)", "ACWDT"}}, + {"Australia/Hobart", TASMANIA}, + {"Australia/LHI", LORD_HOWE}, + {"Australia/Lindeman", BRISBANE}, +@@ -688,7 +690,7 @@ + {"Europe/Isle_of_Man", GMTBST}, + {"Europe/Istanbul", EET}, + {"Europe/Jersey", GMTBST}, +- {"Europe/Kaliningrad", FET}, ++ {"Europe/Kaliningrad", EET}, + {"Europe/Kiev", EET}, + {"Europe/Lisbon", WET}, + {"Europe/Ljubljana", CET}, +@@ -697,7 +699,7 @@ + {"Europe/Madrid", CET}, + {"Europe/Malta", CET}, + {"Europe/Mariehamn", EET}, +- {"Europe/Minsk", FET}, ++ {"Europe/Minsk", MSK}, + {"Europe/Monaco", CET}, + {"Europe/Moscow", MSK}, + {"Europe/Nicosia", EET}, +@@ -722,8 +724,7 @@ + {"Europe/Vatican", CET}, + {"Europe/Vienna", CET}, + {"Europe/Vilnius", EET}, +- {"Europe/Volgograd", new String[] {"\u4f0f\u723e\u52a0\u683c\u52d2\u6642\u9593", "VOLT", +- "\u4f0f\u723e\u52a0\u683c\u52d2\u590f\u4ee4\u6642\u9593", "VOLST"}}, ++ {"Europe/Volgograd", MSK}, + {"Europe/Warsaw", CET}, + {"Europe/Zagreb", CET}, + {"Europe/Zaporozhye", EET}, +@@ -776,6 +777,8 @@ + {"PRT", AST}, + {"Pacific/Apia", WST_SAMOA}, + {"Pacific/Auckland", NZST}, ++ {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST", ++ "Bougainville Daylight Time", "BST"}}, + {"Pacific/Chatham", CHAST}, + {"Pacific/Chuuk", CHUT}, + {"Pacific/Easter", EASTER}, +--- ./jdk/src/share/instrument/Reentrancy.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/instrument/Reentrancy.c Mon Jan 05 11:57:27 2015 -0800 +@@ -130,6 +130,7 @@ + error = confirmingTLSSet ( jvmtienv, + thread, + JPLIS_CURRENTLY_INSIDE_TOKEN); ++ check_phase_ret_false(error); + jplis_assert(error == JVMTI_ERROR_NONE); + if ( error != JVMTI_ERROR_NONE ) { + result = JNI_FALSE; +@@ -158,6 +159,7 @@ + error = confirmingTLSSet( jvmtienv, + thread, + JPLIS_CURRENTLY_OUTSIDE_TOKEN); ++ check_phase_ret(error); + jplis_assert(error == JVMTI_ERROR_NONE); + + } +--- ./jdk/src/share/javavm/export/jvm.h Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/javavm/export/jvm.h Mon Jan 05 11:57:27 2015 -0800 +@@ -1320,6 +1320,9 @@ + JNIEXPORT jobject JNICALL + JVM_InitAgentProperties(JNIEnv *env, jobject agent_props); + ++JNIEXPORT jstring JNICALL ++JVM_GetTemporaryDirectory(JNIEnv *env); ++ + /* Generics reflection support. + * + * Returns information about the given class's EnclosingMethod +--- ./jdk/src/share/lib/security/java.security-linux Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/lib/security/java.security-linux Mon Jan 05 11:57:27 2015 -0800 +@@ -412,8 +412,12 @@ + # + # In some environments, certain algorithms or key lengths may be undesirable + # when using SSL/TLS. This section describes the mechanism for disabling +-# algorithms during SSL/TLS security parameters negotiation, including cipher +-# suites selection, peer authentication and key exchange mechanisms. ++# algorithms during SSL/TLS security parameters negotiation, including ++# protocol version negotiation, cipher suites selection, peer authentication ++# and key exchange mechanisms. ++# ++# Disabled algorithms will not be negotiated for SSL/TLS connections, even ++# if they are enabled explicitly in an application. + # + # For PKI-based peer authentication and key exchange mechanisms, this list + # of disabled algorithms will also be checked during certification path +@@ -428,4 +432,5 @@ + # It is not guaranteed to be examined and used by other implementations. + # + # Example: +-# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 ++# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048 ++jdk.tls.disabledAlgorithms=SSLv3 +--- ./jdk/src/share/lib/security/java.security-macosx Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/lib/security/java.security-macosx Mon Jan 05 11:57:27 2015 -0800 +@@ -417,8 +417,12 @@ + # + # In some environments, certain algorithms or key lengths may be undesirable + # when using SSL/TLS. This section describes the mechanism for disabling +-# algorithms during SSL/TLS security parameters negotiation, including cipher +-# suites selection, peer authentication and key exchange mechanisms. ++# algorithms during SSL/TLS security parameters negotiation, including ++# protocol version negotiation, cipher suites selection, peer authentication ++# and key exchange mechanisms. ++# ++# Disabled algorithms will not be negotiated for SSL/TLS connections, even ++# if they are enabled explicitly in an application. + # + # For PKI-based peer authentication and key exchange mechanisms, this list + # of disabled algorithms will also be checked during certification path +@@ -433,4 +437,5 @@ + # It is not guaranteed to be examined and used by other implementations. + # + # Example: +-# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 ++# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048 ++jdk.tls.disabledAlgorithms=SSLv3 +--- ./jdk/src/share/lib/security/java.security-solaris Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/lib/security/java.security-solaris Mon Jan 05 11:57:27 2015 -0800 +@@ -416,8 +416,12 @@ + # + # In some environments, certain algorithms or key lengths may be undesirable + # when using SSL/TLS. This section describes the mechanism for disabling +-# algorithms during SSL/TLS security parameters negotiation, including cipher +-# suites selection, peer authentication and key exchange mechanisms. ++# algorithms during SSL/TLS security parameters negotiation, including ++# protocol version negotiation, cipher suites selection, peer authentication ++# and key exchange mechanisms. ++# ++# Disabled algorithms will not be negotiated for SSL/TLS connections, even ++# if they are enabled explicitly in an application. + # + # For PKI-based peer authentication and key exchange mechanisms, this list + # of disabled algorithms will also be checked during certification path +@@ -432,4 +436,5 @@ + # It is not guaranteed to be examined and used by other implementations. + # + # Example: +-# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 ++# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048 ++jdk.tls.disabledAlgorithms=SSLv3 +--- ./jdk/src/share/lib/security/java.security-windows Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/lib/security/java.security-windows Mon Jan 05 11:57:27 2015 -0800 +@@ -417,8 +417,12 @@ + # + # In some environments, certain algorithms or key lengths may be undesirable + # when using SSL/TLS. This section describes the mechanism for disabling +-# algorithms during SSL/TLS security parameters negotiation, including cipher +-# suites selection, peer authentication and key exchange mechanisms. ++# algorithms during SSL/TLS security parameters negotiation, including ++# protocol version negotiation, cipher suites selection, peer authentication ++# and key exchange mechanisms. ++# ++# Disabled algorithms will not be negotiated for SSL/TLS connections, even ++# if they are enabled explicitly in an application. + # + # For PKI-based peer authentication and key exchange mechanisms, this list + # of disabled algorithms will also be checked during certification path +@@ -433,4 +437,5 @@ + # It is not guaranteed to be examined and used by other implementations. + # + # Example: +-# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 ++# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048 ++jdk.tls.disabledAlgorithms=SSLv3 +--- ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -583,6 +583,8 @@ + LEReferenceTo<ChainSubClassRuleTable> + chainSubClassRuleTable(chainSubClassSetTable, success, chainSubClassRuleTableOffset); + le_uint16 backtrackGlyphCount = SWAPW(chainSubClassRuleTable->backtrackGlyphCount); ++ LEReferenceToArrayOf<le_uint16> backtrackClassArray(base, success, chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount); ++ if( LE_FAILURE(success) ) { return 0; } + le_uint16 inputGlyphCount = SWAPW(chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount]) - 1; + LEReferenceToArrayOf<le_uint16> inputClassArray(base, success, &chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount + 1],inputGlyphCount+2); // +2 for the lookaheadGlyphCount count + le_uint16 lookaheadGlyphCount = SWAPW(inputClassArray.getObject(inputGlyphCount, success)); +@@ -599,8 +601,6 @@ + } + + tempIterator.prev(); +- LEReferenceToArrayOf<le_uint16> backtrackClassArray(base, success, chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount); +- if( LE_FAILURE(success) ) { return 0; } + if (! matchGlyphClasses(backtrackClassArray, backtrackGlyphCount, + &tempIterator, backtrackClassDefinitionTable, success, TRUE)) { + continue; +--- ./jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -45,6 +45,9 @@ + le_int32 coverageIndex = getGlyphCoverage(base, glyphID, success); + le_uint16 eeCount = SWAPW(entryExitCount); + ++ LEReferenceToArrayOf<EntryExitRecord> ++ entryExitRecordsArrayRef(base, success, entryExitRecords, coverageIndex); ++ + if (coverageIndex < 0 || coverageIndex >= eeCount || LE_FAILURE(success)) { + glyphIterator->setCursiveGlyph(); + return 0; +--- ./jdk/src/share/native/sun/font/layout/Features.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/Features.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -40,6 +40,9 @@ + + LEReferenceTo<FeatureTable> FeatureListTable::getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const + { ++ LEReferenceToArrayOf<FeatureRecord> ++ featureRecordArrayRef(base, success, featureRecordArray, featureIndex); ++ + if (featureIndex >= SWAPW(featureCount) || LE_FAILURE(success)) { + return LEReferenceTo<FeatureTable>(); + } +--- ./jdk/src/share/native/sun/font/layout/LETableReference.h Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/LETableReference.h Mon Jan 05 11:57:27 2015 -0800 +@@ -471,7 +471,12 @@ + #endif + + const T& getObject(le_uint32 i, LEErrorCode &success) const { +- return *getAlias(i,success); ++ const T *ret = getAlias(i, success); ++ if (LE_FAILURE(success) || ret==NULL) { ++ return *(new T(0)); ++ } else { ++ return *ret; ++ } + } + + /** +--- ./jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -64,6 +64,9 @@ + LEReferenceTo<LigatureTable> ligTable(ligSetTable, success, ligTableOffset); + if(LE_FAILURE(success)) { return 0; } + le_uint16 compCount = SWAPW(ligTable->compCount) - 1; ++ LEReferenceToArrayOf<TTGlyphID> ++ componentArrayRef(base, success, ligTable->componentArray, compCount); ++ if (LE_FAILURE(success)) { return 0; } + le_int32 startPosition = glyphIterator->getCurrStreamPosition(); + TTGlyphID ligGlyph = SWAPW(ligTable->ligGlyph); + le_uint16 comp; +--- ./jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -61,6 +61,8 @@ + + le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + le_uint16 seqCount = SWAPW(sequenceCount); ++ LEReferenceToArrayOf<Offset> ++ sequenceTableOffsetArrayRef(base, success, sequenceTableOffsetArray, seqCount); + + if (LE_FAILURE(success)) { + return 0; +--- ./jdk/src/share/native/sun/misc/VMSupport.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/misc/VMSupport.c Mon Jan 05 11:57:27 2015 -0800 +@@ -53,3 +53,9 @@ + } + return (*InitAgentProperties_fp)(env, props); + } ++ ++JNIEXPORT jstring JNICALL ++Java_sun_misc_VMSupport_getVMTemporaryDirectory(JNIEnv *env, jclass cls) ++{ ++ return JVM_GetTemporaryDirectory(env); ++} +--- ./jdk/src/share/native/sun/security/smartcardio/pcsc.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/native/sun/security/smartcardio/pcsc.c Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -64,17 +64,32 @@ + + #define J2PCSC_EXCEPTION_NAME "sun/security/smartcardio/PCSCException" + ++void throwOutOfMemoryError(JNIEnv *env, const char *msg) { ++ jclass cls = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); ++ ++ if (cls != NULL) /* Otherwise an exception has already been thrown */ ++ (*env)->ThrowNew(env, cls, msg); ++ ++} ++ + void throwPCSCException(JNIEnv* env, LONG code) { + jclass pcscClass; + jmethodID constructor; + jthrowable pcscException; + + pcscClass = (*env)->FindClass(env, J2PCSC_EXCEPTION_NAME); +- assert(pcscClass != NULL); ++ if (pcscClass == NULL) { ++ return; ++ } + constructor = (*env)->GetMethodID(env, pcscClass, "<init>", "(I)V"); +- assert(constructor != NULL); +- pcscException = (jthrowable) (*env)->NewObject(env, pcscClass, constructor, (jint)code); +- (*env)->Throw(env, pcscException); ++ if (constructor == NULL) { ++ return; ++ } ++ pcscException = (jthrowable) (*env)->NewObject(env, pcscClass, ++ constructor, (jint)code); ++ if (pcscException != NULL) { ++ (*env)->Throw(env, pcscException); ++ } + } + + jboolean handleRV(JNIEnv* env, LONG code) { +@@ -93,7 +108,7 @@ + JNIEXPORT jlong JNICALL Java_sun_security_smartcardio_PCSC_SCardEstablishContext + (JNIEnv *env, jclass thisClass, jint dwScope) + { +- SCARDCONTEXT context; ++ SCARDCONTEXT context = 0; + LONG rv; + dprintf("-establishContext\n"); + rv = CALL_SCardEstablishContext(dwScope, NULL, NULL, &context); +@@ -110,7 +125,7 @@ + jobjectArray pcsc_multi2jstring(JNIEnv *env, char *spec) { + jobjectArray result; + jclass stringClass; +- char *cp, **tab; ++ char *cp, **tab = NULL; + jstring js; + int cnt = 0; + +@@ -121,6 +136,10 @@ + } + + tab = (char **)malloc(cnt * sizeof(char *)); ++ if (tab == NULL) { ++ throwOutOfMemoryError(env, NULL); ++ return NULL; ++ } + + cnt = 0; + cp = spec; +@@ -130,12 +149,26 @@ + } + + stringClass = (*env)->FindClass(env, "java/lang/String"); +- assert(stringClass != NULL); ++ if (stringClass == NULL) { ++ free(tab); ++ return NULL; ++ } + + result = (*env)->NewObjectArray(env, cnt, stringClass, NULL); +- while (cnt-- > 0) { +- js = (*env)->NewStringUTF(env, tab[cnt]); +- (*env)->SetObjectArrayElement(env, result, cnt, js); ++ if (result != NULL) { ++ while (cnt-- > 0) { ++ js = (*env)->NewStringUTF(env, tab[cnt]); ++ if ((*env)->ExceptionCheck(env)) { ++ free(tab); ++ return NULL; ++ } ++ (*env)->SetObjectArrayElement(env, result, cnt, js); ++ if ((*env)->ExceptionCheck(env)) { ++ free(tab); ++ return NULL; ++ } ++ (*env)->DeleteLocalRef(env, js); ++ } + } + free(tab); + return result; +@@ -146,8 +179,8 @@ + { + SCARDCONTEXT context = (SCARDCONTEXT)jContext; + LONG rv; +- LPTSTR mszReaders; +- DWORD size; ++ LPTSTR mszReaders = NULL; ++ DWORD size = 0; + jobjectArray result; + + dprintf1("-context: %x\n", context); +@@ -157,13 +190,20 @@ + } + dprintf1("-size: %d\n", size); + +- mszReaders = malloc(size); +- rv = CALL_SCardListReaders(context, NULL, mszReaders, &size); +- if (handleRV(env, rv)) { +- free(mszReaders); +- return NULL; ++ if (size) { ++ mszReaders = malloc(size); ++ if (mszReaders == NULL) { ++ throwOutOfMemoryError(env, NULL); ++ return NULL; ++ } ++ ++ rv = CALL_SCardListReaders(context, NULL, mszReaders, &size); ++ if (handleRV(env, rv)) { ++ free(mszReaders); ++ return NULL; ++ } ++ dprintf1("-String: %s\n", mszReaders); + } +- dprintf1("-String: %s\n", mszReaders); + + result = pcsc_multi2jstring(env, mszReaders); + free(mszReaders); +@@ -177,10 +217,13 @@ + SCARDCONTEXT context = (SCARDCONTEXT)jContext; + LONG rv; + LPCTSTR readerName; +- SCARDHANDLE card; +- DWORD proto; ++ SCARDHANDLE card = 0; ++ DWORD proto = 0; + + readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL); ++ if (readerName == NULL) { ++ return 0; ++ } + rv = CALL_SCardConnect(context, readerName, jShareMode, jPreferredProtocols, &card, &proto); + (*env)->ReleaseStringUTFChars(env, jReaderName, readerName); + dprintf1("-cardhandle: %x\n", card); +@@ -210,6 +253,9 @@ + sendPci.cbPciLength = sizeof(SCARD_IO_REQUEST); + + sbuf = (unsigned char *) ((*env)->GetByteArrayElements(env, jBuf, NULL)); ++ if (sbuf == NULL) { ++ return NULL; ++ } + rv = CALL_SCardTransmit(card, &sendPci, sbuf + ofs, len, NULL, rbuf, &rlen); + (*env)->ReleaseByteArrayElements(env, jBuf, (jbyte *)sbuf, JNI_ABORT); + +@@ -218,7 +264,12 @@ + } + + jOut = (*env)->NewByteArray(env, rlen); +- (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf); ++ if (jOut != NULL) { ++ (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf); ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } ++ } + return jOut; + } + +@@ -231,10 +282,10 @@ + DWORD readerLen = READERNAME_BUFFER_SIZE; + unsigned char atr[ATR_BUFFER_SIZE]; + DWORD atrLen = ATR_BUFFER_SIZE; +- DWORD state; +- DWORD protocol; ++ DWORD state = 0; ++ DWORD protocol = 0; + jbyteArray jArray; +- jbyte tmp; ++ jbyte status[2]; + + rv = CALL_SCardStatus(card, readerName, &readerLen, &state, &protocol, atr, &atrLen); + if (handleRV(env, rv)) { +@@ -245,13 +296,19 @@ + dprintf1("-protocol: %d\n", protocol); + + jArray = (*env)->NewByteArray(env, atrLen); ++ if (jArray == NULL) { ++ return NULL; ++ } + (*env)->SetByteArrayRegion(env, jArray, 0, atrLen, (jbyte *)atr); +- +- tmp = (jbyte)state; +- (*env)->SetByteArrayRegion(env, jStatus, 0, 1, &tmp); +- tmp = (jbyte)protocol; +- (*env)->SetByteArrayRegion(env, jStatus, 1, 1, &tmp); +- ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } ++ status[0] = (jbyte) state; ++ status[1] = (jbyte) protocol; ++ (*env)->SetByteArrayRegion(env, jStatus, 0, 2, status); ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } + return jArray; + } + +@@ -274,36 +331,78 @@ + SCARDCONTEXT context = (SCARDCONTEXT)jContext; + LONG rv; + int readers = (*env)->GetArrayLength(env, jReaderNames); +- SCARD_READERSTATE *readerState = malloc(readers * sizeof(SCARD_READERSTATE)); ++ SCARD_READERSTATE *readerState; + int i; +- jintArray jEventState; +- int *currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL); ++ jintArray jEventState = NULL; ++ int *currentState = NULL; ++ const char *readerName; ++ ++ readerState = calloc(readers, sizeof(SCARD_READERSTATE)); ++ if (readerState == NULL && readers > 0) { ++ throwOutOfMemoryError(env, NULL); ++ return NULL; ++ } ++ ++ currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL); ++ if (currentState == NULL) { ++ free(readerState); ++ return NULL; ++ } ++ ++ for (i = 0; i < readers; i++) { ++ readerState[i].szReader = NULL; ++ } + + for (i = 0; i < readers; i++) { + jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i); +- readerState[i].szReader = (*env)->GetStringUTFChars(env, jReaderName, NULL); ++ if ((*env)->ExceptionCheck(env)) { ++ goto cleanup; ++ } ++ readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL); ++ if (readerName == NULL) { ++ goto cleanup; ++ } ++ readerState[i].szReader = strdup(readerName); ++ (*env)->ReleaseStringUTFChars(env, jReaderName, readerName); ++ if (readerState[i].szReader == NULL) { ++ throwOutOfMemoryError(env, NULL); ++ goto cleanup; ++ } + readerState[i].pvUserData = NULL; + readerState[i].dwCurrentState = currentState[i]; + readerState[i].dwEventState = SCARD_STATE_UNAWARE; + readerState[i].cbAtr = 0; ++ (*env)->DeleteLocalRef(env, jReaderName); + } +- (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT); + +- rv = CALL_SCardGetStatusChange(context, (DWORD)jTimeout, readerState, readers); ++ if (readers > 0) { ++ rv = CALL_SCardGetStatusChange(context, (DWORD)jTimeout, readerState, readers); ++ if (handleRV(env, rv)) { ++ goto cleanup; ++ } ++ } + + jEventState = (*env)->NewIntArray(env, readers); ++ if (jEventState == NULL) { ++ goto cleanup; ++ } + for (i = 0; i < readers; i++) { + jint eventStateTmp; +- jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i); + dprintf3("-reader status %s: 0x%X, 0x%X\n", readerState[i].szReader, + readerState[i].dwCurrentState, readerState[i].dwEventState); +- (*env)->ReleaseStringUTFChars(env, jReaderName, readerState[i].szReader); + eventStateTmp = (jint)readerState[i].dwEventState; + (*env)->SetIntArrayRegion(env, jEventState, i, 1, &eventStateTmp); ++ if ((*env)->ExceptionCheck(env)) { ++ jEventState = NULL; ++ goto cleanup; ++ } ++ } ++cleanup: ++ (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT); ++ for (i = 0; i < readers; i++) { ++ free((char *)readerState[i].szReader); + } + free(readerState); +- +- handleRV(env, rv); + return jEventState; + } + +@@ -336,13 +435,18 @@ + { + SCARDHANDLE card = (SCARDHANDLE)jCard; + LONG rv; +- jbyte* sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL); ++ jbyte* sendBuffer; + jint sendBufferLength = (*env)->GetArrayLength(env, jSendBuffer); + jbyte receiveBuffer[MAX_STACK_BUFFER_SIZE]; + jint receiveBufferLength = MAX_STACK_BUFFER_SIZE; + ULONG returnedLength = 0; + jbyteArray jReceiveBuffer; + ++ sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL); ++ if (sendBuffer == NULL) { ++ return NULL; ++ } ++ + #ifdef J2PCSC_DEBUG + { + int k; +@@ -375,7 +479,12 @@ + #endif + + jReceiveBuffer = (*env)->NewByteArray(env, returnedLength); ++ if (jReceiveBuffer == NULL) { ++ return NULL; ++ } + (*env)->SetByteArrayRegion(env, jReceiveBuffer, 0, returnedLength, receiveBuffer); +- ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } + return jReceiveBuffer; + } +--- ./jdk/src/share/npt/utf.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/share/npt/utf.c Mon Jan 05 11:57:27 2015 -0800 +@@ -390,7 +390,7 @@ + + /* ================================================================= */ + +-#if 1 /* Test program */ ++#ifdef COMPILE_WITH_UTF_TEST /* Test program */ + + /* + * Convert any byte array into a printable string. +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Mon Jan 05 11:57:27 2015 -0800 +@@ -308,47 +308,39 @@ + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } +- +- private InputStream drainInputStream(InputStream in) ++ private static byte[] drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- j = in.available(); ++ while ((j = in.available()) > 0) { ++ a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); ++ n += in.read(a, n, j); + } +- while (j > 0) { +- a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- n += in.read(a, n, j); +- j = in.available(); +- } +- } +- return (a == null) ? +- ProcessBuilder.NullInputStream.INSTANCE : +- new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); ++ return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { +- try { +- InputStream in = this.in; +- if (in != null) { +- InputStream stragglers = drainInputStream(in); +- in.close(); +- this.in = stragglers; +- } +- } catch (IOException ignored) { } ++ synchronized (closeLock) { ++ try { ++ InputStream in = this.in; ++ // this stream is closed if and only if: in == null ++ if (in != null) { ++ byte[] stragglers = drainInputStream(in); ++ in.close(); ++ this.in = (stragglers == null) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ByteArrayInputStream(stragglers); ++ } ++ } catch (IOException ignored) {} ++ } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other methods. +- // Synchronizing helps avoid racing with drainInputStream(). ++ // Synchronizing helps avoid race with processExited(). + synchronized (closeLock) { + super.close(); + } +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Mon Jan 05 11:57:27 2015 -0800 +@@ -310,47 +310,39 @@ + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } +- +- private InputStream drainInputStream(InputStream in) ++ private static byte[] drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- j = in.available(); ++ while ((j = in.available()) > 0) { ++ a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); ++ n += in.read(a, n, j); + } +- while (j > 0) { +- a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- n += in.read(a, n, j); +- j = in.available(); +- } +- } +- return (a == null) ? +- ProcessBuilder.NullInputStream.INSTANCE : +- new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); ++ return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { +- try { +- InputStream in = this.in; +- if (in != null) { +- InputStream stragglers = drainInputStream(in); +- in.close(); +- this.in = stragglers; +- } +- } catch (IOException ignored) { } ++ synchronized (closeLock) { ++ try { ++ InputStream in = this.in; ++ // this stream is closed if and only if: in == null ++ if (in != null) { ++ byte[] stragglers = drainInputStream(in); ++ in.close(); ++ this.in = (stragglers == null) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ByteArrayInputStream(stragglers); ++ } ++ } catch (IOException ignored) {} ++ } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other methods. +- // Synchronizing helps avoid racing with drainInputStream(). ++ // Synchronizing helps avoid race with processExited(). + synchronized (closeLock) { + super.close(); + } +--- ./jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1001,6 +1001,13 @@ + switch (xev.get_type()) { + case XConstants.ButtonPress: + if (buttonState == 0) { ++ XWindowPeer parent = getToplevelXWindow(); ++ // See 6385277, 6981400. ++ if (parent != null && parent.isFocusableWindow()) { ++ // A click in a client area drops the actual focused window retaining. ++ parent.setActualFocusedWindow(null); ++ parent.requestWindowFocus(xbe.get_time(), true); ++ } + XAwtState.setAutoGrabWindow(this); + } + break; +--- ./jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Mon Jan 05 11:57:27 2015 -0800 +@@ -605,33 +605,6 @@ + + } + +- public void handleButtonPressRelease(XEvent xev) { +- /* +- * Fix for 6385277. +- * We request focus on simple Window by click in order +- * to make it behave like Frame/Dialog in this case and also to unify +- * the behaviour with what we have on MS Windows. +- * handleJavaMouseEvent() would be more suitable place to do this +- * but we want Swing to have this functionality also. +- */ +- if (xev.get_type() == XConstants.ButtonPress) { +- final XWindowPeer parentXWindow = getParentTopLevel(); +- Window parentWindow = (Window)parentXWindow.getTarget(); +- if (parentXWindow.isFocusableWindow() && parentXWindow.isSimpleWindow() && +- XKeyboardFocusManagerPeer.getInstance().getCurrentFocusedWindow() != parentWindow) +- { +- postEvent(new InvocationEvent(parentWindow, new Runnable() { +- public void run() { +- // Request focus on the EDT of 'parentWindow' because +- // XDecoratedPeer.requestWindowFocus() calls client code. +- parentXWindow.requestXFocus(); +- } +- })); +- } +- } +- super.handleButtonPressRelease(xev); +- } +- + public Dimension getMinimumSize() { + return target.getSize(); + } +--- ./jdk/src/solaris/classes/sun/awt/X11/XWindow.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XWindow.java Mon Jan 05 11:57:27 2015 -0800 +@@ -455,6 +455,7 @@ + ColorModel cm = getColorModel(); + int pixel = PixelConverter.instance.rgbToPixel(c.getRGB(), cm); + XlibWrapper.XSetWindowBackground(XToolkit.getDisplay(), getContentWindow(), pixel); ++ XlibWrapper.XClearWindow(XToolkit.getDisplay(), getContentWindow()); + } + finally { + XToolkit.awtUnlock(); +--- ./jdk/src/solaris/classes/sun/awt/windows/ThemeReader.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/windows/ThemeReader.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -41,6 +41,10 @@ + return false; + } + ++ public static boolean isXPStyleEnabled() { ++ return false; ++ } ++ + public static void paintBackground(int[] buffer, String widget, + int part, int state, int x, int y, int w, int h, int stride) { + } +--- ./jdk/src/solaris/classes/sun/nio/fs/UnixPath.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/UnixPath.java Mon Jan 05 11:57:27 2015 -0800 +@@ -482,7 +482,7 @@ + @Override + public Path normalize() { + final int count = getNameCount(); +- if (count == 0) ++ if (count == 0 || isEmpty()) + return this; + + boolean[] ignore = new boolean[count]; // true => ignore name +--- ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Mon Jan 05 11:57:27 2015 -0800 +@@ -602,9 +602,9 @@ + */ + assert(prog != NULL && argBlock != NULL); + if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch; +- if ((pprog = getBytes(env, prog)) == NULL) goto Catch; +- if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch; +- if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch; ++ if ((pprog = getBytes(env, prog)) == NULL) goto Catch; ++ if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch; ++ if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch; + c->argv[0] = pprog; + c->argc = argc + 2; + initVectorFromBlock(c->argv+1, pargBlock, argc); +@@ -693,10 +693,11 @@ + closeSafely(childenv[0]); + closeSafely(childenv[1]); + +- releaseBytes(env, prog, pprog); +- releaseBytes(env, argBlock, pargBlock); +- releaseBytes(env, envBlock, penvBlock); +- releaseBytes(env, dir, c->pdir); ++ releaseBytes(env, helperpath, phelperpath); ++ releaseBytes(env, prog, pprog); ++ releaseBytes(env, argBlock, pargBlock); ++ releaseBytes(env, envBlock, penvBlock); ++ releaseBytes(env, dir, c->pdir); + + free(c->argv); + free(c->envv); +--- ./jdk/src/solaris/native/java/net/NetworkInterface.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/NetworkInterface.c Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -530,9 +530,14 @@ + jboolean isCopy; + int ret = -1; + int sock; +- const char* name_utf; ++ const char* name_utf = NULL; + +- name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); ++ if (name != NULL) { ++ name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); ++ } else { ++ JNU_ThrowNullPointerException(env, "network interface name is NULL"); ++ return ret; ++ } + + if ((sock =openSocketWithFallback(env, name_utf)) < 0) { + (*env)->ReleaseStringUTFChars(env, name, name_utf); +@@ -555,7 +560,12 @@ + const char* name_utf; + int flags = 0; + +- name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); ++ if (name != NULL) { ++ name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); ++ } else { ++ JNU_ThrowNullPointerException(env, "network interface name is NULL"); ++ return -1; ++ } + + if ((sock = openSocketWithFallback(env, name_utf)) < 0) { + (*env)->ReleaseStringUTFChars(env, name, name_utf); +@@ -1026,6 +1036,7 @@ + */ + + #ifdef AF_INET6 ++// unused arg ifname and struct if2 + static int openSocketWithFallback(JNIEnv *env, const char *ifname){ + int sock; + struct ifreq if2; +@@ -1261,9 +1272,14 @@ + + static int getMTU(JNIEnv *env, int sock, const char *ifname) { + struct ifreq if2; ++ memset((char *) &if2, 0, sizeof(if2)); + +- memset((char *) &if2, 0, sizeof(if2)); +- strcpy(if2.ifr_name, ifname); ++ if (ifname != NULL) { ++ strcpy(if2.ifr_name, ifname); ++ } else { ++ JNU_ThrowNullPointerException(env, "network interface name is NULL"); ++ return -1; ++ } + + if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) { + NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed"); +--- ./jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1625,10 +1625,12 @@ + static jmethodID ni_ctrID; + static jfieldID ni_indexID; + static jfieldID ni_addrsID; ++ static jfieldID ni_nameID; + + jobjectArray addrArray; + jobject addr; + jobject ni; ++ jobject ni_name; + + struct in_addr in; + struct in_addr *inP = ∈ +@@ -1691,6 +1693,8 @@ + ni_addrsID = (*env)->GetFieldID(env, c, "addrs", + "[Ljava/net/InetAddress;"); + CHECK_NULL_RETURN(ni_addrsID, NULL); ++ ni_nameID = (*env)->GetFieldID(env, c,"name", "Ljava/lang/String;"); ++ CHECK_NULL_RETURN(ni_nameID, NULL); + ni_class = (*env)->NewGlobalRef(env, c); + CHECK_NULL_RETURN(ni_class, NULL); + } +@@ -1712,6 +1716,9 @@ + CHECK_NULL_RETURN(addrArray, NULL); + (*env)->SetObjectArrayElement(env, addrArray, 0, addr); + (*env)->SetObjectField(env, ni, ni_addrsID, addrArray); ++ if (ni_name != NULL) { ++ (*env)->SetObjectField(env, ni, ni_nameID, ni_name); ++ } + return ni; + } + +@@ -1728,14 +1735,16 @@ + static jfieldID ni_indexID; + static jfieldID ni_addrsID; + static jclass ia_class; ++ static jfieldID ni_nameID; + static jmethodID ia_anyLocalAddressID; + +- int index; ++ int index = 0; + int len = sizeof(index); + + jobjectArray addrArray; + jobject addr; + jobject ni; ++ jobject ni_name; + + #ifdef __linux__ + /* +@@ -1775,6 +1784,8 @@ + "anyLocalAddress", + "()Ljava/net/InetAddress;"); + CHECK_NULL_RETURN(ia_anyLocalAddressID, NULL); ++ ni_nameID = (*env)->GetFieldID(env, c,"name", "Ljava/lang/String;"); ++ CHECK_NULL_RETURN(ni_nameID, NULL); + ni_class = (*env)->NewGlobalRef(env, c); + CHECK_NULL_RETURN(ni_class, NULL); + } +@@ -1835,6 +1846,10 @@ + CHECK_NULL_RETURN(addrArray, NULL); + (*env)->SetObjectArrayElement(env, addrArray, 0, addr); + (*env)->SetObjectField(env, ni, ni_addrsID, addrArray); ++ ni_name = (*env)->NewStringUTF(env, ""); ++ if (ni_name != NULL) { ++ (*env)->SetObjectField(env, ni, ni_nameID, ni_name); ++ } + return ni; + } + #endif +--- ./jdk/src/solaris/native/java/util/TimeZone_md.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/native/java/util/TimeZone_md.c Mon Jan 05 11:57:27 2015 -0800 +@@ -172,7 +172,6 @@ + break; + } + if ((fd = open(pathname, O_RDONLY)) == -1) { +- fd = 0; + break; + } + if (read(fd, dbuf, size) != (ssize_t) size) { +@@ -188,7 +187,7 @@ + free((void *) dbuf); + dbuf = NULL; + (void) close(fd); +- fd = 0; ++ fd = -1; + } + free((void *) pathname); + pathname = NULL; +@@ -203,7 +202,7 @@ + if (pathname != NULL) { + free((void *) pathname); + } +- if (fd != 0) { ++ if (fd != -1) { + (void) close(fd); + } + if (dbuf != NULL) { +--- ./jdk/src/solaris/native/sun/security/smartcardio/MUSCLE/pcsclite.h Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/native/sun/security/smartcardio/MUSCLE/pcsclite.h Mon Jan 05 11:57:27 2015 -0800 +@@ -62,6 +62,8 @@ + + #define MAX_ATR_SIZE 33 /* Maximum ATR size */ + ++#ifndef __APPLE__ ++ + typedef struct + { + const char *szReader; +@@ -73,9 +75,6 @@ + } + SCARD_READERSTATE_A; + +-typedef SCARD_READERSTATE_A SCARD_READERSTATE, *PSCARD_READERSTATE_A, +- *LPSCARD_READERSTATE_A; +- + typedef struct _SCARD_IO_REQUEST + { + unsigned long dwProtocol; /* Protocol identifier */ +@@ -83,6 +82,33 @@ + } + SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; + ++#else // __APPLE__ ++ ++#pragma pack(1) ++typedef struct ++{ ++ const char *szReader; ++ void *pvUserData; ++ uint32_t dwCurrentState; ++ uint32_t dwEventState; ++ uint32_t cbAtr; ++ unsigned char rgbAtr[MAX_ATR_SIZE]; ++} ++SCARD_READERSTATE_A; ++ ++typedef struct _SCARD_IO_REQUEST ++{ ++ uint32_t dwProtocol; /* Protocol identifier */ ++ uint32_t cbPciLength; /* Protocol Control Inf Length */ ++} ++SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; ++#pragma pack() ++ ++#endif // __APPLE__ ++ ++typedef SCARD_READERSTATE_A SCARD_READERSTATE, *PSCARD_READERSTATE_A, ++ *LPSCARD_READERSTATE_A; ++ + typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST; + + extern SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, +--- ./jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -32,8 +32,6 @@ + + #include <winscard.h> + +-#include <jni_util.h> +- + #include "sun_security_smartcardio_PlatformPCSC.h" + + #include "pcsc_md.h" +@@ -50,12 +48,40 @@ + FPTR_SCardEndTransaction scardEndTransaction; + FPTR_SCardControl scardControl; + ++/* ++ * Throws a Java Exception by name ++ */ ++void throwByName(JNIEnv *env, const char *name, const char *msg) ++{ ++ jclass cls = (*env)->FindClass(env, name); ++ ++ if (cls != 0) /* Otherwise an exception has already been thrown */ ++ (*env)->ThrowNew(env, cls, msg); ++} ++ ++/* ++ * Throws java.lang.NullPointerException ++ */ ++void throwNullPointerException(JNIEnv *env, const char *msg) ++{ ++ throwByName(env, "java/lang/NullPointerException", msg); ++} ++ ++/* ++ * Throws java.io.IOException ++ */ ++void throwIOException(JNIEnv *env, const char *msg) ++{ ++ throwByName(env, "java/io/IOException", msg); ++} ++ ++ + void *findFunction(JNIEnv *env, void *hModule, char *functionName) { + void *fAddress = dlsym(hModule, functionName); + if (fAddress == NULL) { + char errorMessage[256]; + snprintf(errorMessage, sizeof(errorMessage), "Symbol not found: %s", functionName); +- JNU_ThrowNullPointerException(env, errorMessage); ++ throwNullPointerException(env, errorMessage); + return NULL; + } + return fAddress; +@@ -64,21 +90,56 @@ + JNIEXPORT void JNICALL Java_sun_security_smartcardio_PlatformPCSC_initialize + (JNIEnv *env, jclass thisClass, jstring jLibName) { + const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL); ++ if (libName == NULL) { ++ throwNullPointerException(env, "PCSC library name is null"); ++ return; ++ } + hModule = dlopen(libName, RTLD_LAZY); + (*env)->ReleaseStringUTFChars(env, jLibName, libName); + + if (hModule == NULL) { +- JNU_ThrowIOException(env, dlerror()); ++ throwIOException(env, dlerror()); + return; + } + scardEstablishContext = (FPTR_SCardEstablishContext)findFunction(env, hModule, "SCardEstablishContext"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardConnect = (FPTR_SCardConnect) findFunction(env, hModule, "SCardConnect"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardDisconnect = (FPTR_SCardDisconnect) findFunction(env, hModule, "SCardDisconnect"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardStatus = (FPTR_SCardStatus) findFunction(env, hModule, "SCardStatus"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardGetStatusChange = (FPTR_SCardGetStatusChange) findFunction(env, hModule, "SCardGetStatusChange"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardTransmit = (FPTR_SCardTransmit) findFunction(env, hModule, "SCardTransmit"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardListReaders = (FPTR_SCardListReaders) findFunction(env, hModule, "SCardListReaders"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardBeginTransaction = (FPTR_SCardBeginTransaction)findFunction(env, hModule, "SCardBeginTransaction"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardEndTransaction = (FPTR_SCardEndTransaction) findFunction(env, hModule, "SCardEndTransaction"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } ++#ifndef __APPLE__ + scardControl = (FPTR_SCardControl) findFunction(env, hModule, "SCardControl"); ++#else ++ scardControl = (FPTR_SCardControl) findFunction(env, hModule, "SCardControl132"); ++#endif // __APPLE__ + } +--- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Mon Jan 05 11:57:27 2015 -0800 +@@ -253,7 +253,7 @@ + if (file == null) { + file = getDesktop(); + } +- return file; ++ return checkFile(file); + } else if (key.equals("roots")) { + // Should be "History" and "Desktop" ? + if (roots == null) { +@@ -264,11 +264,11 @@ + roots = (File[])super.get(key); + } + } +- return roots; ++ return checkFiles(roots); + } else if (key.equals("fileChooserComboBoxFolders")) { + Win32ShellFolder2 desktop = getDesktop(); + +- if (desktop != null) { ++ if (desktop != null && checkFile(desktop) != null) { + ArrayList<File> folders = new ArrayList<File>(); + Win32ShellFolder2 drives = getDrives(); + +@@ -279,7 +279,7 @@ + + folders.add(desktop); + // Add all second level folders +- File[] secondLevelFolders = desktop.listFiles(); ++ File[] secondLevelFolders = checkFiles(desktop.listFiles()); + Arrays.sort(secondLevelFolders); + for (File secondLevelFolder : secondLevelFolders) { + Win32ShellFolder2 folder = (Win32ShellFolder2) secondLevelFolder; +@@ -287,7 +287,7 @@ + folders.add(folder); + // Add third level for "My Computer" + if (folder.equals(drives)) { +- File[] thirdLevelFolders = folder.listFiles(); ++ File[] thirdLevelFolders = checkFiles(folder.listFiles()); + if (thirdLevelFolders != null && thirdLevelFolders.length > 0) { + List<File> thirdLevelFoldersList = Arrays.asList(thirdLevelFolders); + +@@ -297,7 +297,7 @@ + } + } + } +- return folders.toArray(new File[folders.size()]); ++ return checkFiles(folders); + } else { + return super.get(key); + } +@@ -334,7 +334,7 @@ + } + } + } +- return folders.toArray(new File[folders.size()]); ++ return checkFiles(folders); + } else if (key.startsWith("fileChooserIcon ")) { + String name = key.substring(key.indexOf(" ") + 1); + +@@ -380,6 +380,47 @@ + return null; + } + ++ private File checkFile(File file) { ++ SecurityManager sm = System.getSecurityManager(); ++ return (sm == null || file == null) ? file : checkFile(file, sm); ++ } ++ ++ private File checkFile(File file, SecurityManager sm) { ++ try { ++ sm.checkRead(file.getPath()); ++ return file; ++ } catch (SecurityException se) { ++ return null; ++ } ++ } ++ ++ private File[] checkFiles(File[] files) { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm == null || files == null || files.length == 0) { ++ return files; ++ } ++ return checkFiles(Arrays.asList(files), sm); ++ } ++ ++ private File[] checkFiles(List<File> files) { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm == null || files.isEmpty()) { ++ return files.toArray(new File[files.size()]); ++ } ++ return checkFiles(files, sm); ++ } ++ ++ private File[] checkFiles(List<File> files, SecurityManager sm) { ++ List<File> checkedFiles = new ArrayList<File>(files.size()); ++ for (File file: files) { ++ if(checkFile(file, sm) != null){ ++ checkedFiles.add(file); ++ } ++ } ++ ++ return checkedFiles.toArray(new File[checkedFiles.size()]); ++ } ++ + /** + * Does <code>dir</code> represent a "computer" such as a node on the network, or + * "My Computer" on the desktop. +--- ./jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -58,6 +58,8 @@ + private static final Lock writeLock = readWriteLock.writeLock(); + private static volatile boolean valid = false; + ++ static volatile boolean xpStyleEnabled; ++ + static void flush() { + // Could be called on Toolkit thread, so do not try to aquire locks + // to avoid deadlock with theme initialization +@@ -66,6 +68,10 @@ + + public native static boolean isThemed(); + ++ public static boolean isXPStyleEnabled() { ++ return xpStyleEnabled; ++ } ++ + // this should be called only with writeLock held + private static Long getThemeImpl(String widget) { + Long theme = widgetToTheme.get(widget); +--- ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Mon Jan 05 11:57:27 2015 -0800 +@@ -36,6 +36,7 @@ + import java.beans.PropertyChangeListener; + import java.security.AccessController; + import java.security.PrivilegedAction; ++import sun.awt.AppContext; + import sun.awt.AWTAutoShutdown; + import sun.awt.AppContext; + import sun.awt.SunToolkit; +@@ -70,6 +71,9 @@ + + private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.windows.WToolkit"); + ++ // Desktop property which specifies whether XP visual styles are in effect ++ public static final String XPSTYLE_THEME_ACTIVE = "win.xpstyle.themeActive"; ++ + static GraphicsConfiguration config; + + // System clipboard. +@@ -829,7 +833,7 @@ + private synchronized void lazilyInitWProps() { + if (wprops == null) { + wprops = new WDesktopProperties(this); +- updateProperties(); ++ updateProperties(wprops.getProperties()); + } + } + +@@ -864,27 +868,41 @@ + * Windows doesn't always send WM_SETTINGCHANGE when it should. + */ + private void windowsSettingChange() { ++ // JDK-8039383: Have to update the value of XPSTYLE_THEME_ACTIVE property ++ // as soon as possible to prevent NPE and other errors because theme data ++ // has become unavailable. ++ final Map<String, Object> props = getWProps(); ++ if (props == null) { ++ // props has not been initialized, so we have nothing to update ++ return; ++ } ++ ++ updateXPStyleEnabled(props.get(XPSTYLE_THEME_ACTIVE)); ++ + if (AppContext.getAppContext() == null) { + // We cannot post the update to any EventQueue. Listeners will + // be called on EDTs by DesktopPropertyChangeSupport +- updateProperties(); ++ updateProperties(props); + } else { ++ // Cannot update on Toolkit thread. ++ // DesktopPropertyChangeSupport will call listeners on Toolkit ++ // thread if it has AppContext (standalone mode) + EventQueue.invokeLater(new Runnable() { + @Override + public void run() { +- updateProperties(); ++ updateProperties(props); + } + }); + } + } + +- private synchronized void updateProperties() { +- if (null == wprops) { +- // wprops has not been initialized, so we have nothing to update ++ private synchronized void updateProperties(final Map<String, Object> props) { ++ if (null == props) { + return; + } + +- Map<String, Object> props = wprops.getProperties(); ++ updateXPStyleEnabled(props.get(XPSTYLE_THEME_ACTIVE)); ++ + for (String propName : props.keySet()) { + Object val = props.get(propName); + if (log.isLoggable(PlatformLogger.FINER)) { +@@ -1013,6 +1031,14 @@ + + private native synchronized int getNumberOfButtonsImpl(); + ++ private synchronized Map<String, Object> getWProps() { ++ return (wprops != null) ? wprops.getProperties() : null; ++ } ++ ++ private void updateXPStyleEnabled(final Object dskProp) { ++ ThemeReader.xpStyleEnabled = Boolean.TRUE.equals(dskProp); ++ } ++ + @Override + public int getNumberOfButtons(){ + if (numberOfButtons == 0) { +--- ./jdk/src/windows/native/java/net/NetworkInterface.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/java/net/NetworkInterface.c Mon Jan 05 11:57:27 2015 -0800 +@@ -175,7 +175,7 @@ + int count; + netif *netifP; + DWORD i; +- int lo=0, eth=0, tr=0, fddi=0, ppp=0, sl=0, net=0, wlen=0; ++ int lo=0, eth=0, tr=0, fddi=0, ppp=0, sl=0, wlan=0, net=0, wlen=0; + + /* + * Ask the IP Helper library to enumerate the adapters +@@ -215,15 +215,15 @@ + */ + switch (ifrowP->dwType) { + case MIB_IF_TYPE_ETHERNET: +- sprintf(dev_name, "eth%d", eth++); ++ _snprintf_s(dev_name, 8, _TRUNCATE, "eth%d", eth++); + break; + + case MIB_IF_TYPE_TOKENRING: +- sprintf(dev_name, "tr%d", tr++); ++ _snprintf_s(dev_name, 8, _TRUNCATE, "tr%d", tr++); + break; + + case MIB_IF_TYPE_FDDI: +- sprintf(dev_name, "fddi%d", fddi++); ++ _snprintf_s(dev_name, 8, _TRUNCATE, "fddi%d", fddi++); + break; + + case MIB_IF_TYPE_LOOPBACK: +@@ -231,20 +231,24 @@ + if (lo > 0) { + continue; + } +- strcpy(dev_name, "lo"); ++ strncpy_s(dev_name, 8, "lo", _TRUNCATE); + lo++; + break; + + case MIB_IF_TYPE_PPP: +- sprintf(dev_name, "ppp%d", ppp++); ++ _snprintf_s(dev_name, 8, _TRUNCATE, "ppp%d", ppp++); + break; + + case MIB_IF_TYPE_SLIP: +- sprintf(dev_name, "sl%d", sl++); ++ _snprintf_s(dev_name, 8, _TRUNCATE, "sl%d", sl++); ++ break; ++ ++ case IF_TYPE_IEEE80211: ++ _snprintf_s(dev_name, 8, _TRUNCATE, "wlan%d", wlan++); + break; + + default: +- sprintf(dev_name, "net%d", net++); ++ _snprintf_s(dev_name, 8, _TRUNCATE, "net%d", net++); + } + + /* +@@ -409,6 +413,7 @@ + case MIB_IF_TYPE_TOKENRING: + case MIB_IF_TYPE_FDDI: + case MIB_IF_TYPE_LOOPBACK: ++ case IF_TYPE_IEEE80211: + /** + * Contrary to what it seems to indicate, dwBCastAddr doesn't + * contain the broadcast address but 0 or 1 depending on whether +@@ -856,7 +861,7 @@ + MIB_IFROW *ifRowP; + ifRowP = getIF(index); + if (ifRowP != NULL) { +- ret = ifRowP->dwAdminStatus == 1 && ++ ret = ifRowP->dwAdminStatus == MIB_IF_ADMIN_STATUS_UP && + (ifRowP->dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL || + ifRowP->dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED); + free(ifRowP); +@@ -949,6 +954,7 @@ + case MIB_IF_TYPE_ETHERNET: + case MIB_IF_TYPE_TOKENRING: + case MIB_IF_TYPE_FDDI: ++ case IF_TYPE_IEEE80211: + len = ifRowP->dwPhysAddrLen; + ret = (*env)->NewByteArray(env, len); + if (!IS_NULL(ret)) { +--- ./jdk/src/windows/native/java/net/NetworkInterface.h Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/java/net/NetworkInterface.h Mon Jan 05 11:57:27 2015 -0800 +@@ -88,4 +88,9 @@ + + int enumInterfaces(JNIEnv *env, netif **netifPP); + ++// Windows Visa (and later) only..... ++#ifndef IF_TYPE_IEEE80211 ++#define IF_TYPE_IEEE80211 71 + #endif ++ ++#endif +--- ./jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c Mon Jan 05 11:57:27 2015 -0800 +@@ -43,6 +43,7 @@ + #include "java_net_SocketOptions.h" + #include "java_net_NetworkInterface.h" + ++#include "NetworkInterface.h" + #include "jvm.h" + #include "jni_util.h" + #include "net_util.h" +@@ -1638,6 +1639,33 @@ + return (*env)->GetIntField(env, nif, ni_indexID); + } + ++static int isAdapterIpv6Enabled(JNIEnv *env, int index) { ++ netif *ifList, *curr; ++ int ipv6Enabled = 0; ++ if (getAllInterfacesAndAddresses (env, &ifList) < 0) { ++ return ipv6Enabled; ++ } ++ ++ /* search by index */ ++ curr = ifList; ++ while (curr != NULL) { ++ if (index == curr->index) { ++ break; ++ } ++ curr = curr->next; ++ } ++ ++ /* if found ipv6Index != 0 then interface is configured with IPV6 */ ++ if ((curr != NULL) && (curr->ipv6Index !=0)) { ++ ipv6Enabled = 1; ++ } ++ ++ /* release the interface list */ ++ free_netif(ifList); ++ ++ return ipv6Enabled; ++} ++ + /* + * Sets the multicast interface. + * +@@ -1697,7 +1725,6 @@ + struct in_addr in; + + in.s_addr = htonl(getInetAddress_addr(env, value)); +- + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, + (const char*)&in, sizeof(in)) < 0) { + NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", +@@ -1728,19 +1755,20 @@ + } + index = (*env)->GetIntField(env, value, ni_indexID); + +- if (setsockopt(fd1, IPPROTO_IPV6, IPV6_MULTICAST_IF, ++ if ( isAdapterIpv6Enabled(env, index) != 0 ) { ++ if (setsockopt(fd1, IPPROTO_IPV6, IPV6_MULTICAST_IF, + (const char*)&index, sizeof(index)) < 0) { +- if (errno == EINVAL && index > 0) { +- JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", +- "IPV6_MULTICAST_IF failed (interface has IPv4 " +- "address only?)"); +- } else { +- NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", ++ if (errno == EINVAL && index > 0) { ++ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", ++ "IPV6_MULTICAST_IF failed (interface has IPv4 " ++ "address only?)"); ++ } else { ++ NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", + "Error setting socket option"); ++ } ++ return; + } +- return; + } +- + /* If there are any IPv4 addresses on this interface then + * repeat the operation on the IPv4 fd */ + +@@ -1791,7 +1819,6 @@ + char c; + } optval; + int ipv6_supported = ipv6_available(); +- + fd = getFD(env, this); + + if (ipv6_supported) { +@@ -1892,42 +1919,21 @@ + } + + /* +- * Return the multicast interface: + * +- * SocketOptions.IP_MULTICAST_IF +- * IPv4: Query IPPROTO_IP/IP_MULTICAST_IF +- * Create InetAddress +- * IP_MULTICAST_IF returns struct ip_mreqn on 2.2 +- * kernel but struct in_addr on 2.4 kernel +- * IPv6: Query IPPROTO_IPV6 / IPV6_MULTICAST_IF or +- * obtain from impl is Linux 2.2 kernel +- * If index == 0 return InetAddress representing +- * anyLocalAddress. +- * If index > 0 query NetworkInterface by index +- * and returns addrs[0] ++ * called by getMulticastInterface to retrieve a NetworkInterface ++ * configured for IPv4. ++ * The ipv4Mode parameter, is a closet boolean, which allows for a NULL return, ++ * or forces the creation of a NetworkInterface object with null data. ++ * It relates to its calling context in getMulticastInterface. ++ * ipv4Mode == 1, the context is IPV4 processing only. ++ * ipv4Mode == 0, the context is IPV6 processing + * +- * SocketOptions.IP_MULTICAST_IF2 +- * IPv4: Query IPPROTO_IP/IP_MULTICAST_IF +- * Query NetworkInterface by IP address and +- * return the NetworkInterface that the address +- * is bound too. +- * IPv6: Query IPPROTO_IPV6 / IPV6_MULTICAST_IF +- * (except Linux .2 kernel) +- * Query NetworkInterface by index and +- * return NetworkInterface. + */ +-jobject getMulticastInterface(JNIEnv *env, jobject this, int fd, int fd1, jint opt) { +- jboolean isIPV4 = !ipv6_available() || fd1 == -1; +- +- /* +- * IPv4 implementation +- */ +- if (isIPV4) { ++static jobject getIPv4NetworkInterface (JNIEnv *env, jobject this, int fd, jint opt, int ipv4Mode) { + static jclass inet4_class; + static jmethodID inet4_ctrID; + +- static jclass ni_class; +- static jmethodID ni_ctrID; ++ static jclass ni_class; static jmethodID ni_ctrID; + static jfieldID ni_indexID; + static jfieldID ni_addrsID; + +@@ -1938,7 +1944,6 @@ + struct in_addr in; + struct in_addr *inP = ∈ + int len = sizeof(struct in_addr); +- + if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, + (char *)inP, &len) < 0) { + NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", +@@ -1990,24 +1995,58 @@ + if (ni) { + return ni; + } ++ if (ipv4Mode) { ++ ni = (*env)->NewObject(env, ni_class, ni_ctrID, 0); ++ CHECK_NULL_RETURN(ni, NULL); + +- /* +- * The address doesn't appear to be bound at any known +- * NetworkInterface. Therefore we construct a NetworkInterface +- * with this address. +- */ +- ni = (*env)->NewObject(env, ni_class, ni_ctrID, 0); +- CHECK_NULL_RETURN(ni, NULL); ++ (*env)->SetIntField(env, ni, ni_indexID, -1); ++ addrArray = (*env)->NewObjectArray(env, 1, inet4_class, NULL); ++ CHECK_NULL_RETURN(addrArray, NULL); ++ (*env)->SetObjectArrayElement(env, addrArray, 0, addr); ++ (*env)->SetObjectField(env, ni, ni_addrsID, addrArray); ++ } else { ++ ni = NULL; ++ } ++ return ni; ++} + +- (*env)->SetIntField(env, ni, ni_indexID, -1); +- addrArray = (*env)->NewObjectArray(env, 1, inet4_class, NULL); +- CHECK_NULL_RETURN(addrArray, NULL); +- (*env)->SetObjectArrayElement(env, addrArray, 0, addr); +- (*env)->SetObjectField(env, ni, ni_addrsID, addrArray); +- return ni; ++/* ++ * Return the multicast interface: ++ * ++ * SocketOptions.IP_MULTICAST_IF ++ * IPv4: Query IPPROTO_IP/IP_MULTICAST_IF ++ * Create InetAddress ++ * IP_MULTICAST_IF returns struct ip_mreqn on 2.2 ++ * kernel but struct in_addr on 2.4 kernel ++ * IPv6: Query IPPROTO_IPV6 / IPV6_MULTICAST_IF or ++ * obtain from impl is Linux 2.2 kernel ++ * If index == 0 return InetAddress representing ++ * anyLocalAddress. ++ * If index > 0 query NetworkInterface by index ++ * and returns addrs[0] ++ * ++ * SocketOptions.IP_MULTICAST_IF2 ++ * IPv4: Query IPPROTO_IP/IP_MULTICAST_IF ++ * Query NetworkInterface by IP address and ++ * return the NetworkInterface that the address ++ * is bound too. ++ * IPv6: Query IPPROTO_IPV6 / IPV6_MULTICAST_IF ++ * (except Linux .2 kernel) ++ * Query NetworkInterface by index and ++ * return NetworkInterface. ++ */ ++jobject getMulticastInterface(JNIEnv *env, jobject this, int fd, int fd1, jint opt) { ++ jboolean isIPV4 = !ipv6_available() || fd1 == -1; ++ ++ /* ++ * IPv4 implementation ++ */ ++ if (isIPV4) { ++ jobject netObject = NULL; // return is either an addr or a netif ++ netObject = getIPv4NetworkInterface(env, this, fd, opt, 1); ++ return netObject; + } + +- + /* + * IPv6 implementation + */ +@@ -2097,6 +2136,13 @@ + + addr = (*env)->GetObjectArrayElement(env, addrArray, 0); + return addr; ++ } else if (index == 0) { // index == 0 typically means IPv6 not configured on the interfaces ++ // falling back to treat interface as configured for IPv4 ++ jobject netObject = NULL; ++ netObject = getIPv4NetworkInterface(env, this, fd, opt, 0); ++ if (netObject != NULL) { ++ return netObject; ++ } + } + + /* +@@ -2121,6 +2167,8 @@ + } + return NULL; + } ++ ++ + /* + * Returns relevant info as a jint. + * +--- ./jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c Mon Jan 05 11:57:27 2015 -0800 +@@ -576,6 +576,7 @@ + { + /* fields on this */ + jint port; ++ jint scope; + jint timeout = (*env)->GetIntField(env, this, psi_timeoutID); + jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID); + jobject fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID); +@@ -751,9 +752,12 @@ + return; + } + setInet6Address_ipaddress(env, socketAddressObj, (const char *)&him.him6.sin6_addr); +- + setInetAddress_family(env, socketAddressObj, IPv6); +- setInet6Address_scopeid(env, socketAddressObj, him.him6.sin6_scope_id); ++ scope = him.him6.sin6_scope_id; ++ (*env)->SetIntField(env, socketAddressObj, ia6_scopeidID, scope); ++ if(scope>0) { ++ (*env)->SetBooleanField(env, socketAddressObj, ia6_scopeidsetID, JNI_TRUE); ++ } + } + /* fields common to AF_INET and AF_INET6 */ + +--- ./jdk/src/windows/native/sun/security/krb5/NativeCreds.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/sun/security/krb5/NativeCreds.c Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -397,7 +397,7 @@ + jobject ticketFlags, startTime, endTime, krbCreds = NULL; + jobject authTime, renewTillTime, hostAddresses = NULL; + KERB_EXTERNAL_TICKET *msticket; +- int found_in_cache = 0; ++ int found = 0; + FILETIME Now, EndTime, LocalEndTime; + + int i, netypes; +@@ -485,7 +485,7 @@ + if (CompareFileTime(&Now, &LocalEndTime) < 0) { + for (i=0; i<netypes; i++) { + if (etypes[i] == msticket->SessionKey.KeyType) { +- found_in_cache = 1; ++ found = 1; + if (native_debug) { + printf("LSA: Valid etype found: %d\n", etypes[i]); + } +@@ -495,7 +495,7 @@ + } + } + +- if (!found_in_cache) { ++ if (!found) { + if (native_debug) { + printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n"); + } +@@ -538,6 +538,13 @@ + + // got the native MS Kerberos TGT + msticket = &(pTicketResponse->Ticket); ++ if (msticket->SessionKey.KeyType != etypes[i]) { ++ if (native_debug) { ++ printf("LSA: Response etype is %d for %d. Retry.\n", msticket->SessionKey.KeyType, etypes[i]); ++ } ++ continue; ++ } ++ found = 1; + break; + } + } +@@ -590,6 +597,10 @@ + PUCHAR Value; + } KERB_CRYPTO_KEY, *PKERB_CRYPTO_KEY; + ++ if (!found) { ++ break; ++ } ++ + */ + // Build a com.sun.security.krb5.Ticket + ticket = BuildTicket(env, msticket->EncodedTicket, +--- ./jdk/src/windows/native/sun/windows/awt_Component.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Component.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -491,7 +491,12 @@ + * member is referred in the GetClassName method of AwtLabel class. + * So m_peerObject member must be set here. + */ +- m_peerObject = env->NewGlobalRef(peer); ++ if (m_peerObject == NULL) { ++ m_peerObject = env->NewGlobalRef(peer); ++ } else { ++ assert(env->IsSameObject(m_peerObject, peer)); ++ } ++ + RegisterClass(); + + jobject target = env->GetObjectField(peer, AwtObject::targetID); +@@ -2126,19 +2131,7 @@ + } + + jlong getMessageTimeUTC() { +- return windowsToUTC(getMessageTimeWindows()); +- } +- +- // If calling order of GetTickCount and JVM_CurrentTimeMillis +- // is swapped, it would sometimes give different result. +- // Anyway, we would not always have determinism +- // and sortedness of time conversion here (due to Windows's +- // timers peculiarities). Having some euristic algorithm might +- // help here. +- jlong windowsToUTC(DWORD windowsTime) { +- jlong offset = ::GetTickCount() - windowsTime; +- jlong jvm_time = ::JVM_CurrentTimeMillis(NULL, 0); +- return jvm_time - offset; ++ return ::JVM_CurrentTimeMillis(NULL, 0); + } + } //TimeHelper + +@@ -3561,7 +3554,7 @@ + + + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_PRESSED, +- TimeHelper::windowsToUTC(msg.time), jkey, character, ++ TimeHelper::getMessageTimeUTC(), jkey, character, + modifiers, keyLocation, (jlong)wkey, &msg); + + // bugid 4724007: Windows does not create a WM_CHAR for the Del key +@@ -3571,7 +3564,7 @@ + // for Java - we don't want Windows trying to process it). + if (jkey == java_awt_event_KeyEvent_VK_DELETE) { + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_TYPED, +- TimeHelper::windowsToUTC(msg.time), ++ TimeHelper::getMessageTimeUTC(), + java_awt_event_KeyEvent_VK_UNDEFINED, + character, modifiers, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0); +@@ -3603,7 +3596,7 @@ + UpdateDynPrimaryKeymap(wkey, jkey, keyLocation, modifiers); + + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_RELEASED, +- TimeHelper::windowsToUTC(msg.time), jkey, character, ++ TimeHelper::getMessageTimeUTC(), jkey, character, + modifiers, keyLocation, (jlong)wkey, &msg); + return mrConsume; + } +@@ -3648,7 +3641,7 @@ + + jint modifiers = GetJavaModifiers(); + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_TYPED, +- TimeHelper::windowsToUTC(msg.time), ++ TimeHelper::getMessageTimeUTC(), + java_awt_event_KeyEvent_VK_UNDEFINED, + unicodeChar, modifiers, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, +@@ -3717,7 +3710,7 @@ + InitMessage(&msg, message, character, + MAKELPARAM(repCnt, flags)); + SendKeyEventToFocusOwner(java_awt_event_KeyEvent_KEY_TYPED, +- TimeHelper::windowsToUTC(msg.time), ++ TimeHelper::getMessageTimeUTC(), + java_awt_event_KeyEvent_VK_UNDEFINED, + unicodeChar, modifiers, + java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0, +--- ./jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Mon Jan 05 11:57:27 2015 -0800 +@@ -325,7 +325,7 @@ + + MsgRouting AwtTrayIcon::WmMouseDown(UINT flags, int x, int y, int button) + { +- jlong now = TimeHelper::windowsToUTC(::GetTickCount()); ++ jlong now = TimeHelper::getMessageTimeUTC(); + jint javaModif = AwtComponent::GetJavaModifiers(); + + if (lastClickTrIc == this && +@@ -361,14 +361,14 @@ + MSG msg; + AwtComponent::InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y); + +- SendMouseEvent(java_awt_event_MouseEvent_MOUSE_RELEASED, TimeHelper::windowsToUTC(::GetTickCount()), ++ SendMouseEvent(java_awt_event_MouseEvent_MOUSE_RELEASED, TimeHelper::getMessageTimeUTC(), + x, y, AwtComponent::GetJavaModifiers(), clickCount, + (AwtComponent::GetButton(button) == java_awt_event_MouseEvent_BUTTON3 ? + TRUE : FALSE), AwtComponent::GetButton(button), &msg); + + if ((m_mouseButtonClickAllowed & AwtComponent::GetButtonMK(button)) != 0) { // No up-button in the drag-state + SendMouseEvent(java_awt_event_MouseEvent_MOUSE_CLICKED, +- TimeHelper::windowsToUTC(::GetTickCount()), x, y, AwtComponent::GetJavaModifiers(), ++ TimeHelper::getMessageTimeUTC(), x, y, AwtComponent::GetJavaModifiers(), + clickCount, JNI_FALSE, AwtComponent::GetButton(button)); + } + m_mouseButtonClickAllowed &= ~AwtComponent::GetButtonMK(button); // Exclude the up-button from the drag-state +@@ -395,7 +395,7 @@ + if ((flags & ALL_MK_BUTTONS) != 0) { + m_mouseButtonClickAllowed = 0; + } else { +- SendMouseEvent(java_awt_event_MouseEvent_MOUSE_MOVED, TimeHelper::windowsToUTC(::GetTickCount()), x, y, ++ SendMouseEvent(java_awt_event_MouseEvent_MOUSE_MOVED, TimeHelper::getMessageTimeUTC(), x, y, + AwtComponent::GetJavaModifiers(), 0, JNI_FALSE, + java_awt_event_MouseEvent_NOBUTTON, &msg); + } +@@ -408,7 +408,7 @@ + if (AwtComponent::GetJavaModifiers() & java_awt_event_InputEvent_BUTTON1_DOWN_MASK) { + MSG msg; + AwtComponent::InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y); +- SendActionEvent(java_awt_event_ActionEvent_ACTION_PERFORMED, TimeHelper::windowsToUTC(::GetTickCount()), ++ SendActionEvent(java_awt_event_ActionEvent_ACTION_PERFORMED, TimeHelper::getMessageTimeUTC(), + AwtComponent::GetJavaModifiers(), &msg); + } + return mrConsume; +@@ -417,14 +417,14 @@ + MsgRouting AwtTrayIcon::WmKeySelect(UINT flags, int x, int y) + { + static jlong lastKeySelectTime = 0; +- jlong now = TimeHelper::windowsToUTC(::GetTickCount()); ++ jlong now = TimeHelper::getMessageTimeUTC(); + + // If a user selects a notify icon with the ENTER key, + // Shell 5.0 sends double NIN_KEYSELECT notification. + if (lastKeySelectTime != now) { + MSG msg; + AwtComponent::InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y); +- SendActionEvent(java_awt_event_ActionEvent_ACTION_PERFORMED, TimeHelper::windowsToUTC(::GetTickCount()), ++ SendActionEvent(java_awt_event_ActionEvent_ACTION_PERFORMED, TimeHelper::getMessageTimeUTC(), + AwtComponent::GetJavaModifiers(), &msg); + } + lastKeySelectTime = now; +@@ -441,7 +441,7 @@ + if (clickCount == 2) { + MSG msg; + AwtComponent::InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y); +- SendActionEvent(java_awt_event_ActionEvent_ACTION_PERFORMED, TimeHelper::windowsToUTC(::GetTickCount()), ++ SendActionEvent(java_awt_event_ActionEvent_ACTION_PERFORMED, TimeHelper::getMessageTimeUTC(), + AwtComponent::GetJavaModifiers(), &msg); + } + return mrConsume; +--- ./jdk/src/windows/transport/shmem/shmem_md.c Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/src/windows/transport/shmem/shmem_md.c Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,6 +30,11 @@ + #include "sysShmem.h" + #include "shmemBase.h" /* for exitTransportWithError */ + ++/* Use THIS_FILE when it is available. */ ++#ifndef THIS_FILE ++ #define THIS_FILE __FILE__ ++#endif ++ + /* + * These functions are not completely universal. For now, they are used + * exclusively for Jbug's shared memory transport mechanism. They have +--- ./jdk/test/ProblemList.txt Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/ProblemList.txt Mon Jan 05 11:57:27 2015 -0800 +@@ -384,9 +384,6 @@ + + # jdk_tools + +-# 6461635 +-com/sun/tools/attach/BasicTests.sh generic-all +- + # Filed 6986875 + sun/tools/jps/jps-Vvml.sh generic-all + +@@ -396,10 +393,6 @@ + # 7132203 + sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all + +-# 8001118 +-sun/tools/jcmd/jcmd-f.sh generic-all +-sun/tools/jcmd/jcmd-help-help.sh generic-all +- + # 7175775 + sun/tools/jinfo/Basic.sh macosx-all + +@@ -444,9 +437,6 @@ + # Problems on windows, jmap.exe hangs? (these run jmap), fails on Solaris 10 x86 + java/util/concurrent/locks/Lock/TimedAcquireLeak.java generic-all + +-# 7041639, Solaris DSA keypair generation bug +-java/util/TimeZone/TimeZoneDatePermissionCheck.sh solaris-all +- + # 8026772: test/sun/util/resources/TimeZone/Bug6317929.java failing + sun/util/resources/TimeZone/Bug6317929.java generic-all + +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/corba/5036554/JavaBug.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package bug; ++ ++public class JavaBug { ++ public static void main(String[] args) { ++ try { ++ org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); ++ org.omg.CORBA.Any any = orb.create_any(); ++ myStringHelper.insert(any, "hello"); ++ System.out.println("Any: " + myStringHelper.extract(any)); ++ } catch( Exception e ) { ++ e.printStackTrace(); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/corba/5036554/README Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++Bug # 5036554 unmarshal error on CORBA alias type in CORBA any ++ ++Platform : ALL ++ ++Testcase directory : <.../corba> ++ ++Test Procedure : <STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : ++Step 1: create a file bug.idl with the following content: ++ ++// IDL file bug.idl ++module bug { ++ typedef string myString; ++}; ++ ++Step 2: Translate bug.idl with the command: idlj bug.idl ++This will create the file bug/myStringHelper.java ++ ++Step 3: ++Create the file JavaBug.java in directory bug with the following content: ++ ++// Java file JavaBug.java ++package bug; ++ ++public class JavaBug { ++ public static void main(String[] args) { ++ try { ++ org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); ++ org.omg.CORBA.Any any = orb.create_any(); ++ myStringHelper.insert(any, "hello"); ++ System.out.println("Any: " + myStringHelper.extract(any)); ++ } catch( Exception e ) { ++ e.printStackTrace(); ++ } ++ } ++} ++ ++Step 4: ++Compile all java files with the command: javac -d . bug\*.java ++ ++Step 5: ++Execute the program with the command: java -cp . bug/JavaBug ++ ++Step 6: Note the null pointer exception in the the output! ++ ++ ++Without Fix behaviour : <java.lang.NullPointerException ++ at com.sun.corba.se.internal.corba.TCUtility.unmarshalIn(TCUtility.java:290) ++ at com.sun.corba.se.internal.corba.AnyImpl.read_value(AnyImpl.java:561) ++ at bug.myStringHelper.insert(myStringHelper.java:20) ++ at bug.JavaBug.main(JavaBug.java:8)> ++ ++With Fix behaviour : <The output message printed on the console: "Any: hello"> ++ ++Other Comments : <Test case is automated.> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/corba/5036554/TestCorbaBug.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,112 @@ ++#!/bin/sh ++# ++# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# This code is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License version 2 only, as ++# published by the Free Software Foundation. ++# ++# This code is distributed in the hope that it will be useful, but WITHOUT ++# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++# version 2 for more details (a copy is included in the LICENSE file that ++# accompanied this code). ++# ++# You should have received a copy of the GNU General Public License version ++# 2 along with this work; if not, write to the Free Software Foundation, ++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++# ++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++# or visit www.oracle.com if you need additional information or have any ++# questions. ++# ++ ++# @test ++# @bug 5036554 6357706 ++# @summary unmarshal error on CORBA alias type in CORBA any ++# @run shell TestCorbaBug.sh ++ ++if [ "${TESTSRC}" = "" ] ++then TESTSRC=. ++fi ++ ++if [ "${TESTJAVA}" = "" ] ++then ++ PARENT=`dirname \`which java\`` ++ TESTJAVA=`dirname ${PARENT}` ++ echo "TESTJAVA not set, selecting " ${TESTJAVA} ++ echo "If this is incorrect, try setting the variable manually." ++fi ++ ++if [ "${TESTCLASSES}" = "" ] ++then ++ echo "TESTCLASSES not set. Test cannot execute. Failed." ++ exit 1 ++fi ++ ++# set platform-dependent variables ++OS=`uname -s` ++case "$OS" in ++ SunOS | Linux | Darwin ) ++ PS=":" ++ FS="/" ++ ;; ++ CYGWIN* ) ++ PS=";" ++ FS="/" ++ ;; ++ Windows* ) ++ PS=";" ++ FS="\\" ++ ;; ++ * ) ++ echo "Unrecognized system!" ++ exit 1; ++ ;; ++esac ++ ++CLASSPATH=.${PS}${TESTCLASSES}; export CLASSPATH ++ ++THIS_DIR=`pwd` ++ ++${TESTJAVA}${FS}bin${FS}java -version ++ ++mkdir bug ++ ++cp ${TESTSRC}${FS}bug.idl . ++${TESTJAVA}${FS}bin${FS}idlj bug.idl ++ ++cp ${TESTSRC}${FS}JavaBug.java bug ++ ++chmod -fR 777 bug ++ ++${TESTJAVA}${FS}bin${FS}javac -d . bug${FS}*.java ++ ++${TESTJAVA}${FS}bin${FS}java -cp . bug/JavaBug > test.out 2>&1 ++ ++grep "NullPointerException" test.out ++ ++ERROR=$? ++ ++cat test.out ++ ++if [ $ERROR = 0 ] ++then ++ echo "Test Failed" ++ exit 1 ++fi ++ ++grep "Any: hello" test.out ++ ++STATUS=$? ++ ++if [ $STATUS = 0 ] ++then ++ echo "Test Passed" ++ exit 0 ++else ++ echo "Invalid output" ++ cat test.out ++ exit 2 ++fi +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/corba/5036554/bug.idl Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,4 @@ ++// IDL file bug.idl ++module bug { ++ typedef string myString; ++}; +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/corba/se/impl/io/CustomOutputStream.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,192 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.Serializable; ++ ++import org.omg.CORBA.Any; ++import org.omg.CORBA.TypeCode; ++import org.omg.CORBA.Principal; ++import org.omg.CORBA_2_3.portable.OutputStream; ++import org.omg.CORBA_2_3.portable.InputStream; ++ ++public class CustomOutputStream extends OutputStream { ++ ++ @Override ++ public void write_value(Serializable value, Class clz) { ++ } ++ ++ @Override ++ public InputStream create_input_stream() { ++ return null; ++ } ++ ++ @Override ++ public void write_boolean(boolean value) { ++ } ++ ++ @Override ++ public void write_char(char value) { ++ } ++ ++ @Override ++ public void write_wchar(char value) { ++ } ++ ++ @Override ++ public void write_octet(byte value) { ++ } ++ ++ @Override ++ public void write_short(short value) { ++ } ++ ++ @Override ++ public void write_ushort(short value) { ++ } ++ ++ @Override ++ public void write_long(int value) { ++ } ++ ++ @Override ++ public void write_ulong(int value) { ++ } ++ ++ @Override ++ public void write_longlong(long value) { ++ } ++ ++ @Override ++ public void write_ulonglong(long value) { ++ } ++ ++ @Override ++ public void write_float(float value) { ++ } ++ ++ @Override ++ public void write_double(double value) { ++ } ++ ++ @Override ++ public void write_string(String value) { ++ } ++ ++ @Override ++ public void write_wstring(String value) { ++ } ++ ++ @Override ++ public void write_boolean_array(boolean[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_char_array(char[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_wchar_array(char[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_octet_array(byte[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_short_array(short[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_ushort_array(short[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_long_array(int[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_ulong_array(int[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_longlong_array(long[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_ulonglong_array(long[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_float_array(float[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_double_array(double[] value, int offset, ++ int length) { ++ } ++ ++ @Override ++ public void write_Object(org.omg.CORBA.Object value) { ++ } ++ ++ @Override ++ public void write_TypeCode(TypeCode value) { ++ } ++ ++ @Override ++ public void write_any(Any value) { ++ } ++ ++ @Override ++ public void write_Principal(Principal value) { ++ } ++ ++ @Override ++ public void write(int b) throws java.io.IOException { ++ } ++ ++ @Override ++ public void write_fixed(java.math.BigDecimal value) { ++ } ++ ++ @Override ++ public void write_Context(org.omg.CORBA.Context ctx, ++ org.omg.CORBA.ContextList contexts) { ++ } ++ ++ @Override ++ public org.omg.CORBA.ORB orb() { ++ return null; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 7095856 ++ * @summary OutputStreamHook doesn't handle null values ++ */ ++ ++import java.net.InetAddress; ++import javax.rmi.CORBA.Util; ++import javax.rmi.CORBA.ValueHandler; ++ ++public class HookPutFieldsTest { ++ ++ public static void main(String[] args ) throws Exception { ++ CustomOutputStream os = new CustomOutputStream(); ++ InetAddress a = InetAddress.getByAddress(null, new byte[] {1,2,3,4}); ++ ValueHandler vh = Util.createValueHandler(); ++ vh.writeValue(os, a); ++ } ++} +--- ./jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -64,11 +64,12 @@ + env.put(Context.SECURITY_PRINCIPAL, "user"); + env.put(Context.SECURITY_CREDENTIALS, "password"); + +- env.put("com.sun.jndi.ldap.connect.timeout", "10"); +- env.put("com.sun.jndi.ldap.read.timeout", "3000"); +- + InitialContext ctx = null; + try { ++ new LdapTimeoutTest().deadServerNoTimeout(env); ++ ++ env.put("com.sun.jndi.ldap.connect.timeout", "10"); ++ env.put("com.sun.jndi.ldap.read.timeout", "3000"); + new LdapTimeoutTest().ldapReadTimeoutTest(env, false); + new LdapTimeoutTest().ldapReadTimeoutTest(env, true); + new LdapTimeoutTest().simpleAuthConnectTest(env); +@@ -84,7 +85,7 @@ + void ldapReadTimeoutTest(Hashtable env, boolean ssl) { + InitialContext ctx = null; + if (ssl) env.put(Context.SECURITY_PROTOCOL, "ssl"); +- ScheduledFuture killer = killSwitch(); ++ ScheduledFuture killer = killSwitch(5000); + long start = System.nanoTime(); + try { + ctx = new InitialDirContext(env); +@@ -112,7 +113,7 @@ + + void simpleAuthConnectTest(Hashtable env) { + InitialContext ctx = null; +- ScheduledFuture killer = killSwitch(); ++ ScheduledFuture killer = killSwitch(5000); + long start = System.nanoTime(); + try { + ctx = new InitialDirContext(env); +@@ -139,6 +140,32 @@ + } + } + ++ void deadServerNoTimeout(Hashtable env) { ++ InitialContext ctx = null; ++ ScheduledFuture killer = killSwitch(30000); ++ long start = System.nanoTime(); ++ try { ++ ctx = new InitialDirContext(env); ++ SearchControls scl = new SearchControls(); ++ scl.setSearchScope(SearchControls.SUBTREE_SCOPE); ++ NamingEnumeration<SearchResult> answer = ((InitialDirContext)ctx) ++ .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); ++ // shouldn't reach here ++ fail(); ++ } catch (NamingException e) { ++ long end = System.nanoTime(); ++ if (TimeUnit.NANOSECONDS.toMillis(end - start) < 14000) { ++ System.err.println("fail: timeout should be at least 15 seconds, actual time: " ++ + TimeUnit.NANOSECONDS.toMillis(end - start)); ++ fail(); ++ } else { ++ pass(); ++ } ++ } finally { ++ if (!shutItDown(killer, ctx)) fail(); ++ } ++ } ++ + boolean shutItDown(ScheduledFuture killer, InitialContext ctx) { + killer.cancel(true); + try { +@@ -149,15 +176,15 @@ + } + } + +- ScheduledFuture killSwitch() { ++ ScheduledFuture killSwitch(int ms) { + final Thread current = Thread.currentThread(); + return LdapTimeoutTest.pool.schedule(new Callable<Void>() { + public Void call() throws Exception { + System.err.println("Fail: killSwitch()"); +- current.interrupt(); ++ System.exit(0); + return null; + } +- }, 5000, TimeUnit.MILLISECONDS); ++ }, ms, TimeUnit.MILLISECONDS); + } + + static class Server extends Thread { +--- ./jdk/test/com/sun/tools/attach/AgentSetup.sh Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,45 +0,0 @@ +-#!/bin/sh +- +-# +-# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +- +-# +-# +-# Agent set - creates Agent.jar, BadAgent.jar and RedefineAgent.jar in ${TESTCLASSES} +- +-$JAVAC -d "${TESTCLASSES}" "${TESTSRC}"/Agent.java "${TESTSRC}"/BadAgent.java "${TESTSRC}"/RedefineAgent.java +- +-$JAR -cfm "${TESTCLASSES}"/Agent.jar "${TESTSRC}"/agent.mf \ +- -C "${TESTCLASSES}" Agent.class +- +-$JAR -cfm "${TESTCLASSES}"/BadAgent.jar "${TESTSRC}"/badagent.mf \ +- -C "${TESTCLASSES}" BadAgent.class +- +-$JAR -cfm "${TESTCLASSES}"/RedefineAgent.jar "${TESTSRC}"/redefineagent.mf \ +- -C "${TESTCLASSES}" RedefineAgent.class +- +-agent="${TESTCLASSES}${FS}Agent.jar" +-badagent="${TESTCLASSES}${FS}BadAgent.jar" +-redefineagent="${TESTCLASSES}${FS}RedefineAgent.jar" +- +--- ./jdk/test/com/sun/tools/attach/Application.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/Application.java Mon Jan 05 11:57:27 2015 -0800 +@@ -22,25 +22,39 @@ + */ + + /* +- * +- * + * A simple "Application" used by the Attach API unit tests. This application is + * launched by the test. It binds to a random port and shuts down when somebody + * connects to that port. ++ * Used port and pid are written both to stdout and to a specified file. + */ + import java.net.Socket; + import java.net.ServerSocket; ++import java.io.PrintWriter; ++import jdk.testlibrary.ProcessTools; + + public class Application { + public static void main(String args[]) throws Exception { + // bind to a random port ++ if (args.length < 1) { ++ System.err.println("First argument should be path to output file."); ++ } ++ String outFileName = args[0]; ++ + ServerSocket ss = new ServerSocket(0); + int port = ss.getLocalPort(); ++ int pid = ProcessTools.getProcessId(); + +- // signal test that we are started - do not remove this line!! +- System.out.println(port); ++ System.out.println("shutdownPort=" + port); ++ System.out.println("pid=" + pid); + System.out.flush(); + ++ try (PrintWriter writer = new PrintWriter(outFileName)) { ++ writer.println("shutdownPort=" + port); ++ writer.println("pid=" + pid); ++ writer.println("done"); ++ writer.flush(); ++ } ++ + // wait for test harness to connect + Socket s = ss.accept(); + s.close(); +--- ./jdk/test/com/sun/tools/attach/ApplicationSetup.sh Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,83 +0,0 @@ +-#!/bin/sh +- +-# +-# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +- +-# +-# +-# Application Setup - creates ${TESTCLASSES}/Application.jar and the following +-# procedures: +-# startApplication - starts target application +-# stopApplication $1 - stops application via TCP shutdown port $1 +- +-$JAVAC -d "${TESTCLASSES}" "${TESTSRC}"/Application.java "${TESTSRC}"/Shutdown.java +-$JAR -cfm "${TESTCLASSES}"/Application.jar "${TESTSRC}"/application.mf \ +- -C "${TESTCLASSES}" Application.class +- +-OUTPUTFILE=${TESTCLASSES}/Application.out +-rm -f ${OUTPUTFILE} +- +-startApplication() +-{ +- # put all output from the app into ${OUTPUTFILE} +- ${JAVA} $1 $2 $3 -jar "${TESTCLASSES}"/Application.jar > ${OUTPUTFILE} 2>&1 & +- pid="$!" +- +- # MKS creates an intermediate shell to launch ${JAVA} so +- # ${pid} is not the actual pid. We have put in a small sleep +- # to give the intermediate shell process time to launch the +- # "java" process. +- if [ "$OS" = "Windows" ]; then +- sleep 2 +- if [ "${isCygwin}" = "true" ] ; then +- realpid=`ps -p ${pid} | tail -1 | awk '{print $4;}'` +- else +- realpid=`ps -o pid,ppid,comm|grep ${pid}|grep "java"|cut -c1-6` +- fi +- pid=${realpid} +- fi +- +- echo "Waiting for Application to initialize..." +- attempts=0 +- while true; do +- sleep 1 +- port=`tail -1 ${OUTPUTFILE} | sed -e 's@\\r@@g' ` +- if [ ! -z "$port" ]; then +- # In case of errors wait time for output to be flushed +- sleep 1 +- cat ${OUTPUTFILE} +- break +- fi +- attempts=`expr $attempts + 1` +- echo "Waiting $attempts second(s) ..." +- done +- echo "Application is process $pid, shutdown port is $port" +- return $port +-} +- +-stopApplication() +-{ +- $JAVA -classpath "${TESTCLASSES}" Shutdown $1 +-} +- +--- ./jdk/test/com/sun/tools/attach/BasicTests.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/BasicTests.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2011, 2013 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -21,127 +21,223 @@ + * questions. + */ + +-/* +- * +- * +- * Unit test for Attach API. Attaches to the given VM and performs a number +- * unit tests. +- */ + import com.sun.tools.attach.*; + import java.net.ServerSocket; + import java.net.Socket; + import java.io.IOException; + import java.util.Properties; + import java.util.List; ++import java.io.File; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.JDKToolLauncher; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.ProcessThread; + ++/* ++ * @test ++ * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 ++ * @summary Basic unit tests for the VM attach mechanism. ++ * @library /lib/testlibrary ++ * @run build Agent BadAgent RedefineAgent Application Shutdown RedefineDummy RunnerUtil ++ * @run main BasicTests ++ * ++ * This test will perform a number of basic attach tests. ++ */ + public class BasicTests { +- public static void main(String args[]) throws Exception { +- String pid = args[0]; +- String agent = args[1]; +- String badagent = args[2]; +- String redefineagent = args[3]; + +- System.out.println(" - Attaching to application ..."); +- VirtualMachine vm = VirtualMachine.attach(pid); ++ /* ++ * The actual test is in the nested class TestMain. ++ * The responsibility of this class is to: ++ * 1. Build all needed jars. ++ * 2. Start the Application class in a separate process. ++ * 3. Find the pid and shutdown port of the running Application. ++ * 4. Launches the tests in nested class TestMain that will attach to the Application. ++ * 5. Shut down the Application. ++ */ ++ public static void main(String args[]) throws Throwable { ++ final String pidFile = "TestsBasic.Application.pid"; ++ ProcessThread processThread = null; ++ RunnerUtil.ProcessInfo info = null; ++ try { ++ buildJars(); ++ processThread = RunnerUtil.startApplication(pidFile); ++ info = RunnerUtil.readProcessInfo(pidFile); ++ runTests(info.pid); ++ } catch (Throwable t) { ++ System.out.println("TestBasic got unexpected exception: " + t); ++ t.printStackTrace(); ++ throw t; ++ } finally { ++ // Make sure the Application process is stopped. ++ RunnerUtil.stopApplication(info.shutdownPort, processThread); ++ } ++ } + +- // Test 1 - read the system properties from the target VM and +- // check that property is set +- System.out.println(" - Test: system properties in target VM"); +- Properties props = vm.getSystemProperties(); +- String value = props.getProperty("attach.test"); +- if (value == null || !value.equals("true")) { +- throw new RuntimeException("attach.test property not set"); ++ /** ++ * Runs the actual tests in nested class TestMain. ++ * The reason for running the tests in a separate process ++ * is that we need to modify the class path. ++ */ ++ private static void runTests(int pid) throws Throwable { ++ final String sep = File.separator; ++ ++ // Need to add jdk/lib/tools.jar to classpath. ++ String classpath = ++ System.getProperty("test.class.path", "") + File.pathSeparator + ++ System.getProperty("test.jdk", ".") + sep + "lib" + sep + "tools.jar"; ++ String testClassDir = System.getProperty("test.classes", "") + sep; ++ ++ // Argumenta : -classpath cp BasicTests$TestMain pid agent badagent redefineagent ++ String[] args = { ++ "-classpath", ++ classpath, ++ "BasicTests$TestMain", ++ Integer.toString(pid), ++ testClassDir + "Agent.jar", ++ testClassDir + "BadAgent.jar", ++ testClassDir + "RedefineAgent.jar" }; ++ OutputAnalyzer output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ } ++ ++ /** ++ * Will build all jars needed by the tests. ++ */ ++ private static void buildJars() throws Throwable { ++ String[] jars = {"Agent", "BadAgent", "RedefineAgent", "Application" }; ++ for (String jar : jars) { ++ buildJar(jar); + } +- System.out.println(" - attach.test property set as expected"); ++ } + +- // Test 1a - read the agent properties from the target VM. +- // By default, the agent property contains "sun.java.command", +- // "sun.jvm.flags", and "sun.jvm.args". +- // Just sanity check - make sure not empty. +- System.out.println(" - Test: agent properties in target VM"); +- props = vm.getAgentProperties(); +- if (props == null || props.size() == 0) { +- throw new RuntimeException("Agent properties is empty"); +- } +- System.out.println(" - agent properties non-empty as expected"); ++ /** ++ * Will build a jar with the given name. ++ * Class file and manifest must already exist. ++ * @param jarName Name of the jar. ++ */ ++ private static void buildJar(String jarName) throws Throwable { ++ String testClasses = System.getProperty("test.classes", "?"); ++ String testSrc = System.getProperty("test.src", "?"); ++ String jar = String.format("%s/%s.jar", testClasses, jarName); ++ String manifest = String.format("%s/%s.mf", testSrc, jarName.toLowerCase()); ++ String clazz = String.format("%s.class", jarName); + +- // Test 2 - attempt to load an agent that does not exist +- System.out.println(" - Test: Load an agent that does not exist"); +- try { +- vm.loadAgent("SilverBullet.jar"); +- } catch (AgentLoadException x) { +- System.out.println(" - AgentLoadException thrown as expected!"); +- } ++ // Arguments to the jar command has this format: ++ // "-cfm TESTCLASSES/Agent.jar TESTSRC/agent.mf -C TESTCLASSES Agent.class" ++ RunnerUtil.createJar("-cfm", jar, manifest, "-C", testClasses, clazz); ++ } + +- // Test 3 - load an "bad" agent (agentmain throws an exception) +- System.out.println(" - Test: Load a bad agent"); +- System.out.println("INFO: This test will cause error messages " +- + "to appear in the application log about SilverBullet.jar " +- + "not being found and an agent failing to start."); +- try { +- vm.loadAgent(badagent); +- throw new RuntimeException( +- "AgentInitializationException not thrown as expected!"); +- } catch (AgentInitializationException x) { +- System.out.println( +- " - AgentInitializationException thrown as expected!"); +- } ++ /** ++ * This is the actual test. It will attach to the running Application ++ * and perform a number of basic attach tests. ++ */ ++ public static class TestMain { ++ public static void main(String args[]) throws Exception { ++ String pid = args[0]; ++ String agent = args[1]; ++ String badagent = args[2]; ++ String redefineagent = args[3]; + +- // Test 4 - detach from the VM and attempt a load (should throw IOE) +- System.out.println(" - Test: Detach from VM"); +- System.out.println("INFO: This test will cause error messages " +- + "to appear in the application log about a BadAgent including " +- + "a RuntimeException and an InvocationTargetException."); +- vm.detach(); +- try { +- vm.loadAgent(agent); +- throw new RuntimeException("loadAgent did not throw an exception!!"); +- } catch (IOException ioe) { +- System.out.println(" - IOException as expected"); +- } ++ System.out.println(" - Attaching to application ..."); ++ VirtualMachine vm = VirtualMachine.attach(pid); + +- // Test 5 - functional "end-to-end" test. +- // Create a listener socket. Load Agent.jar into the target VM passing +- // it the port number of our listener. When agent loads it should connect +- // back to the tool. ++ // Test 1 - read the system properties from the target VM and ++ // check that property is set ++ System.out.println(" - Test: system properties in target VM"); ++ Properties props = vm.getSystemProperties(); ++ String value = props.getProperty("attach.test"); ++ if (value == null || !value.equals("true")) { ++ throw new RuntimeException("attach.test property not set"); ++ } ++ System.out.println(" - attach.test property set as expected"); + +- System.out.println(" - Re-attaching to application ..."); +- vm = VirtualMachine.attach(pid); ++ // Test 1a - read the agent properties from the target VM. ++ // By default, the agent property contains "sun.java.command", ++ // "sun.jvm.flags", and "sun.jvm.args". ++ // Just sanity check - make sure not empty. ++ System.out.println(" - Test: agent properties in target VM"); ++ props = vm.getAgentProperties(); ++ if (props == null || props.size() == 0) { ++ throw new RuntimeException("Agent properties is empty"); ++ } ++ System.out.println(" - agent properties non-empty as expected"); + +- System.out.println(" - Test: End-to-end connection with agent"); ++ // Test 2 - attempt to load an agent that does not exist ++ System.out.println(" - Test: Load an agent that does not exist"); ++ try { ++ vm.loadAgent("SilverBullet.jar"); ++ } catch (AgentLoadException x) { ++ System.out.println(" - AgentLoadException thrown as expected!"); ++ } + +- ServerSocket ss = new ServerSocket(0); +- int port = ss.getLocalPort(); ++ // Test 3 - load an "bad" agent (agentmain throws an exception) ++ System.out.println(" - Test: Load a bad agent"); ++ System.out.println("INFO: This test will cause error messages " ++ + "to appear in the application log about SilverBullet.jar " ++ + "not being found and an agent failing to start."); ++ try { ++ vm.loadAgent(badagent); ++ throw new RuntimeException( ++ "AgentInitializationException not thrown as expected!"); ++ } catch (AgentInitializationException x) { ++ System.out.println( ++ " - AgentInitializationException thrown as expected!"); ++ } + +- System.out.println(" - Loading Agent.jar into target VM ..."); +- vm.loadAgent(agent, Integer.toString(port)); ++ // Test 4 - detach from the VM and attempt a load (should throw IOE) ++ System.out.println(" - Test: Detach from VM"); ++ System.out.println("INFO: This test will cause error messages " ++ + "to appear in the application log about a BadAgent including " ++ + "a RuntimeException and an InvocationTargetException."); ++ vm.detach(); ++ try { ++ vm.loadAgent(agent); ++ throw new RuntimeException("loadAgent did not throw an exception!!"); ++ } catch (IOException ioe) { ++ System.out.println(" - IOException as expected"); ++ } + +- System.out.println(" - Waiting for agent to connect back to tool ..."); +- Socket s = ss.accept(); +- System.out.println(" - Connected to agent."); ++ // Test 5 - functional "end-to-end" test. ++ // Create a listener socket. Load Agent.jar into the target VM passing ++ // it the port number of our listener. When agent loads it should connect ++ // back to the tool. + +- // Test 5b - functional "end-to-end" test. +- // Now with an agent that does redefine. ++ System.out.println(" - Re-attaching to application ..."); ++ vm = VirtualMachine.attach(pid); + +- System.out.println(" - Re-attaching to application ..."); +- vm = VirtualMachine.attach(pid); ++ System.out.println(" - Test: End-to-end connection with agent"); + +- System.out.println(" - Test: End-to-end connection with RedefineAgent"); ++ ServerSocket ss = new ServerSocket(0); ++ int port = ss.getLocalPort(); + +- ServerSocket ss2 = new ServerSocket(0); +- int port2 = ss2.getLocalPort(); ++ System.out.println(" - Loading Agent.jar into target VM ..."); ++ vm.loadAgent(agent, Integer.toString(port)); + +- System.out.println(" - Loading RedefineAgent.jar into target VM ..."); +- vm.loadAgent(redefineagent, Integer.toString(port2)); ++ System.out.println(" - Waiting for agent to connect back to tool ..."); ++ Socket s = ss.accept(); ++ System.out.println(" - Connected to agent."); + +- System.out.println(" - Waiting for RedefineAgent to connect back to tool ..."); +- Socket s2 = ss2.accept(); +- System.out.println(" - Connected to RedefineAgent."); ++ // Test 5b - functional "end-to-end" test. ++ // Now with an agent that does redefine. + +- // Test 6 - list method should list the target VM +- System.out.println(" - Test: VirtualMachine.list"); +- List<VirtualMachineDescriptor> l = VirtualMachine.list(); +- if (!l.isEmpty()) { ++ System.out.println(" - Re-attaching to application ..."); ++ vm = VirtualMachine.attach(pid); ++ ++ System.out.println(" - Test: End-to-end connection with RedefineAgent"); ++ ++ ServerSocket ss2 = new ServerSocket(0); ++ int port2 = ss2.getLocalPort(); ++ ++ System.out.println(" - Loading RedefineAgent.jar into target VM ..."); ++ vm.loadAgent(redefineagent, Integer.toString(port2)); ++ ++ System.out.println(" - Waiting for RedefineAgent to connect back to tool ..."); ++ Socket s2 = ss2.accept(); ++ System.out.println(" - Connected to RedefineAgent."); ++ ++ // Test 6 - list method should list the target VM ++ System.out.println(" - Test: VirtualMachine.list"); ++ List<VirtualMachineDescriptor> l = VirtualMachine.list(); + boolean found = false; + for (VirtualMachineDescriptor vmd: l) { + if (vmd.id().equals(pid)) { +@@ -154,27 +250,26 @@ + } else { + throw new RuntimeException(pid + " not found in VM list"); + } ++ ++ // test 7 - basic hashCode/equals tests ++ System.out.println(" - Test: hashCode/equals"); ++ ++ VirtualMachine vm1 = VirtualMachine.attach(pid); ++ VirtualMachine vm2 = VirtualMachine.attach(pid); ++ if (!vm1.equals(vm2)) { ++ throw new RuntimeException("virtual machines are not equal"); ++ } ++ if (vm.hashCode() != vm.hashCode()) { ++ throw new RuntimeException("virtual machine hashCodes not equal"); ++ } ++ System.out.println(" - hashCode/equals okay"); ++ ++ // --- ++ System.out.println(" - Cleaning up..."); ++ s.close(); ++ ss.close(); ++ s2.close(); ++ ss2.close(); + } +- +- // test 7 - basic hashCode/equals tests +- System.out.println(" - Test: hashCode/equals"); +- +- VirtualMachine vm1 = VirtualMachine.attach(pid); +- VirtualMachine vm2 = VirtualMachine.attach(pid); +- if (!vm1.equals(vm2)) { +- throw new RuntimeException("virtual machines are not equal"); +- } +- if (vm.hashCode() != vm.hashCode()) { +- throw new RuntimeException("virtual machine hashCodes not equal"); +- } +- System.out.println(" - hashCode/equals okay"); +- +- +- // --- +- System.out.println(" - Cleaning up..."); +- s.close(); +- ss.close(); +- s2.close(); +- ss2.close(); + } + } +--- ./jdk/test/com/sun/tools/attach/BasicTests.sh Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,86 +0,0 @@ +-#!/bin/sh +- +-# +-# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +- +-# @test +-# @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 +-# @summary Basic unit tests for the VM attach mechanism. +-# +-# @build BasicTests +-# @run shell BasicTests.sh +- +-if [ "${TESTSRC}" = "" ] +-then +- echo "TESTSRC not set. Test cannot execute. Failed." +- exit 1 +-fi +- +-# Windows 2000 is a problem here, so we skip it, see 6962615 +-osrev=`uname -a` +-if [ "`echo ${osrev} | grep 'CYGWIN[^ ]*-5\.0'`" != "" ] ; then +- echo "Treating as a pass, not testing Windows 2000" +- exit 0 +-fi +-if [ "`echo ${osrev} | grep 'Windows'`" != "" ] ; then +- if [ "`echo ${osrev} | grep '5 00'`" != "" ] ; then +- echo "Treating as a pass, not testing Windows 2000" +- exit 0 +- fi +-fi +- +-. ${TESTSRC}/CommonSetup.sh +-. ${TESTSRC}/ApplicationSetup.sh +-. ${TESTSRC}/AgentSetup.sh +- +-startApplication -Dattach.test=true +-# pid = process-id, port = shutdown port +- +-failures=0 +- +-echo "Running tests ..." +- +-$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \ +- BasicTests $pid $agent $badagent $redefineagent 2>&1 +-if [ $? != 0 ]; then failures=`expr $failures + 1`; fi +- +-stopApplication $port +- +-# Add these info messages to $OUTPUTFILE just in case someone +-# looks at it and wonders about the failures. We have to do +-# this after the application is stopped because it is writing +-# to $OUTPUTFILE. +-( +-echo "" +-echo "INFO: Test 2 will cause error messages about SilverBullet.jar" \ +- "and an agent failing to start." +-echo "INFO: Test 3 will cause error messages about BadAgent" \ +- "including a RuntimeException and an InvocationTargetException." +-) >> ${OUTPUTFILE} +- +-if [ $failures = 0 ]; +- then echo "All tests passed."; +- else echo "$failures test(s) failed:"; cat ${OUTPUTFILE}; +-fi +-exit $failures +--- ./jdk/test/com/sun/tools/attach/CommonSetup.sh Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,81 +0,0 @@ +-#!/bin/sh +- +-# +-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +- +-# +-# +-# Common setup for the Attach API unit tests. Setups up the following variables: +-# +-# PS - path sep. +-# FS - file sep. +-# JAVA - java cmd. +-# JAVAC - javac cmd. +-# JAR - jar cmd. +- +-OS=`uname -s` +-case "$OS" in +- SunOS | Linux | Darwin ) +- PS=":" +- FS="/" +- ;; +- Windows* ) +- PS=";" +- OS="Windows" +- FS="\\" +- ;; +- CYGWIN* ) +- PS=";" +- OS="Windows" +- FS="\\" +- isCygwin=true +- ;; +- * ) +- echo "Unrecognized system!" +- exit 1; +- ;; +-esac +- +-if [ "${TESTJAVA}" = "" ] +-then +- echo "TESTJAVA not set. Test cannot execute. Failed." +- exit 1 +-fi +- +-if [ "${TESTSRC}" = "" ] +-then +- echo "TESTSRC not set. Test cannot execute. Failed." +- exit 1 +-fi +- +-if [ "${TESTCLASSES}" = "" ] +-then +- echo "TESTCLASSES not set. Test cannot execute. Failed." +- exit 1 +-fi +- +-JAVA="${TESTJAVA}/bin/java" +-JAVAC="${TESTJAVA}/bin/javac" +-JAR="${TESTJAVA}/bin/jar" +- +--- ./jdk/test/com/sun/tools/attach/PermissionTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/PermissionTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2013 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -21,39 +21,119 @@ + * questions. + */ + +-/* +- * +- * +- * Unit test for Attach API - this checks that a SecurityException is thrown as +- * expected. +- */ + import com.sun.tools.attach.VirtualMachine; + import com.sun.tools.attach.AttachNotSupportedException; + import java.util.Properties; ++import java.io.File; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.ProcessThread; + ++/* ++ * @test ++ * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 ++ * @summary Basic unit tests for the VM attach mechanism. ++ * @library /lib/testlibrary ++ * @run build Application Shutdown ++ * @run main PermissionTest ++ * ++ * Unit test for Attach API - ++ * this checks that a SecurityException is thrown as expected. ++ */ + public class PermissionTest { +- public static void main(String args[]) throws Exception { +- SecurityManager sm = System.getSecurityManager(); +- if (sm == null) { +- throw new RuntimeException("Test configuration error - no security manager set"); ++ ++ /* ++ * The actual test is in the nested class TestMain. ++ * The responsibility of this class is to: ++ * 1. Start the Application class in a separate process. ++ * 2. Find the pid and shutdown port of the running Application. ++ * 3. Run the tests in TstMain that will attach to the Application. ++ * 4. Shut down the Application. ++ */ ++ public static void main(String args[]) throws Throwable { ++ final String pidFile ="TestPermission.Application.pid"; ++ ProcessThread processThread = null; ++ RunnerUtil.ProcessInfo info = null; ++ try { ++ processThread = RunnerUtil.startApplication(pidFile); ++ info = RunnerUtil.readProcessInfo(pidFile); ++ runTests(info.pid); ++ } catch (Throwable t) { ++ System.out.println("TestPermission got unexpected exception: " + t); ++ t.printStackTrace(); ++ throw t; ++ } finally { ++ // Make sure the Application process is stopped. ++ RunnerUtil.stopApplication(info.shutdownPort, processThread); + } ++ } + +- String pid = args[0]; +- boolean shouldFail = Boolean.parseBoolean(args[1]); ++ /** ++ * Runs the actual test the nested class TestMain. ++ * The test is run in a separate process because we need to add to the classpath. ++ */ ++ private static void runTests(int pid) throws Throwable { ++ final String sep = File.separator; + +- try { +- VirtualMachine.attach(pid).detach(); +- if (shouldFail) { +- throw new RuntimeException("SecurityException should be thrown"); ++ // Need to add jdk/lib/tools.jar to classpath. ++ String classpath = ++ System.getProperty("test.class.path", "") + File.pathSeparator + ++ System.getProperty("test.jdk", ".") + sep + "lib" + sep + "tools.jar"; ++ String testSrc = System.getProperty("test.src", "") + sep; ++ ++ // Use a policy that will NOT allow attach. Test will verify exception. ++ String[] args = { ++ "-classpath", ++ classpath, ++ "-Djava.security.manager", ++ String.format("-Djava.security.policy=%sjava.policy.deny", testSrc), ++ "PermissionTest$TestMain", ++ Integer.toString(pid), ++ "true" }; ++ OutputAnalyzer output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ ++ // Use a policy that will allow attach. ++ args = new String[] { ++ "-classpath", ++ classpath, ++ "-Djava.security.manager", ++ String.format("-Djava.security.policy=%sjava.policy.allow", testSrc), ++ "PermissionTest$TestMain", ++ Integer.toString(pid), ++ "false" }; ++ output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ } ++ ++ /** ++ * This is the actual test code. It will attach to the Application and verify ++ * that we get a SecurityException when that is expected. ++ */ ++ public static class TestMain { ++ public static void main(String args[]) throws Exception { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm == null) { ++ throw new RuntimeException("Test configuration error - no security manager set"); + } +- System.out.println(" - attached to target VM as expected."); +- } catch (Exception x) { +- // AttachNotSupportedException thrown when no providers can be loaded +- if (shouldFail && ((x instanceof AttachNotSupportedException) || +- (x instanceof SecurityException))) { +- System.out.println(" - exception thrown as expected."); +- } else { +- throw x; ++ ++ String pid = args[0]; ++ boolean shouldFail = Boolean.parseBoolean(args[1]); ++ ++ try { ++ VirtualMachine.attach(pid).detach(); ++ if (shouldFail) { ++ throw new RuntimeException("SecurityException should be thrown"); ++ } ++ System.out.println(" - attached to target VM as expected."); ++ } catch (Exception x) { ++ // AttachNotSupportedException thrown when no providers can be loaded ++ if (shouldFail && ((x instanceof AttachNotSupportedException) || ++ (x instanceof SecurityException))) { ++ System.out.println(" - exception thrown as expected."); ++ } else { ++ throw x; ++ } + } + } + } +--- ./jdk/test/com/sun/tools/attach/PermissionTests.sh Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,72 +0,0 @@ +-#!/bin/sh +- +-# +-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +- +-# @test +-# @bug 6173612 +-# @summary Security manager and permission tests for Attach API +-# +-# @build PermissionTest +-# @run shell PermissionTests.sh +- +-if [ "${TESTSRC}" = "" ] +-then +- echo "TESTSRC not set. Test cannot execute. Failed." +- exit 1 +-fi +- +-. ${TESTSRC}/CommonSetup.sh +-. ${TESTSRC}/ApplicationSetup.sh +- +-failures=0 +- +-# Start target VM +-startApplication +-# pid = process-id, port = shutdown port +- +-echo "Deny test" +-# deny +-$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \ +- -Djava.security.manager \ +- -Djava.security.policy=${TESTSRC}/java.policy.deny \ +- PermissionTest $pid true 2>&1 +-if [ $? != 0 ]; then failures=`expr $failures + 1`; fi +- +-# allow +-echo "Allow test" +-$JAVA -classpath "${TESTCLASSES}${PS}${TESTJAVA}/lib/tools.jar" \ +- -Djava.security.manager \ +- -Djava.security.policy=${TESTSRC}/java.policy.allow \ +- PermissionTest $pid false 2>&1 +-if [ $? != 0 ]; then failures=`expr $failures + 1`; fi +- +-# Stop target VM +-stopApplication $port +- +-if [ $failures = 0 ]; +- then echo "All tests passed."; +- else echo "$failures test(s) failed:"; cat ${OUTPUTFILE}; +-fi +-exit $failures +--- ./jdk/test/com/sun/tools/attach/ProviderTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/ProviderTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2013 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -21,24 +21,98 @@ + * questions. + */ + +-/* +- * +- * +- * Unit test for Attach API. Attaches to the given VM and performs a number +- * unit tests. +- */ ++import java.io.File; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.JDKToolLauncher; ++import jdk.testlibrary.ProcessTools; + import com.sun.tools.attach.VirtualMachine; + import com.sun.tools.attach.spi.AttachProvider; + ++/* ++ * @test ++ * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 ++ * @summary Basic unit tests for the VM attach mechanism. ++ * @library /lib/testlibrary ++ * @run build SimpleProvider ++ * @run main ProviderTest ++ * ++ * The test will attach and detach to/from the running Application. ++ */ + public class ProviderTest { +- public static void main(String args[]) throws Exception { +- // deal with internal builds where classes are loaded from the +- // 'classes' directory rather than rt.jar +- ClassLoader cl = AttachProvider.class.getClassLoader(); +- if (cl != ClassLoader.getSystemClassLoader()) { +- System.out.println("Attach API not loaded by system class loader - test skipped"); +- return; ++ ++ /* ++ * The actual tests are in the nested class TestMain below. ++ * The responsibility of this class is to: ++ * 1. Build the needed jar. ++ * 2. Run tests in ProviderTest.TestMain. ++ */ ++ public static void main(String args[]) throws Throwable { ++ try { ++ buildJar(); ++ runTests(); ++ } catch (Throwable t) { ++ System.out.println("TestProvider got unexpected exception: " + t); ++ t.printStackTrace(); ++ throw t; + } +- VirtualMachine.attach("simple:1234").detach(); ++ } ++ ++ /** ++ * Runs the actual tests in the nested class TestMain. ++ * We need to run the tests in a separate process, ++ * because we need to add to the classpath. ++ */ ++ private static void runTests() throws Throwable { ++ final String sep = File.separator; ++ String testClassPath = System.getProperty("test.class.path", ""); ++ String testClasses = System.getProperty("test.classes", "") + sep; ++ String jdkLib = System.getProperty("test.jdk", ".") + sep + "lib" + sep; ++ ++ // Need to add SimpleProvider.jar and tools.jar to classpath. ++ String classpath = ++ testClassPath + File.pathSeparator + ++ testClasses + "SimpleProvider.jar" + File.pathSeparator + ++ jdkLib + "tools.jar"; ++ ++ String[] args = { ++ "-classpath", ++ classpath, ++ "ProviderTest$TestMain" }; ++ OutputAnalyzer output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ } ++ ++ /** ++ * Will build the SimpleProvider.jar. ++ */ ++ private static void buildJar() throws Throwable { ++ final String sep = File.separator; ++ String testClasses = System.getProperty("test.classes", "?") + sep; ++ String testSrc = System.getProperty("test.src", "?") + sep; ++ String serviceDir = "META-INF" + sep + "services" + sep; ++ ++ RunnerUtil.createJar( ++ "-cf", testClasses + "SimpleProvider.jar", ++ "-C", testClasses, "SimpleProvider.class", ++ "-C", testClasses, "SimpleVirtualMachine.class", ++ "-C", testSrc, ++ serviceDir + "com.sun.tools.attach.spi.AttachProvider"); ++ } ++ ++ /** ++ * This is the actual test code that attaches to the running Application. ++ * This class is run in a separate process. ++ */ ++ public static class TestMain { ++ public static void main(String args[]) throws Exception { ++ // deal with internal builds where classes are loaded from the ++ // 'classes' directory rather than rt.jar ++ ClassLoader cl = AttachProvider.class.getClassLoader(); ++ if (cl != ClassLoader.getSystemClassLoader()) { ++ System.out.println("Attach API not loaded by system class loader - test skipped"); ++ return; ++ } ++ VirtualMachine.attach("simple:1234").detach(); ++ } + } + } +--- ./jdk/test/com/sun/tools/attach/ProviderTests.sh Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,51 +0,0 @@ +-# +-# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +-# +-# This code is free software; you can redistribute it and/or modify it +-# under the terms of the GNU General Public License version 2 only, as +-# published by the Free Software Foundation. +-# +-# This code is distributed in the hope that it will be useful, but WITHOUT +-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-# version 2 for more details (a copy is included in the LICENSE file that +-# accompanied this code). +-# +-# You should have received a copy of the GNU General Public License version +-# 2 along with this work; if not, write to the Free Software Foundation, +-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +-# +-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +-# or visit www.oracle.com if you need additional information or have any +-# questions. +-# +- +-# @test +-# @bug 6173612 +-# @summary AttachProvider unit tests +-# +-# @build ProviderTest SimpleProvider +-# @run shell ProviderTests.sh +- +-if [ "${TESTSRC}" = "" ] +-then +- echo "TESTSRC not set. Test cannot execute. Failed." +- exit 1 +-fi +- +-. ${TESTSRC}/CommonSetup.sh +- +-echo "Creating JAR file ..." +- +-$JAR -cf ${TESTCLASSES}/SimpleProvider.jar \ +- -C ${TESTCLASSES} SimpleProvider.class \ +- -C ${TESTCLASSES} SimpleVirtualMachine.class \ +- -C "${TESTSRC}" META-INF/services/com.sun.tools.attach.spi.AttachProvider +- +-echo "Running test ..." +- +-$JAVA -classpath \ +- "${TESTCLASSES}${PS}${TESTCLASSES}/SimpleProvider.jar${PS}${TESTJAVA}/lib/tools.jar" \ +- ProviderTest +- +--- ./jdk/test/com/sun/tools/attach/RedefineAgent.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/RedefineAgent.java Mon Jan 05 11:57:27 2015 -0800 +@@ -43,15 +43,15 @@ + public class RedefineAgent implements ClassFileTransformer { + + static byte[] classfilebytes; +- static final String targetName = "java.math.BigInteger"; +- static final String targetNameSlashes = "java/math/BigInteger"; ++ static final String targetName = "RedefineDummy"; ++ static final String targetNameSlashes = "RedefineDummy"; + static boolean gotRedefineTransform = false; + + // test transform and capture class bytes for redefine + public byte[] transform(ClassLoader loader, + String className, + Class<?> classBeingRedefined, +- ProtectionDomain protectionDomain, ++ ProtectionDomain protectionDomain, + byte[] classfileBuffer) { + if (className.equals(targetNameSlashes)) { + if (classBeingRedefined == null) { +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/tools/attach/RedefineDummy.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,31 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * Simple dummy class used to test class retransform. ++ */ ++public class RedefineDummy { ++ public String toString() { ++ return "RedefineDummy"; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/tools/attach/RunnerUtil.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,195 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.IOException; ++import java.io.File; ++import java.nio.file.Files; ++import java.util.Arrays; ++import java.util.regex.Pattern; ++import java.util.regex.Matcher; ++ ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.Utils; ++import jdk.testlibrary.ProcessThread; ++ ++/* ++ * Utility functions for test runners. ++ * (Test runner = class that launch a test) ++ */ ++public class RunnerUtil { ++ ++ /** ++ * The Application process must be run concurrently with our tests since ++ * the tests will attach to the Application. ++ * We will run the Application process in a separate thread. ++ * ++ * The Application must be started with flag "-Xshare:off" for the Retransform ++ * test in TestBasics to pass on all platforms. ++ * ++ * The Application will write its pid and shutdownPort in the given outFile. ++ */ ++ public static ProcessThread startApplication(String outFile, String... additionalOpts) throws Throwable { ++ String classpath = System.getProperty("test.class.path", "."); ++ String[] myArgs = concat(additionalOpts, new String [] { "-Dattach.test=true", "-classpath", classpath, "Application", outFile }); ++ String[] args = Utils.addTestJavaOpts(myArgs); ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args); ++ ProcessThread pt = new ProcessThread("runApplication", pb); ++ pt.start(); ++ return pt; ++ } ++ ++ public static String[] concat(String[] a, String[] b) { ++ if (a == null) { ++ return b; ++ } ++ if (b == null) { ++ return a; ++ } ++ int aLen = a.length; ++ int bLen = b.length; ++ String[] c = new String[aLen + bLen]; ++ System.arraycopy(a, 0, c, 0, aLen); ++ System.arraycopy(b, 0, c, aLen, bLen); ++ return c; ++ } ++ ++ /** ++ * Will stop the running Application. ++ * First tries to shutdown nicely by connecting to the shut down port. ++ * If that fails, the process will be killed hard with stopProcess(). ++ * ++ * If the nice shutdown fails, then an Exception is thrown and the test should fail. ++ * ++ * @param port The shut down port. ++ * @param processThread The process to stop. ++ */ ++ public static void stopApplication(int port, ProcessThread processThread) throws Throwable { ++ if (processThread == null) { ++ System.out.println("RunnerUtil.stopApplication ignored since proc is null"); ++ return; ++ } ++ try { ++ System.out.println("RunnerUtil.stopApplication waiting to for shutdown"); ++ OutputAnalyzer output = ProcessTools.executeTestJvm( ++ "-classpath", ++ System.getProperty("test.class.path", "."), ++ "Shutdown", ++ Integer.toString(port)); ++ // Verify that both the Shutdown command and the Application finished ok. ++ output.shouldHaveExitValue(0); ++ processThread.joinAndThrow(); ++ processThread.getOutput().shouldHaveExitValue(0); ++ } catch (Throwable t) { ++ System.out.println("RunnerUtil.stopApplication failed. Will kill it hard: " + t); ++ processThread.stopProcess(); ++ throw t; ++ } ++ } ++ ++ /** ++ * Creates a jar file. ++ * @param args Command to the jar tool. ++ */ ++ public static void createJar(String... args) { ++ System.out.println("Running: jar " + Arrays.toString(args)); ++ sun.tools.jar.Main jar = new sun.tools.jar.Main(System.out, System.err, "jar"); ++ if (!jar.run(args)) { ++ throw new RuntimeException("jar failed: args=" + Arrays.toString(args)); ++ } ++ } ++ ++ /** ++ * Read process info for the running Application. ++ * The Application writes its info to a file with this format: ++ * shutdownPort=42994 ++ * pid=19597 ++ * done ++ * ++ * The final "done" is used to make sure the complete file has been written ++ * before we try to read it. ++ * This function will wait until the file is available. ++ * ++ * @param filename Path to file to read. ++ * @return The ProcessInfo containing pid and shutdownPort. ++ */ ++ public static ProcessInfo readProcessInfo(String filename) throws Throwable { ++ System.out.println("Reading port and pid from file: " + filename); ++ File file = new File(filename); ++ String content = null; ++ ++ // Read file or wait for it to be created. ++ while (true) { ++ content = readFile(file); ++ if (content != null && content.indexOf("done") >= 0) { ++ break; ++ } ++ Thread.sleep(100); ++ } ++ ++ ProcessInfo info = new ProcessInfo(); ++ // search for a line with format: key=nnn ++ Pattern pattern = Pattern.compile("(\\w*)=([0-9]+)\\r?\\n"); ++ Matcher matcher = pattern.matcher(content); ++ while (matcher.find()) { ++ String key = matcher.group(1); ++ int value = Integer.parseInt(matcher.group(2)); ++ if ("pid".equals(key)) { ++ info.pid = value; ++ } else if ("shutdownPort".equals(key)) { ++ info.shutdownPort = value; ++ } ++ } ++ System.out.println("processInfo.pid:" + info.pid); ++ System.out.println("processInfo.shutdownPort:" + info.shutdownPort); ++ return info; ++ } ++ ++ /** ++ * Read the content of a file. ++ * @param file The file to read. ++ * @return The file content or null if file does not exists. ++ */ ++ public static String readFile(File file) throws IOException { ++ if (!file.exists()) { ++ return null; ++ } ++ try { ++ byte[] bytes = Files.readAllBytes(file.toPath()); ++ String content = new String(bytes); ++ return content; ++ } catch (IOException e) { ++ e.printStackTrace(); ++ throw e; ++ } ++ } ++ ++ /** ++ * Helper class with info of the running Application. ++ */ ++ public static class ProcessInfo { ++ public int pid = -1; ++ public int shutdownPort = -1; ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/tools/attach/TempDirTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,169 @@ ++/* ++ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import com.sun.tools.attach.*; ++ ++import java.nio.file.Files; ++import java.nio.file.Path; ++import java.util.Properties; ++import java.util.List; ++import java.io.File; ++ ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.ProcessThread; ++ ++/* ++ * @test ++ * @bug 8033104 ++ * @summary Test to make sure attach and jvmstat works correctly when java.io.tmpdir is set ++ * @library /lib/testlibrary ++ * @run build Application Shutdown RunnerUtil ++ * @run main/timeout=10 TempDirTest ++ */ ++ ++public class TempDirTest { ++ ++ public static void main(String args[]) throws Throwable { ++ ++ Path clientTmpDir = Files.createTempDirectory("TempDirTest-client"); ++ clientTmpDir.toFile().deleteOnExit(); ++ Path targetTmpDir = Files.createTempDirectory("TempDirTest-target"); ++ targetTmpDir.toFile().deleteOnExit(); ++ ++ // run the test with all possible combinations of setting java.io.tmpdir ++ runExperiment(null, null); ++ runExperiment(clientTmpDir, null); ++ runExperiment(clientTmpDir, targetTmpDir); ++ runExperiment(null, targetTmpDir); ++ ++ } ++ ++ private static int counter = 0; ++ ++ /* ++ * The actual test is in the nested class TestMain. ++ * The responsibility of this class is to: ++ * 1. Start the Application class in a separate process. ++ * 2. Find the pid and shutdown port of the running Application. ++ * 3. Launches the tests in nested class TestMain that will attach to the Application. ++ * 4. Shut down the Application. ++ */ ++ public static void runExperiment(Path clientTmpDir, Path targetTmpDir) throws Throwable { ++ ++ System.out.print("### Running tests with overridden tmpdir for"); ++ System.out.print(" client: " + (clientTmpDir == null ? "no" : "yes")); ++ System.out.print(" target: " + (targetTmpDir == null ? "no" : "yes")); ++ System.out.println(" ###"); ++ ++ final String pidFile = "TempDirTest.Application.pid-" + counter++; ++ ProcessThread processThread = null; ++ RunnerUtil.ProcessInfo info = null; ++ try { ++ String[] tmpDirArg = null; ++ if (targetTmpDir != null) { ++ tmpDirArg = new String[] {"-Djava.io.tmpdir=" + targetTmpDir}; ++ } ++ processThread = RunnerUtil.startApplication(pidFile, tmpDirArg); ++ info = RunnerUtil.readProcessInfo(pidFile); ++ launchTests(info.pid, clientTmpDir); ++ } catch (Throwable t) { ++ System.out.println("TempDirTest got unexpected exception: " + t); ++ t.printStackTrace(); ++ throw t; ++ } finally { ++ // Make sure the Application process is stopped. ++ RunnerUtil.stopApplication(info.shutdownPort, processThread); ++ } ++ } ++ ++ /** ++ * Runs the actual tests in nested class TestMain. ++ * The reason for running the tests in a separate process ++ * is that we need to modify the class path and ++ * the -Djava.io.tmpdir property. ++ */ ++ private static void launchTests(int pid, Path clientTmpDir) throws Throwable { ++ final String sep = File.separator; ++ ++ // Need to add jdk/lib/tools.jar to classpath. ++ String classpath = ++ System.getProperty("test.class.path", "") + File.pathSeparator + ++ System.getProperty("test.jdk", ".") + sep + "lib" + sep + "tools.jar"; ++ ++ String[] tmpDirArg = null; ++ if (clientTmpDir != null) { ++ tmpDirArg = new String [] {"-Djava.io.tmpdir=" + clientTmpDir}; ++ } ++ ++ // Arguments : [-Djava.io.tmpdir=] -classpath cp TempDirTest$TestMain pid ++ String[] args = RunnerUtil.concat( ++ tmpDirArg, ++ new String[] { ++ "-classpath", ++ classpath, ++ "TempDirTest$TestMain", ++ Integer.toString(pid) }); ++ OutputAnalyzer output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ } ++ ++ /** ++ * This is the actual test. It will attach to the running Application ++ * and perform a number of basic attach tests. ++ */ ++ public static class TestMain { ++ public static void main(String args[]) throws Exception { ++ String pid = args[0]; ++ ++ // Test 1 - list method should list the target VM ++ System.out.println(" - Test: VirtualMachine.list"); ++ List<VirtualMachineDescriptor> l = VirtualMachine.list(); ++ boolean found = false; ++ for (VirtualMachineDescriptor vmd: l) { ++ if (vmd.id().equals(pid)) { ++ found = true; ++ break; ++ } ++ } ++ if (found) { ++ System.out.println(" - " + pid + " found."); ++ } else { ++ throw new RuntimeException(pid + " not found in VM list"); ++ } ++ ++ // Test 2 - try to attach and verify connection ++ ++ System.out.println(" - Attaching to application ..."); ++ VirtualMachine vm = VirtualMachine.attach(pid); ++ ++ System.out.println(" - Test: system properties in target VM"); ++ Properties props = vm.getSystemProperties(); ++ String value = props.getProperty("attach.test"); ++ if (value == null || !value.equals("true")) { ++ throw new RuntimeException("attach.test property not set"); ++ } ++ System.out.println(" - attach.test property set as expected"); ++ } ++ } ++} +--- ./jdk/test/com/sun/tools/attach/java.policy.allow Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/java.policy.allow Mon Jan 05 11:57:27 2015 -0800 +@@ -13,7 +13,6 @@ + permission java.lang.RuntimePermission "accessClassInPackage.sun.jvmstat.monitor"; + permission java.lang.RuntimePermission "loadLibrary.attach"; + permission java.util.PropertyPermission "sun.jvmstat.*", "read"; +- permission java.util.PropertyPermission "java.io.tmpdir", "read"; + + /* to read configuration file in META-INF/services, and write/delete .attach_pid<pid> */ + permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; +--- ./jdk/test/com/sun/tools/attach/java.policy.deny Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/java.policy.deny Mon Jan 05 11:57:27 2015 -0800 +@@ -11,7 +11,6 @@ + permission java.lang.RuntimePermission "accessClassInPackage.sun.tools.attach"; + permission java.lang.RuntimePermission "loadLibrary.attach"; + permission java.util.PropertyPermission "sun.jvmstat.*", "read"; +- permission java.util.PropertyPermission "java.io.tmpdir", "read"; + + /* to read configuration file in META-INF/services, and write/delete .attach_pid<pid> */ + permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; +--- ./jdk/test/demo/zipfs/basic.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/demo/zipfs/basic.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -40,7 +40,7 @@ + + OS=`uname -s` + case "$OS" in +- Windows_* ) ++ Windows_* | CYGWIN* ) + CLASSPATH="${TESTCLASSES};${ZIPFS}" + ;; + * ) +--- ./jdk/test/java/awt/FileDialog/SaveFileNameOverrideTest/SaveFileNameOverrideTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/awt/FileDialog/SaveFileNameOverrideTest/SaveFileNameOverrideTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,6 +1,29 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ + /* + test +- @bug 6998877 ++ @bug 6998877 8022531 + @summary After double-click on the folder names, FileNameOverrideTest FAILED + @author Sergey.Bylokhov@oracle.com area=awt.filedialog + @library ../../regtesthelpers +@@ -36,7 +59,8 @@ + + String[] instructions = { + "1) Click on 'Show File Dialog' button. A file dialog will come up.", +- "2) Double-click on '" + clickDirName + "' and click OK.", ++ "2) Double-click on '" + clickDirName + "' and click a confirmation", ++ " button, it can be 'OK', 'Save' or any other platform-dependent name.", + "3) See result of the test below" + }; + +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/8044614/TestApplet.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,34 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.applet.Applet; ++import java.awt.TextField; ++ ++public class TestApplet extends Applet { ++ TextField textField = null; ++ ++ public void init() { ++ textField = new TextField(25); ++ add(textField); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/8044614/applet1.html Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,37 @@ ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++ ++<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> ++<html lang="en"> ++<head> ++ <meta http-equiv="content-type" content="text/html; charset=utf-8"> ++ <title>First Applet</title> ++</head> ++ <body> ++ <applet ++ code="TestApplet.class" ++ width="400" ++ height="200"/> ++ </applet> ++ </body> ++</html> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/8044614/applet2.html Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,37 @@ ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++ ++<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> ++<html lang="en"> ++<head> ++ <meta http-equiv="content-type" content="text/html; charset=utf-8"> ++ <title>Second Applet</title> ++</head> ++ <body> ++ <applet ++ code="TestApplet.class" ++ width="400" ++ height="200"/> ++ </applet> ++ </body> ++</html> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/8044614/bug8044614.html Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,36 @@ ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++ ++<html> ++<head> ++<title>bug8044614</title> ++</head> ++<body> ++ ++<h1>bug8044614</h1> ++ ++<p> See the dialog box (usually in upper left corner) for instructions</p> ++ ++<APPLET CODE="bug8044614.class" WIDTH=200 HEIGHT=200></APPLET> ++</body> ++</html> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/8044614/bug8044614.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,56 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8044614 ++ * @summary Tests focus transfer between applets in different browser windows ++ * @author Dmitry Markov ++ * @library ../../regtesthelpers ++ * @build Sysout ++ * @run applet/manual=yesno bug8044614.html ++ */ ++ ++import javax.swing.JApplet; ++ ++import test.java.awt.regtesthelpers.Sysout; ++ ++public class bug8044614 extends JApplet { ++ public void init() { ++ String[] instructions = { ++ "(1) Go to the test directory test/java/awt/Focus/8044614", ++ "(2) Compile source file: javac TestApplet.java", ++ "(3) Open the \"main.html\" file in the browser", ++ "(4) Click the \"Start First Applet\" link to open the first applet window", ++ "(5) Wait for the applet to start (press \"Run\" to any security alerts that appears)", ++ "(6) Enter \"Hello\" to the text field", ++ "(7) Click the \"Start Second Applet)\" link to open the second applet window", ++ "(8) Wait for the applet to start (press \"Run\" to any security alerts that appears)", ++ "(9) Enter \"World\" to the text field", ++ "(10) Go back to the first applet and make sure you can enter some text to the text field" ++ }; ++ ++ Sysout.createDialogWithInstructions(instructions); ++ } ++} ++ +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/8044614/main.html Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,46 @@ ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++ ++<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> ++<html lang="en"> ++<head> ++ <meta http-equiv="content-type" content="text/html; charset=utf-8"> ++ <title>Applet Focus Bug main window</title> ++ <script language="JavaScript"> ++ function openWindow(strURL, strWindowName, strWindowFeatures) { ++ var win = window.open(strURL, strWindowName, strWindowFeatures); ++ } ++ </script> ++ ++</head> ++ <body> ++ <table> ++ <tr> ++ <td><a href="javascript:openWindow('applet1.html', '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=400, height=400, top=0, left=0, hide=no')">Start First Applet</a></td> ++ </tr> ++ <tr> ++ <td><a href="javascript:openWindow('applet2.html', '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=400, height=400, top=0, left=350, hide=no')">Start Second Applet</a></td> ++ </tr> ++ </table> ++ </body> ++</html> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/NPEInKFMOnButtonClickInDialogTest/NPEInKFMOnButtonClickInDialogTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,135 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ @bug 8061954 ++ @summary Button does not get the focus on a mouse click, and NPE is thrown in KFM ++ @author Anton Litvinov ++*/ ++ ++import java.awt.Container; ++import java.awt.FlowLayout; ++import java.awt.Frame; ++import java.awt.Point; ++import java.awt.Robot; ++import java.awt.Toolkit; ++import java.awt.event.InputEvent; ++import javax.swing.JButton; ++import javax.swing.JDialog; ++import javax.swing.SwingUtilities; ++ ++import sun.awt.OSInfo; ++import sun.awt.SunToolkit; ++ ++public class NPEInKFMOnButtonClickInDialogTest { ++ private static Frame frame = null; ++ private static JDialog dialog = null; ++ private static JButton cancelBtn = null; ++ private static Point clickPoint = null; ++ private static volatile Boolean cancelBtnIsFocused = null; ++ ++ public static void main(String[] args) { ++ OSInfo.OSType osType = OSInfo.getOSType(); ++ if ((osType != OSInfo.OSType.LINUX) && (osType != OSInfo.OSType.SOLARIS)) { ++ System.out.println("This test is only for Linux OS and Solaris OS."); ++ return; ++ } ++ ++ ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup(); ++ Thread t = new Thread(new ThreadGroup(mainThreadGroup, "TestThreadGroup"), new Runnable() { ++ public void run() { ++ try { ++ SunToolkit.createNewAppContext(); ++ doTest(); ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ } ++ }); ++ t.start(); ++ ++ try { ++ t.join(); ++ } catch (InterruptedException ie) { ++ ie.printStackTrace(); ++ } ++ ++ if (cancelBtnIsFocused == null) { ++ throw new RuntimeException("Test failed for an unknown reason, look at error log."); ++ } else if (cancelBtnIsFocused.booleanValue() == false) { ++ throw new RuntimeException("'Cancel' button did not become a focus owner."); ++ } ++ } ++ ++ private static void doTest() throws Exception { ++ final SunToolkit toolkit = (SunToolkit)Toolkit.getDefaultToolkit(); ++ final Robot robot = new Robot(); ++ robot.setAutoDelay(50); ++ ++ try { ++ frame = new Frame("Frame of NPEInKFMOnButtonClickInDialogTest"); ++ frame.setSize(100, 100); ++ frame.setVisible(true); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ dialog = new JDialog(frame, ++ "Dialog of NPEInKFMOnButtonClickInDialogTest", false); ++ Container content = dialog.getContentPane(); ++ content.setLayout(new FlowLayout()); ++ content.add(new JButton("Run")); ++ content.add(cancelBtn = new JButton("Cancel")); ++ dialog.pack(); ++ dialog.setVisible(true); ++ } ++ }); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ Point p = cancelBtn.getLocationOnScreen(); ++ clickPoint = new Point(p.x + cancelBtn.getWidth() / 2, ++ p.y + cancelBtn.getHeight() / 2); ++ } ++ }); ++ robot.mouseMove(clickPoint.x, clickPoint.y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ cancelBtnIsFocused = cancelBtn.isFocusOwner(); ++ } ++ }); ++ } finally { ++ if (dialog != null) { ++ dialog.dispose(); ++ } ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/SortingFPT/JDK8048887.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,132 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ @test ++ @bug 8048887 ++ @summary Tests SortingFTP for an exception caused by the tim-sort algo. ++ @author anton.tarasov: area=awt.focus ++ @run main JDK8040632 ++*/ ++ ++import javax.swing.JFrame; ++import javax.swing.JPanel; ++import javax.swing.SwingUtilities; ++import java.awt.Dimension; ++import java.awt.Color; ++import java.awt.GridBagLayout; ++import java.awt.GridBagConstraints; ++import java.awt.event.WindowAdapter; ++import java.awt.event.WindowEvent; ++import java.util.concurrent.CountDownLatch; ++import java.util.concurrent.TimeUnit; ++ ++public class JDK8048887 { ++ ++ static volatile boolean passed = true; ++ ++ public static void main(String[] args) { ++ JDK8048887 app = new JDK8048887(); ++ app.start(); ++ } ++ ++ public void start() { ++ final CountDownLatch latch = new CountDownLatch(1); ++ ++ SwingUtilities.invokeLater(() -> { ++ // Catch the original exception which sounds like: ++ // java.lang.IllegalArgumentException: Comparison method violates its general contract! ++ Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { ++ public void uncaughtException(Thread t, Throwable e) { ++ e.printStackTrace(); ++ if (e instanceof IllegalArgumentException) { ++ passed = false; ++ latch.countDown(); ++ } ++ } ++ }); ++ ++ TestDialog d = new TestDialog(); ++ // It's expected that the dialog is focused on start. ++ // The listener is called after the FTP completes processing and the bug is reproduced or not. ++ d.addWindowFocusListener(new WindowAdapter() { ++ public void windowGainedFocus(WindowEvent e) { ++ latch.countDown(); ++ } ++ }); ++ d.setVisible(true); ++ }); ++ ++ try { ++ latch.await(5, TimeUnit.SECONDS); ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ } ++ ++ if (passed) ++ System.out.println("Test passed."); ++ else ++ throw new RuntimeException("Test failed!"); ++ } ++} ++ ++class TestDialog extends JFrame { ++ ++ // The layout of the components reproduces the transitivity issue ++ // with SortingFocusTraversalPolicy relying on the tim-sort algo. ++ ++ private static int[] Xs = new int[] {71, 23, 62, 4, 79, 39, 34, 9, 84, 58, 30, 34, 38, 15, 69, 10, 44, 95, 70, 54, ++ 44, 62, 77, 64, 70, 83, 31, 48, 96, 54, 40, 3, 60, 58, 3, 20, 94, 54, 26, 19, 48, 47, 12, 70, 86, 43, 71, 97, 19, ++ 69, 90, 22, 43, 76, 10, 60, 29, 49, 9, 9, 15, 73, 85, 80, 81, 35, 87, 43, 17, 57, 38, 44, 29, 86, 96, 15, 57, 26, ++ 27, 78, 26, 87, 43, 6, 4, 16, 57, 99, 32, 86, 96, 5, 50, 69, 12, 4, 36, 84, 71, 60, 22, 46, 11, 44, 87, 3, 23, 14, ++ 43, 25, 32, 44, 11, 18, 77, 2, 51, 87, 88, 53, 69, 37, 14, 10, 25, 73, 39, 33, 91, 51, 96, 9, 74, 66, 70, 42, 72, ++ 7, 82, 40, 91, 33, 83, 54, 33, 50, 83, 1, 81, 32, 66, 11, 75, 56, 53, 45, 1, 69, 46, 31, 79, 58, 12, 20, 92, 49, ++ 50, 90, 33, 8, 43, 93, 72, 78, 9, 56, 84, 60, 30, 39, 33, 88, 84, 56, 49, 47, 4, 90, 57, 6, 23, 96, 37, 88, 22, 79, ++ 35, 80, 45, 55}; ++ ++ public TestDialog() { ++ JPanel panel = new JPanel(new GridBagLayout()); ++ GridBagConstraints gbc = new GridBagConstraints(); ++ for (int i=0; i < Xs.length; i++) { ++ gbc.gridx = Xs[i]; ++ gbc.gridy = 100 - gbc.gridx; ++ panel.add(new MyComponent(), gbc); ++ } ++ getRootPane().getContentPane().add(panel); ++ pack(); ++ } ++ ++ public static class MyComponent extends JPanel { ++ private final static Dimension SIZE = new Dimension(1,1); ++ ++ public MyComponent() { ++ setBackground(Color.BLACK); ++ setOpaque(true); ++ } ++ ++ @Override ++ public Dimension getPreferredSize() { ++ return SIZE; ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/List/ListGarbageCollectionTest/AwtListGarbageCollectionTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,72 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8040076 ++ * @summary AwtList not garbage collected ++ * @run main/othervm -Xmx100m AwtListGarbageCollectionTest ++ */ ++ ++import java.awt.*; ++import java.awt.event.WindowAdapter; ++import java.awt.event.WindowEvent; ++import java.lang.ref.WeakReference; ++ ++public class AwtListGarbageCollectionTest { ++ public static void main(String[] args) { ++ Frame frame = new Frame("List leak test"); ++ try { ++ test(frame); ++ } finally { ++ frame.dispose(); ++ } ++ } ++ ++ private static void test(Frame frame) { ++ WeakReference<List> weakListRef = null; ++ try { ++ frame.setSize(300, 200); ++ frame.setVisible(true); ++ ++ List strongListRef = new List(); ++ frame.add(strongListRef); ++ strongListRef.setMultipleMode(true); ++ frame.remove(strongListRef); ++ weakListRef = new WeakReference<List>(strongListRef); ++ strongListRef = null; ++ ++ //make out of memory to force gc ++ String veryLongString = new String(new char[100]); ++ while (true) { ++ veryLongString += veryLongString; ++ } ++ } catch (OutOfMemoryError e) { ++ if (weakListRef == null) { ++ throw new RuntimeException("Weak list ref wasn't created"); ++ } else if (weakListRef.get() != null) { ++ throw new RuntimeException("List wasn't garbage collected"); ++ } ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Mouse/MouseComboBoxTest/MouseComboBoxTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,138 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8032872 ++ * @summary Tests JComboBox selection via the mouse ++ * @author Dmitry Markov ++ */ ++import sun.awt.SunToolkit; ++ ++import javax.swing.*; ++import javax.swing.plaf.basic.BasicComboPopup; ++import javax.swing.plaf.basic.ComboPopup; ++import javax.swing.plaf.metal.MetalComboBoxUI; ++import javax.swing.plaf.metal.MetalLookAndFeel; ++import java.awt.*; ++import java.awt.event.InputEvent; ++import java.awt.event.KeyEvent; ++ ++public class MouseComboBoxTest { ++ private static final String[] items = {"One", "Two", "Three", "Four", "Five"}; ++ ++ private static SunToolkit toolkit = null; ++ private static Robot robot = null; ++ private static JFrame frame = null; ++ private static JComboBox comboBox = null; ++ private static MyComboBoxUI comboBoxUI = null; ++ ++ public static void main(String[] args) throws Exception { ++ toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ robot = new Robot(); ++ robot.setAutoDelay(50); ++ ++ UIManager.setLookAndFeel(new MetalLookAndFeel()); ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ toolkit.realSync(); ++ ++ for (int i = 0; i < items.length; i++) { ++ // Open popup ++ robot.keyPress(KeyEvent.VK_DOWN); ++ robot.keyRelease(KeyEvent.VK_DOWN); ++ toolkit.realSync(); ++ ++ Point point = getItemPointToClick(i); ++ robot.mouseMove(point.x, point.y); ++ robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); ++ toolkit.realSync(); ++ ++ if (i != getSelectedIndex()) { ++ throw new RuntimeException("Test Failed! Incorrect value of selected index = " + getSelectedIndex() + ++ ", expected value = " + i); ++ } ++ } ++ } ++ ++ private static Point getItemPointToClick(final int item) throws Exception { ++ final Point[] result = new Point[1]; ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ BasicComboPopup popup = (BasicComboPopup)comboBoxUI.getComboPopup(); ++ Point point = popup.getLocationOnScreen(); ++ Dimension size = popup.getSize(); ++ ++ int step = size.height / items.length; ++ point.x += size.width / 2; ++ point.y += step / 2 + step * item; ++ result[0] = point; ++ } ++ }); ++ return result[0]; ++ } ++ ++ private static int getSelectedIndex() throws Exception { ++ final int[] result = new int[1]; ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ result[0] = comboBox.getSelectedIndex(); ++ } ++ }); ++ return result[0]; ++ } ++ ++ private static void createAndShowGUI() { ++ frame = new JFrame("MouseComboBoxTest"); ++ ++ comboBox = new JComboBox(items); ++ comboBox.setEditable(true); ++ comboBoxUI = new MyComboBoxUI(); ++ comboBox.setUI(comboBoxUI); ++ ++ frame.pack(); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ frame.setVisible(true); ++ ++ JWindow window = new JWindow(frame); ++ window.add(comboBox); ++ window.pack(); ++ window.setVisible(true); ++ } ++ ++ private static class MyComboBoxUI extends MetalComboBoxUI { ++ public ComboPopup getComboPopup() { ++ return popup; ++ } ++ } ++} ++ +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Window/BackgroundIsNotUpdated/BackgroundIsNotUpdated.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,84 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.awt.AWTException; ++import java.awt.Color; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Point; ++import java.awt.Robot; ++import java.awt.Toolkit; ++import java.awt.Window; ++ ++import sun.awt.SunToolkit; ++ ++/** ++ * @test ++ * @bug 8001472 ++ * @summary Background of the window should not depend from the paint()/update() ++ * @author Sergey Bylokhov ++ */ ++public final class BackgroundIsNotUpdated extends Window { ++ ++ public BackgroundIsNotUpdated(final Frame owner) { ++ super(owner); ++ } ++ ++ @Override ++ public void paint(final Graphics ignored) { ++ // Intentionally left blank ++ } ++ ++ @Override ++ public void update(final Graphics ignored) { ++ // Intentionally left blank ++ } ++ ++ public static void main(final String[] args) throws AWTException { ++ final Window window = new BackgroundIsNotUpdated(null); ++ window.setSize(300, 300); ++ window.setLocationRelativeTo(null); ++ window.setVisible(true); ++ sleep(); ++ window.setBackground(Color.GREEN); ++ sleep(); ++ final Robot robot = new Robot(); ++ robot.setAutoDelay(200); ++ Point point = window.getLocationOnScreen(); ++ Color color = robot.getPixelColor(point.x + window.getWidth() / 2, ++ point.y + window.getHeight() / 2); ++ window.dispose(); ++ if (!color.equals(Color.GREEN)) { ++ throw new RuntimeException( ++ "Expected: " + Color.GREEN + " , Actual: " + color); ++ } ++ } ++ ++ private static void sleep() { ++ try { ++ ((SunToolkit) Toolkit.getDefaultToolkit()).realSync(); ++ Thread.sleep(1000); ++ } catch (InterruptedException ignored) { ++ } ++ } ++} +--- ./jdk/test/java/awt/Window/Grab/GrabTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/awt/Window/Grab/GrabTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -40,7 +40,10 @@ + public class GrabTest { + private static Frame f; + private static Frame f1; ++ private static Frame frame; + private static Window w; ++ private static Window window1; ++ private static Window window2; + private static Button b; + + private static Robot robot; +@@ -98,6 +101,15 @@ + f.setVisible(true); + w.setVisible(true); + ++ frame = new Frame(); ++ window1 = new Window(frame); ++ window1.setBounds(0, 0, 100, 100); ++ window1.setBackground(Color.blue); ++ ++ window2 = new Window(window1); ++ window2.setBounds(0, 0, 50, 50); ++ window2.setBackground(Color.green); ++ + tk = (sun.awt.SunToolkit)Toolkit.getDefaultToolkit(); + + try { +@@ -175,7 +187,7 @@ + + // 6. Check that press on the outside area causes ungrab + Point loc = f.getLocationOnScreen(); +- robot.mouseMove(loc.x + 100, loc.y + f.getSize().height + 1); ++ robot.mouseMove(loc.x + 100, loc.y + f.getSize().height + 10); + Util.waitForIdle(robot); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.delay(50); +@@ -196,6 +208,24 @@ + passed = false; + System.err.println("Failure: [7] Window disposal didn't cause ungrab"); + } ++ ungrabbed = false; ++ ++ ++ // 8. Check that mouse click on subwindow does not cause ungrab ++ frame.setVisible(true); ++ window1.setVisible(true); ++ window2.setVisible(true); ++ Util.waitForIdle(robot); ++ ++ tk.grab(window1); ++ ++ Util.clickOnComp(window2, robot); ++ Util.waitForIdle(robot); ++ ++ if (ungrabbed) { ++ passed = false; ++ System.err.println("Failure: [8] Press on the subwindow caused ungrab"); ++ } + + if (passed) { + System.out.println("Test passed."); +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/event/InputEvent/EventWhenTest/EventWhenTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,132 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import sun.awt.SunToolkit; ++ ++import java.awt.*; ++import java.awt.event.AWTEventListener; ++import java.awt.event.InputEvent; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseEvent; ++ ++/* ++ * @test ++ * @bug 8046495 ++ * @summary Verifies that mouse/key events has always increasing 'when' timestamps ++ * @author Anton Nashatyrev ++ * @run main EventWhenTest ++ */ ++public class EventWhenTest { ++ ++ private static volatile int eventsCount = 0; ++ private static volatile boolean failed = false; ++ ++ static { ++ Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { ++ long lastWhen = 0; ++ ++ @Override ++ public void eventDispatched(AWTEvent event) { ++ long curWhen; ++ if (event instanceof KeyEvent) { ++ curWhen = ((KeyEvent) event).getWhen(); ++ } else if (event instanceof MouseEvent) { ++ curWhen = ((MouseEvent) event).getWhen(); ++ } else { ++ return; ++ } ++ ++ eventsCount++; ++ ++ if (curWhen < lastWhen) { ++ System.err.println("FAILED: " + curWhen + " < " + lastWhen + ++ " for " + event); ++ failed = true; ++ } else { ++ lastWhen = curWhen; ++ } ++ } ++ }, AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK); ++ } ++ ++ public static void main(String[] args) throws Exception { ++ ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ Frame frame = new Frame(); ++ ++ try { ++ Button b = new Button("Button"); ++ frame.setBounds(300, 300, 300, 300); ++ frame.add(b); ++ frame.setVisible(true); ++ toolkit.realSync(); ++ ++ Robot robot = new Robot(); ++ robot.mouseMove((int)frame.getLocationOnScreen().getX() + 150, ++ (int)frame.getLocationOnScreen().getY() + 150); ++ ++ eventsCount = 0; ++ System.out.println("Clicking mouse..."); ++ for (int i = 0; i < 300 && !failed; i++) { ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ Thread.sleep(10); ++ b.setLabel("Click: " + i); ++ } ++ ++ if (eventsCount == 0) { ++ throw new RuntimeException("No events were received"); ++ } ++ ++ if (failed) { ++ throw new RuntimeException("Test failed."); ++ } ++ System.out.println("Clicking mouse done: " + eventsCount + " events."); ++ ++ b.requestFocusInWindow(); ++ toolkit.realSync(); ++ ++ eventsCount = 0; ++ System.out.println("Typing a key..."); ++ for (int i = 0; i < 300 && !failed; i++) { ++ robot.keyPress(KeyEvent.VK_A); ++ robot.keyRelease(KeyEvent.VK_A); ++ Thread.sleep(10); ++ b.setLabel("Type: " + i); ++ } ++ System.out.println("Key typing done: " + eventsCount + " events."); ++ ++ if (eventsCount == 0) { ++ throw new RuntimeException("No events were received"); ++ } ++ ++ if (failed) { ++ throw new RuntimeException("Test failed."); ++ } ++ ++ System.out.println("Success!"); ++ } finally { ++ frame.dispose(); ++ } ++ } ++} +--- ./jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + + /* + @test +- @bug 7154072 ++ @bug 7154072 7161320 + @summary Tests that key events with modifiers are not swallowed. + @author anton.tarasov: area=awt.focus + @library ../../../regtesthelpers +@@ -49,6 +49,11 @@ + static Robot r; + + public static void main(String[] args) { ++ if (sun.awt.OSInfo.getOSType() == sun.awt.OSInfo.OSType.WINDOWS) { ++ System.out.println("Skipped. Test not for MS Windows."); ++ return; ++ } ++ + f.add(t); + f.pack(); + f.setVisible(true); +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/im/8041990/bug8041990.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,120 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++/* ++ @test ++ @bug 8041990 ++ @summary Language specific keys does not work in applets when opened outside the browser ++ @author Petr Pchelko ++*/ ++ ++import sun.awt.SunToolkit; ++ ++import javax.swing.*; ++import java.awt.*; ++import java.awt.event.InputMethodEvent; ++import java.awt.font.TextHitInfo; ++import java.text.AttributedString; ++import java.util.concurrent.CountDownLatch; ++import java.util.concurrent.atomic.AtomicReference; ++ ++public class bug8041990 { ++ private static JFrame frame; ++ private static JComponent component; ++ ++ public static void main(String[] args) throws Exception { ++ ThreadGroup stubTG = new ThreadGroup(getRootThreadGroup(), "Stub Thread Group"); ++ ThreadGroup swingTG = new ThreadGroup(getRootThreadGroup(), "SwingTG"); ++ try { ++ Thread stubThread = new Thread(stubTG, new Runnable() { ++ public void run() { ++ SunToolkit.createNewAppContext(); ++ } ++ }); ++ stubThread.start(); ++ stubThread.join(); ++ ++ final CountDownLatch startSwingLatch = new CountDownLatch(1); ++ new Thread(swingTG, new Runnable() { ++ public void run() { ++ SunToolkit.createNewAppContext(); ++ SwingUtilities.invokeLater(new Runnable() { ++ public void run() { ++ frame = new JFrame(); ++ component = new JLabel("Test Text"); ++ frame.add(component); ++ frame.setBounds(100, 100, 100, 100); ++ frame.setVisible(true); ++ startSwingLatch.countDown(); ++ } ++ }); ++ } ++ }).start(); ++ startSwingLatch.await(); ++ ++ final AtomicReference<Exception> caughtException = new AtomicReference<>(); ++ Thread checkThread = new Thread(getRootThreadGroup(), new Runnable() { ++ public void run() { ++ try { ++ // If the bug is present this will throw exception ++ new InputMethodEvent(component, ++ InputMethodEvent.CARET_POSITION_CHANGED, ++ TextHitInfo.leading(0), ++ TextHitInfo.trailing(0)); ++ } catch (Exception e) { ++ caughtException.set(e); ++ } ++ } ++ }); ++ checkThread.start(); ++ checkThread.join(); ++ ++ if (caughtException.get() != null) { ++ throw new RuntimeException("Failed. Caught exception!", caughtException.get()); ++ } ++ } finally { ++ new Thread(swingTG, new Runnable() { ++ public void run() { ++ SwingUtilities.invokeLater(new Runnable() { ++ public void run() { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ }); ++ } ++ }).start(); ++ } ++ } ++ ++ private static ThreadGroup getRootThreadGroup() { ++ ThreadGroup currentTG = Thread.currentThread().getThreadGroup(); ++ ThreadGroup parentTG = currentTG.getParent(); ++ while (parentTG != null) { ++ currentTG = parentTG; ++ parentTG = currentTG.getParent(); ++ } ++ return currentTG; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/beans/Introspector/Test7172865.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,162 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.beans.IndexedPropertyDescriptor; ++import java.beans.MethodDescriptor; ++import java.beans.PropertyDescriptor; ++ ++/* ++ * @test ++ * @bug 7172854 7172865 ++ * @summary Tests that cached methods are not lost ++ * @author Sergey Malenkov ++ */ ++ ++public class Test7172865 { ++ public static void main(String[] args) throws Exception { ++ int errors = 0; ++ ++ MethodDescriptor md = new MethodDescriptor(Test7172865.class.getMethod("getGood")); ++ ++ errors += test(PropertyDescriptor.class, "good", true); ++ PropertyDescriptor pdGoodString = new PropertyDescriptor("good", Test7172865.class, "getGood", "setGood"); ++ PropertyDescriptor pdGoodMethod = new PropertyDescriptor("good", ++ Test7172865.class.getMethod("getGood"), ++ Test7172865.class.getMethod("setGood", args.getClass())); ++ ++ errors += test(PropertyDescriptor.class, "bad", false); ++ PropertyDescriptor pdBadString = new PropertyDescriptor("bad", Test7172865.class, "getBad", null); ++ PropertyDescriptor pdBadMethod = new PropertyDescriptor("bad", ++ Test7172865.class.getMethod("getBad"), ++ Test7172865.class.getMethod("setBad", args.getClass())); ++ ++ errors += test(IndexedPropertyDescriptor.class, "good", true); ++ IndexedPropertyDescriptor ipdGoodString = new IndexedPropertyDescriptor("good", Test7172865.class, "getGood", "setGood", "getGood", "setGood"); ++ IndexedPropertyDescriptor ipdGoodMethod = new IndexedPropertyDescriptor("good", ++ Test7172865.class.getMethod("getGood"), ++ Test7172865.class.getMethod("setGood", args.getClass()), ++ Test7172865.class.getMethod("getGood", Integer.TYPE), ++ Test7172865.class.getMethod("setGood", Integer.TYPE, String.class)); ++ ++ errors += test(IndexedPropertyDescriptor.class, "bad", false); ++ IndexedPropertyDescriptor ipdBadString = new IndexedPropertyDescriptor("bad", Test7172865.class, "getBad", null, "getBad", null); ++ IndexedPropertyDescriptor ipdBadMethod = new IndexedPropertyDescriptor("bad", ++ Test7172865.class.getMethod("getBad"), ++ Test7172865.class.getMethod("setBad", args.getClass()), ++ Test7172865.class.getMethod("getBad", Integer.TYPE), ++ Test7172865.class.getMethod("setBad", Integer.TYPE, String.class)); ++ ++ for (int i = 1; i <= 2; i++) { ++ System.out.println("STEP: " + i); ++ errors += test("md", null != md.getMethod()); ++ ++ errors += test("pdGoodString", pdGoodString, true, true); ++ errors += test("pdGoodMethod", pdGoodMethod, true, true); ++ ++ errors += test("pdBadString", pdBadString, true, false); ++ errors += test("pdBadMethod", pdBadMethod, true, true); ++ ++ errors += test("ipdGoodString", ipdGoodString, true, true, true, true); ++ errors += test("ipdGoodMethod", ipdGoodMethod, true, true, true, true); ++ ++ errors += test("ipdBadString", ipdBadString, true, false, true, false); ++ errors += test("ipdBadMethod", ipdBadMethod, true, true, true, true); ++ ++ try { ++ int[] array = new int[1024]; ++ while (true) { ++ array = new int[array.length << 1]; ++ } ++ } ++ catch (OutOfMemoryError error) { ++ System.gc(); ++ } ++ } ++ if (errors > 0) { ++ throw new Error("found " + errors + " errors"); ++ } ++ } ++ ++ private static int test(Class<?> type, String property, boolean value) { ++ String message = type.getSimpleName() + "(" + property + ") "; ++ try { ++ type.getConstructor(String.class, Class.class).newInstance(property, Test7172865.class); ++ message += "passed"; ++ } ++ catch (Exception exception) { ++ message += "failed"; ++ value = !value; ++ } ++ if (value) { ++ message += " as expected"; ++ } ++ System.out.println(message); ++ return value ? 0 : 1; ++ } ++ ++ private static int test(String message, boolean value) { ++ System.out.println(message + ": " + (value ? "passed" : "failed")); ++ return value ? 0 : 1; ++ } ++ ++ private static int test(String message, PropertyDescriptor pd, boolean rm, boolean wm) { ++ return test(message + ".Read", rm == (null != pd.getReadMethod())) ++ + test(message + ".Write", wm == (null != pd.getWriteMethod())); ++ } ++ ++ private static int test(String message, IndexedPropertyDescriptor ipd, boolean rm, boolean wm, boolean irm, boolean iwm) { ++ return test(message, ipd, rm, wm) ++ + test(message + ".IndexedRead", irm == (null != ipd.getIndexedReadMethod())) ++ + test(message + ".IndexedWrite", iwm == (null != ipd.getIndexedWriteMethod())); ++ } ++ ++ public String[] getGood() { ++ return null; ++ } ++ ++ public String getGood(int index) { ++ return null; ++ } ++ ++ public void setGood(String[] good) { ++ } ++ ++ public void setGood(int index, String value) { ++ } ++ ++ public String[] getBad() { ++ return null; ++ } ++ ++ public String getBad(int index) { ++ return null; ++ } ++ ++ public Test7172865 setBad(String[] bad) { ++ return null; ++ } ++ ++ public Test7172865 setBad(int index, String value) { ++ return null; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/beans/XMLEncoder/Test8016545.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,106 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8016545 ++ * @summary Tests beans with predefined fields ++ * @author Sergey Malenkov ++ */ ++ ++public class Test8016545 extends AbstractTest { ++ public static void main(String[] args) { ++ new Test8016545().test(true); ++ } ++ ++ @Override ++ protected Object getObject() { ++ Bean bean = new Bean(); ++ bean.setUndefined(Boolean.FALSE); ++ Info info = new Info(); ++ info.setEnabled(Boolean.TRUE); ++ info.setID(1); ++ bean.setInfo(info); ++ return bean; ++ } ++ ++ @Override ++ protected Object getAnotherObject() { ++ Bean bean = new Bean(); ++ bean.setUndefined(Boolean.TRUE); ++ bean.getInfo().setEnabled(Boolean.FALSE); ++ bean.getInfo().setID(2); ++ return bean; ++ } ++ ++ public static class Bean { ++ private Info info = new Info(); // predefined ++ private Boolean defined = Boolean.TRUE; ++ private Boolean undefined; ++ ++ public Info getInfo() { ++ return this.info; ++ } ++ ++ public void setInfo(Info info) { ++ this.info = info; ++ } ++ ++ public Boolean getDefined() { ++ return this.defined; ++ } ++ ++ public void setDefined(Boolean defined) { ++ this.defined = defined; ++ } ++ ++ public Boolean getUndefined() { ++ return this.undefined; ++ } ++ ++ public void setUndefined(Boolean undefined) { ++ this.undefined = undefined; ++ } ++ } ++ ++ public static class Info { ++ private Integer id; ++ private Boolean enabled; ++ ++ public Integer getID() { ++ return this.id; ++ } ++ ++ public void setID(Integer id) { ++ this.id = id; ++ } ++ ++ public Boolean getEnabled() { ++ return this.enabled; ++ } ++ ++ public void setEnabled(Boolean enabled) { ++ this.enabled = enabled; ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/io/ByteArrayOutputStream/MaxCapacity.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,65 @@ ++/* ++ * Copyright (c) 2014 Google Inc. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @ignore This test has huge memory requirements ++ * @run main/timeout=1800/othervm -Xmx8g MaxCapacity ++ * @bug 8055949 ++ * @summary Check that we can write (almost) Integer.MAX_VALUE bytes ++ * to a ByteArrayOutputStream. ++ * @author Martin Buchholz ++ */ ++import java.io.ByteArrayOutputStream; ++ ++public class MaxCapacity { ++ public static void main(String[] args) { ++ long maxHeap = Runtime.getRuntime().maxMemory(); ++ if (maxHeap < 3L * Integer.MAX_VALUE) { ++ System.out.printf("Skipping test; max memory %sM too small%n", ++ maxHeap/(1024*1024)); ++ return; ++ } ++ ByteArrayOutputStream baos = new ByteArrayOutputStream(); ++ for (long n = 0; ; n++) { ++ try { ++ baos.write((byte)'x'); ++ } catch (Throwable t) { ++ // check data integrity while we're here ++ byte[] bytes = baos.toByteArray(); ++ if (bytes.length != n) ++ throw new AssertionError("wrong length"); ++ if (bytes[0] != 'x' || ++ bytes[bytes.length - 1] != 'x') ++ throw new AssertionError("wrong contents"); ++ ++ long gap = Integer.MAX_VALUE - n; ++ System.out.printf("gap=%dM %d%n", gap/(1024*1024), gap); ++ if (gap > 1024) ++ throw t; ++ // t.printStackTrace(); ++ break; ++ } ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/io/File/CheckPermission.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,379 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ * @bug 8017212 ++ * @summary Examine methods in File.java that access the file system do the ++ * right permission check when a security manager exists. ++ * @author Dan Xu ++ */ ++ ++import java.io.File; ++import java.io.FilenameFilter; ++import java.io.FileFilter; ++import java.io.IOException; ++import java.security.Permission; ++import java.util.ArrayList; ++import java.util.EnumMap; ++import java.util.EnumSet; ++import java.util.HashSet; ++import java.util.List; ++import java.util.Map; ++import java.util.Set; ++ ++public class CheckPermission { ++ ++ private static final String CHECK_PERMISSION_TEST = "CheckPermissionTest"; ++ ++ public enum FileOperation { ++ READ, WRITE, DELETE, EXEC ++ } ++ ++ static class Checks { ++ private List<Permission> permissionsChecked = new ArrayList<>(); ++ private Set<String> propertiesChecked = new HashSet<>(); ++ ++ private Map<FileOperation, List<String>> fileOperationChecked = ++ new EnumMap<>(FileOperation.class); ++ ++ List<Permission> permissionsChecked() { ++ return permissionsChecked; ++ } ++ ++ Set<String> propertiesChecked() { ++ return propertiesChecked; ++ } ++ ++ List<String> fileOperationChecked(FileOperation op) { ++ return fileOperationChecked.get(op); ++ } ++ ++ void addFileOperation(FileOperation op, String file) { ++ List<String> opList = fileOperationChecked.get(op); ++ if (opList == null) { ++ opList = new ArrayList<>(); ++ fileOperationChecked.put(op, opList); ++ } ++ opList.add(file); ++ } ++ } ++ ++ static ThreadLocal<Checks> myChecks = new ThreadLocal<>(); ++ ++ static void prepare() { ++ myChecks.set(new Checks()); ++ } ++ ++ static class LoggingSecurityManager extends SecurityManager { ++ static void install() { ++ System.setSecurityManager(new LoggingSecurityManager()); ++ } ++ ++ private void checkFileOperation(FileOperation op, String file) { ++ Checks checks = myChecks.get(); ++ if (checks != null) ++ checks.addFileOperation(op, file); ++ } ++ ++ @Override ++ public void checkRead(String file) { ++ checkFileOperation(FileOperation.READ, file); ++ } ++ ++ @Override ++ public void checkWrite(String file) { ++ checkFileOperation(FileOperation.WRITE, file); ++ } ++ ++ @Override ++ public void checkDelete(String file) { ++ checkFileOperation(FileOperation.DELETE, file); ++ } ++ ++ @Override ++ public void checkExec(String file) { ++ checkFileOperation(FileOperation.EXEC, file); ++ } ++ ++ @Override ++ public void checkPermission(Permission perm) { ++ Checks checks = myChecks.get(); ++ if (checks != null) ++ checks.permissionsChecked().add(perm); ++ } ++ ++ @Override ++ public void checkPropertyAccess(String key) { ++ Checks checks = myChecks.get(); ++ if (checks != null) ++ checks.propertiesChecked().add(key); ++ } ++ } ++ ++ static void assertCheckPermission(Class<? extends Permission> type, ++ String name) ++ { ++ for (Permission perm : myChecks.get().permissionsChecked()) { ++ if (type.isInstance(perm) && perm.getName().equals(name)) ++ return; ++ } ++ throw new RuntimeException(type.getName() + "(\"" + name ++ + "\") not checked"); ++ } ++ ++ static void assertCheckPropertyAccess(String key) { ++ if (!myChecks.get().propertiesChecked().contains(key)) ++ throw new RuntimeException("Property " + key + " not checked"); ++ } ++ ++ static void assertChecked(File file, List<String> list) { ++ if (list != null && !list.isEmpty()) { ++ for (String path : list) { ++ if (path.equals(file.getPath())) ++ return; ++ } ++ } ++ throw new RuntimeException("Access not checked"); ++ } ++ ++ static void assertNotChecked(File file, List<String> list) { ++ if (list != null && !list.isEmpty()) { ++ for (String path : list) { ++ if (path.equals(file.getPath())) ++ throw new RuntimeException("Access checked"); ++ } ++ } ++ } ++ ++ static void assertCheckOperation(File file, Set<FileOperation> ops) { ++ for (FileOperation op : ops) ++ assertChecked(file, myChecks.get().fileOperationChecked(op)); ++ } ++ ++ static void assertNotCheckOperation(File file, Set<FileOperation> ops) { ++ for (FileOperation op : ops) ++ assertNotChecked(file, myChecks.get().fileOperationChecked(op)); ++ } ++ ++ static void assertOnlyCheckOperation(File file, ++ EnumSet<FileOperation> ops) ++ { ++ assertCheckOperation(file, ops); ++ assertNotCheckOperation(file, EnumSet.complementOf(ops)); ++ } ++ ++ static File testFile, another; ++ ++ static void setup() { ++ testFile = new File(CHECK_PERMISSION_TEST + System.currentTimeMillis()); ++ if (testFile.exists()) { ++ testFile.delete(); ++ } ++ ++ another = new File(CHECK_PERMISSION_TEST + "Another" ++ + System.currentTimeMillis()); ++ if (another.exists()) { ++ another.delete(); ++ } ++ ++ LoggingSecurityManager.install(); ++ } ++ ++ public static void main(String[] args) throws IOException { ++ setup(); ++ ++ prepare(); ++ testFile.canRead(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.canWrite(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.exists(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.isDirectory(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.isFile(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.isHidden(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.lastModified(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.length(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.createNewFile(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.list(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.list(new FilenameFilter() { ++ @Override ++ public boolean accept(File dir, String name) { ++ return false; ++ } ++ }); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.listFiles(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.listFiles(new FilenameFilter() { ++ @Override ++ public boolean accept(File dir, String name) { ++ return false; ++ } ++ }); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.listFiles(new FileFilter() { ++ @Override ++ public boolean accept(File file) { ++ return false; ++ } ++ }); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ ++ prepare(); ++ testFile.mkdir(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ if (testFile.exists()) { ++ prepare(); ++ testFile.mkdirs(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ } ++ ++ if (!another.exists()) { ++ prepare(); ++ another.mkdirs(); ++ assertOnlyCheckOperation(another, ++ EnumSet.of(FileOperation.READ, FileOperation.WRITE)); ++ } ++ ++ prepare(); ++ another.delete(); ++ assertOnlyCheckOperation(another, EnumSet.of(FileOperation.DELETE)); ++ ++ prepare(); ++ boolean renRst = testFile.renameTo(another); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ assertOnlyCheckOperation(another, EnumSet.of(FileOperation.WRITE)); ++ ++ if (renRst) { ++ if (testFile.exists()) ++ throw new RuntimeException(testFile + " is already renamed to " ++ + another); ++ testFile = another; ++ } ++ ++ prepare(); ++ testFile.setLastModified(0); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setReadOnly(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setWritable(true, true); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setWritable(true); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setReadable(true, true); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setReadable(true); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setExecutable(true, true); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.setExecutable(true); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.WRITE)); ++ ++ prepare(); ++ testFile.canExecute(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.EXEC)); ++ ++ prepare(); ++ testFile.getTotalSpace(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ assertCheckPermission(RuntimePermission.class, ++ "getFileSystemAttributes"); ++ ++ prepare(); ++ testFile.getFreeSpace(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ assertCheckPermission(RuntimePermission.class, ++ "getFileSystemAttributes"); ++ ++ prepare(); ++ testFile.getUsableSpace(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.READ)); ++ assertCheckPermission(RuntimePermission.class, ++ "getFileSystemAttributes"); ++ ++ prepare(); ++ File tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null); ++ assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE)); ++ tmpFile.delete(); ++ assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE)); ++ ++ prepare(); ++ tmpFile = File.createTempFile(CHECK_PERMISSION_TEST, null, null); ++ assertOnlyCheckOperation(tmpFile, EnumSet.of(FileOperation.WRITE)); ++ tmpFile.delete(); ++ assertCheckOperation(tmpFile, EnumSet.of(FileOperation.DELETE)); ++ ++ prepare(); ++ testFile.deleteOnExit(); ++ assertOnlyCheckOperation(testFile, EnumSet.of(FileOperation.DELETE)); ++ } ++} +--- ./jdk/test/java/io/File/NulFile.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/io/File/NulFile.java Mon Jan 05 11:57:27 2015 -0800 +@@ -612,8 +612,13 @@ + try { + File.createTempFile(prefix, suffix, directory); + } catch (IOException ex) { +- if (ExceptionMsg.equals(ex.getMessage())) ++ String err = "Unable to create temporary file"; ++ if (err.equals(ex.getMessage())) + exceptionThrown = true; ++ else { ++ throw new RuntimeException("Get IOException with message, " ++ + ex.getMessage() + ", expect message, "+ err); ++ } + } + } + if (!exceptionThrown) { +--- ./jdk/test/java/io/File/createTempFile/SpecialTempFile.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/io/File/createTempFile/SpecialTempFile.java Mon Jan 05 11:57:27 2015 -0800 +@@ -23,9 +23,8 @@ + + /* + * @test +- * @bug 8013827 8011950 8025128 ++ * @bug 8013827 8011950 8017212 8025128 + * @summary Check whether File.createTempFile can handle special parameters +- * on Windows platforms + * @author Dan Xu + */ + +@@ -35,7 +34,7 @@ + public class SpecialTempFile { + + private static void test(String name, String[] prefix, String[] suffix, +- boolean expectedException) throws IOException ++ boolean exceptionExpected) throws IOException + { + if (prefix == null || suffix == null + || prefix.length != suffix.length) +@@ -44,14 +43,13 @@ + } + + final String exceptionMsg = "Unable to create temporary file"; ++ String[] dirs = { null, "." }; + + for (int i = 0; i < prefix.length; i++) { + boolean exceptionThrown = false; + File f = null; + +- String[] dirs = { null, "." }; +- +- for (String dir : dirs ) { ++ for (String dir: dirs) { + System.out.println("In test " + name + + ", creating temp file with prefix, " + + prefix[i] + ", suffix, " + suffix[i] + +@@ -63,7 +61,7 @@ + else + f = File.createTempFile(prefix[i], suffix[i], new File(dir)); + } catch (IOException e) { +- if (expectedException) { ++ if (exceptionExpected) { + if (e.getMessage().startsWith(exceptionMsg)) + exceptionThrown = true; + else +@@ -74,13 +72,23 @@ + } + } + +- if (expectedException && (!exceptionThrown || f != null)) ++ if (exceptionExpected && (!exceptionThrown || f != null)) + throw new RuntimeException("IOException is expected"); + } + } + } + + public static void main(String[] args) throws Exception { ++ // Common test ++ final String name = "SpecialTempFile"; ++ File f = new File(System.getProperty("java.io.tmpdir"), name); ++ if (!f.exists()) { ++ f.createNewFile(); ++ } ++ String[] nulPre = { name + "\u0000" }; ++ String[] nulSuf = { ".test" }; ++ test("NulName", nulPre, nulSuf, true); ++ + // Test JDK-8025128 + String[] goodPre = { "///..///", "/foo" }; + String[] goodSuf = { ".temp", ".tmp" }; +@@ -91,6 +99,7 @@ + String[] slashSuf = { "///..///..", "///..///..", "///..///.." }; + test("SlashedName", slashPre, slashSuf, true); + ++ // Windows tests + if (!System.getProperty("os.name").startsWith("Windows")) + return; + +--- ./jdk/test/java/lang/ClassLoader/Assert.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/lang/ClassLoader/Assert.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -23,6 +23,21 @@ + + # + ++OS=`uname -s` ++case "$OS" in ++ SunOS | Linux | Darwin ) ++ FS="/" ++ CHMOD="${FS}bin${FS}chmod" ++ ;; ++ Windows* | CYGWIN* ) ++ CHMOD="chmod" ++ ;; ++ * ) ++ echo "Unrecognized system!" ++ exit 1; ++ ;; ++esac ++ + if [ "${TESTSRC}" = "" ] + then + echo "TESTSRC not set. Test cannot execute. Failed." +@@ -46,6 +61,7 @@ + cp ${TESTSRC}/Assert.java . + cp -R ${TESTSRC}/package1 . + cp -R ${TESTSRC}/package2 . ++${CHMOD} -R u+w * + + ${TESTJAVA}/bin/javac Assert.java + +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/ProcessBuilder/CloseRace.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,182 @@ ++/* ++ * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8024521 ++ * @summary Closing ProcessPipeInputStream at the time the process exits is racy ++ * and leads to data corruption. Run this test manually (as ++ * an ordinary java program) with -Xmx8M to repro bug 8024521. ++ * @run main/othervm -Xmx8M -Dtest.duration=2 CloseRace ++ */ ++ ++import java.io.*; ++import java.util.ArrayList; ++import java.util.List; ++import java.util.Map; ++import java.util.concurrent.CountDownLatch; ++ ++public class CloseRace { ++ private static final String BIG_FILE = "bigfile"; ++ ++ private static final int[] procFDs = new int[6]; ++ ++ /** default value sufficient to repro bug 8024521. */ ++ private static final int testDurationSeconds ++ = Integer.getInteger("test.duration", 600); ++ ++ private static final CountDownLatch threadsStarted ++ = new CountDownLatch(2); ++ ++ static boolean fdInUse(int i) { ++ return new File("/proc/self/fd/" + i).exists(); ++ } ++ ++ static boolean[] procFDsInUse() { ++ boolean[] inUse = new boolean[procFDs.length]; ++ for (int i = 0; i < procFDs.length; i++) ++ inUse[i] = fdInUse(procFDs[i]); ++ return inUse; ++ } ++ ++ static int count(boolean[] bits) { ++ int count = 0; ++ for (int i = 0; i < bits.length; i++) ++ count += bits[i] ? 1 : 0; ++ return count; ++ } ++ ++ static void dumpAllStacks() { ++ System.err.println("Start of dump"); ++ final Map<Thread, StackTraceElement[]> allStackTraces ++ = Thread.getAllStackTraces(); ++ for (Thread thread : allStackTraces.keySet()) { ++ System.err.println("Thread " + thread.getName()); ++ for (StackTraceElement element : allStackTraces.get(thread)) ++ System.err.println("\t" + element); ++ } ++ System.err.println("End of dump"); ++ } ++ ++ public static void main(String args[]) throws Exception { ++ if (!(new File("/proc/self/fd").isDirectory())) ++ return; ++ ++ // Catch Errors from process reaper ++ Thread.setDefaultUncaughtExceptionHandler( ++ new Thread.UncaughtExceptionHandler() { ++ @Override ++ public void uncaughtException(Thread t, Throwable e) { ++ e.printStackTrace(); ++ System.exit(1); ++ } ++ }); ++ ++ try (RandomAccessFile f = new RandomAccessFile(BIG_FILE, "rw")) { ++ f.setLength(Runtime.getRuntime().maxMemory()); // provoke OOME ++ } ++ ++ for (int i = 0, j = 0; j < procFDs.length; i++) ++ if (!fdInUse(i)) ++ procFDs[j++] = i; ++ ++ Thread[] threads = { ++ new Thread(new OpenLoop()), ++ new Thread(new ExecLoop()), ++ }; ++ for (Thread thread : threads) ++ thread.start(); ++ ++ threadsStarted.await(); ++ Thread.sleep(testDurationSeconds * 1000); ++ ++ for (Thread thread : threads) ++ thread.interrupt(); ++ for (Thread thread : threads) { ++ thread.join(10_000); ++ if (thread.isAlive()) { ++ dumpAllStacks(); ++ throw new Error("At least one child thread (" ++ + thread.getName() ++ + ") failed to finish gracefully"); ++ } ++ } ++ } ++ ++ static class OpenLoop implements Runnable { ++ public void run() { ++ threadsStarted.countDown(); ++ while (!Thread.interrupted()) { ++ try { ++ // wait for ExecLoop to finish creating process ++ do { ++ if (Thread.interrupted()) ++ return; ++ } while (count(procFDsInUse()) != 3); ++ List<InputStream> iss = new ArrayList<>(4); ++ ++ // eat up three "holes" (closed ends of pipe fd pairs) ++ for (int i = 0; i < 3; i++) ++ iss.add(new FileInputStream(BIG_FILE)); ++ do { ++ if (Thread.interrupted()) ++ return; ++ } while (count(procFDsInUse()) == procFDs.length); ++ // hopefully this will racily occupy empty fd slot ++ iss.add(new FileInputStream(BIG_FILE)); ++ Thread.sleep(1); // Widen race window ++ for (InputStream is : iss) ++ is.close(); ++ } catch (InterruptedException e) { ++ break; ++ } catch (Exception e) { ++ throw new Error(e); ++ } ++ } ++ } ++ } ++ ++ static class ExecLoop implements Runnable { ++ public void run() { ++ threadsStarted.countDown(); ++ ProcessBuilder builder = new ProcessBuilder("/bin/true"); ++ while (!Thread.interrupted()) { ++ try { ++ // wait for OpenLoop to finish ++ do { ++ if (Thread.interrupted()) ++ return; ++ } while (count(procFDsInUse()) > 0); ++ Process process = builder.start(); ++ InputStream is = process.getInputStream(); ++ process.waitFor(); ++ is.close(); ++ } catch (InterruptedException e) { ++ break; ++ } catch (Exception e) { ++ throw new Error(e); ++ } ++ } ++ } ++ } ++} +--- ./jdk/test/java/lang/Runtime/exec/CloseRace.java Mon Sep 08 12:16:34 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,146 +0,0 @@ +-/* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-/** +- * @test +- * @bug 8024521 +- * @summary Closing ProcessPipeInputStream at the time the process exits is racy +- * and leads to the data corruption. +- * @library /lib/testlibrary +- * @run main/othervm/timeout=80 CloseRace +- */ +- +-/** +- * This test has a little chance to catch the race during the given default +- * time gap of 20 seconds. To increase the time gap, set the system property +- * CloseRaceTimeGap=N to the number of seconds. +- * Jtreg's timeoutFactor should also be set appropriately. +- * +- * For example, to run the test for 10 minutes: +- * > jtreg \ +- * -testjdk:$(PATH_TO_TESTED_JDK) \ +- * -timeoutFactor:10 \ +- * -DCloseRaceTimeGap=600 \ +- * $(PATH_TO_TESTED_JDK_SOURCE)/test/java/lang/Runtime/exec/CloseRace.java +- */ +- +-import java.io.*; +-import java.nio.file.Files; +-import java.nio.file.Path; +-import java.nio.file.Paths; +-import java.util.ArrayList; +-import java.util.Arrays; +-import java.util.LinkedList; +-import java.util.List; +-import jdk.testlibrary.OutputAnalyzer; +-import static jdk.testlibrary.ProcessTools.*; +- +-public class CloseRace { +- +- public static void main(String args[]) throws Exception { +- ProcessBuilder pb = createJavaProcessBuilder("-Xmx64M", "CloseRace$Child", +- System.getProperty("CloseRaceTimeGap", "20")); +- OutputAnalyzer oa = new OutputAnalyzer(pb.start()); +- oa.stderrShouldNotContain("java.lang.OutOfMemoryError"); +- } +- +- public static class Child { +- private static final String BIG_FILE = "bigfile"; +- private static final String SMALL_FILE = "smallfile"; +- private static int timeGap = 20; // seconds +- +- public static void main(String args[]) throws Exception { +- if (args.length > 0) { +- try { +- timeGap = Integer.parseInt(args[0]); +- timeGap = Math.max(timeGap, 10); +- timeGap = Math.min(timeGap, 10 * 60 * 60); // no more than 10 hours +- } catch (NumberFormatException ignore) {} +- } +- try (RandomAccessFile f = new RandomAccessFile(BIG_FILE, "rw")) { +- f.setLength(1024 * 1024 * 1024); // 1 Gb, greater than max heap size +- } +- try (FileOutputStream fs = new FileOutputStream(SMALL_FILE); +- PrintStream ps = new PrintStream(fs)) { +- for (int i = 0; i < 128; ++i) +- ps.println("line of text"); +- } +- +- List<Thread> threads = new LinkedList<>(); +- for (int i = 0; i < 99; ++i) { +- Thread t = new Thread (new OpenLoop()); +- t.start(); +- threads.add(t); +- } +- Thread t2 = new Thread (new ExecLoop()); +- t2.start(); +- threads.add(t2); +- +- Thread.sleep(timeGap); +- +- for (Thread t : threads) { +- t.interrupt(); +- t.join(); +- } +- } +- +- private static class OpenLoop implements Runnable { +- public void run() { +- final Path bigFilePath = Paths.get(BIG_FILE); +- while (!Thread.interrupted()) { +- try (InputStream in = Files.newInputStream(bigFilePath)) { +- // Widen the race window by sleeping 1ms +- Thread.sleep(1); +- } catch (InterruptedException e) { +- break; +- } catch (Exception e) { +- System.err.println(e); +- } +- } +- } +- } +- +- private static class ExecLoop implements Runnable { +- public void run() { +- List<String> command = new ArrayList<>( +- Arrays.asList("/bin/cat", SMALL_FILE)); +- while (!Thread.interrupted()) { +- try { +- ProcessBuilder builder = new ProcessBuilder(command); +- final Process process = builder.start(); +- InputStream is = process.getInputStream(); +- InputStreamReader isr = new InputStreamReader(is); +- BufferedReader br = new BufferedReader(isr); +- while (br.readLine() != null) {} +- process.waitFor(); +- isr.close(); +- } catch (InterruptedException e) { +- break; +- } catch (Exception e) { +- System.err.println(e); +- } +- } +- } +- } +- } +-} +--- ./jdk/test/java/lang/String/ToLowerCase.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/lang/String/ToLowerCase.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + + /* + @test +- @bug 4217441 4533872 4900935 8020037 ++ @bug 4217441 4533872 4900935 8020037 8041791 + @summary toLowerCase should lower-case Greek Sigma correctly depending + on the context (final/non-final). Also it should handle + Locale specific (lt, tr, and az) lowercasings and supplementary +@@ -72,8 +72,10 @@ + // I-dot tests + test("\u0130", turkish, "i"); + test("\u0130", az, "i"); +- test("\u0130", lt, "i"); +- test("\u0130", Locale.US, "i"); ++ test("\u0130", lt, "\u0069\u0307"); ++ test("\u0130", Locale.US, "\u0069\u0307"); ++ test("\u0130", Locale.JAPAN, "\u0069\u0307"); ++ test("\u0130", Locale.ROOT, "\u0069\u0307"); + + // Remove dot_above in the sequence I + dot_above (Turkish and Azeri) + test("I\u0307", turkish, "i"); +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/DummyAgent.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.lang.instrument.ClassFileTransformer; ++import java.lang.instrument.IllegalClassFormatException; ++import java.lang.instrument.Instrumentation; ++import java.security.ProtectionDomain; ++ ++public class DummyAgent implements ClassFileTransformer { ++ @Override ++ public byte[] transform(ClassLoader loader, String className, ++ Class<?> classBeingRedefined, ProtectionDomain protectionDomain, ++ byte[] classfileBuffer) throws IllegalClassFormatException { ++ ++ /* The Daemon Thread bug is timing dependent and you want the transform method ++ * to return ASAP - so just return the buffer will be fine ++ */ ++ return classfileBuffer; ++ } ++ ++ public static void premain(String agentArgs, Instrumentation inst) { ++ inst.addTransformer(new DummyAgent(), false); ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/DummyClass.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,27 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* Just a dummy class for loading */ ++public class DummyClass { ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/TestDaemonThread.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,72 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++/* @test ++ * @bug 7142035 ++ * @summary Assert in java.lang.instrument agents during shutdown when classloading occurs after shutdown ++ * @library /lib/testlibrary ++ * ++ * @build DummyAgent DummyClass TestDaemonThreadLauncher TestDaemonThread ++ * @run shell ../MakeJAR3.sh DummyAgent ++ * @run main TestDaemonThreadLauncher /timeout=240 ++ * ++ */ ++import java.io.File; ++import java.net.URL; ++import java.net.URLClassLoader; ++ ++public class TestDaemonThread implements Runnable{ ++ File classpath; ++ ++ public TestDaemonThread(File classpath) { ++ this.classpath = classpath; ++ } ++ ++ @Override ++ public void run() { ++ ++ ++ try { ++ URL u = this.getClass().getClassLoader().getResource("DummyClass.class"); ++ String path = u.getPath(); ++ String parent = u.getPath().substring(0, path.lastIndexOf('/')+1); ++ URL parentURL = new URL(u, parent); ++ System.out.println(parentURL); ++ /* Load lots of class by creating multiple classloaders */ ++ for(;;) { ++ ClassLoader cl = new URLClassLoader(new URL[] {parentURL}, null); ++ cl.loadClass("DummyClass"); ++ } ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ public static void main(String[] args) throws Exception { ++ Thread t = new Thread(new TestDaemonThread(new File(args[0]))); ++ /* The important part of the bug is that a Daemon thread can continue to load classes after shutdown */ ++ t.setDaemon(true); ++ t.start(); ++ Thread.sleep(200); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/TestDaemonThreadLauncher.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++import jdk.testlibrary.JDKToolLauncher; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.ProcessTools; ++ ++import java.io.IOException; ++import java.nio.file.Path; ++ ++public class TestDaemonThreadLauncher { ++ ++ private static ProcessBuilder processBuilder = new ProcessBuilder(); ++ ++ public static void main(String args[]) throws Exception { ++ for(int i=0; i<50; i++) { ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-javaagent:DummyAgent.jar", "TestDaemonThread", "."); ++ OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); ++ analyzer.shouldNotContain("ASSERTION FAILED"); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/net/MulticastSocket/SetGetNetworkInterfaceTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,125 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++/* ++ * @test ++ * @bug 6458027 ++ * @summary Disabling IPv6 on a specific network interface causes problems. ++ * ++ */ ++ ++import java.io.IOException; ++import java.net.InetAddress; ++import java.net.MulticastSocket; ++import java.net.NetworkInterface; ++import java.net.SocketException; ++import java.util.Arrays; ++import java.util.Enumeration; ++ ++ ++public class SetGetNetworkInterfaceTest { ++ ++ public static void main(String[] args) throws Exception { ++ ++ boolean passed = true; ++ try { ++ MulticastSocket ms = new MulticastSocket(); ++ Enumeration<NetworkInterface> networkInterfaces = NetworkInterface ++ .getNetworkInterfaces(); ++ while (networkInterfaces.hasMoreElements()) { ++ NetworkInterface netIf = networkInterfaces.nextElement(); ++ if (isNetworkInterfaceTestable(netIf)) { ++ printNetIfDetails(netIf); ++ ms.setNetworkInterface(netIf); ++ NetworkInterface msNetIf = ms.getNetworkInterface(); ++ if (netIf.equals(msNetIf)) { ++ System.out.println(" OK"); ++ } else { ++ System.out.println("FAILED!!!"); ++ printNetIfDetails(msNetIf); ++ passed = false; ++ } ++ System.out.println("------------------"); ++ } ++ } ++ } catch (IOException e) { ++ e.printStackTrace(); ++ passed = false; ++ } ++ if (!passed) { ++ throw new RuntimeException("Test Fail"); ++ } ++ System.out.println("Test passed "); ++ } ++ ++ private static boolean isNetworkInterfaceTestable(NetworkInterface netIf) throws Exception { ++ System.out.println("checking netif == " + netIf.getName()); ++ return (netIf.isUp() && netIf.supportsMulticast() && isIpAddrAvailable(netIf)); ++ } ++ ++ private static boolean isIpAddrAvailable (NetworkInterface netIf) { ++ boolean ipAddrAvailable = false; ++ byte[] nullIpAddr = {'0', '0', '0', '0'}; ++ byte[] testIpAddr = null; ++ ++ Enumeration<InetAddress> ipAddresses = netIf.getInetAddresses(); ++ while (ipAddresses.hasMoreElements()) { ++ InetAddress testAddr = ipAddresses.nextElement(); ++ testIpAddr = testAddr.getAddress(); ++ if ((testIpAddr != null) && (!Arrays.equals(testIpAddr, nullIpAddr))) { ++ ipAddrAvailable = true; ++ break; ++ } else { ++ System.out.println("ignore netif " + netIf.getName()); ++ } ++ } ++ return ipAddrAvailable; ++ } ++ ++ private static void printNetIfDetails(NetworkInterface ni) ++ throws SocketException { ++ System.out.println("Name " + ni.getName() + " index " + ni.getIndex()); ++ Enumeration<InetAddress> en = ni.getInetAddresses(); ++ while (en.hasMoreElements()) { ++ System.out.println(" InetAdress: " + en.nextElement()); ++ } ++ System.out.println("HardwareAddress: " + createMacAddrString(ni)); ++ System.out.println("loopback: " + ni.isLoopback() + "; pointToPoint: " ++ + ni.isPointToPoint() + "; virtual: " + ni.isVirtual() ++ + "; MTU: " + ni.getMTU()); ++ } ++ ++ private static String createMacAddrString(NetworkInterface netIf) ++ throws SocketException { ++ byte[] macAddr = netIf.getHardwareAddress(); ++ StringBuilder sb = new StringBuilder(); ++ if (macAddr != null) { ++ for (int i = 0; i < macAddr.length; i++) { ++ sb.append(String.format("%02X%s", macAddr[i], ++ (i < macAddr.length - 1) ? "-" : "")); ++ } ++ } ++ return sb.toString(); ++ } ++} +--- ./jdk/test/java/net/NetworkInterface/UniqueMacAddressesTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/net/NetworkInterface/UniqueMacAddressesTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -118,11 +118,14 @@ + NetworkInterface netIf = null; + while (nis.hasMoreElements()) { + netIf = (NetworkInterface) nis.nextElement(); +- macAddr = netIf.getHardwareAddress(); +- if (macAddr != null) { +- System.out +- .println("Adding NetworkInterface " + netIf.getName()); +- networkInterfaceList.add(netIf); ++ if (netIf.isUp()) { ++ macAddr = netIf.getHardwareAddress(); ++ if (macAddr != null) { ++ System.out.println("Adding NetworkInterface " ++ + netIf.getName() + " with mac address " ++ + createMacAddressString(netIf)); ++ networkInterfaceList.add(netIf); ++ } + } + } + } +--- ./jdk/test/java/net/ipv6tests/BadIPv6Addresses.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/net/ipv6tests/BadIPv6Addresses.java Mon Jan 05 11:57:27 2015 -0800 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 4742177 ++ * @bug 4742177 8019834 + * @summary Re-test IPv6 (and specifically MulticastSocket) with latest Linux & USAGI code + */ + import java.net.*; +--- ./jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -36,7 +36,7 @@ + case "$OS" in + SunOS | Linux | Darwin ) ;; + # Skip locale test for Windows +- Windows* ) ++ Windows* | CYGWIN* ) + echo "Passed"; exit 0 ;; + * ) echo "Unrecognized system!" ; exit 1 ;; + esac +--- ./jdk/test/java/nio/file/Path/PathOps.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/nio/file/Path/PathOps.java Mon Jan 05 11:57:27 2015 -0800 +@@ -22,7 +22,7 @@ + */ + + /* @test +- * @bug 4313887 6838333 6925932 7006126 ++ * @bug 4313887 6838333 6925932 7006126 8037945 + * @summary Unit test for java.nio.file.Path path operations + */ + +@@ -899,6 +899,8 @@ + .normalize("foo"); + test("/foo") + .normalize("/foo"); ++ test("") ++ .normalize(""); + test(".") + .normalize(""); + test("..") +--- ./jdk/test/java/rmi/registry/readTest/readTest.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/rmi/registry/readTest/readTest.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -37,11 +37,13 @@ + SunOS | Linux | Darwin ) + PS=":" + FS="/" ++ CHMOD="${FS}bin${FS}chmod" + FILEURL="file:" + ;; + Windows* ) + PS=";" + FS="\\" ++ CHMOD="chmod" + FILEURL="file:/" + if [ "$VER" -eq "5" ]; then + ARGS="-Djdk.net.ephemeralPortRange.low=1024 -Djdk.net.ephemeralPortRange.high=65000" +@@ -51,6 +53,7 @@ + CYGWIN* ) + PS=";" + FS="/" ++ CHMOD="chmod" + FILEURL="file:/" + if [ "${VER}" -eq "5" ]; then + ARGS="-Djdk.net.ephemeralPortRange.low=1024 -Djdk.net.ephemeralPortRange.high=65000" +@@ -65,6 +68,7 @@ + + TEST_CLASSPATH=.$PS${TESTCLASSPATH:-$TESTCLASSES} + cp -r ${TESTSRC}${FS}* . ++${CHMOD} -R u+w * + ${TESTJAVA}${FS}bin${FS}javac testPkg${FS}*java + ${TESTJAVA}${FS}bin${FS}javac -cp $TEST_CLASSPATH readTest.java + +--- ./jdk/test/java/util/Currency/ValidateISO4217.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/Currency/ValidateISO4217.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -22,7 +22,7 @@ + */ + /* + * @test +- * @bug 4691089 4819436 4942982 5104960 6544471 6627549 7066203 ++ * @bug 4691089 4819436 4942982 5104960 6544471 6627549 7066203 7195759 + * @summary Validate ISO 4217 data for Currency class. + */ + +@@ -92,7 +92,7 @@ + + /* Codes that are obsolete, do not have related country */ + static final String otherCodes = +- "ADP-AFA-ATS-AYM-BEF-BGL-BOV-BYB-CLF-CUC-CYP-DEM-EEK-ESP-FIM-FRF-GRD-GWP-IEP-ITL-LUF-MGF-MTL-MXV-NLG-PTE-RUR-SDD-SIT-SKK-SRG-TMM-TPE-TRL-VEF-USN-USS-XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-YUM-ZWD-ZWN-ZWR"; ++ "ADP-AFA-ATS-AYM-AZM-BEF-BGL-BOV-BYB-CLF-CUC-CYP-DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-IEP-ITL-LUF-MGF-MTL-MXV-MZM-NLG-PTE-ROL-RUR-SDD-SIT-SKK-SRG-TMM-TPE-TRL-VEF-USN-USS-VEB-XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-YUM-ZMK-ZWD-ZWN-ZWR"; + + static boolean err = false; + +--- ./jdk/test/java/util/Currency/tablea1.txt Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/Currency/tablea1.txt Mon Jan 05 11:57:27 2015 -0800 +@@ -1,12 +1,12 @@ + # + # +-# Based on BSi's ISO4217 data - "TABLE A1.doc" + amendments up until MA151.doc +-# (As of 7 April 2011) ++# Amendments up until ISO 4217 AMENDMENT NUMBER 159 ++# (As of 15 August 2014) + # + + # Version + FILEVERSION=1 +-DATAVERSION=151 ++DATAVERSION=159 + + # ISO 4217 currency data + AF AFN 971 2 +@@ -23,7 +23,7 @@ + AU AUD 36 2 + AT EUR 978 2 + # MA 129 +-AZ AZM 31 2 2005-12-31-20-00-00 AZN 944 2 ++AZ AZN 944 2 + BS BSD 44 2 + BH BHD 48 3 + BD BDT 50 2 +@@ -96,7 +96,7 @@ + GM GMD 270 2 + GE GEL 981 2 + DE EUR 978 2 +-GH GHC 288 2 2007-07-01-00-00-00 GHS 936 2 ++GH GHS 936 2 + GI GIP 292 2 + GR EUR 978 2 + GL DKK 208 2 +@@ -135,14 +135,14 @@ + KW KWD 414 3 + KG KGS 417 2 + LA LAK 418 2 +-LV LVL 428 2 ++LV LVL 428 2 2013-12-31-22-00-00 EUR 978 2 + LB LBP 422 2 + #LS ZAR 710 2 + LS LSL 426 2 + LR LRD 430 2 + LY LYD 434 3 + LI CHF 756 2 +-LT LTL 440 2 ++LT LTL 440 2 2014-12-31-22-00-00 EUR 978 2 + LU EUR 978 2 + MO MOP 446 2 + MK MKD 807 2 +@@ -166,7 +166,7 @@ + MS XCD 951 2 + MA MAD 504 2 + # MA 130 +-MZ MZM 508 2 2006-06-30-22-00-00 MZN 943 2 ++MZ MZN 943 2 + MM MMK 104 2 + # MA 134 + ME EUR 978 2 +@@ -200,7 +200,7 @@ + PR USD 840 2 + QA QAR 634 2 + RE EUR 978 2 +-RO ROL 946 2 2005-06-30-21-00-00 RON 946 2 ++RO RON 946 2 + RU RUB 643 2 + RW RWF 646 0 + SH SHP 654 2 +@@ -227,6 +227,7 @@ + SB SBD 90 2 + SO SOS 706 2 + ZA ZAR 710 2 ++SS SSP 728 2 + ES EUR 978 2 + LK LKR 144 2 + SD SDG 938 2 +@@ -255,7 +256,7 @@ + TM TMT 934 2 + TC USD 840 2 + TV AUD 36 2 +-UG UGX 800 2 ++UG UGX 800 0 + UA UAH 980 2 + AE AED 784 2 + GB GBP 826 2 +@@ -266,14 +267,14 @@ + UY UYU 858 2 + UZ UZS 860 2 + VU VUV 548 0 +-VE VEB 862 2 2008-01-01-04-00-00 VEF 937 2 +-VN VND 704 2 ++VE VEF 937 2 ++VN VND 704 0 + VG USD 840 2 + VI USD 840 2 + WF XPF 953 0 + EH MAD 504 2 + YE YER 886 2 +-ZM ZMK 894 2 ++ZM ZMW 967 2 + ZW ZWL 932 2 + #XAU XAU 959 + #XBA XBA 955 +--- ./jdk/test/java/util/Locale/LocaleTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/Locale/LocaleTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,7 +25,7 @@ + * @bug 4052404 4052440 4084688 4092475 4101316 4105828 4107014 4107953 4110613 + * 4118587 4118595 4122371 4126371 4126880 4135316 4135752 4139504 4139940 4143951 + * 4147315 4147317 4147552 4335196 4778440 4940539 5010672 6475525 6544471 6627549 +- * 6786276 7066203 ++ * 6786276 7066203 7085757 + * @summary test Locales + */ + /* +@@ -440,8 +440,8 @@ + String[] spotCheck2 = { "US", "CA", "GB", "FR", "DE", "IT", "JP", "KR", "CN", "TW", "TH" }; + + +- if (test.length != 249) +- errln("Expected getISOCountries to return 249 countries; it returned " + test.length); ++ if (test.length != 250) ++ errln("Expected getISOCountries to return 250 countries; it returned " + test.length); + else { + for (int i = 0; i < spotCheck2.length; i++) { + int j; +--- ./jdk/test/java/util/TimeZone/TimeZoneDatePermissionCheck.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/TimeZone/TimeZoneDatePermissionCheck.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -36,6 +36,7 @@ + ${TESTJAVA}/bin/keytool -genkeypair -alias testcert \ + -keystore ${TESTCLASSES}/timezonedatetest.store \ + -storepass testpass -validity 360 \ ++ -keyalg rsa \ + -dname "cn=Mark Wildebeest, ou=FreeSoft, o=Red Hat, c=NL" \ + -keypass testpass + +--- ./jdk/test/java/util/jar/JarInputStream/ExtraFileInMetaInf.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/jar/JarInputStream/ExtraFileInMetaInf.java Mon Jan 05 11:57:27 2015 -0800 +@@ -49,7 +49,7 @@ + new File("ks").delete(); + sun.security.tools.KeyTool.main( + ("-keystore ks -storepass changeit -keypass changeit " + +- "-alias a -dname CN=A -genkeypair").split(" ")); ++ "-keyalg rsa -alias a -dname CN=A -genkeypair").split(" ")); + sun.security.tools.JarSigner.main( + "-keystore ks -storepass changeit x.jar a".split(" ")); + +--- ./jdk/test/java/util/logging/ParentLoggersTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/logging/ParentLoggersTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -40,7 +40,9 @@ + static final String LOGGER_NAME_1 = PARENT_NAME_1 + ".myLogger"; + static final String LOGGER_NAME_2 = PARENT_NAME_2 + ".myBar.myLogger"; + +- static final List<String> initialLoggerNames = new ArrayList<String>(); ++ static final List<String> initialLoggerNames = new ArrayList<>(); ++ static final List<Logger> createdLoggers = new ArrayList<>(); ++ + public static void main(String args[]) throws Exception { + // cache the initial set of loggers before this test begins + // to add any loggers +@@ -51,7 +53,7 @@ + if (!defaultLoggers.contains(logger)) { + initialLoggerNames.add(logger); + } +- }; ++ } + + String tstSrc = System.getProperty(TST_SRC_PROP); + File fname = new File(tstSrc, LM_PROP_FNAME); +@@ -69,7 +71,7 @@ + } + + public static List<String> getDefaultLoggerNames() { +- List<String> expectedLoggerNames = new ArrayList<String>(); ++ List<String> expectedLoggerNames = new ArrayList<>(); + + // LogManager always creates two loggers: + expectedLoggerNames.add(""); // root logger: "" +@@ -83,56 +85,41 @@ + */ + public static boolean checkLoggers() { + String failMsg = "# checkLoggers: getLoggerNames() returned unexpected loggers"; +- Vector<String> expectedLoggerNames = new Vector<String>(getDefaultLoggerNames()); ++ List<String> expectedLoggerNames = new ArrayList<>(getDefaultLoggerNames()); + + // Create the logger LOGGER_NAME_1 +- Logger logger1 = Logger.getLogger(LOGGER_NAME_1); +- expectedLoggerNames.addElement(PARENT_NAME_1); +- expectedLoggerNames.addElement(LOGGER_NAME_1); ++ createdLoggers.add(Logger.getLogger(LOGGER_NAME_1)); ++ expectedLoggerNames.add(PARENT_NAME_1); ++ expectedLoggerNames.add(LOGGER_NAME_1); + + // Create the logger LOGGER_NAME_2 +- Logger logger2 = Logger.getLogger(LOGGER_NAME_2); +- expectedLoggerNames.addElement(PARENT_NAME_2); +- expectedLoggerNames.addElement(LOGGER_NAME_2); ++ createdLoggers.add(Logger.getLogger(LOGGER_NAME_2)); ++ expectedLoggerNames.add(PARENT_NAME_2); ++ expectedLoggerNames.add(LOGGER_NAME_2); + + Enumeration<String> returnedLoggersEnum = logMgr.getLoggerNames(); +- Vector<String> returnedLoggerNames = new Vector<String>(0); ++ List<String> returnedLoggerNames = new ArrayList<>(0); + while (returnedLoggersEnum.hasMoreElements()) { + String logger = returnedLoggersEnum.nextElement(); + if (!initialLoggerNames.contains(logger)) { + // filter out the loggers that have been added before this test runs +- returnedLoggerNames.addElement(logger); ++ returnedLoggerNames.add(logger); + } +- +- }; +- ++ } ++ System.out.println(returnedLoggerNames); + return checkNames(expectedLoggerNames, returnedLoggerNames, failMsg); + } + + // Returns boolean values: PASSED or FAILED +- private static boolean checkNames(Vector<String> expNames, +- Vector<String> retNames, ++ private static boolean checkNames(List<String> expNames, ++ List<String> retNames, + String failMsg) { + boolean status = PASSED; + + if (expNames.size() != retNames.size()) { + status = FAILED; +- } else { +- boolean checked[] = new boolean[retNames.size()]; +- for (int i = 0; i < expNames.size(); i++) { +- int j = 0; +- for (; j < retNames.size(); j++) { +- if (!checked[j] && +- expNames.elementAt(i).equals(retNames.elementAt(j))) { +- checked[j] = true; +- break; +- } +- } +- if (j >= retNames.size()) { +- status = FAILED; +- break; +- } +- } ++ } else if (!new HashSet<>(expNames).equals(new HashSet<>(retNames))) { ++ status = FAILED; + } + if (!status) { + printFailMsg(expNames, retNames, failMsg); +@@ -140,25 +127,25 @@ + return status; + } + +- private static void printFailMsg(Vector<String> expNames, +- Vector<String> retNames, ++ private static void printFailMsg(List<String> expNames, ++ List<String> retNames, + String failMsg) { + out.println(); + out.println(failMsg); +- if (expNames.size() == 0) { ++ if (expNames.isEmpty()) { + out.println("# there are NO expected logger names"); + } else { + out.println("# expected logger names (" + expNames.size() + "):"); + for (int i = 0; i < expNames.size(); i++) { +- out.println(" expNames[" + i + "] = " + expNames.elementAt(i)); ++ out.println(" expNames[" + i + "] = " + expNames.get(i)); + } + } +- if (retNames.size() == 0) { ++ if (retNames.isEmpty()) { + out.println("# there are NO returned logger names"); + } else { + out.println("# returned logger names (" + retNames.size() + "):"); + for (int i = 0; i < retNames.size(); i++) { +- out.println(" retNames[" + i + "] = " + retNames.elementAt(i)); ++ out.println(" retNames[" + i + "] = " + retNames.get(i)); + } + } + } +--- ./jdk/test/java/util/logging/TestLoggerBundleSync.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/logging/TestLoggerBundleSync.java Mon Jan 05 11:57:27 2015 -0800 +@@ -190,8 +190,10 @@ + final static class MyHandler extends Handler { + volatile ResourceBundle rb; + volatile String rbName; ++ volatile int count = 0; + @Override + public synchronized void publish(LogRecord record) { ++ count++; + rb = record.getResourceBundle(); + rbName = record.getResourceBundleName(); + } +@@ -227,23 +229,51 @@ + Logger ll = Logger.getLogger(l.getName()+".bie.bye"); + ResourceBundle hrb; + String hrbName; ++ if (handler.getLevel() != Level.FINEST) { ++ throw new RuntimeException("Handler level is not finest: " ++ + handler.getLevel()); ++ } ++ final int countBefore = handler.count; + ll.setLevel(Level.FINEST); + ll.addHandler(handler); + ll.fine("dummy"); + ll.removeHandler(handler); ++ final int countAfter = handler.count; ++ if (countBefore == countAfter) { ++ throw new RuntimeException("Handler not called for " ++ + ll.getName() + "("+ countAfter +")"); ++ } + hrb = handler.rb; + hrbName = handler.rbName; + if (name != null) { ++ // if name is not null, then it implies that it ++ // won't change, since setResourceBundle() cannot ++ // replace a non null name. ++ // Since we never set the resource bundle on 'll', ++ // then ll must inherit its resource bundle [name] ++ // from l - and therefor we should find it in ++ // handler.rb/handler.rbName + if (!name.equals(hrbName)) { + throw new RuntimeException("Unexpected bundle name: " +- +hrb.getClass().getName()); ++ +hrbName); + } ++ // here we know that hrbName is not null so hrb ++ // should not be null either. + if (!name.equals(hrb.getClass().getName())) { + throw new RuntimeException("Unexpected bundle name: " + +hrb.getClass().getName()); + } + } + ++ // Make sure to refer to 'l' explicitly in order to ++ // prevent eager garbage collecting before the end of ++ // the test (JDK-8030192) ++ if (!ll.getName().startsWith(l.getName())) { ++ throw new RuntimeException("Logger " + ll.getName() ++ + "does not start with expected prefix " ++ + l.getName()); ++ } ++ + getRBcount.incrementAndGet(); + if (!goOn) break; + Thread.sleep(1); +--- ./jdk/test/java/util/zip/ZipFile/ReadZip.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/java/util/zip/ZipFile/ReadZip.java Mon Jan 05 11:57:27 2015 -0800 +@@ -63,6 +63,8 @@ + Files.copy(Paths.get(System.getProperty("test.src", ""), "input.zip"), + newZip.toPath(), StandardCopyOption.REPLACE_EXISTING); + ++ newZip.setWritable(true); ++ + // pad some bytes + try (OutputStream os = Files.newOutputStream(newZip.toPath(), + StandardOpenOption.APPEND)) { +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/imageio/plugins/png/PngDitDepthTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++* @test ++* @bug 4991647 ++* @summary PNGMetadata.getAsTree() sets bitDepth to invalid value ++* @run main PngDitDepthTest ++*/ ++ ++import org.w3c.dom.Node; ++ ++import javax.imageio.ImageIO; ++import javax.imageio.ImageTypeSpecifier; ++import javax.imageio.ImageWriter; ++import javax.imageio.metadata.IIOInvalidTreeException; ++import javax.imageio.metadata.IIOMetadata; ++import java.awt.image.ColorModel; ++import java.awt.image.SampleModel; ++import java.util.Iterator; ++ ++public class PngDitDepthTest { ++ ++ public static void main(String[] args) throws IIOInvalidTreeException { ++ ++ // getting the writer for the png format ++ Iterator iter = ImageIO.getImageWritersByFormatName("png"); ++ ImageWriter writer = (ImageWriter) iter.next(); ++ ++ // creating a color model ++ ColorModel colorModel = ColorModel.getRGBdefault(); ++ ++ // creating a sample model ++ SampleModel sampleModel = colorModel.createCompatibleSampleModel(640, 480); ++ ++ // creating a default metadata object ++ IIOMetadata metaData = writer.getDefaultImageMetadata(new ImageTypeSpecifier(colorModel, sampleModel), null); ++ String formatName = metaData.getNativeMetadataFormatName(); ++ ++ // first call ++ Node metaDataNode = metaData.getAsTree(formatName); ++ try { ++ metaData.setFromTree(formatName, metaDataNode); ++ } catch (Exception ex) { ++ ex.printStackTrace(); ++ } ++ ++ // second call (bitdepht is already set to an invalid value) ++ metaDataNode = metaData.getAsTree(formatName); ++ ++ metaData.setFromTree(formatName, metaDataNode); ++ ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JComboBox/8032878/bug8032878.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,136 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ * @bug 8032878 ++ * @summary Checks that JComboBox as JTable cell editor processes key events ++ * even where setSurrendersFocusOnKeystroke flag in JTable is false and ++ * that it does not lose the first key press where the flag is true. ++ * @library ../../regtesthelpers ++ * @build Util ++ * @author Alexey Ivanov ++ */ ++ ++import java.awt.*; ++import java.awt.event.KeyEvent; ++import javax.swing.*; ++import javax.swing.text.JTextComponent; ++ ++import sun.awt.SunToolkit; ++ ++public class bug8032878 implements Runnable { ++ private static final String ONE = "one"; ++ private static final String TWO = "two"; ++ private static final String THREE = "three"; ++ ++ private static final String EXPECTED = "one123"; ++ ++ private final Robot robot; ++ ++ private JFrame frame; ++ private JComboBox cb; ++ ++ private volatile boolean surrender; ++ private volatile String text; ++ ++ public static void main(String[] args) throws Exception { ++ final bug8032878 test = new bug8032878(); ++ ++ test.test(false); ++ test.test(true); ++ } ++ ++ public bug8032878() throws AWTException { ++ robot = new Robot(); ++ robot.setAutoDelay(100); ++ } ++ ++ private void setupUI() { ++ frame = new JFrame(); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ ++ JTable table = new JTable(new String[][] {{ONE}, {TWO}, {THREE}}, ++ new String[] { "#"}); ++ table.setSurrendersFocusOnKeystroke(surrender); ++ ++ cb = new JComboBox(new String[]{ONE, TWO, THREE}); ++ cb.setEditable(true); ++ DefaultCellEditor comboEditor = new DefaultCellEditor(cb); ++ comboEditor.setClickCountToStart(1); ++ table.getColumnModel().getColumn(0).setCellEditor(comboEditor); ++ frame.add(table); ++ ++ frame.pack(); ++ frame.setVisible(true); ++ } ++ ++ private void test(final boolean flag) throws Exception { ++ try { ++ surrender = flag; ++ SwingUtilities.invokeAndWait(this); ++ ++ runTest(); ++ checkResult(); ++ } finally { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ } ++ ++ private void runTest() throws Exception { ++ realSync(); ++ // Select 'one' ++ Util.hitKeys(robot, KeyEvent.VK_TAB); ++ realSync(); ++ Util.hitKeys(robot, KeyEvent.VK_1); ++ Util.hitKeys(robot, KeyEvent.VK_2); ++ Util.hitKeys(robot, KeyEvent.VK_3); ++ Util.hitKeys(robot, KeyEvent.VK_ENTER); ++ realSync(); ++ } ++ ++ private void checkResult() throws Exception { ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ text = ((JTextComponent) cb.getEditor().getEditorComponent()).getText(); ++ } ++ }); ++ if (text.equals(EXPECTED)) { ++ System.out.println("Test with surrender = " + surrender + " passed"); ++ } else { ++ System.out.println("Test with surrender = " + surrender + " failed"); ++ throw new RuntimeException("Expected value in JComboBox editor '" + ++ EXPECTED + "' but found '" + text + "'."); ++ } ++ } ++ ++ private static void realSync() { ++ ((SunToolkit) (Toolkit.getDefaultToolkit())).realSync(); ++ } ++ ++ @Override ++ public void run() { ++ setupUI(); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JComponent/8043610/bug8043610.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,122 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++/* ++ @test ++ @bug 8043610 ++ @summary Tests that JComponent invalidate, revalidate and repaint methods could ++ be called from any thread ++ @author Petr Pchelko ++*/ ++ ++import sun.awt.SunToolkit; ++ ++import javax.swing.*; ++import java.awt.*; ++import java.util.concurrent.CountDownLatch; ++import java.util.concurrent.atomic.AtomicReference; ++ ++public class bug8043610 { ++ private static volatile JFrame frame; ++ private static volatile JComponent component; ++ ++ public static void main(String[] args) throws Exception { ++ ThreadGroup stubTG = new ThreadGroup(getRootThreadGroup(), "Stub Thread Group"); ++ ThreadGroup swingTG = new ThreadGroup(getRootThreadGroup(), "SwingTG"); ++ try { ++ Thread stubThread = new Thread(stubTG, new Runnable() { ++ @Override ++ public void run() { ++ SunToolkit.createNewAppContext(); ++ } ++ }); ++ stubThread.start(); ++ stubThread.join(); ++ ++ final CountDownLatch startSwingLatch = new CountDownLatch(1); ++ new Thread(swingTG, new Runnable() { ++ @Override ++ public void run() { ++ SunToolkit.createNewAppContext(); ++ SwingUtilities.invokeLater(new Runnable() { ++ @Override ++ public void run() { ++ frame = new JFrame(); ++ component = new JLabel("Test Text"); ++ frame.add(component); ++ frame.setBounds(100, 100, 100, 100); ++ frame.setVisible(true); ++ startSwingLatch.countDown(); ++ } ++ }); ++ } ++ }).start(); ++ startSwingLatch.await(); ++ ++ final AtomicReference<Exception> caughtException = new AtomicReference<>(); ++ Thread checkThread = new Thread(getRootThreadGroup(), new Runnable() { ++ @Override ++ public void run() { ++ try { ++ component.invalidate(); ++ component.revalidate(); ++ component.repaint(new Rectangle(0, 0, 0, 0)); ++ } catch (Exception e) { ++ caughtException.set(e); ++ } ++ } ++ }); ++ checkThread.start(); ++ checkThread.join(); ++ ++ if (caughtException.get() != null) { ++ throw new RuntimeException("Failed. Caught exception!", caughtException.get()); ++ } ++ } finally { ++ new Thread(swingTG, new Runnable() { ++ @Override ++ public void run() { ++ SwingUtilities.invokeLater(new Runnable() { ++ @Override ++ public void run() { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ }); ++ } ++ }).start(); ++ } ++ } ++ ++ private static ThreadGroup getRootThreadGroup() { ++ ThreadGroup currentTG = Thread.currentThread().getThreadGroup(); ++ ThreadGroup parentTG = currentTG.getParent(); ++ while (parentTG != null) { ++ currentTG = parentTG; ++ parentTG = currentTG.getParent(); ++ } ++ return currentTG; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JFileChooser/8046391/bug8046391.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8046391 ++ * @summary JFileChooser hangs if displayed in Windows L&F ++ * @author Alexey Ivanov ++ * @run main/othervm/timeout=10 bug8046391 ++*/ ++ ++import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; ++import sun.awt.OSInfo; ++import sun.awt.OSInfo.OSType; ++ ++import javax.swing.JFileChooser; ++import javax.swing.SwingUtilities; ++import javax.swing.UIManager; ++import javax.swing.UnsupportedLookAndFeelException; ++ ++public class bug8046391 { ++ ++ public static void main(String[] args) throws Exception { ++ OSType type = OSInfo.getOSType(); ++ if (type != OSType.WINDOWS) { ++ System.out.println("This test is for Windows only... skipping!"); ++ return; ++ } ++ ++ SwingUtilities.invokeAndWait(() -> { ++ try { ++ UIManager.setLookAndFeel(new WindowsLookAndFeel()); ++ } catch (UnsupportedLookAndFeelException e) { ++ e.printStackTrace(); ++ } ++ System.out.println("Creating JFileChooser..."); ++ JFileChooser fileChooser = new JFileChooser(); ++ System.out.println("Test passed: chooser = " + fileChooser); ++ }); ++ // Test fails if creating JFileChooser hangs ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,213 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.awt.Robot; ++import java.awt.event.KeyEvent; ++import java.io.File; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.PrintWriter; ++import java.util.concurrent.TimeUnit; ++import javax.swing.JFileChooser; ++import javax.swing.SwingUtilities; ++import javax.swing.filechooser.FileSystemView; ++ ++/** ++ * @test ++ * @bug 8062561 ++ * @summary File system view returns null default directory ++ * @run main/othervm bug8062561 GENERATE_POLICY ++ * @run main/othervm/policy=security.policy bug8062561 CHECK_DEFAULT_DIR run ++ */ ++public class bug8062561 { ++ ++ private static final String POLICY_FILE = "security2.policy"; ++ private static volatile boolean fileChooserIsShown = false; ++ ++ public static void main(String[] args) throws Exception { ++ ++ String test = args[0]; ++ ++ if ("GENERATE_POLICY".equals(test)) { ++ generatePolicyFile(); ++ } else if ("CHECK_DEFAULT_DIR".equals(test)) { ++ checkDefaultDirectory(); ++ } else if ("CHECK_FILE_CHOOSER".equals(test)) { ++ checkFileChooser(); ++ } else { ++ throw new RuntimeException("Wrong argument!"); ++ } ++ } ++ ++ private static void checkDefaultDirectory() { ++ if (System.getSecurityManager() == null) { ++ throw new RuntimeException("Security manager is not set!"); ++ } ++ ++ File defaultDirectory = FileSystemView.getFileSystemView(). ++ getDefaultDirectory(); ++ if (defaultDirectory != null) { ++ throw new RuntimeException("File system default directory is null!"); ++ } ++ } ++ private static volatile JFileChooser fileChooser; ++ ++ private static void checkFileChooser() throws Exception { ++ if (System.getSecurityManager() == null) { ++ throw new RuntimeException("Security manager is not set!"); ++ } ++ ++ Robot robot = new Robot(); ++ robot.setAutoDelay(50); ++ ++ SwingUtilities.invokeLater(new Runnable() { ++ ++ public void run() { ++ fileChooser = new JFileChooser(); ++ fileChooser.showOpenDialog(null); ++ fileChooserIsShown = true; ++ System.out.println("Start file chooser: " + fileChooserIsShown); ++ } ++ }); ++ ++ long time = System.currentTimeMillis(); ++ while (fileChooser == null) { ++ if (System.currentTimeMillis() - time >= 5000) { ++ System.exit(1); ++ } ++ Thread.sleep(500); ++ } ++ ++ Thread.sleep(500); ++ robot.keyPress(KeyEvent.VK_ESCAPE); ++ robot.keyRelease(KeyEvent.VK_ESCAPE); ++ System.exit(0); ++ } ++ ++ private static void generatePolicyFile() throws Exception { ++ if (System.getSecurityManager() != null) { ++ throw new RuntimeException("Security manager should be null!"); ++ } ++ ++ String osName = System.getProperty("os.name"); ++ System.out.println("os name: " + osName); ++ if (!osName.startsWith("Windows")) { ++ return; ++ } ++ System.out.println("after OS Check!"); ++ ++ File defaultDirectory = FileSystemView.getFileSystemView(). ++ getDefaultDirectory(); ++ ++ if (defaultDirectory == null) { ++ throw new RuntimeException("Default directory is null!"); ++ } ++ ++ File policyFile = new File(POLICY_FILE); ++ if (!policyFile.exists()) { ++ policyFile.createNewFile(); ++ } ++ ++ PrintWriter writer = new PrintWriter(policyFile, "UTF-8"); ++ writer.println("grant {"); ++ String documents = defaultDirectory.getCanonicalPath(); ++ documents = documents.replace('\\', '/'); ++ // user.dir permission ++ writer.print(" permission java.util.PropertyPermission"); ++ writer.print(" \"user.dir\","); ++ writer.println(" \"read\";"); ++ // Documents permission ++ writer.print(" permission java.io.FilePermission"); ++ writer.print(" \"" + documents + "\","); ++ writer.println(" \"read\";"); ++ // Desktop permission ++ writer.print(" permission java.io.FilePermission"); ++ writer.print(" \"" + documents.replace("Documents", "Desktop") + "\","); ++ writer.println(" \"read\";"); ++ // robot permission // "java.awt.AWTPermission" "createRobot" ++ writer.print(" permission java.awt.AWTPermission"); ++ writer.println(" \"createRobot\";"); ++ writer.println("};"); ++ writer.close(); ++ ++ performTest(); ++ } ++ ++ private static void performTest() throws Exception { ++ String javaPath = System.getProperty("java.home", ""); ++ String command = javaPath + File.separator + "bin" + File.separator + "java" ++ + " -Djava.security.manager -Djava.security.policy=" + POLICY_FILE ++ + " bug8062561 CHECK_FILE_CHOOSER"; ++ System.out.println(command); ++ int processExit = 0; ++ ++ Process process = Runtime.getRuntime().exec(command); ++ ++ try { ++ processExit = process.waitFor(); ++ } catch (IllegalThreadStateException e) { ++ throw new RuntimeException(e); ++ } ++ System.out.println("[RESULT] : " ++ + "The sub process has cleanly exited : PASS"); ++ ++ InputStream errorStream = process.getErrorStream(); ++ System.out.println("========= Child process stderr ========"); ++ boolean exception = dumpStream(errorStream); ++ if (exception) { ++ throw new RuntimeException("[RESULT] :" ++ + " Exception in child process : FAIL"); ++ } ++ System.out.println("======================================="); ++ ++ InputStream processInputStream = process.getInputStream(); ++ System.out.println("========= Child process output ========"); ++ dumpStream(processInputStream); ++ System.out.println("======================================="); ++ ++ if (processExit != 0) { ++ System.out.println("process exit: " + processExit); ++ process.destroy(); ++ throw new RuntimeException("[RESULT] : " ++ + "The sub process has not exited : FAIL"); ++ } ++ } ++ ++ public static boolean dumpStream(InputStream in) throws IOException { ++ String tempString; ++ int count = in.available(); ++ boolean exception = false; ++ while (count > 0) { ++ byte[] b = new byte[count]; ++ in.read(b); ++ tempString = new String(b); ++ if (!exception) { ++ exception = tempString.indexOf("Exception") != -1; ++ } ++ System.out.println(tempString); ++ count = in.available(); ++ } ++ ++ return exception; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JFileChooser/8062561/security.policy Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,5 @@ ++grant { ++ ++ permission java.util.PropertyPermission "user.home", "read"; ++ permission java.util.PropertyPermission "user.dir", "read"; ++}; +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JFileChooser/8062561/security2.policy Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,1 @@ ++// Autogenerated file +\ No newline at end of file +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JPopupMenu/7160604/bug7160604.html Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,30 @@ ++<!-- ++ Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++ ++<html> ++<body> ++<applet code="bug7160604.class" width=400 height=100></applet> ++Click on the top-bar and combo-box more than once. ++Make sure popup menu and drop-down list have a border and their items are drawn properly. ++</body> ++</html> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JPopupMenu/7160604/bug7160604.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,90 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ @bug 7160604 ++ @summary Using non-opaque windows - popups are initially not painted correctly ++ @author Oleg Pekhovskiy ++ @run applet/manual=yesno bug7160604.html ++*/ ++ ++import javax.swing.AbstractAction; ++import javax.swing.BorderFactory; ++import javax.swing.JApplet; ++import javax.swing.JComboBox; ++import javax.swing.JLabel; ++import javax.swing.JMenuItem; ++import javax.swing.JPanel; ++import javax.swing.JPopupMenu; ++import javax.swing.JWindow; ++import javax.swing.SwingUtilities; ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.event.ActionEvent; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++ ++public class bug7160604 extends JApplet { ++ ++ public void init() { ++ SwingUtilities.invokeLater(new Runnable() { ++ @Override ++ public void run() { ++ final JWindow window = new JWindow(); ++ window.setLocation(200, 200); ++ window.setSize(300, 300); ++ ++ final JLabel label = new JLabel("...click to invoke JPopupMenu"); ++ label.setOpaque(true); ++ final JPanel contentPane = new JPanel(new BorderLayout()); ++ contentPane.setBorder(BorderFactory.createLineBorder(Color.RED)); ++ window.setContentPane(contentPane); ++ contentPane.add(label, BorderLayout.NORTH); ++ ++ final JComboBox comboBox = new JComboBox(new Object[]{"1", "2", "3", "4"}); ++ contentPane.add(comboBox, BorderLayout.SOUTH); ++ ++ final JPopupMenu jPopupMenu = new JPopupMenu(); ++ ++ jPopupMenu.add("string"); ++ jPopupMenu.add(new AbstractAction("action") { ++ @Override ++ public void actionPerformed(final ActionEvent e) { ++ } ++ }); ++ jPopupMenu.add(new JLabel("label")); ++ jPopupMenu.add(new JMenuItem("MenuItem")); ++ label.addMouseListener(new MouseAdapter() { ++ @Override ++ public void mouseReleased(final MouseEvent e) { ++ jPopupMenu.show(label, 0, 0); ++ } ++ }); ++ ++ window.setBackground(new Color(0, 0, 0, 0)); ++ ++ window.setVisible(true); ++ } ++ }); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTable/8032874/bug8032874.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,145 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ * @bug 8032874 ++ * @summary Test whether ArrayIndexOutOfBoundsException is thrown or not, ++ * once selected row is removed from JTable with Sorter and Filter ++ * @author Dmitry Markov ++ * @run main bug8032874 ++ */ ++ ++import java.awt.*; ++import java.util.ArrayList; ++import java.util.List; ++ ++import javax.swing.*; ++import javax.swing.table.AbstractTableModel; ++import javax.swing.table.TableRowSorter; ++ ++import sun.awt.SunToolkit; ++ ++public class bug8032874 { ++ private static final int ROW_COUNT = 5; ++ private static JTable table; ++ private static TestTableModel tableModel; ++ ++ public static void main(String args[]) throws Exception { ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ createAndShowUI(); ++ } ++ }); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ table.getRowSorter().toggleSortOrder(0); ++ table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); ++ table.setRowSelectionInterval(1, 2); ++ } ++ }); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ for (int i = 0; i < ROW_COUNT; i++) { ++ tableModel.remove(0); ++ table.getRowSorter().toggleSortOrder(0); ++ } ++ } ++ }); ++ } ++ ++ public static void createAndShowUI() { ++ try { ++ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ ++ JFrame frame = new JFrame("bug8032874"); ++ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ++ ++ JPanel panel = new JPanel(); ++ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); ++ ++ tableModel = new TestTableModel(); ++ table = new JTable(tableModel); ++ table.setSurrendersFocusOnKeystroke(true); ++ ++ final TableRowSorter<TestTableModel> rowSorter = new TableRowSorter<TestTableModel>(tableModel); ++ rowSorter.setRowFilter(new RowFilter<TestTableModel, Integer>() { ++ @Override ++ public boolean include(Entry<? extends TestTableModel, ? extends Integer> entry) { ++ return entry.getIdentifier() % 2 == 0; ++ } ++ }); ++ table.setRowSorter(rowSorter); ++ ++ JScrollPane jScrollPane = new JScrollPane(table); ++ panel.add(jScrollPane); ++ ++ frame.setContentPane(panel); ++ frame.setSize(new Dimension(800, 600)); ++ frame.setVisible(true); ++ } ++ ++ private static class TestTableModel extends AbstractTableModel { ++ private final List<Integer> data; ++ ++ public TestTableModel() { ++ data = new ArrayList<Integer>(); ++ ++ for (int i = 0; i < ROW_COUNT; i++) { ++ data.add(i); ++ } ++ } ++ ++ @Override ++ public int getRowCount() { ++ return data.size(); ++ } ++ ++ @Override ++ public int getColumnCount() { ++ return 1; ++ } ++ ++ @Override ++ public Object getValueAt(int rowIndex, int columnIndex) { ++ return data.get(rowIndex); ++ } ++ ++ public void remove(int row) { ++ data.remove(row); ++ fireTableRowsDeleted(row, row); ++ } ++ } ++} ++ +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTextField/8036819/bug8036819.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,132 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @library ../../regtesthelpers ++ * @build Util ++ * @bug 8036819 ++ * @summary JAB: mnemonics not read for textboxes ++ * @author Vivi An ++ * @run main bug8036819 ++ */ ++ ++import javax.swing.*; ++import javax.swing.event.*; ++import java.awt.event.*; ++import java.awt.*; ++import sun.awt.SunToolkit; ++import javax.accessibility.*; ++ ++public class bug8036819 { ++ ++ public static volatile Boolean passed = false; ++ ++ public static void main(String args[]) throws Throwable { ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.realSync(); ++ ++ Robot robo = new Robot(); ++ robo.setAutoDelay(300); ++ ++ // Using mnemonic key to focus on the textfield ++ Util.hitMnemonics(robo, KeyEvent.VK_P); ++ toolkit.realSync(); ++ ++ if (!passed){ ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ ++ private static void createAndShowGUI() { ++ JFrame mainFrame = new JFrame("bug 8036819"); ++ ++ JLabel usernameLabel = new JLabel("Username: "); ++ JTextField usernameField = new JTextField(20); ++ usernameLabel.setDisplayedMnemonic(KeyEvent.VK_U); ++ usernameLabel.setLabelFor(usernameField); ++ ++ JLabel pwdLabel = new JLabel("Password: "); ++ final JTextField pwdField = new JTextField(20); ++ pwdLabel.setDisplayedMnemonic(KeyEvent.VK_P); ++ pwdLabel.setLabelFor(pwdField); ++ ++ pwdField.addKeyListener( ++ new KeyListener(){ ++ @Override ++ public void keyPressed(KeyEvent keyEvent) { ++ } ++ ++ @Override ++ public void keyTyped(KeyEvent keyEvent) { ++ } ++ ++ @Override ++ public void keyReleased(KeyEvent keyEvent){ ++ JComponent comp = (JComponent) pwdField; ++ AccessibleContext ac = comp.getAccessibleContext(); ++ AccessibleExtendedComponent aec = (AccessibleExtendedComponent)ac.getAccessibleComponent(); ++ AccessibleKeyBinding akb = aec.getAccessibleKeyBinding(); ++ if (akb != null){ ++ int count = akb.getAccessibleKeyBindingCount(); ++ if (count != 1){ ++ passed = false; ++ return; ++ } ++ ++ // there is 1 accessible key for the text field ++ System.out.println("Retrieved AccessibleKeyBinding for textfield " + count); ++ ++ // the key code is KeyEvent.VK_P ++ Object o = akb.getAccessibleKeyBinding(0); ++ if (o instanceof KeyStroke){ ++ javax.swing.KeyStroke key = (javax.swing.KeyStroke)o; ++ System.out.println("keystroke is " + key.getKeyCode()); ++ if (key.getKeyCode() == KeyEvent.VK_P) ++ passed = true; ++ } ++ } ++ } ++ } ++ ); ++ ++ mainFrame.getContentPane().add(usernameLabel); ++ mainFrame.getContentPane().add(usernameField); ++ mainFrame.getContentPane().add(pwdLabel); ++ mainFrame.getContentPane().add(pwdField); ++ ++ mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ mainFrame.setLayout(new FlowLayout(FlowLayout.LEFT)); ++ ++ mainFrame.setSize(200, 200); ++ mainFrame.setLocation(200, 200); ++ mainFrame.setVisible(true); ++ mainFrame.toFront(); ++ } ++ } +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/PopupFactory/8048506/bug8048506.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,65 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8048506 ++ * @summary Tests that popup with null-owner does not throw NPE ++ * @author Dmitry Markov ++ */ ++ ++import javax.swing.*; ++import javax.swing.plaf.metal.MetalLookAndFeel; ++ ++public class bug8048506 { ++ ++ public static void main(String[] args) throws Exception { ++ UIManager.setLookAndFeel(new MetalLookAndFeel()); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ System.out.println("The test passed"); ++ } ++ ++ private static void createAndShowGUI() { ++ JFrame frame = new JFrame("bug8048506"); ++ frame.setSize(400, 400); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ frame.setVisible(true); ++ ++ PopupFactory factory = PopupFactory.getSharedInstance(); ++ ++ // Create and show popup with owner ++ Popup popup1 = factory.getPopup(frame, new JLabel("Popup with owner"), 100, 100); ++ popup1.show(); ++ ++ //Create and show popup without owner ++ Popup popup2 = factory.getPopup(null, new JLabel("Popup without owner"), 200, 200); ++ popup2.show(); ++ } ++} ++ +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/plaf/nimbus/8041725/bug8041725.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,82 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ @bug 8041725 ++ @summary JList selection colors are not UIResource instances in Nimbus L&F ++ @author Anton Litvinov ++*/ ++ ++import java.awt.*; ++import javax.swing.*; ++import javax.swing.plaf.*; ++import javax.swing.plaf.nimbus.*; ++ ++public class bug8041725 { ++ public static void main(String[] args) throws Exception { ++ UIManager.setLookAndFeel(new NimbusLookAndFeel()); ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ JFrame frame = new JFrame("bug8041725"); ++ frame.setSize(200, 200); ++ JList list = new JList(new String[]{"Item1", "Item2", "Item3"}); ++ frame.getContentPane().add(list); ++ frame.pack(); ++ frame.setVisible(true); ++ ++ System.err.println("Test #1: No items are selected, list is enabled."); ++ testSelectionColors(list); ++ ++ System.err.println("Test #2: No items are selected, list is disabled."); ++ list.setEnabled(false); ++ testSelectionColors(list); ++ ++ System.err.println("Test #3: One item is selected, list is disabled."); ++ list.setSelectedIndex(0); ++ testSelectionColors(list); ++ ++ System.err.println("Test #4: One item is selected, list is enabled."); ++ list.setEnabled(true); ++ testSelectionColors(list); ++ ++ frame.dispose(); ++ } ++ }); ++ } ++ ++ private static void testSelectionColors(JList list) { ++ Color selBackColor = list.getSelectionBackground(); ++ if (!(selBackColor instanceof UIResource)) { ++ throw new RuntimeException(String.format( ++ "JList.getSelectionBackground() returned instance of '%s' instead of UIResource.", ++ selBackColor.getClass())); ++ } ++ Color selForeColor = list.getSelectionForeground(); ++ if (!(selForeColor instanceof UIResource)) { ++ throw new RuntimeException(String.format( ++ "JList.getSelectionForeground() returned instance of '%s' instead of UIResource.", ++ selForeColor.getClass())); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/GlyphView/4984669/bug4984669.html Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,30 @@ ++<html> ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++<body> ++<applet code="bug4984669.class" width=300 height=300></applet> ++The four lines printed above in a bold typeface should all be underlined. ++It is a bug if any of these lines is underlined only partially. ++The very first line should not be underlined at all. ++</body> ++</html> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/GlyphView/4984669/bug4984669.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ @bug 4984669 8002148 ++ @summary Tests HTML underlining ++ @author Peter Zhelezniakov ++ @run applet/manual=yesno bug4984669.html ++*/ ++import javax.swing.*; ++import javax.swing.text.*; ++ ++public class bug4984669 extends JApplet ++{ ++ public void init() { ++ JEditorPane pane = new JEditorPane(); ++ this.getContentPane().add(new JScrollPane(pane)); ++ pane.setEditorKit(new StyledEditorKit()); ++ ++ try { ++ pane.getDocument().insertString(0,"12 \n",null); ++ MutableAttributeSet attrs = new SimpleAttributeSet(); ++ ++ StyleConstants.setFontSize(attrs, 36); ++ StyleConstants.setBold(attrs, true); ++ StyleConstants.setUnderline(attrs, true); ++ pane.getDocument().insertString(6, "aa\n", attrs); ++ pane.getDocument().insertString(9, "bbb\n", attrs); ++ pane.getDocument().insertString(13, "cccc\n", attrs); ++ pane.getDocument().insertString(18, "ddddd\n", attrs); ++ } catch (Exception e) { ++ throw new Error("Failed: Unexpected Exception", e); ++ } ++ } ++} +--- ./jdk/test/javax/swing/text/StyledEditorKit/8016833/bug8016833.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/javax/swing/text/StyledEditorKit/8016833/bug8016833.java Mon Jan 05 11:57:27 2015 -0800 +@@ -190,9 +190,9 @@ + // not too wide + assertTrue(out3.getWidth() * 0.8 < out2.getWidth()); + // not too low +- assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 3); ++ assertTrue(out3.getY() - (out1.getY() + out2.getHeight() - 1) < 4); + // not too high +- assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) > 0); ++ assertTrue(out3.getY() - (out1.getY() + out2.getHeight() - 1) > 0); + } + + void testStrikthrough() { +@@ -217,7 +217,7 @@ + // not too wide + assertTrue(out3.getWidth() * 0.8 < out2.getWidth()); + // not too low +- assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 0); ++ assertTrue(out3.getY() - (out1.getY() + out2.getHeight() - 1) < 0); + // not too high + assertTrue(out3.getY() - out1.getY() > 1); + } +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/html/parser/Parser/8028616/bug8028616.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8028616 ++ * @summary Tests correct parsing of the text with leading slash (/) ++ * @author Dmitry Markov ++ */ ++ ++import javax.swing.text.html.HTMLDocument; ++import javax.swing.text.html.HTMLEditorKit; ++import java.io.StringReader; ++ ++public class bug8028616 { ++ private static final String text = "/ at start is bad"; ++ private static Object lock = new Object(); ++ private static boolean isCallbackInvoked = false; ++ private static Exception exception = null; ++ ++ public static void main(String[] args) throws Exception { ++ ParserCB cb = new ParserCB(); ++ HTMLEditorKit htmlKit = new HTMLEditorKit(); ++ HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument(); ++ ++ htmlDoc.getParser().parse(new StringReader(text), cb, true); ++ ++ synchronized (lock) { ++ if (!isCallbackInvoked) { ++ lock.wait(5000); ++ } ++ } ++ ++ if (!isCallbackInvoked) { ++ throw new RuntimeException("Test Failed: ParserCallback.handleText() is not invoked for text - " + text); ++ } ++ ++ if (exception != null) { ++ throw exception; ++ } ++ } ++ ++ private static class ParserCB extends HTMLEditorKit.ParserCallback { ++ @Override ++ public void handleText(char[] data, int pos) { ++ synchronized (lock) { ++ if (!text.equals(new String(data)) || pos != 0) { ++ exception = new RuntimeException( ++ "Test Failed: the data passed to ParserCallback.handleText() does not meet the expectation"); ++ } ++ isCallbackInvoked = true; ++ lock.notifyAll(); ++ } ++ } ++ } ++} ++ +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/marshal/8036981/Good.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,94 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package testjaxbcontext; ++ ++import org.w3c.dom.Element; ++import javax.xml.bind.annotation.XmlAccessType; ++import javax.xml.bind.annotation.XmlAccessorType; ++import javax.xml.bind.annotation.XmlAnyElement; ++import javax.xml.bind.annotation.XmlType; ++import java.util.ArrayList; ++import java.util.List; ++ ++/** ++ * <p> ++ * Java class for Good complex type. ++ * ++ * <p> ++ * The following schema fragment specifies the expected content contained within ++ * this class. ++ * ++ * <pre> ++ * <complexType name="Good"> ++ * <complexContent> ++ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> ++ * <sequence> ++ * <any processContents='skip' maxOccurs="70"/> ++ * </sequence> ++ * </restriction> ++ * </complexContent> ++ * </complexType> ++ * </pre> ++ * ++ * ++ */ ++@XmlAccessorType(XmlAccessType.FIELD) ++@XmlType(name = "Good", propOrder = { ++ "any" ++}) ++public class Good { ++ ++ @XmlAnyElement ++ protected List<Element> any; ++ ++ /** ++ * Gets the value of the any property. ++ * ++ * <p> ++ * This accessor method returns a reference to the live list, not a ++ * snapshot. Therefore any modification you make to the returned list will ++ * be present inside the JAXB object. This is why there is not a ++ * <CODE>set</CODE> method for the any property. ++ * ++ * <p> ++ * For example, to add a new item, do as follows: ++ * <pre> ++ * getAny().add(newItem); ++ * </pre> ++ * ++ * ++ * <p> ++ * Objects of the following type(s) are allowed in the list ++ * {@link org.w3c.dom.Element } ++ * ++ * ++ */ ++ public List<Element> getAny() { ++ if (any == null) { ++ any = new ArrayList<Element>(); ++ } ++ return this.any; ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/marshal/8036981/Main.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,104 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package testjaxbcontext; ++ ++import javax.xml.bind.annotation.*; ++ ++/** ++ * <p> ++ * Java class for main complex type. ++ * ++ * <p> ++ * The following schema fragment specifies the expected content contained within ++ * this class. ++ * ++ * <pre> ++ * <complexType name="main"> ++ * <complexContent> ++ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> ++ * <sequence> ++ * <element name="Root" type="{}Root"/> ++ * <element name="Good" type="{}Good"/> ++ * </sequence> ++ * </restriction> ++ * </complexContent> ++ * </complexType> ++ * </pre> ++ * ++ * ++ */ ++@XmlAccessorType(XmlAccessType.FIELD) ++@XmlType(name = "main", propOrder = { ++ "root", ++ "good" ++}) ++@XmlRootElement ++public class Main { ++ ++ @XmlElement(name = "Root", required = true) ++ protected Root root; ++ @XmlElement(name = "Good", required = true) ++ protected Good good; ++ ++ /** ++ * Gets the value of the root property. ++ * ++ * @return possible object is {@link Root } ++ * ++ */ ++ public Root getRoot() { ++ return root; ++ } ++ ++ /** ++ * Sets the value of the root property. ++ * ++ * @param value allowed object is {@link Root } ++ * ++ */ ++ public void setRoot(Root value) { ++ this.root = value; ++ } ++ ++ /** ++ * Gets the value of the good property. ++ * ++ * @return possible object is {@link Good } ++ * ++ */ ++ public Good getGood() { ++ return good; ++ } ++ ++ /** ++ * Sets the value of the good property. ++ * ++ * @param value allowed object is {@link Good } ++ * ++ */ ++ public void setGood(Good value) { ++ this.good = value; ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/marshal/8036981/ObjectFactory.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package testjaxbcontext; ++ ++import javax.xml.bind.annotation.XmlRegistry; ++ ++/** ++ * This object contains factory methods for each Java content interface and Java ++ * element interface generated in the generated package. ++ * <p> ++ * An ObjectFactory allows you to programatically construct new instances of the ++ * Java representation for XML content. The Java representation of XML content ++ * can consist of schema derived interfaces and classes representing the binding ++ * of schema type definitions, element declarations and model groups. Factory ++ * methods for each of these are provided in this class. ++ * ++ */ ++@XmlRegistry ++public class ObjectFactory { ++ ++ /** ++ * Create a new ObjectFactory that can be used to create new instances of ++ * schema derived classes for package: generated ++ * ++ */ ++ public ObjectFactory() { ++ } ++ ++ /** ++ * Create an instance of {@link Root } ++ * ++ */ ++ public Root createRoot() { ++ return new Root(); ++ } ++ ++ /** ++ * Create an instance of {@link Good } ++ * ++ */ ++ public Good createGood() { ++ return new Good(); ++ } ++ ++ /** ++ * Create an instance of {@link Main } ++ * ++ */ ++ public Main createMain() { ++ return new Main(); ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/marshal/8036981/Root.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,91 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package testjaxbcontext; ++ ++import javax.xml.bind.annotation.*; ++import java.util.ArrayList; ++import java.util.List; ++ ++/** ++ * <p> ++ * Java class for Root complex type. ++ * ++ * <p> ++ * The following schema fragment specifies the expected content contained within ++ * this class. ++ * ++ * <pre> ++ * <complexType name="Root"> ++ * <complexContent> ++ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> ++ * <sequence> ++ * <any processContents='skip' maxOccurs="70"/> ++ * </sequence> ++ * </restriction> ++ * </complexContent> ++ * </complexType> ++ * </pre> ++ * ++ * ++ */ ++@XmlAccessorType(XmlAccessType.FIELD) ++@XmlType(name = "Root", propOrder = { ++ "content" ++}) ++public class Root { ++ ++ @XmlMixed ++ @XmlAnyElement ++ protected List<Object> content; ++ ++ /** ++ * Gets the value of the content property. ++ * ++ * <p> ++ * This accessor method returns a reference to the live list, not a ++ * snapshot. Therefore any modification you make to the returned list will ++ * be present inside the JAXB object. This is why there is not a ++ * <CODE>set</CODE> method for the content property. ++ * ++ * <p> ++ * For example, to add a new item, do as follows: ++ * <pre> ++ * getContent().add(newItem); ++ * </pre> ++ * ++ * ++ * <p> ++ * Objects of the following type(s) are allowed in the list {@link org.w3c.dom.Element } ++ * {@link String } ++ * ++ * ++ */ ++ public List<Object> getContent() { ++ if (content == null) { ++ content = new ArrayList<Object>(); ++ } ++ return this.content; ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/marshal/8036981/Test.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,67 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test Test.java ++ * @bug 8036981 ++ * @summary JAXB not preserving formatting during unmarshalling/marshalling ++ * @compile Good.java Main.java ObjectFactory.java Root.java ++ * @run main/othervm Test ++ */ ++ ++import javax.xml.bind.JAXBContext; ++import javax.xml.bind.Marshaller; ++import javax.xml.bind.Unmarshaller; ++import java.io.File; ++import java.io.StringWriter; ++ ++/** ++ * Test for marshalling and unmarshalling mixed and unmixed content ++ */ ++public class Test { ++ ++ private static final String EXPECTED = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><main><Root>\n" + ++ " <SomeTag>\n" + ++ " <AChildTag>\n" + ++ " <AnotherChildTag/>\n" + ++ " <AnotherChildTag/>\n" + ++ " </AChildTag>\n" + ++ " </SomeTag>\n" + ++ " </Root><Good><VeryGood><TheBest><MegaSuper/><MegaSuper/>\n" + ++ " </TheBest>\n" + ++ " </VeryGood></Good></main>"; ++ ++ public static void main(String[] args) throws Exception { ++ JAXBContext jc = JAXBContext.newInstance("testjaxbcontext"); ++ Unmarshaller u = jc.createUnmarshaller(); ++ Object result = u.unmarshal(new File(System.getProperty("test.src", ".") + "/test.xml")); ++ StringWriter sw = new StringWriter(); ++ Marshaller m = jc.createMarshaller(); ++ m.marshal(result, sw); ++ System.out.println("Expected:" + EXPECTED); ++ System.out.println("Observed:" + sw.toString()); ++ if (!EXPECTED.equals(sw.toString())) { ++ throw new Exception("Unmarshal/Marshal generates different content"); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/marshal/8036981/test.xml Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,19 @@ ++<?xml version="1.0" encoding="UTF-8" standalone="yes"?> ++<main> ++ <Root> ++ <SomeTag> ++ <AChildTag> ++ <AnotherChildTag/> ++ <AnotherChildTag/> ++ </AChildTag> ++ </SomeTag> ++ </Root> ++ <Good> ++ <VeryGood> ++ <TheBest> ++ <MegaSuper/> ++ <MegaSuper/> ++ </TheBest> ++ </VeryGood> ++ </Good> ++</main> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/xjc/8029837/PreParseGrammarTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8029837 ++ * @summary Test simulates the partial call to xjc ant task that fails with ++ * NullPointer exception ++ * @run main/othervm PreParseGrammarTest ++ */ ++ ++import com.sun.org.apache.xerces.internal.parsers.XMLGrammarPreparser; ++import com.sun.org.apache.xerces.internal.xni.XNIException; ++import com.sun.org.apache.xerces.internal.xni.grammars.Grammar; ++import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarDescription; ++import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; ++import java.io.BufferedInputStream; ++import java.io.File; ++import java.io.FileInputStream; ++import java.io.FileNotFoundException; ++import java.io.IOException; ++import java.io.InputStream; ++ ++public class PreParseGrammarTest { ++ ++ public static void main(String[] args) throws FileNotFoundException, XNIException, IOException { ++ File xsdf = new File(System.getProperty("test.src", ".") + "/test.xsd"); ++ InputStream is = new BufferedInputStream(new FileInputStream(xsdf)); ++ XMLInputSource xis = new XMLInputSource(null, null, null, is, null); ++ XMLGrammarPreparser gp = new XMLGrammarPreparser(); ++ gp.registerPreparser(XMLGrammarDescription.XML_SCHEMA, null); ++ //The NullPointerException is observed on next call during ant task ++ // execution ++ Grammar res = gp.preparseGrammar(XMLGrammarDescription.XML_SCHEMA, xis); ++ System.out.println("Grammar preparsed successfully:" + res); ++ return; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/bind/xjc/8029837/test.xsd Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,4 @@ ++<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ++ <xsd:element name="root"> ++ </xsd:element> ++</xsd:schema> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/common/8032908/TestFunc.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import org.w3c.dom.Node; ++ ++public class TestFunc { ++ ++ public static String test(Node node) { ++ String s = node.getTextContent(); ++ return s; ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/common/8032908/XSLT.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8032908 ++ * @summary Test if Node.getTextContent() function correctly returns children ++ * content ++ * @compile TestFunc.java XSLT.java ++ * @run main/othervm XSLT ++ */ ++import java.io.ByteArrayOutputStream; ++import javax.xml.transform.Transformer; ++import javax.xml.transform.TransformerException; ++import javax.xml.transform.TransformerFactory; ++import javax.xml.transform.stream.StreamResult; ++import javax.xml.transform.stream.StreamSource; ++ ++public class XSLT { ++ ++ static final String XMLTOTRANSFORM = "/in.xml"; ++ static final String XSLTRANSFORMER = "/test.xsl"; ++ static final String EXPECTEDRESULT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>ABCDEFG"; ++ ++ public static void main(String[] args) throws TransformerException { ++ ByteArrayOutputStream resStream = new ByteArrayOutputStream(); ++ TransformerFactory trf = TransformerFactory.newInstance(); ++ Transformer tr = trf.newTransformer(new StreamSource(System.getProperty("test.src", ".") + XSLTRANSFORMER)); ++ tr.transform(new StreamSource(System.getProperty("test.src", ".") + XMLTOTRANSFORM), new StreamResult(resStream)); ++ System.out.println("Transformation completed. Result:" + resStream.toString()); ++ if (!resStream.toString().equals(EXPECTEDRESULT)) { ++ throw new RuntimeException("Incorrect transformation result"); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/common/8032908/in.xml Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,2 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<root><elem><level2_0>ABCD</level2_0><level2_1>EFG</level2_1></elem></root> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/common/8032908/test.xsl Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,8 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<xsl:transform exclude-result-prefixes="cscdt_ufunc" version="1.0" ++ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ++ xmlns:cscdt_ufunc="http://xml.apache.org/xalan/java"> ++ <xsl:template match="elem"> ++ <xsl:value-of select="cscdt_ufunc:TestFunc.test(.)" /> ++ </xsl:template> ++</xsl:transform> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/testng/TEST.properties Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,3 @@ ++# This file identifies root(s) of the test-ng hierarchy. ++ ++TestNG.dirs = . +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/testng/parse/XMLEntityScannerLoad.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,75 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package parse; ++ ++import java.io.ByteArrayInputStream; ++import java.io.IOException; ++import javax.xml.parsers.DocumentBuilderFactory; ++import javax.xml.parsers.ParserConfigurationException; ++ ++import static org.testng.Assert.assertEquals; ++import org.testng.annotations.DataProvider; ++import org.testng.annotations.Test; ++import org.w3c.dom.Document; ++import org.xml.sax.SAXException; ++ ++/** ++ * JDK-8059327: XML parser returns corrupt attribute value ++ * https://bugs.openjdk.java.net/browse/JDK-8059327 ++ * ++ * Also: ++ * JDK-8061550: XMLEntityScanner can corrupt corrupt content during parsing ++ * https://bugs.openjdk.java.net/browse/JDK-8061550 ++ * ++ * @Summary: verify that the character cache in XMLEntityScanner is reset properly ++ */ ++ ++public class XMLEntityScannerLoad { ++ ++ @Test(dataProvider = "xmls") ++ public void test(String xml) throws SAXException, IOException, ParserConfigurationException { ++ Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ChunkInputStream(xml)); ++ String value = d.getDocumentElement().getAttribute("a1"); ++ assertEquals(value, "w"); ++ } ++ ++ static class ChunkInputStream extends ByteArrayInputStream { ++ ChunkInputStream(String xml) { ++ super(xml.getBytes()); ++ } ++ ++ @Override ++ public synchronized int read(byte[] b, int off, int len) { ++ return super.read(b, off, 7); ++ } ++ } ++ ++ @DataProvider(name = "xmls") ++ private Object[][] xmls() { ++ return new Object[][] { ++ {"<?xml version=\"1.0\"?><element a1=\"w\" a2=\"""\"/>"}, ++ {"<?xml version=\"1.1\"?><element a1=\"w\" a2=\"""\"/>"} ++ }; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/validation/8049514/FeaturePropagationTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++/** ++ * @test ++ * @bug 8049514 ++ * @summary verifies that feature set on the factory is propagated properly ++ * to the validator ++ * @run main/othervm FeaturePropagationTest ++ */ ++ ++ ++import java.io.ByteArrayInputStream; ++import java.io.InputStreamReader; ++import javax.xml.XMLConstants; ++import javax.xml.transform.stream.StreamSource; ++import javax.xml.validation.*; ++ ++/** ++ * JDK-8049514 ++ * ++ * FEATURE_SECURE_PROCESSING can not be turned off on a validator through ++ * SchemaFactory ++ */ ++public class FeaturePropagationTest { ++ ++ static String xsd = "<?xml version='1.0'?>\n" + "<schema xmlns='http://www.w3.org/2001/XMLSchema'\n" ++ + " xmlns:test='jaxp13_test'\n" ++ + " targetNamespace='jaxp13_test'\n" ++ + " elementFormDefault='qualified'>\n" ++ + " <element name='test' type='string'/>\n" ++ + "</schema>\n"; ++ ++ public static void main(String[] args) throws Exception { ++ InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(xsd.getBytes())); ++ StreamSource xsdSource = new StreamSource(reader); ++ ++ SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); ++ schemaFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false); ++ Schema schema = null; ++ schema = schemaFactory.newSchema(xsdSource); ++ ++ Validator validator = schema.newValidator(); ++ ++ if (validator.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING)) { ++ throw new RuntimeException("Feature set on the factory is not inherited!"); ++ } ++ ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8033113/Organization_List.wsdl Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,99 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++<wsdl:definitions targetNamespace="urn:Organization_List" xmlns:s0="urn:Organization_List" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ++ <wsdl:types> ++ <xsd:schema elementFormDefault="qualified" targetNamespace="urn:Organization_List"> ++ <xsd:element name="OpGetList" type="s0:GetListInputMap"/> ++ <xsd:complexType name="GetListInputMap"> ++ <xsd:sequence> ++ <xsd:element name="Qualification" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ <xsd:element name="OpGetListResponse" type="s0:GetListOutputMap"/> ++ <xsd:complexType name="GetListOutputMap"> ++ <xsd:sequence> ++ <xsd:element maxOccurs="unbounded" name="getListValues"> ++ <xsd:complexType> ++ <xsd:sequence> ++ <xsd:element name="Organization_Name" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ </xsd:element> ++ </xsd:sequence> ++ </xsd:complexType> ++ <xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/> ++ <xsd:complexType name="AuthenticationInfo"> ++ <xsd:sequence> ++ <xsd:element name="userName" type="xsd:string"/> ++ <xsd:element name="password" type="xsd:string"/> ++ <xsd:element minOccurs="0" name="authentication" type="xsd:string"/> ++ <xsd:element minOccurs="0" name="locale" type="xsd:string"/> ++ <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ </xsd:schema> ++ </wsdl:types> ++ ++ <wsdl:message name="ARAuthenticate"> ++ <wsdl:part element="s0:AuthenticationInfo" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapIn"> ++ <wsdl:part element="s0:OpGetList" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapOut"> ++ <wsdl:part element="s0:OpGetListResponse" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:portType name="Organization_ListPortType"> ++ <wsdl:operation name="OpGetList"> ++ <wsdl:input message="s0:OpGetListSoapIn"/> ++ <wsdl:output message="s0:OpGetListSoapOut"/> ++ </wsdl:operation> ++ </wsdl:portType> ++ ++ <wsdl:binding name="Organization_ListSoapBinding" type="s0:Organization_ListPortType"> ++ <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ++ <wsdl:operation name="OpGetList"> ++ <soap:operation soapAction="urn:Organization_List/OpGetList" style="document"/> ++ <wsdl:input> ++ <soap:header message="s0:ARAuthenticate" part="param" use="literal"> ++ </soap:header> ++ <soap:body use="literal"/> ++ </wsdl:input> ++ <wsdl:output> ++ <soap:body use="literal"/> ++ </wsdl:output> ++ </wsdl:operation> ++ </wsdl:binding> ++ ++ <wsdl:service name="Organization_ListService"> ++ <wsdl:port binding="s0:Organization_ListSoapBinding" name="Organization_ListSoap"> ++ <soap:address location="http://bogus:9080/URL"/> ++ </wsdl:port> ++ </wsdl:service> ++ ++</wsdl:definitions> ++ +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8033113/WsImportTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,152 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8033113 ++ * @summary wsimport fails on WSDL:header parameter name customization ++ * @run main/othervm WsImportTest ++ */ ++ ++import java.io.InputStreamReader; ++import java.io.IOException; ++import java.io.BufferedReader; ++import java.io.File; ++import java.nio.file.Files; ++import java.nio.file.FileVisitResult; ++import java.nio.file.Path; ++import java.nio.file.Paths; ++import java.nio.file.SimpleFileVisitor; ++import java.nio.file.attribute.BasicFileAttributes; ++ ++import static java.nio.file.FileVisitResult.*; ++ ++public class WsImportTest { ++ ++ public static void main(String[] args) throws IOException { ++ ++ String wsimport = getWsImport(); ++ String customization = getWSDLFilePath("customization.xml"); ++ String wsdl = getWSDLFilePath("Organization_List.wsdl"); ++ ++ try { ++ log("Importing wsdl: " + wsdl); ++ String[] wsargs = { ++ wsimport, ++ "-keep", ++ "-verbose", ++ "-extension", ++ "-XadditionalHeaders", ++ "-Xdebug", ++ "-b", ++ customization, ++ wsdl ++ }; ++ ++ ProcessBuilder pb = new ProcessBuilder(wsargs); ++ pb.redirectErrorStream(true); ++ Process p = pb.start(); ++ logOutput(p); ++ int result = p.waitFor(); ++ p.destroy(); ++ ++ if (result != 0) { ++ fail("WsImport failed. TEST FAILED."); ++ } else { ++ log("Test PASSED."); ++ } ++ ++ } catch (Exception e) { ++ e.printStackTrace(); ++ fail(e.getMessage()); ++ } finally { ++ deleteGeneratedFiles(); ++ } ++ } ++ ++ private static void fail(String message) { ++ throw new RuntimeException(message); ++ } ++ ++ private static void log(String msg) { ++ System.out.println(msg); ++ } ++ ++ private static void logOutput(Process p) throws IOException { ++ BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); ++ String s = r.readLine(); ++ while (s != null) { ++ log(s.trim()); ++ s = r.readLine(); ++ } ++ } ++ ++ private static void deleteGeneratedFiles() { ++ Path p = Paths.get("generated"); ++ if (Files.exists(p)) { ++ try { ++ Files.walkFileTree(p, new SimpleFileVisitor<Path>() { ++ @Override ++ public FileVisitResult visitFile(Path file, ++ BasicFileAttributes attrs) throws IOException { ++ ++ Files.delete(file); ++ return CONTINUE; ++ } ++ ++ @Override ++ public FileVisitResult postVisitDirectory(Path dir, ++ IOException exc) throws IOException { ++ ++ if (exc == null) { ++ Files.delete(dir); ++ return CONTINUE; ++ } else { ++ throw exc; ++ } ++ } ++ }); ++ } catch (IOException ioe) { ++ ioe.printStackTrace(); ++ } ++ } ++ } ++ ++ private static String getWSDLFilePath(String filename) { ++ String testSrc = System.getProperty("test.src"); ++ if (testSrc == null) testSrc = "."; ++ return Paths.get(testSrc).resolve(filename).toString(); ++ } ++ ++ private static String getWsImport() { ++ String javaHome = System.getProperty("java.home"); ++ if (javaHome.endsWith("jre")) { ++ javaHome = new File(javaHome).getParent(); ++ } ++ String wsimport = javaHome + File.separator + "bin" + File.separator + "wsimport"; ++ if (System.getProperty("os.name").startsWith("Windows")) { ++ wsimport = wsimport.concat(".exe"); ++ } ++ return wsimport; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8033113/customization.xml Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,45 @@ ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++<jaxws:bindings wsdlLocation="./Organization_List.wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> ++ <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> ++ <jaxws:bindings node="wsdl:definitions/wsdl:binding[@name='Organization_ListSoapBinding']/wsdl:operation[@name='OpGetList']"> ++ <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='ARAuthenticate']/wsdl:part[@name='param']" name="authParam"/> ++ <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='OpGetListSoapIn']/wsdl:part[@name='param']" name="inParam"/> ++ <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='OpGetListSoapOut']/wsdl:part[@name='param']" name="outParam"/> ++ </jaxws:bindings> ++</jaxws:bindings> ++ ++<!--wsdl:message definitions from WSDL whose part names we are trying to override... ++ ++ <wsdl:message name="ARAuthenticate"> ++ <wsdl:part element="s0:AuthenticationInfo" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapIn"> ++ <wsdl:part element="s0:OpGetList" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapOut"> ++ <wsdl:part element="s0:OpGetListResponse" name="param"/> ++ </wsdl:message> ++--> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8043129/MailTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,148 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8043129 ++ * @summary JAF initialisation in SAAJ clashing with the one in javax.mail ++ * @author mkos ++ * @library javax.mail.jar ++ * @build MailTest ++ * @run main MailTest ++ */ ++ ++import javax.activation.CommandMap; ++import javax.activation.MailcapCommandMap; ++import javax.mail.BodyPart; ++import javax.mail.Message; ++import javax.mail.MessagingException; ++import javax.mail.Multipart; ++import javax.mail.Session; ++import javax.mail.internet.InternetAddress; ++import javax.mail.internet.MimeBodyPart; ++import javax.mail.internet.MimeMessage; ++import javax.mail.internet.MimeMultipart; ++import javax.xml.soap.AttachmentPart; ++import javax.xml.soap.MessageFactory; ++import javax.xml.soap.SOAPException; ++import javax.xml.soap.SOAPMessage; ++import java.io.ByteArrayOutputStream; ++import java.io.IOException; ++import java.util.Properties; ++ ++public class MailTest { ++ ++ String host = null; ++ String user = ""; ++ String password = null; ++ String from = null; ++ String to = null; ++ ++ public static void main(String[] args) { ++ MailTest t = new MailTest(); ++ ++ t.user = "somebody@somewhere.com"; ++ t.from = "somebody@somewhere.com"; ++ t.to = "somebody@somewhere.com"; ++ ++ t.user = "somebody@somewhere.com"; ++ t.password = "somepassword"; ++ t.host = "somehost"; ++ ++ t.sendMail(); //this works ++ ++ t.addSoapAttachement(); ++ t.sendMail(); //after addAttachmentPart to soapmessage it do not work ++ ++ // workaroundJAFSetup(); ++ // t.sendMail(); //after workaround works again ++ } ++ ++ void addSoapAttachement() { ++ try { ++ MessageFactory messageFactory = MessageFactory.newInstance(); ++ SOAPMessage message = messageFactory.createMessage(); ++ AttachmentPart a = message.createAttachmentPart(); ++ a.setContentType("binary/octet-stream"); ++ message.addAttachmentPart(a); ++ } catch (SOAPException e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ void sendMail() { ++ ++ try { ++ Properties props = new Properties(); ++ props.put("mail.smtp.host", host); ++ props.put("mail.smtp.auth", "true"); ++ ++ Session session = Session.getInstance(props); ++ session.setDebug(true); ++ ++ // Define message ++ MimeMessage message = new MimeMessage(session); ++ message.setFrom(new InternetAddress(from)); ++ message.addRecipients(Message.RecipientType.TO, to); ++ message.setSubject("this is a multipart test"); ++ ++ Multipart multipart = new MimeMultipart(); ++ ++ BodyPart messageBodyPart1 = new MimeBodyPart(); ++ messageBodyPart1.setText("please send also this Content\n ciao!"); ++ multipart.addBodyPart(messageBodyPart1); ++ ++ BodyPart messageBodyPart2 = new MimeBodyPart(); ++ messageBodyPart2.setContent("<b>please</b> send also this Content <br>ciao!", "text/html; charset=UTF-8"); ++ multipart.addBodyPart(messageBodyPart2); ++ ++ message.setContent(multipart); ++ ++ /* ++ Transport tr = session.getTransport("smtp"); ++ tr.connect(host,user, password); ++ tr.sendMessage(message,InternetAddress.parse(to)); ++ tr.close(); ++ */ ++ ++ ByteArrayOutputStream baos = new ByteArrayOutputStream(); ++ message.writeTo(baos); ++ String output = baos.toString(); ++ System.out.println("output = " + output); ++ if (output.contains("also this Content")) { ++ System.out.println("Test PASSED."); ++ } else { ++ System.out.println("Test FAILED, missing content."); ++ throw new IllegalStateException("Test FAILED, missing content."); ++ } ++ } catch (MessagingException ignored) { ++ } catch (IOException ignored) { ++ } ++ } ++ ++ // this is how the error can be worked around ... ++ static void workaroundJAFSetup() { ++ MailcapCommandMap mailMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); ++ mailMap.addMailcap("multipart/mixed;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); ++ } ++} +Binary file test/javax/xml/ws/8043129/javax.mail.jar has changed +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/xsanymixed/CopyingResponse.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++import org.somewhere.ws.EchoRequest; ++import org.somewhere.ws.EchoResponse; ++ ++public class CopyingResponse extends EchoResponse { ++ ++ public CopyingResponse() {} ++ ++ public CopyingResponse(EchoRequest request) { ++ content = request.getContent(); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/xsanymixed/ServiceImpl.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import org.somewhere.ws.EchoRequest; ++import org.somewhere.ws.EchoResponse; ++import org.somewhere.ws.TestPort; ++ ++import java.util.ArrayList; ++ ++import javax.jws.WebService; ++import javax.xml.namespace.QName; ++ ++ ++/** ++ * Simple Webservice implementation just copying xml part as is ++ * from incoming request into outgoing response ++ */ ++@WebService( ++ endpointInterface = "org.somewhere.ws.TestPort", ++ targetNamespace = "http://ws.somewhere.org/", ++ serviceName = "TestService", ++ portName = "TestPort") ++public class ServiceImpl implements TestPort { ++ ++ public static final QName PORT_NAME = new QName("http://ws.somewhere.org/", "TestPort"); ++ public static final QName SERVICE_NAME = new QName("http://ws.somewhere.org/", "TestService"); ++ ++ @Override ++ public EchoResponse echo(EchoRequest request) { ++ System.err.println( "request.getContent="+(ArrayList)(request.getContent())); ++ return new CopyingResponse(request); ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/xsanymixed/Test.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,197 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8036981 8038966 8051441 ++ * @summary the content of xs:any content:mixed should remain as is, ++ * no white space changes and no changes to namespace prefixes ++ * @run shell compile-wsdl.sh ++ * @run main/othervm Test ++ */ ++ ++import com.sun.net.httpserver.HttpServer; ++import java.io.IOException; ++import java.io.StringReader; ++import java.io.StringWriter; ++import java.net.InetSocketAddress; ++import java.net.URL; ++import java.nio.file.FileVisitResult; ++import static java.nio.file.FileVisitResult.CONTINUE; ++import java.nio.file.Files; ++import java.nio.file.Path; ++import java.nio.file.Paths; ++import java.nio.file.SimpleFileVisitor; ++import java.nio.file.attribute.BasicFileAttributes; ++import javax.xml.transform.Source; ++import javax.xml.transform.Transformer; ++import javax.xml.transform.TransformerException; ++import javax.xml.transform.TransformerFactory; ++import javax.xml.transform.stream.StreamResult; ++import javax.xml.transform.stream.StreamSource; ++import javax.xml.ws.Dispatch; ++import javax.xml.ws.Endpoint; ++import javax.xml.ws.Service; ++ ++public class Test { ++ ++ private static HttpServer httpServer; ++ private static Endpoint endpoint; ++ private static final String NL = System.getProperty("line.separator"); ++ ++ private static final String XS_ANY_MIXED_PART = ++ "<AppHdr xmlns=\"urn:head.001\">" + NL + ++ " <Fr>" + NL + NL + ++ "<FIId xmlns=\"urn:head.009\">" + NL + NL + ++ " any" + NL + ++ " white" + NL + ++ " space" + NL + NL + ++ " <FinInstnId>... and" + NL + NL + ++ " NO namespace prefixes!!!" + NL + NL + ++ " </FinInstnId>" + NL + NL + ++ " </FIId>" + NL + ++ "</Fr>" + NL + ++ "</AppHdr>"; ++ ++ private static final String XML_REQUEST = "<soap:Envelope " + ++ "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + ++ "xmlns:ws=\"http://ws.somewhere.org/\">" + ++ "<soap:Header/><soap:Body>" + ++ "<ws:echoRequest>" + NL + ++ XS_ANY_MIXED_PART + NL + ++ "</ws:echoRequest>" + ++ "</soap:Body></soap:Envelope>"; ++ ++ private static String deployWebservice() throws IOException { ++ // Manually create HttpServer here using ephemeral address for port ++ // so as to not end up with attempt to bind to an in-use port ++ httpServer = HttpServer.create(new InetSocketAddress(0), 0); ++ httpServer.start(); ++ ++ endpoint = Endpoint.create(new ServiceImpl()); ++ endpoint.publish(httpServer.createContext("/wservice")); ++ ++ String wsdlAddress = "http://localhost:" + httpServer.getAddress().getPort() + "/wservice?wsdl"; ++ log("address = " + wsdlAddress); ++ return wsdlAddress; ++ } ++ ++ private static void stopWebservice() { ++ if (endpoint != null && endpoint.isPublished()) { ++ endpoint.stop(); ++ } ++ if (httpServer != null) { ++ httpServer.stop(0); ++ } ++ } ++ ++ public static void main(String[] args) throws IOException, TransformerException { ++ ++ try { ++ String address = deployWebservice(); ++ Service service = Service.create(new URL(address), ServiceImpl.SERVICE_NAME); ++ ++ log( "PORT="+ServiceImpl.PORT_NAME+" service="+service); ++ Dispatch<Source> d = service.createDispatch(ServiceImpl.PORT_NAME, Source.class, Service.Mode.MESSAGE); ++ Source response = d.invoke(new StreamSource(new StringReader(XML_REQUEST))); ++ ++ log( "reponse="+response ); ++ String resultXml = toString(response); ++ ++ log("= request ======== \n"); ++ log(XML_REQUEST); ++ log("= result ========= \n"); ++ log(resultXml); ++ log("\n=================="); ++ ++ boolean xsAnyMixedPartSame = resultXml.contains(XS_ANY_MIXED_PART); ++ log("resultXml.contains(XS_ANY_PART) = " + xsAnyMixedPartSame); ++ if (!xsAnyMixedPartSame) { ++ fail("The xs:any content=mixed part is supposed to be same in request and response."); ++ throw new RuntimeException(); ++ } ++ ++ log("TEST PASSED"); ++ } finally { ++ stopWebservice(); ++ ++ // if you need to debug or explore wsdl generation result ++ // comment this line out: ++ deleteGeneratedFiles(); ++ } ++ } ++ ++ private static String toString(Source response) throws TransformerException, IOException { ++ TransformerFactory transformerFactory = TransformerFactory.newInstance(); ++ Transformer transformer = transformerFactory.newTransformer(); ++ StreamResult xmlOutput = new StreamResult(new StringWriter()); ++ transformer.transform(response, xmlOutput); ++ return xmlOutput.getWriter().toString(); ++ } ++ ++ private static void fail(String message) { ++ log("TEST FAILED."); ++ throw new RuntimeException(message); ++ } ++ ++ private static void log(String msg) { ++ System.out.println(msg); ++ } ++ ++ private static void deleteGeneratedFiles() { ++ Path p = Paths.get("..", "classes", "javax", "xml", "ws", "xsanymixed", "org"); ++ System.out.println("performing cleanup, deleting wsdl compilation result: " + p.toFile().getAbsolutePath()); ++ if (Files.exists(p)) { ++ try { ++ Files.walkFileTree(p, new SimpleFileVisitor<Path>() { ++ @Override ++ public FileVisitResult visitFile( ++ Path file, ++ BasicFileAttributes attrs) throws IOException { ++ ++ System.out.println("deleting file [" + file.toFile().getAbsoluteFile() + "]"); ++ Files.delete(file); ++ return CONTINUE; ++ } ++ ++ @Override ++ public FileVisitResult postVisitDirectory( ++ Path dir, ++ IOException exc) throws IOException { ++ ++ System.out.println("deleting dir [" + dir.toFile().getAbsoluteFile() + "]"); ++ if (exc == null) { ++ Files.delete(dir); ++ return CONTINUE; ++ } else { ++ throw exc; ++ } ++ } ++ }); ++ } catch (IOException ioe) { ++ ioe.printStackTrace(); ++ } ++ } ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,36 @@ ++#! /bin/sh ++ ++# ++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# This code is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License version 2 only, as ++# published by the Free Software Foundation. ++# ++# This code is distributed in the hope that it will be useful, but WITHOUT ++# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++# version 2 for more details (a copy is included in the LICENSE file that ++# accompanied this code). ++# ++# You should have received a copy of the GNU General Public License version ++# 2 along with this work; if not, write to the Free Software Foundation, ++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++# ++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++# or visit www.oracle.com if you need additional information or have any ++# questions. ++# ++ ++# ++ ++if [ "x$TESTJAVA" = x ]; then ++ TESTJAVA=$1; shift ++ TESTCLASSES=. ++fi ++ ++echo "compiling [test-service.wsdl] wsdl ..." ++$TESTJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl ++ ++echo "WSDL compiled. Main test class Test.java can be compiled now." +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/xsanymixed/service.wsdl Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,87 @@ ++<?xml version="1.0" encoding="UTF-8" standalone="no"?> ++<!-- ++ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ ++ This code is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License version 2 only, as ++ published by the Free Software Foundation. ++ ++ This code is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ version 2 for more details (a copy is included in the LICENSE file that ++ accompanied this code). ++ ++ You should have received a copy of the GNU General Public License version ++ 2 along with this work; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ or visit www.oracle.com if you need additional information or have any ++ questions. ++--> ++<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" ++ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" ++ xmlns:tns="http://ws.somewhere.org/" ++ xmlns:xsd="http://www.w3.org/2001/XMLSchema" ++ xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" ++ name="TestService" ++ targetNamespace="http://ws.somewhere.org/"> ++ ++ <types> ++ <xsd:schema targetNamespace="http://ws.somewhere.org/" version="1.0" ++ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.somewhere.org/"> ++ ++ <xsd:element type="tns:echoRequest" name="echoRequest"/> ++ <xsd:element type="tns:echoResponse" name="echoResponse"/> ++ ++ <xsd:complexType name="echoRequest" mixed="true"> ++ <xsd:sequence> ++ <xsd:any namespace="##any" processContents="skip" minOccurs="1" maxOccurs="10"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ ++ <xsd:complexType name="echoResponse" mixed="true"> ++ <xsd:sequence> ++ <xsd:any namespace="##any" processContents="skip" minOccurs="1" maxOccurs="10"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ </xsd:schema> ++ </types> ++ ++ <message name="echoRequest"> ++ <part element="tns:echoRequest" name="parameters"/> ++ </message> ++ <message name="echoResponse"> ++ <part element="tns:echoResponse" name="parameters"/> ++ </message> ++ ++ <portType name="TestPort"> ++ <operation name="echo"> ++ <input message="tns:echoRequest" wsam:Action="http://ws.somewhere.org/tester/echoRequest"/> ++ <output message="tns:echoResponse" wsam:Action="http://ws.somewhere.org/tester/echoResponse"/> ++ </operation> ++ </portType> ++ ++ <binding name="TestServicePortBinding" type="tns:TestPort"> ++ <soap:binding style="document" ++ transport="http://schemas.xmlsoap.org/soap/http"/> ++ ++ <operation name="echo"> ++ <soap:operation soapAction=""/> ++ <input> ++ <soap:body use="literal"/> ++ </input> ++ <output> ++ <soap:body use="literal"/> ++ </output> ++ </operation> ++ </binding> ++ ++ <service name="TestService"> ++ <port binding="tns:TestServicePortBinding" name="TestPort"> ++ <soap:address location="http://localhost/ws/tester"/> ++ </port> ++ </service> ++</definitions> +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/awt/AppContext/MultiThread/MultiThreadTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,100 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8019623 ++ * @summary Tests that AppContext.getAppContext() works correctly in multi-threads scenario. ++ * @author Leonid Romanov ++ */ ++ ++import sun.awt.AppContext; ++ ++public class MultiThreadTest { ++ private static final int NUM_THREADS = 2; ++ ++ private static AppContextGetter[] getters = new AppContextGetter[NUM_THREADS]; ++ ++ public static void main(String[] args) { ++ createAndStartThreads(); ++ compareAppContexts(); ++ } ++ ++ private static void createAndStartThreads() { ++ ThreadGroup systemGroup = getSystemThreadGroup(); ++ for (int i = 0; i < NUM_THREADS; ++i) { ++ ThreadGroup tg = new ThreadGroup(systemGroup, "AppContextGetter" + i); ++ getters[i] = new AppContextGetter(tg); ++ } ++ ++ for (int i = 0; i < NUM_THREADS; ++i) { ++ getters[i].start(); ++ } ++ ++ for (int i = 0; i < NUM_THREADS; ++i) { ++ try { ++ getters[i].join(); ++ } catch (InterruptedException e) { ++ // ignore ++ } ++ } ++ } ++ ++ private static ThreadGroup getSystemThreadGroup() { ++ ThreadGroup currentThreadGroup = ++ Thread.currentThread().getThreadGroup(); ++ ThreadGroup parentThreadGroup = currentThreadGroup.getParent(); ++ while (parentThreadGroup != null) { ++ currentThreadGroup = parentThreadGroup; ++ parentThreadGroup = currentThreadGroup.getParent(); ++ } ++ ++ return currentThreadGroup; ++ } ++ ++ private static void compareAppContexts() { ++ AppContext ctx = getters[0].getAppContext(); ++ for (int i = 1; i < NUM_THREADS; ++i) { ++ if (!ctx.equals(getters[i].getAppContext())) { ++ throw new RuntimeException("Unexpected AppContexts difference, could be a race condition"); ++ } ++ } ++ } ++ ++ private static class AppContextGetter extends Thread { ++ private AppContext appContext; ++ ++ public AppContextGetter(ThreadGroup tg) { ++ super(tg, tg.getName()); ++ } ++ ++ AppContext getAppContext() { ++ return appContext; ++ } ++ ++ @Override ++ public void run() { ++ appContext = AppContext.getAppContext(); ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/awt/dnd/8024061/bug8024061.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,357 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ * @bug 8024061 ++ * @summary Checks that no exception is thrown if dragGestureRecognized ++ * takes a while to complete. ++ */ ++import sun.awt.OSInfo; ++import sun.awt.OSInfo.OSType; ++import sun.awt.SunToolkit; ++ ++import java.awt.*; ++import java.awt.datatransfer.DataFlavor; ++import java.awt.datatransfer.Transferable; ++import java.awt.datatransfer.UnsupportedFlavorException; ++import java.awt.dnd.DnDConstants; ++import java.awt.dnd.DragGestureEvent; ++import java.awt.dnd.DragGestureListener; ++import java.awt.dnd.DragSource; ++import java.awt.dnd.DragSourceDragEvent; ++import java.awt.dnd.DragSourceDropEvent; ++import java.awt.dnd.DragSourceEvent; ++import java.awt.dnd.DragSourceListener; ++import java.awt.dnd.DropTarget; ++import java.awt.dnd.DropTargetDragEvent; ++import java.awt.dnd.DropTargetDropEvent; ++import java.awt.dnd.DropTargetEvent; ++import java.awt.dnd.DropTargetListener; ++import java.awt.event.InputEvent; ++ ++import java.io.IOException; ++import java.lang.reflect.InvocationTargetException; ++import java.util.concurrent.CountDownLatch; ++import java.util.concurrent.TimeUnit; ++ ++import javax.swing.*; ++ ++/** ++ * If dragGestureRecognized() takes a while to complete and if user performs a drag quickly, ++ * an exception is thrown from DropTargetListener.dragEnter when it calls ++ * DropTargetDragEvent.getTransferable(). ++ * <p> ++ * This class introduces a delay in dragGestureRecognized() to cause the exception. ++ */ ++public class bug8024061 { ++ private static final DataFlavor DropObjectFlavor; ++ private static final int DELAY = 1000; ++ ++ private final DnDPanel panel1 = new DnDPanel(Color.yellow); ++ private final DnDPanel panel2 = new DnDPanel(Color.pink); ++ private final JFrame frame; ++ ++ private static final CountDownLatch lock = new CountDownLatch(1); ++ private static volatile Exception dragEnterException = null; ++ ++ static { ++ DataFlavor flavor = null; ++ try { ++ flavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType); ++ } catch (ClassNotFoundException e) { ++ e.printStackTrace(); ++ } ++ DropObjectFlavor = flavor; ++ } ++ ++ bug8024061() { ++ frame = new JFrame("DnDWithRobot"); ++ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ++ ++ Dimension d = new Dimension(100, 100); ++ ++ panel1.setPreferredSize(d); ++ panel2.setPreferredSize(d); ++ ++ Container content = frame.getContentPane(); ++ content.setLayout(new GridLayout(1, 2, 5, 5)); ++ content.add(panel1); ++ content.add(panel2); ++ ++ frame.pack(); ++ ++ DropObject drop = new DropObject(); ++ drop.place(panel1, new Point(10, 10)); ++ frame.setVisible(true); ++ } ++ ++ public static void main(String[] args) throws AWTException, InvocationTargetException, InterruptedException { ++ OSType type = OSInfo.getOSType(); ++ if (type != OSType.LINUX && type != OSType.SOLARIS) { ++ System.out.println("This test is for Linux and Solaris only... " + ++ "skipping!"); ++ return; ++ } ++ ++ final bug8024061[] dnd = {null}; ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ dnd[0] = new bug8024061(); ++ } ++ }); ++ final Robot robot = new Robot(); ++ robot.setAutoDelay(10); ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.realSync(); ++ ++ JFrame frame = dnd[0].frame; ++ Point point = frame.getLocationOnScreen(); ++ Point here = new Point(point.x + 35, point.y + 45); ++ Point there = new Point(point.x + 120, point.y + 45); ++ here.x += 25; ++ robot.mouseMove(here.x, here.y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ while (here.x < there.x) { ++ here.x += 20; ++ robot.mouseMove(here.x, here.y); ++ System.out.println("x = " + here.x); ++ } ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ toolkit.realSync(); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ System.out.println("finished"); ++ ++ try { ++ if (lock.await(5, TimeUnit.SECONDS)) { ++ if (dragEnterException == null) { ++ System.out.println("Test passed."); ++ } else { ++ System.out.println("Test failed."); ++ dragEnterException.printStackTrace(); ++ throw new RuntimeException(dragEnterException); ++ } ++ } else { ++ System.out.println("Test failed. Timeout reached"); ++ throw new RuntimeException("Timed out waiting for dragEnter()"); ++ } ++ } finally { ++ frame.dispose(); ++ } ++ } ++ ++ class DropObject implements Transferable { ++ DnDPanel panel; ++ Color color = Color.CYAN; ++ int width = 50; ++ int height = 50; ++ int x; ++ int y; ++ ++ void draw(Graphics2D g) { ++ Color savedColor = g.getColor(); ++ g.setColor(color); ++ g.fillRect(x, y, width, height); ++ g.setColor(Color.lightGray); ++ g.drawRect(x, y, width, height); ++ g.setColor(savedColor); ++ } ++ ++ boolean contains(int x, int y) { ++ return (x > this.x && x < this.x + width) ++ && (y > this.y && y < this.y + height); ++ } ++ ++ @Override ++ public DataFlavor[] getTransferDataFlavors() { ++ return new DataFlavor[]{DropObjectFlavor}; ++ } ++ ++ void place(DnDPanel panel, Point location) { ++ if (panel != this.panel) { ++ x = location.x; ++ y = location.y; ++ if (this.panel != null) { ++ this.panel.setDropObject(null); ++ this.panel.repaint(); ++ } ++ this.panel = panel; ++ this.panel.setDropObject(this); ++ this.panel.repaint(); ++ } ++ } ++ ++ @Override ++ public boolean isDataFlavorSupported(DataFlavor flavor) { ++ return DropObjectFlavor.equals(flavor); ++ } ++ ++ @Override ++ public Object getTransferData(DataFlavor flavor) ++ throws UnsupportedFlavorException, IOException { ++ if (isDataFlavorSupported(flavor)) { ++ return this; ++ } else { ++ throw new UnsupportedFlavorException(flavor); ++ } ++ } ++ } ++ ++ class DnDPanel extends JPanel { ++ DropObject dropObject; ++ final DragSource dragSource; ++ final DropTarget dropTarget; ++ final Color color; ++ final DragGestureListener dgListener; ++ final DragSourceListener dsListener; ++ final DropTargetListener dtListener; ++ ++ DnDPanel(Color color) { ++ this.color = color; ++ this.dragSource = DragSource.getDefaultDragSource(); ++ dgListener = new DragGestureListener() { ++ @Override ++ public void dragGestureRecognized(DragGestureEvent dge) { ++ Point location = dge.getDragOrigin(); ++ if (dropObject != null && dropObject.contains(location.x, location.y)) { ++ dragSource.startDrag(dge, DragSource.DefaultCopyNoDrop, dropObject, dsListener); ++ try { ++ Thread.sleep(DELAY); ++ } catch (InterruptedException e) { ++ } ++ } ++ } ++ }; ++ ++ dsListener = new DragSourceListener() { ++ @Override ++ public void dragEnter(DragSourceDragEvent dsde) { ++ } ++ ++ @Override ++ public void dragOver(DragSourceDragEvent dsde) { ++ } ++ ++ @Override ++ public void dropActionChanged(DragSourceDragEvent dsde) { ++ } ++ ++ @Override ++ public void dragExit(DragSourceEvent dse) { ++ } ++ ++ @Override ++ public void dragDropEnd(DragSourceDropEvent dsde) { ++ } ++ }; ++ ++ dtListener = new DropTargetListener() { ++ @Override ++ public void dragEnter(DropTargetDragEvent dtde) { ++ if (dropObject != null) { ++ dtde.rejectDrag(); ++ return; ++ } ++ dtde.acceptDrag(DnDConstants.ACTION_MOVE); ++ try { ++ Transferable t = dtde.getTransferable(); ++ Object data = t.getTransferData(DropObjectFlavor); ++ if (data != null) { ++ throw new Exception("getTransferData returned non-null"); ++ } ++ } catch (Exception e) { ++ dragEnterException = e; ++ e.printStackTrace(); ++ } finally { ++ lock.countDown(); ++ } ++ } ++ ++ @Override ++ public void dragOver(DropTargetDragEvent dtde) { ++ if (dropObject != null) { ++ dtde.rejectDrag(); ++ return; ++ } ++ dtde.acceptDrag(DnDConstants.ACTION_MOVE); ++ } ++ ++ @Override ++ public void dropActionChanged(DropTargetDragEvent dtde) { ++ } ++ ++ @Override ++ public void dragExit(DropTargetEvent dte) { ++ } ++ ++ @Override ++ public void drop(DropTargetDropEvent dtde) { ++ if (dropObject != null) { ++ dtde.rejectDrop(); ++ return; ++ } ++ try { ++ dtde.acceptDrop(DnDConstants.ACTION_MOVE); ++ Transferable t = dtde.getTransferable(); ++ DropObject dropObject = (DropObject) t.getTransferData(DropObjectFlavor); ++ Point location = dtde.getLocation(); ++ dropObject.place(DnDPanel.this, location); ++ dtde.dropComplete(true); ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ ++ } ++ }; ++ ++ dragSource.createDefaultDragGestureRecognizer(this, ++ DnDConstants.ACTION_MOVE, dgListener); ++ ++ dropTarget = new DropTarget(this, DnDConstants.ACTION_MOVE, dtListener, true); ++ ++ } ++ ++ public void paintComponent(Graphics g) { ++ super.paintComponent(g); ++ Color savedColor = g.getColor(); ++ g.setColor(color); ++ g.fillRect(0, 0, getWidth(), getHeight()); ++ g.setColor(savedColor); ++ if (dropObject != null) { ++ dropObject.draw((Graphics2D) g); ++ } ++ } ++ ++ void setDropObject(DropObject dropObject) { ++ this.dropObject = dropObject; ++ } ++ ++ DropObject findDropObject(int x, int y) { ++ if (dropObject != null && dropObject.contains(x, y)) { ++ return dropObject; ++ } ++ return null; ++ } ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/java2d/DrawXORModeTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,110 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8036022 ++ * @summary Test verifies that drawing shapes with XOR composite ++ * does not trigger an InternalError in GDI surface data. ++ * @run main/othervm -Dsun.java2d.d3d=True DrawXORModeTest ++ */ ++import java.awt.BasicStroke; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Stroke; ++import java.awt.geom.Line2D; ++import java.util.concurrent.CountDownLatch; ++ ++public class DrawXORModeTest extends Component { ++ ++ public static void main(String[] args) { ++ final DrawXORModeTest c = new DrawXORModeTest(); ++ ++ final Frame f = new Frame("XOR mode test"); ++ f.add(c); ++ f.pack(); ++ ++ f.setVisible(true); ++ ++ try { ++ c.checkResult(); ++ } finally { ++ f.dispose(); ++ } ++ } ++ ++ @Override ++ public void paint(Graphics g) { ++ if (g == null || !(g instanceof Graphics2D)) { ++ return; ++ } ++ g.setColor(Color.white); ++ g.setXORMode(Color.black); ++ Graphics2D dg = (Graphics2D) g; ++ Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, ++ BasicStroke.JOIN_MITER, ++ 10.0f, ++ new float[]{1.0f, 1.0f}, ++ 0.0f); ++ dg.setStroke(stroke); ++ try { ++ dg.draw(new Line2D.Float(10, 10, 20, 20)); ++ } catch (Throwable e) { ++ synchronized (this) { ++ theError = e; ++ } ++ } finally { ++ didDraw.countDown(); ++ } ++ } ++ ++ @Override ++ public Dimension getPreferredSize() { ++ return new Dimension(400, 100); ++ } ++ ++ public void checkResult() { ++ try { ++ didDraw.await(); ++ } catch (InterruptedException e) { ++ } ++ ++ synchronized (this) { ++ if (theError != null) { ++ System.out.println("Error: " + theError); ++ ++ throw new RuntimeException("Test FAILED."); ++ } ++ } ++ System.out.println("Test PASSED."); ++ ++ } ++ ++ private Throwable theError = null; ++ ++ private final CountDownLatch didDraw = new CountDownLatch(1); ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/java2d/OpenGL/DrawHugeImageTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++/* ++ * @test ++ * @bug 8040617 ++ * @summary Test verifies that an attempt to get an accelerated copy of ++ * a huge buffered image does not result in an OOME. ++ * ++ * @run main DrawHugeImageTest ++ */ ++ ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsEnvironment; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++ ++public class DrawHugeImageTest { ++ // we have to render the BI source several times in order ++ // to get an accelerated copy to be used. ++ static { ++ System.setProperty("sun.java2d.accthreshold", "1"); ++ } ++ private static final int max_rendering_count = 5; ++ ++ private static final Color srcColor = Color.red; ++ private static final Color dstColor = Color.blue; ++ ++ public static void main(String[] args) { ++ BufferedImage src = createSrc(); ++ ++ VolatileImage dst = createDst(); ++ System.out.println("Dst: " + dst); ++ boolean status; ++ int count = max_rendering_count; ++ ++ do { ++ System.out.println("render image: " + (max_rendering_count - count)); ++ status = render(src, dst); ++ ++ } while (status && count-- > 0); ++ ++ if (!status || count > 0) { ++ throw new RuntimeException("Test failed: " + count); ++ } ++ } ++ ++ private static boolean render(BufferedImage src, VolatileImage dst) { ++ int cnt = 5; ++ do { ++ Graphics2D g = dst.createGraphics(); ++ g.setColor(dstColor); ++ g.fillRect(0, 0, dst.getWidth(), dst.getHeight()); ++ g.drawImage(src, 0, 0, null); ++ g.dispose(); ++ } while (dst.contentsLost() && (--cnt > 0)); ++ ++ if (cnt == 0) { ++ System.err.println("Test failed: unable to render to volatile destination"); ++ return false; ++ } ++ ++ BufferedImage s = dst.getSnapshot(); ++ ++ return s.getRGB(1,1) == srcColor.getRGB(); ++ } ++ ++ private static BufferedImage createSrc() { ++ final int w = 20000; ++ final int h = 5; ++ ++ BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); ++ Graphics2D g = img.createGraphics(); ++ g.setColor(srcColor); ++ g.fillRect(0, 0, w, h); ++ g.dispose(); ++ ++ return img; ++ } ++ ++ private static VolatileImage createDst() { ++ GraphicsConfiguration gc = ++ GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); ++ ++ return gc.createCompatibleVolatileImage(200, 200); ++ } ++} +--- ./jdk/test/sun/net/ftp/FtpURL.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/net/ftp/FtpURL.java Mon Jan 05 11:57:27 2015 -0800 +@@ -483,7 +483,7 @@ + + // Now let's check the URL handler + +- url = new URL("ftp://user2:@localhost:" + port + "/%2Fusr/bin;type=d"); ++ url = new URL("ftp://user2@localhost:" + port + "/%2Fusr/bin;type=d"); + con = url.openConnection(); + in = new BufferedReader(new InputStreamReader(con.getInputStream())); + do { +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/net/www/http/HttpClient/B8025710.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,409 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.*; ++import java.net.*; ++import java.security.*; ++import java.security.cert.X509Certificate; ++import java.util.ArrayList; ++import java.util.concurrent.atomic.AtomicBoolean; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++import javax.net.ServerSocketFactory; ++import javax.net.SocketFactory; ++import javax.net.ssl.*; ++ ++/** ++ * @test ++ * @bug 8025710 ++ * @summary Proxied https connection reuse by HttpClient can send CONNECT to the server ++ */ ++public class B8025710 { ++ ++ private final static AtomicBoolean connectInServer = new AtomicBoolean(); ++ private static final String keystorefile = ++ System.getProperty("test.src", "./") ++ + "/../../../../../sun/security/ssl/etc/keystore"; ++ private static final String passphrase = "passphrase"; ++ ++ public static void main(String[] args) throws Exception { ++ new B8025710().runTest(); ++ ++ if (connectInServer.get()) ++ throw new RuntimeException("TEST FAILED: server got proxy header"); ++ else ++ System.out.println("TEST PASSED"); ++ } ++ ++ private void runTest() throws Exception { ++ ProxyServer proxyServer = new ProxyServer(); ++ HttpServer httpServer = new HttpServer(); ++ httpServer.start(); ++ proxyServer.start(); ++ ++ URL url = new URL("https", InetAddress.getLocalHost().getHostName(), ++ httpServer.getPort(), "/"); ++ ++ Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyServer.getAddress()); ++ ++ HttpsURLConnection.setDefaultSSLSocketFactory(createTestSSLSocketFactory()); ++ ++ // Make two connections. The bug occurs when the second request is made ++ for (int i = 0; i < 2; i++) { ++ System.out.println("Client: Requesting " + url.toExternalForm() ++ + " via " + proxy.toString() ++ + " (attempt " + (i + 1) + " of 2)"); ++ ++ HttpsURLConnection connection = ++ (HttpsURLConnection) url.openConnection(proxy); ++ ++ connection.setRequestMethod("POST"); ++ connection.setDoInput(true); ++ connection.setDoOutput(true); ++ connection.setRequestProperty("User-Agent", "Test/1.0"); ++ connection.getOutputStream().write("Hello, world!".getBytes("UTF-8")); ++ ++ if (connection.getResponseCode() != 200) { ++ System.err.println("Client: Unexpected response code " ++ + connection.getResponseCode()); ++ break; ++ } ++ ++ String response = readLine(connection.getInputStream()); ++ if (!"Hi!".equals(response)) { ++ System.err.println("Client: Unexpected response body: " ++ + response); ++ } ++ } ++ httpServer.close(); ++ proxyServer.close(); ++ httpServer.join(); ++ proxyServer.join(); ++ } ++ ++ class ProxyServer extends Thread implements Closeable { ++ ++ private final ServerSocket proxySocket; ++ private final Pattern connectLinePattern = ++ Pattern.compile("^CONNECT ([^: ]+):([0-9]+) HTTP/[0-9.]+$"); ++ private final String PROXY_RESPONSE = ++ "HTTP/1.0 200 Connection Established\r\n" ++ + "Proxy-Agent: TestProxy/1.0\r\n" ++ + "\r\n"; ++ ++ ProxyServer() throws Exception { ++ super("ProxyServer Thread"); ++ ++ // Create the http proxy server socket ++ proxySocket = ServerSocketFactory.getDefault().createServerSocket(); ++ proxySocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0)); ++ } ++ ++ public SocketAddress getAddress() { return proxySocket.getLocalSocketAddress(); } ++ ++ @Override ++ public void close() throws IOException { ++ proxySocket.close(); ++ } ++ ++ @Override ++ public void run() { ++ ArrayList<Thread> threads = new ArrayList<>(); ++ int connectionCount = 0; ++ try { ++ while (connectionCount++ < 2) { ++ final Socket clientSocket = proxySocket.accept(); ++ final int proxyConnectionCount = connectionCount; ++ System.out.println("Proxy: NEW CONNECTION " ++ + proxyConnectionCount); ++ ++ Thread t = new Thread("ProxySocket" + proxyConnectionCount) { ++ @Override ++ public void run() { ++ try { ++ String firstLine = ++ readHeader(clientSocket.getInputStream()); ++ ++ Matcher connectLineMatcher = ++ connectLinePattern.matcher(firstLine); ++ if (!connectLineMatcher.matches()) { ++ System.out.println("Proxy: Unexpected" ++ + " request to the proxy: " ++ + firstLine); ++ return; ++ } ++ ++ String host = connectLineMatcher.group(1); ++ String portStr = connectLineMatcher.group(2); ++ int port = Integer.parseInt(portStr); ++ ++ Socket serverSocket = SocketFactory.getDefault() ++ .createSocket(host, port); ++ ++ clientSocket.getOutputStream() ++ .write(PROXY_RESPONSE.getBytes("UTF-8")); ++ ++ ProxyTunnel copyToClient = ++ new ProxyTunnel(serverSocket, clientSocket); ++ ProxyTunnel copyToServer = ++ new ProxyTunnel(clientSocket, serverSocket); ++ ++ copyToClient.start(); ++ copyToServer.start(); ++ ++ copyToClient.join(); ++ // here copyToClient.close() would not provoke the ++ // bug ( since it would trigger the retry logic in ++ // HttpURLConnction.writeRequests ), so close only ++ // the output to get the connection in this state. ++ clientSocket.shutdownOutput(); ++ ++ try { ++ Thread.sleep(3000); ++ } catch (InterruptedException ignored) { } ++ ++ // now close all connections to finish the test ++ copyToServer.close(); ++ copyToClient.close(); ++ } catch (IOException | NumberFormatException ++ | InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } ++ }; ++ threads.add(t); ++ t.start(); ++ } ++ for (Thread t: threads) ++ t.join(); ++ } catch (IOException | InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } ++ } ++ ++ /** ++ * This inner class provides unidirectional data flow through the sockets ++ * by continuously copying bytes from the input socket onto the output ++ * socket, until both sockets are open and EOF has not been received. ++ */ ++ class ProxyTunnel extends Thread { ++ private final Socket sockIn; ++ private final Socket sockOut; ++ private final InputStream input; ++ private final OutputStream output; ++ ++ public ProxyTunnel(Socket sockIn, Socket sockOut) throws IOException { ++ super("ProxyTunnel"); ++ this.sockIn = sockIn; ++ this.sockOut = sockOut; ++ input = sockIn.getInputStream(); ++ output = sockOut.getOutputStream(); ++ } ++ ++ public void run() { ++ byte[] buf = new byte[8192]; ++ int bytesRead; ++ ++ try { ++ while ((bytesRead = input.read(buf)) >= 0) { ++ output.write(buf, 0, bytesRead); ++ output.flush(); ++ } ++ } catch (IOException ignored) { ++ close(); ++ } ++ } ++ ++ public void close() { ++ try { ++ if (!sockIn.isClosed()) ++ sockIn.close(); ++ if (!sockOut.isClosed()) ++ sockOut.close(); ++ } catch (IOException ignored) { } ++ } ++ } ++ ++ /** ++ * the server thread ++ */ ++ class HttpServer extends Thread implements Closeable { ++ ++ private final ServerSocket serverSocket; ++ private final SSLSocketFactory sslSocketFactory; ++ private final String serverResponse = ++ "HTTP/1.1 200 OK\r\n" ++ + "Content-Type: text/plain\r\n" ++ + "Content-Length: 3\r\n" ++ + "\r\n" ++ + "Hi!"; ++ private int connectionCount = 0; ++ ++ HttpServer() throws Exception { ++ super("HttpServer Thread"); ++ ++ KeyStore ks = KeyStore.getInstance("JKS"); ++ ks.load(new FileInputStream(keystorefile), passphrase.toCharArray()); ++ KeyManagerFactory factory = KeyManagerFactory.getInstance("SunX509"); ++ factory.init(ks, passphrase.toCharArray()); ++ SSLContext ctx = SSLContext.getInstance("TLS"); ++ ctx.init(factory.getKeyManagers(), null, null); ++ ++ sslSocketFactory = ctx.getSocketFactory(); ++ ++ // Create the server that the test wants to connect to via the proxy ++ serverSocket = ServerSocketFactory.getDefault().createServerSocket(); ++ serverSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0)); ++ } ++ ++ public int getPort() { return serverSocket.getLocalPort(); } ++ ++ @Override ++ public void close() throws IOException { serverSocket.close(); } ++ ++ @Override ++ public void run() { ++ try { ++ while (connectionCount++ < 2) { ++ Socket socket = serverSocket.accept(); ++ System.out.println("Server: NEW CONNECTION " ++ + connectionCount); ++ ++ SSLSocket sslSocket = (SSLSocket) sslSocketFactory ++ .createSocket(socket,null, getPort(), false); ++ sslSocket.setUseClientMode(false); ++ sslSocket.startHandshake(); ++ ++ String firstLine = readHeader(sslSocket.getInputStream()); ++ if (firstLine != null && firstLine.contains("CONNECT")) { ++ System.out.println("Server: BUG! HTTP CONNECT" ++ + " encountered: " + firstLine); ++ connectInServer.set(true); ++ } ++ ++ // write the success response, the request body is not read. ++ // close only output and keep input open. ++ OutputStream out = sslSocket.getOutputStream(); ++ out.write(serverResponse.getBytes("UTF-8")); ++ socket.shutdownOutput(); ++ } ++ } catch (IOException e) { ++ e.printStackTrace(); ++ } ++ } ++ } ++ ++ /** ++ * read the header and return only the first line. ++ * ++ * @param inputStream the stream to read from ++ * @return the first line of the stream ++ * @throws IOException if reading failed ++ */ ++ private static String readHeader(InputStream inputStream) ++ throws IOException { ++ String line; ++ String firstLine = null; ++ while ((line = readLine(inputStream)) != null && line.length() > 0) { ++ if (firstLine == null) { ++ firstLine = line; ++ } ++ } ++ ++ return firstLine; ++ } ++ ++ /** ++ * read a line from stream. ++ * ++ * @param inputStream the stream to read from ++ * @return the line ++ * @throws IOException if reading failed ++ */ ++ private static String readLine(InputStream inputStream) ++ throws IOException { ++ final StringBuilder line = new StringBuilder(); ++ int ch; ++ while ((ch = inputStream.read()) != -1) { ++ if (ch == '\r') { ++ continue; ++ } ++ ++ if (ch == '\n') { ++ break; ++ } ++ ++ line.append((char) ch); ++ } ++ ++ return line.toString(); ++ } ++ ++ private SSLSocketFactory createTestSSLSocketFactory() { ++ ++ HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { ++ @Override ++ public boolean verify(String hostname, SSLSession sslSession) { ++ // ignore the cert's CN; it's not important to this test ++ return true; ++ } ++ }); ++ ++ // Set up the socket factory to use a trust manager that trusts all ++ // certs, since trust validation isn't important to this test ++ final TrustManager[] trustAllCertChains = new TrustManager[] { ++ new X509TrustManager() { ++ @Override ++ public X509Certificate[] getAcceptedIssuers() { ++ return null; ++ } ++ ++ @Override ++ public void checkClientTrusted(X509Certificate[] certs, ++ String authType) { ++ } ++ ++ @Override ++ public void checkServerTrusted(X509Certificate[] certs, ++ String authType) { ++ } ++ } ++ }; ++ ++ final SSLContext sc; ++ try { ++ sc = SSLContext.getInstance("TLS"); ++ } catch (NoSuchAlgorithmException e) { ++ throw new RuntimeException(e); ++ } ++ ++ try { ++ sc.init(null, trustAllCertChains, new java.security.SecureRandom()); ++ } catch (KeyManagementException e) { ++ throw new RuntimeException(e); ++ } ++ ++ return sc.getSocketFactory(); ++ } ++} +--- ./jdk/test/sun/net/www/protocol/jar/jarbug/run.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/net/www/protocol/jar/jarbug/run.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -34,14 +34,17 @@ + SunOS | Linux | Darwin ) + PS=":" + FS="/" ++ CHMOD="${FS}bin${FS}chmod" + ;; + Windows* ) + PS=";" + FS="\\" ++ CHMOD="chmod" + ;; + CYGWIN* ) + PS=";" + FS="/" ++ CHMOD="chmod" + # + # javac does not like /cygdrive produced by `pwd`. + # +@@ -59,6 +62,7 @@ + mkdir -p ${DEST}${FS}jar1 + cd ${TESTSRC}${FS}etc${FS}jar1 + cp -r . ${DEST}${FS}jar1 ++${CHMOD} -R u+w ${DEST}${FS}jar1 + ${TESTJAVA}${FS}bin${FS}javac -d ${DEST}${FS}jar1 \ + ${TESTSRC}${FS}src${FS}jar1${FS}LoadResourceBundle.java + ${TESTJAVA}${FS}bin${FS}javac -d ${DEST}${FS}jar1 \ +--- ./jdk/test/sun/security/ec/TestEC.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ec/TestEC.java Mon Jan 05 11:57:27 2015 -0800 +@@ -30,7 +30,7 @@ + * @library ../pkcs11/sslecc + * @library ../../../java/security/testlibrary + * @compile -XDignore.symbol.file TestEC.java +- * @run main TestEC ++ * @run main/othervm TestEC + */ + + import java.security.Provider; +@@ -53,6 +53,10 @@ + public class TestEC { + + public static void main(String[] args) throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); ++ + ProvidersSnapshot snapshot = ProvidersSnapshot.create(); + try { + main0(args); +--- ./jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java Mon Jan 05 11:57:27 2015 -0800 +@@ -28,6 +28,7 @@ + * @author Andreas Sterbenz + * @library .. + * @library ../../../../java/security/testlibrary ++ * @run main/othervm ClientJSSEServerJSSE + */ + + import java.security.*; +@@ -37,6 +38,10 @@ + private static String[] cmdArgs; + + public static void main(String[] args) throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); ++ + cmdArgs = args; + main(new ClientJSSEServerJSSE()); + } +--- ./jdk/test/sun/security/pkcs12/PKCS12SameKeyId.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/pkcs12/PKCS12SameKeyId.java Mon Jan 05 11:57:27 2015 -0800 +@@ -59,7 +59,7 @@ + for (int i=0; i<SIZE; i++) { + System.err.print("."); + String cmd = "-keystore " + JKSFILE +- + " -storepass changeit -keypass changeit " ++ + " -storepass changeit -keypass changeit -keyalg rsa " + + "-genkeypair -alias p" + i + " -dname CN=" + i; + KeyTool.main(cmd.split(" ")); + } +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/provider/certpath/PKIXCertPathValidator/Validity.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,134 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++ ++/** ++ * @test ++ * @bug 8021804 ++ * @summary CertPath should validate even if the validity period of the ++ * root cert does not include the validity period of a subordinate ++ * cert. ++ */ ++ ++import java.io.ByteArrayInputStream; ++import java.security.cert.*; ++import java.util.ArrayList; ++import java.util.Date; ++import java.util.HashSet; ++import java.util.Set; ++ ++public class Validity { ++ ++ /* ++ * Subject: OU=TestOrg, CN=TestCA ++ * Issuer: OU=TestOrg, CN=TestCA ++ * Validity ++ * Not Before: Feb 26 21:33:55 2014 GMT ++ Not After : Feb 26 21:33:55 2024 GMT ++ * Version 1 ++ */ ++ static String CACertStr = ++ "-----BEGIN CERTIFICATE-----\n" + ++ "MIIBvTCCASYCCQCQRiTo4lBCFjANBgkqhkiG9w0BAQUFADAjMRAwDgYDVQQLDAdU\n" + ++ "ZXN0T3JnMQ8wDQYDVQQDDAZUZXN0Q0EwHhcNMTQwMjI2MjEzMzU1WhcNMjQwMjI2\n" + ++ "MjEzMzU1WjAjMRAwDgYDVQQLDAdUZXN0T3JnMQ8wDQYDVQQDDAZUZXN0Q0EwgZ8w\n" + ++ "DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOtKS4ZrsM3ansd61ZxitcrN0w184I+A\n" + ++ "z0kyrSP1eMtlam+cC2U91NpTz11FYV4XUfBhqqxaXW043AWTUer8pS90Pt4sCrUX\n" + ++ "COx1+QA1M3ZhbZ4sTM7XQ90JbGaBJ/sEza9mlQP7hQ2yQO/hATKbP6J5qvgG2sT2\n" + ++ "S2WYjEgwNwmFAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAQ/CXEpnx2WY4LJtv4jwE\n" + ++ "4jIVirur3pdzV5oBhPyqqHMsyhQBkukCfX7uD7L5wN1+xuM81DfANpIxlnUfybp5\n" + ++ "CpjcmktLpmyK4kJ6XnSd2blbLOIpsr9x6FqxPxpVDlyw/ySHYrIG/GZdsLHgmzGn\n" + ++ "B06jeYzH8OLf879VxAxSsPc=\n" + ++ "-----END CERTIFICATE-----"; ++ ++ /* ++ * Subject: OU=TestOrg, CN=TestEE0 ++ * Issuer: OU=TestOrg, CN=TestCA ++ * Validity ++ * Not Before: Feb 26 22:55:12 2014 GMT ++ * Not After : Feb 25 22:55:12 2025 GMT ++ * Version 1 ++ */ ++ static String EECertStr = ++ "-----BEGIN CERTIFICATE-----\n" + ++ "MIIBtjCCAR8CAQQwDQYJKoZIhvcNAQEFBQAwIzEQMA4GA1UECwwHVGVzdE9yZzEP\n" + ++ "MA0GA1UEAwwGVGVzdENBMB4XDTE0MDIyNjIyNTUxMloXDTI1MDIyNTIyNTUxMlow\n" + ++ "JDEQMA4GA1UECwwHVGVzdE9yZzEQMA4GA1UEAwwHVGVzdEVFMDCBnzANBgkqhkiG\n" + ++ "9w0BAQEFAAOBjQAwgYkCgYEAt8xz9W3ruCTHjSOtTX6cxsUZ0nRP6EavEfzgcOYh\n" + ++ "CXGA0gr+viSHq3c2vQBxiRny2hm5rLcqpPo+2OxZtw/ajxfyrV6d/r8YyQLBvyl3\n" + ++ "xdCZdOkG1DCM1oFAQDaSRt9wN5Zm5kyg7uMig5Y4L45fP9Yee4x6Xyh36qYbsR89\n" + ++ "rFMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQDZrPqSo08va1m9TOWOztTuWilGdjK/\n" + ++ "2Ed2WXg8utIpy6uAV+NaOYtHQ7ULQBVRNmwg9nKghbVbh+E/xpoihjl1x7OXass4\n" + ++ "TbwXA5GKFIFpNtDvATQ/QQZoCuCzw1FW/mH0Q7UEQ/9/iJdDad6ebkapeMwtj/8B\n" + ++ "s2IZV7s85CEOXw==\n" + ++ "-----END CERTIFICATE-----"; ++ ++ public static void main(String[] args) throws Exception { ++ ++ String[] certStrs = {EECertStr}; ++ String[] trustedCertStrs = {CACertStr}; ++ runTest(certStrs, trustedCertStrs); ++ ++ System.out.println("Test passed."); ++ } ++ ++ private static void runTest(String[] certStrs, ++ String[] trustedCertStrs) ++ throws Exception { ++ ++ CertificateFactory cf = CertificateFactory.getInstance("X509"); ++ ++ // Generate the CertPath from the certs named in certStrs ++ ArrayList<X509Certificate> certs = new ArrayList<>(); ++ for (String certStr : certStrs) { ++ certs.add(generateCert(certStr, cf)); ++ } ++ CertPath cp = cf.generateCertPath(certs); ++ ++ // Generate the set of Trust Anchors from the certs named in ++ // trustedCertStrs ++ Set<TrustAnchor> trustAnchors = new HashSet<>(); ++ for (String trustedCertStr : trustedCertStrs) { ++ TrustAnchor ta = new TrustAnchor(generateCert(trustedCertStr, cf), ++ null); ++ trustAnchors.add(ta); ++ } ++ PKIXParameters params = new PKIXParameters(trustAnchors); ++ params.setDate(new Date(114, 3, 1)); // 2014-03-01 ++ params.setRevocationEnabled(false); ++ ++ // Attempt to validate the CertPath. If no exception thrown, successful. ++ CertPathValidator cpv = CertPathValidator.getInstance("PKIX"); ++ cpv.validate(cp, params); ++ System.out.println("CertPath validation successful."); ++ } ++ ++ private static X509Certificate generateCert(String certStr, ++ CertificateFactory cf) ++ throws Exception { ++ ByteArrayInputStream stream ++ = new ByteArrayInputStream(certStr.getBytes()); ++ return (X509Certificate) cf.generateCertificate(stream); ++ ++ } ++} +--- ./jdk/test/sun/security/smartcardio/TestAll.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/smartcardio/TestAll.java Mon Jan 05 11:57:27 2015 -0800 +@@ -40,6 +40,7 @@ + TestMultiplePresent.class, + TestPresent.class, + TestTransmit.class, ++ TestDirect.class, + }; + + public static void main(String[] args) throws Exception { +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/smartcardio/TestDirect.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8046343 ++ * @summary Make sure that direct protocol is available ++ * @run main/manual TestDirect ++ */ ++ ++// This test requires special hardware. ++ ++import javax.smartcardio.Card; ++import javax.smartcardio.CardTerminal; ++import javax.smartcardio.CardTerminals; ++import javax.smartcardio.TerminalFactory; ++ ++public class TestDirect { ++ public static void main(String[] args) throws Exception { ++ TerminalFactory terminalFactory = TerminalFactory.getDefault(); ++ CardTerminals cardTerminals = terminalFactory.terminals(); ++ CardTerminal cardTerminal = cardTerminals.list().get(0); ++ Card card = cardTerminal.connect("DIRECT"); ++ card.disconnect(true); ++ ++ System.out.println("OK."); ++ } ++} +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ProtocolVersion/HttpsProtocols.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ProtocolVersion/HttpsProtocols.java Mon Jan 05 11:57:27 2015 -0800 +@@ -32,6 +32,7 @@ + import java.io.*; + import java.net.*; + import javax.net.ssl.*; ++import java.security.Security; + + public class HttpsProtocols implements HostnameVerifier { + +@@ -177,6 +178,10 @@ + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); ++ + String keyFilename = + System.getProperty("test.src", "./") + "/" + pathToStores + + "/" + keyStoreFile; +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/DelegatedTaskWrongException.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/DelegatedTaskWrongException.java Mon Jan 05 11:57:27 2015 -0800 +@@ -25,7 +25,7 @@ + * @test + * @bug 4969459 + * @summary Delegated tasks are not reflecting the subclasses of SSLException +- * ++ * @run main/othervm DelegatedTaskWrongException + */ + + import javax.net.ssl.*; +@@ -110,6 +110,9 @@ + } + + public static void main(String args[]) throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); + + DelegatedTaskWrongException test; + +--- ./jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/testEnabledProtocols.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/testEnabledProtocols.java Mon Jan 05 11:57:27 2015 -0800 +@@ -122,6 +122,10 @@ + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); ++ + String keyFilename = + System.getProperty("test.src", "./") + "/" + pathToStores + + "/" + keyStoreFile; +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOldOrder.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,236 @@ ++/* ++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 7174244 8043200 8050158 ++ * @summary NPE in Krb5ProxyImpl.getServerKeys() ++ * ++ * SunJSSE does not support dynamic system properties, no way to re-use ++ * system properties in samevm/agentvm mode. ++ * @run main/othervm -Djdk.tls.preserveRC4CipherSuites=true CipherSuitesInOldOrder ++ */ ++ ++import java.util.*; ++import javax.net.ssl.*; ++ ++public class CipherSuitesInOldOrder { ++ ++ // supported ciphersuites ++ private final static List<String> supportedCipherSuites = ++ Arrays.<String>asList( ++ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", ++ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", ++ "TLS_RSA_WITH_AES_256_CBC_SHA256", ++ "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", ++ "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", ++ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", ++ "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", ++ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", ++ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", ++ "TLS_RSA_WITH_AES_256_CBC_SHA", ++ "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", ++ "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", ++ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", ++ "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", ++ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", ++ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", ++ "TLS_RSA_WITH_AES_128_CBC_SHA256", ++ "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", ++ "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", ++ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", ++ "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", ++ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", ++ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", ++ "TLS_RSA_WITH_AES_128_CBC_SHA", ++ "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", ++ "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", ++ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", ++ "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", ++ "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ "TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ "SSL_RSA_WITH_RC4_128_SHA", ++ "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ "TLS_ECDH_RSA_WITH_RC4_128_SHA", ++ "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", ++ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", ++ "SSL_RSA_WITH_3DES_EDE_CBC_SHA", ++ "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", ++ "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", ++ "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", ++ "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", ++ "SSL_RSA_WITH_RC4_128_MD5", ++ ++ "TLS_EMPTY_RENEGOTIATION_INFO_SCSV", ++ ++ "TLS_DH_anon_WITH_AES_256_CBC_SHA256", ++ "TLS_ECDH_anon_WITH_AES_256_CBC_SHA", ++ "TLS_DH_anon_WITH_AES_256_CBC_SHA", ++ "TLS_DH_anon_WITH_AES_128_CBC_SHA256", ++ "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", ++ "TLS_DH_anon_WITH_AES_128_CBC_SHA", ++ "TLS_ECDH_anon_WITH_RC4_128_SHA", ++ "SSL_DH_anon_WITH_RC4_128_MD5", ++ "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ "TLS_RSA_WITH_NULL_SHA256", ++ "TLS_ECDHE_ECDSA_WITH_NULL_SHA", ++ "TLS_ECDHE_RSA_WITH_NULL_SHA", ++ "SSL_RSA_WITH_NULL_SHA", ++ "TLS_ECDH_ECDSA_WITH_NULL_SHA", ++ "TLS_ECDH_RSA_WITH_NULL_SHA", ++ "TLS_ECDH_anon_WITH_NULL_SHA", ++ "SSL_RSA_WITH_NULL_MD5", ++ "SSL_RSA_WITH_DES_CBC_SHA", ++ "SSL_DHE_RSA_WITH_DES_CBC_SHA", ++ "SSL_DHE_DSS_WITH_DES_CBC_SHA", ++ "SSL_DH_anon_WITH_DES_CBC_SHA", ++ "SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", ++ "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ "TLS_KRB5_WITH_RC4_128_SHA", ++ "TLS_KRB5_WITH_RC4_128_MD5", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", ++ "TLS_KRB5_WITH_DES_CBC_SHA", ++ "TLS_KRB5_WITH_DES_CBC_MD5", ++ "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", ++ "TLS_KRB5_EXPORT_WITH_RC4_40_MD5", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5" ++ ); ++ ++ private final static String[] protocols = { ++ "", "SSL", "TLS", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" ++ }; ++ ++ ++ public static void main(String[] args) throws Exception { ++ // show all of the supported cipher suites ++ showSuites(supportedCipherSuites.toArray(new String[0]), ++ "All supported cipher suites"); ++ ++ for (String protocol : protocols) { ++ System.out.println("//"); ++ System.out.println("// " + ++ "Testing for SSLContext of " + protocol); ++ System.out.println("//"); ++ checkForProtocols(protocol); ++ } ++ } ++ ++ public static void checkForProtocols(String protocol) throws Exception { ++ SSLContext context; ++ if (protocol.isEmpty()) { ++ context = SSLContext.getDefault(); ++ } else { ++ context = SSLContext.getInstance(protocol); ++ context.init(null, null, null); ++ } ++ ++ // check the order of default cipher suites of SSLContext ++ SSLParameters parameters = context.getDefaultSSLParameters(); ++ checkSuites(parameters.getCipherSuites(), ++ "Default cipher suites in SSLContext"); ++ ++ // check the order of supported cipher suites of SSLContext ++ parameters = context.getSupportedSSLParameters(); ++ checkSuites(parameters.getCipherSuites(), ++ "Supported cipher suites in SSLContext"); ++ ++ ++ // ++ // Check the cipher suites order of SSLEngine ++ // ++ SSLEngine engine = context.createSSLEngine(); ++ ++ // check the order of endabled cipher suites ++ String[] ciphers = engine.getEnabledCipherSuites(); ++ checkSuites(ciphers, ++ "Enabled cipher suites in SSLEngine"); ++ ++ // check the order of supported cipher suites ++ ciphers = engine.getSupportedCipherSuites(); ++ checkSuites(ciphers, ++ "Supported cipher suites in SSLEngine"); ++ ++ // ++ // Check the cipher suites order of SSLSocket ++ // ++ SSLSocketFactory factory = context.getSocketFactory(); ++ try (SSLSocket socket = (SSLSocket)factory.createSocket()) { ++ ++ // check the order of endabled cipher suites ++ ciphers = socket.getEnabledCipherSuites(); ++ checkSuites(ciphers, ++ "Enabled cipher suites in SSLSocket"); ++ ++ // check the order of supported cipher suites ++ ciphers = socket.getSupportedCipherSuites(); ++ checkSuites(ciphers, ++ "Supported cipher suites in SSLSocket"); ++ } ++ ++ // ++ // Check the cipher suites order of SSLServerSocket ++ // ++ SSLServerSocketFactory serverFactory = context.getServerSocketFactory(); ++ try (SSLServerSocket serverSocket = ++ (SSLServerSocket)serverFactory.createServerSocket()) { ++ // check the order of endabled cipher suites ++ ciphers = serverSocket.getEnabledCipherSuites(); ++ checkSuites(ciphers, ++ "Enabled cipher suites in SSLServerSocket"); ++ ++ // check the order of supported cipher suites ++ ciphers = serverSocket.getSupportedCipherSuites(); ++ checkSuites(ciphers, ++ "Supported cipher suites in SSLServerSocket"); ++ } ++ } ++ ++ private static void checkSuites(String[] suites, String title) { ++ showSuites(suites, title); ++ ++ int loc = -1; ++ int index = 0; ++ for (String suite : suites) { ++ index = supportedCipherSuites.indexOf(suite); ++ if (index <= loc) { ++ throw new RuntimeException(suite + " is not in order"); ++ } ++ ++ loc = index; ++ } ++ } ++ ++ private static void showSuites(String[] suites, String title) { ++ System.out.println(title + "[" + suites.length + "]:"); ++ for (String suite : suites) { ++ System.out.println(" " + suite); ++ } ++ } ++} +--- ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOrder.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOrder.java Mon Jan 05 11:57:27 2015 -0800 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 7174244 ++ * @bug 7174244 8043200 + * @summary NPE in Krb5ProxyImpl.getServerKeys() + * + * SunJSSE does not support dynamic system properties, no way to re-use +@@ -67,11 +67,6 @@ + "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", +- "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", +- "TLS_ECDHE_RSA_WITH_RC4_128_SHA", +- "SSL_RSA_WITH_RC4_128_SHA", +- "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", +- "TLS_ECDH_RSA_WITH_RC4_128_SHA", + "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", + "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_RSA_WITH_3DES_EDE_CBC_SHA", +@@ -79,6 +74,11 @@ + "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", ++ "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ "TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ "SSL_RSA_WITH_RC4_128_SHA", ++ "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ "TLS_ECDH_RSA_WITH_RC4_128_SHA", + "SSL_RSA_WITH_RC4_128_MD5", + + "TLS_EMPTY_RENEGOTIATION_INFO_SCSV", +@@ -89,18 +89,10 @@ + "TLS_DH_anon_WITH_AES_128_CBC_SHA256", + "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", + "TLS_DH_anon_WITH_AES_128_CBC_SHA", ++ "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", + "TLS_ECDH_anon_WITH_RC4_128_SHA", + "SSL_DH_anon_WITH_RC4_128_MD5", +- "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", +- "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", +- "TLS_RSA_WITH_NULL_SHA256", +- "TLS_ECDHE_ECDSA_WITH_NULL_SHA", +- "TLS_ECDHE_RSA_WITH_NULL_SHA", +- "SSL_RSA_WITH_NULL_SHA", +- "TLS_ECDH_ECDSA_WITH_NULL_SHA", +- "TLS_ECDH_RSA_WITH_NULL_SHA", +- "TLS_ECDH_anon_WITH_NULL_SHA", +- "SSL_RSA_WITH_NULL_MD5", + "SSL_RSA_WITH_DES_CBC_SHA", + "SSL_DHE_RSA_WITH_DES_CBC_SHA", + "SSL_DHE_DSS_WITH_DES_CBC_SHA", +@@ -111,16 +103,24 @@ + "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", + "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", + "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ "TLS_RSA_WITH_NULL_SHA256", ++ "TLS_ECDHE_ECDSA_WITH_NULL_SHA", ++ "TLS_ECDHE_RSA_WITH_NULL_SHA", ++ "SSL_RSA_WITH_NULL_SHA", ++ "TLS_ECDH_ECDSA_WITH_NULL_SHA", ++ "TLS_ECDH_RSA_WITH_NULL_SHA", ++ "TLS_ECDH_anon_WITH_NULL_SHA", ++ "SSL_RSA_WITH_NULL_MD5", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", + "TLS_KRB5_WITH_RC4_128_SHA", + "TLS_KRB5_WITH_RC4_128_MD5", +- "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", +- "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", + "TLS_KRB5_WITH_DES_CBC_SHA", + "TLS_KRB5_WITH_DES_CBC_MD5", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", + "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", +- "TLS_KRB5_EXPORT_WITH_RC4_40_MD5", +- "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", +- "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5" ++ "TLS_KRB5_EXPORT_WITH_RC4_40_MD5" + ); + + private final static String[] protocols = { +--- ./jdk/test/sun/security/ssl/sanity/interop/CipherTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sanity/interop/CipherTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -394,6 +394,10 @@ + + public static void main(PeerFactory peerFactory, String[] args) + throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); ++ + long time = System.currentTimeMillis(); + String relPath; + if ((args != null) && (args.length > 0) && args[0].equals("sh")) { +--- ./jdk/test/sun/security/ssl/sanity/interop/ClientJSSEServerJSSE.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sanity/interop/ClientJSSEServerJSSE.java Mon Jan 05 11:57:27 2015 -0800 +@@ -29,9 +29,15 @@ + * @run main/othervm/timeout=300 ClientJSSEServerJSSE + */ + ++import java.security.Security; ++ + public class ClientJSSEServerJSSE { + + public static void main(String[] args) throws Exception { ++ // reset the security property to make sure that the algorithms ++ // and keys used in this test are not disabled. ++ Security.setProperty("jdk.tls.disabledAlgorithms", ""); ++ + CipherTest.main(new JSSEFactory(), args); + } + +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/tools/jarsigner/TimestampAlg.java Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,156 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8049480 ++ * @summary Current versions of Java can't verify jars signed and timestamped with Java 9 ++ */ ++ ++import java.io.InputStream; ++import java.nio.file.Files; ++import java.nio.file.Paths; ++import java.util.jar.JarEntry; ++import java.util.jar.JarFile; ++ ++public class TimestampAlg { ++ ++ public static void main(String[] args) throws Exception { ++ // This is a very simple jar file signed by JDK 9 with a timestamp ++ // using the SHA-256 message digest algorithm. ++ String var = ++ "504b0304140008080800c28ee844000000000000000000000000140000004d45" + ++ "54412d494e462f4d414e49464553542e4d4615cd4d0b82301c80f1fb60df61c7" + ++ "42666a9928749846f4aa8924745cf9d716b6c59c48df3ebd3e87df73e152d4d0" + ++ "195a82ee849211716d07a344033750d1f83785d076e830b8be1fb80e15d28096" + ++ "bca535ef4c058fbe21b34cf3670b2451faab3437a333c708a3947f20220ca362" + ++ "cfa8e7afe95634e32b22af821df2d6786d5ff637cf3abfe3f05e4190a42779b5" + ++ "76470532cbd56a798105db4cd01f504b07082c3740c69c000000a6000000504b" + ++ "0304140008080800c28ee8440000000000000000000000000f0000004d455441" + ++ "2d494e462f4f4c442e534675cf416f823018c6f13b09dfa1c7ed50575014493c" + ++ "80bae8a6a091383db6f082955a595b86ecd34fb3db92dd9ed32fff67c74b494d" + ++ "a300ef41697e9501727ac4b6768b10bbde10cf7809dae03595bcf81d5ce2d018" + ++ "c5596340072872bdecd02554f17c70f16fc730cfb4a8c6b0ad934fdfb6d0e854" + ++ "fbb794ecd52eeecbe5e45f394071bd9ef30c34131f87a3e956c561efb0938e56" + ++ "b7573d5c6cd3599bbe2ddd28acfafe9d992aa006721c758fe2718fe0b6753c6f" + ++ "e410cca50125a9c005d52607d694e82951341380a657555f1535f7a3cfb6655b" + ++ "31bd4080c2bf55016a98a8f2512948f7e5968dfbbe495fcca6383bdfe753a467" + ++ "90ca41a297861544cd270fe807504b0708521a35550201000048010000504b03" + ++ "04140008080800c28ee844000000000000000000000000100000004d4554412d" + ++ "494e462f4f4c442e52534185947b38d37d1fc7fdb61923530eb39e688622a77e" + ++ "5b666ab9939c9544c831ee39d42c9511e576d8c8b9876745b5743b5414268718" + ++ "b969548e95d61c2224b47423a648393d73dd5d4fe5b9afe7f9f3f3b9deefeff5" + ++ "bd3e9ff7e7053210ba708476bc55fc6719400292c340a8800cc4460800e06441" + ++ "1938c23bde0af083c22080b81828fd5d08e430200f4006a41664003772a01000" + ++ "028145a66e3cba6af9a601a44516246e1d2805873ac1a0f2d093545f70b3920c" + ++ "ce00248246e04ec20e02e8262a09200e6ff0adfc2f3d0350fbf149d12fa00c40" + ++ "564cd497823000406cb4ef6571fdec06c95a370fde860e89425861e16e0b19a1" + ++ "4c6c4f52d6102dd3a6bf45e740d9a0bed342ee5e832885fa1a979dc7e6161253" + ++ "4c2cda0362e5ec02ae440e44e80c56bffc4ab4f349f3b1f6bddae8c2979fca4b" + ++ "5e7e46ac2fa529481dd8d750a26dcd7d74deb8dde7fc70c072465af0a1e359af" + ++ "4cf4b1aaa14fc4238cee096ca3133575d52179a7e7da8990f6ed5da71ca84c37" + ++ "2d3117c356b1ac2cdde3c8600ead44f8878b2f8f10831f4d5d590a28d95b316c" + ++ "cf456277a83533e12ea42a14c8fc05da6b2483b74ab7c4e70a2dd60f417d2f97" + ++ "3359bb233e3d6b5ab60202e7bd7b4fd7f228febd1f0403b0c62f4190b69264bf" + ++ "72426589ab516d00040a880137b0200654114d4d050943c11490e82d88b38ecd" + ++ "26a42c027cd749ffe67955e7d9357b81aece4e877d49ee62b8afeed7a755fa9e" + ++ "786d6edc5d7e5ae3603e5d6e39d0cbc74300c35eb354282842a183159763c67a" + ++ "35b0b1ac1929e7b8ad510da5aa454d5eb3034cf11d27f594326384873f7c8949" + ++ "1a7f4a3cfccb892faf873c621292bd597072cdcd732d1ee7490e611ec28c90f9" + ++ "81bbd71ef0e4b50c4e93869c9af8c9d3d154169bbf8dff7aa706ebac1f6d2589" + ++ "8078532a9867e31d7f576365bc0c6c132fb7719b58d88ebcf438715768aea361" + ++ "f7017f614acfaf465e6d794b84e317b2937d66a8f5cea13666d541cce02705a8" + ++ "cef2d6d2f69b96ac88fec9998228a7c1d96d09c315b29797ecda02250dc7383a" + ++ "6f2bf75b0f17d48c07afa48c640d3478dd3ad18963c0712003ae27ca3a885a9b" + ++ "bcef71fef1027e8e228c01885dede0446717674996f8f413f59a5c3f91a001c0" + ++ "b632f78891424ce58a58df39727a6cc492ea4c94d5f23f6ad1276561d6eb057f" + ++ "befab3e5baff5dec50224a891fb49c29ab6cd6cab3f7731d097fc3d65e949b33" + ++ "b7a578f0b379e47a98c0a91b5fb0ce685952a78afc5cfa0e373df4a035c15132" + ++ "bb62a6387ad8caaadab680b8a169805e49b69e5ad8409de9b7079b6def2af45a" + ++ "dada5e7cdee4b5359892d1803dfc765dd18849fd0bf44b64866ed654fc117ea6" + ++ "5e6b1922eff99b73f0c77257e994d307defc9a29cedd1ac7be68a626d6edf96e" + ++ "c692bdf22ee792369dd535a0dfa7d711396996f692895df223eaaa5f47414f45" + ++ "b2c3b39d65772575c5cf4a437319b00990011b834b7f1b0c623d048963c07a44" + ++ "4dfe4f60813d12b5b87f0b16ea0f6e0096e30973075d454238d411260ee2d6a8" + ++ "61aa68a6bb3119ab837aaa39abd612eab39f9da4665c977e0cff019201a19384" + ++ "d3222b5a160ffe07340620c10d220998e65d3431411e13916b4e44ae191143fa" + ++ "be91cb1605ff6d2db96470d220e2af3c40f6ed5d032ee2cfe022bafd240fa1fd" + ++ "5f6e3567dd9071543e381b57bdd80cb1575a376abcc947495167e61e6e32a1ae" + ++ "93d416c8bc197b6bda347e6bcc6553839ed0a78d7ac28d57f2f7f8cd857d14e4" + ++ "497caa1cd34e1829aa7574aa3984ad39934e765598bdf0356c31a8f5c4a316d6" + ++ "c6beedf3add584c5769a6901a7836d3b32e3a03c58c739a6969e0260a002f463" + ++ "2773e84174c7faa41086e0d5d0ceaefc4df5a443d4e8af8a462dd67181ce11be" + ++ "a6ef64ce907252a0d0e6f03ef467e6763c244c48574856017d294607d3f87d5b" + ++ "0eb9eba2c60dc6c70dddfb837914babf172574ef99a4bb1e361353de4d95c576" + ++ "c494e1e9bce62d4fd08ad5e731691d1895636525bb79d76b2f1ce07d1604aa95" + ++ "8d9dfc8b5b6ee01110b3ca2d75181a44c528300ede3c612715c04d7baf786a18" + ++ "87b5f95861180fa256055b006005b67aa0923a70405c5c022af903f0187b3458" + ++ "748cc0bdfeac15adcb7029a17883d0f5ef80573caa61574bb66747bc61aae3ca" + ++ "0c3fe8bcd223d54fd7f5a2270843f9559a99f76aff45d965ba91374fa05a706f" + ++ "479416999389d4e29eb74a1984a30face935fd2118a580a3cd5a6567c2e21e92" + ++ "bb358c54822aaa049a8f47712889ee4507ae4ffd150ba50f444f99701c49fa97" + ++ "72edc44e69cfcda9cffc9f75c49fdb6b28b9699a2567289979dfd42664626232" + ++ "75b682be2baf3856623e37bb47c15e3e8e084771e4f3e7b53265efbc48e616cd" + ++ "ed18c4a546de3f5bd793857c9c7a99615161b7cdcca53fa1d4c119a33bb150a4" + ++ "6e4996450724eed76ae3d2dbc02f147228353241beba27e585a3dd556b8e5c2e" + ++ "5f4a3328fd214663223ec27d4fb134873a85630026a204ee5e059ee29a807f3f" + ++ "82ffcd3b2437cc1bf95a6813dec5195b38cd227002c6f5f53dcd1212f7182038" + ++ "9877b7ddf1ff2c0c65993b9524d3b41eca82ded2b951471c871b741fddd9fdc7" + ++ "70a79bb91c3d91f3a9aa8f880ec22099418c65654a7e3a25c4d8925e98e1e390" + ++ "1437e8767c9debf521e5c93ad5026ab8e5ef9696983ba6d0335e17de6ba65747" + ++ "91a0fb6ecdf20bde55874082a7f19b4332ddbba24d4eb98a9b0e55e4294f37be" + ++ "edd62a3e3ebccf8ded49f3a029fa76becf3389a386d2d62faca4f85cbb643489" + ++ "2e2abfd66dbe727f4fe28d8f8d551e0f8f4c8eda346c66d1bc6fa7a68eabdfb7" + ++ "0d0a34e65910bba73413ad8680dfaa473753ae9e2fd032d8f6cc66d19c57e679" + ++ "7fcc33cce8df504b0708267c480f1b08000030090000504b0304140008080800" + ++ "b78ee844000000000000000000000000090004004d4554412d494e462ffeca00" + ++ "000300504b0708000000000200000000000000504b0304140008080800b78ee8" + ++ "440000000000000000000000000100000041f3cb2fc9c8cc4be70200504b0708" + ++ "3c0a34d30a00000008000000504b01021400140008080800c28ee8442c3740c6" + ++ "9c000000a60000001400000000000000000000000000000000004d4554412d49" + ++ "4e462f4d414e49464553542e4d46504b01021400140008080800c28ee844521a" + ++ "355502010000480100000f00000000000000000000000000de0000004d455441" + ++ "2d494e462f4f4c442e5346504b01021400140008080800c28ee844267c480f1b" + ++ "0800003009000010000000000000000000000000001d0200004d4554412d494e" + ++ "462f4f4c442e525341504b01021400140008080800b78ee84400000000020000" + ++ "00000000000900040000000000000000000000760a00004d4554412d494e462f" + ++ "feca0000504b01021400140008080800b78ee8443c0a34d30a00000008000000" + ++ "0100000000000000000000000000b30a000041504b0506000000000500050027" + ++ "010000ec0a00000000"; ++ byte[] data = new byte[var.length()/2]; ++ for (int i=0; i<data.length; i++) { ++ data[i] = Integer.valueOf(var.substring(2*i,2*i+2), 16).byteValue(); ++ } ++ Files.write(Paths.get("x.jar"), data); ++ ++ try (JarFile jf = new JarFile("x.jar")) { ++ JarEntry je = jf.getJarEntry("A"); ++ try (InputStream is = jf.getInputStream(je)) { ++ is.read(new byte[10]); ++ } ++ if (je.getCertificates().length != 1) { ++ throw new Exception(); ++ } ++ } ++ } ++} +--- ./jdk/test/sun/security/tools/jarsigner/TimestampCheck.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/TimestampCheck.java Mon Jan 05 11:57:27 2015 -0800 +@@ -188,7 +188,7 @@ + DerOutputStream tstInfo2 = new DerOutputStream(); + tstInfo2.putOctetString(tstInfo.toByteArray()); + +- Signature sig = Signature.getInstance("SHA1withDSA"); ++ Signature sig = Signature.getInstance("SHA1withRSA"); + sig.initSign((PrivateKey)(ks.getKey( + alias, "changeit".toCharArray()))); + sig.update(tstInfo.toByteArray()); +@@ -205,7 +205,7 @@ + SignerInfo signerInfo = new SignerInfo( + new X500Name(signer.getIssuerX500Principal().getName()), + signer.getSerialNumber(), +- aid, AlgorithmId.get("DSA"), sig.sign()); ++ aid, AlgorithmId.get("RSA"), sig.sign()); + + SignerInfo[] signerInfos = {signerInfo}; + PKCS7 p7 = +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/tools/jarsigner/certpolicy.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -0,0 +1,79 @@ ++# ++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# This code is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License version 2 only, as ++# published by the Free Software Foundation. ++# ++# This code is distributed in the hope that it will be useful, but WITHOUT ++# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++# version 2 for more details (a copy is included in the LICENSE file that ++# accompanied this code). ++# ++# You should have received a copy of the GNU General Public License version ++# 2 along with this work; if not, write to the Free Software Foundation, ++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++# ++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++# or visit www.oracle.com if you need additional information or have any ++# questions. ++# ++ ++# @test ++# @bug 8036709 ++# @summary Java 7 jarsigner displays warning about cert policy tree ++# ++# @run shell certpolicy.sh ++# ++ ++if [ "${TESTJAVA}" = "" ] ; then ++ JAVAC_CMD=`which javac` ++ TESTJAVA=`dirname $JAVAC_CMD`/.. ++fi ++ ++KT="$TESTJAVA/bin/keytool $TESTTOOLVMOPTS \ ++ -keypass changeit -storepass changeit -keystore ks -keyalg rsa" ++JS="$TESTJAVA/bin/jarsigner $TESTTOOLVMOPTS -storepass changeit -keystore ks" ++JAR="$TESTJAVA/bin/jar $TESTTOOLVMOPTS" ++ ++rm ks 2> /dev/null ++$KT -genkeypair -alias ca -dname CN=CA -ext bc ++$KT -genkeypair -alias int -dname CN=Int ++$KT -genkeypair -alias ee -dname CN=EE ++ ++# CertificatePolicies [[PolicyId: [1.2.3]], [PolicyId: [1.2.4]]] ++# PolicyConstraints: [Require: 0; Inhibit: unspecified] ++$KT -certreq -alias int | \ ++ $KT -gencert -rfc -alias ca \ ++ -ext 2.5.29.32="30 0C 30 04 06 02 2A 03 30 04 06 02 2A 04" \ ++ -ext "2.5.29.36=30 03 80 01 00" -ext bc | \ ++ $KT -import -alias int ++ ++# CertificatePolicies [[PolicyId: [1.2.3]]] ++$KT -certreq -alias ee | \ ++ $KT -gencert -rfc -alias int \ ++ -ext 2.5.29.32="30 06 30 04 06 02 2A 03" | \ ++ $KT -import -alias ee ++ ++$KT -export -alias ee -rfc > cc ++$KT -export -alias int -rfc >> cc ++$KT -export -alias ca -rfc >> cc ++ ++$KT -delete -alias int ++ ++ERR='' ++$JAR cvf a.jar cc ++ ++# Make sure the certchain in the signed jar contains all 3 certs ++$JS -strict -certchain cc a.jar ee -debug || ERR="sign" ++$JS -strict -verify a.jar -debug || ERR="$ERR verify" ++ ++if [ "$ERR" = "" ]; then ++ echo "Success" ++ exit 0 ++else ++ echo "Failed: $ERR" ++ exit 1 ++fi +--- ./jdk/test/sun/security/tools/jarsigner/checkusage.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/checkusage.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -45,7 +45,7 @@ + ;; + esac + +-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit" ++KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keyalg rsa" + JAR=$TESTJAVA${FS}bin${FS}jar + JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner" + +--- ./jdk/test/sun/security/tools/jarsigner/crl.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/crl.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -45,7 +45,7 @@ + + KS=crl.jks + +-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS" ++KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS -keyalg rsa" + + rm $KS 2> /dev/null + +--- ./jdk/test/sun/security/tools/jarsigner/jvindex.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/jvindex.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -47,7 +47,7 @@ + JFILE=jvindex.jar + + KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit \ +- -keystore $KS" ++ -keystore $KS -keyalg rsa" + JAR=$TESTJAVA${FS}bin${FS}jar + JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner -keystore $KS -storepass changeit" + +--- ./jdk/test/sun/security/tools/jarsigner/newsize7.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/newsize7.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -51,7 +51,7 @@ + + KSFILE=ns7.jks + +-KT="${TESTJAVA}${FS}bin${FS}keytool -keystore ns7.jks -storepass changeit -keypass changeit" ++KT="${TESTJAVA}${FS}bin${FS}keytool -keystore ns7.jks -storepass changeit -keypass changeit -keyalg rsa" + JAR="${TESTJAVA}${FS}bin${FS}jar" + JS="${TESTJAVA}${FS}bin${FS}jarsigner -keystore ns7.jks -storepass changeit" + +--- ./jdk/test/sun/security/tools/jarsigner/onlymanifest.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/onlymanifest.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -46,7 +46,7 @@ + JFILE=onlymanifest.jar + + KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit \ +- -keystore $KS" ++ -keystore $KS -keyalg rsa" + JAR=$TESTJAVA${FS}bin${FS}jar + JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner + +--- ./jdk/test/sun/security/tools/jarsigner/passtype.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/passtype.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -45,7 +45,7 @@ + KS=pt.jks + JFILE=pt.jar + +-KT="$TESTJAVA${FS}bin${FS}keytool -keystore $KS -validity 300" ++KT="$TESTJAVA${FS}bin${FS}keytool -keystore $KS -validity 300 -keyalg rsa" + JAR=$TESTJAVA${FS}bin${FS}jar + JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner + +--- ./jdk/test/sun/security/tools/jarsigner/samename.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/samename.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -47,7 +47,7 @@ + KS=samename.jks + JFILE=em.jar + +-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS" ++KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS -keyalg rsa" + JAR=$TESTJAVA${FS}bin${FS}jar + JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner + +--- ./jdk/test/sun/security/tools/jarsigner/ts.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/ts.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -53,7 +53,7 @@ + JAR="${TESTJAVA}${FS}bin${FS}jar" + JAVA="${TESTJAVA}${FS}bin${FS}java" + JAVAC="${TESTJAVA}${FS}bin${FS}javac" +-KT="${TESTJAVA}${FS}bin${FS}keytool -keystore tsks -storepass changeit -keypass changeit -validity 200" ++KT="${TESTJAVA}${FS}bin${FS}keytool -keystore tsks -storepass changeit -keypass changeit -keyalg rsa -validity 200" + + rm tsks + echo Nothing > A +--- ./jdk/test/sun/security/tools/keytool/CloseFile.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/CloseFile.java Mon Jan 05 11:57:27 2015 -0800 +@@ -58,7 +58,7 @@ + } + + static void run(String s) throws Exception { +- KeyTool.main((s+" -debug").split(" ")); ++ KeyTool.main((s+" -debug -keyalg rsa").split(" ")); + } + static void remove(String filename, boolean check) { + new File(filename).delete(); +--- ./jdk/test/sun/security/tools/keytool/ListKeychainStore.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/ListKeychainStore.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -71,6 +71,7 @@ + -storetype PKCS12 \ + -keystore $TEMPORARY_P12 \ + -storepass $PWD \ ++ -keyalg rsa \ + -dname "CN=$i,OU=$i,O=$i,ST=$i,C=US" \ + -alias 7133495-$i + +--- ./jdk/test/sun/security/tools/keytool/StartDateTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/StartDateTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -48,7 +48,7 @@ + new File("jks").delete(); + + run("-keystore jks -storetype jks -storepass changeit -keypass changeit -alias me " + +- "-genkeypair -dname CN=Haha -startdate +1y"); ++ "-keyalg rsa -genkeypair -dname CN=Haha -startdate +1y"); + cal.setTime(getIssueDate()); + System.out.println(cal); + if (cal.get(Calendar.YEAR) != year + 1) { +--- ./jdk/test/sun/security/tools/keytool/emptysubject.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/emptysubject.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -45,7 +45,7 @@ + esac + + KS=emptysubject.jks +-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS" ++KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS -keyalg rsa" + + rm $KS + +--- ./jdk/test/sun/security/tools/keytool/importreadall.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/importreadall.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -49,7 +49,7 @@ + ;; + esac + +-KEYTOOL="${TESTJAVA}${FS}bin${FS}keytool -keystore importreadall.jks -storepass changeit -keypass changeit" ++KEYTOOL="${TESTJAVA}${FS}bin${FS}keytool -keystore importreadall.jks -storepass changeit -keypass changeit -keyalg rsa" + + # In case the test is run twice in the same directory + +--- ./jdk/test/sun/security/tools/keytool/readjar.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/readjar.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -45,7 +45,7 @@ + KS=readjar.jks + rm $KS + $TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS \ +- -alias x -dname CN=X -genkeypair ++ -keyalg rsa -alias x -dname CN=X -genkeypair + $TESTJAVA${FS}bin${FS}jar cvf readjar.jar $KS + $TESTJAVA${FS}bin${FS}jarsigner -storepass changeit -keystore $KS readjar.jar x + +--- ./jdk/test/sun/security/tools/keytool/selfissued.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/selfissued.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -45,7 +45,7 @@ + esac + + KS=selfsigned.jks +-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS" ++KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS -keyalg rsa" + + rm $KS + +--- ./jdk/test/sun/security/tools/keytool/trystore.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/trystore.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -43,7 +43,7 @@ + + rm trystore.jks 2> /dev/null + +-KEYTOOL="${TESTJAVA}${FS}bin${FS}keytool -storetype jks -keystore trystore.jks" ++KEYTOOL="${TESTJAVA}${FS}bin${FS}keytool -storetype jks -keystore trystore.jks -keyalg rsa" + $KEYTOOL -genkeypair -alias a -dname CN=A -storepass changeit -keypass changeit + $KEYTOOL -genkeypair -alias b -dname CN=B -storepass changeit -keypass changeit + +--- ./jdk/test/sun/security/validator/samedn.sh Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/security/validator/samedn.sh Mon Jan 05 11:57:27 2015 -0800 +@@ -47,7 +47,7 @@ + esac + + KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit \ +- -keypass changeit -keystore samedn.jks" ++ -keypass changeit -keystore samedn.jks -keyalg rsa" + JAVAC=$TESTJAVA${FS}bin${FS}javac + JAVA=$TESTJAVA${FS}bin${FS}java + +--- ./jdk/test/sun/text/resources/LocaleData Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/text/resources/LocaleData Mon Jan 05 11:57:27 2015 -0800 +@@ -574,7 +574,6 @@ + FormatData/es_PA/NumberElements/0=. + FormatData/es_PA/NumberElements/1=, + FormatData/es_PA/NumberElements/2=; +-CurrencyNames/es_PE/PEN=S/ + FormatData/es_PE/NumberPatterns/0=#,##0.###;-#,##0.### + # FormatData/es_PE/NumberPatterns/1=S/#,##0.00;S/-#,##0.00 # Changed; see bug 4122840 + FormatData/es_PE/NumberPatterns/2=#,##0% +@@ -7012,3 +7011,19 @@ + FormatData/sl/DateTimePatterns/4=EEEE, dd. MMMM y + FormatData/sl/DateTimePatterns/5=dd. MMMM y + ++# bug 7085757 ++CurrencyNames//SSP=SSP ++CurrencyNames//ssp=South Sudanese Pound ++CurrencyNames//xsu=Sucre ++CurrencyNames//xua=ADB Unit of Account ++LocaleNames//SS=South Sudan ++LocaleNames/en/SS=South Sudan ++ ++# bug 7028073 ++CurrencyNames/es_PE/PEN=S/. ++ ++# bug 7195759 ++CurrencyNames//ZMW=ZMW ++ ++# bug 8021121 ++CurrencyNames/lv_LV/EUR=\u20AC +--- ./jdk/test/sun/text/resources/LocaleDataTest.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/text/resources/LocaleDataTest.java Mon Jan 05 11:57:27 2015 -0800 +@@ -34,7 +34,7 @@ + * 6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611 + * 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787 + * 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7189611 +- * 7171028 8013836 ++ * 7171028 8013836 7028073 7195759 7085757 + * @summary Verify locale data + * + */ +--- ./jdk/test/sun/tools/jcmd/help_help.out Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/tools/jcmd/help_help.out Mon Jan 05 11:57:27 2015 -0800 +@@ -1,7 +1,7 @@ + help + For more information about a specific command use 'help <command>'. With no argument this will show a list of available commands. 'help all' will show help for all commands. + +-Impact: Low: ++Impact: Low + + Syntax : help [options] [<command name>] + +--- ./jdk/test/sun/util/resources/TimeZone/Bug6317929.java Mon Sep 08 12:16:34 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/Bug6317929.java Mon Jan 05 11:57:27 2015 -0800 +@@ -122,20 +122,20 @@ + TimeZone Currie = TimeZone.getTimeZone("Australia/Currie"); + tzLocale = locales2Test[0]; + if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals +- ("Eastern Standard Time (New South Wales)")) ++ ("Australian Eastern Standard Time (New South Wales)")) + throw new RuntimeException("\n" + tzLocale + ": LONG, " + + "non-daylight saving name for " + + "Australia/Currie should be " + +- "\"Eastern Standard Time " + ++ "\"Australian Eastern Standard Time " + + "(New South Wales)\""); + tzLocale = locales2Test[1]; + if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals +- ("Eastern Normalzeit (Neus\u00fcdwales)")) ++ ("\u00D6stliche Normalzeit (New South Wales)")) + throw new RuntimeException("\n" + tzLocale + ": LONG, " + + "non-daylight saving name for " + + "Australia/Currie should be " + +- "\"Eastern Normalzeit " + +- "(Neus\u00fcdwales)\""); ++ "\"\u00D6stliche Normalzeit " + ++ "(New South Wales)\""); + tzLocale = locales2Test[2]; + if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals + ("Hora est\u00e1ndar Oriental (Nueva Gales del Sur)")) +--- ./langtools/.hgtags Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/.hgtags Mon Jan 05 12:00:55 2015 -0800 +@@ -472,11 +472,19 @@ + 0f809f893588548a3b5c8441e28c9e0a62bc13ef jdk7u65-b18 + eae289997f58ef6396dc323c3d5b93a56fb43573 jdk7u65-b19 + afc940d62b49059f565f87c83343fa3d28df883b jdk7u65-b32 ++772aad4e9681828b8ee193b9ed971cbfe6c7f347 jdk7u80-b00 ++6c307a0b7a94e002d8a2532ffd8146d6c53f42d3 jdk7u80-b01 ++5bd6f3adf690dc2de8881b6f9f48336db4af7865 jdk7u80-b02 + 114c4fc53777e4067a26f6510fe72fa770a9253c jdk7u65-b20 + 8a09cca8f12027ba59df4bb18d49e855c4db4811 jdk7u67-b01 + eae289997f58ef6396dc323c3d5b93a56fb43573 jdk7u65-b40 + 5e4cc118e2d1f7a8eefca5dd7146d46a1b0ca911 jdk7u65-b31 + 59575d1928f98d1e26ea548ff4d5e2415dfe9b57 jdk7u65-b33 ++8a09cca8f12027ba59df4bb18d49e855c4db4811 jdk7u67-b01 ++e3b604d29f9177ac0c1344cdb7af8f5ccdc1db42 jdk7u67-b31 ++e6bf55d457016764b4dd785b61ae79a125ba869b jdk7u67-b32 ++624c54795faaf1a92bc1eb8c369dc18c1704c812 jdk7u67-b33 ++18077957a8b802d9ce8724856e8b5f3fcde38b9e jdk7u67-b34 + 684f0285b699d304d1efff487b550ff2e1679e98 jdk7u66-b00 + a927daae851fa81d0470d2b67f52e8156e4d423c jdk7u66-b01 + 6f229fda19bdabf7a3d1caad9d809dd713cce65d jdk7u66-b09 +@@ -502,3 +510,51 @@ + df957022bc94fc84c3d9e6f1f23af29b6afeb63d jdk7u71-b11 + a8fd0637a601ee2747e785bd5e9e2a0262acf280 jdk7u71-b12 + 1cefc4b498a60ebc86b76eb2e9e861dbb072bd85 jdk7u71-b13 ++6fe93bd5d4ac9d65a3f97cc16286ed2278150d7c jdk7u71-b14 ++5b207c2ea9d20c5de58a7a7e618cc9b86ac7fe76 jdk7u72-b01 ++1f1c94334f194aa980b7787fd5f2286405991e23 jdk7u72-b02 ++6e5faa9ed5f317369eacfedbf57fc0745c1e940b jdk7u72-b03 ++960f87b4d55681f19880385f9d11e227ea36f2df jdk7u72-b04 ++adf88de8b627ede9e8819d94b00ad9ec7eed3077 jdk7u72-b05 ++7efda07275d14dbd0fd96d304b7d682579cb6410 jdk7u72-b06 ++bfaa78bab4784c6bb494393dad0c330616cb7256 jdk7u72-b07 ++073486551f0c07f44c93e8dcdb31785a3f4526eb jdk7u72-b08 ++0e25c3ae773a27dba34ec05ea28dbcd44ea6f933 jdk7u72-b09 ++b63b6992ddd27688e276100be436bcf52e0525bc jdk7u72-b10 ++65c68241236ab792fe72119a0b4c29effd048904 jdk7u72-b11 ++cc58d9704b4017efe9ebe4391d73d82c0caf6d1c jdk7u72-b12 ++cade57461d3b90a59ec62c06d77068b1b73f05b2 jdk7u72-b13 ++6106b56a874e19e603660a09d506fe8afcde9e14 jdk7u72-b14 ++7a09f7596c8bb17d3b25b4506dd76425f6efb15e jdk7u72-b30 ++de0088aaf97fa861be8c17e97b57139287068c86 jdk7u72-b31 ++0138c5f55af0c700882deeac4411fbd9118b4d6e jdk7u75-b00 ++7ecfdbf693cfc14d648ebdf2cc87716068569e8d jdk7u75-b01 ++688a304d3215af8104336ecce50b7f4edfb88d36 jdk7u75-b02 ++105ad2d2417515b2b595c151e2a5d8ae0fe729eb jdk7u75-b03 ++bdbe862f8846558c83f8bc15518446ab0495a173 jdk7u75-b04 ++1895dc97d832950fe13a16428b797c952c9e4f4a jdk7u75-b05 ++5fcea7a0e4f1e3fa52bd6010e685098731966933 jdk7u75-b06 ++2e1c7e887c37dd702b2d09a00dacbafd79604e8c jdk7u75-b07 ++fe8e75540f0990c6ad9d060c2343ef896cb5bc19 jdk7u75-b08 ++512d77cd143798615266314c72c00ee32500661c jdk7u75-b09 ++d77d44ecfb980610de2c90446fab13910ed2c8d7 jdk7u75-b10 ++b5554ad39fa33c17033931a4ef5564a9b9d88f05 jdk7u75-b11 ++6f369f5322618b48225eebcde52ab9dfa552e286 jdk7u75-b12 ++7eb2663b7feb537ca765747e7bd0128245812c64 jdk7u75-b13 ++059a87205fda11b19d25ace75698a854aa8edbf3 jdk7u75-b30 ++591a7e4cabb5c5efc3ec65128181b38b1fa44a96 jdk7u75-b31 ++e77dbc24fcdb5c55f414459798e4c65ed75bf570 jdk7u76-b00 ++17aaafb2d1ecb6e2dac5e05cb3198703737e623a jdk7u76-b01 ++da47e39ce6680458be011936b89f0946b9587042 jdk7u76-b02 ++19a2140056ce1bfa3b6b332d168ad1208bfed1ae jdk7u76-b03 ++76969bec514e11903a321f556f38c3be4c2320cf jdk7u76-b04 ++ae19a85e5b3864b49b123f54b72de93d13722439 jdk7u76-b05 ++b981c087098c8c18f5d2632c02a680ef036217c4 jdk7u76-b06 ++b09339e2ca2ac75e5ca29e980eac2e7866e463aa jdk7u76-b07 ++23a0bb20d74919861201d0d73cd612cabfd8f1f2 jdk7u76-b08 ++853bb5d480cab85c9f9f67ff86f8cb95c31e4885 jdk7u76-b09 ++11ca0f4b0c56817f6ad302022e6414aa52582f16 jdk7u76-b10 ++63c1f23bddcfc45835f224376525ec621ac73a96 jdk7u76-b11 ++f0a6f4f62959a43e21d377436e3e60f6431ee5b4 jdk7u76-b12 ++d9e79541170f453dda964319f268fdad80dce9d7 jdk7u76-b13 ++24f0420bb212b05d572689bae8ec2d232b9ac5a0 jdk7u76-b30 +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Mon Jan 05 12:00:55 2015 -0800 +@@ -426,7 +426,7 @@ + head.addContent(headComment); + } + if (configuration.charset.length() > 0) { +- Content meta = HtmlTree.META("Content-Type", "text/html", ++ Content meta = HtmlTree.META("Content-Type", CONTENT_TYPE, + configuration.charset); + head.addContent(meta); + } +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java Mon Jan 05 12:00:55 2015 -0800 +@@ -35,7 +35,6 @@ + BORDER, + CELLPADDING, + CELLSPACING, +- CHARSET, + CLASS, + CLEAR, + COLS, +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java Mon Jan 05 12:00:55 2015 -0800 +@@ -44,6 +44,8 @@ + */ + public abstract class HtmlDocWriter extends HtmlWriter { + ++ public static final String CONTENT_TYPE = "text/html"; ++ + /** + * Constructor. Initializes the destination file name through the super + * class HtmlWriter. +@@ -330,7 +332,7 @@ + head.addContent(headComment); + } + if (configuration.charset.length() > 0) { +- Content meta = HtmlTree.META("Content-Type", "text/html", ++ Content meta = HtmlTree.META("Content-Type", CONTENT_TYPE, + configuration.charset); + head.addContent(meta); + } +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Mon Jan 05 12:00:55 2015 -0800 +@@ -471,9 +471,9 @@ + */ + public static HtmlTree META(String httpEquiv, String content, String charSet) { + HtmlTree htmltree = new HtmlTree(HtmlTag.META); ++ String contentCharset = content + "; charset=" + charSet; + htmltree.addAttr(HtmlAttr.HTTP_EQUIV, nullCheck(httpEquiv)); +- htmltree.addAttr(HtmlAttr.CONTENT, nullCheck(content)); +- htmltree.addAttr(HtmlAttr.CHARSET, nullCheck(charSet)); ++ htmltree.addAttr(HtmlAttr.CONTENT, contentCharset); + return htmltree; + } + +--- ./langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Mon Jan 05 12:00:55 2015 -0800 +@@ -1067,7 +1067,7 @@ + boolean testFirst) { + Env<GenContext> loopEnv = env.dup(loop, new GenContext()); + int startpc = code.entryPoint(); +- if (testFirst) { ++ if (testFirst) { //while or for loop + CondItem c; + if (cond != null) { + code.statBegin(cond.pos); +@@ -1097,6 +1097,9 @@ + code.resolve(c.falseJumps); + } + code.resolve(loopEnv.info.exit); ++ if (loopEnv.info.exit != null) { ++ loopEnv.info.exit.state.defined.excludeFrom(code.nextreg); ++ } + } + + public void visitForeachLoop(JCEnhancedForLoop tree) { +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Mon Jan 05 12:00:55 2015 -0800 +@@ -37,7 +37,7 @@ + javac.opt.Xbootclasspath.p=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306B\u4ED8\u52A0\u3059\u308B + javac.opt.Xbootclasspath.a=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306B\u8FFD\u52A0\u3059\u308B + javac.opt.endorseddirs=\u63A8\u5968\u898F\u683C\u30D1\u30B9\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B +-javac.opt.extdirs=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u307F\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B ++javac.opt.extdirs=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B + javac.opt.processorpath=\u6CE8\u91C8\u30D7\u30ED\u30BB\u30C3\u30B5\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3059\u308B + javac.opt.processor=\u5B9F\u884C\u3059\u308B\u6CE8\u91C8\u30D7\u30ED\u30BB\u30C3\u30B5\u306E\u540D\u524D\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u691C\u51FA\u51E6\u7406\u3092\u30D0\u30A4\u30D1\u30B9 + javac.opt.proc.none.only=\u6CE8\u91C8\u51E6\u7406\u3084\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002 +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/com/sun/javadoc/testCharset/TestCharset.java Mon Jan 05 12:00:55 2015 -0800 +@@ -0,0 +1,82 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 7052170 ++ * @summary Run a test on -charset to make sure the charset gets generated as a ++ * part of the meta tag. ++ * @author Bhavesh Patel ++ * @library ../lib/ ++ * @build JavadocTester TestCharset ++ * @run main TestCharset ++ */ ++ ++public class TestCharset extends JavadocTester { ++ ++ //Test information. ++ private static final String BUG_ID = "7052170"; ++ ++ //Javadoc arguments. ++ private static final String[] ARGS = new String[] { ++ "-d", BUG_ID, "-charset", "UTF-8", "-sourcepath", SRC_DIR, "pkg" ++ }; ++ ++ private static final String[][] TEST = { ++ {BUG_ID + FS + "index.html", ++ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"}, ++ {BUG_ID + FS + "pkg" + FS + "Foo.html", ++ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"} ++ }; ++ ++ private static final String[][] NEGATED_TEST = { ++ {BUG_ID + FS + "index.html", ++ "<meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"UTF-8\">"}, ++ {BUG_ID + FS + "pkg" + FS + "Foo.html", ++ "<meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"UTF-8\">"} ++ }; ++ ++ /** ++ * The entry point of the test. ++ * @param args the array of command line arguments. ++ */ ++ public static void main(String[] args) { ++ TestCharset tester = new TestCharset(); ++ run(tester, ARGS, TEST, NEGATED_TEST); ++ tester.printSummary(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String getBugId() { ++ return BUG_ID; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String getBugName() { ++ return getClass().getName(); ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/com/sun/javadoc/testCharset/pkg/Foo.java Mon Jan 05 12:00:55 2015 -0800 +@@ -0,0 +1,26 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package pkg; ++ ++public class Foo {} +--- ./langtools/test/tools/javac/ClassPathTest/ClassPathTest.sh Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/test/tools/javac/ClassPathTest/ClassPathTest.sh Mon Jan 05 12:00:55 2015 -0800 +@@ -56,11 +56,17 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin | CYGWIN* ) ++ SunOS | Linux | Darwin ) + FS="/" ++ CHMOD="${FS}bin${FS}chmod" + ;; + Windows* ) + FS="\\" ++ CHMOD="chmod" ++ ;; ++ CYGWIN* ) ++ FS="/" ++ CHMOD="chmod" + ;; + * ) + echo "Unrecognized system!" +@@ -73,6 +79,7 @@ + cleanup() { + rm -f *.class pkg${FS}*.class foo${FS}pkg${FS}*.class bar${FS}pkg${FS}*.class + cp -rf $TESTSRC${FS}* . ++ ${CHMOD} -R u+w * + } + + fail() { +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8050386/WrongStackframeGenerationTest1.java Mon Jan 05 12:00:55 2015 -0800 +@@ -0,0 +1,47 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8050386 ++ * @summary Verification error due to a bad stackmap frame generated by javac ++ */ ++ ++public class WrongStackframeGenerationTest1 { ++ public static void main(String[] args) {} ++ ++ static void foo(){ ++ while (true) { ++ int i = 0; ++ break; ++ } ++ switch (1) { ++ case 1: ++ int j = 0; ++ case 2: ++ bar(); ++ } ++ } ++ ++ static void bar() {} ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8050386/WrongStackframeGenerationTest2.java Mon Jan 05 12:00:55 2015 -0800 +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8050386 ++ * @summary Verification error due to a bad stackmap frame generated by javac ++ */ ++ ++public class WrongStackframeGenerationTest2 { ++ public static void main(String[] args) {} ++ ++ static void foo() { ++ int len; ++ for (;;) { ++ try { ++ len = 1; ++ break; ++ } catch (Exception e) { ++ } ++ } ++ ++ try { ++ if (len == -1) { ++ len = 0; ++ } ++ } finally { ++ } ++ } ++} +--- ./langtools/test/tools/javac/innerClassFile/Driver.sh Mon Sep 08 12:17:52 2014 -0700 ++++ ./langtools/test/tools/javac/innerClassFile/Driver.sh Mon Jan 05 12:00:55 2015 -0800 +@@ -71,3 +71,4 @@ + "${TESTJAVA}${FS}bin${FS}javac" ${TESTTOOLVMOPTS} -d . -classpath . -sourcepath src src/x/B.java src/x/C.java src/y/Main.java + rm y/R3.class + "${TESTJAVA}${FS}bin${FS}javac" ${TESTTOOLVMOPTS} -d . -classpath . -sourcepath src src/y/Main.java ++rm -fr src |