require java 7 needed for named groups in regexes; also fix semantics of 'T' separator and tidy date parsing
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0988b6d8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0988b6d8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0988b6d8 Branch: refs/heads/master Commit: 0988b6d8f58bea06fe81191eddba691140fde5f1 Parents: 30c3029 Author: Alex Heneveld <[email protected]> Authored: Mon Jun 8 09:36:46 2015 +0100 Committer: Alex Heneveld <[email protected]> Committed: Wed Jun 10 18:38:17 2015 +0100 ---------------------------------------------------------------------- docs/guide/ops/requirements.md | 5 +- pom.xml | 2 +- .../src/main/java/brooklyn/util/time/Time.java | 54 ++++++++++---------- .../test/java/brooklyn/util/time/TimeTest.java | 9 ++-- 4 files changed, 35 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0988b6d8/docs/guide/ops/requirements.md ---------------------------------------------------------------------- diff --git a/docs/guide/ops/requirements.md b/docs/guide/ops/requirements.md index 7830bc9..d0cf7fd 100644 --- a/docs/guide/ops/requirements.md +++ b/docs/guide/ops/requirements.md @@ -28,12 +28,9 @@ Brooklyn has also been tested on Ubuntu 12.04 and OS X. ## Software Requirements -Brooklyn requires Java (JRE or JDK) minimum version 6. The latest release of version 7 or 8 is recommended. +Brooklyn requires Java (JRE or JDK) minimum version 7. OpenJDK is recommended. Brooklyn has also been tested on IBM J9 and Oracle's JVM. -* check your `iptables` or other firewall service, making sure that incoming connections on port 8443 is not blocked -* check that the [linux kernel entropy](increase-entropy.html) is sufficient - ## Configuration Requirements http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0988b6d8/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 085e349..6e5bfb5 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ <properties> <!-- Compilation --> - <java.version>1.6</java.version> + <java.version>1.7</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0988b6d8/utils/common/src/main/java/brooklyn/util/time/Time.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/brooklyn/util/time/Time.java b/utils/common/src/main/java/brooklyn/util/time/Time.java index 8fa52cb..ea433a1 100644 --- a/utils/common/src/main/java/brooklyn/util/time/Time.java +++ b/utils/common/src/main/java/brooklyn/util/time/Time.java @@ -540,8 +540,7 @@ public class Time { private final static String COMMON_SEPARATORS = "-\\."; private final static String TIME_SEPARATOR = COMMON_SEPARATORS+":"; private final static String DATE_SEPARATOR = COMMON_SEPARATORS+"/ "; - private final static String TIME_ZONE_SEPARATOR = COMMON_SEPARATORS+":/ ,"; - private final static String DATE_TIME_SEPARATOR = TIME_ZONE_SEPARATOR+"T'"; + private final static String DATE_TIME_ANY_ORDER_GROUP_SEPARATOR = COMMON_SEPARATORS+":/ "; private final static String DATE_ONLY_WITH_INNER_SEPARATORS = namedGroup("year", DIGIT+DIGIT+DIGIT+DIGIT) @@ -589,12 +588,20 @@ public class Time { notMatching(MERIDIAN+options("$", anyChar("^"+LETTER))) // not AM or PM + anyChar(LETTER)+"+"+anyChar(LETTER+DIGIT+"\\/\\-\\' _")+"*"); private final static String TIME_ZONE_SIGNED_OFFSET = namedGroup("tz", options(namedGroup("tzOffset", options("\\+", "-")+ - DIGIT+optionally(DIGIT)+options("h", "H", "", optionally(":")+DIGIT+DIGIT)), + DIGIT+optionally(DIGIT)+optionally(optionally(":")+DIGIT+DIGIT)), optionally("\\+")+TZ_CODE)); - private final static String TIME_ZONE_OPTIONALLY_SIGNED_OFFSET = namedGroup("tz", options(namedGroup("tzOffset", options("\\+", "-", " ")+ - options(optionally(DIGIT)+DIGIT+options("h", "H"), options("0"+DIGIT, "10", "11", "12")+optionally(":")+DIGIT+DIGIT)), - TZ_CODE)); + private final static String TIME_ZONE_OPTIONALLY_SIGNED_OFFSET = namedGroup("tz", + options( + namedGroup("tzOffset", options("\\+", "-", " ")+ + options("0"+DIGIT, "10", "11", "12")+optionally(optionally(":")+DIGIT+DIGIT)), + TZ_CODE)); + private static String getDateTimeSeparatorPattern(String extraChars) { + return options(" +"+optionally(anyChar(DATE_TIME_ANY_ORDER_GROUP_SEPARATOR+extraChars+",")), + anyChar(DATE_TIME_ANY_ORDER_GROUP_SEPARATOR+extraChars+",")) + + anyChar(DATE_TIME_ANY_ORDER_GROUP_SEPARATOR+extraChars)+"*"; + } + @SuppressWarnings("deprecation") private static Maybe<Date> parseDateSimpleFlexibleFormatParser(String input) { input = input.trim(); @@ -611,11 +618,11 @@ public class Time { }; String[] TZ_PATTERNS = new String[] { // space then time zone with sign (+-) or code is preferred - " " + TIME_ZONE_SIGNED_OFFSET, + optionally(getDateTimeSeparatorPattern("")) + " " + TIME_ZONE_SIGNED_OFFSET, // then no TZ - but declare the named groups namedGroup("tz", namedGroup("tzOffset", "")+namedGroup("tzCode", "")), // then any separator then offset with sign - anyChar(TIME_ZONE_SEPARATOR)+"+" + TIME_ZONE_SIGNED_OFFSET, + getDateTimeSeparatorPattern("") + TIME_ZONE_SIGNED_OFFSET, // try parsing with enforced separators before TZ first // (so e.g. in the case of DATE-0100, the -0100 is the time, not the timezone) @@ -623,8 +630,8 @@ public class Time { // finally match DATE-TIME-1000 as time zone -1000 // or DATE-TIME 1000 as TZ +1000 in case a + was supplied but converted to ' ' by web - // (but be stricter about the format, 2h or 0200 required, and hours <= 12 so as not to confuse with a year) - anyChar(TIME_ZONE_SEPARATOR)+"*" + TIME_ZONE_OPTIONALLY_SIGNED_OFFSET + // (but be stricter about the format, two or four digits required, and hours <= 12 so as not to confuse with a year) + optionally(getDateTimeSeparatorPattern("")) + TIME_ZONE_OPTIONALLY_SIGNED_OFFSET }; List<String> basePatterns = MutableList.of(); @@ -632,28 +639,28 @@ public class Time { // patterns with date first String[] DATE_PATTERNS_UNCLOSED = new String[] { // separator before time *required* if date had separators - DATE_ONLY_WITH_INNER_SEPARATORS + "(,?"+(namedGroup("sep", anyChar(DATE_TIME_SEPARATOR)+"+")), + DATE_ONLY_WITH_INNER_SEPARATORS + "("+getDateTimeSeparatorPattern("T"), // separator before time optional if date did not have separators - DATE_ONLY_NO_SEPARATORS + "("+(namedGroup("sep", anyChar(DATE_TIME_SEPARATOR)+"*")), - // separator before time required if date had words, comma allowed but needs something else (e.g. space), 'T' for UTC not supported - DATE_WORDS_2 + "(,?"+anyChar(DATE_TIME_SEPARATOR)+"+"+namedGroup("sep",""), - DATE_WORDS_3 + "(,?"+anyChar(DATE_TIME_SEPARATOR)+"+"+namedGroup("sep",""), + DATE_ONLY_NO_SEPARATORS + "("+optionally(getDateTimeSeparatorPattern("T")), + // separator before time required if date has words + DATE_WORDS_2 + "("+getDateTimeSeparatorPattern("T"), + DATE_WORDS_3 + "("+getDateTimeSeparatorPattern("T"), }; for (String tzP: TZ_PATTERNS) for (String dateP: DATE_PATTERNS_UNCLOSED) for (String timeP: TIME_PATTERNS) basePatterns.add("^" + dateP + timeP+")?" + tzP + "$"); - // also allow time first, with TZ after, then before; separator needed but sep T for UTC not supported + // also allow time first, with TZ after, then before for (String tzP: TZ_PATTERNS) for (String dateP: DATE_PATTERNS) for (String timeP: TIME_PATTERNS) - basePatterns.add("^" + timeP + ",?"+anyChar(DATE_TIME_SEPARATOR)+"+" +namedGroup("sep","") + dateP + tzP + "$"); - // also allow time first, with TZ after, then before; separator needed but sep T for UTC not supported + basePatterns.add("^" + timeP + getDateTimeSeparatorPattern("") + dateP + tzP + "$"); + // also allow time first, with TZ after, then before for (String tzP: TZ_PATTERNS) for (String dateP: DATE_PATTERNS) for (String timeP: TIME_PATTERNS) - basePatterns.add("^" + timeP + tzP + ",?"+anyChar(DATE_TIME_SEPARATOR)+"+" +namedGroup("sep","") + dateP + "$"); + basePatterns.add("^" + timeP + tzP + getDateTimeSeparatorPattern("") + dateP + "$"); Maybe<Matcher> mm = Maybe.absent(); for (String p: basePatterns) { @@ -665,13 +672,6 @@ public class Time { Calendar result; String tz = m.group("tz"); - String sep = m.group("sep"); - if (sep!=null && sep.trim().equals("T")) { - if (Strings.isNonBlank(tz)) { - return Maybe.absent("Cannot use 'T' separator and specify time zone ("+tz+")"); - } - tz = "UTC"; - } int year = Integer.parseInt(m.group("year")); int day = Integer.parseInt(m.group("day")); @@ -701,7 +701,7 @@ public class Time { tzz = getTimeZone(tz); } if (tzz==null) { - Maybe<Matcher> tmm = match("^ ?(?<tzH>(\\+|\\-||)"+DIGIT+optionally(DIGIT)+")(h|H||"+optionally(":")+"(?<tzM>"+DIGIT+DIGIT+"))$", tz); + Maybe<Matcher> tmm = match("^ ?(?<tzH>(\\+|\\-||)"+DIGIT+optionally(DIGIT)+")"+optionally(optionally(":")+namedGroup("tzM", DIGIT+DIGIT))+"$", tz); if (tmm.isAbsent()) { return Maybe.absent("Unknown date format '"+input+"': invalid timezone '"+tz+"'; try 'yyyy-MM-dd HH:mm:ss.SSS +0000'"); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0988b6d8/utils/common/src/test/java/brooklyn/util/time/TimeTest.java ---------------------------------------------------------------------- diff --git a/utils/common/src/test/java/brooklyn/util/time/TimeTest.java b/utils/common/src/test/java/brooklyn/util/time/TimeTest.java index ae9f78e..774217e 100644 --- a/utils/common/src/test/java/brooklyn/util/time/TimeTest.java +++ b/utils/common/src/test/java/brooklyn/util/time/TimeTest.java @@ -213,6 +213,9 @@ public class TimeTest { } assertDatesParseToEqual("2015.6.4+0100", "2015-06-04-0000+0100"); assertDatesParseToEqual("20150604-+0100", "2015-06-04 +0100"); + assertDatesParseToEqual("20150604, +0100", "2015-06-04 +0100"); + assertDatesParseToEqual("201506040000, 0100", "2015-06-04 +0100"); + assertDatesParseToEqual("20150604 , 0000 , 0100", "2015-06-04 +0100"); assertDatesParseToEqual("2015-6-4 +0100", "2015-06-04-0000 +0100"); assertDatesParseToEqual("2015-6-4 -0100", "2015-06-04-0000 -0100"); assertDatesParseToEqual("20150604-0000//-0100", "2015-06-04 -0100"); @@ -239,8 +242,8 @@ public class TimeTest { // perverse, but accepted for the time being: Assert.assertEquals(Time.parseDate("2013-2-29").getTime(), Time.parseDate("2013-3-1").getTime()); - assertDatesParseToEqual("20150604T080012.345", "2015-06-04-080012.345+0000"); - assertDatesParseToEqual("20150604080012.345Z", "2015-06-04-080012.345+0000"); + assertDatesParseToEqual("20150604T080012.345", "2015-06-04-080012.345"); + assertDatesParseToEqual("20150604T080012.345Z", "2015-06-04-080012.345+0000"); // accept am and pm assertDatesParseToEqual("20150604 08:00:12.345a", "2015-06-04-080012.345"); @@ -284,7 +287,7 @@ public class TimeTest { if (integration) assertDatesParseToEqual("16 Dec 1 2015", "2015-12-01-1600"); if (integration) assertDatesParseToEqual("16:30 1067 Dec 1 1066", "1067-12-01-1630 +1066"); assertDatesParseToEqual("1040 1045 12 1", "1045-12-01-1040"); - assertDatesParseToEqual("1040 1045 12 1 +0h", "1045-12-01-1040Z"); + assertDatesParseToEqual("1040 1045 12 1 +0", "1045-12-01-1040Z"); if (integration) assertDatesParseToEqual("1045 Dec 1 1040", "1045-12-01-1040"); if (integration) assertDatesParseToEqual("10:40 Dec 1 1045", "1045-12-01-1040"); assertDatesParseToEqual("10.11-2020-12.01", "2020-12-01-1011");
