content: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   */
  package org.apache.weex.bridge;
  
  import static org.apache.weex.http.WXHttpUtil.KEY_USER_AGENT;
  
  import android.net.Uri;
  import android.support.annotation.Keep;
  import android.text.TextUtils;
  import org.apache.weex.WXEnvironment;
  import org.apache.weex.WXHttpListener;
  import org.apache.weex.WXSDKInstance;
  import org.apache.weex.WXSDKManager;
  import org.apache.weex.adapter.IWXHttpAdapter;
  import org.apache.weex.adapter.URIAdapter;
  import org.apache.weex.base.CalledByNative;
  import org.apache.weex.bridge.WXBridgeManager.BundType;
  import org.apache.weex.common.WXErrorCode;
  import org.apache.weex.common.WXRequest;
  import org.apache.weex.common.WXResponse;
  import org.apache.weex.http.WXHttpUtil;
  import org.apache.weex.utils.WXExceptionUtils;
  
  import org.apache.weex.utils.WXLogUtils;
  import java.util.HashMap;
  import java.util.Locale;
  
  public class RequestHandler {
  
    @Keep
    native void nativeInvokeOnSuccess(long callback, String script, String bundleType);
    native void nativeInvokeOnFailed(long callback);
  
    @CalledByNative
    public static RequestHandler create() {
      return new RequestHandler();
    }
  
    @CalledByNative
    public void send(String instanceId, String url, long nativeCallback) {
      if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(url) ||
          nativeCallback == 0 ||
          !WXSDKManager.getInstance().getAllInstanceMap().containsKey(
              instanceId)) {
        return;
      }
  
      WXSDKManager manager = WXSDKManager.getInstance();
      WXSDKInstance instance =
          WXSDKManager.getInstance().getSDKInstance(instanceId);
      if (instance == null)
        return;
      IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter();
  
      WXRequest wxRequest = new WXRequest();
      wxRequest.url = manager.getURIAdapter()
                          .rewrite(instance, URIAdapter.BUNDLE, Uri.parse(url))
                          .toString();
  
      if (wxRequest.paramMap == null) {
        wxRequest.paramMap = new HashMap<>();
      }
      wxRequest.paramMap.put(
          KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(
                              instance.getContext(), WXEnvironment.getConfig()));
      wxRequest.paramMap.put("isBundleRequest", "true");
      WXLogUtils.i("Eagle", String.format(Locale.ENGLISH, "Weex eagle is going to download script from %s", url));
      adapter.sendRequest(wxRequest, new OnHttpListenerInner(instance, nativeCallback, url));
    }
  
    @Keep
    @CalledByNative
    public void getBundleType(String instanceId, final String content, final long nativeCallback){
      BundType bundleType = WXBridgeManager.getInstance().getBundleType("", content);
      final String bundleTypeStr = bundleType == null ? "Others" : bundleType.toString();
      WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
      if ("Others".equalsIgnoreCase(bundleTypeStr) && null != instance){
        WXExceptionUtils.commitCriticalExceptionRT(
            instanceId,
            WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE,
            "RequestHandler.onSuccess",
            "eagle ->" +WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE.getErrorMsg(),
            null
        );
      }
      WXBridgeManager.getInstance().post(new Runnable() {
        @Override
        public void run() {
          if(WXBridgeManager.getInstance().isJSFrameworkInit()) {
            nativeInvokeOnSuccess(nativeCallback, content, bundleTypeStr);
          }
          else {
            nativeInvokeOnFailed(nativeCallback);
          }
        }
      });
    }
  
    class OnHttpListenerInner extends WXHttpListener {
      private long sNativeCallback;
  
      OnHttpListenerInner(WXSDKInstance instance, long nativeCallback, String bundlUrl) {
        super(instance, bundlUrl);
        sNativeCallback = nativeCallback;
      }
  
      @Override
      public void onSuccess(WXResponse response) {
          final String script = new String(response.originalData);
          BundType bundleType = WXBridgeManager.getInstance().getBundleType("", script);
          final String bundleTypeStr = bundleType == null ? "Others" : bundleType.toString();
          if ("Others".equalsIgnoreCase(bundleTypeStr) && null != getInstance()){
            WXExceptionUtils.commitCriticalExceptionRT(
                getInstance().getInstanceId(),
                WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE,
                "RequestHandler.onSuccess",
                "eagle ->" +WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE.getErrorMsg(),
                null
            );
          }
          WXBridgeManager.getInstance().post(new Runnable() {
            @Override
            public void run() {
              if(WXBridgeManager.getInstance().isJSFrameworkInit()) {
                nativeInvokeOnSuccess(sNativeCallback, script, bundleTypeStr);
              }
              else{
                nativeInvokeOnFailed(sNativeCallback);
              }
            }
          });
      }
  
      @Override
      public void onFail(WXResponse response) {
        nativeInvokeOnFailed(sNativeCallback);
      }
    }
  }
  