001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 *
017 */
018package org.apache.bcel.verifier.exc;
019
020
021/**
022 * Instances of this class should never be thrown. When such an instance is thrown,
023 * this is due to an INTERNAL ERROR of BCEL's class file verifier "JustIce".
024 *
025 */
026public final class AssertionViolatedException extends RuntimeException{
027    private static final long serialVersionUID = -129822266349567409L;
028    /** The error message. */
029    private String detailMessage;
030    /** Constructs a new AssertionViolatedException with null as its error message string. */
031    public AssertionViolatedException() {
032        super();
033    }
034    /**
035     * Constructs a new AssertionViolatedException with the specified error message preceded
036     * by "INTERNAL ERROR: ".
037     */
038    public AssertionViolatedException(String message) {
039        super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first.
040        detailMessage=message;
041    }
042    /**
043     * Constructs a new AssertionViolationException with the specified error message and initial cause
044     * @since 6.0
045     */
046    public AssertionViolatedException(String message, final Throwable initCause) {
047        super(message = "INTERNAL ERROR: "+message, initCause);
048        detailMessage=message;
049    }
050    /** Extends the error message with a string before ("pre") and after ("post") the
051        'old' error message. All of these three strings are allowed to be null, and null
052        is always replaced by the empty string (""). In particular, after invoking this
053        method, the error message of this object can no longer be null.
054    */
055    public void extendMessage(String pre, String post) {
056        if (pre  == null) {
057            pre="";
058        }
059        if (detailMessage == null) {
060            detailMessage="";
061        }
062        if (post == null) {
063            post="";
064        }
065        detailMessage = pre+detailMessage+post;
066    }
067    /**
068     * Returns the error message string of this AssertionViolatedException object.
069     * @return the error message string of this AssertionViolatedException.
070     */
071    @Override
072    public String getMessage() {
073        return detailMessage;
074    }
075
076    /**
077     * DO NOT USE. It's for experimental testing during development only.
078     */
079    public static void main(final String[] args) {
080        final AssertionViolatedException ave = new AssertionViolatedException("Oops!");
081        ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n");
082        throw ave;
083    }
084
085}