code: @CheckForNull
      public static String getString(String key) {
          String value = System.getProperty(key); // keep passing on any exceptions
          if (value != null) {
              if (LOGGER.isLoggable(Level.CONFIG)) {
                  LOGGER.log(Level.CONFIG, "Property (system): {0} => {1}", new Object[] {key, value});
              }
              return value;
          }
          
          value = handler.getString(key);
          if (value != null) {
              if (LOGGER.isLoggable(Level.CONFIG)) {
                  LOGGER.log(Level.CONFIG, "Property (context): {0} => {1}", new Object[]{key, value});
              }
              return value;
          }
          
          if (LOGGER.isLoggable(Level.CONFIG)) {
              LOGGER.log(Level.CONFIG, "Property (not found): {0} => {1}", new Object[] {key, value});
          }
          return null;
      }
docs: Gets the system property indicated by the specified key.
  This behaves just like {@link System#getProperty(java.lang.String)}, except that it
  also consults the {@link ServletContext}'s "init" parameters.
  
  @param      key   the name of the system property.
  @return     the string value of the system property,
  or {@code null} if there is no property with that key.
  
  @exception  NullPointerException if {@code key} is {@code null}.
  @exception  IllegalArgumentException if {@code key} is empty.