docs: @SuppressWarnings("resource")
      @Override
      @Trivial
      public void close() throws ClassSource_Exception {
          String methodName = "close";
          if ( tc.isEntryEnabled() ) {
              Tr.entry(tc, methodName, getHashText());
          }
  
          JarFile useJarFile = getJarFile();
          if ( (opens < 0) ||
               ((opens == 0) && (useJarFile != null)) ||
               ((opens > 0) && (useJarFile == null)) ) {
  
              Tr.warning(tc, "ANNO_CLASSSOURCE_JAR_STATE_BAD", getHashText(), getJarPath(), Integer.valueOf(opens));
  
              opens = 0;
              useJarFile = clearJarFile();
              if ( useJarFile != null ) {
                  try {
                      useJarFile.close(); // throws IOException
                  } catch ( IOException e ) {
                      // defect 84235:we are generating multiple Warning/Error messages for each error due to each level reporting them.
                      // Disable the following warning and defer message generation to a higher level, 
                      // preferably the ultimate consumer of the exception.
                      //Tr.warning(tc, "ANNO_CLASSSOURCE_CLOSE5_EXCEPTION", getHashText(), getJarPath());
  
                      String eMsg = "[ " + getHashText() + " ] Failed to close [ " + getJarPath() + " ]";
                      throw getFactory().wrapIntoClassSourceException(CLASS_NAME, methodName, eMsg, e);
                  }
              }
  
              String eMsg = "[ " + getHashText() + " ] Close with open count [ " + opens + " ]";
              throw getFactory().newClassSourceException(eMsg);
          }
  
          if ( --opens == 0 ) {
              useJarFile = clearJarFile();
  
              try {
                  useJarFile.close(); // throws IOException
              } catch ( IOException e ) {
                  // defect 84235:we are generating multiple Warning/Error messages for each error due to each level reporting them.
                  // Disable the following warning and defer message generation to a higher level, 
                  // preferably the ultimate consumer of the exception.
                  //Tr.warning(tc, "ANNO_CLASSSOURCE_CLOSE5_EXCEPTION", getHashText(), getJarPath());
  
                  String eMsg = "[ " + getHashText() + " ] Failed to close [ " + getJarPath() + " ]";
                  throw getFactory().wrapIntoClassSourceException(CLASS_NAME, methodName, eMsg, e);
              }
          }
  
          if ( tc.isEntryEnabled() ) {
              Tr.exit(tc, methodName, getHashText());
          }
      }