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    package org.apache.xbean.kernel;
018    
019    import java.io.PrintStream;
020    import java.io.PrintWriter;
021    import java.util.Collections;
022    import java.util.Iterator;
023    import java.util.List;
024    import java.util.ListIterator;
025    
026    /**
027     * Groups a collection of errors from a set of work so they maybe be thrown together from the kernel.  This is used
028     * when the kernel does aggregate work on somthing that shouldn't fail such as when notifying kernel monitors or
029     * destroying the kernel.  This allows the kernel to preform all required work and then throw any errors as a single
030     * exception object.
031     *
032     * @author Dain Sundstrom
033     * @version $Id$
034     * @since 2.0
035     */
036    public class KernelErrorsError extends Error {
037        private final List errors;
038    
039        /**
040         * Creates an Errors error containing the list of errors.
041         *
042         * @param errors the errors
043         */
044        public KernelErrorsError(List errors) {
045            if (errors == null) throw new NullPointerException("errors is null");
046            if (errors.isEmpty()) throw new IllegalArgumentException("errors is empty");
047            for (ListIterator iterator = errors.listIterator(); iterator.hasNext();) {
048                Object error = iterator.next();
049                if (error == null) {
050                    throw new IllegalArgumentException("Errors element " + iterator.previousIndex() + " is null");
051                }
052                if (!(error instanceof Error)) {
053                    throw new IllegalArgumentException("Errors element " + iterator.previousIndex() +
054                            " is not an instance of java.lang.Error " + error.getClass() + ": " + error);
055                }
056            }
057    
058            this.errors = Collections.unmodifiableList(errors);
059        }
060    
061        /**
062         * Gets the errors that casued this error.
063         *
064         * @return the errors that casued this error
065         */
066        public List getErrors() {
067            return errors;
068        }
069    
070        public String getMessage() {
071            StringBuffer message = new StringBuffer();
072            message.append(errors.size() + " Error(s) occured [");
073            for (Iterator iterator = errors.iterator(); iterator.hasNext();) {
074                Error error = (Error) iterator.next();
075                message.append('\"').append(error.getMessage()).append('\"');
076                if (iterator.hasNext()) {
077                    message.append(", ");
078                }
079            }
080            return message.append("]").toString();
081        }
082    
083        public String getLocalizedMessage() {
084            StringBuffer message = new StringBuffer();
085            message.append(errors.size() + " Error(s) occured [");
086            for (Iterator iterator = errors.iterator(); iterator.hasNext();) {
087                Error error = (Error) iterator.next();
088                message.append('\"').append(error.getLocalizedMessage()).append('\"');
089                if (iterator.hasNext()) {
090                    message.append(", ");
091                }
092            }
093            return message.append("]").toString();
094        }
095    
096        public void printStackTrace(PrintStream stream) {
097            synchronized (stream) {
098                stream.println(this);
099                for (Iterator iterator = errors.iterator(); iterator.hasNext();) {
100                    Error error = (Error) iterator.next();
101                    error.printStackTrace(stream);
102                }
103            }
104        }
105    
106        public void printStackTrace(PrintWriter writer) {
107            synchronized (writer) {
108                writer.println(this);
109                for (Iterator iterator = errors.iterator(); iterator.hasNext();) {
110                    Error error = (Error) iterator.next();
111                    error.printStackTrace(writer);
112                }
113            }
114        }
115    }