1. 程式人生 > >Activiti工作流REST方式訪問URI的解析

Activiti工作流REST方式訪問URI的解析

在Activiti工作流中提供一種訪問方式為REST方式訪問。針對查詢字串的格式採用一個如下一個工具類解析Uri中的提供的各種資訊。

package org.activiti.explorer.util;

import java.io.UnsupportedEncodingException;

import java.net.URLDecoder;

import java.net.URLEncoder;

import java.util.ArrayList;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Scanner;

/**

 * @author 'Frederik Heremans'

 */

publicclass UriUtility {

privatestaticfinal String PARAMETER_SEPARATOR = "&";

privatestaticfinal String QUERY_STRING_SEPARATOR = "?";

privatestaticfinal String NAME_VALUE_SEPARATOR = "=";

privatestaticfinal

 String URL_PART_SEPARATOR = "/";

/**

   * Get path fragments. eg: "/task/inbox/123" will return a list with three

   * values: "task", "inbox" and "123" in that order.

   */

publicstatic List<String> getFragmentParts(String url) {

if (url != null) {

      List<String> parts = new ArrayList<String>();

      String[] partsArray = url.split(URL_PART_SEPARATOR);

for (String part : partsArray) {

if (part.length() > 0) {

          parts.add(part);

        }

      }

return parts;

    }

returnnull;

  }

/**

   * Extracts the query parameters from the given url fragment.

   */

publicstatic String extractQueryString(String fragment) {

if (fragment != null) {

int firstIndex = fragment.indexOf(QUERY_STRING_SEPARATOR);

if (firstIndex >= 0) {

return fragment.substring(firstIndex);

      }

    }

returnnull;

  }

/**

   * Extracts uri from the given url fragment, without the query params.

   */

publicstatic String extractUri(String fragment) {

if (fragment != null) {

int firstIndex = fragment.indexOf(QUERY_STRING_SEPARATOR);

if (firstIndex >= 0) {

return fragment.substring(0, firstIndex);

      } else {

// No query string present, use full fragment

return fragment;

      }

    }

returnnull;

  }

/**

   * Parses the parameters from the given url query string. When no encoding is

   * passed, default UTF-8 is used. Based on the implementation in Commons

   * httpclient UrlEncodedUtils.

   */

publicstatic Map<String, String> parseQueryParameters(String queryString, String encoding) {

    Map<String, String> parameters = new LinkedHashMap<String, String>();

if (queryString != null) {

// Remove '?' if present at beginning of query-string

if(queryString.startsWith(QUERY_STRING_SEPARATOR)) {

        queryString = queryString.substring(1);

      }

      Scanner scanner = new Scanner(queryString);

      scanner.useDelimiter(PARAMETER_SEPARATOR);

while (scanner.hasNext()) {

final String[] nameValue = scanner.next().split(NAME_VALUE_SEPARATOR);

if (nameValue.length == 0 || nameValue.length > 2)

thrownew IllegalArgumentException("bad parameter");

final String name = decode(nameValue[0], encoding);

        String value = null;

if (nameValue.length == 2) {

          value = decode(nameValue[1], encoding);

        }

        parameters.put(name, value);

      }

    }

return parameters;

  }

/**

   * Gets a valid query-string based on the given parameters.

   */

publicstatic String getQueryString(Map<String, String> parameters) {

    StringBuilder result = new StringBuilder();

if (parameters != null) {

for (Entry<String, String> param : parameters.entrySet()) {

final String encodedName = encode(param.getKey(), null);

final String value = param.getValue();

final String encodedValue = value != null ? encode(value, null) : "";

if (result.length() > 0) {

          result.append(PARAMETER_SEPARATOR);

        } else {

          result.append(QUERY_STRING_SEPARATOR);

        }

        result.append(encodedName);

        result.append(NAME_VALUE_SEPARATOR);

        result.append(encodedValue);

      }

    }

return result.toString();

  }

/**

   * Gets full path based on the given parts.

   */

publicstatic String getPath(List<String> parts) {

if (parts != null) {

      StringBuilder result = new StringBuilder();

for (String part : parts) {

if(result.length() > 0) {

          result.append(URL_PART_SEPARATOR);

        }

        result.append(part);

      }

return result.toString();

    }

return"";

  }

privatestatic String decode(final String content, final String encoding) {

try {

return URLDecoder.decode(content, encoding != null ? encoding : "UTF-8");

    } catch (UnsupportedEncodingException problem) {

thrownew IllegalArgumentException(problem);

    }

  }

privatestatic String encode(final String content, final String encoding) {

try {

return URLEncoder.encode(content, encoding != null ? encoding : "UTF-8");

    } catch (UnsupportedEncodingException problem) {

thrownew IllegalArgumentException(problem);

    }

  }

}