All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.knightsoftnet.mtwidgets.client.ui.widget.resourceloader.JQueryResources Maven / Gradle / Ivy

package de.knightsoftnet.mtwidgets.client.ui.widget.resourceloader;

import com.google.gwt.core.client.GWT;

import elemental2.dom.DomGlobal;
import elemental2.dom.Element;
import elemental2.dom.Event;
import elemental2.dom.EventListener;
import elemental2.dom.HTMLScriptElement;
import elemental2.dom.NodeList;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

public class JQueryResources {

  private static final String JQUERY_URL =
      ((JsJQueryResourceDefinitionInterface) GWT.create(JsJQueryResourceDefinitionInterface.class))
          .getJQeryPath();
  private static final String JQUERY_MIGRATE_URL =
      ((JsJQueryResourceDefinitionInterface) GWT.create(JsJQueryResourceDefinitionInterface.class))
          .getJQeryMigratePath();

  private static boolean initializationStarted = false;

  private static Event rememberEvent;
  private static List eventLisenerQueue = new ArrayList<>();

  /**
   * async load of resources.
   *
   * @param function function to call on load
   */
  public static void whenReady(final EventListener function) {
    JQueryResources.eventLisenerQueue.add(function);
    if (JQueryResources.initializationStarted || JQueryResources.isInHeader()) {
      if (JQueryResources.isInitialized()) {
        JQueryResources.eventLisenerQueue
            .forEach(action -> action.handleEvent(JQueryResources.rememberEvent));
        JQueryResources.eventLisenerQueue.clear();
      }
      return;
    }
    JQueryResources.initializationStarted = true;

    final HTMLScriptElement jqueryScript =
        (HTMLScriptElement) DomGlobal.document.createElement(JsResources.TAG_TYPE);
    jqueryScript.src = JQUERY_URL;
    jqueryScript.type = JsResources.SCRIPT_TYPE;

    DomGlobal.document.head.appendChild(jqueryScript);

    jqueryScript.addEventListener("load", event -> {
      final HTMLScriptElement jqueryMigrateScript =
          (HTMLScriptElement) DomGlobal.document.createElement(JsResources.TAG_TYPE);
      jqueryMigrateScript.src = JQUERY_MIGRATE_URL;
      jqueryMigrateScript.type = JsResources.SCRIPT_TYPE;

      DomGlobal.document.head.appendChild(jqueryMigrateScript);
      jqueryMigrateScript.addEventListener("load", secondEvent -> {
        JQueryResources.eventLisenerQueue.forEach(action -> action.handleEvent(secondEvent));
        JQueryResources.eventLisenerQueue.clear();
        JQueryResources.rememberEvent = secondEvent;
      });
    });
  }

  /**
   * check if script is available and initialized.
   *
   * @return true if it exists
   */
  public static boolean isInitialized() {
    final boolean loaded = JQueryResources.rememberEvent != null || StringUtils.isEmpty(JQUERY_URL);
    return loaded || JQueryResources.isInHeader();
  }

  /**
   * check if script is already in the header.
   *
   * @return true if it exists
   */
  public static boolean isInHeader() {
    boolean jqueryInHeader = false;
    boolean jqueryMigrateInHeader = false;
    final NodeList linkList =
        DomGlobal.document.head.getElementsByTagName(JsResources.TAG_TYPE);
    for (final Element element : linkList.asList()) {
      jqueryInHeader |=
          StringUtils.contains(((HTMLScriptElement) element).src, JQueryResources.JQUERY_URL);
      jqueryMigrateInHeader |= StringUtils.contains(((HTMLScriptElement) element).src,
          JQueryResources.JQUERY_MIGRATE_URL);
    }
    return jqueryInHeader && jqueryMigrateInHeader;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy