001/*
002    Licensed to the Apache Software Foundation (ASF) under one
003    or more contributor license agreements.  See the NOTICE file
004    distributed with this work for additional information
005    regarding copyright ownership.  The ASF licenses this file
006    to you under the Apache License, Version 2.0 (the
007    "License"); you may not use this file except in compliance
008    with the License.  You may obtain a copy of the License at
009
010       http://www.apache.org/licenses/LICENSE-2.0
011
012    Unless required by applicable law or agreed to in writing,
013    software distributed under the License is distributed on an
014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015    KIND, either express or implied.  See the License for the
016    specific language governing permissions and limitations
017    under the License.
018 */
019
020package org.apache.wiki;
021
022import org.apache.commons.lang.StringUtils;
023
024
025/**
026 *  Contains release and version information.  You may also invoke this class directly, in which case it prints
027 *  out the version string.  This is a handy way of checking which JSPWiki version you have - just type
028 *  from a command line:
029 *  <pre>
030 *  % java -cp JSPWiki.jar org.apache.wiki.Release
031 *  2.5.38
032 *  </pre>
033 *  <p>
034 *  As a historical curiosity, this is the oldest JSPWiki file.  According to the CVS history, it dates from 6.7.2001,
035 *  and it really hasn't changed much since.
036 *  </p>
037 *  @since  1.0
038 */
039public final class Release {
040
041    private static final String VERSION_SEPARATORS = ".-";
042
043    /**
044     *  This is the default application name.
045     */
046    public static final String     APPNAME       = "JSPWiki";
047
048    /**
049     *  This should be empty when doing a release - otherwise keep it as "cvs" so that whenever someone checks
050     *  out the code, they know it is a bleeding-edge version.  Other possible values are "alpha" and "beta" for
051     *  alpha and beta versions, respectively.
052     *  <p>
053     *  If the POSTFIX is empty, it is not added to the version string.
054     */
055    private static final String    POSTFIX       = "M4";
056
057    /** The JSPWiki major version. */
058    public static final int        VERSION       = 2;
059
060    /** The JSPWiki revision. */
061    public static final int        REVISION      = 11;
062
063    /** The minor revision.  */
064    public static final int        MINORREVISION = 0;
065
066    /** The build number/identifier.  This is a String as opposed to an integer, just so that people can add
067     *  other identifiers to it.  The build number is incremented every time a committer checks in code, and reset
068     *  when the a release is made.
069     *  <p>
070     *  If you are a person who likes to build his own releases, we recommend that you add your initials to this
071     *  identifier (e.g. "13-jj", or 49-aj").
072     *  <p>
073     *  If the build identifier is empty, it is not added.
074     */
075    public static final String     BUILD         = "";
076
077    /**
078     *  This is the generic version string you should use when printing out the version.  It is of
079     *  the form "VERSION.REVISION.MINORREVISION[-POSTFIX][-BUILD]".
080     */
081    public static final String     VERSTR        =
082        VERSION+"."+REVISION+"."+MINORREVISION+ ((POSTFIX.length() != 0 ) ? "-"+POSTFIX : "") + ((BUILD.length() != 0 ? "-"+BUILD : ""));
083
084    /**
085     *  Private constructor prevents instantiation.
086     */
087    private Release() {
088    }
089
090    /**
091     *  This method is useful for templates, because hopefully it will
092     *  not be inlined, and thus any change to version number does not
093     *  need recompiling the pages.
094     *
095     *  @since 2.1.26.
096     *  @return The version string (e.g. 2.5.23).
097     */
098    public static String getVersionString() {
099        return VERSTR;
100    }
101
102    /**
103     *  Returns true, if this version of JSPWiki is newer or equal than what is requested.
104     *  @param version A version parameter string (a.b.c-something). B and C are optional.
105     *  @return A boolean value describing whether the given version is newer than the current JSPWiki.
106     *  @since 2.4.57
107     *  @throws IllegalArgumentException If the version string could not be parsed.
108     */
109    public static boolean isNewerOrEqual( String version ) throws IllegalArgumentException {
110        if( version == null ) {
111            return true;
112        }
113        String[] versionComponents = StringUtils.split( version, VERSION_SEPARATORS );
114        int reqVersion       = versionComponents.length > 0 ? Integer.parseInt( versionComponents[0] ) : Release.VERSION;
115        int reqRevision      = versionComponents.length > 1 ? Integer.parseInt( versionComponents[1] ) : Release.REVISION;
116        int reqMinorRevision = versionComponents.length > 2 ? Integer.parseInt( versionComponents[2] ) : Release.MINORREVISION;
117
118        if( VERSION == reqVersion ) {
119            if( REVISION == reqRevision ) {
120                if( MINORREVISION == reqMinorRevision ) {
121                    return true;
122                }
123
124                return MINORREVISION > reqMinorRevision;
125            }
126
127            return REVISION > reqRevision;
128        }
129
130        return VERSION > reqVersion;
131    }
132
133    /**
134     *  Returns true, if this version of JSPWiki is older or equal than what is requested.
135     *
136     *  @param version A version parameter string (a.b.c-something)
137     *  @return A boolean value describing whether the given version is older than the current JSPWiki version
138     *  @since 2.4.57
139     *  @throws IllegalArgumentException If the version string could not be parsed.
140     */
141    public static boolean isOlderOrEqual( String version ) throws IllegalArgumentException {
142        if( version == null ) {
143            return true;
144        }
145
146        String[] versionComponents = StringUtils.split( version, VERSION_SEPARATORS );
147        int reqVersion       = versionComponents.length > 0 ? Integer.parseInt( versionComponents[0] ) : Release.VERSION;
148        int reqRevision      = versionComponents.length > 1 ? Integer.parseInt( versionComponents[1] ) : Release.REVISION;
149        int reqMinorRevision = versionComponents.length > 2 ? Integer.parseInt( versionComponents[2] ) : Release.MINORREVISION;
150
151        if( VERSION == reqVersion ) {
152            if( REVISION == reqRevision ) {
153                if( MINORREVISION == reqMinorRevision ) {
154                    return true;
155                }
156
157                return MINORREVISION < reqMinorRevision;
158            }
159
160            return REVISION < reqRevision;
161        }
162
163        return VERSION < reqVersion;
164    }
165
166    /**
167     *  Executing this class directly from command line prints out the current version.  It is very useful for
168     *  things like different command line tools.
169     *  <P>Example:
170     *  <PRE>
171     *  % java org.apache.wiki.Release
172     *  1.9.26-cvs
173     *  </PRE>
174     *
175     *  @param argv The argument string.  This class takes in no arguments.
176     */
177    public static void main( String[] argv ) {
178        System.out.println(VERSTR);
179    }
180
181}