package tv.dyndns.kishibe.qmaclone.server.image;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketImageLink;
import tv.dyndns.kishibe.qmaclone.server.Injectors;
import tv.dyndns.kishibe.qmaclone.server.database.Database;
import tv.dyndns.kishibe.qmaclone.server.database.DatabaseException;
public class BrokenImageLinkDetector implements Runnable {
private static final Logger logger = Logger.getLogger(BrokenImageLinkDetector.class.toString());
private final ImageLinkChecker.Factory imageLinkCheckerFactory;
private final Database database;
private volatile List<PacketImageLink> brokenImageLinks = Lists.newArrayList();
public static boolean SKIP_HOST_CHECK_FOR_TESTING = false;
@Inject
public BrokenImageLinkDetector(ImageLinkChecker.Factory imageLinkCheckerFactory,
Database database) {
this.imageLinkCheckerFactory = Preconditions.checkNotNull(imageLinkCheckerFactory);
this.database = Preconditions.checkNotNull(database);
}
@Override
public void run() {
String hostName = null;
try {
hostName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
logger.log(Level.WARNING, "ホスト名の取得に失敗しました");
}
if (!SKIP_HOST_CHECK_FOR_TESTING && "nighthawk".equals(hostName)) {
logger.log(Level.INFO, "デバッグ実行のためリンク切れ画像の検出を行いませんでした");
return;
}
try {
runInternal();
} catch (Exception e) {
logger.log(Level.WARNING, "画像リンク切れ検出中に予期せぬエラーが発生しました", e);
}
}
private void runInternal() {
logger.info("リンク切れ画像の検出を開始しました");
ImageLinkChecker imageLinkChecker = imageLinkCheckerFactory.create();
try {
database.processProblems(imageLinkChecker);
} catch (DatabaseException e) {
logger.log(Level.WARNING, "リンク切れ画像の検出に失敗しました", e);
return;
}
logger.info("データベースの精査が終わりました");
List<PacketImageLink> imageLinks = imageLinkChecker.getImageLinks();
logger.info("リンク切れ画像リストを取得しました");
Collections.sort(imageLinks);
logger.info("リンク切れ画像リストをソートしました");
this.brokenImageLinks = imageLinks;
logger.info("リンク切れ画像の検出を終了しました: |imageLinks|=" + imageLinks.size());
}
public List<PacketImageLink> getBrokenImageLinks() {
return brokenImageLinks;
}
public static void main(String[] args) throws DatabaseException {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
logger.log(Level.SEVERE, "Handled uncaught exception: " + t, e);
System.exit(-1);
}
});
BrokenImageLinkDetector brokenImageLinkDetector = Injectors.get()
.getInstance(BrokenImageLinkDetector.class);
brokenImageLinkDetector.run();
System.exit(0);
}
}