suspect-manager: some fixes
This commit is contained in:
parent
6bf782bc14
commit
a61ebef90a
1 changed files with 61 additions and 28 deletions
|
@ -24,7 +24,11 @@ public class SuspectManager extends Thread
|
||||||
|
|
||||||
private static String formatAge( File f )
|
private static String formatAge( File f )
|
||||||
{
|
{
|
||||||
long age = System.currentTimeMillis() - f.lastModified();
|
return formatAge( System.currentTimeMillis() - f.lastModified() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String formatAge( long age )
|
||||||
|
{
|
||||||
long minutes = age / 60000;
|
long minutes = age / 60000;
|
||||||
if ( minutes < 60 )
|
if ( minutes < 60 )
|
||||||
{
|
{
|
||||||
|
@ -67,7 +71,7 @@ public class SuspectManager extends Thread
|
||||||
while ( tk.hasMoreTokens() )
|
while ( tk.hasMoreTokens() )
|
||||||
{
|
{
|
||||||
String c = tk.nextToken();
|
String c = tk.nextToken();
|
||||||
if ( "all".equals( c ) || "new".equals( c ) )
|
if ( "all".equals( c ) || "new".equals( c ) || "confirmed".equals( c ) )
|
||||||
{
|
{
|
||||||
filter = c;
|
filter = c;
|
||||||
break;
|
break;
|
||||||
|
@ -93,6 +97,7 @@ public class SuspectManager extends Thread
|
||||||
{
|
{
|
||||||
String url2 = "/brouter/suspects" + country + "/" + c;
|
String url2 = "/brouter/suspects" + country + "/" + c;
|
||||||
String linkNew = "<td> <a href=\"" + url2 + "/new\">new</a> </td>";
|
String linkNew = "<td> <a href=\"" + url2 + "/new\">new</a> </td>";
|
||||||
|
String linkCnf = "<td> <a href=\"" + url2 + "/confirmed\">confirmed</a> </td>";
|
||||||
String linkAll = "<td> <a href=\"" + url2 + "/all\">all</a> </td>";
|
String linkAll = "<td> <a href=\"" + url2 + "/all\">all</a> </td>";
|
||||||
|
|
||||||
String linkSub = "";
|
String linkSub = "";
|
||||||
|
@ -100,7 +105,7 @@ public class SuspectManager extends Thread
|
||||||
{
|
{
|
||||||
linkSub = "<td> <a href=\"" + url2 + "\">sub-regions</a> </td>";
|
linkSub = "<td> <a href=\"" + url2 + "\">sub-regions</a> </td>";
|
||||||
}
|
}
|
||||||
bw.write( "<tr><td>" + c + "</td>" + linkNew + linkAll + linkSub + "\n" );
|
bw.write( "<tr><td>" + c + "</td>" + linkNew + linkCnf + linkAll + linkSub + "\n" );
|
||||||
}
|
}
|
||||||
bw.write( "</table>\n" );
|
bw.write( "</table>\n" );
|
||||||
bw.write( "</body></html>\n" );
|
bw.write( "</body></html>\n" );
|
||||||
|
@ -127,6 +132,7 @@ public class SuspectManager extends Thread
|
||||||
bw.flush();
|
bw.flush();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
SuspectList suspects = getAllSuspects( suspectFile );
|
||||||
|
|
||||||
boolean showWatchList = false;
|
boolean showWatchList = false;
|
||||||
if ( tk.hasMoreTokens() )
|
if ( tk.hasMoreTokens() )
|
||||||
|
@ -146,8 +152,9 @@ public class SuspectManager extends Thread
|
||||||
{
|
{
|
||||||
bw.write( "watchlist for " + country + "\n" );
|
bw.write( "watchlist for " + country + "\n" );
|
||||||
bw.write( "<br><a href=\"/brouter/suspects\">back to country list</a><br><br>\n" );
|
bw.write( "<br><a href=\"/brouter/suspects\">back to country list</a><br><br>\n" );
|
||||||
|
|
||||||
|
long timeNow = System.currentTimeMillis();
|
||||||
|
|
||||||
SuspectList suspects = getAllSuspects( suspectFile );
|
|
||||||
for( int isuspect = 0; isuspect<suspects.cnt; isuspect++ )
|
for( int isuspect = 0; isuspect<suspects.cnt; isuspect++ )
|
||||||
{
|
{
|
||||||
id = suspects.ids[isuspect];
|
id = suspects.ids[isuspect];
|
||||||
|
@ -160,22 +167,33 @@ public class SuspectManager extends Thread
|
||||||
{
|
{
|
||||||
continue; // known false positive
|
continue; // known false positive
|
||||||
}
|
}
|
||||||
File confirmedEntry = new File( "confirmednegatives/" + id );
|
File fixedEntry = new File( "fixedsuspects/" + id );
|
||||||
if ( !( isFixed( id, suspectFile ) && confirmedEntry.exists() ) )
|
if ( !fixedEntry.exists() )
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
long age = System.currentTimeMillis() - confirmedEntry.lastModified();
|
long fixedTs = fixedEntry.lastModified();
|
||||||
if ( age / 1000 < 3600 * 24 * 8 )
|
if ( fixedTs < suspects.timestamp )
|
||||||
{
|
{
|
||||||
continue;
|
continue; // that would be under current suspects
|
||||||
|
}
|
||||||
|
long hideTime = fixedTs - timeNow;
|
||||||
|
if ( hideTime < 0 )
|
||||||
|
{
|
||||||
|
File confirmedEntry = new File( "confirmednegatives/" + id );
|
||||||
|
if ( confirmedEntry.exists() && confirmedEntry.lastModified() > suspects.timestamp )
|
||||||
|
{
|
||||||
|
continue; // that would be under current suspects
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( !polygon.isInArea( id ) )
|
if ( !polygon.isInArea( id ) )
|
||||||
{
|
{
|
||||||
continue; // not in selected polygon
|
continue; // not in selected polygon
|
||||||
}
|
}
|
||||||
|
|
||||||
String countryId = country + "/" + filter + "/" + id;
|
String countryId = country + "/" + filter + "/" + id;
|
||||||
String hint = " confirmed " + formatAge( confirmedEntry ) + " ago";
|
String dueTime = hideTime < 0 ? "(asap)" : formatAge( hideTime + 43200000 );
|
||||||
|
String hint = " due in " + dueTime;
|
||||||
int ilon = (int) ( id >> 32 );
|
int ilon = (int) ( id >> 32 );
|
||||||
int ilat = (int) ( id & 0xffffffff );
|
int ilat = (int) ( id & 0xffffffff );
|
||||||
double dlon = ( ilon - 180000000 ) / 1000000.;
|
double dlon = ( ilon - 180000000 ) / 1000000.;
|
||||||
|
@ -230,8 +248,15 @@ public class SuspectManager extends Thread
|
||||||
if ( tk.hasMoreTokens() )
|
if ( tk.hasMoreTokens() )
|
||||||
{
|
{
|
||||||
String param = tk.nextToken();
|
String param = tk.nextToken();
|
||||||
hideDays = Integer.parseInt( param );
|
hideDays = Integer.parseInt( param ); // hiding, not fixing
|
||||||
fixedMarker.setLastModified( System.currentTimeMillis() + hideDays*86400000L );
|
}
|
||||||
|
else // touch the confirmed entry when marking fixed
|
||||||
|
{
|
||||||
|
File confirmedEntry = new File( "confirmednegatives/" + id );
|
||||||
|
if ( confirmedEntry.exists() )
|
||||||
|
{
|
||||||
|
confirmedEntry.setLastModified( System.currentTimeMillis() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fixedMarker.setLastModified( System.currentTimeMillis() + hideDays*86400000L );
|
fixedMarker.setLastModified( System.currentTimeMillis() + hideDays*86400000L );
|
||||||
}
|
}
|
||||||
|
@ -271,7 +296,7 @@ public class SuspectManager extends Thread
|
||||||
String url4a = "https://overpass-turbo.eu/?Q=[date:"" + formatZ( weekAgo ) + "Z"];way[highway]({{bbox}});out meta geom;&C="
|
String url4a = "https://overpass-turbo.eu/?Q=[date:"" + formatZ( weekAgo ) + "Z"];way[highway]({{bbox}});out meta geom;&C="
|
||||||
+ dlat + ";" + dlon + ";18&R";
|
+ dlat + ";" + dlon + ";18&R";
|
||||||
|
|
||||||
String url4b = "https://overpass-turbo.eu/?Q=(node(around%3A1%2C%7B%7Bcenter%7D%7D)-%3E.n%3Bway(bn.n)%3Brel(bn.n%3A%22via%22)%5Btype%3Drestriction%5D%3B)%3Bout%20meta%3B%3E%3Bout%20skel%20qt%3B&C="
|
String url4b = "https://overpass-turbo.eu/?Q=(node(around%3A1%2C%7B%7Bcenter%7D%7D)-%3E.n%3Bway(bn.n)%5Bhighway%5D%3Brel(bn.n%3A%22via%22)%5Btype%3Drestriction%5D%3B)%3Bout%20meta%3B%3E%3Bout%20skel%20qt%3B&C="
|
||||||
+ dlat + ";" + dlon + ";18&R";
|
+ dlat + ";" + dlon + ";18&R";
|
||||||
|
|
||||||
String url5 = "https://tyrasd.github.io/latest-changes/#16/" + dlat + "/" + dlon;
|
String url5 = "https://tyrasd.github.io/latest-changes/#16/" + dlat + "/" + dlon;
|
||||||
|
@ -286,7 +311,7 @@ public class SuspectManager extends Thread
|
||||||
bw.write( "Overpass: <a href=\"" + url4a + "\">minus one week</a> <a href=\"" + url4b + "\">node context</a><br><br>\n" );
|
bw.write( "Overpass: <a href=\"" + url4a + "\">minus one week</a> <a href=\"" + url4b + "\">node context</a><br><br>\n" );
|
||||||
bw.write( "<a href=\"" + url5 + "\">Open in Latest-Changes / last week</a><br><br>\n" );
|
bw.write( "<a href=\"" + url5 + "\">Open in Latest-Changes / last week</a><br><br>\n" );
|
||||||
bw.write( "<br>\n" );
|
bw.write( "<br>\n" );
|
||||||
if ( isFixed( id, suspectFile ) )
|
if ( isFixed( id, suspects.timestamp ) )
|
||||||
{
|
{
|
||||||
bw.write( "<br><br><a href=\"/brouter/suspects/" + country + "/" + filter + "/watchlist\">back to watchlist</a><br><br>\n" );
|
bw.write( "<br><br><a href=\"/brouter/suspects/" + country + "/" + filter + "/watchlist\">back to watchlist</a><br><br>\n" );
|
||||||
}
|
}
|
||||||
|
@ -299,11 +324,17 @@ public class SuspectManager extends Thread
|
||||||
String prefix = "<a href=\"/brouter/suspects" + countryId + "/fixed";
|
String prefix = "<a href=\"/brouter/suspects" + countryId + "/fixed";
|
||||||
String prefix2 = " " + prefix;
|
String prefix2 = " " + prefix;
|
||||||
bw.write( prefix + "\">mark as fixed</a><br><br>\n" );
|
bw.write( prefix + "\">mark as fixed</a><br><br>\n" );
|
||||||
bw.write( "hide for " );
|
bw.write( "hide for: weeks:" );
|
||||||
bw.write( prefix2 + "/7\">1 week</a>" );
|
bw.write( prefix2 + "/7\">1w</a>" );
|
||||||
bw.write( prefix2 + "/30\">1 month</a>" );
|
bw.write( prefix2 + "/14\">2w</a>" );
|
||||||
bw.write( prefix2 + "/91\">3 months</a>" );
|
bw.write( prefix2 + "/21\">3w</a>" );
|
||||||
bw.write( prefix2 + "/182\">6 months</a><br><br>\n" );
|
bw.write( " months:" );
|
||||||
|
bw.write( prefix2 + "/30\">1m</a>" );
|
||||||
|
bw.write( prefix2 + "/61\">2m</a>" );
|
||||||
|
bw.write( prefix2 + "/91\">3m</a>" );
|
||||||
|
bw.write( prefix2 + "/122\">4m</a>" );
|
||||||
|
bw.write( prefix2 + "/152\">5m</a>" );
|
||||||
|
bw.write( prefix2 + "/183\">6m</a><br><br>\n" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -319,7 +350,6 @@ public class SuspectManager extends Thread
|
||||||
bw.write( "<br><a href=\"/brouter/suspects\">back to country list</a><br><br>\n" );
|
bw.write( "<br><a href=\"/brouter/suspects\">back to country list</a><br><br>\n" );
|
||||||
int maxprio = 0;
|
int maxprio = 0;
|
||||||
{
|
{
|
||||||
SuspectList suspects = getAllSuspects( suspectFile );
|
|
||||||
for( int isuspect = 0; isuspect<suspects.cnt; isuspect++ )
|
for( int isuspect = 0; isuspect<suspects.cnt; isuspect++ )
|
||||||
{
|
{
|
||||||
id = suspects.ids[isuspect];
|
id = suspects.ids[isuspect];
|
||||||
|
@ -341,7 +371,7 @@ public class SuspectManager extends Thread
|
||||||
{
|
{
|
||||||
continue; // known false positive
|
continue; // known false positive
|
||||||
}
|
}
|
||||||
if ( isFixed( id, suspectFile ) )
|
if ( isFixed( id, suspects.timestamp ) )
|
||||||
{
|
{
|
||||||
continue; // known fixed
|
continue; // known fixed
|
||||||
}
|
}
|
||||||
|
@ -349,6 +379,10 @@ public class SuspectManager extends Thread
|
||||||
{
|
{
|
||||||
continue; // known archived
|
continue; // known archived
|
||||||
}
|
}
|
||||||
|
if ( "confirmed".equals( filter ) && !new File( "confirmednegatives/" + id ).exists() )
|
||||||
|
{
|
||||||
|
continue; // showing confirmed suspects only
|
||||||
|
}
|
||||||
if ( !polygon.isInArea( id ) )
|
if ( !polygon.isInArea( id ) )
|
||||||
{
|
{
|
||||||
continue; // not in selected polygon
|
continue; // not in selected polygon
|
||||||
|
@ -380,10 +414,10 @@ public class SuspectManager extends Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static boolean isFixed( long id, File suspectFile )
|
private static boolean isFixed( long id, long timestamp )
|
||||||
{
|
{
|
||||||
File fixedEntry = new File( "fixedsuspects/" + id );
|
File fixedEntry = new File( "fixedsuspects/" + id );
|
||||||
return fixedEntry.exists() && fixedEntry.lastModified() > suspectFile.lastModified();
|
return fixedEntry.exists() && fixedEntry.lastModified() > timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -392,8 +426,9 @@ public class SuspectManager extends Thread
|
||||||
int cnt;
|
int cnt;
|
||||||
long[] ids;
|
long[] ids;
|
||||||
int[] prios;
|
int[] prios;
|
||||||
|
long timestamp;
|
||||||
|
|
||||||
SuspectList( int count )
|
SuspectList( int count, long time )
|
||||||
{
|
{
|
||||||
cnt = count;
|
cnt = count;
|
||||||
ids = new long[cnt];
|
ids = new long[cnt];
|
||||||
|
@ -403,17 +438,15 @@ public class SuspectManager extends Thread
|
||||||
|
|
||||||
private static SuspectList allSuspects;
|
private static SuspectList allSuspects;
|
||||||
private static Object allSuspectsSync = new Object();
|
private static Object allSuspectsSync = new Object();
|
||||||
private static long allSuspectsTimestamp;
|
|
||||||
|
|
||||||
private static SuspectList getAllSuspects( File suspectFile ) throws IOException
|
private static SuspectList getAllSuspects( File suspectFile ) throws IOException
|
||||||
{
|
{
|
||||||
synchronized( allSuspectsSync )
|
synchronized( allSuspectsSync )
|
||||||
{
|
{
|
||||||
if ( suspectFile.lastModified() == allSuspectsTimestamp )
|
if ( allSuspects != null && suspectFile.lastModified() == allSuspects.timestamp )
|
||||||
{
|
{
|
||||||
return allSuspects;
|
return allSuspects;
|
||||||
}
|
}
|
||||||
allSuspectsTimestamp = suspectFile.lastModified();
|
|
||||||
|
|
||||||
// count prios
|
// count prios
|
||||||
int[] prioCount = new int[100];
|
int[] prioCount = new int[100];
|
||||||
|
@ -440,7 +473,7 @@ public class SuspectManager extends Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort into suspect list
|
// sort into suspect list
|
||||||
allSuspects = new SuspectList( pointer );
|
allSuspects = new SuspectList( pointer, suspectFile.lastModified() );
|
||||||
r = new BufferedReader( new FileReader( suspectFile ) );
|
r = new BufferedReader( new FileReader( suspectFile ) );
|
||||||
for ( ;; )
|
for ( ;; )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue