at.alladin.rmbt.controlServer.ContextListener.java Source code

Java tutorial

Introduction

Here is the source code for at.alladin.rmbt.controlServer.ContextListener.java

Source

/*******************************************************************************
 * Copyright 2013-2015 alladin-IT GmbH
 * 
 * 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 at.alladin.rmbt.controlServer;

import java.net.InetAddress;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import at.alladin.rmbt.db.DbConnection;
import at.alladin.rmbt.shared.GeoIPHelper;
import at.alladin.rmbt.shared.RevisionHelper;

import com.google.common.net.InetAddresses;

public class ContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        scheduler.shutdownNow();
    }

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    @SuppressWarnings("unused")
    private void getGeoIPs() {
        scheduler.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("getting geoips");
                    final Connection conn = DbConnection.getConnection();

                    final boolean oldAutoCommitState = conn.getAutoCommit();
                    conn.setAutoCommit(false);
                    // allow update only 2min after test was started
                    final PreparedStatement psUpd = conn.prepareStatement(
                            "UPDATE test SET country_geoip=? WHERE uid=? and (now() - time  < interval '2' minute)");
                    final PreparedStatement ps = conn.prepareStatement(
                            "SELECT uid,client_public_ip FROM test WHERE client_public_ip IS NOT NULL AND country_geoip IS NULL");
                    ps.execute();
                    final ResultSet rs = ps.getResultSet();
                    int count = 0;
                    while (rs.next()) {
                        Thread.sleep(5);
                        count++;
                        if ((count % 1000) == 0)
                            System.out.println(count + " geoips updated");
                        final long uid = rs.getLong("uid");
                        final String ip = rs.getString("client_public_ip");
                        final InetAddress ia = InetAddresses.forString(ip);
                        final String country = GeoIPHelper.lookupCountry(ia);
                        if (country != null) {
                            psUpd.setString(1, country);
                            psUpd.setLong(2, uid);
                            psUpd.executeUpdate();
                        }
                    }
                    psUpd.close();
                    ps.close();
                    conn.commit();
                    conn.setAutoCommit(oldAutoCommitState);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("RMBTControlServer - " + RevisionHelper.getVerboseRevision());

        scheduler.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Cleaning IPs");
                    final Connection conn = DbConnection.getConnection();
                    //purge test table
                    PreparedStatement ps = conn.prepareStatement(
                            "UPDATE test SET client_public_ip = NULL, public_ip_rdns = NULL, source_ip = NULL, client_ip_local = NULL "
                                    + "WHERE time < NOW() - CAST('4 months' AS INTERVAL) "
                                    + "AND (client_public_ip IS NOT NULL OR public_ip_rdns IS NOT NULL OR source_ip IS NOT NULL OR client_ip_local IS NOT NULL)");
                    ps.executeUpdate();
                    ps.close();
                    //purge ndt table
                    ps = conn.prepareStatement(
                            "UPDATE test_ndt n SET main = NULL, stat = NULL, diag = NULL FROM test t "
                                    + "WHERE t.uid = n.test_id AND t.time < NOW() - CAST('4 months' AS INTERVAL) "
                                    + "AND (n.main IS NOT NULL OR n.stat IS NOT NULL OR n.diag IS NOT NULL)");
                    ps.executeUpdate();
                    ps.close();
                    //purge status table
                    ps = conn.prepareStatement("UPDATE status SET ip = NULL "
                            + "WHERE time < NOW() - CAST('4 months' AS INTERVAL) " + "AND (ip IS NOT NULL)");
                    ps.executeUpdate();
                    ps.close();

                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, 0, 24, TimeUnit.HOURS);
    }
}