Search in sources :

Example 1 with HandlerException

use of com.alibaba.android.arouter.exception.HandlerException in project ARouter by alibaba.

the class InterceptorServiceImpl method doInterceptions.

@Override
public void doInterceptions(final Postcard postcard, final InterceptorCallback callback) {
    if (null != Warehouse.interceptors && Warehouse.interceptors.size() > 0) {
        checkInterceptorsInitStatus();
        if (!interceptorHasInit) {
            callback.onInterrupt(new HandlerException("Interceptors initialization takes too much time."));
            return;
        }
        LogisticsCenter.executor.execute(new Runnable() {

            @Override
            public void run() {
                CancelableCountDownLatch interceptorCounter = new CancelableCountDownLatch(Warehouse.interceptors.size());
                try {
                    _excute(0, interceptorCounter, postcard);
                    interceptorCounter.await(postcard.getTimeout(), TimeUnit.SECONDS);
                    if (interceptorCounter.getCount() > 0) {
                        // Cancel the navigation this time, if it hasn't return anythings.
                        callback.onInterrupt(new HandlerException("The interceptor processing timed out."));
                    } else if (null != postcard.getTag()) {
                        // Maybe some exception in the tag.
                        callback.onInterrupt(new HandlerException(postcard.getTag().toString()));
                    } else {
                        callback.onContinue(postcard);
                    }
                } catch (Exception e) {
                    callback.onInterrupt(e);
                }
            }
        });
    } else {
        callback.onContinue(postcard);
    }
}
Also used : HandlerException(com.alibaba.android.arouter.exception.HandlerException) CancelableCountDownLatch(com.alibaba.android.arouter.thread.CancelableCountDownLatch) HandlerException(com.alibaba.android.arouter.exception.HandlerException)

Example 2 with HandlerException

use of com.alibaba.android.arouter.exception.HandlerException in project ARouter by alibaba.

the class LogisticsCenter method completion.

/**
     * Completion the postcard by route metas
     *
     * @param postcard Incomplete postcard, should completion by this method.
     */
public static synchronized void completion(Postcard postcard) {
    if (null == postcard) {
        throw new NoRouteFoundException(TAG + "No postcard!");
    }
    RouteMeta routeMeta = Warehouse.routes.get(postcard.getPath());
    if (null == routeMeta) {
        // Maybe its does't exist, or didn't load.
        // Load route meta.
        Class<? extends IRouteGroup> groupMeta = Warehouse.groupsIndex.get(postcard.getGroup());
        if (null == groupMeta) {
            throw new NoRouteFoundException(TAG + "There is no route match the path [" + postcard.getPath() + "], in group [" + postcard.getGroup() + "]");
        } else {
            // Load route and cache it into memory, then delete from metas.
            try {
                if (ARouter.debuggable()) {
                    logger.debug(TAG, String.format(Locale.getDefault(), "The group [%s] starts loading, trigger by [%s]", postcard.getGroup(), postcard.getPath()));
                }
                IRouteGroup iGroupInstance = groupMeta.getConstructor().newInstance();
                iGroupInstance.loadInto(Warehouse.routes);
                Warehouse.groupsIndex.remove(postcard.getGroup());
                if (ARouter.debuggable()) {
                    logger.debug(TAG, String.format(Locale.getDefault(), "The group [%s] has already been loaded, trigger by [%s]", postcard.getGroup(), postcard.getPath()));
                }
            } catch (Exception e) {
                throw new HandlerException(TAG + "Fatal exception when loading group meta. [" + e.getMessage() + "]");
            }
            // Reload
            completion(postcard);
        }
    } else {
        postcard.setDestination(routeMeta.getDestination());
        postcard.setType(routeMeta.getType());
        postcard.setPriority(routeMeta.getPriority());
        postcard.setExtra(routeMeta.getExtra());
        Uri rawUri = postcard.getUri();
        if (null != rawUri) {
            // Try to set params into bundle.
            Map<String, String> resultMap = TextUtils.splitQueryParameters(rawUri);
            Map<String, Integer> paramsType = routeMeta.getParamsType();
            if (MapUtils.isNotEmpty(paramsType)) {
                // Set value by its type, just for params which annotation by @Param
                for (Map.Entry<String, Integer> params : paramsType.entrySet()) {
                    setValue(postcard, params.getValue(), params.getKey(), resultMap.get(params.getKey()));
                }
                // Save params name which need autoinject.
                postcard.getExtras().putStringArray(ARouter.AUTO_INJECT, paramsType.keySet().toArray(new String[] {}));
            }
            // Save raw uri
            postcard.withString(ARouter.RAW_URI, rawUri.toString());
        }
        switch(routeMeta.getType()) {
            case // if the route is provider, should find its instance
            PROVIDER:
                // Its provider, so it must be implememt IProvider
                Class<? extends IProvider> providerMeta = (Class<? extends IProvider>) routeMeta.getDestination();
                IProvider instance = Warehouse.providers.get(providerMeta);
                if (null == instance) {
                    // There's no instance of this provider
                    IProvider provider;
                    try {
                        provider = providerMeta.getConstructor().newInstance();
                        provider.init(mContext);
                        Warehouse.providers.put(providerMeta, provider);
                        instance = provider;
                    } catch (Exception e) {
                        throw new HandlerException("Init provider failed! " + e.getMessage());
                    }
                }
                postcard.setProvider(instance);
                // Provider should skip all of interceptors
                postcard.greenChannel();
                break;
            default:
                break;
        }
    }
}
Also used : IRouteGroup(com.alibaba.android.arouter.facade.template.IRouteGroup) HandlerException(com.alibaba.android.arouter.exception.HandlerException) RouteMeta(com.alibaba.android.arouter.facade.model.RouteMeta) Uri(android.net.Uri) HandlerException(com.alibaba.android.arouter.exception.HandlerException) NoRouteFoundException(com.alibaba.android.arouter.exception.NoRouteFoundException) NoRouteFoundException(com.alibaba.android.arouter.exception.NoRouteFoundException) IProvider(com.alibaba.android.arouter.facade.template.IProvider) Map(java.util.Map)

Example 3 with HandlerException

use of com.alibaba.android.arouter.exception.HandlerException in project ARouter by alibaba.

the class InterceptorServiceImpl method _excute.

/**
     * Excute interceptor
     *
     * @param index    current interceptor index
     * @param counter  interceptor counter
     * @param postcard routeMeta
     */
private static void _excute(final int index, final CancelableCountDownLatch counter, final Postcard postcard) {
    if (index < Warehouse.interceptors.size()) {
        IInterceptor iInterceptor = Warehouse.interceptors.get(index);
        iInterceptor.process(postcard, new InterceptorCallback() {

            @Override
            public void onContinue(Postcard postcard) {
                // Last interceptor excute over with no exception.
                counter.countDown();
                // When counter is down, it will be execute continue ,but index bigger than interceptors size, then U know.
                _excute(index + 1, counter, postcard);
            }

            @Override
            public void onInterrupt(Throwable exception) {
                // Last interceptor excute over with fatal exception.
                // save the exception message for backup.
                postcard.setTag(null == exception ? new HandlerException("No message.") : exception.getMessage());
                counter.cancel();
            // Be attention, maybe the thread in callback has been changed,
            // then the catch block(L207) will be invalid.
            // The worst is the thread changed to main thread, then the app will be crash, if you throw this exception!
            //                    if (!Looper.getMainLooper().equals(Looper.myLooper())) {    // You shouldn't throw the exception if the thread is main thread.
            //                        throw new HandlerException(exception.getMessage());
            //                    }
            }
        });
    }
}
Also used : Postcard(com.alibaba.android.arouter.facade.Postcard) HandlerException(com.alibaba.android.arouter.exception.HandlerException) IInterceptor(com.alibaba.android.arouter.facade.template.IInterceptor) InterceptorCallback(com.alibaba.android.arouter.facade.callback.InterceptorCallback)

Example 4 with HandlerException

use of com.alibaba.android.arouter.exception.HandlerException in project ARouter by alibaba.

the class LogisticsCenter method init.

/**
     * LogisticsCenter init, load all metas in memory. Demand initialization
     */
public static synchronized void init(Context context, ThreadPoolExecutor tpe) throws HandlerException {
    mContext = context;
    executor = tpe;
    try {
        // These class was generate by arouter-compiler.
        List<String> classFileNames = ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE);
        //
        for (String className : classFileNames) {
            if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_ROOT)) {
                // This one of root elements, load root.
                ((IRouteRoot) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.groupsIndex);
            } else if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_INTERCEPTORS)) {
                // Load interceptorMeta
                ((IInterceptorGroup) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.interceptorsIndex);
            } else if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_PROVIDERS)) {
                // Load providerIndex
                ((IProviderGroup) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.providersIndex);
            }
        }
        if (Warehouse.groupsIndex.size() == 0) {
            logger.error(TAG, "No mapping files were found, check your configuration please!");
        }
        if (ARouter.debuggable()) {
            logger.debug(TAG, String.format(Locale.getDefault(), "LogisticsCenter has already been loaded, GroupIndex[%d], InterceptorIndex[%d], ProviderIndex[%d]", Warehouse.groupsIndex.size(), Warehouse.interceptorsIndex.size(), Warehouse.providersIndex.size()));
        }
    } catch (Exception e) {
        throw new HandlerException(TAG + "ARouter init logistics center exception! [" + e.getMessage() + "]");
    }
}
Also used : IRouteRoot(com.alibaba.android.arouter.facade.template.IRouteRoot) HandlerException(com.alibaba.android.arouter.exception.HandlerException) IProviderGroup(com.alibaba.android.arouter.facade.template.IProviderGroup) HandlerException(com.alibaba.android.arouter.exception.HandlerException) NoRouteFoundException(com.alibaba.android.arouter.exception.NoRouteFoundException)

Aggregations

HandlerException (com.alibaba.android.arouter.exception.HandlerException)4 NoRouteFoundException (com.alibaba.android.arouter.exception.NoRouteFoundException)2 Uri (android.net.Uri)1 Postcard (com.alibaba.android.arouter.facade.Postcard)1 InterceptorCallback (com.alibaba.android.arouter.facade.callback.InterceptorCallback)1 RouteMeta (com.alibaba.android.arouter.facade.model.RouteMeta)1 IInterceptor (com.alibaba.android.arouter.facade.template.IInterceptor)1 IProvider (com.alibaba.android.arouter.facade.template.IProvider)1 IProviderGroup (com.alibaba.android.arouter.facade.template.IProviderGroup)1 IRouteGroup (com.alibaba.android.arouter.facade.template.IRouteGroup)1 IRouteRoot (com.alibaba.android.arouter.facade.template.IRouteRoot)1 CancelableCountDownLatch (com.alibaba.android.arouter.thread.CancelableCountDownLatch)1 Map (java.util.Map)1