X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2FdbObjects%2FDomainPingConfiguration.java;h=4c4931f5a13280c814d05667279a8b8fb892b3a9;hb=0dbbc40ce4e48c40e08ab43f6e5a02441ed6c90c;hp=a031b9e48f14b3b4e651966f22616d625ad8bfde;hpb=76e3ad5851967bea57005ec9858625d4a7071d7c;p=gigi.git diff --git a/src/org/cacert/gigi/dbObjects/DomainPingConfiguration.java b/src/org/cacert/gigi/dbObjects/DomainPingConfiguration.java index a031b9e4..4c4931f5 100644 --- a/src/org/cacert/gigi/dbObjects/DomainPingConfiguration.java +++ b/src/org/cacert/gigi/dbObjects/DomainPingConfiguration.java @@ -1,10 +1,17 @@ package org.cacert.gigi.dbObjects; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import org.cacert.gigi.Gigi; +import org.cacert.gigi.GigiApiException; import org.cacert.gigi.database.DatabaseConnection; +import org.cacert.gigi.database.GigiPreparedStatement; +import org.cacert.gigi.database.GigiResultSet; +import org.cacert.gigi.output.template.Scope; +import org.cacert.gigi.output.template.SprintfCommand; public class DomainPingConfiguration implements IdCachable { @@ -12,19 +19,19 @@ public class DomainPingConfiguration implements IdCachable { EMAIL, DNS, HTTP, SSL; } - int id; + private int id; - Domain target; + private Domain target; - PingType type; + private PingType type; - String info; + private String info; - private DomainPingConfiguration(int id) throws SQLException { - PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT id, domainid, type, info FROM pingconfig WHERE id=?"); + private DomainPingConfiguration(int id) { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `id`, `domainid`, `type`, `info` FROM `pingconfig` WHERE `id`=?"); ps.setInt(1, id); - ResultSet rs = ps.executeQuery(); + GigiResultSet rs = ps.executeQuery(); if ( !rs.next()) { throw new IllegalArgumentException("Invalid pingconfig id " + id); } @@ -53,16 +60,42 @@ public class DomainPingConfiguration implements IdCachable { private static ObjectCache cache = new ObjectCache<>(); - public static DomainPingConfiguration getById(int id) { + public static synchronized DomainPingConfiguration getById(int id) { DomainPingConfiguration res = cache.get(id); if (res == null) { - try { - cache.put(res = new DomainPingConfiguration(id)); - } catch (SQLException e) { - throw new IllegalArgumentException(e); - } + cache.put(res = new DomainPingConfiguration(id)); } return res; } + public Date getLastExecution() { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `when` AS stamp from `domainPinglog` WHERE `configId`=? ORDER BY `when` DESC LIMIT 1"); + ps.setInt(1, id); + GigiResultSet rs = ps.executeQuery(); + if (rs.next()) { + return new Date(rs.getTimestamp("stamp").getTime()); + } + return new Date(0); + } + + public Date getLastSuccess() { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `when` AS stamp from `domainPinglog` WHERE `configId`=? AND state='success' ORDER BY `when` DESC LIMIT 1"); + ps.setInt(1, id); + GigiResultSet rs = ps.executeQuery(); + if (rs.next()) { + return new Date(rs.getTimestamp("stamp").getTime()); + } + return new Date(0); + } + + public synchronized void requestReping() throws GigiApiException { + Date lastExecution = getLastExecution(); + if (lastExecution.getTime() + 5 * 60 * 1000 < System.currentTimeMillis()) { + Gigi.notifyPinger(this); + return; + } + Map data = new HashMap(); + data.put("data", new Date(lastExecution.getTime() + 5 * 60 * 1000)); + throw new GigiApiException(new Scope(new SprintfCommand("Reping is only allowed after 5 minutes, yours end at {0}.", Arrays.asList("${data}")), data)); + } }