/*
* JBoss, Home of Professional Open Source
* Copyright 2010-2016, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This 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.1 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.tests.qa.plugin.ensurer.browser.jenkins;
import java.io.File;
import java.io.FileFilter;
import java.util.PriorityQueue;
import org.richfaces.tests.qa.plugin.utils.Version;
/**
* @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
*/
public class SimpleJenkinsFirefoxDirectoryFinder implements JenkinsFirefoxDirectoryFinder {
private boolean containsFirefoxBin(File[] files) {
boolean isOnMac = System.getProperty("os.name").toLowerCase().contains("mac");
if (files != null) {
if (isOnMac) {
for (File file : files) {
if (file.getName().contains("Contents")) {
File[] listFiles = file.listFiles(new FilenameEqualsFilter("MacOS"));
if (listFiles == null || listFiles.length != 1) {
return false;
}
File f = listFiles[0];
if (f != null) {
listFiles = f.listFiles(new FilenameEqualsFilter("firefox"));
return !(listFiles == null || listFiles.length != 1);
}
}
}
} else {
for (File file : files) {
if (!file.isDirectory()) {
if (file.getName().equals("firefox") || file.getName().equals("firefox.exe")) {
return true;
}
}
}
}
}
return false;
}
@Override
public File getHighestOrSpecificVersion(File[] files, Version version) {
File highestVersion = getHighestVersion(files);
File specificVersion = getSpecificVersion(files, version);
if (specificVersion == null) {
return highestVersion;
} else if (highestVersion == null) {
return specificVersion;
} else if (VersionedFirefoxDirectory.parseVersion(highestVersion).compareTo(VersionedFirefoxDirectory.parseVersion(specificVersion)) > 0) {
return highestVersion;
}
return specificVersion;
}
@Override
public File getHighestVersion(File[] files) {
PriorityQueue<VersionedFirefoxDirectory> p = new PriorityQueue<VersionedFirefoxDirectory>();
for (File file : files) {
if (isFileMatching(file)) {
p.add(new VersionedFirefoxDirectory(file));
}
}
if (p.isEmpty()) {
return null;
}
return p.peek().getFile();
}
@Override
public File getOptimalOrMinimalVersion(File[] files, Version versionOptimal, Version versionMinimal) {
File f = getSpecificVersion(files, versionOptimal);
if (f == null) {
return getSpecificVersion(files, versionMinimal);
}
return f;
}
@Override
public File getSpecificVersion(File[] files, Version version) {
for (File file : files) {
if (isFileMatching(file)) {
if (VersionedFirefoxDirectory.parseVersion(file).equals(version)) {
return file;
}
}
}
return null;
}
@Override
public File getSpecificVersionOrHighest(File[] files, Version version) {
File f = getSpecificVersion(files, version);
if (f == null) {
return getHighestVersion(files);
}
return f;
}
private boolean isFileMatching(File f) {
return f.isDirectory() && f.getName().matches("firefox-\\d{1,2}(.*)?") && containsFirefoxBin(f.listFiles());
}
private static class FilenameEqualsFilter implements FileFilter {
private final String fileName;
private FilenameEqualsFilter(String fileName) {
this.fileName = fileName;
}
@Override
public boolean accept(File file) {
return file.getName().equals(fileName);
}
}
private static class VersionedFirefoxDirectory implements Comparable<VersionedFirefoxDirectory> {
private final File file;
private final Version version;
public VersionedFirefoxDirectory(File f) {
file = f;
version = parseVersion(f);
}
public static Version parseVersion(File f) {
return Version.parseVersion(f.getName());
}
@Override
public int compareTo(VersionedFirefoxDirectory t) {
return t.getVersion().compareTo(getVersion());
}
public File getFile() {
return file;
}
public Version getVersion() {
return version;
}
@Override
public String toString() {
return "VersionedFile{" + "file=" + file + ", version=" + version + '}';
}
}
}