package mobi.jenkinsci.server.upgrade;
import com.google.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import mobi.jenkinsci.commons.Account;
import mobi.jenkinsci.server.core.services.PluginLoader;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import mobi.jenkinsci.server.Config;
@Slf4j
public class UpgradeNodeFactory {
private final UpgradeConfig.Factory upgradeConfigFactory;
private final Config config;
private final PluginLoader pluginLoader;
@Inject
public UpgradeNodeFactory(UpgradeConfig.Factory upgradeConfigFactory, Config config, PluginLoader pluginLoader) {
this.upgradeConfigFactory = upgradeConfigFactory;
this.config = config;
this.pluginLoader = pluginLoader;
}
public UpgradeNode getAvailableUpgrade(final HttpServletRequest request,
final Account account) throws IOException {
final UpgradeConfig config = find(request, account);
if (config == null) {
return null;
} else {
return new UpgradeNode(config);
}
}
private UpgradeConfig find(final HttpServletRequest request,
final Account account) {
if (!config.getFile(Config.UPGRADE_CONFIG).exists()) {
return null;
}
final String userAgent = request.getHeader("User-Agent");
final Properties configProps = getUpgradeProperties();
final Enumeration<?> configNames = configProps.propertyNames();
while (configNames.hasMoreElements()) {
final String configName = ((String) configNames.nextElement());
final String[] configNameParts = configName.split("\\.");
if (configNameParts.length != 2) {
log.debug("Ignoring unknown property " + configName);
}
if (configNameParts[1].equalsIgnoreCase("match")) {
final String userAgentRegex = configProps.getProperty(configName);
log.debug("Checking upgrade config " + configName + " regex '"
+ userAgentRegex + "' against User-Agent:" + userAgent);
final Matcher matcher =
Pattern.compile(userAgentRegex).matcher(userAgent);
if (matcher.matches()) {
try {
return upgradeConfigFactory.get(configProps, configNameParts[0], account,
request);
} catch (final Exception e) {
log.warn("No upgrade available for User-Agent " + userAgentRegex, e);
return null;
}
}
}
}
return null;
}
private Properties getUpgradeProperties() {
final Properties configProps = new Properties();
FileReader configReader = null;
final File upgradeConfigFile = config.getFile(Config.UPGRADE_CONFIG);
try {
configReader = new FileReader(upgradeConfigFile);
} catch (final FileNotFoundException e1) {
return null;
}
try {
configProps.load(new FileReader(upgradeConfigFile));
} catch (final IOException e) {
log.error("Invalid upgrade configuration on " + upgradeConfigFile);
return null;
} finally {
try {
configReader.close();
} catch (final IOException e) {
}
}
return configProps;
}
}