All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.anadix.utils.AnadixSelenium Maven / Gradle / Ivy

The newest version!
package org.anadix.utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.anadix.Anadix;
import org.anadix.Analyzer;
import org.anadix.Report;
import org.anadix.ReportFormatter;
import org.anadix.Source;
import org.anadix.exceptions.SourceException;
import org.anadix.factories.SourceFactory;

import com.thoughtworks.selenium.CommandProcessor;
import com.thoughtworks.selenium.DefaultSelenium;

public class AnadixSelenium extends DefaultSelenium {
    private final List sources = new ArrayList();
    private final List reports = new ArrayList();
    private final List exceptions = new ArrayList();
    private File sourcesDir = new File("sources");
    private File reportsDir = new File("reports");
    private MultithreadedAnalyzer analyzer;

    public AnadixSelenium(CommandProcessor processor) {
        super(processor);
    }

    public AnadixSelenium(String serverHost, int serverPort, String browserStartCommand, String browserURL) {
        super(serverHost, serverPort, browserStartCommand, browserURL);
    }

    @Override
    public void click(String locator) {
        analyzeCurrentPage();
        super.click(locator);
    }

    @Override
    public void clickAt(String locator, String coordString) {
        analyzeCurrentPage();
        super.clickAt(locator, coordString);
    }

    @Override
    public void submit(String formLocator) {
        analyzeCurrentPage();
        super.submit(formLocator);
    }

    private void analyzeCurrentPage() {
        if (analyzer != null) {
            int id = analyzer.submittAnalysis(SourceFactory.newStringSource(getHtmlSource(), getTitle()));
            try {
                reports.add(analyzer.getResult(id));
            } catch (ResultException ex) {
                throw new RuntimeException("Error durring analysis", ex);
            }
        } else {
            File f = storeHtml(getSourcesDir(), getTitle(), getHtmlSource());
            try {
                sources.add(SourceFactory.newFileSource(f, false));
            } catch (SourceException ex) {
                throw new RuntimeException("Error during source creation", ex);
            }
        }
    }

    public void analyzeStoredPages() throws InstantiationException {
        analyzeStoredPages(Anadix.newAnalyzer());
    }

    public void analyzeStoredPages(Analyzer analyzer) {
        MultithreadedAnalyzer ma = new MultithreadedAnalyzer(analyzer);
        try {
            List ids = new ArrayList();

            for (Source s : getStoredSources()) {
                ids.add(ma.submittAnalysis(s));
            }

            Iterator it;
            int id;
            Report r;
            while (ids.size() > 0) {
                for (it = ids.iterator(); it.hasNext();) {
                    id = it.next();
                    try {
                        if ((r = ma.getResult(id, false)) != null) {
                            reports.add(r);
                            it.remove();
                        }
                    } catch (ResultException ex) {
                        exceptions.add(ex);
                        it.remove();
                    }
                }
            }
        } finally {
            ma.dispose();
        }
    }

    public Collection getStoredSources() {
        return Collections.unmodifiableCollection(sources);
    }

    public Collection getStoredReports() {
        return Collections.unmodifiableCollection(reports);
    }

    public Collection getExceptions() {
        return Collections.unmodifiableCollection(exceptions);
    }

    public void dumpReports() {
        File f;
        for (Report report : getStoredReports()) {
            f = storeHtml(getReportsDir(), report.getSource().getDescription(), "");
            try {
                Anadix.serializeReport(report, f);
            } catch (FileNotFoundException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    public void dumpReports(ReportFormatter formatter) {
        for (Report report : getStoredReports()) {
            storeHtml(getReportsDir(), report.getSource().getDescription(), formatter.format(report));
        }
    }

    public File getSourcesDir() {
        if (!sourcesDir.exists()) {
            sourcesDir.mkdir();
        }
        return sourcesDir;
    }

    public void setSourcesDir(File sourcesDir) {
        this.sourcesDir = sourcesDir;
    }

    public File getReportsDir() {
        if (!reportsDir.exists()) {
            reportsDir.mkdir();
        }
        return reportsDir;
    }

    public void setReportsDir(File reportsDir) {
        this.reportsDir = reportsDir;
    }

    public MultithreadedAnalyzer getAnalyzer() {
        return analyzer;
    }

    public void setAnalyzer(Analyzer analyzer) {
        if (this.analyzer != null) {
            this.analyzer.dispose();
        }
        if (analyzer == null) {
            this.analyzer = null;
        } else {
            this.analyzer = new MultithreadedAnalyzer(analyzer);
        }
    }

    public void dispose() {
        analyzer.dispose();
    }

    private static File storeHtml(File directory, String name, String source) {
        return storeHtml(directory, name, source, true);
    }

    private static File storeHtml(File directory, String name, String source, boolean retry) {
        int i = 0;
        File resultFile;

        name = name.replace("http://", "").replace("/", "_");

        while ((resultFile = new File(directory, String.format("%s_%s.html", name, i++))).exists()) {
            ;
        }

        try {
            resultFile.createNewFile();
        } catch (IOException e) {
            if (retry) {
                return storeHtml(directory, name, source, false);
            } else {
                throw new RuntimeException("Unable to create file " + resultFile.getAbsolutePath(), e);
            }
        }

        PrintWriter pw = null;
        try {
            pw = new PrintWriter(resultFile);
            pw.println(source);
            pw.flush();
        } catch (FileNotFoundException ex) {
            throw new RuntimeException("This ought to not happen", ex);
        } finally {
            if (pw != null) {
                pw.close();
            }
        }

        return resultFile;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy