serposcope.controllers.admin.DebugController.java Source code

Java tutorial

Introduction

Here is the source code for serposcope.controllers.admin.DebugController.java

Source

/* 
 * Serposcope - SEO rank checker https://serposcope.serphacker.com/
 * 
 * Copyright (c) 2016 SERP Hacker
 * @author Pierre Nogues <support@serphacker.com>
 * @license https://opensource.org/licenses/MIT MIT License
 */
package serposcope.controllers.admin;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.p6spy.engine.spy.P6DataSource;
import com.serphacker.serposcope.db.base.BaseDB;
import com.serphacker.serposcope.db.google.GoogleDB;
import com.serphacker.serposcope.models.base.Group;
import com.serphacker.serposcope.models.base.Group.Module;
import com.serphacker.serposcope.models.base.Run;
import com.serphacker.serposcope.models.google.GoogleSettings;
import com.serphacker.serposcope.models.google.GoogleSearch;
import com.serphacker.serposcope.models.google.GoogleTarget;
import com.serphacker.serposcope.models.google.GoogleTarget.PatternType;
import com.serphacker.serposcope.task.TaskManager;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import ninja.Context;
import ninja.Filter;
import ninja.FilterChain;
import ninja.FilterWith;
import ninja.Result;
import ninja.Results;
import ninja.Router;
import ninja.i18n.Messages;
import ninja.params.Param;
import ninja.session.FlashScope;
import ninja.utils.NinjaProperties;
import org.apache.commons.lang3.time.DurationFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import serposcope.controllers.AuthController;
import serposcope.controllers.BaseController;
import serposcope.controllers.admin.DebugController.DebugFilter;
import serposcope.filters.AdminFilter;
import serposcope.filters.XSRFFilter;

@FilterWith({ AdminFilter.class, DebugFilter.class })
@Singleton
public class DebugController extends BaseController {

    public static class DebugFilter implements Filter {

        @Inject
        NinjaProperties props;

        @Inject
        Router router;

        @Override
        public Result filter(FilterChain filterChain, Context context) {

            if (props.isProd()) {
                context.getFlashScope().error("error.unauthorizedAccess");
                return Results.redirect(router.getReverseRoute(AuthController.class, "login"));
            }

            return filterChain.next(context);
        }

    }

    private static final Logger LOG = LoggerFactory.getLogger(DebugController.class);

    @Inject
    GoogleDB googleDB;

    @Inject
    BaseDB baseDB;

    @Inject
    Router router;

    @Inject
    TaskManager taskManager;

    @Inject
    Messages msg;

    public Result debug(Context context) {

        return Results.ok()
        //            .render("f_warning",msg.get("test.translate", context, Optional.absent(),12l).or(""))
        ;
    }

    @FilterWith(XSRFFilter.class)
    public Result wipeRankings(Context context) {
        FlashScope flash = context.getFlashScope();

        googleDB.targetSummary.wipe();
        googleDB.rank.wipe();
        googleDB.serp.wipe();
        baseDB.run.wipe();

        flash.put("warning", "admin.debug.rankingsWiped");
        return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
    }

    @FilterWith(XSRFFilter.class)
    public Result wipeGroups(Context context) {
        FlashScope flash = context.getFlashScope();

        googleDB.targetSummary.wipe();
        googleDB.rank.wipe();
        googleDB.serp.wipe();
        baseDB.run.wipe();

        googleDB.target.wipe();
        googleDB.search.wipe();
        baseDB.event.wipe();
        baseDB.group.wipe();

        flash.put("warning", "admin.debug.groupsWiped");
        return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
    }

    @FilterWith(XSRFFilter.class)
    public Result generate(Context context, @Param("groups") Integer groups,
            @Param("searchPerGroup") Integer searchPerGroup, @Param("targetPerGroup") Integer targetPerGroup) {
        FlashScope flash = context.getFlashScope();

        if (groups == null || groups < 1 || searchPerGroup == null || searchPerGroup < 1 || targetPerGroup == null
                || targetPerGroup < 1) {
            flash.put("error", "error.invalidParameters");
            return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
        }

        for (int i = 0; i < groups; i++) {
            Group group = new Group(Group.Module.GOOGLE, "group#" + i);
            baseDB.group.insert(group);

            List<GoogleSearch> searches = new ArrayList<>();
            for (int j = 0; j < searchPerGroup; j++) {
                GoogleSearch search = new GoogleSearch("search#" + j + "#" + group.getName());
                search.setTld("com");
                searches.add(search);
            }
            googleDB.search.insert(searches, group.getId());

            List<GoogleTarget> targets = new ArrayList<>();
            for (int j = 0; j < targetPerGroup; j++) {
                int targetFakeId = j + 1;
                GoogleTarget target = new GoogleTarget(group.getId(),
                        "target#" + targetFakeId + "#" + group.getName(), PatternType.REGEX,
                        "^https?://www.site" + targetFakeId + ".com.+");
                targets.add(target);
            }
            googleDB.target.insert(targets);

        }

        flash.put("warning", "admin.debug.generated");
        return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
    }

    @FilterWith(XSRFFilter.class)
    public Result dryRun(Context context, @Param("startDate") String start, @Param("endDate") String end) {
        long _start = System.currentTimeMillis();
        FlashScope flash = context.getFlashScope();

        LocalDate startDate = null;
        LocalDate endDate = null;

        try {
            startDate = LocalDate.parse(start);
            endDate = LocalDate.parse(end);
        } catch (Exception ex) {
        }

        if (startDate == null || endDate == null || startDate.isAfter(endDate)) {
            flash.error("error.invalidDate");
            return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
        }

        Run lastRun = baseDB.run.findLast(Module.GOOGLE, null, null);
        if (lastRun != null && lastRun.getDay().isAfter(startDate)) {
            flash.error("error.invalidDate");
            return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
        }

        LocalDate date = LocalDate.from(startDate);

        GoogleSettings ggOptions = googleDB.options.get();

        int minPauseBetweenPageSec = ggOptions.getMinPauseBetweenPageSec();
        int maxPauseBetweenPageSec = ggOptions.getMaxPauseBetweenPageSec();
        ggOptions.setMinPauseBetweenPageSec(0);
        ggOptions.setMaxPauseBetweenPageSec(0);
        googleDB.options.update(ggOptions);

        try {
            while (date.isBefore(endDate)) {
                LOG.debug("dry run {}", date);
                if (!taskManager
                        .startGoogleTask(new Run(Run.Mode.MANUAL, Module.GOOGLE, date.atTime(13, 37, 00)))) {
                    LOG.error("can't startGoogleTask");
                    flash.error("can't startGoogleTask");
                    return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
                }
                taskManager.joinGoogleTask();
                date = date.plusDays(1);
            }
        } catch (Exception ex) {
            LOG.error("an error occured", ex);
            flash.error("an error occured");
            return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
        } finally {
            ggOptions.setMinPauseBetweenPageSec(minPauseBetweenPageSec);
            ggOptions.setMaxPauseBetweenPageSec(maxPauseBetweenPageSec);
            googleDB.options.update(ggOptions);
        }

        LOG.debug("dry run timing : {}",
                DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - _start));
        flash.success("ok");
        return Results.redirect(router.getReverseRoute(DebugController.class, "debug"));
    }

    @Inject
    DataSource ds;

    public Result test(@Param("query") String query) throws SQLException {
        long _start = System.currentTimeMillis();

        HikariDataSource hds = null;
        if (ds instanceof HikariDataSource) {
            hds = (HikariDataSource) ds;
        } else {
            hds = ((P6DataSource) ds).unwrap(HikariDataSource.class);
        }

        if (query != null) {
            //            try(Connection con = DriverManager.getConnection(hds.getJdbcUrl()); Statement stmt = con.createStatement() ){
            try (Connection con = ds.getConnection(); Statement stmt = con.createStatement()) {
                stmt.execute(query);
            }
        }

        String duration = DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - _start);

        LOG.info(duration);

        return Results.ok().text().render(duration);
    }

    public Result shutdown() {
        System.exit(0);
        return Results.ok();
    }

    @FilterWith(XSRFFilter.class)
    public Result dummyPost() {
        return Results.ok().text().render("dummyPost");
    }

}