From bc5f6f6954dafe1d2102af923fa2ee491f654336 Mon Sep 17 00:00:00 2001 From: Stephen Colebourne Date: Sun, 12 Mar 2006 21:54:04 +0000 Subject: [PATCH] Remove direct dependency on commons-build Enhance website git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/lang/trunk@385373 13f79535-47bb-0310-9956-ffa450edef68 --- maven.xml | 17 - project.properties | 6 +- project.xml | 78 +++-- xdocs/building.xml | 68 ++++ xdocs/cvs-usage.xml | 44 +++ xdocs/index.xml | 96 +++--- xdocs/issue-tracking.xml | 61 ++++ xdocs/navigation.xml | 25 +- xdocs/style/project.css | 26 +- xdocs/upgradeto2_0.xml | 687 +++++++++++++++++++++++++++++++++++++++ xdocs/upgradeto2_1.xml | 162 +++++++++ 11 files changed, 1133 insertions(+), 137 deletions(-) create mode 100644 xdocs/building.xml create mode 100644 xdocs/cvs-usage.xml create mode 100644 xdocs/issue-tracking.xml create mode 100644 xdocs/upgradeto2_0.xml create mode 100644 xdocs/upgradeto2_1.xml diff --git a/maven.xml b/maven.xml index d431d0679..e82a224f6 100644 --- a/maven.xml +++ b/maven.xml @@ -16,23 +16,6 @@ limitations under the License. - - - - - - - - - - - - - - - - - diff --git a/project.properties b/project.properties index 4d3d01b9d..6e7ae10c3 100644 --- a/project.properties +++ b/project.properties @@ -1,5 +1,5 @@ # -# Copyright 2002-2005 The Apache Software Foundation. +# Copyright 2002-2006 The Apache Software Foundation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,9 +21,8 @@ maven.changelog.factory=org.apache.maven.svnlib.SvnChangeLogFactory maven.checkstyle.properties=checkstyle.xml maven.junit.fork=true -maven.xdoc.jsl=../commons-build/commons-site.jsl maven.xdoc.date=left -#maven.xdoc.version=${pom.currentVersion} +maven.xdoc.version=${pom.currentVersion} maven.xdoc.developmentProcessUrl=http://jakarta.apache.org/commons/charter.html maven.xdoc.poweredby.image=maven-feather.png @@ -40,6 +39,7 @@ maven.javadoc.overview=./src/java/org/apache/commons/lang/overview.html # This links to the current stable version. We could have LANG_CURRENT, but this # is simpler to manage at the moment. +maven.jdiff.new.tag=CURRENT maven.jdiff.old.tag=LANG_2_1 # Generate class files for specific VM version (e.g., 1.1 or 1.2). diff --git a/project.xml b/project.xml index 7b4b3b118..97b7f9e8b 100644 --- a/project.xml +++ b/project.xml @@ -1,6 +1,6 @@ - - junit - junit - 3.8.1 - - - maven-plugins - maven-cobertura-plugin - 1.1.1 - plugin - + + junit + junit + 3.8.1 + + test + Required only for testing. + + + + maven-plugins + maven-cobertura-plugin + 1.1.1 + http://maven-plugins.sourceforge.net/maven-cobertura-plugin/ + plugin + + test + Required only for generating test coverage reports. + + - - maven-checkstyle-plugin - maven-pmd-plugin - - maven-cobertura-plugin - - - maven-javadoc-plugin - - maven-junit-report-plugin - maven-jxr-plugin - maven-license-plugin - - - maven-tasklist-plugin + + + + + maven-checkstyle-plugin + maven-javadoc-plugin + maven-jdepend-plugin + maven-junit-report-plugin + maven-jxr-plugin + maven-license-plugin + maven-cobertura-plugin + maven-jdiff-plugin + maven-pmd-plugin + + diff --git a/xdocs/building.xml b/xdocs/building.xml new file mode 100644 index 000000000..1c3f8b068 --- /dev/null +++ b/xdocs/building.xml @@ -0,0 +1,68 @@ + + + + + Building + Commons Documentation Team + + + +
+

+ Commons Lang uses Maven or + Ant as a build system. +

+

+ You may also be interested in the upgrade notes:
+ Upgrade from 2.0 to 2.1
+ Upgrade from 1.0 to 2.0
+

+
+ +
+

+ To build a jar file, change into the root directory of Lang and run "maven jar". + The result will be in the "target" subdirectory. +

+

+ To build the Javadocs, run "maven javadoc". + The result will be in "target/docs/apidocs". +

+

+ To build the full website, run "maven site". + The result will be in "target/docs". + You must be online to successfully complete this target. +

+

+ Further details can be found in the + commons build instructions. +

+
+ +
+

+ To build a jar file, change into the root directory of Lang and run "ant jar". + The result will be in the "dist" subdirectory. +

+

+ To build the Javadocs, run "ant javadoc". + The result will be in "dist/docs/api". +

+
+ + +
diff --git a/xdocs/cvs-usage.xml b/xdocs/cvs-usage.xml new file mode 100644 index 000000000..676d8e0ba --- /dev/null +++ b/xdocs/cvs-usage.xml @@ -0,0 +1,44 @@ + + + + + Source repository + Commons Documentation Team + + + +
+

+ Jakarta Commons Lang is hosted on the Apache + subversion repository. +

+

+ The project URL is:
+ http://svn.apache.org/repos/asf/jakarta/commons/proper/lang/trunk +

+

+ The best way to view the repository is via the + subversion viewer. +

+

+ The alternative is to use the + native subversion display. +

+
+ + +
diff --git a/xdocs/index.xml b/xdocs/index.xml index 18596fee0..c6beaac06 100644 --- a/xdocs/index.xml +++ b/xdocs/index.xml @@ -1,6 +1,6 @@ - - - Commons + Home Commons Documentation Team - - - + +

@@ -40,62 +37,71 @@ supports multiple types of nested-Exceptions, basic enhancements to java.util.Da building methods, such as hashCode, toString and equals.

- -
-

The latest release of Apache Jakarta Commons Lang is version 2.1. It is available (from mirrors) in binary and source downloads. The release notes explain all of the changes and bugs that were fixed between 2.0 and 2.1. In addition, JDiff has been used to create a report on the differences between 2.0 and 2.1.

-
- +

-An alphabetical list of the packages may be found in the lang status document. +A getting started user guide is available +together with various project reports.

-

-The JavaDoc API documents are available online. -

-
- -
-

-Bugs may be reported via the Bugzilla Management system. The following links may prove useful: +The JavaDoc API documents are available online:

+

+The subversion repository can be +browsed. +

- +
- +

+The latest version is v2.1. - +Download now!
+The upgrade notes are also available.
+In addition there is a JDiff report on the differences between 2.0 and 2.1. +

+

+For previous releases, see the Apache Archive +

- -
- + +
+

+The commons mailing lists act as the main support forum. +The user list is suitable for most library usage queries. +The dev list is intended for the development discussion. +Please remember that the lists are shared between all commons components, +so prefix your email by [lang]. +

+

+Issues may be reported via ASF Bugzilla. +Please remember that Bugzilla is shared between all commons components, +so prefix your issue by [lang]. +

- +
- + - diff --git a/xdocs/issue-tracking.xml b/xdocs/issue-tracking.xml new file mode 100644 index 000000000..4661b9345 --- /dev/null +++ b/xdocs/issue-tracking.xml @@ -0,0 +1,61 @@ + + + + + Issue tracking + Commons Documentation Team + + + +
+

+ Commons Lang uses ASF Bugzilla for tracking issues. + To use Bugzilla you may need to create an account. +

+

+ If you would like to report a bug, or raise an enhancement request with + Commons Lang please do the following: +

    +
  1. Search existing open bugs. + If you find your issue listed then please add a comment with your details.
  2. +
  3. Search the mailing list archive. + You may find your issue or idea has already been discussed.
  4. +
  5. Submit a bug report or enhancement request. + Please prefix all new issues with [lang] in the summary line. +
  6. +
+

+

+ Please also remember these points: +

    +
  • the more information you provide, the better we can help you
  • +
  • test cases are vital, particularly for any proposed enhancements
  • +
  • the developers of Commons Lang are all unpaid volunteers
  • +
+

+

+ You may also find these links useful: +

+

+
+ + +
diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index 333fd34c8..387365365 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -1,6 +1,6 @@ - + Lang - - Jakarta - - + + - - + + + + + - + + - - &common-menus; + + &commons; diff --git a/xdocs/style/project.css b/xdocs/style/project.css index f2368d636..013020460 100644 --- a/xdocs/style/project.css +++ b/xdocs/style/project.css @@ -1,25 +1 @@ -/* - * Copyright 2004-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - #banner, #banner td { - background: #fff; - color: #000; -} - -#banner td { - height: 100%; - vertical-align: middle; -} +@import url("http://jakarta.apache.org/style/jakarta-maven.css"); diff --git a/xdocs/upgradeto2_0.xml b/xdocs/upgradeto2_0.xml new file mode 100644 index 000000000..44d1ea6c8 --- /dev/null +++ b/xdocs/upgradeto2_0.xml @@ -0,0 +1,687 @@ + + + + + Upgrade from 1.0 to 2.0 + Commons Documentation Team + + + +
+

+These are the release notes and advice for upgrading Commons-Lang from +version 1.0 to version 2.0. + +INTRODUCTION: + +This document contains the release notes for this version of the Commons +Lang package. Commons Lang is a set of utility functions and reusable +components that should be a help in any Java environment. + +This release has involved a major clean and tidy exercise. +Javadoc and Tests are now much more thorough. +All methods should now be much clearer in what they do in unusual cases. + + +INCOMPATIBLE CHANGES: +Some StringUtils methods have changed functionality from 1.0: + isEmpty() + chomp(String) + chomp(String,String) + swapCase(String) +Numerous other methods have changed null handling to accept nulls gracefully. +As with all major version releases, check your code for incompatibilities. + + +NEW FEATURES: + +Since the release of the 1.0 package the following classes have been added: + +lang package: + ArrayUtils + BitField + BooleanUtils + CharRange (previously package scoped) + ClassUtils + StringEscapeUtils + WordUtils + IllegalClassException + IncompleteArgumentException + NotImplementedException + NullArgumentException + SerializationException + UnhandledException + Validate + + +math sub-package: + IntRange + LongRange + Range + DoubleRange + JVMRandom + NumberRange + FloatRange + NumberUtils + Fraction + RandomUtils + +time sub-package: + DateFormatUtils + FastDateFormat + DateUtils + StopWatch + +Since the release of the 1.0 package the following classes have been changed: + +lang: + CharSet: + Added factory method, equals and hashCode(). + Better defined and tested the set syntax. + CharSetUtils: + added keep method: keep any characters specified in the CharSet string + RandomStringUtils: + random method: overloaded to allow passing in of a Random class + SerializationUtils: + added empty constructor + StringUtils: + isEmpty() changed to not trim + chomp() changed to be more like Perl. + swapCase() no longer word based, but no difference if you pass in ASCII + Various methods changed in the handling of null (less exceptions). + Many new methods. + Various methods deprecated. + SystemUtils: + isJavaVersionAtLeast(int) added. getJavaVersion() deprecated. + host of new constants. + +enum: + Enum: + getEnumClass(Class) added + EnumUtils: + Removed irrelevant Comparable/Serializable interfaces. + +exception: + NestableDelegate: + Gained many new methods for dissecting an Exception. + ExceptionUtils: + Gained many new methods to improve handling of nested stack traces. + +builder: + ReflectionToStringBuilder: + Handy class added for creating default toStrings. + All other builder classes received a set of new methods. + + +BUG FIXES: + +ID Sev Pri Plt Owner State Result Summary +13367 [PATCH] StringUtil enhancement +13391 Javadoc nit +13771 Additional Lang Method Suggestions +14306 NullPointerException in CompareToBuilder +14357 static option for reversing the stacktrace +14447 ToStringBuilder doesn't work well in subclasses +14883 StringUtils.countMatches loops forever if substring empty +14884 NumberRange inaccurate for Long, etc. +14985 More flexibility for getRootCause in ExceptionUtils +15154 SystemUtils.IS_JAVA_1_5 Javadoc is wrong +15257 Hierarchy support in ToStringBuilder.reflectionToString() +15438 ArrayUtils.contains() +15439 Enum does not support inner sub-classes +15986 Infinite loop in ToStringBuilder.reflectionToString for inne +16076 Example in Javadoc for ToStringBuilder wrong for append. +16193 Hierarchy support in EqualsBuilder.reflectionEquals() +16202 typo in the javadoc example code +16204 Infinite loop in StringUtils.replace(text, repl, with) + FIX +16227 Added class hierachy support to CompareToBuilder.reflectionC +16228 Added class hierachy support to HashCodeBuilder.reflectionHa +16284 MethodUtils: Removed unused code/unused local vars. +16341 No Javadoc for NestableDelegate +16622 Removed compile warning in FastDateFormat +16669 JavaDoc Errata +16676 StackOverflow due to ToStringBuilder +16689 ExceptionUtils new methods. +16690 Specify initial size for Enum's HashMap. +16787 Removed compile warning in ObjectUtils +17250 [Lang] Should ToStringBuilder.reflectionToString handle arra +17654 EnumUtils nit: The import java.io.Serializable is never used +17882 Add join(..., char c) to StringUtils (and some performance f +18077 StringUtils.chomp does not match Perl +18723 RandomStringUtils infloops with length < 1 +18836 test.lang fails if compiled with non iso-8859-1 locales +18948 Resurrect the WordWrapUtils from commons-sandbox/utils +19296 [Lang] What to do with FastDateFormat unused private constru +19364 [Lang] time unit tests fail on Sundays +19756 [lang] java.lang.ExceptionInInitializerError thrown by JVMRa +19880 [lang] patch and test case fixing problem with RandomStringU +20165 [LANG] SystemUtils does not play nice in an Applet +20538 [lang] NumberUtils.isNumber allows illegal trailing characte +20592 [lang] RandomStringUtils.randomAlpha methods omit 'z' +20603 [lang] Make NestableDelegate methods public instead of packa +20632 Refactored reflection feature of ToStringBuilder into new Re +20652 StringUtils.chopNewLine - StringIndexOutOfBoundsException +21021 [PATCH] reduce object creation in ToStringBuilder +21068 [lang] [PATCH] NumberUtils min/max, BooleanUtils.xor, and Ar +21099 [lang][PATCH] Unused field 'startFinal' in DateIterator +21715 The javadoc says "Mac" instead of "OS/2" +21734 [PATCH] all NumberUtils.createXXX(String) methods handle null +21750 [lang] StringUtils javadoc and test enhancements +21758 [lang] lang.builder classes javadoc edits (mostly typo fixes) +21797 [lang] Add javadoc examples and tests for StringUtils +21809 [lang] maven-beta10 checkstyle problem +21904 NumberUtils.createBigDecimal("") NPE in Sun 1.3.1_08 +21952 [lang] Improved tests, javadoc for CharSetUtils, StringEscapeUtils +22091 Adding tolerance to double[] search methods in ArrayUtils +22094 A small, but important javadoc fix for Fraction proper whole/numerator +22095 [lang] Javadoc, tests improvements for CharSet, CharSetUtils +22098 [lang] Improve util.Validate tests +22245 [lang] test.time fails in Japanese (non-us) locale. +22286 [lang] Missing @since tags +22367 Typo in documentation +22386 [lang] Improve javadoc and overflow behavior of Fraction + + +DEPRECATIONS: + +lang: + NumberRange: + now deprecated, see math subpackage + NumberUtils: + now deprecated, see math subpackage + + +CHANGES: [In 'diff' format] + +Jar changes +=========== +> org.apache.commons.lang.math.Range +> org.apache.commons.lang.math.FloatRange +> org.apache.commons.lang.math.NumberUtils +> org.apache.commons.lang.math.JVMRandom +> org.apache.commons.lang.math.IntRange +> org.apache.commons.lang.math.LongRange +> org.apache.commons.lang.math.DoubleRange +> org.apache.commons.lang.math.NumberRange +> org.apache.commons.lang.math.Fraction +> org.apache.commons.lang.math.RandomUtils +> org.apache.commons.lang.time.FastDateFormat +> org.apache.commons.lang.time.DateUtils$DateIterator +> org.apache.commons.lang.time.DateUtils +> org.apache.commons.lang.time.FastDateFormat$UnpaddedMonthField +> org.apache.commons.lang.time.FastDateFormat$StringLiteral +> org.apache.commons.lang.time.FastDateFormat$TwelveHourField +> org.apache.commons.lang.time.FastDateFormat$NumberRule +> org.apache.commons.lang.time.FastDateFormat$CharacterLiteral +> org.apache.commons.lang.time.FastDateFormat$TimeZoneNumberRule +> org.apache.commons.lang.time.FastDateFormat$TimeZoneNameRule +> org.apache.commons.lang.time.DateFormatUtils +> org.apache.commons.lang.time.FastDateFormat$TwoDigitMonthField +> org.apache.commons.lang.time.DurationFormatUtils +> org.apache.commons.lang.time.FastDateFormat$TimeZoneDisplayKey +> org.apache.commons.lang.time.FastDateFormat$UnpaddedNumberField +> org.apache.commons.lang.time.FastDateFormat$PaddedNumberField +> org.apache.commons.lang.time.StopWatch +> org.apache.commons.lang.time.FastDateFormat$TwentyFourHourField +> org.apache.commons.lang.time.FastDateFormat$Rule +> org.apache.commons.lang.time.FastDateFormat$TwoDigitNumberField +> org.apache.commons.lang.time.FastDateFormat$TextField +> org.apache.commons.lang.time.FastDateFormat$Pair +> org.apache.commons.lang.time.FastDateFormat$TwoDigitYearField +> org.apache.commons.lang.util.IdentifierUtils$StringNumericIdentifierFactory +> org.apache.commons.lang.util.IdentifierUtils$StringSessionIdentifierFactory +> org.apache.commons.lang.util.IdentifierUtils$LongNumericIdentifierFactory +> org.apache.commons.lang.util.IdentifierUtils$StringAlphanumericIdentifierFactory +> org.apache.commons.lang.util.Validate +> org.apache.commons.lang.util.LongIdentifierFactory +> org.apache.commons.lang.util.IdentifierUtils$1 +> org.apache.commons.lang.util.StringIdentifierFactory +> org.apache.commons.lang.util.IdentifierUtils +> org.apache.commons.lang.util.IdentifierFactory +> org.apache.commons.lang.util.BitField +> org.apache.commons.lang.Entities +> org.apache.commons.lang.Entities$LookupEntityMap +> org.apache.commons.lang.NotImplementedException +> org.apache.commons.lang.NullArgumentException +< org.apache.commons.lang.ObjectUtils$1 +--- +> org.apache.commons.lang.StringPrintWriter +> org.apache.commons.lang.UnhandledException +> org.apache.commons.lang.Entities$HashEntityMap +> org.apache.commons.lang.Entities$ArrayEntityMap +> org.apache.commons.lang.Entities$EntityMap +> org.apache.commons.lang.IntHashMap +> org.apache.commons.lang.BooleanUtils +> org.apache.commons.lang.IncompleteArgumentException +> org.apache.commons.lang.Entities$PrimitiveEntityMap +> org.apache.commons.lang.Entities$TreeEntityMap +> org.apache.commons.lang.WordUtils +> org.apache.commons.lang.StringEscapeUtils +> org.apache.commons.lang.ArrayUtils +> org.apache.commons.lang.Entities$BinaryEntityMap +> org.apache.commons.lang.ClassUtils +> org.apache.commons.lang.IntHashMap$Entry +> org.apache.commons.lang.IllegalClassException +> org.apache.commons.lang.builder.ReflectionToStringBuilder$1 +> org.apache.commons.lang.builder.ReflectionToStringBuilder +> org.apache.commons.lang.Entities$MapIntMap + + +Class changes +============= +org.apache.commons.lang.enum.EnumUtils +-------------------- +< public abstract class org.apache.commons.lang.enum.EnumUtils extends java.lang.Object implements java.lang.Comparable, java.io.Serializable { +--- +> public class org.apache.commons.lang.enum.EnumUtils extends java.lang.Object { +> public org.apache.commons.lang.enum.EnumUtils(); + +org.apache.commons.lang.enum.Enum$Entry +-------------------- +> final java.util.Map unmodifiableMap; +> final java.util.List unmodifiableList; + +org.apache.commons.lang.enum.Enum +-------------------- +> protected transient java.lang.String iToString; +> static java.lang.Class class$org$apache$commons$lang$enum$ValuedEnum; +> public java.lang.Class getEnumClass(); + +org.apache.commons.lang.enum.ValuedEnum +-------------------- +> static {}; + +org.apache.commons.lang.StringUtils +-------------------- +> public static final java.lang.String EMPTY; +> public static boolean isEmpty(java.lang.String); +> public static boolean isNotEmpty(java.lang.String); +> public static boolean isBlank(java.lang.String); +> public static boolean isNotBlank(java.lang.String); +< public static java.lang.String deleteSpaces(java.lang.String); +< public static java.lang.String deleteWhitespace(java.lang.String); +< public static boolean isNotEmpty(java.lang.String); +< public static boolean isEmpty(java.lang.String); +--- +> public static java.lang.String trimToNull(java.lang.String); +> public static java.lang.String trimToEmpty(java.lang.String); +> public static java.lang.String strip(java.lang.String); +> public static java.lang.String stripToNull(java.lang.String); +> public static java.lang.String stripToEmpty(java.lang.String); +> public static java.lang.String strip(java.lang.String, java.lang.String); +> public static java.lang.String stripStart(java.lang.String, java.lang.String); +> public static java.lang.String stripEnd(java.lang.String, java.lang.String); +> public static java.lang.String stripAll(java.lang.String[])[]; +> public static java.lang.String stripAll(java.lang.String[], java.lang.String)[]; +> public static int indexOf(java.lang.String, char); +> public static int indexOf(java.lang.String, char, int); +> public static int indexOf(java.lang.String, java.lang.String); +> public static int indexOf(java.lang.String, java.lang.String, int); +> public static int lastIndexOf(java.lang.String, char); +> public static int lastIndexOf(java.lang.String, char, int); +> public static int lastIndexOf(java.lang.String, java.lang.String); +> public static int lastIndexOf(java.lang.String, java.lang.String, int); +> public static boolean contains(java.lang.String, char); +> public static boolean contains(java.lang.String, java.lang.String); +> public static int indexOfAny(java.lang.String, char[]); +> public static int indexOfAny(java.lang.String, java.lang.String); +> public static int indexOfAnyBut(java.lang.String, char[]); +> public static int indexOfAnyBut(java.lang.String, java.lang.String); +> public static boolean containsOnly(java.lang.String, char[]); +> public static boolean containsOnly(java.lang.String, java.lang.String); +> public static boolean containsNone(java.lang.String, char[]); +> public static boolean containsNone(java.lang.String, java.lang.String); +> public static java.lang.String substringBefore(java.lang.String, java.lang.String); +> public static java.lang.String substringAfter(java.lang.String, java.lang.String); +> public static java.lang.String substringBeforeLast(java.lang.String, java.lang.String); +> public static java.lang.String substringAfterLast(java.lang.String, java.lang.String); +> public static java.lang.String substringBetween(java.lang.String, java.lang.String); +> public static java.lang.String substringBetween(java.lang.String, java.lang.String, java.lang.String); +> public static java.lang.String getNestedString(java.lang.String, java.lang.String); +> public static java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String); +> public static java.lang.String split(java.lang.String, char)[]; +> public static java.lang.String join(java.lang.Object[]); +> public static java.lang.String join(java.lang.Object[], char); +> public static java.lang.String join(java.util.Iterator, char); +> public static java.lang.String deleteSpaces(java.lang.String); +> public static java.lang.String deleteWhitespace(java.lang.String); +> public static java.lang.String replaceChars(java.lang.String, char, char); +> public static java.lang.String replaceChars(java.lang.String, java.lang.String, java.lang.String); +< public static java.lang.String center(java.lang.String, int); +< public static java.lang.String center(java.lang.String, int, java.lang.String); +--- +> public static java.lang.String overlay(java.lang.String, java.lang.String, int, int); +> public static java.lang.String rightPad(java.lang.String, int, char); +> public static java.lang.String leftPad(java.lang.String, int, char); +< public static java.lang.String strip(java.lang.String); +< public static java.lang.String strip(java.lang.String, java.lang.String); +< public static java.lang.String stripAll(java.lang.String[])[]; +< public static java.lang.String stripAll(java.lang.String[], java.lang.String)[]; +< public static java.lang.String stripEnd(java.lang.String, java.lang.String); +< public static java.lang.String stripStart(java.lang.String, java.lang.String); +--- +> public static java.lang.String center(java.lang.String, int); +> public static java.lang.String center(java.lang.String, int, char); +> public static java.lang.String center(java.lang.String, int, java.lang.String); +< public static java.lang.String uncapitalise(java.lang.String); +--- +> public static java.lang.String capitalize(java.lang.String); +> public static java.lang.String uncapitalize(java.lang.String); +> public static java.lang.String uncapitalise(java.lang.String); +< public static java.lang.String getNestedString(java.lang.String, java.lang.String); +< public static java.lang.String getNestedString(java.lang.String, java.lang.String, java.lang.String); +> public static boolean isWhitespace(java.lang.String); +> public static java.lang.String reverseDelimited(java.lang.String, char); +> public static java.lang.String abbreviate(java.lang.String, int); +> public static java.lang.String abbreviate(java.lang.String, int, int); +> public static java.lang.String difference(java.lang.String, java.lang.String); +> public static int differenceAt(java.lang.String, java.lang.String); +< public static boolean containsOnly(java.lang.String, char[]); +--- +> static {}; + +org.apache.commons.lang.ObjectUtils +-------------------- +> public static java.lang.StringBuffer appendIdentityToString(java.lang.StringBuffer, java.lang.Object); +> public static java.lang.String toString(java.lang.Object); +> public static java.lang.String toString(java.lang.Object, java.lang.String); +< org.apache.commons.lang.ObjectUtils.Null(org.apache.commons.lang.ObjectUtils$1); +--- +> org.apache.commons.lang.ObjectUtils.Null(); +> static {}; + +org.apache.commons.lang.exception.NestableDelegate +-------------------- +> public static boolean topDown; +> public static boolean trimStackFrames; +< org.apache.commons.lang.exception.NestableDelegate(org.apache.commons.lang.exception.Nestable); +< java.lang.String getMessage(int); +< java.lang.String getMessage(java.lang.String); +< java.lang.String getMessages()[]; +< java.lang.Throwable getThrowable(int); +< int getThrowableCount(); +< java.lang.Throwable getThrowables()[]; +< int indexOfThrowable(java.lang.Class, int); +--- +> public org.apache.commons.lang.exception.NestableDelegate(org.apache.commons.lang.exception.Nestable); +> public java.lang.String getMessage(int); +> public java.lang.String getMessage(java.lang.String); +> public java.lang.String getMessages()[]; +> public java.lang.Throwable getThrowable(int); +> public int getThrowableCount(); +> public java.lang.Throwable getThrowables()[]; +> public int indexOfThrowable(java.lang.Class, int); +> protected java.lang.String getStackFrames(java.lang.Throwable)[]; +> protected void trimStackFrames(java.util.List); + +org.apache.commons.lang.exception.ExceptionUtils +-------------------- +< protected static final java.lang.String CAUSE_METHOD_NAMES[]; +< protected static final java.lang.Object CAUSE_METHOD_PARAMS[]; +--- +> static final java.lang.String WRAPPED_MARKER; +< protected org.apache.commons.lang.exception.ExceptionUtils(); +--- +> public org.apache.commons.lang.exception.ExceptionUtils(); +> public static void addCauseMethodName(java.lang.String); +> public static boolean isThrowableNested(); +> public static boolean isNestedThrowable(java.lang.Throwable); +> public static void printRootCauseStackTrace(java.lang.Throwable); +> public static void printRootCauseStackTrace(java.lang.Throwable, java.io.PrintStream); +> public static void printRootCauseStackTrace(java.lang.Throwable, java.io.PrintWriter); +> public static java.lang.String getRootCauseStackTrace(java.lang.Throwable)[]; +> public static void removeCommonFrames(java.util.List, java.util.List); +> public static java.lang.String getFullStackTrace(java.lang.Throwable); +> static java.util.List getStackFrameList(java.lang.Throwable); + +org.apache.commons.lang.CharRange +-------------------- +< class org.apache.commons.lang.CharRange extends java.lang.Object { +--- +> public final class org.apache.commons.lang.CharRange extends java.lang.Object implements java.io.Serializable { +> public org.apache.commons.lang.CharRange(char,boolean); +< public org.apache.commons.lang.CharRange(java.lang.String,java.lang.String); +--- +> public org.apache.commons.lang.CharRange(char,char,boolean); +< public void setStart(char); +< public void setEnd(char); +< public boolean isRange(); +< public boolean inRange(char); +< public void setNegated(boolean); +--- +> public boolean contains(char); +> public boolean contains(org.apache.commons.lang.CharRange); +> public boolean equals(java.lang.Object); +> public int hashCode(); +> static {}; + +org.apache.commons.lang.ObjectUtils$1 +-------------------- +< Compiled from ObjectUtils.java +< class org.apache.commons.lang.ObjectUtils$1 extends java.lang.Object { +< } +--- +> Class 'org.apache.commons.lang.ObjectUtils$1' has been removed + +org.apache.commons.lang.ObjectUtils$Null +-------------------- +< org.apache.commons.lang.ObjectUtils.Null(org.apache.commons.lang.ObjectUtils$1); +--- +> org.apache.commons.lang.ObjectUtils.Null(); +> static {}; + +org.apache.commons.lang.SystemUtils +-------------------- +> public static final java.lang.String FILE_ENCODING; +> public static final java.lang.String JAVA_RUNTIME_NAME; +> public static final java.lang.String JAVA_RUNTIME_VERSION; +> public static final java.lang.String JAVA_VM_INFO; +> public static final java.lang.String USER_COUNTRY; +> public static final java.lang.String USER_LANGUAGE; +> public static final float JAVA_VERSION_FLOAT; +> public static final int JAVA_VERSION_INT; +> public static final boolean IS_OS_AIX; +> public static final boolean IS_OS_HP_UX; +> public static final boolean IS_OS_IRIX; +> public static final boolean IS_OS_LINUX; +> public static final boolean IS_OS_MAC; +> public static final boolean IS_OS_MAC_OSX; +> public static final boolean IS_OS_OS2; +> public static final boolean IS_OS_SOLARIS; +> public static final boolean IS_OS_SUN_OS; +> public static final boolean IS_OS_WINDOWS; +> public static final boolean IS_OS_WINDOWS_2000; +> public static final boolean IS_OS_WINDOWS_95; +> public static final boolean IS_OS_WINDOWS_98; +> public static final boolean IS_OS_WINDOWS_ME; +> public static final boolean IS_OS_WINDOWS_NT; +> public static final boolean IS_OS_WINDOWS_XP; +> public static boolean isJavaVersionAtLeast(int); + +org.apache.commons.lang.SerializationUtils +-------------------- +> public org.apache.commons.lang.SerializationUtils(); + +org.apache.commons.lang.RandomStringUtils +-------------------- +> public static java.lang.String random(int, int, int, boolean, boolean, char[], java.util.Random); + +org.apache.commons.lang.CharSet +-------------------- +< public class org.apache.commons.lang.CharSet extends java.lang.Object { +--- +> public class org.apache.commons.lang.CharSet extends java.lang.Object implements java.io.Serializable { +> public static final org.apache.commons.lang.CharSet EMPTY; +> public static final org.apache.commons.lang.CharSet ASCII_ALPHA; +> public static final org.apache.commons.lang.CharSet ASCII_ALPHA_LOWER; +> public static final org.apache.commons.lang.CharSet ASCII_ALPHA_UPPER; +> public static final org.apache.commons.lang.CharSet ASCII_NUMERIC; +> protected static final java.util.Map COMMON; +> public static org.apache.commons.lang.CharSet getInstance(java.lang.String); +> protected org.apache.commons.lang.CharSet(java.lang.String); +< public boolean contains(char); +> public org.apache.commons.lang.CharRange getCharRanges()[]; +> public boolean contains(char); +> public boolean equals(java.lang.Object); +> public int hashCode(); +> static {}; + +org.apache.commons.lang.CharSetUtils +-------------------- +> public static java.lang.String keep(java.lang.String, java.lang.String); +> public static java.lang.String keep(java.lang.String, java.lang.String[]); + +org.apache.commons.lang.builder.ToStringBuilder +-------------------- +< public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object); +< public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle); +< public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle,java.lang.StringBuffer); +< public static void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean); +< public org.apache.commons.lang.builder.ToStringBuilder append(long); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long); +< public org.apache.commons.lang.builder.ToStringBuilder append(int); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int); +< public org.apache.commons.lang.builder.ToStringBuilder append(short); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short); +< public org.apache.commons.lang.builder.ToStringBuilder append(char); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char); +--- +> public static java.lang.String reflectionToString(java.lang.Object, org.apache.commons.lang.builder.ToStringStyle, boolean, java.lang.Class); +> public static void setDefaultStyle(org.apache.commons.lang.builder.ToStringStyle); +> public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object); +> public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle); +> public org.apache.commons.lang.builder.ToStringBuilder(java.lang.Object,org.apache.commons.lang.builder.ToStringStyle,java.lang.StringBuffer); +> public org.apache.commons.lang.builder.ToStringBuilder append(boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(boolean[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(byte[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(char); +> public org.apache.commons.lang.builder.ToStringBuilder append(char[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(double[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float); +< public org.apache.commons.lang.builder.ToStringBuilder append(boolean); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean); +< public org.apache.commons.lang.builder.ToStringBuilder append(long[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(float[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(int); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(long); +> public org.apache.commons.lang.builder.ToStringBuilder append(long[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.Object[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(short); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean); +< public org.apache.commons.lang.builder.ToStringBuilder append(char[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean); +< public org.apache.commons.lang.builder.ToStringBuilder append(byte[]); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, byte); +< public org.apache.commons.lang.builder.ToStringBuilder append(double[]); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, char[], boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, double); +< public org.apache.commons.lang.builder.ToStringBuilder append(float[]); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, float); +< public org.apache.commons.lang.builder.ToStringBuilder append(boolean[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[]); +< public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, boolean[], boolean); +--- +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, int[], boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, long[], boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object, boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, java.lang.Object[], boolean); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[]); +> public org.apache.commons.lang.builder.ToStringBuilder append(java.lang.String, short[], boolean); +> public org.apache.commons.lang.builder.ToStringBuilder appendAsObjectToString(java.lang.Object); +> public org.apache.commons.lang.builder.ToStringBuilder appendSuper(java.lang.String); +> public org.apache.commons.lang.builder.ToStringBuilder appendToString(java.lang.String); +> public org.apache.commons.lang.builder.ToStringStyle getStyle(); +> public java.lang.Object getObject(); + +org.apache.commons.lang.builder.StandardToStringStyle +-------------------- +> public boolean isUseShortClassName(); +> public void setUseShortClassName(boolean); +> public boolean isFieldSeparatorAtStart(); +> public void setFieldSeparatorAtStart(boolean); +> public boolean isFieldSeparatorAtEnd(); +> public void setFieldSeparatorAtEnd(boolean); + +org.apache.commons.lang.builder.ToStringStyle +-------------------- +> public void appendSuper(java.lang.StringBuffer, java.lang.String); +> public void appendToString(java.lang.StringBuffer, java.lang.String); +> protected void removeLastFieldSeparator(java.lang.StringBuffer); +> protected void reflectionAppendArrayDetail(java.lang.StringBuffer, java.lang.String, java.lang.Object); +> protected boolean isUseShortClassName(); +> protected void setUseShortClassName(boolean); +> protected boolean isFieldSeparatorAtStart(); +> protected void setFieldSeparatorAtStart(boolean); +> protected boolean isFieldSeparatorAtEnd(); +> protected void setFieldSeparatorAtEnd(boolean); + +org.apache.commons.lang.builder.HashCodeBuilder +-------------------- +> public static int reflectionHashCode(int, int, java.lang.Object, boolean, java.lang.Class); +> public org.apache.commons.lang.builder.HashCodeBuilder appendSuper(int); + +org.apache.commons.lang.builder.CompareToBuilder +-------------------- +> public static int reflectionCompare(java.lang.Object, java.lang.Object, boolean, java.lang.Class); +> public org.apache.commons.lang.builder.CompareToBuilder appendSuper(int); +> public org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object, java.lang.Object, java.util.Comparator); +> public org.apache.commons.lang.builder.CompareToBuilder append(java.lang.Object[], java.lang.Object[], java.util.Comparator); + +org.apache.commons.lang.builder.EqualsBuilder +-------------------- +> public static boolean reflectionEquals(java.lang.Object, java.lang.Object, boolean, java.lang.Class); +> public org.apache.commons.lang.builder.EqualsBuilder appendSuper(boolean); + +

+
+ + +
diff --git a/xdocs/upgradeto2_1.xml b/xdocs/upgradeto2_1.xml new file mode 100644 index 000000000..7b79dd824 --- /dev/null +++ b/xdocs/upgradeto2_1.xml @@ -0,0 +1,162 @@ + + + + + Upgrade from 2.0 to 2.1 + Commons Documentation Team + + + +
+

+These are the release notes and advice for upgrading Commons-Lang from +version 2.0 to version 2.1. + +INTRODUCTION: + +This document contains the release notes for the 2.1 version of Apache Jakarta Commons Lang. +Commons Lang is a set of utility functions and reusable components that +should be of use in any Java environment. + + +INCOMPATIBLE CHANGES: + +- The Nestable interface defines the method indexOfThrowable(Class). +Previously the implementations checked only for a specific Class. +Now they check for subclasses of that Class as well. +For most situations this will be the expected behaviour (ie. its a bug fix). +If it causes problems, please use the ExceptionUtils.indexOfThrowable(Class) method instead. +Note that the ExceptionUtils method is available in v1.0 and v2.0 of commons-lang and has not been changed. +(An alternative to this is to change the public static matchSubclasses flag on NestableDelegate. +However, we don't recommend that as a long-term solution.) + +- The StopWatch class has had much extra validation added. +If your code previously relied on unusual aspects, it may no longer work. + +- Starting with version 2.1, Ant version 1.6.x is required to build. Copy +junit.jar to ANT_HOME/lib. You can get JUnit from http://www.junit.org. See the developer's guide +for more details. + + +DEPRECATIONS: + +- The enum package has been renamed to enums for JDK1.5 compilance. +All functionality is identical, just the package has changed. +This package will be removed in v3.0. + +- NumberUtils.stringToInt - renamed to toInt + +- DateUtils - four constants, MILLIS_IN_* have been deprecated as they were defined +as int not long. The replacements are MILLIS_PER_*. + + +NEW FEATURES: + +New: +- Mutable package - contains basic classes that hold an Object or primitive +and provide both get and set methods. +- DurationFormatUtils - provides various methods for formatting durations +- CharEncoding - definitions of constants for character encoding work +- CharUtils - utilities for working with characters + +Updated: +- ArrayUtils - many more methods, especially List-like methods +- BooleanUtils - isTrue and isFalse methods that handle null +- ClassUtils - primitive to wrapper class conversion methods +- ClassUtils - class name comparator +- IllegalClassException - extra constructor for common instanceof case +- NotImplementedException - supports nested exceptions +- ObjectUtils - hashcode method handling null +- StringUtils - isAsciiPrintable to check the contents of a string + -- ordinalIndexOf to find the nth index of a string + -- various remove methods to remove parts of a string + -- various split methods to provide more control over splitting a string + -- defaultIfEmpty to default a string if null or empty +- SystemUtils - methods to get system properties as File objects + -- extra constants representing system properties +- Validate - new methods to check whether all elements in a collection are of a specific type +- WordUtils - new methods to capitalize based on a set of specified delimiters + +- EqualsBuilder - now provides setter to internal state +- ToStringStyle - new style, short prefix style +- ReflectionToStringBuilder - more flags to control the output with regards to statics + +- ExceptionUtils - added indexOfType methods that check subclasses, thus leaving the existing +indexOfThrowable method untouched (see incompatible changes section) + +- NumberUtils - various string to number parsing methods added + +- DateUtils - methods added to compare dates in various ways + -- method to parse a date string using multiple patterns +- FastDateFormat - extra formatting methods that take in a millisecond long value + -- additional static factory methods +- StopWatch - new methods for split behaviour + + +BUG FIXES: + +19331 General case: infinite loop: ToStringBuilder.reflectionToString +23174 EqualsBuilder.append(Object[], Object[]) throws NPE +23356 Make DurationFormatUtils public! +23557 WordUtils.capitalizeFully(String str) should take a delimiters +23683 New method for converting a primitive Class to its corresponding wrapper +23430 Minor javadoc fixes for StringUtils.contains(String, String) +23590 make optional parameters in FastDateFormat really optional +24056 Documentation error in StringUtils.replace +25227 StringEscapeUtils.unescapeHtml() doesn't handle hex entities +25454 new StringUtils.replaceChars behaves differently from old Ch +25560 DateUtils.truncate() is off by one hour when using a date in DST switch 'zone' +25627 DateUtils constants should be long +25683 Add method that validates Collection elements are a correct +25849 Add SystemUtils methods for directory properties. +26616 ClassCastException in Enum.equals(Object) +26699 Tokenizer Enhancements: reset input string, static CSV +26734 NullPointerException in EqualsBuilder.append(Object[], Object[]) +26877 Add SystemUtils.AWT_TOOLKIT and others. +26922 public static boolean DateUtils.equals(Date dt1, Date dt2) +27592 WordUtils capitalize improvement +27876 ReflectionToStringBuilder.toString(null) throws exception by design +27877 Make ClassUtils methods null-safe and not throw an IAE. +28468 StringUtils.defaultString: Documentation error +28554 Add hashCode-support to class ObjectUtils +29082 Enhancement of ExceptionUtils.CAUSE_METHOD_NAMES +29149 StringEscapeUtils.unescapeHtml() doesn't handle an empty entity +29294 lang.math.Fraction class deficiencies +29673 ExceptionUtils: new getCause() methodname (for tomcat) +29794 Add convenience format(long) methods to FastDateForma +30328 HashCodeBuilder does not use the same values as Boolean (fixed as documentation) +30334 New class proposal: CharacterEncoding +30674 parseDate class from HttpClient's DateParser class +30815 ArrayUtils.isEquals() throws ClassCastException when array1 +30929 Nestable.indexOfThrowable(Class) uses Class.equals() to match +31395 DateUtils.truncate oddity at the far end of the Date spectrum +31478 Compile error with JDK 5 "enum" is a keyword +31572 o.a.c.lang.enum.ValuedEnum: 'enum'is a keyword in JDK1.5.0 +31933 ToStringStyle setArrayEnd handled null incorrectly +32133 SystemUtils fails init on HP-UX +32198 Error in JavaDoc for StringUtils.chomp(String, String) +32625 Can't subclass EqualsBuilder because isEquals is private +33067 EqualsBuilder.append(Object[], Object[]) crashes with a NullPointerException if an element of the first array is null +33069 EqualsBuilder.append(Object[], Object[]) incorrectly checks that rhs[i] is instance of lhs[i]'s class +33574 unbalanced ReflectionToStringBuilder +33737 ExceptionUtils.addCauseMethodName(String) does not check for duplicates. + +

+
+ + +