docs: private boolean updateTraceSpec(TraceSpecification ts) {
          List<TraceElement> traceSpecs = ts.getSpecs();
          Integer minimumLevel = null;
          if (ts.isSensitiveTraceSuppressed()) {
              minimumLevel = findMinimumSafeLevel(ts.getSafeLevelsIndex());
          }
  
          int newFineLevel = fineLevel;
          int newFineLevelsEnabled = 0;
          int newSpecTraceLevel = TrLevelConstants.SPEC_TRACE_LEVEL_OFF;
  
          for (TraceElement spec : traceSpecs) {
              String clazz = spec.groupName;
              int traceElementFineLevel = spec.fineLevel;
              int specTraceLevel = spec.specTraceLevel;
              boolean setValue = spec.action;
  
              // Do we have a match with our package name?
              boolean process = false;
  
              if (clazz.endsWith("*")) // packages can end with wildcard
              {
                  if (1 == clazz.length()) {
                      process = true;
                  } else {
                      clazz = clazz.substring(0, clazz.length() - 1);
                      for (String group : groups) {
                          if (group.startsWith(clazz)) {
                              process = true;
                              break;
                          }
                      }
                      process = process || name.startsWith(clazz);
                  }
              } else {
                  // or can be a complete package or parent package
                  // - look for a full or partial match with the TC package name
                  int lastDot = name.lastIndexOf('.');
                  if (lastDot > 0) {
                      String packageName = name.substring(0, lastDot);
                      if (packageName.startsWith(clazz))
                          process = true;
                  }
                  // groups may be class names (eg WsLogger impls)
                  for (String group : groups) {
                      lastDot = group.lastIndexOf('.');
                      if (lastDot > 0) {
                          String packageName = group.substring(0, lastDot);
                          if (packageName.startsWith(clazz))
                              process = true;
                          break;
                      }
                  }
  
                  // could be a straight group name match
                  for (String group : groups) {
                      if (group.equalsIgnoreCase(clazz)) {
                          process = true;
                          break;
                      }
                  }
                  process = process || name.equalsIgnoreCase(clazz);
              }
  
              if (process) {
                  newFineLevel = traceElementFineLevel;
                  newSpecTraceLevel = specTraceLevel;
                  if (minimumLevel != null && newFineLevel < minimumLevel) {
                      newFineLevel = minimumLevel;
                  }
  
                  for (int level = newFineLevel; level < TrLevelConstants.TRACE_LEVEL_OFF; level++) {
                      if (setValue) {
                          newFineLevelsEnabled |= 1 << level;
                      } else {
                          newFineLevelsEnabled &= ~(1 << level);
                      }
                  }
                  
                  if (newFineLevel == TrLevelConstants.TRACE_LEVEL_OFF) {
                  	isTraceOff = true;
                  } else {
                  	isTraceOff = false;
                  }
                  // Indicate that the trace spec matched something
                  spec.setMatched(true);
              }
          } // end for each spec
  
          boolean updated = false;
          if (newFineLevel != fineLevel) {
              fineLevel = newFineLevel;
              updated = true;
          }
          if (newFineLevelsEnabled != fineLevelsEnabled) {
              fineLevelsEnabled = newFineLevelsEnabled;
              updated = true;
          }
          if (newSpecTraceLevel != specTraceLevel) {
              specTraceLevel = newSpecTraceLevel;
              updated = true;
          }
  
          return updated;
      }