ModelUtils { @Nonnull public static String makeQueryStringForURI(@Nullable final Properties properties) { if (properties == null || properties.isEmpty()) { return ""; } final StringBuilder buffer = new StringBuilder(); final List<String> orderedkeys = new ArrayList<String>(properties.stringPropertyNames()); Collections.sort(orderedkeys); for (final String k : orderedkeys) { try { final String encodedKey = URLEncoder.encode(k, "UTF-8"); final String encodedValue = URLEncoder.encode(properties.getProperty(k), "UTF-8"); if (buffer.length() > 0) { buffer.append('&'); } buffer.append(encodedKey).append('=').append(encodedValue); } catch (UnsupportedEncodingException ex) { LOGGER.error("Can't encode URI query", ex); throw new Error("Unexpected exception, can't find UTF-8 charset!"); } } return buffer.toString(); } private  ModelUtils(); static int calcCharsOnStart(final char chr, @Nonnull final String text); static boolean onlyFromChar(@Nonnull final String line, final char chr); @Nonnull @MustNotContainNull static Object[] joinArrays(@Nonnull @MustNotContainNull final Object[]... arrs); @Nonnull static String makePreBlock(@Nonnull final String text); @Nonnull static String escapeTextForPreBlock(@Nonnull final String text); @Nonnull static String makeMDCodeBlock(@Nonnull final String text); @Nonnull static String escapeMarkdownStr(@Nonnull final String text); static int calcMaxLengthOfBacktickQuotesSubstr(@Nullable final String text); static void writeChar(@Nonnull final Appendable out, final char chr, final int times); @Nonnull static String unescapeMarkdownStr(@Nonnull final String text); @Nonnull static String makeShortTextVersion(@Nonnull String text, final int maxLength); static int countLines(@Nonnull final String text); @Nonnull @MustNotContainNull static String[] breakToLines(@Nonnull final String text); @Nonnull static String makeQueryStringForURI(@Nullable final Properties properties); @Nonnull static Properties extractQueryPropertiesFromURI(@Nonnull final URI uri); @Nonnull static String encodeForURI(@Nonnull final String s); @Nullable static File makeFileForPath(@Nullable final String path); @Nonnull static String escapeURIPath(@Nonnull final String text); @Nonnull static String removeISOControls(@Nonnull final String text); @Nullable static URI toURI(@Nullable final Path path); @Nonnull static File toFile(@Nonnull final URI uri); static final Comparator<String> STRING_COMPARATOR; }
@Test public void testMakeQueryStringForURI() throws Exception { final Properties props = new Properties(); assertEquals("", ModelUtils.makeQueryStringForURI(null)); assertEquals("", ModelUtils.makeQueryStringForURI(props)); props.put("test", "hello test"); assertEquals("test=hello+test", ModelUtils.makeQueryStringForURI(props)); props.put("&key", "&value some"); assertEquals("%26key=%26value+some&test=hello+test", ModelUtils.makeQueryStringForURI(props)); }