/*
* Copyright (C) 2014 Indeed Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.indeed.imhotep.client;
import com.indeed.util.core.DataLoadingRunnable;
import com.indeed.util.io.Files;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author jsgroth
*/
public class FileHostsReloader extends DataLoadingRunnable implements HostsReloader {
private static final Logger log = Logger.getLogger(FileHostsReloader.class);
private final String hostsFile;
private volatile List<Host> hosts = Collections.emptyList();
public FileHostsReloader(String hostsFile) {
super("FileHostsReloader");
this.hostsFile = trimProtocol(hostsFile);
updateHosts();
}
private static String trimProtocol(String hostsFile) {
if (hostsFile.startsWith("file://")) {
return hostsFile.substring("file://".length());
}
return hostsFile;
}
@Override
public List<Host> getHosts() {
return hosts;
}
@Override
public boolean load() {
if (!updateHosts()) {
loadFailed();
return false;
}
return true;
}
@Override
public void shutdown() {
}
private boolean updateHosts() {
try {
final List<Host> newHosts = new ArrayList<Host>();
for (String line : Files.readTextFile(hostsFile)) {
if (line.startsWith("#")) continue;
final String[] splitLine = line.split(":", 2);
if (splitLine.length != 2) {
log.error("invalid host: "+line);
continue;
}
newHosts.add(new Host(splitLine[0], Integer.parseInt(splitLine[1])));
}
Collections.sort(newHosts);
log.info("reloaded hosts file, new list of hosts: "+newHosts);
if (!newHosts.equals(hosts)) {
hosts = newHosts;
}
return true;
} catch (Exception e) {
log.error("error loading hosts file", e);
return false;
}
}
}