001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     * 
010     *      http://www.apache.org/licenses/LICENSE-2.0
011     * 
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.oozie.action;
019    
020    import org.apache.oozie.util.ParamChecker;
021    import org.apache.oozie.util.XLog;
022    
023    /**
024     * ActionExecutor exception. <p/> The exception provides information regarding the transient/no-transient/fatal nature
025     * of the exception.
026     */
027    public class ActionExecutorException extends Exception {
028    
029        /**
030         * Enum that defines the type of error an {@link ActionExecutor} has produced.
031         */
032        public static enum ErrorType {
033    
034            /**
035             * The action will be automatically retried by Oozie.
036             */
037            TRANSIENT,
038    
039            /**
040             * The job in set in SUSPEND mode and it will wait for an admin to resume the job.
041             */
042    
043            NON_TRANSIENT,
044    
045            /**
046             * The action completes with an error transition.
047             */
048            ERROR,
049    
050            /**
051             * The action fails. No transition is taken.
052             */
053            FAILED
054        }
055    
056        private ErrorType errorType;
057        private String errorCode;
058    
059        /**
060         * Create an action executor exception.
061         *
062         * @param errorType the error type.
063         * @param errorCode the error code.
064         * @param message the error message.
065         */
066        public ActionExecutorException(ErrorType errorType, String errorCode, String message) {
067            super(message);
068            this.errorType = ParamChecker.notNull(errorType, "errorType");
069            this.errorCode = ParamChecker.notEmpty(errorCode, "errorCode");
070        }
071    
072        /**
073         * Create an action executor exception.
074         *
075         * <p/> If the last parameter is an Exception it is used as the exception cause.
076         *
077         * @param errorType the error type.
078         * @param errorCode the error code.
079         * @param messageTemplate the error message.
080         * @param params parameters used to create the exception message together with the messageTemplate. If the last
081         * parameter is an Exception it is used as the exception cause.
082         */
083        public ActionExecutorException(ErrorType errorType, String errorCode, String messageTemplate, Object... params) {
084            super(errorCode + ": " + XLog.format(messageTemplate, params), XLog.getCause(params));
085            this.errorType = ParamChecker.notNull(errorType, "errorType");
086            this.errorCode = ParamChecker.notEmpty(errorCode, "errorCode");
087        }
088    
089        /**
090         * Return the error type of the exception.
091         *
092         * @return the error type of the exception.
093         */
094        public ErrorType getErrorType() {
095            return errorType;
096        }
097    
098        /**
099         * Return the error code of the exception.
100         *
101         * @return the error code of the exception.
102         */
103        public String getErrorCode() {
104            return errorCode;
105        }
106    }