<%--
Copyright (c) 2020 Eclipse contributors and others.

This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/

SPDX-License-Identifier: EPL-2.0
--%>
<%@jet
  package="org.eclipse.justj.codegen.templates.jdeps"
  class="JdepsIndex"
  imports=""
  builder="StringBuilder builder = new StringBuilder()"
  nlString='"\\n"'
  minimize="true"
  skeleton="platform:/resource/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/JdepsIndex.java"%>
<%String title = "JustJ Jdeps";
  int toggleCounter = 0;%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
  <title><%=title%></title>
  <meta name="keywords" content="eclipse,justj"/>
  <meta name="description" content="JustJ's JDeps Report"/>
  <link href="//fonts.googleapis.com/css?family=Open+Sans:400,700,300,600,100" rel="stylesheet" type="text/css"/>
  <link rel="stylesheet" href="https://www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/styles.min.css"/>
  <link rel="icon" type="image/ico" href="https://www.eclipse.org/justj/justj_favicon.ico"/>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script>
      function expand_collapse(id, targetId) {
        var e = document.getElementById(id);
        var checked = e.checked;
        var target = document.getElementById(targetId);
        var targets = target.getElementsByTagName('input');
        for (var i = 0; i < targets.length; i++) {
          var input = targets[i];
          input.checked = checked;
        }
      }

      function filter(filter, id, targetClass) {
        var e = document.getElementById(id);
        var filterTargets = e.getElementsByClassName('filter-target');
        for (var i = 0; i < filterTargets.length; i++) {
          var target = filterTargets[i];
          target.style.display = !filter ? target.localName = "li" ? "" : "block" : "none";
        }
        if (filter) {
          var filterTargetsArray = [].slice.call(filterTargets);
          var targets = e.getElementsByClassName(targetClass);
          for (var i = 0; i < targets.length; i++) {
            var target = targets[i];
            target.style.display = "block";
            for (var parent = target.parentNode; parent != e; parent = parent.parentNode) {
              if (filterTargetsArray.includes(parent)) {
                parent.style.display = parent.localName = "li" ? "" : "block";
              }
            }
          }
        }
      }

      var oldOnload = window.onload;
      window.onload = function() {
        document.getElementsByTag
        var inputs = document.getElementsByTagName('input');
        for (index = 0; index < inputs.length; ++index) {
          var input = inputs[index];
          input.checked = false;
        }
        if(oldOnload != null) {
          oldUnload();
        }
      }
  </script>
</head>

  <body id="body_solstice">
    <style>
.toggle {
  display: none;
}

.toggle-label {
  font-size: 100%;
  margin-bottom: 0px;
  font-weight: normal;
}

.toggle + .toggle-label + .toggle-content {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition: all .4s ease-in-out;
}

.toggle + .toggle-label > .toggle-state-on {
  display: none;
}

.toggle + .toggle-label > .toggle-state-off {
  display: inherit;
}

.toggle:checked + .toggle-label > .toggle-state-on {
  display: inherit;
}

.toggle:checked + .toggle-label > .toggle-state-off {
  display: none;
}

.toggle:checked + .toggle-label + .toggle-content {
  max-height: none;
  opacity: 1;
}

.toggle-content {
  padding-left: 2em;
}

.toggle-label:hover, .toggle-label:hover * {
  cursor: pointer;
}

.plain:link, .plain:visited {
  color: inherit;
}

label:target {
  border: 1px solid black;
}
    </style>

    <header role="banner" id="header-wrapper">
      <div class="container">
        <div class="row" id="header-row">
          <div class="hidden-xs col-sm-8 col-md-6 col-lg-5" id="header-left">
            <div class="wrapper-logo-default">
              <a href="https://www.eclipse.org/justj?page=index">
                <img class="logo-eclipse-default img-responsive hidden-xs" style="height: 50px; space: nowrap; display: inline-block;" alt="Project Logo" src="https://www.eclipse.org/justj/justj_title.svg"/>
              </a>
            </div>
          </div>
        </div>
      </div>
    </header>

    <section class="hidden-print default-breadcrumbs" id="breadcrumb">
      <div class="container">
        <h3 class="sr-only">Breadcrumbs</h3>
        <div class="row">
          <div class="col-sm-16 padding-left-30">
            <ol class="breadcrumb">
              <li><a href="https://www.eclipse.org/">Home</a></li>
              <li><a href="https://www.eclipse.org/projects/">Projects</a></li>
              <li><a href="https://www.eclipse.org/justj?page=download">JustJ</a></li>
              <li><a href="https://download.eclipse.org/justj/jdeps">Jdeps</a></li>
<%for (Map.Entry<String, String> entry : getBreadcrumbs().entrySet()) {%>
  <%if (entry.getValue() == null) {%>
              <li class="active"><%=entry.getKey()%></li>
  <%} else if (entry.getValue().trim().isEmpty()) {%>
              <li><%=entry.getKey()%></li>
  <%} else {%>
              <li><a href="<%=entry.getValue()%>"><%=entry.getKey()%></a></li>
  <%}%>
<%}%>
            </ol>
          </div>
          <div class="col-sm-8 margin-top-15"></div>
        </div>
      </div>
    </section>

    <main class="no-promo">
    <div class="novaContent container" id="novaContent">

      <div id="maincontent">
        <h2 style="">
          <%=title%>: 
          <a style="font-size: 66%;" href="<%=repoURI%>"><%=repoURI%></a>
          <a href="justj.modules" target="modules" style="float: right; font-size: 75%;"><img style="height: 2ex; display: inline-block;" alt="justj" src="https://www.eclipse.org/justj/justj_title.svg"/>.modules</a>
        </h2>
        <p>
      The plugins of this repository have been analyzed for module dependencies using jdeps.
      The plugin dependencies of each module and the module dependencies of each plugin are summarized below.
        </p>
        <p>
      The jdeps analysis of a plugin may produce warnings about split packages,
      i.e., if the jar exports packages that are the same as exported by the module on which it depends,
      or it may fail, i.e., if the jar has module dependencies that don't resolve.
      Filters are provided to show only these issues.
        </p>

    <hr/>
    <h4>
      Module Dependencies
      <input type="checkbox" id="toggle-id-<%=++toggleCounter%>" class="toggle" onclick="expand_collapse('toggle-id-<%=toggleCounter%>', 'mod-deps');"/>
      <label for="toggle-id-<%=toggleCounter%>" class="toggle-label"><%=getToggleExpand(true)%></label>
<%if (!splitPackages.isEmpty()) {%>
      <input name="module-split-packages" type="checkbox" onclick="filter(this.checked, 'mod-deps', 'split-package');" onload="this.value = '';"/>
      <label for="module-split-packages" style="font-size: 75%;">Show Only Split Packages</label>
<%}%>
    </h4>

    <div id="mod-deps">
<%for (Map.Entry<String, Set<Plugin>> entry : modulePlugins.entrySet()) {
    String module = entry.getKey();
    int mainID = ++toggleCounter;%>
      <div class="filter-target">
        <input type="checkbox" id="toggle-id-<%=mainID%>" class="toggle"/>
        <label for="toggle-id-<%=mainID%>" class="toggle-label" id="<%=module%>"><%=getToggleExpand(true)%> <%=module%></label>
        <ul class="toggle-content filter-target" style="margin-left: 1em; margin-bottom: 0;">
  <%for (Plugin plugin : entry.getValue()) {%>
          <li class="filter-target">
            <a href="#<%=plugin%>" class="plain"><%=plugin.getId()%> <span style="color: DarkOliveGreen; font-size: 90%;"><%=plugin.getVersion()%></span></a>
    <%Set<String> splitPackages = getSplitPackages(module, plugin);
      if (!splitPackages.isEmpty()) {%>
            <ul style="margin-left: -2em; margin-top: 0; margin-bottom: 0; color: #E8BB14;" class="split-package filter-target">
      <%for (String packageName : splitPackages) {%>
              <li><%=packageName%></li>
      <%}%>
            </ul>
    <%}%>
          </li>
  <%}%>
        </ul>
      </div>
<%}%>
    </div>

    <hr/>
    <h4>
      Plugin Dependencies
      <input type="checkbox" id="toggle-id-<%=++toggleCounter%>" class="toggle" onclick="expand_collapse('toggle-id-<%=toggleCounter%>', 'plugin-deps');"/>
      <label for="toggle-id-<%=toggleCounter%>" class="toggle-label"><%=getToggleExpand(true)%></label>
<%if (!pluginErrors.isEmpty()) {%>
      <input name="plugin-errors" type="checkbox" onclick="filter(this.checked, 'plugin-deps', 'jdeps-error');" onload="this.value = '';"/>
      <label for="plugin-errors" style="font-size: 75%;">Show Only Errors</label>
<%}%>
    </h4>

    <div id="plugin-deps">
<%for (Map.Entry<Plugin, Set<String>> entry : pluginModules.entrySet()) {
    Plugin plugin = entry.getKey();
    Set<String> modules = entry.getValue();
    List<String> errors = pluginErrors.get(plugin);
    int mainID = ++toggleCounter;%>
      <div class="filter-target">
        <input type="checkbox" id="toggle-id-<%=mainID%>" class="toggle"/>
        <label for="toggle-id-<%=mainID%>" class="toggle-label" id="<%=plugin%>">
         <%=getToggleExpand(!modules.isEmpty() || errors != null)%>
         <%=plugin.getId()%>
         <span style="color: DarkOliveGreen; font-size: 90%;"><%=plugin.getVersion()%></label>
         <ul class="toggle-content filter-target" style="margin-left: 1em; margin-bottom: 0;">
  <%for (String module : modules) {%>
          <li class="filter-target">
            <a href="#<%=module%>" class="plain"><%=module%></a>
    <%Set<String> splitPackages = getSplitPackages(module, plugin);
      if (!splitPackages.isEmpty()) {%>
            <ul style="margin-left: -2em; margin-top: 0; margin-bottom: 0; color: #E8BB14;">
      <%for (String packageName : splitPackages) {%>
              <li><%=packageName%></li>
      <%}%>
            </ul>
    <%}%>
          </li>
  <%}%>
  <%if (errors != null) {%>
           <li style="color: FireBrick; font-size: 80%;" class="jdeps-error">
    <%for (String error : errors) {%>
           <%=error%><br/>
    <%}%>
          </li>
  <%}%>
        </ul>
      </div>
<%}%>
    </div>

      </div>
    </div>
    </main>
  </body>
</html>