com.jaspersoft.android.jaspermobile.network.RequestExceptionHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.android.jaspermobile.network.RequestExceptionHandler.java

Source

/*
 * Copyright  2016 TIBCO Software,Inc.All rights reserved.
 * http://community.jaspersoft.com/project/jaspermobile-android
 *
 * Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of TIBCO Jaspersoft Mobile for Android.
 *
 * TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation,either version 3of the License,or
 * (at your option)any later version.
 *
 * TIBCO Jaspersoft Mobile is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY;without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with TIBCO Jaspersoft Mobile for Android.If not,see
 * <http://www.gnu.org/licenses/lgpl>.
 */

package com.jaspersoft.android.jaspermobile.network;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.widget.Toast;

import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.dialog.PasswordDialogFragment;
import com.jaspersoft.android.jaspermobile.internal.di.ApplicationContext;
import com.jaspersoft.android.sdk.service.exception.ServiceException;
import com.jaspersoft.android.sdk.service.exception.StatusCodes;

import javax.inject.Inject;
import javax.inject.Singleton;

/**
 * @author Ivan Gadzhega
 * @since 1.6
 */
@Singleton
public class RequestExceptionHandler {
    private final Context mContext;

    @Inject
    public RequestExceptionHandler(@ApplicationContext Context context) {
        mContext = context;
    }

    public static void showAuthErrorIfExists(Context context, Throwable exception) {
        RequestExceptionHandler requestExceptionHandler = new RequestExceptionHandler(context);
        requestExceptionHandler.showAuthErrorIfExists(exception);
    }

    public static void showCommonErrorMessage(Context context, Throwable exception) {
        RequestExceptionHandler requestExceptionHandler = new RequestExceptionHandler(context);
        requestExceptionHandler.showCommonErrorMessage(exception);
    }

    @Nullable
    public String extractMessage(@Nullable Throwable exception) {
        if (exception == null) {
            throw new IllegalArgumentException("Exception should not be null");
        }

        if (exception instanceof ServiceException) {
            ServiceException serviceException = ((ServiceException) exception);
            return adaptServiceMessage(serviceException);
        }
        if (exception.getCause() instanceof ServiceException) {
            ServiceException serviceException = (ServiceException) exception.getCause();
            return adaptServiceMessage(serviceException);
        }

        return exception.getLocalizedMessage();
    }

    public void showAuthErrorIfExists(Throwable exception) {
        if (isAuthError(exception)) {
            showAuthErrorDialog();
        } else {
            showCommonErrorMessage(exception);
        }
    }

    public void showCommonErrorMessage(@NonNull Throwable exception) {
        String message = extractMessage(exception);
        if (!TextUtils.isEmpty(message)) {
            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
        }
    }

    @Nullable
    public static String extractMessage(@NonNull Context context, @Nullable Throwable exception) {
        RequestExceptionHandler handler = new RequestExceptionHandler(context);
        return handler.extractMessage(exception);
    }

    //---------------------------------------------------------------------
    // Helper methods
    //---------------------------------------------------------------------

    private boolean isAuthError(Throwable throwable) {
        if (throwable instanceof ServiceException) {
            ServiceException serviceException = (ServiceException) throwable;
            int code = serviceException.code();
            return code == StatusCodes.AUTHORIZATION_ERROR;
        }
        return false;
    }

    private void showAuthErrorDialog() {
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        if (supportFragmentManager != null) {
            PasswordDialogFragment.show(supportFragmentManager);
        }
    }

    private String adaptServiceMessage(ServiceException exception) {
        int code = exception.code();
        switch (code) {
        case StatusCodes.NETWORK_ERROR:
            return mContext.getString(R.string.no_network);
        case StatusCodes.AUTHORIZATION_ERROR:
            return mContext.getString(R.string.error_http_401);
        case StatusCodes.PERMISSION_DENIED_ERROR:
            return mContext.getString(R.string.error_http_403);
        case StatusCodes.CLIENT_ERROR:
            return mContext.getString(R.string.error_http_404);
        case StatusCodes.INTERNAL_ERROR:
            return mContext.getString(R.string.error_http_500);
        case StatusCodes.EXPORT_PAGE_OUT_OF_RANGE:
            return mContext.getString(R.string.rv_out_of_range);
        case StatusCodes.REPORT_EXECUTION_CANCELLED:
            return mContext.getString(R.string.error_report_cancelled);
        case StatusCodes.REPORT_EXECUTION_FAILED:
            return mContext.getString(R.string.error_report_failed);
        case StatusCodes.EXPORT_EXECUTION_FAILED:
            return mContext.getString(R.string.error_export_failed);
        case StatusCodes.EXPORT_EXECUTION_CANCELLED:
            return mContext.getString(R.string.error_export_cancelled);
        case StatusCodes.JOB_DUPLICATE_OUTPUT_FILE_NAME:
            return mContext.getString(R.string.error_schedule_duplicate_file_name);
        case StatusCodes.JOB_START_DATE_IN_THE_PAST:
            return mContext.getString(R.string.error_schedule_start_date_in_the_past);
        case StatusCodes.JOB_OUTPUT_FILENAME_INVALID_CHARS:
            return mContext.getString(R.string.error_schedule_special_characters);
        case StatusCodes.JOB_OUTPUT_FOLDER_DOES_NOT_EXIST:
            return mContext.getString(R.string.error_schedule_folder_not_exist);
        case StatusCodes.JOB_OUTPUT_FOLDER_IS_NOT_WRITABLE:
            return mContext.getString(R.string.error_schedule_folder_not_writable);
        case StatusCodes.JOB_OUTPUT_FILENAME_TOO_LONG:
            String fileLength = exception.getArguments().get(0);
            return mContext.getString(R.string.error_schedule_output_filename_too_long, fileLength);
        case StatusCodes.JOB_TRIGGER_MONTHS_EMPTY:
            return mContext.getString(R.string.error_trigger_empty_months);
        case StatusCodes.JOB_TRIGGER_WEEK_DAYS_EMPTY:
            return mContext.getString(R.string.error_trigger_empty_days);
        case StatusCodes.JOB_LABEL_TOO_LONG:
            String labelLength = exception.getArguments().get(0);
            return mContext.getString(R.string.error_schedule_label_too_long, labelLength);
        case StatusCodes.SAVED_VALUES_EXIST_IN_FOLDER:
            return mContext.getString(R.string.error_saved_values_duplicate);
        case StatusCodes.SAVED_VALUES_LABEL_TOO_LONG:
            String savedValesLabelLength = exception.getArguments().get(0);
            return mContext.getString(R.string.error_saved_values_label_too_long, savedValesLabelLength);
        case StatusCodes.JOB_CREATION_INTERNAL_ERROR:
            return exception.getMessage();
        case StatusCodes.JOB_CALENDAR_PATTERN_ERROR_DAYS_IN_MONTH:
            return mContext.getString(R.string.error_trigger_calendar_pattern_days_in_month);
        case StatusCodes.JOB_CALENDAR_PATTERN_ERROR_HOURS:
            return mContext.getString(R.string.error_trigger_calendar_pattern_hours);
        case StatusCodes.JOB_CALENDAR_PATTERN_ERROR_MINUTES:
            return mContext.getString(R.string.error_trigger_calendar_pattern_minutes);
        default:
            return mContext.getString(R.string.error_undefined);
        }
    }

    /**
     * It is dirty method will leave here until
     * we move to android.app.FragmentManager
     *
     * @return FragmentManager or null
     */
    @Nullable
    private FragmentManager getSupportFragmentManager() {
        if (mContext instanceof AppCompatActivity) {
            return ((AppCompatActivity) mContext).getSupportFragmentManager();
        } else {
            return null;
        }
    }

}