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

play.api.PlayException Maven / Gradle / Ivy

There is a newer version: 2.9.6
Show newest version
/*
 * Copyright (C) 2009-2016 Lightbend Inc. 
 */
package play.api;

import java.util.*;

import java.util.concurrent.atomic.AtomicLong;

/**
 * Helper for `PlayException`.
 */
public class PlayException extends UsefulException {

    private final AtomicLong generator = new AtomicLong(System.currentTimeMillis());

    /**
     * Generates a new unique exception ID.
     */
    private String nextId() {
        return java.lang.Long.toString(generator.incrementAndGet(), 26);
    }

    public PlayException(String title, String description, Throwable cause) {
        super(title + "[" + description + "]",cause);
        this.title = title;
        this.description = description;
        this.id = nextId();
        this.cause = cause;
    }

    public PlayException(String title, String description) {
        super(title + "[" + description + "]");
        this.title = title;
        this.description = description;
        this.id = nextId();
        this.cause = null;
    }

    /**
     * Adds source attachment to a Play exception.
     */
    public static abstract class ExceptionSource extends PlayException {

        public ExceptionSource(String title, String description, Throwable cause) {
          super(title, description,cause);
        }

        public ExceptionSource(String title, String description) {
          super(title, description);
        }

        /**
         * Error line number, if defined.
         *
         * @return Error line number, if defined.
         */
        public abstract Integer line();

        /**
         * Column position, if defined.
         *
         * @return Column position, if defined.
         */
        public abstract Integer position();

        /**
         * @return Input stream used to read the source content.
         *
         * Input stream used to read the source content.
         */
        public abstract String input();

        /**
         * The source file name if defined.
         *
         * @return The source file name if defined.
         */
        public abstract String sourceName();

        /**
         * Extracts interesting lines to be displayed to the user.
         *
         * @param border number of lines to use as a border
         * @return the extracted lines
         */
        public InterestingLines interestingLines(int border) {
            try {
                if(input() == null || line() == null) {
                    return null;
                }
                String[] lines = input().split("\n");
                int firstLine = Math.max(0, line() - 1 - border);
                int lastLine = Math.min(lines.length - 1, line() - 1 + border);
                List focusOn = new ArrayList();
                for(int i = firstLine; i <= lastLine; i++) {
                    focusOn.add(lines[i]);
                }
                return new InterestingLines(firstLine + 1, focusOn.toArray(new String[focusOn.size()]), line() - firstLine - 1);
            } catch(Throwable e) {
                e.printStackTrace();
                return null;
            }
        }

        public String toString() {
            return super.toString() + " in " + sourceName() + ":" + line();
        }
    }

    /**
     * Adds any attachment to a Play exception.
     */
    public static abstract class ExceptionAttachment extends PlayException {

        public ExceptionAttachment(String title, String description, Throwable cause) {
            super(title, description, cause);
        }

        public ExceptionAttachment(String title, String description) {
            super(title, description);
        }

        /**
         * Content title.
         *
         * @return content title.
         */
        public abstract String subTitle();

        /**
         * Content to be displayed.
         *
         * @return content to be displayed.
         */
        public abstract String content();

    }

    /**
     * Adds a rich HTML description to a Play exception.
     */
    public static abstract class RichDescription extends ExceptionAttachment {

        public RichDescription(String title, String description, Throwable cause) {
            super(title, description, cause);
        }

        public RichDescription(String title, String description) {
            super(title, description);
        }

        /**
         * The new description formatted as HTML.
         *
         * @return the new description formatted as HTML.
         */
        public abstract String htmlDescription();

    }

    public static class InterestingLines {

        public final int firstLine;
        public final int errorLine;
        public final String[] focus;

        public InterestingLines(int firstLine, String[] focus, int errorLine){
            this.firstLine = firstLine;
            this.errorLine = errorLine;
            this.focus = focus;
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy