code: public static String safeDecode(final String stringToDecode) throws StorageException {
          if (stringToDecode == null) {
              return null;
          }
  
          if (stringToDecode.length() == 0) {
              return Constants.EMPTY_STRING;
          }
  
          try {
              if (stringToDecode.contains("+")) {
                  final StringBuilder outBuilder = new StringBuilder();
  
                  int startDex = 0;
                  for (int m = 0; m < stringToDecode.length(); m++) {
                      if (stringToDecode.charAt(m) == '+') {
                          if (m > startDex) {
                              outBuilder.append(URLDecoder.decode(stringToDecode.substring(startDex, m),
                                      Constants.UTF8_CHARSET));
                          }
  
                          outBuilder.append("+");
                          startDex = m + 1;
                      }
                  }
  
                  if (startDex != stringToDecode.length()) {
                      outBuilder.append(URLDecoder.decode(stringToDecode.substring(startDex, stringToDecode.length()),
                              Constants.UTF8_CHARSET));
                  }
  
                  return outBuilder.toString();
              }
              else {
                  return URLDecoder.decode(stringToDecode, Constants.UTF8_CHARSET);
              }
          }
          catch (final UnsupportedEncodingException e) {
              throw Utility.generateNewUnexpectedStorageException(e);
          }
      }
docs: Performs safe decoding of the specified string, taking care to preserve each <code>+</code> character, rather
  than replacing it with a space character.
  
  @param stringToDecode
  A <code>String</code> that represents the string to decode.
  
  @return A <code>String</code> that represents the decoded string.
  
  @throws StorageException
  If a storage service error occurred.