serposcope.controllers.admin.AdminController.java Source code

Java tutorial

Introduction

Here is the source code for serposcope.controllers.admin.AdminController.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.serphacker.serposcope.db.base.BaseDB;
import com.serphacker.serposcope.db.base.ExportDB;
import com.serphacker.serposcope.models.base.User;
import conf.SerposcopeConf;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import ninja.AuthenticityFilter;
import ninja.Context;
import ninja.FilterWith;
import ninja.Result;
import ninja.Results;
import ninja.Router;
import ninja.params.Param;
import ninja.session.FlashScope;
import ninja.uploads.DiskFileItemProvider;
import ninja.uploads.FileItem;
import ninja.uploads.FileProvider;
import ninja.uploads.MemoryFileItemProvider;
import ninja.utils.ResponseStreams;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileUploadException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import serposcope.controllers.BaseController;
import serposcope.filters.AdminFilter;
import serposcope.filters.XSRFFilter;
import serposcope.helpers.Validator;

@FilterWith(AdminFilter.class)
@Singleton
public class AdminController extends BaseController {

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

    @Inject
    SerposcopeConf conf;

    @Inject
    Router router;

    @Inject
    ExportDB exportDB;

    public Result admin() {
        return Results.ok();
    }

    public Result sysconfig() {

        StringBuilder builder = new StringBuilder(conf.dumpEnv());

        Properties props = System.getProperties();
        for (Map.Entry<Object, Object> entry : props.entrySet()) {
            builder.append(entry.getKey()).append("=").append(entry.getValue()).append("\n");
        }

        return Results.ok().text().render(builder.toString());
    }

    public Result stackdump(Context context) {

        return Results.contentType("text/plain").render((ctx, res) -> {
            ResponseStreams responseStreams = context.finalizeHeaders(res);
            try (PrintWriter writer = new PrintWriter(responseStreams.getOutputStream());) {
                final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
                final ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100);
                for (ThreadInfo threadInfo : threadInfos) {
                    writer.append('"');
                    writer.append(threadInfo.getThreadName());
                    writer.append("\" ");
                    final Thread.State state = threadInfo.getThreadState();
                    writer.append("\n   java.lang.Thread.State: ");
                    writer.append(state.toString());
                    final StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();
                    for (final StackTraceElement stackTraceElement : stackTraceElements) {
                        writer.append("\n        at ");
                        writer.append(stackTraceElement.toString());
                    }
                    writer.println("\n");
                }
            } catch (IOException ex) {
                LOG.error("stackdump", ex);
            }
        });
    }

    @FilterWith(XSRFFilter.class)
    public Result exportSQL(Context context) {
        return Results.contentType("application/octet-stream")
                .addHeader("Content-Disposition", "attachment; filename=\"export-utf8.sql.gz\"")
                .render((ctx, res) -> {
                    ResponseStreams responseStreams = context.finalizeHeaders(res);
                    try (GZIPOutputStream gzos = new GZIPOutputStream(responseStreams.getOutputStream());
                            OutputStreamWriter osw = new OutputStreamWriter(gzos, StandardCharsets.UTF_8);
                            Writer writer = new PrintWriter(osw);) {
                        exportDB.export(writer);
                    } catch (IOException ex) {
                        LOG.error("export dl ex", ex);
                    }
                });
    }

    @FileProvider(DiskFileItemProvider.class)
    @FilterWith(XSRFFilter.class)
    public Result importSQL(Context context, @Param("dump") FileItem fileItem)
            throws FileUploadException, IOException {
        FlashScope flash = context.getFlashScope();

        if (fileItem == null) {
            flash.error("error.noFileUploaded");
            return Results.redirect(router.getReverseRoute(AdminController.class, "admin"));
        }

        try {
            InputStream is = fileItem.getInputStream();
            if (fileItem.getFileName().endsWith(".gz")) {
                is = new GZIPInputStream(is);
            }

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
                exportDB.importStream(reader);
            }
        } catch (Exception ex) {
            LOG.error("SQL import error", ex);
            flash.error("error.internalError");
            return Results.redirect(router.getReverseRoute(AdminController.class, "admin"));
        }

        flash.success("admin.menu.importSuccessful");
        return Results.redirect(router.getReverseRoute(AdminController.class, "admin"));
    }

}