/* * eXist Open Source Native XML Database * Copyright (C) 2001-06 The eXist Project * http://exist-db.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * $Id$ */ package org.exist.start; import java.io.File; import java.io.FilenameFilter; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * This class uses regex pattern matching to find the latest version of a * particular jar file. * * @see LatestFileResolver#getResolvedFileName(String) * * @author Ben Schmaus (exist@benschmaus.com) * @version $Revision$ */ public class LatestFileResolver { // Pattern that can be used to indicate that the // latest version of a particular file should be added to the classpath. // E.g., commons-fileupload-%latest%.jar would resolve to something like // commons-fileupload-1.1.jar. private final static Pattern latestVersionPattern = Pattern.compile( "(%latest%)" ); // Set debug mode for each file resolver instance based on whether or // not the system was started with debugging turned on. private static boolean _debug = Boolean.getBoolean("exist.start.debug"); /** * If the passed file name contains a %latest% token, * find the latest version of that file. Otherwise, return * the passed file name unmodified. * * @param filename Path relative to exist home dir of * a jar file that should be added to the classpath. */ public String getResolvedFileName(String filename) { Matcher matches = latestVersionPattern.matcher(filename); if (!matches.find()) { return filename; } String[] fileinfo = filename.split("%latest%"); // Path of file up to the beginning of the %latest% token. String uptoToken = fileinfo[0]; // Dir that should contain our jar. String containerDirName = uptoToken.substring( 0, uptoToken.lastIndexOf(File.separatorChar) ); File containerDir = new File(containerDirName); // 0-9 . - and _ are valid chars that can occur where the %latest% token // was (maybe allow letters too?). String patternString = uptoToken.substring( uptoToken.lastIndexOf(File.separatorChar) + 1 ) + "([\\d\\.\\-_]+)" + fileinfo[1]; final Pattern pattern = Pattern.compile(patternString); File[] jars = containerDir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { Matcher matches = pattern.matcher(name); return matches.find(); } }); if(jars==null){ System.err.println("ERROR: No jars found in "+containerDir.getAbsolutePath()); } else if (jars.length > 0) { String actualFileName = jars[0].getAbsolutePath(); if (_debug) { System.err.println( "Found match: " + actualFileName + " for jar file pattern: " + filename ); } return actualFileName; } else { if (_debug) { System.err.println( "WARN: No latest version found for JAR file: '" + filename + "'" ); } } return filename; } }