public void testGetUri() {
    ActionMapping am = new ActionMapping();
    am.setName("view");
    am.setNamespace("secure");
    am.setParams(Collections.<String, Object>emptyMap());

    assertEquals("secureview", mapper.getUriFromActionMapping(am));
  }
  public void testGetUriParam() {
    Map<String, Object> param = new HashMap<String, Object>();
    param.put("article", "123");
    ActionMapping am = new ActionMapping();
    am.setName("view");
    am.setNamespace("secure");
    am.setParams(param);

    assertEquals("secureview", mapper.getUriFromActionMapping(am));
  }
  /*
   * (non-Javadoc)
   *
   * @see org.apache.struts2.dispatcher.mapper.ActionMapper#getMapping(javax.servlet.http.HttpServletRequest)
   */
  public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) {
    if (!isSlashesInActionNames()) {
      throw new IllegalStateException(
          "This action mapper requires the setting 'slashesInActionNames' to be set to 'true'");
    }
    ActionMapping mapping = super.getMapping(request, configManager);

    if (mapping == null) {
      return null;
    }

    String actionName = mapping.getName();

    String id = null;

    // Only try something if the action name is specified
    if (actionName != null && actionName.length() > 0) {

      int lastSlashPos = actionName.lastIndexOf('/');
      if (lastSlashPos > -1) {
        id = actionName.substring(lastSlashPos + 1);
      }

      // If a method hasn't been explicitly named, try to guess using ReST-style patterns
      if (mapping.getMethod() == null) {

        if (lastSlashPos == actionName.length() - 1) {

          // Index e.g. foo/
          if (isGet(request)) {
            mapping.setMethod("index");

            // Creating a new entry on POST e.g. foo/
          } else if (isPost(request)) {
            mapping.setMethod("create");
          }

        } else if (lastSlashPos > -1) {
          // Viewing the form to create a new item e.g. foo/new
          if (isGet(request) && "new".equals(id)) {
            mapping.setMethod("editNew");

            // Viewing an item e.g. foo/1
          } else if (isGet(request)) {
            mapping.setMethod("view");

            // Removing an item e.g. foo/1
          } else if (isDelete(request)) {
            mapping.setMethod("remove");

            // Updating an item e.g. foo/1
          } else if (isPut(request)) {
            mapping.setMethod("update");
          }
        }

        if (idParameterName != null && lastSlashPos > -1) {
          actionName = actionName.substring(0, lastSlashPos);
        }
      }

      if (idParameterName != null && id != null) {
        if (mapping.getParams() == null) {
          mapping.setParams(new HashMap<String, Object>());
        }
        mapping.getParams().put(idParameterName, id);
      }

      // Try to determine parameters from the url before the action name
      int actionSlashPos = actionName.lastIndexOf('/', lastSlashPos - 1);
      if (actionSlashPos > 0 && actionSlashPos < lastSlashPos) {
        String params = actionName.substring(0, actionSlashPos);
        HashMap<String, String> parameters = new HashMap<String, String>();
        try {
          StringTokenizer st = new StringTokenizer(params, "/");
          boolean isNameTok = true;
          String paramName = null;
          String paramValue;

          while (st.hasMoreTokens()) {
            if (isNameTok) {
              paramName = URLDecoder.decode(st.nextToken(), "UTF-8");
              isNameTok = false;
            } else {
              paramValue = URLDecoder.decode(st.nextToken(), "UTF-8");

              if ((paramName != null) && (paramName.length() > 0)) {
                parameters.put(paramName, paramValue);
              }

              isNameTok = true;
            }
          }
          if (parameters.size() > 0) {
            if (mapping.getParams() == null) {
              mapping.setParams(new HashMap<String, Object>());
            }
            mapping.getParams().putAll(parameters);
          }
        } catch (Exception e) {
          if (LOG.isWarnEnabled()) {
            LOG.warn("Unable to determine parameters from the url", e);
          }
        }
        mapping.setName(actionName.substring(actionSlashPos + 1));
      }
    }

    return mapping;
  }