Search in sources :

Example 1 with IRouteGroup

use of com.alibaba.android.arouter.facade.template.IRouteGroup 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)

Aggregations

Uri (android.net.Uri)1 HandlerException (com.alibaba.android.arouter.exception.HandlerException)1 NoRouteFoundException (com.alibaba.android.arouter.exception.NoRouteFoundException)1 RouteMeta (com.alibaba.android.arouter.facade.model.RouteMeta)1 IProvider (com.alibaba.android.arouter.facade.template.IProvider)1 IRouteGroup (com.alibaba.android.arouter.facade.template.IRouteGroup)1 Map (java.util.Map)1