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

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

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

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.BooleanUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JsResources {

  protected static final String TAG_TYPE = "script";
  protected static final String SCRIPT_TYPE = "text/javascript";

  protected static Map initializationStarted = new HashMap<>();

  protected static Map rememberEvent = new HashMap<>();
  protected static Map> eventLisenerQueue = new HashMap<>();

  /**
   * async load of resources.
   *
   * @param function function to call on load
   */
  public static void whenReady(final String scriptname, final EventListener function) {
    List eventList = JsResources.eventLisenerQueue.get(scriptname);
    if (eventList == null) {
      eventList = new ArrayList<>();
      JsResources.eventLisenerQueue.put(scriptname, eventList);
    }
    eventList.add(function);
    if (BooleanUtils.isTrue(JsResources.initializationStarted.get(scriptname))
        || JsResources.isInHeader(scriptname)) {
      if (JsResources.isInitialized(scriptname)) {
        JsResources.eventLisenerQueue.get(scriptname)
            .forEach(action -> action.handleEvent(JsResources.rememberEvent.get(scriptname)));
        JsResources.eventLisenerQueue.get(scriptname).clear();
      }
      return;
    }
    JsResources.initializationStarted.put(scriptname, Boolean.TRUE);

    final HTMLScriptElement jsScript =
        (HTMLScriptElement) DomGlobal.document.createElement(TAG_TYPE);
    if (StringUtils.endsWith(scriptname, ".js")) {
      jsScript.src = scriptname;
    } else {
      jsScript.innerHTML = scriptname;
    }
    jsScript.type = JsResources.SCRIPT_TYPE;

    DomGlobal.document.head.appendChild(jsScript);

    jsScript.addEventListener("load", event -> {
      JsResources.eventLisenerQueue.get(scriptname).forEach(action -> action.handleEvent(event));
      JsResources.eventLisenerQueue.get(scriptname).clear();
      JsResources.rememberEvent.put(scriptname, event);
    });
  }

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

  /**
   * check if script is already in the header.
   *
   * @return true if it exists
   */
  public static boolean isInHeader(final String scriptname) {
    final NodeList linkList = DomGlobal.document.head.getElementsByTagName(TAG_TYPE);
    return linkList.asList().stream()
        .filter(element -> StringUtils.endsWith(scriptname, ".js")
            ? StringUtils.equals(((HTMLScriptElement) element).src, scriptname)
            : StringUtils.equals(((HTMLScriptElement) element).innerHTML, scriptname))
        .findFirst().isPresent();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy