code: /*
   * Copyright (c) 2008-2019 Emmanuel Dupuy.
   * This project is distributed under the GPLv3 license.
   * This is a Copyleft license that gives the user the right to use,
   * copy and modify the code freely for non-commercial purposes.
   */
  
  package org.jd.gui.service.indexer;
  
  import org.jd.gui.api.API;
  import org.jd.gui.api.model.Container;
  import org.jd.gui.api.model.Indexes;
  import org.jd.gui.spi.Indexer;
  
  import java.util.Collection;
  import java.util.Map;
  
  public class JavaModuleFileIndexerProvider extends AbstractIndexerProvider {
  
      @Override public String[] getSelectors() { return appendSelectors("*:file:*.jmod"); }
  
      @Override
      public void index(API api, Container.Entry entry, Indexes indexes) {
          for (Container.Entry e : entry.getChildren()) {
              if (e.isDirectory() && e.getPath().equals("classes")) {
                  Map<String, Collection> packageDeclarationIndex = indexes.getIndex("packageDeclarations");
  
                  // Index module-info, packages and CLASS files
                  index(api, e, indexes, packageDeclarationIndex);
                  break;
              }
          }
      }
  
      @SuppressWarnings("unchecked")
      protected static void index(API api, Container.Entry entry, Indexes indexes, Map<String, Collection> packageDeclarationIndex) {
          for (Container.Entry e : entry.getChildren()) {
              if (e.isDirectory()) {
                  String path = e.getPath();
  
                  if (!path.startsWith("classes/META-INF")) {
                      packageDeclarationIndex.get(path.substring(8)).add(e); // 8 = "classes/".length()
                  }
  
                  index(api, e, indexes, packageDeclarationIndex);
              } else {
                  Indexer indexer = api.getIndexer(e);
  
                  if (indexer != null) {
                      indexer.index(api, e, indexes);
                  }
              }
          }
      }
  }
  