@@ -70,6 +70,9 @@ public final class FileUtils {
7070 public static final String SHORTENER_SLASH = "/" ;
7171 public static final String SHORTENER_ELLIPSE = "..." ;
7272
73+ /** A regular expression to match filenames containing version information. */
74+ private static final Pattern VERSION_PATTERN = buildVersionPattern ();
75+
7376 private FileUtils () {
7477 // prevent instantiation of utility class
7578 }
@@ -170,13 +173,8 @@ public static void writeFile(final File file, final byte[] bytes)
170173 }
171174 }
172175
173- /** A regular expression to match filenames containing version information. */
174- private final static Pattern versionPattern =
175- Pattern
176- .compile ("(.+?)(-\\ d+(\\ .\\ d+|\\ d{7})+[a-z]?\\ d?(-[A-Za-z0-9.]+?|\\ .GA)*?)?((-(swing|swt|shaded|sources|javadoc|native|linux-x86|linux-x86_64|macosx-x86_64|windows-x86|windows-x86_64|android-arm|android-x86))?(\\ .jar(-[a-z]*)?))" );
177-
178176 public static String stripFilenameVersion (final String filename ) {
179- final Matcher matcher = versionPattern .matcher (filename );
177+ final Matcher matcher = VERSION_PATTERN .matcher (filename );
180178 if (!matcher .matches ()) return filename ;
181179 return matcher .group (1 ) + matcher .group (5 );
182180 }
@@ -191,7 +189,7 @@ public static String stripFilenameVersion(final String filename) {
191189 public static File [] getAllVersions (final File directory ,
192190 final String filename )
193191 {
194- final Matcher matcher = versionPattern .matcher (filename );
192+ final Matcher matcher = VERSION_PATTERN .matcher (filename );
195193 if (!matcher .matches ()) {
196194 final File file = new File (directory , filename );
197195 return file .exists () ? new File [] { file } : null ;
@@ -203,7 +201,7 @@ public static File[] getAllVersions(final File directory,
203201 @ Override
204202 public boolean accept (final File dir , final String name ) {
205203 if (!name .startsWith (baseName )) return false ;
206- final Matcher matcher2 = versionPattern .matcher (name );
204+ final Matcher matcher2 = VERSION_PATTERN .matcher (name );
207205 return matcher2 .matches () && baseName .equals (matcher2 .group (1 )) &&
208206 equals (classifier , matcher2 .group (6 ));
209207 }
@@ -609,6 +607,38 @@ else if (protocol.equals("jar")) {
609607 return result ;
610608 }
611609
610+ // -- Helper methods --
611+
612+ /** Builds the {@link #VERSION_PATTERN} constant. */
613+ private static Pattern buildVersionPattern () {
614+ final String version =
615+ "\\ d+(\\ .\\ d+|\\ d{7})+[a-z]?\\ d?(-[A-Za-z0-9.]+?|\\ .GA)*?" ;
616+ final String suffix = "\\ .jar(-[a-z]*)?" ;
617+ return Pattern .compile ("(.+?)(-" + version + ")?((-(" + classifiers () +
618+ "))?(" + suffix + "))" );
619+ }
620+
621+ /** Helper method of {@link #buildVersionPattern()}. */
622+ private static String classifiers () {
623+ final String [] classifiers = {
624+ "swing" ,
625+ "swt" ,
626+ "shaded" ,
627+ "sources" ,
628+ "javadoc" ,
629+ "native" ,
630+ "(natives-)?(android|linux|macosx|solaris|windows)-" +
631+ "(aarch64|amd64|arm|armv6|armv6hf|i586|universal|x86|x86_64)" ,
632+ };
633+ final StringBuilder sb = new StringBuilder ("(" );
634+ for (final String classifier : classifiers ) {
635+ if (sb .length () > 1 ) sb .append ("|" );
636+ sb .append (classifier );
637+ }
638+ sb .append (")" );
639+ return sb .toString ();
640+ }
641+
612642 // -- Deprecated methods --
613643
614644 /**
@@ -620,7 +650,7 @@ else if (protocol.equals("jar")) {
620650 */
621651 @ Deprecated
622652 public static Matcher matchVersionedFilename (final String filename ) {
623- return versionPattern .matcher (filename );
653+ return VERSION_PATTERN .matcher (filename );
624654 }
625655
626656}
0 commit comments