docs: public void configure() throws UnableToAdaptException {
          boolean webIsMetadataComplete = isMetadataComplete();
          
          // locate annotations
  
          // Collapse all of the prior scanner calls into a single step:
          // The resulting merge has obtained target information for all of the
          // target locations, with precedence per the location ordering.
          //
          // What particular targets are obtained is a curious business, as
          // the class selection uses the names of classes in the included
          // location, but obtains the information for each of those classes
          // using the entire class search space.
          
          // Maybe, move this inside the 'isMetadataComplete' test?
          // The web annotations don't seem to be used except when
          // metadata-complete is false.
          
          this.webAnnotations = this.moduleContainer.adapt(WebAnnotations.class);
  
          if ( !webIsMetadataComplete ) {
              this.webAnnotations.openInfoStore();
          }
          
          try {
  
              for (ServletConfiguratorHelper configHelper : configHelpers) {
                  configHelper.configureInit();
              }
  
              //process web.xml
              if (webApp != null) {
                  this.currentLibraryURI = WebApp.DD_NAME;
                  this.currentSource = ConfigSource.WEB_XML;
                  this.currentMetadataComplete = isMetadataComplete();
  
                  for (ServletConfiguratorHelper configHelper : configHelpers) {
                      configHelper.configureFromWebApp(webApp);
                  }
              }
              
              //process web-fragment.xml
              if (!webIsMetadataComplete) {
                  for (WebFragmentInfo webFragmentItem : this.webAnnotations.getOrderedItems()) {
                      WebFragment webFragment = webFragmentItem.getWebFragment();
                      this.currentLibraryURI = webFragmentItem.getLibraryURI();
                      this.currentSource = ConfigSource.WEB_FRAGMENT;
                      this.currentMetadataComplete = webFragment != null && webFragment.isMetadataComplete();
      
                      if (webFragment != null) {
                          for (ServletConfiguratorHelper configHelper : configHelpers) {
                              configHelper.configureFromWebFragment(webFragmentItem);
                          }
                      }
                      
                      if (!currentMetadataComplete) {
                          for (ServletConfiguratorHelper configHelper : configHelpers) {
                              configHelper.configureFromAnnotations(webFragmentItem);
                          }
                      }
                      
                      ((WebAppConfiguratorHelper) webAppHelper).processIgnoredMappings(webApp);
                  }
              }
  
              for (ServletConfiguratorHelper configHelper : configHelpers) {
                  configHelper.configureDefaults();
              }
              
          } finally {
              if (!webIsMetadataComplete) {
                  this.webAnnotations.closeInfoStore();
              }
          }
  
          clearContext();
  
          if (webBnd != null) {
              for (ServletConfiguratorHelper configHelper : configHelpers) {
                  configHelper.configureWebBnd(webBnd);
              }
          }
  
          if (webExt != null) {
              for (ServletConfiguratorHelper configHelper : configHelpers) {
                  configHelper.configureWebExt(webExt);
              }
          }
  
          for (ServletConfiguratorHelper configHelper : configHelpers) {
              configHelper.finish();
          }
          
          if (this.haveAnyErrorMessages()) {
              throw new UnableToAdaptException(this.getErrorMessageText());
          }
      }